/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * 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. * * 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., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.query.mapping.xml; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Constants, property names, and property default values for * a {@link MappingNode}. */ public final class MappingNodeConstants { // Can't instantiate private MappingNodeConstants() { } // ========================================================================= // CONSTANTS // ========================================================================= /** * Indicates a search of a mapping document should be upward. See * {@link MappingNode#findFirstNodeWithProperty} */ public static final int SEARCH_UP = 2; /** * Indicates a search of a mapping document should be downward, DEPTH FIRST. See * {@link MappingNode#findFirstNodeWithProperty} */ public static final int SEARCH_DOWN = 3; // DEPTH FIRST /** * Indicates a search of a mapping document should be downward, BREADTH FIRST. See * {@link MappingNode#findFirstNodeWithProperty} */ public static final int SEARCH_DOWN_BREADTH_FIRST = 4; //BREADTH FIRST /** Constant for children returned by non-complex nodes (never have children). */ static final List NO_CHILDREN = Collections.EMPTY_LIST; /** Schema node path delimeter. */ public static final String PATH_DELIM = "."; //$NON-NLS-1$ /** The value used to indicate an unbounded maximum cardinality */ public static final Integer CARDINALITY_UNBOUNDED = new Integer(-1); public static final String CARDINALITY_UNBOUNDED_STRING = "unbounded"; //$NON-NLS-1$ /** Constant defining a target node type of "attribute". */ public static final String ATTRIBUTE = "attribute"; //$NON-NLS-1$ /** Constant defining a target node type of "element". */ public static final String ELEMENT = "element"; //$NON-NLS-1$ /** Constant defining a target node type of "comment". */ public static final String COMMENT = "comment"; //$NON-NLS-1$ /** Constant defining a target node type of "sequence". */ public static final String SEQUENCE = "sequence"; //$NON-NLS-1$ /** Constant defining a target node type of "choice". */ public static final String CHOICE = "choice"; //$NON-NLS-1$ /** Constant defining a target node type of "All". */ public static final String ALL = "all"; //$NON-NLS-1$ /** Constant defining a target node type of "Criteria". */ public static final String CRITERIA = "criteria"; //$NON-NLS-1$ /** Constant defining a target node type of "source". */ public static final String SOURCE = "source"; //$NON-NLS-1$ /** * Defines a default namespace holder for the nodes with out any * namespace declarations. */ public static final Namespace NO_NAMESPACE = new Namespace("", ""); //$NON-NLS-1$ //$NON-NLS-2$ /** * This constant is merely used as a placeholder in the declaration of a * default namespace in an XML doc instance. A default namespace has no * prefix associated with it, so the String used here is a forbidden XML * character that could never be used as a real namespace prefix. */ public static final String DEFAULT_NAMESPACE_PREFIX = ""; //$NON-NLS-1$ /** * Prefix of the XML Schema namespace for instances - needed to make * use of the "nil" attribute defined in that namespace, for * nillable nodes * @see #INSTANCES_NAMESPACE */ public static final String INSTANCES_NAMESPACE_PREFIX = "xsi"; //$NON-NLS-1$ /** * The XML Schema namespace for instances - needed to make * use of the "nil" attribute defined in that namespace, for * nillable nodes * @see #INSTANCES_NAMESPACE_PREFIX */ public static final String INSTANCES_NAMESPACE = "http://www.w3.org/2001/XMLSchema-instance"; //$NON-NLS-1$ public static final String NAMESPACE_DECLARATION_ATTRIBUTE_NAMESPACE = "xmlns"; //$NON-NLS-1$ /** * PRESERVE -No normalization is done, the value is not changed. * REPLACE - All occurrences of tab, line feed and carriage return are replaced with space * COLLAPSE - After the processing implied by replace, contiguous sequences of space are * collapsed to a single space, and leading and trailing spaces are removed. */ public static final String NORMALIZE_TEXT_PRESERVE = "preserve"; //$NON-NLS-1$ public static final String NORMALIZE_TEXT_REPLACE = "replace"; //$NON-NLS-1$ public static final String NORMALIZE_TEXT_COLLAPSE = "collapse"; //$NON-NLS-1$ /** * Default built-in type = no type info, which is an empty string */ public static final String NO_TYPE = ""; //$NON-NLS-1$ // ========================================================================= // PROPERTIES // ========================================================================= /** * Property names for type-specific node properties. Values will be of * type String unless otherwise specified. */ public enum Properties { /** The basic name of this node. Will be the element or attribute tag name. */ NAME, /** * The namespace prefix, which indicates the namespace for this node. * The namespace must be declared either at this node or an ancestor * node; use the {@link #NAMESPACE_DECLARATIONS} property. */ NAMESPACE_PREFIX, /** * <p>This property allows for one or more namespace declarations * (a namespace prefix and a namespace uri) at a given node. The * object value should be a java.util.Properties object, where each * key is a String prefix and each value is the namespace String * uri. The prefix may then be referenced by other nodes via * the {@link #NAMESPACE_PREFIX} property.</p> * * <p>One common example would be the XML Schema namespace for * instances. In this case, the common convention is to use * "xsi" for the prefix, and the uri is * "http://www.w3.org/2001/XMLSchema-instance". This is commonly * declared at the root node of the document instance. Then, elsewhere, * a node may for example use the "nil" attribute from that namespace: * * <pre><shipDate xsi:nil="true"/></pre> * </p> */ NAMESPACE_DECLARATIONS, /** * The target node type. Can take on one of the values {@link #ATTRIBUTE} * or {@link #ELEMENT}. */ NODE_TYPE, // Values: ATTRIBUTE|ELEMENT /** * <p>The minimum number of times this node must occur in a document.</p> * <p>Type: <code>java.lang.Integer</code></p> */ CARDINALITY_MIN_BOUND, /** * <p>The maximum number of times this node may occur in a document.</p> * <p>Type: <code>java.lang.Integer</code></p> */ CARDINALITY_MAX_BOUND, /** * An optional constraint that applies for the node. If a constraint is * defined, the input tuple to the node will be compared to the constraint. * The node will be processed only if the constraint is satisfied. */ CRITERIA, /** * This property represents a default value for an XML node */ DEFAULT_VALUE, /** * This property represents a fixed value for an XML node */ FIXED_VALUE, /** * <p>Value will be of type Boolean. Indicates that the node is nillable, * i.e. may have a child attribute <code>xsi:nil="true"</code>, * where xsi indicates the W3C namespace for instances. This explicitly * indicates when the element has null content.</p> * * <p><b>Note:</b> This property may only be set to true if this node * is an element (i.e. the {@link #NODETYPE} property must have * a value of {@link #ELEMENT}), although this constraint is not * enforced anywhere in the MappingNode framework.</p> */ IS_NILLABLE, /** * <p>This node will be completely ignored, not output, not * processed</p> * <p>Type: <code>java.lang.Boolean</code></p> * <p>Default: {@link MappingNodeConstants.Defaults#DEFAULT_IS_EXCLUDED}</p> */ IS_EXCLUDED, /** The name of the result being returned by this node */ RESULT_SET_NAME, /** * The name(s) of the temporary group(s) to be materialized at this * document node. * <p>Type: <code>java.util.List</code> of </code>java.lang.String</code> * <p>Default: {@link MappingNodeConstants.Defaults#DEFAULT_TEMP_GROUP_NAMES}</p> */ TEMP_GROUP_NAMES, /** The symbol from a result set that maps to this node. */ ELEMENT_NAME, /** The temporary property to mark whether this node should be included. */ IS_INCLUDED, /** * The text for a comment. */ COMMENT_TEXT, /** * Indicates that the element or attribute is to be considered optional, * even if it has a fixed or default value - it should be removed from the * result doc if it doesn't have child content or doesn't receive character * content from the underlying data store. See defect 12077 * <p>Type: <code>java.lang.Boolean</code> * <p>Default: {@link MappingNodeConstants.Defaults#DEFAULT_IS_OPTIONAL}</p> */ IS_OPTIONAL, /** * <p>Indicates the level of text normalization that will be applied * to the text content for a given element or attribute. </p> * <p>Type: <code>java.lang.String</code></p> * <p>Default: {@link MappingNodeConstants.Defaults#DEFAULT_NORMALIZE_TEXT}</p> */ NORMALIZE_TEXT, /** * Specifies the design-time base built-in type for the virtual document node. * This property is <strong>optional</strong> and may not exist, particularly for * legacy XML virtual docs or for nodes that are not mapped to data. This information * is used to determine special translations from the runtime value to the expected * XML schema output value string. */ BUILT_IN_TYPE, // ======================================================================== // CHOICE NODE RELATED PROPERTIES // ======================================================================== /** * <p>This property of a <i>single child</i> of a choice node marks that * child as representing the default choice of the choice node.</p> * <p>Type: <code>java.lang.Boolean</code></p> * <p>Default: {@link MappingNodeConstants.Defaults#DEFAULT_IS_DEFAULT_CHOICE}</p> */ IS_DEFAULT_CHOICE, /** * <p>This property of a choice node indicates that, by * default (if none of the choices evaluate to true), an * exception will be thrown. The order in which this * will be considered: first, check that a child node * is marked as the {@link #IS_DEFAULT_CHOICE default choice}; * if not, then check this property. If it is true, throw * an exception, if false, do nothing.</p> * <p>Type: <code>java.lang.Boolean</code></p> * <p>Default: {@link MappingNodeConstants.Defaults#DEFAULT_EXCEPTION_ON_DEFAULT}</p> */ EXCEPTION_ON_DEFAULT, // ======================================================================== // RECURSI0N RELATED PROPERTIES // ======================================================================== /** * Indicates if the node is the root of a recursive XML fragment or not. * <p>Type: <code>java.lang.Boolean</code></p> * <p>Default: {@link MappingNodeConstants.Defaults#DEFAULT_IS_RECURSIVE}</p> */ IS_RECURSIVE, /** * The criteria of a node representing the root of a recursive * XML fragment. The criteria should specify under what circumstances the * recursion should terminate. i.e. "resultSetName.employeeName = 'Jones'" * @see #RECURSION_LIMIT */ RECURSION_CRITERIA, /** * The recursion limit of a recursive XML fragment - if the * {@link #RECURSION_CRITERIA} does not terminate the recursion before * the limit is reached, the recursion will be terminated after this * many iterations. This is to prevent runaway recursion. * <p>Type: <code>java.lang.Integer</code></p> * <p>Default: {@link MappingNodeConstants.Defaults#DEFAULT_RECURSION_LIMIT}</p> * @see #EXCEPTION_ON_RECURSION_LIMIT */ RECURSION_LIMIT, /** * If recursion is terminated due to the safeguard {@link #RECURSION_LIMIT} being * reached, this property controls whether an exception will be thrown or not. * <p>Type: <code>java.lang.Boolean</code></p> * <p>Default: {@link MappingNodeConstants.Defaults#DEFAULT_EXCEPTION_ON_RECURSION_LIMIT}</p> * @see #RECURSION_CRITERIA * @see #RECURSION_LIMIT */ EXCEPTION_ON_RECURSION_LIMIT, /** * This property should be set on each document node at which a recursive * mapping class is anchored. The value of this property should be the * String name of the ancestor mapping class which is rooted at the * recursive root node (i.e. the root of the recursive fragment of the * document). * <p>Type: <code>java.lang.String</code></p> */ RECURSION_ROOT_MAPPING_CLASS, /** * Indicates if the node is the root of a recursive XML fragment or not. * <p>Type: <code>java.lang.Boolean</code></p> * <p>Default: {@link MappingNodeConstants.Defaults#DEFAULT_IS_RECURSIVE_ROOT}</p> */ IS_RECURSIVE_ROOT, // ================================================================================== // DOCUMENT PROPERTIES (read from root node only, applicable to document as a whole) // ================================================================================== /** * <p>The encoding format of the document. This property only needs to be * set at the root MappingNode of the document.</p> * <p>Default: {@link MappingNodeConstants.Defaults#DEFAULT_DOCUMENT_ENCODING}</p> */ DOCUMENT_ENCODING, /** * <p>Indicates whether the document will be outputted as a compressed * String, or in readable form, with line breaks or indenting. This * property only needs to be set at the root MappingNode * of the document.</p> * <p>Type: <code>java.lang.Boolean</code></p> * <p>Default: {@link MappingNodeConstants.Defaults#DEFAULT_FORMATTED_DOCUMENT}</p> */ FORMATTED_DOCUMENT, /** * A property to mark to implicity include a node which needs to be * added to result document. The implicit nodes are such nodes which * define the encoding information and type defination information. */ ALWAYS_INCLUDE, /** * In the case of the recursive mapping element nodes, the source nodes * may be different, in that case the original result set name * (i.e. mapping class in recurive node) is alias to the source node which is * above the recursive node. */ ALIAS_RESULT_SET_NAME, /** * Result Set Info object which contains the query and the plan for * the source node. */ RESULT_SET_INFO, } // ========================================================================= // XML DOCUMENT TAGS // ========================================================================= /** * These are the String values to be used for XML document tags. * They map to one of the property keys defined in {@link Properties}, * With the exceptions of the namespace ones: * {@link #NAMESPACE_DECLARATION} and child tags. * @see getPropertyString * @see getPropertyInteger */ public static final class Tags { private Tags() { } public static final String MAPPING_ROOT_NAME = "xmlMapping"; //$NON-NLS-1$ public static final String MAPPING_NODE_NAME = "mappingNode"; //$NON-NLS-1$ public static final String NAME = "name"; //$NON-NLS-1$ public static final String NAMESPACE_PREFIX = "namespace"; //$NON-NLS-1$ /** * The wrapper tag around a single namespace declaration */ public static final String NAMESPACE_DECLARATION = "namespaceDeclaration"; //$NON-NLS-1$ /** * The attribute, child of the namespace declaration element, * which specifies the prefix of a namespace declaration */ public static final String NAMESPACE_DECLARATION_PREFIX = "prefix"; //$NON-NLS-1$ /** * The attribute, child of the namespace declaration element, * which specifies the uri of a namespace declaration */ public static final String NAMESPACE_DECLARATION_URI = "uri"; //$NON-NLS-1$ public static final String NODE_TYPE = "nodeType"; //$NON-NLS-1$ public static final String CARDINALITY_MIN_BOUND = "minOccurs"; //$NON-NLS-1$ public static final String CARDINALITY_MAX_BOUND = "maxOccurs"; //$NON-NLS-1$ public static final String CRITERIA = "criteria"; //$NON-NLS-1$ public static final String DEFAULT_VALUE = "default"; //$NON-NLS-1$ public static final String FIXED_VALUE = "fixed"; //$NON-NLS-1$ public static final String RESULT_SET_NAME = "source"; //$NON-NLS-1$ //public static final String ALIAS_RESULT_SET_NAME="aliasSource";//$NON-NLS-1$ /** * specifies a single temp group name - this tag has * multiplicity of zero or more */ public static final String TEMP_GROUP_NAME = "tempGroup"; //$NON-NLS-1$ public static final String ELEMENT_NAME = "symbol"; //$NON-NLS-1$ public static final String COMMENT_TEXT = "comment"; //$NON-NLS-1$ public static final String IS_OPTIONAL = "optional"; //$NON-NLS-1$ public static final String IS_NILLABLE = "isNillable"; //$NON-NLS-1$ public static final String IS_EXCLUDED = "isExcluded"; //$NON-NLS-1$ public static final String IS_DEFAULT_CHOICE = "isDefaultChoice"; //$NON-NLS-1$ public static final String EXCEPTION_ON_DEFAULT = "exceptionOnDefault"; //$NON-NLS-1$ public static final String DOCUMENT_ENCODING = "documentEncoding"; //$NON-NLS-1$ public static final String NORMALIZE_TEXT = "textNormalization"; //$NON-NLS-1$ public static final String BUILT_IN_TYPE = "builtInType"; //$NON-NLS-1$ public static final String FORMATTED_DOCUMENT = "formattedDocument"; //$NON-NLS-1$ public static final String IS_RECURSIVE = "isRecursive"; //$NON-NLS-1$ public static final String RECURSION_CRITERIA = "recursionCriteria"; //$NON-NLS-1$ public static final String RECURSION_LIMIT = "recursionLimit"; //$NON-NLS-1$ public static final String RECURSION_LIMIT_EXCEPTION = "recursionLimitException"; //$NON-NLS-1$ public static final String RECURSION_ROOT_MAPPING_CLASS = "recursionRootMappingClass"; //$NON-NLS-1$ public static final String ALWAYS_INCLUDE = "includeAlways"; //$NON-NLS-1$ /** * The List of the tags, defined in this Class, which are * child elements of a {@link #MAPPING_NODE_NAME mapping node} * tag. They are in a fixed order, so that the * {@link MappingOutputter} can output documents in a consistent * manner. Some tags are left out that the MappingOutputter * handles separately. */ static final List<String> OUTPUTTER_PROPERTY_TAGS; // Initialize static variables... static { List<String> temp = Arrays.asList( new String[]{ MappingNodeConstants.Tags.NAME, MappingNodeConstants.Tags.NODE_TYPE, MappingNodeConstants.Tags.NAMESPACE_PREFIX, MappingNodeConstants.Tags.DOCUMENT_ENCODING, MappingNodeConstants.Tags.FORMATTED_DOCUMENT, MappingNodeConstants.Tags.CRITERIA, MappingNodeConstants.Tags.DEFAULT_VALUE, MappingNodeConstants.Tags.FIXED_VALUE, MappingNodeConstants.Tags.CARDINALITY_MIN_BOUND, MappingNodeConstants.Tags.CARDINALITY_MAX_BOUND, MappingNodeConstants.Tags.RESULT_SET_NAME, MappingNodeConstants.Tags.TEMP_GROUP_NAME, MappingNodeConstants.Tags.ELEMENT_NAME, MappingNodeConstants.Tags.COMMENT_TEXT, MappingNodeConstants.Tags.IS_OPTIONAL, MappingNodeConstants.Tags.IS_NILLABLE, MappingNodeConstants.Tags.IS_EXCLUDED, MappingNodeConstants.Tags.IS_DEFAULT_CHOICE, MappingNodeConstants.Tags.EXCEPTION_ON_DEFAULT, MappingNodeConstants.Tags.IS_RECURSIVE, MappingNodeConstants.Tags.RECURSION_CRITERIA, MappingNodeConstants.Tags.RECURSION_LIMIT, MappingNodeConstants.Tags.RECURSION_LIMIT_EXCEPTION, MappingNodeConstants.Tags.RECURSION_ROOT_MAPPING_CLASS, MappingNodeConstants.Tags.NORMALIZE_TEXT, MappingNodeConstants.Tags.ALWAYS_INCLUDE, MappingNodeConstants.Tags.BUILT_IN_TYPE } ); OUTPUTTER_PROPERTY_TAGS = Collections.unmodifiableList(temp); } } /** * Convert a property String into one of the Integer property keys * defined in {@link Properties} * @param property String representation of property * @return one of the properties defined in the * {@link Properties} inner class * @throw IllegalArgumentException if parameter isn't for one of the properties * defined in {@link Properties} * @see getPropertyString */ public static final MappingNodeConstants.Properties getProperty(String property) { if(property.equals(Tags.NAME)) return Properties.NAME; else if (property.equals(Tags.NAMESPACE_PREFIX)) return Properties.NAMESPACE_PREFIX; else if (property.equals(Tags.NODE_TYPE)) return Properties.NODE_TYPE; else if (property.equals(Tags.CARDINALITY_MIN_BOUND)) return Properties.CARDINALITY_MIN_BOUND; else if (property.equals(Tags.CARDINALITY_MAX_BOUND)) return Properties.CARDINALITY_MAX_BOUND; else if (property.equals(Tags.CRITERIA)) return Properties.CRITERIA; else if (property.equals(Tags.DEFAULT_VALUE)) return Properties.DEFAULT_VALUE; else if (property.equals(Tags.FIXED_VALUE)) return Properties.FIXED_VALUE; else if (property.equals(Tags.RESULT_SET_NAME)) return Properties.RESULT_SET_NAME; //else if (property.equals(Tags.ALIAS_RESULT_SET_NAME)) return Properties.ALIAS_RESULT_SET_NAME; else if (property.equals(Tags.TEMP_GROUP_NAME)) return Properties.TEMP_GROUP_NAMES; else if (property.equals(Tags.ELEMENT_NAME)) return Properties.ELEMENT_NAME; else if (property.equals(Tags.COMMENT_TEXT)) return Properties.COMMENT_TEXT; else if (property.equals(Tags.IS_OPTIONAL)) return Properties.IS_OPTIONAL; else if (property.equals(Tags.IS_NILLABLE)) return Properties.IS_NILLABLE; else if (property.equals(Tags.IS_EXCLUDED)) return Properties.IS_EXCLUDED; else if (property.equals(Tags.IS_DEFAULT_CHOICE)) return Properties.IS_DEFAULT_CHOICE; else if (property.equals(Tags.EXCEPTION_ON_DEFAULT)) return Properties.EXCEPTION_ON_DEFAULT; else if (property.equals(Tags.DOCUMENT_ENCODING)) return Properties.DOCUMENT_ENCODING; else if (property.equals(Tags.FORMATTED_DOCUMENT)) return Properties.FORMATTED_DOCUMENT; else if (property.equals(Tags.IS_RECURSIVE)) return Properties.IS_RECURSIVE; else if (property.equals(Tags.RECURSION_CRITERIA)) return Properties.RECURSION_CRITERIA; else if (property.equals(Tags.RECURSION_LIMIT)) return Properties.RECURSION_LIMIT; else if (property.equals(Tags.RECURSION_LIMIT_EXCEPTION)) return Properties.EXCEPTION_ON_RECURSION_LIMIT; else if (property.equals(Tags.RECURSION_ROOT_MAPPING_CLASS)) return Properties.RECURSION_ROOT_MAPPING_CLASS; else if (property.equals(Tags.NORMALIZE_TEXT)) return Properties.NORMALIZE_TEXT; else if (property.equals(Tags.BUILT_IN_TYPE)) return Properties.BUILT_IN_TYPE; else if (property.equals(Tags.ALWAYS_INCLUDE)) return Properties.ALWAYS_INCLUDE; else { throw new IllegalArgumentException("Unknown property ("+property+")"); //$NON-NLS-1$ //$NON-NLS-2$ } } /** * Convert a property Integer into a String (suitable for an XML tag). * @param property one of the properties defined in the * {@link Properties} inner class * @return String representation of property * @throw IllegalArgumentException if parameter isn't one of the properties * defined in {@link Properties} * @see getPropertyInteger */ public static final String getPropertyString(Integer property){ if(property.equals(Properties.NAME)) return Tags.NAME; else if (property.equals(Properties.NAMESPACE_PREFIX)) return Tags.NAMESPACE_PREFIX; else if (property.equals(Properties.NODE_TYPE)) return Tags.NODE_TYPE; else if (property.equals(Properties.CARDINALITY_MIN_BOUND)) return Tags.CARDINALITY_MIN_BOUND; else if (property.equals(Properties.CARDINALITY_MAX_BOUND)) return Tags.CARDINALITY_MAX_BOUND; else if (property.equals(Properties.CRITERIA)) return Tags.CRITERIA; else if (property.equals(Properties.DEFAULT_VALUE)) return Tags.DEFAULT_VALUE; else if (property.equals(Properties.FIXED_VALUE)) return Tags.FIXED_VALUE; else if (property.equals(Properties.RESULT_SET_NAME)) return Tags.RESULT_SET_NAME; else if (property.equals(Properties.TEMP_GROUP_NAMES)) return Tags.TEMP_GROUP_NAME; else if (property.equals(Properties.ELEMENT_NAME)) return Tags.ELEMENT_NAME; else if (property.equals(Properties.COMMENT_TEXT)) return Tags.COMMENT_TEXT; else if (property.equals(Properties.IS_OPTIONAL)) return Tags.IS_OPTIONAL; else if (property.equals(Properties.IS_NILLABLE)) return Tags.IS_NILLABLE; else if (property.equals(Properties.IS_EXCLUDED)) return Tags.IS_EXCLUDED; else if (property.equals(Properties.IS_DEFAULT_CHOICE)) return Tags.IS_DEFAULT_CHOICE; else if (property.equals(Properties.EXCEPTION_ON_DEFAULT)) return Tags.EXCEPTION_ON_DEFAULT; else if (property.equals(Properties.DOCUMENT_ENCODING)) return Tags.DOCUMENT_ENCODING; else if (property.equals(Properties.FORMATTED_DOCUMENT)) return Tags.FORMATTED_DOCUMENT; else if (property.equals(Properties.IS_RECURSIVE)) return Tags.IS_RECURSIVE; else if (property.equals(Properties.RECURSION_CRITERIA)) return Tags.RECURSION_CRITERIA; else if (property.equals(Properties.RECURSION_LIMIT)) return Tags.RECURSION_LIMIT; else if (property.equals(Properties.EXCEPTION_ON_RECURSION_LIMIT)) return Tags.RECURSION_LIMIT_EXCEPTION; else if (property.equals(Properties.RECURSION_ROOT_MAPPING_CLASS)) return Tags.RECURSION_ROOT_MAPPING_CLASS; else if (property.equals(Properties.NORMALIZE_TEXT)) return Tags.NORMALIZE_TEXT; else if (property.equals(Properties.BUILT_IN_TYPE)) return Tags.BUILT_IN_TYPE; else if (property.equals(Properties.ALWAYS_INCLUDE)) return Tags.ALWAYS_INCLUDE; else { throw new IllegalArgumentException("Unknown property ("+property+")"); //$NON-NLS-1$ //$NON-NLS-2$ } } // ========================================================================= // DEFAULTS // ========================================================================= /** * Default property values for node {@link MappingNodeConstants.Properties properties} */ public static final class Defaults { private Defaults() { } /** * Default property values, keyed off the properties defined in * {@link MappingNodeConstants.Properties}. The {@link MappingNode} class will return * these values if none are defined, for each property. */ public static final Map<Properties, Object> DEFAULT_VALUES; /** The default minimum bound of the cardinality of a node. */ public static final Integer DEFAULT_CARDINALITY_MINIMUM_BOUND = new Integer(1); /** The default maximum bound of the cardinality of a node. */ public static final Integer DEFAULT_CARDINALITY_MAXIMUM_BOUND = new Integer(1); /** The default output type of the node, if no value is specified */ public static final String DEFAULT_NODE_TYPE = ELEMENT; /** The default value for {@link MappingNodeConstants.Properties#IS_NILLABLE} */ public static final Boolean DEFAULT_IS_NILLABLE = Boolean.FALSE; /** The default value for {@link MappingNodeConstants.Properties#TEMP_GROUP_NAMES} */ public static final Collection DEFAULT_TEMP_GROUP_NAMES = Collections.EMPTY_LIST; /** The default value for {@link MappingNodeConstants.Properties#IS_OPTIONAL} */ public static final Boolean DEFAULT_IS_OPTIONAL = Boolean.FALSE; /** The default value for {@link MappingNodeConstants.Properties#NORMALIZE_TEXT} */ public static final String DEFAULT_NORMALIZE_TEXT = NORMALIZE_TEXT_PRESERVE; /** The default value for {@link MappingNodeConstants.Properties#BUILT_IN_TYPE} */ public static final String DEFAULT_BUILT_IN_TYPE = NO_TYPE; // ======================================================================== // CHOICE RELATED DEFAULTS // ======================================================================== /** The default value for {@link MappingNodeConstants.Properties#IS_NILLABLE} */ public static final Boolean DEFAULT_IS_EXCLUDED = Boolean.FALSE; /** The default value for {@link MappingNodeConstants.Properties#IS_INCLUDED} */ public static final Boolean DEFAULT_IS_INCLUDED = Boolean.FALSE; /** The default value for {@link MappingNodeConstants.Properties#IS_DEFAULT_CHOICE} */ public static final Boolean DEFAULT_IS_DEFAULT_CHOICE = Boolean.FALSE; /** The default value for {@link MappingNodeConstants.Properties#EXCEPTION_ON_DEFAULT} */ public static final Boolean DEFAULT_EXCEPTION_ON_DEFAULT = Boolean.FALSE; // ======================================================================== // RECURSI0N RELATED DEFAULTS // ======================================================================== /** The default value for {@link MappingNodeConstants.Properties#IS_RECURSIVE} */ public static final Boolean DEFAULT_IS_RECURSIVE = Boolean.FALSE; /** The default value for {@link MappingNodeConstants.Properties#IS_RECURSIVE_ROOT} */ public static final Boolean DEFAULT_IS_RECURSIVE_ROOT = Boolean.FALSE; /** The default value for {@link MappingNodeConstants.Properties#RECURSION_LIMIT} */ public static final Integer DEFAULT_RECURSION_LIMIT = new Integer(10); /** The default value for {@link MappingNodeConstants.Properties#EXCEPTION_ON_RECURSION_LIMIT} */ public static final Boolean DEFAULT_EXCEPTION_ON_RECURSION_LIMIT = Boolean.FALSE; // ======================================================================== // DOCUMENT RELATED DEFAULTS // ======================================================================== /** The default value for {@link MappingNodeConstants.Properties#DOCUMENT_ENCODING} */ public static final String DEFAULT_DOCUMENT_ENCODING = "UTF-8"; //$NON-NLS-1$ /** The default value for {@link MappingNodeConstants.Properties#FORMATTED_DOCUMENT} */ public static final Boolean DEFAULT_FORMATTED_DOCUMENT = Boolean.FALSE; static{ HashMap<Properties, Object> temp = new HashMap<Properties, Object>(); temp.put(Properties.CARDINALITY_MIN_BOUND, DEFAULT_CARDINALITY_MINIMUM_BOUND); temp.put(Properties.CARDINALITY_MAX_BOUND, DEFAULT_CARDINALITY_MAXIMUM_BOUND); temp.put(Properties.NODE_TYPE, DEFAULT_NODE_TYPE); temp.put(Properties.IS_NILLABLE, DEFAULT_IS_NILLABLE); temp.put(Properties.TEMP_GROUP_NAMES, DEFAULT_TEMP_GROUP_NAMES); temp.put(Properties.IS_OPTIONAL, DEFAULT_IS_OPTIONAL); temp.put(Properties.IS_EXCLUDED, DEFAULT_IS_EXCLUDED); temp.put(Properties.IS_INCLUDED, DEFAULT_IS_INCLUDED); temp.put(Properties.IS_DEFAULT_CHOICE, DEFAULT_IS_DEFAULT_CHOICE); temp.put(Properties.EXCEPTION_ON_DEFAULT, DEFAULT_EXCEPTION_ON_DEFAULT); temp.put(Properties.IS_RECURSIVE, DEFAULT_IS_RECURSIVE); temp.put(Properties.IS_RECURSIVE_ROOT, DEFAULT_IS_RECURSIVE_ROOT); temp.put(Properties.RECURSION_LIMIT, DEFAULT_RECURSION_LIMIT); temp.put(Properties.EXCEPTION_ON_RECURSION_LIMIT, DEFAULT_EXCEPTION_ON_RECURSION_LIMIT); temp.put(Properties.DOCUMENT_ENCODING, DEFAULT_DOCUMENT_ENCODING); temp.put(Properties.FORMATTED_DOCUMENT, DEFAULT_FORMATTED_DOCUMENT); temp.put(Properties.NORMALIZE_TEXT, DEFAULT_NORMALIZE_TEXT); DEFAULT_VALUES = Collections.unmodifiableMap(temp); } } }