/*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) Alkacon Software GmbH (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* For further information about Alkacon Software GmbH, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.file;
import org.opencms.main.CmsIllegalArgumentException;
import org.opencms.util.A_CmsModeIntEnumeration;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUUID;
/**
* Defines a property name, so that <code>{@link CmsProperty}</code> instances can be created with that name.<p>
*
* @since 6.0.0
*/
public class CmsPropertyDefinition implements Cloneable, Comparable<CmsPropertyDefinition> {
/**
* Enumeration class for property types.<p>
*/
public static final class CmsPropertyType extends A_CmsModeIntEnumeration {
/** Property value is treated as a link or list of links. */
protected static final CmsPropertyType LINK = new CmsPropertyType(1);
/** Property value is not a link. */
protected static final CmsPropertyType NORMAL = new CmsPropertyType(0);
/** serializable version id. */
private static final long serialVersionUID = 74746076708908673L;
/**
* Creates a new property type with the given identifier.<p>
*
* @param type the mode id to use
*/
private CmsPropertyType(int type) {
super(type);
}
/**
* Returns the property definition type for the given type id. <p>
*
* If the given String matches no known type <code>{@link #NORMAL}</code>
* will be returned as the default.<p>
*
* @param type the type value to get the property type for
*
* @return the property type for the given type value
*/
public static CmsPropertyType valueOf(int type) {
switch (type) {
case 1:
return LINK;
case 0:
default:
return NORMAL;
}
}
}
/** The name constraints when generating new properties. */
public static final String NAME_CONSTRAINTS = "-._~$";
/** Property for the active method in the administration view. */
public static final String PROPERTY_ACTIV = "activemethod";
/** Property for the allowed set of locales. */
public static final String PROPERTY_AVAILABLE_LOCALES = "locale-available";
/** Property to control the Java class for body. */
public static final String PROPERTY_BODY_CLASS = "templateclass";
/** The name of the VFS property that controls the caching. */
public static final String PROPERTY_CACHE = "cache";
/** Property for the sitemap configuration file path. */
public static final String PROPERTY_CONFIG_SITEMAP = "config.sitemap";
/** Property to define the function detail container for a template. */
public static final String PROPERTY_CONTAINER_INFO = "container.info";
/** Property for the content conversion. */
public static final String PROPERTY_CONTENT_CONVERSION = "content-conversion";
/** Property for the content encoding. */
public static final String PROPERTY_CONTENT_ENCODING = "content-encoding";
/** Property for the content encoding. */
public static final String PROPERTY_COPYRIGHT = "Copyright";
/** Property for the default file in folders. */
public static final String PROPERTY_DEFAULT_FILE = "default-file";
/** Property for the days a resource has to be expired to be deleted by the <code>{@link org.opencms.scheduler.jobs.CmsDeleteExpiredResourcesJob}</code>. */
public static final String PROPERTY_DELETE_EXPIRED = "delete.expired";
/** Property for the description. */
public static final String PROPERTY_DESCRIPTION = "Description";
/** Property for the resource title. */
public static final String PROPERTY_ENABLE_NOTIFICATION = "enable-notification";
/** Property for the static export. */
public static final String PROPERTY_EXPORT = "export";
/** Property for the resource export name, during export this name is used instead of the resource name. */
public static final String PROPERTY_EXPORTNAME = "exportname";
/** Property for JSP additional suffix during static export, default is "html". */
public static final String PROPERTY_EXPORTSUFFIX = "exportsuffix";
/** Property to control the folders where template or default bodies should be available. */
public static final String PROPERTY_FOLDERS_AVAILABLE = "folders.available";
/** Property constant for <code>"image.size"</code>. */
public static final String PROPERTY_IMAGE_SIZE = "image.size";
/** Property for the keywords. */
public static final String PROPERTY_KEYWORDS = "Keywords";
/** Property for the current locale. */
public static final String PROPERTY_LOCALE = "locale";
/** Property for the login form. */
public static final String PROPERTY_LOGIN_FORM = "login-form";
/** Property constant for <code>"NavImage"</code>. */
public static final String PROPERTY_NAVIMAGE = "NavImage";
/** Property constant for <code>"NavInfo"</code>. */
public static final String PROPERTY_NAVINFO = "NavInfo";
/** Property for the navigation position. */
public static final String PROPERTY_NAVPOS = "NavPos";
/** Property for the navigation text. */
public static final String PROPERTY_NAVTEXT = "NavText";
/** Property for the resource title. */
public static final String PROPERTY_NOTIFICATION_INTERVAL = "notification-interval";
/** Property for the relative root link substitution. */
public static final String PROPERTY_RELATIVEROOT = "relativeroot";
/** Property name that defines the available resource types for the "new" dialog. */
public static final String PROPERTY_RESTYPES_AVAILABLE = "restypes.available";
/** Property to sort search results in categories. */
public static final String PROPERTY_SEARCH_CATEGORY = "category";
/** Property to exclude individual resources from search index generation. */
public static final String PROPERTY_SEARCH_EXCLUDE = "search.exclude";
/** Property to boost certain search results. */
public static final String PROPERTY_SEARCH_PRIORITY = "search.priority";
/** Property for the secure transmission of resources. */
public static final String PROPERTY_SECURE = "secure";
/** Property for the stylesheet of files. */
public static final String PROPERTY_STYLESHEET = "stylesheet";
/** Property to control the template. */
public static final String PROPERTY_TEMPLATE = "template";
/** Property to control the template elements. */
public static final String PROPERTY_TEMPLATE_ELEMENTS = "template-elements";
/** Property for the template image. */
public static final String PROPERTY_TEMPLATE_IMAGE = "template.image";
/** Property for the resource title. */
public static final String PROPERTY_TITLE = "Title";
/** Property for the visible method in the administration view. */
public static final String PROPERTY_VISIBLE = "visiblemethod";
/** The property definition type for resources. */
public static final int PROPERYDEFINITION_RESOURCE = 1;
/** Property value is treated as a link or list of links. */
public static final CmsPropertyType TYPE_LINK = CmsPropertyType.LINK;
/** Property value is not a link. */
public static final CmsPropertyType TYPE_NORMAL = CmsPropertyType.NORMAL;
/** The null property definition object. */
private static final CmsPropertyDefinition NULL_PROPERTY_DEFINITION = new CmsPropertyDefinition(
CmsUUID.getNullUUID(),
"",
TYPE_NORMAL);
/** The id of this property definition. */
private CmsUUID m_id;
/** The name of this property definition. */
private String m_name;
/** The type of this property definition.*/
private CmsPropertyType m_type;
/**
* Creates a new property definition object with the type
* <code>{@link #TYPE_NORMAL}</code>.<p>
*
* @param id the id of the property definition
* @param name the name of the property definition
*/
public CmsPropertyDefinition(CmsUUID id, String name) {
this(id, name, TYPE_NORMAL);
}
/**
* Creates a new property definition object.<p>
*
* @param id the id of the property definition
* @param name the name of the property definition
* @param propertyType the type of the property
*/
public CmsPropertyDefinition(CmsUUID id, String name, CmsPropertyType propertyType) {
m_id = id;
m_name = name;
m_type = propertyType;
}
/**
* Checks if the provided property name is a valid property name,
* that is contains only valid characters.<p>
*
* A property name can only be composed of digits,
* standard ASCII letters and the symbols defined in {@link #NAME_CONSTRAINTS}.<p>
*
* @param name the property name to check
*
* @throws CmsIllegalArgumentException if the given property name is not valid
*/
public static void checkPropertyName(String name) throws CmsIllegalArgumentException {
if (CmsStringUtil.isEmptyOrWhitespaceOnly(name)) {
throw new CmsIllegalArgumentException(Messages.get().container(Messages.ERR_BAD_PROPERTYNAME_EMPTY_0, name));
}
CmsStringUtil.checkName(name, NAME_CONSTRAINTS, Messages.ERR_BAD_PROPERTYNAME_4, Messages.get());
}
/**
* Returns the null property definition.<p>
*
* @return the null property definition
*/
public static CmsPropertyDefinition getNullPropertyDefinition() {
return CmsPropertyDefinition.NULL_PROPERTY_DEFINITION;
}
/**
* Returns a clone of this Objects instance.<p>
*
* @return a clone of this instance
*/
@Override
public Object clone() {
return new CmsPropertyDefinition(m_id, m_name, m_type);
}
/**
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
public int compareTo(CmsPropertyDefinition obj) {
if (obj == this) {
return 0;
}
return m_name.compareTo(obj.m_name);
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof CmsPropertyDefinition) {
return ((CmsPropertyDefinition)obj).m_id.equals(m_id);
}
return false;
}
/**
* Returns the id of this property definition.<p>
*
* @return id the id of this Propertydefinition
*/
public CmsUUID getId() {
return m_id;
}
/**
* Returns the name of this property definition.<p>
*
* @return name The name of this property definition
*/
public String getName() {
return m_name;
}
/**
* Returns the the type of this property definition.<p>
*
* @return the type of this property definition
*/
public CmsPropertyType getType() {
return m_type;
}
/**
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
if (m_name != null) {
return m_name.hashCode();
}
return 0;
}
/**
* Sets the type for this property definition.<p>
*
* @param type the type to set
*/
public void setType(CmsPropertyType type) {
m_type = type;
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuffer result = new StringBuffer();
result.append("[Propertydefinition]");
result.append(" name:");
result.append(m_name);
result.append(" id:");
result.append(m_id);
result.append(" type:");
result.append(m_type);
return result.toString();
}
}