001/* 002 * This library is part of OpenCms - 003 * the Open Source Content Management System 004 * 005 * Copyright (c) Alkacon Software GmbH & Co. KG (http://www.alkacon.com) 006 * 007 * This library is free software; you can redistribute it and/or 008 * modify it under the terms of the GNU Lesser General Public 009 * License as published by the Free Software Foundation; either 010 * version 2.1 of the License, or (at your option) any later version. 011 * 012 * This library is distributed in the hope that it will be useful, 013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 015 * Lesser General Public License for more details. 016 * 017 * For further information about Alkacon Software GmbH & Co. KG, please see the 018 * company website: http://www.alkacon.com 019 * 020 * For further information about OpenCms, please see the 021 * project website: http://www.opencms.org 022 * 023 * You should have received a copy of the GNU Lesser General Public 024 * License along with this library; if not, write to the Free Software 025 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 026 */ 027 028package org.opencms.file; 029 030import org.opencms.gwt.shared.CmsGwtConstants; 031import org.opencms.main.CmsIllegalArgumentException; 032import org.opencms.util.A_CmsModeIntEnumeration; 033import org.opencms.util.CmsStringUtil; 034import org.opencms.util.CmsUUID; 035 036/** 037 * Defines a property name, so that <code>{@link CmsProperty}</code> instances can be created with that name.<p> 038 * 039 * @since 6.0.0 040 */ 041public class CmsPropertyDefinition implements Cloneable, Comparable<CmsPropertyDefinition> { 042 043 /** 044 * Enumeration class for property types.<p> 045 */ 046 public static final class CmsPropertyType extends A_CmsModeIntEnumeration { 047 048 /** Property value is treated as a link or list of links. */ 049 protected static final CmsPropertyType LINK = new CmsPropertyType(1); 050 051 /** Property value is not a link. */ 052 protected static final CmsPropertyType NORMAL = new CmsPropertyType(0); 053 054 /** serializable version id. */ 055 private static final long serialVersionUID = 74746076708908673L; 056 057 /** 058 * Creates a new property type with the given identifier.<p> 059 * 060 * @param type the mode id to use 061 */ 062 private CmsPropertyType(int type) { 063 064 super(type); 065 } 066 067 /** 068 * Returns the property definition type for the given type id. <p> 069 * 070 * If the given String matches no known type <code>{@link #NORMAL}</code> 071 * will be returned as the default.<p> 072 * 073 * @param type the type value to get the property type for 074 * 075 * @return the property type for the given type value 076 */ 077 public static CmsPropertyType valueOf(int type) { 078 079 switch (type) { 080 case 1: 081 return LINK; 082 case 0: 083 default: 084 return NORMAL; 085 } 086 087 } 088 } 089 090 /** The name constraints when generating new properties. */ 091 public static final String NAME_CONSTRAINTS = "-._~$"; 092 093 /** Property for the active method in the administration view. */ 094 public static final String PROPERTY_ACTIV = "activemethod"; 095 096 /** Property for the allowed set of locales. */ 097 public static final String PROPERTY_AVAILABLE_LOCALES = "locale-available"; 098 099 /** Property to control the Java class for body. */ 100 public static final String PROPERTY_BODY_CLASS = "templateclass"; 101 102 /** The name of the VFS property that controls the caching. */ 103 public static final String PROPERTY_CACHE = "cache"; 104 105 /** Property used to hide categories from the category widgets in the page/content editor. 106 * 107 * <p>If this property is set to 'true' on a category, it should never be set to 'false' on one of its subcategory. 108 * */ 109 public static final String PROPERTY_CATEGORY_HIDDEN = "category.hidden"; 110 111 /** The property to read an additional category folder from. */ 112 public static final String PROPERTY_CATEGORY_REPOSITORY = "category.repository"; 113 114 /** Property to define the function detail container for a template. */ 115 public static final String PROPERTY_CONTAINER_INFO = "container.info"; 116 117 /** Property for the content conversion. */ 118 public static final String PROPERTY_CONTENT_CONVERSION = "content-conversion"; 119 120 /** Property for the content encoding. */ 121 public static final String PROPERTY_CONTENT_ENCODING = "content-encoding"; 122 123 /** Property for the content encoding. */ 124 public static final String PROPERTY_COPYRIGHT = "Copyright"; 125 126 /** Property for the default file in folders. */ 127 public static final String PROPERTY_DEFAULT_FILE = "default-file"; 128 129 /** Property for the days a resource has to be expired to be deleted by the <code>{@link org.opencms.scheduler.jobs.CmsDeleteExpiredResourcesJob}</code>. */ 130 public static final String PROPERTY_DELETE_EXPIRED = "delete.expired"; 131 132 /** Property for the description. */ 133 public static final String PROPERTY_DESCRIPTION = "Description"; 134 135 /** Property for the description in HTML format. */ 136 public static final String PROPERTY_DESCRIPTION_HTML = "Description.html"; 137 138 /** Property to set the display order of a content in lists. */ 139 public static final String PROPERTY_DISPLAY_ORDER = "display-order"; 140 141 /** The name of the property which controls whether an element will be used as a copy model by the container page editor. */ 142 public static final String PROPERTY_ELEMENT_MODEL = "element.model"; 143 144 /** May contain a path to an element replacement configuration, for use in the 'copy page' dialog. */ 145 public static final String PROPERTY_ELEMENT_REPLACEMENTS = "element.replacements"; 146 147 /** Property for the resource title. */ 148 public static final String PROPERTY_ENABLE_NOTIFICATION = "enable-notification"; 149 150 /** Property for the static export. */ 151 public static final String PROPERTY_EXPORT = "export"; 152 153 /** Property used to record the resource type for resources whose type is unknown at import time, so they can be exported with that type later. */ 154 public static final String PROPERTY_EXPORT_TYPE = "export.type"; 155 156 /** Property for the resource export name, during export this name is used instead of the resource name. */ 157 public static final String PROPERTY_EXPORTNAME = "exportname"; 158 159 /** Property for JSP additional suffix during static export, default is "html". */ 160 public static final String PROPERTY_EXPORTSUFFIX = "exportsuffix"; 161 162 /** Property to control the folders where template or default bodies should be available. */ 163 public static final String PROPERTY_FOLDERS_AVAILABLE = "folders.available"; 164 165 /** Property stating where to create new gallery folders. */ 166 public static final String PROPERTY_GALLERIES_FOLDER = "galleries.folder"; 167 168 /** Property containing the maps API key. */ 169 public static final String PROPERTY_GOOGLE_API_KEY = "google.apikey"; 170 171 /** Property containing the maps API key. */ 172 public static final String PROPERTY_GOOGLE_API_KEY_WORKPLACE = "google.apikey.workplace"; 173 174 /** Property to control whether historic versions should be removed when deleted resources are published. */ 175 public static final String PROPERTY_HISTORY_REMOVE_DELETED = "history.removedeleted"; 176 177 /** Name of the property in which the focal point is stored. */ 178 public static final String PROPERTY_IMAGE_FOCAL_POINT = CmsGwtConstants.PROPERTY_IMAGE_FOCALPOINT; 179 180 /** Property constant for <code>"image.size"</code>. */ 181 public static final String PROPERTY_IMAGE_SIZE = "image.size"; 182 183 /** The property for defining the date (as Solr field) that should be used for sorting in lists. */ 184 public static final String PROPERTY_INSTANCEDATE_COPYFIELD = "instancedate.copyfield"; 185 186 /** Property for the keywords. */ 187 public static final String PROPERTY_KEYWORDS = "Keywords"; 188 189 /** Property to enable __forceAbsoluteLinks request parameter for a resource. */ 190 public static final String PROPERTY_LINKS_FORCEABSOLUTE_ENABLED = "links.forceabsolute.enabled"; 191 192 /** Property for the current locale. */ 193 public static final String PROPERTY_LOCALE = "locale"; 194 195 /** Property to mark detail pages to have locale independent detail only containers. */ 196 public static final String PROPERTY_LOCALE_INDEPENDENT_DETAILS = "locale.independent-details"; 197 198 /** Property for the 'do not translate' marking in the sitemap editor. */ 199 public static final String PROPERTY_LOCALE_NOTRANSLATION = "locale.notranslation"; 200 201 /** Property for the login form. */ 202 public static final String PROPERTY_LOGIN_FORM = "login-form"; 203 204 /** Property constant for <code>"NavImage"</code>. */ 205 public static final String PROPERTY_NAVIMAGE = "NavImage"; 206 207 /** Property constant for <code>"NavInfo"</code>. */ 208 public static final String PROPERTY_NAVINFO = "NavInfo"; 209 210 /** Property for the navigation position. */ 211 public static final String PROPERTY_NAVPOS = "NavPos"; 212 213 /** Property for the navigation text. */ 214 public static final String PROPERTY_NAVTEXT = "NavText"; 215 216 /** Property for the resource title. */ 217 public static final String PROPERTY_NOTIFICATION_INTERVAL = "notification-interval"; 218 219 /** Property for the relative root link substitution. */ 220 public static final String PROPERTY_RELATIVEROOT = "relativeroot"; 221 222 /** Property name that defines the available resource types for the "new" dialog. */ 223 public static final String PROPERTY_RESTYPES_AVAILABLE = "restypes.available"; 224 225 /** Property to sort search results in categories. */ 226 public static final String PROPERTY_SEARCH_CATEGORY = "category"; 227 228 /** Property to exclude individual resources from search index generation. */ 229 public static final String PROPERTY_SEARCH_EXCLUDE = "search.exclude"; 230 231 /** Property to exclude individual resources from search results online (Solr only). */ 232 public static final String PROPERTY_SEARCH_EXCLUDE_ONLINE = "search.exclude.online"; 233 234 /** Property to boost certain search results. */ 235 public static final String PROPERTY_SEARCH_PRIORITY = "search.priority"; 236 237 /** Property for secondary locales for use in the locale compare view in the sitemap editor. */ 238 public static final String PROPERTY_SECONDARY_LOCALES = "locale.secondary"; 239 240 /** Property for the secure transmission of resources. */ 241 public static final String PROPERTY_SECURE = "secure"; 242 243 /** Property for the stylesheet of files. */ 244 public static final String PROPERTY_STYLESHEET = "stylesheet"; 245 246 /** Property to control the template. */ 247 public static final String PROPERTY_TEMPLATE = "template"; 248 249 /** Property to customize for which templates elements should be displayed in the gallery when using the CmsTransformerTemplateProvider. */ 250 public static final String PROPERTY_TEMPLATE_COMPATILIBITY = "template.compatibility"; 251 252 /** Property for specifying a list of container types used to match formatters in the display formatter selection widget. */ 253 public static final String PROPERTY_TEMPLATE_DISPLAY_TYPES = "template.display.types"; 254 255 /** Property to control the template elements. */ 256 public static final String PROPERTY_TEMPLATE_ELEMENTS = "template-elements"; 257 258 /** Property for the template image. */ 259 public static final String PROPERTY_TEMPLATE_IMAGE = "template.image"; 260 261 /** Property to configure the value which should be used instead of the template path when selecting the template in the GUI. Please note that this does not have to actually be a template provider configuration string, this is just the most common use case. */ 262 public static final String PROPERTY_TEMPLATE_PROVIDER = "template.provider"; 263 264 /** Property for the resource title. */ 265 public static final String PROPERTY_TITLE = "Title"; 266 267 /** Property for user data request configuration. */ 268 public static final String PROPERTY_UDR_CONFIG = "udr.config"; 269 270 /** Property used to configure default organizational unit. */ 271 public static final String PROPERTY_UDR_DEFAULTOU = "udr.defaultou"; 272 273 /** Name of the property used to control whether mapped URL names should replace previous URL names. */ 274 public static final String PROPERTY_URLNAME_REPLACE = "urlname.replace"; 275 276 /** Property for the visible method in the administration view. */ 277 public static final String PROPERTY_VISIBLE = "visiblemethod"; 278 279 /** Property for the XML sitemap change frequency. */ 280 public static final String PROPERTY_XMLSITEMAP_CHANGEFREQ = "xmlsitemap.changefreq"; 281 282 /** Property for the XML sitemap priority. */ 283 public static final String PROPERTY_XMLSITEMAP_PRIORITY = "xmlsitemap.priority"; 284 285 /** The property definition type for resources. */ 286 public static final int PROPERYDEFINITION_RESOURCE = 1; 287 288 /** Property value is treated as a link or list of links. */ 289 public static final CmsPropertyType TYPE_LINK = CmsPropertyType.LINK; 290 291 /** Property value is not a link. */ 292 public static final CmsPropertyType TYPE_NORMAL = CmsPropertyType.NORMAL; 293 294 /** The null property definition object. */ 295 private static final CmsPropertyDefinition NULL_PROPERTY_DEFINITION = new CmsPropertyDefinition( 296 CmsUUID.getNullUUID(), 297 "", 298 TYPE_NORMAL); 299 300 /** The id of this property definition. */ 301 private CmsUUID m_id; 302 303 /** The name of this property definition. */ 304 private String m_name; 305 306 /** The type of this property definition.*/ 307 private CmsPropertyType m_type; 308 309 /** 310 * Creates a new property definition object with the type 311 * <code>{@link #TYPE_NORMAL}</code>.<p> 312 * 313 * @param id the id of the property definition 314 * @param name the name of the property definition 315 */ 316 public CmsPropertyDefinition(CmsUUID id, String name) { 317 318 this(id, name, TYPE_NORMAL); 319 } 320 321 /** 322 * Creates a new property definition object.<p> 323 * 324 * @param id the id of the property definition 325 * @param name the name of the property definition 326 * @param propertyType the type of the property 327 */ 328 public CmsPropertyDefinition(CmsUUID id, String name, CmsPropertyType propertyType) { 329 330 m_id = id; 331 m_name = name; 332 m_type = propertyType; 333 } 334 335 /** 336 * Checks if the provided property name is a valid property name, 337 * that is contains only valid characters.<p> 338 * 339 * A property name can only be composed of digits, 340 * standard ASCII letters and the symbols defined in {@link #NAME_CONSTRAINTS}.<p> 341 * 342 * @param name the property name to check 343 * 344 * @throws CmsIllegalArgumentException if the given property name is not valid 345 */ 346 public static void checkPropertyName(String name) throws CmsIllegalArgumentException { 347 348 if (CmsStringUtil.isEmptyOrWhitespaceOnly(name)) { 349 throw new CmsIllegalArgumentException( 350 Messages.get().container(Messages.ERR_BAD_PROPERTYNAME_EMPTY_0, name)); 351 } 352 353 CmsStringUtil.checkName(name, NAME_CONSTRAINTS, Messages.ERR_BAD_PROPERTYNAME_4, Messages.get()); 354 } 355 356 /** 357 * Returns the null property definition.<p> 358 * 359 * @return the null property definition 360 */ 361 public static CmsPropertyDefinition getNullPropertyDefinition() { 362 363 return CmsPropertyDefinition.NULL_PROPERTY_DEFINITION; 364 } 365 366 /** 367 * Returns a clone of this Objects instance.<p> 368 * 369 * @return a clone of this instance 370 */ 371 @Override 372 public Object clone() { 373 374 return new CmsPropertyDefinition(m_id, m_name, m_type); 375 } 376 377 /** 378 * @see java.lang.Comparable#compareTo(java.lang.Object) 379 */ 380 public int compareTo(CmsPropertyDefinition obj) { 381 382 if (obj == this) { 383 return 0; 384 } 385 return m_name.compareTo(obj.m_name); 386 } 387 388 /** 389 * @see java.lang.Object#equals(java.lang.Object) 390 */ 391 @Override 392 public boolean equals(Object obj) { 393 394 if (obj == this) { 395 return true; 396 } 397 if (obj instanceof CmsPropertyDefinition) { 398 return ((CmsPropertyDefinition)obj).m_id.equals(m_id); 399 } 400 return false; 401 } 402 403 /** 404 * Returns the id of this property definition.<p> 405 * 406 * @return id the id of this Propertydefinition 407 */ 408 public CmsUUID getId() { 409 410 return m_id; 411 } 412 413 /** 414 * Returns the name of this property definition.<p> 415 * 416 * @return name The name of this property definition 417 */ 418 public String getName() { 419 420 return m_name; 421 } 422 423 /** 424 * Returns the the type of this property definition.<p> 425 * 426 * @return the type of this property definition 427 */ 428 public CmsPropertyType getType() { 429 430 return m_type; 431 } 432 433 /** 434 * @see java.lang.Object#hashCode() 435 */ 436 @Override 437 public int hashCode() { 438 439 if (m_name != null) { 440 return m_name.hashCode(); 441 } 442 return 0; 443 } 444 445 /** 446 * Sets the type for this property definition.<p> 447 * 448 * @param type the type to set 449 */ 450 public void setType(CmsPropertyType type) { 451 452 m_type = type; 453 } 454 455 /** 456 * @see java.lang.Object#toString() 457 */ 458 @Override 459 public String toString() { 460 461 StringBuffer result = new StringBuffer(); 462 result.append("[Propertydefinition]"); 463 result.append(" name:"); 464 result.append(m_name); 465 result.append(" id:"); 466 result.append(m_id); 467 result.append(" type:"); 468 result.append(m_type); 469 return result.toString(); 470 } 471}