/** * 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.util.BlojsomConstants; import org.blojsom.util.BlojsomUtils; import org.blojsom.BlojsomException; import java.util.*; import java.io.Serializable; /** * BlogCategory * * @author David Czarnecki * @author Mark Lussier * @version $Id: BlogCategory.java,v 1.2.2.2 2006/10/19 21:14:32 johnan Exp $ */ public abstract class BlogCategory implements Comparable, Serializable { protected Log _logger = LogFactory.getLog(BlogCategory.class); protected String _categoryURL; protected String _category; protected Map _metadata = null; protected String _description = null; protected String _name = null; protected List _subcategories; protected BlogEntry _blogEntry; protected BlogCategory _parentCategory = null; /** * Create a new BlogCategory. */ public BlogCategory() { _subcategories = new ArrayList(); } /** * Create a new BlogCategory. * * @param category Category name * @param categoryURL Category URL */ public BlogCategory(String category, String categoryURL) { super(); _category = BlojsomUtils.normalize(category); _categoryURL = categoryURL; } /** * Return the URL for this category * * @return Category URL */ public String getCategoryURL() { return _categoryURL; } /** * Set a new URL for this category * * @param categoryURL Category URL */ public void setCategoryURL(String categoryURL) { _categoryURL = categoryURL; } /** * Return the category name * * @return Category name */ public String getCategory() { return _category; } /** * Return the category name encoded for a link * * @return Category name encoded as UTF-8 with preserved "/" and "+" characters * @since blojsom 2.08 */ public String getEncodedCategory() { return BlojsomUtils.urlEncodeForLink(_category); } /** * Return the category URL encoded for a link * * @return Category URL encoded as UTF-8 with preserved "/" characters and "+" characters * @see {@link BlojsomUtils#urlEncodeForLink(java.lang.String)} * @since blojsom 2.14 */ public String getEncodedCategoryURL() { return BlojsomUtils.urlEncodeForLink(_categoryURL); } /** * Set a new name for this category * * @param category Category name */ public void setCategory(String category) { _category = BlojsomUtils.normalize(category); } /** * Checks to see if this category is equal to the input category * * @param obj Input category * @return true if the category name and category URL are equal, false otherwise */ public boolean equals(Object obj) { BlogCategory otherCategory = (BlogCategory) obj; return ((_category.equals(otherCategory._category)) && (_categoryURL.equals(otherCategory._categoryURL))); } /** * Compare the current category to the input category * * @param o Input category * @return */ public int compareTo(Object o) { BlogCategory category = (BlogCategory) o; return _category.compareTo(category._category); } /** * Returns the category name * * @return Category name * @see #getCategory() */ public String toString() { return _category; } /** * Sets the description of this category * * @param desc The new description of the category */ public void setDescription(String desc) { _description = desc; if (_metadata == null) { _metadata = new HashMap(5); } _metadata.put(BlojsomConstants.DESCRIPTION_KEY, _description); } /** * Retrieves the description of this category * * @return The description of the category */ public String getDescription() { return _description; } /** * Sets the name of this category * * @param name The new name of the category */ public void setName(String name) { _name = name; if (_metadata == null) { _metadata = new HashMap(5); } _metadata.put(BlojsomConstants.NAME_KEY, _name); } /** * Retrieves the name of this category * * @return The name of the category */ public String getName() { return _name; } /** * Retrieves the HTML escaped name of this category * * @return The name of the category */ public String getEscapedName() { return BlojsomUtils.escapeString(_name); } /** * Set the meta-data associated with this category * * @param metadata The map to be associated with the category as meta-data */ public void setMetaData(Map metadata) { _metadata = metadata; } /** * Sets the meta-data associated with this category. This method will also try to set the * description and name properties from the meta-data by looking for the * DESCRIPTION_KEY and NAME_KEY, respectively * * @param data The properties to be associated with the category as meta-data */ public void setMetaData(Properties data) { String s = null; Enumeration keys = data.keys(); if (_metadata == null) { _metadata = new HashMap(5); } Object key; while (keys.hasMoreElements()) { key = keys.nextElement(); _metadata.put(key, data.get(key)); } s = (String) _metadata.get(BlojsomConstants.DESCRIPTION_KEY); if ((s != null) && (!"".equals(s))) { _description = s; } s = (String) _metadata.get(BlojsomConstants.NAME_KEY); if ((s != null) && (!"".equals(s))) { _name = s; } } /** * Retrieves the meta-data associated with this category * * @return The properties associated with the category as meta-data, or null if no metadata exists */ public Map getMetaData() { if (_metadata == null) { return new HashMap(); } return _metadata; } /** * Set any attributes of the blog category using data from the map. * * @param attributeMap Attributes * @since blojsom 1.9.1 */ public void setAttributes(Map attributeMap) { } /** * Load a blog category. * * @param blog {@link Blog} * @throws BlojsomException If there is an error loading the category * @since blojsom 1.9.1 * @deprecated */ public abstract void load(Blog blog) throws BlojsomException; /** * Save the blog category. * * @param blog {@link Blog} * @throws BlojsomException If there is an error saving the category * @since blojsom 1.9.1 * @deprecated */ public abstract void save(Blog blog) throws BlojsomException; /** * Delete the blog category. * * @param blog {@link Blog} * @throws BlojsomException If there is an error deleting the category * @since blojsom 1.9.1 * @deprecated */ public abstract void delete(Blog blog) throws BlojsomException; /** * Load a blog category. * * @param blogUser {@link BlogUser} * @throws BlojsomException If there is an error loading the category * @since blojsom 2.22 */ public abstract void load(BlogUser blogUser) throws BlojsomException; /** * Save the blog category. * * @param blogUser {@link BlogUser} * @throws BlojsomException If there is an error saving the category * @since blojsom 2.22 */ public abstract void save(BlogUser blogUser) throws BlojsomException; /** * Delete the blog category. * * @param blogUser {@link BlogUser} * @throws BlojsomException If there is an error deleting the category * @since blojsom 2.22 */ public abstract void delete(BlogUser blogUser) throws BlojsomException; /** * Count the number of blog entries in this category. If recursive is true, the method * will also count entries in all sub-categories. * * @param blog {@link Blog} * @param recursive Set to true if entries in sub-categories should be counted * @return Number of blog entries in this category * @since blojsom 2.22 */ public abstract int countBlogEntries(Blog blog, boolean recursive); /** * Return a list of sub-categories under the current category * * @return {@link List} of sub-categories as {@link BlogCategory} objects * @since blojsom 2.22 */ public List getSubcategories() { return _subcategories; } /** * Set the sub-categories for this category * * @param subcategories {@link List} of {@link BlogCategory} objects * @since blojsom 2.22 */ public void setSubcategories(List subcategories) { _subcategories = subcategories; } /** * Returns the parent category of this category. Defaults to "/" * * @return {@link BlogCategory} containing the parent category * @since blojsom 2.25 */ public BlogCategory getParentCategory() { return _parentCategory; } /** * Sets the parent category of this category * * @param cateogory {@link BlogCategory} that represents the parent category * @since blojsom 2.25 */ public void setParentCategory(BlogCategory cateogory) { _parentCategory = cateogory; } /** * Retrieve the {@link BlogEntry} associated with this category * * @return {@link BlogEntry} * @since blojsom 2.23 */ public BlogEntry getBlogEntry() { return _blogEntry; } /** * Set the {@link BlogEntry} associated with this category * * @param blogEntry {@link BlogEntry} * @since blojsom 2.23 */ public void setBlogEntry(BlogEntry blogEntry) { _blogEntry = blogEntry; } }