/* * 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.xml.types; import org.opencms.file.CmsObject; import org.opencms.xml.CmsXmlContentDefinition; import org.opencms.xml.I_CmsXmlDocument; import java.util.Locale; import org.dom4j.Element; import org.dom4j.Namespace; import org.dom4j.QName; /** * Describes a type in an OpenCms XML schema based content definition.<p> * * A XML content definition in OpenCms basically consists of a sequence of * nodes in the following format:<p> * * <code><xsd:element name="title" type="cmsStringType" minOccurs="0" maxOccurs="unbounded" default="Some text" /></code>.<p> * * Internally, each configured element in a XML schema is represented by an instance of * this interface. This allows for constructing or changing the XML schema through the * provided API.<p> * * Note that this class only <i>describes the definition</i> of a value in the XML schema. * It is not the representation of an actual value from a XML file, * for this you need an instance of a {@link org.opencms.xml.types.I_CmsXmlContentValue}.<p> * * @since 6.0.0 * * @see org.opencms.xml.types.I_CmsXmlContentValue */ public interface I_CmsXmlSchemaType extends Comparable<I_CmsXmlSchemaType> { /** The schema instance namespace. */ Namespace XSI_NAMESPACE = Namespace.get("xsi", "http://www.w3.org/2001/XMLSchema-instance"); /** Constant for the XML schema attribute "noNamespaceSchemaLocation" in the XML schema instance namespace. */ QName XSI_NAMESPACE_ATTRIBUTE_NO_SCHEMA_LOCATION = QName.get("noNamespaceSchemaLocation", XSI_NAMESPACE); /** * Appends an XML representation of this schema type to the given XML element.<p> * * This is used to dynamically build a XML schema from an instance of a * {@link org.opencms.xml.CmsXmlContentDefinition} class.<p> * * @param root the element to append the XML to */ void appendXmlSchema(Element root); /** * Creates a XML content value object for this type.<p> * * @param document the XML content instance this value belongs to * @param element the XML element to create the value from * @param locale the locale to create the value for * * @return the created XML content value object */ I_CmsXmlContentValue createValue(I_CmsXmlDocument document, Element element, Locale locale); /** * Appends an XML for a new, empty node of this schema type to the given root element.<p> * * This is used to dynamically build a vaild XML content object from an initialized * {@link org.opencms.xml.CmsXmlContentDefinition} class.<p> * * Important: This method can only be used during initialization of a XML content object, * not to add values to an already initialized XML content. To add values after initialization, * use {@link org.opencms.xml.content.CmsXmlContent#addValue(CmsObject, String, Locale, int)}.<p> * * @param cms the current users OpenCms context * @param document the document the XML is generated for * @param root the element to append the XML to * @param locale the locale to generate the element default content for * * @return the generated XML element */ Element generateXml(CmsObject cms, I_CmsXmlDocument document, Element root, Locale locale); /** * Returns the maximum occurrences of choice options for this type in the current schema.<p> * * This will be greater than 0 only if {@link #isChoiceType()} is <code>true</code>.<p> * * @return the maximum occurrences of choice options for this type in the current schema */ int getChoiceMaxOccurs(); /** * Returns the content definition this schema type belongs to.<p> * * If the value belongs to a nested content, then the nested content definition is returned. * This means that for documents with nested schemas, the content definition of a * value is not necessarily equal to the content definition of the document itself, * which can be obtained using {@link I_CmsXmlContentValue#getDocument()}.<p> * * @return the content definition this schema type belongs to */ CmsXmlContentDefinition getContentDefinition(); /** * Returns the default value for a node of this type in the current schema.<p> * * @param locale the locale to generate the default value for * * @return the default value for a node of this type in the current schema * * @see org.opencms.xml.content.I_CmsXmlContentHandler#getDefault(CmsObject, I_CmsXmlContentValue, Locale) */ String getDefault(Locale locale); /** * Returns the maximum occurrences of this type in the current schema.<p> * * @return the maximum occurrences of this type in the current schema */ int getMaxOccurs(); /** * Returns the minimum occurrences of this type in the current schema.<p> * * @return the minimum occurrences of this type in the current schema */ int getMinOccurs(); /** * Returns the XML element node name of this type in the current schema.<p> * * The XML element node name can be configured in the schema. * For example, the node name could be <code>"Title"</code>, * <code>"Teaser"</code> or <code>"Text"</code>. The XML schema controls * what node names are allowed.<p> * * @return the XML node name of this type in the current schema */ String getName(); /** * Returns a String representation of the XML definition for this schema type.<p> * * @return a String representation of the XML definition for this schema type */ String getSchemaDefinition(); /** * Returns the schema type name.<p> * * By convention, a XML schema type name has the form * <code>"OpenCms + ${name}"</code>. Examples are * <code>"OpenCmsString"</code> or <code>"OpenCmsBoolean"</code>.<p> * * The schema type name is fixed by the implementation.<p> * * @return the schema type name */ String getTypeName(); /** * Returns <code>true</code> if this type is an option inside of a choice sequence.<p> * * This method is intended to check if this type is a node inside a choice sequence. * In order to check if this type defines a choice sequence, use {@link #isChoiceType()}.<p> * * @return <code>true</code> if this node defines a choice sequence */ boolean isChoiceOption(); /** * Returns <code>true</code> if this type defines a choice sequence.<p> * * This method is intended to check if this type is a node defining a choice sequence. * In order to check if this type is an option inside of a choice sequence, use {@link #isChoiceOption()}.<p> * * @return <code>true</code> if this node defines a choice sequence */ boolean isChoiceType(); /** * Returns <code>true</code> if this is a simple type, or <code>false</code> * if this type is a nested schema.<p> * * If a value is a nested schema, it must be an instance of {@link CmsXmlNestedContentDefinition}.<p> * * @return true if this is a simple type, or false if this type is a nested schema * * @see CmsXmlNestedContentDefinition */ boolean isSimpleType(); /** * Creates a new instance of this XML schema type initialized with the given values.<p> * * @param name the name to use in the xml document * @param minOccurs minimum number of occurrences * @param maxOccurs maximum number of occurrences * * @return a new instance of this XML content type initialized with the given values */ I_CmsXmlSchemaType newInstance(String name, String minOccurs, String maxOccurs); /** * Sets the content definition this schema type belongs to.<p> * * This is done automatically when the scheme type is added * to a content definition. Usually there is no need to call this * method from the application.<p> * * @param contentDefinition the content definition to set */ void setContentDefinition(CmsXmlContentDefinition contentDefinition); /** * Sets the default value for a node of this type in the current schema.<p> * * @param defaultValue the default value to set */ void setDefault(String defaultValue); /** * Checks if a given value is valid according to the validation rule (regular expression) used for validation * of this schema type in the XML schema.<p> * * To have a more refined validation according to the special requirements of the * content type, use custom validation rules in the appinfo which are * processed with {@link org.opencms.xml.content.I_CmsXmlContentHandler#resolveValidation(CmsObject, I_CmsXmlContentValue, org.opencms.xml.content.CmsXmlContentErrorHandler)}.<p> * * @param value the value to validate * * @return the validation rule (regular expression) used for this schema type in the XML schema * * @see org.opencms.xml.content.I_CmsXmlContentHandler#resolveValidation(CmsObject, I_CmsXmlContentValue, org.opencms.xml.content.CmsXmlContentErrorHandler) */ boolean validateValue(String value); }