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}