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    /**
112     * Property for configuring background color for a category in the explorer's category column.
113     **/
114    public static final String PROPERTY_CATEGORY_BACKGROUND = "category.background";
115
116    /** The property to read an additional category folder from.  */
117    public static final String PROPERTY_CATEGORY_REPOSITORY = "category.repository";
118
119    /** Property to define the function detail container for a template. */
120    public static final String PROPERTY_CONTAINER_INFO = "container.info";
121
122    /** Property for the content conversion. */
123    public static final String PROPERTY_CONTENT_CONVERSION = "content-conversion";
124
125    /** Property for the content encoding. */
126    public static final String PROPERTY_CONTENT_ENCODING = "content-encoding";
127
128    /** Property for the content encoding. */
129    public static final String PROPERTY_COPYRIGHT = "Copyright";
130
131    /** Property for the default file in folders. */
132    public static final String PROPERTY_DEFAULT_FILE = "default-file";
133
134    /** Property for the days a resource has to be expired to be deleted by the <code>{@link  org.opencms.scheduler.jobs.CmsDeleteExpiredResourcesJob}</code>. */
135    public static final String PROPERTY_DELETE_EXPIRED = "delete.expired";
136
137    /** Property for the description. */
138    public static final String PROPERTY_DESCRIPTION = "Description";
139
140    /** Property for the description in HTML format. */
141    public static final String PROPERTY_DESCRIPTION_HTML = "Description.html";
142
143    /** Property to set the display order of a content in lists. */
144    public static final String PROPERTY_DISPLAY_ORDER = "display-order";
145
146    /** The name of the property which controls whether an element will be used as a copy model by the container page editor. */
147    public static final String PROPERTY_ELEMENT_MODEL = "element.model";
148
149    /** May contain a path to an element replacement configuration, for use in the 'copy page' dialog. */
150    public static final String PROPERTY_ELEMENT_REPLACEMENTS = "element.replacements";
151
152    /** Property for the resource title. */
153    public static final String PROPERTY_ENABLE_NOTIFICATION = "enable-notification";
154
155    /** Property for the static export. */
156    public static final String PROPERTY_EXPORT = "export";
157
158    /** 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. */
159    public static final String PROPERTY_EXPORT_TYPE = "export.type";
160
161    /** Property for the resource export name, during export this name is used instead of the resource name. */
162    public static final String PROPERTY_EXPORTNAME = "exportname";
163
164    /** Property for JSP additional suffix during static export, default is "html". */
165    public static final String PROPERTY_EXPORTSUFFIX = "exportsuffix";
166
167    /** Property to control the folders where template or default bodies should be available. */
168    public static final String PROPERTY_FOLDERS_AVAILABLE = "folders.available";
169
170    /** Property stating where to create new gallery folders. */
171    public static final String PROPERTY_GALLERIES_FOLDER = "galleries.folder";
172
173    /** Property containing the maps API key. */
174    public static final String PROPERTY_GOOGLE_API_KEY = "google.apikey";
175
176    /** Property containing the maps API key. */
177    public static final String PROPERTY_GOOGLE_API_KEY_WORKPLACE = "google.apikey.workplace";
178
179    /** Property to control whether historic versions should be removed when deleted resources are published. */
180    public static final String PROPERTY_HISTORY_REMOVE_DELETED = "history.removedeleted";
181
182    /** Name of the property in which the focal point is stored. */
183    public static final String PROPERTY_IMAGE_FOCAL_POINT = CmsGwtConstants.PROPERTY_IMAGE_FOCALPOINT;
184
185    /** Property constant for <code>"image.size"</code>. */
186    public static final String PROPERTY_IMAGE_SIZE = "image.size";
187
188    /** The property for defining the date (as Solr field) that should be used for sorting in lists. */
189    public static final String PROPERTY_INSTANCEDATE_COPYFIELD = "instancedate.copyfield";
190
191    /** Property for the keywords. */
192    public static final String PROPERTY_KEYWORDS = "Keywords";
193
194    /** Property to enable __forceAbsoluteLinks request parameter for a resource. */
195    public static final String PROPERTY_LINKS_FORCEABSOLUTE_ENABLED = "links.forceabsolute.enabled";
196
197    /** Property for the current locale. */
198    public static final String PROPERTY_LOCALE = "locale";
199
200    /** Property to mark detail pages to have locale independent detail only containers. */
201    public static final String PROPERTY_LOCALE_INDEPENDENT_DETAILS = "locale.independent-details";
202
203    /** Property for the 'do not translate' marking in the sitemap editor. */
204    public static final String PROPERTY_LOCALE_NOTRANSLATION = "locale.notranslation";
205
206    /** Property for the login form. */
207    public static final String PROPERTY_LOGIN_FORM = "login-form";
208
209    /** Property constant for <code>"NavImage"</code>. */
210    public static final String PROPERTY_NAVIMAGE = "NavImage";
211
212    /** Property constant for <code>"NavInfo"</code>. */
213    public static final String PROPERTY_NAVINFO = "NavInfo";
214
215    /** Property for the navigation position. */
216    public static final String PROPERTY_NAVPOS = "NavPos";
217
218    /** Property for the navigation text. */
219    public static final String PROPERTY_NAVTEXT = "NavText";
220
221    /** Property for the resource title. */
222    public static final String PROPERTY_NOTIFICATION_INTERVAL = "notification-interval";
223
224    /** Property for the relative root link substitution. */
225    public static final String PROPERTY_RELATIVEROOT = "relativeroot";
226
227    /** Property name that defines the available resource types for the "new" dialog. */
228    public static final String PROPERTY_RESTYPES_AVAILABLE = "restypes.available";
229
230    /** Property to sort search results in categories. */
231    public static final String PROPERTY_SEARCH_CATEGORY = "category";
232
233    /** Property to exclude individual resources from search index generation. */
234    public static final String PROPERTY_SEARCH_EXCLUDE = "search.exclude";
235
236    /** Property to exclude individual resources from search results online (Solr only). */
237    public static final String PROPERTY_SEARCH_EXCLUDE_ONLINE = "search.exclude.online";
238
239    /** Property to boost certain search results. */
240    public static final String PROPERTY_SEARCH_PRIORITY = "search.priority";
241
242    /** Property for secondary locales for use in the locale compare view in the sitemap editor. */
243    public static final String PROPERTY_SECONDARY_LOCALES = "locale.secondary";
244
245    /** Property for the secure transmission of resources. */
246    public static final String PROPERTY_SECURE = "secure";
247
248    /** Property for the stylesheet of files. */
249    public static final String PROPERTY_STYLESHEET = "stylesheet";
250
251    /** Property to control the template. */
252    public static final String PROPERTY_TEMPLATE = "template";
253
254    /** Property to customize for which templates elements should be displayed in the gallery when using the CmsTransformerTemplateProvider. */
255    public static final String PROPERTY_TEMPLATE_COMPATILIBITY = "template.compatibility";
256
257    /** Property for specifying a list of container types used to match formatters in the display formatter selection widget. */
258    public static final String PROPERTY_TEMPLATE_DISPLAY_TYPES = "template.display.types";
259
260    /** Property to control the template elements. */
261    public static final String PROPERTY_TEMPLATE_ELEMENTS = "template-elements";
262
263    /** Property for the template image. */
264    public static final String PROPERTY_TEMPLATE_IMAGE = "template.image";
265
266    /** 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.  */
267    public static final String PROPERTY_TEMPLATE_PROVIDER = "template.provider";
268
269    /** Property for the resource title. */
270    public static final String PROPERTY_TITLE = "Title";
271
272    /** Property for user data request configuration. */
273    public static final String PROPERTY_UDR_CONFIG = "udr.config";
274
275    /** Property used to configure default organizational unit. */
276    public static final String PROPERTY_UDR_DEFAULTOU = "udr.defaultou";
277
278    /** Name of the property used to control whether mapped URL names should replace previous URL names. */
279    public static final String PROPERTY_URLNAME_REPLACE = "urlname.replace";
280
281    /** Property for the visible method in the administration view. */
282    public static final String PROPERTY_VISIBLE = "visiblemethod";
283
284    /** Property for the XML sitemap change frequency. */
285    public static final String PROPERTY_XMLSITEMAP_CHANGEFREQ = "xmlsitemap.changefreq";
286
287    /** Property for the XML sitemap priority. */
288    public static final String PROPERTY_XMLSITEMAP_PRIORITY = "xmlsitemap.priority";
289
290    /** The property definition type for resources. */
291    public static final int PROPERYDEFINITION_RESOURCE = 1;
292
293    /** Property value is treated as a link or list of links. */
294    public static final CmsPropertyType TYPE_LINK = CmsPropertyType.LINK;
295
296    /** Property value is not a link. */
297    public static final CmsPropertyType TYPE_NORMAL = CmsPropertyType.NORMAL;
298
299    /** The null property definition object. */
300    private static final CmsPropertyDefinition NULL_PROPERTY_DEFINITION = new CmsPropertyDefinition(
301        CmsUUID.getNullUUID(),
302        "",
303        TYPE_NORMAL);
304
305    /** The id of this property definition. */
306    private CmsUUID m_id;
307
308    /** The name of this property definition. */
309    private String m_name;
310
311    /** The type of this property definition.*/
312    private CmsPropertyType m_type;
313
314    /**
315     * Creates a new property definition object with the type
316     * <code>{@link #TYPE_NORMAL}</code>.<p>
317     *
318     * @param id the id of the property definition
319     * @param name the name of the property definition
320     */
321    public CmsPropertyDefinition(CmsUUID id, String name) {
322
323        this(id, name, TYPE_NORMAL);
324    }
325
326    /**
327     * Creates a new property definition object.<p>
328     *
329     * @param id the id of the property definition
330     * @param name the name of the property definition
331     * @param propertyType the type of the property
332     */
333    public CmsPropertyDefinition(CmsUUID id, String name, CmsPropertyType propertyType) {
334
335        m_id = id;
336        m_name = name;
337        m_type = propertyType;
338    }
339
340    /**
341     * Checks if the provided property name is a valid property name,
342     * that is contains only valid characters.<p>
343     *
344     * A property name can only be composed of digits,
345     * standard ASCII letters and the symbols defined in {@link #NAME_CONSTRAINTS}.<p>
346     *
347     * @param name the property name to check
348     *
349     * @throws CmsIllegalArgumentException if the given property name is not valid
350     */
351    public static void checkPropertyName(String name) throws CmsIllegalArgumentException {
352
353        if (CmsStringUtil.isEmptyOrWhitespaceOnly(name)) {
354            throw new CmsIllegalArgumentException(
355                Messages.get().container(Messages.ERR_BAD_PROPERTYNAME_EMPTY_0, name));
356        }
357
358        CmsStringUtil.checkName(name, NAME_CONSTRAINTS, Messages.ERR_BAD_PROPERTYNAME_4, Messages.get());
359    }
360
361    /**
362     * Returns the null property definition.<p>
363     *
364     * @return the null property definition
365     */
366    public static CmsPropertyDefinition getNullPropertyDefinition() {
367
368        return CmsPropertyDefinition.NULL_PROPERTY_DEFINITION;
369    }
370
371    /**
372     * Returns a clone of this Objects instance.<p>
373     *
374     * @return a clone of this instance
375     */
376    @Override
377    public Object clone() {
378
379        return new CmsPropertyDefinition(m_id, m_name, m_type);
380    }
381
382    /**
383     * @see java.lang.Comparable#compareTo(java.lang.Object)
384     */
385    public int compareTo(CmsPropertyDefinition obj) {
386
387        if (obj == this) {
388            return 0;
389        }
390        return m_name.compareTo(obj.m_name);
391    }
392
393    /**
394     * @see java.lang.Object#equals(java.lang.Object)
395     */
396    @Override
397    public boolean equals(Object obj) {
398
399        if (obj == this) {
400            return true;
401        }
402        if (obj instanceof CmsPropertyDefinition) {
403            return ((CmsPropertyDefinition)obj).m_id.equals(m_id);
404        }
405        return false;
406    }
407
408    /**
409     * Returns the id of this property definition.<p>
410     *
411     * @return id the id of this Propertydefinition
412     */
413    public CmsUUID getId() {
414
415        return m_id;
416    }
417
418    /**
419     * Returns the name of this property definition.<p>
420     *
421     * @return name The name of this property definition
422     */
423    public String getName() {
424
425        return m_name;
426    }
427
428    /**
429     * Returns the the type of this property definition.<p>
430     *
431     * @return the type of this property definition
432     */
433    public CmsPropertyType getType() {
434
435        return m_type;
436    }
437
438    /**
439     * @see java.lang.Object#hashCode()
440     */
441    @Override
442    public int hashCode() {
443
444        if (m_name != null) {
445            return m_name.hashCode();
446        }
447        return 0;
448    }
449
450    /**
451     * Sets the type for this property definition.<p>
452     *
453     * @param type the type to set
454     */
455    public void setType(CmsPropertyType type) {
456
457        m_type = type;
458    }
459
460    /**
461     * @see java.lang.Object#toString()
462     */
463    @Override
464    public String toString() {
465
466        StringBuffer result = new StringBuffer();
467        result.append("[Propertydefinition]");
468        result.append(" name:");
469        result.append(m_name);
470        result.append(" id:");
471        result.append(m_id);
472        result.append(" type:");
473        result.append(m_type);
474        return result.toString();
475    }
476}