/** * Copyright (c) 2003-2005 , David A. Czarnecki * All rights reserved. * * Portions Copyright (c) 2003-2005 by Mark Lussier * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the "David A. Czarnecki" and "blojsom" nor the names of * its contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Products derived from this software may not be called "blojsom", * nor may "blojsom" appear in their name, without prior written permission of * David A. Czarnecki. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.blojsom.blog; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.blojsom.BlojsomException; import org.blojsom.util.BlojsomConstants; import org.blojsom.util.BlojsomMetaDataConstants; import org.blojsom.util.BlojsomUtils; import java.text.SimpleDateFormat; import java.util.*; import java.io.Serializable; /** * BlogEntry * * @author David Czarnecki * @version $Id: BlogEntry.java,v 1.3.2.1 2005/07/21 14:11:02 johnan Exp $ */ public abstract class BlogEntry implements BlojsomConstants, BlojsomMetaDataConstants, Serializable { protected transient Log _logger = LogFactory.getLog(BlogEntry.class); protected String _title; protected String _link; protected String _description; protected String _category; protected Date _entryDate; protected long _lastModified; protected List _comments; protected List _trackbacks; protected List _pingbacks; protected BlogCategory _blogCategory; protected Map _metaData; /** * Create a new blog entry with no data */ public BlogEntry() { } /** * Date of the blog entry *

* This value is constructed from the lastModified value of the file * * @return Date of the blog entry */ public Date getDate() { return _entryDate; } /** * Date of this blog entry * * @param entryDate Date of the blog entry */ public void setDate(Date entryDate) { _entryDate = entryDate; } /** * Return an RFC 822 style date * * @return Date formatted in RFC 822 format */ public String getRFC822Date() { return BlojsomUtils.getRFC822Date(_entryDate); } /** * Return an UTC style date * * @return Date formatted in UTC format */ public String getUTCDate() { return BlojsomUtils.getUTCDate(_entryDate); } /** * Return an ISO 8601 style date * http://www.w3.org/TR/NOTE-datetime * * @return Date formatted in ISO 8601 format */ public String getISO8601Date() { return BlojsomUtils.getISO8601Date(_entryDate); } /** * Return the blog entry date formatted with a specified date format * * @param format Date format * @return null if the entry date or format is null, otherwise returns the entry date formatted to the specified format. If the format is invalid, returns entryDate.toString() * @since blojsom 1.9.3 */ public String getDateAsFormat(String format) { return getDateAsFormat(format, (String)null); } /** * Return the blog entry date formatted with a specified date format * * @param format Date format * @param locale Locale for date formatting * @return null if the entry date or format is null, otherwise returns the entry date formatted to the specified format. If the format is invalid, returns entryDate.toString() * @since blojsom 2.25 */ public String getDateAsFormat(String format, Locale locale) { if (_entryDate == null || format == null) { return null; } SimpleDateFormat sdf = null; try { if (locale == null) { sdf = new SimpleDateFormat(format); } else { sdf = new SimpleDateFormat(format, locale); } return sdf.format(_entryDate); } catch (IllegalArgumentException e) { return _entryDate.toString(); } } /** * Return the blog entry date formatted with a specified date format and time zone * * @since blojsom 2.1.4 (blojsom-6 Apple) * @param format Date format * @param timeZoneID ID of the time zone you want to retrieve, or null for the current one. * @return null if the entry date or format is null, otherwise returns the entry date formatted to the specified format. If the format is invalid, returns entryDate.toString() */ public String getDateAsFormat(String format, String timeZoneID) { if (_entryDate == null || format == null) { return null; } SimpleDateFormat sdf = null; try { sdf = new SimpleDateFormat(format); if (timeZoneID != null) { sdf.setTimeZone(java.util.TimeZone.getTimeZone(timeZoneID)); } return sdf.format(_entryDate); } catch (IllegalArgumentException e) { return _entryDate.toString(); } } /** * Title of the blog entry * * @return Blog title */ public String getTitle() { return _title; } /** * Set the title of the blog entry * * @param title Title for the blog entry */ public void setTitle(String title) { _title = title; } /** * Title for the entry where the <, >, and & characters are escaped * * @return Escaped entry title */ public String getEscapedTitle() { return BlojsomUtils.escapeString(_title); } /** * Permalink for the blog entry * * @return Blog entry permalink */ public String getLink() { return _link; } /** * Permalink for the blog entry where the <, >, and & characters are escaped * * @return Blog entry permalink which has been escaped */ public String getEscapedLink() { return BlojsomUtils.escapeString(_link); } /** * Set the permalink for the blog entry * * @param link Permalink for the blog entry */ public void setLink(String link) { _link = link; } /** * Description of the blog entry * * @return Blog entry description */ public String getDescription() { return _description; } /** * Escaped description of the blog entry * This method would be used for generating RSS feeds where the <, >, and & characters are escaped * * @return Blog entry description where &, <, and > have been escaped */ public String getEscapedDescription() { return BlojsomUtils.escapeString(_description); } /** * Set the description for the blog entry * * @param description Description for the blog entry */ public void setDescription(String description) { _description = description; } /** * Last modified time for the blog entry * * @return Blog entry last modified time */ public long getLastModified() { return _lastModified; } /** * Returns the BlogId for this entry * * @return Blog Id */ public abstract String getId(); /** * Return the permalink name for this blog entry * * @return Permalink name */ public abstract String getPermalink(); /** * Category for the blog entry. This corresponds to the category directory name. * * @return Blog entry category */ public String getCategory() { return _category; } /** * Return the category name encoded. * * @return Category name encoded as UTF-8 * @since blojsom 2.08 */ public String getEncodedCategory() { if (_category == null) { return null; } if (!_category.startsWith("/")) { return "/" + BlojsomUtils.urlEncodeForLink(_category); } return BlojsomUtils.urlEncodeForLink(_category); } /** * Set the category for the blog entry. This corresponds to the category directory name. * * @param category Category for the blog entry */ public void setCategory(String category) { _category = category; } /** * Checks to see if the link to this entry is the same as the input entry * * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object o) { if (!(o instanceof BlogEntry)) { return false; } BlogEntry entry = (BlogEntry) o; if (_link.equals(entry.getLink())) { return true; } return false; } /** * Determines whether or not this blog entry supports comments. * * @return true if the blog entry supports comments, false otherwise */ public abstract boolean supportsComments(); /** * Get the comments * * @return List of comments */ public List getComments() { if (_comments == null) { return new ArrayList(); } return _comments; } /** * Set the comments for this blog entry. The comments must be an List * of {@link BlogComment}. This method will not writeback or change the comments on disk. * * @param comments Comments for this entry */ public void setComments(List comments) { _comments = comments; } /** * Get the comments as an array of BlogComment objects * * @return BlogComment[] array */ public BlogComment[] getCommentsAsArray() { if (_comments == null) { return new BlogComment[0]; } else { return (BlogComment[]) _comments.toArray(new BlogComment[_comments.size()]); } } /** * Get the number of comments for this entry * * @return 0 if comments is null, or the number of comments otherwise, which could be 0 */ public int getNumComments() { if (_comments == null) { return 0; } else { return _comments.size(); } } /** * Determines whether or not this blog entry supports trackbacks. * * @return true if the blog entry supports trackbacks, false otherwise * @since blojsom 2.05 */ public abstract boolean supportsTrackbacks(); /** * Get the trackbacks * * @return List of trackbacks */ public List getTrackbacks() { if (_trackbacks == null) { return new ArrayList(); } return _trackbacks; } /** * Set the trackbacks for this blog entry. The trackbacks must be an List * of {@link Trackback}. This method will not writeback or change the trackbacks to disk. * * @param trackbacks Trackbacks for this entry */ public void setTrackbacks(List trackbacks) { _trackbacks = trackbacks; } /** * Get the trackbacks as an array of Trackback objects * * @return Trackback[] array */ public Trackback[] getTrackbacksAsArray() { if (_trackbacks == null) { return new Trackback[0]; } else { return (Trackback[]) _trackbacks.toArray(new Trackback[_trackbacks.size()]); } } /** * Get the number of trackbacks for this entry * * @return 0 if trackbacks is null, or the number of trackbacks otherwise, which could be 0 */ public int getNumTrackbacks() { if (_trackbacks == null) { return 0; } else { return _trackbacks.size(); } } /** * Get the {@link BlogCategory} object for this blog entry * * @return {@link BlogCategory} object */ public BlogCategory getBlogCategory() { return _blogCategory; } /** * Set the {@link BlogCategory} object for this blog entry * * @param blogCategory New {@link BlogCategory} object */ public void setBlogCategory(BlogCategory blogCategory) { _blogCategory = blogCategory; } /** * Return meta data for this blog entry. This method may return null. * * @return Meta data * @since blojsom 1.8 */ public Map getMetaData() { if (_metaData == null) { return new HashMap(); } return _metaData; } /** * Set the meta-data associated with this blog entry * * @param metaData Meta-data * @since blojsom 1.8 */ public void setMetaData(Map metaData) { _metaData = metaData; } /** * Return a string representation of the entry. The default implementation is to return * the blog entry title. * * @return String representation of this entry * @since blojsom 1.9 */ public String toString() { return _title; } /** * Set any attributes of the blog entry using data from the map. * * @param attributeMap Attributes * @since blojsom 1.9 */ public void setAttributes(Map attributeMap) { } /** * Determines whether or not this blog entry supports pingbacks. * * @return true if the blog entry supports pingbacks, false otherwise * @since blojsom 2.23 */ public abstract boolean supportsPingbacks(); /** * Get the pingbacks for this entry * * @return List of {@link Pingback}s * @since blojsom 2.23 */ public List getPingbacks() { if (_pingbacks == null) { return new ArrayList(); } return _pingbacks; } /** * Set the pingbacks for this blog entry. The pingbacks must be a List * of {@link Pingback}. This method will not writeback or change the pingbacks to disk. * * @param pingbacks {@link Pingback}s for this entry * @since blojsom 2.23 */ public void setPingbacks(List pingbacks) { _pingbacks = pingbacks; } /** * Get the pingbacks as an array of {@link Pingback}s objects * * @return {@link Pingback}[] array * @since blojsom 2.23 */ public Pingback[] getPingbacksAsArray() { if (_pingbacks == null) { return new Pingback[0]; } else { return (Pingback[]) _pingbacks.toArray(new Pingback[_pingbacks.size()]); } } /** * Get the number of pingbacks for this entry * * @return 0 if pingbacks is null, or the number of pingbacks otherwise, which could be 0 * @since blojsom 2.23 */ public int getNumPingbacks() { if (_pingbacks == null) { return 0; } else { return _pingbacks.size(); } } /** * Load a blog entry. * * @param blogUser User information * @throws BlojsomException If there is an error loading the entry * @since blojsom 1.9 */ public abstract void load(BlogUser blogUser) throws BlojsomException; /** * Save the blog entry. * * @param blogUser User information * @throws BlojsomException If there is an error saving the entry * @since blojsom 1.9 */ public abstract void save(BlogUser blogUser) throws BlojsomException; /** * Delete the blog entry. * * @param blogUser User information * @throws BlojsomException If there is an error deleting the entry * @since blojsom 1.9 */ public abstract void delete(BlogUser blogUser) throws BlojsomException; }