19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file
49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information
59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file
69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License.
89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at
99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software
139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and
169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License.
179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: XSLTElementDef.java 468640 2006-10-28 06:53:53Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xalan.processor;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Enumeration;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Hashtable;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.templates.Constants;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.QName;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class defines the allowed structure for an element in a XSLT stylesheet,
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * is meant to reflect the structure defined in http://www.w3.org/TR/xslt#dtd, and the
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * mapping between Xalan classes and the markup elements in the XSLT instance.
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This actually represents both text nodes and elements.
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class XSLTElementDef
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an instance of XSLTElementDef.  This must be followed by a
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * call to build().
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XSLTElementDef(){}
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an instance of XSLTElementDef.
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespace  The Namespace URI, "*", or null.
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The local name (without prefix), "*", or null.
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nameAlias A potential alias for the name, or null.
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elements An array of allowed child element defs, or null.
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param attributes An array of allowed attribute defs, or null.
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param contentHandler The element processor for this element.
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param classObject The class of the object that this element def should produce.
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XSLTElementDef(XSLTSchema schema, String namespace, String name, String nameAlias,
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XSLTElementDef[] elements, XSLTAttributeDef[] attributes,
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XSLTElementProcessor contentHandler, Class classObject)
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    build(namespace, name, nameAlias, elements, attributes, contentHandler,
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          classObject);
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ( (null != namespace)
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    &&  (namespace.equals(Constants.S_XSLNAMESPACEURL)
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        || namespace.equals(Constants.S_BUILTIN_EXTENSIONS_URL)
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        || namespace.equals(Constants.S_BUILTIN_OLD_EXTENSIONS_URL)))
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      schema.addAvailableElement(new QName(namespace, name));
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(null != nameAlias)
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        schema.addAvailableElement(new QName(namespace, nameAlias));
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an instance of XSLTElementDef.
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespace  The Namespace URI, "*", or null.
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The local name (without prefix), "*", or null.
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nameAlias A potential alias for the name, or null.
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elements An array of allowed child element defs, or null.
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param attributes An array of allowed attribute defs, or null.
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param contentHandler The element processor for this element.
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param classObject The class of the object that this element def should produce.
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param has_required true if this element has required elements by the XSLT specification.
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XSLTElementDef(XSLTSchema schema, String namespace, String name, String nameAlias,
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XSLTElementDef[] elements, XSLTAttributeDef[] attributes,
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XSLTElementProcessor contentHandler, Class classObject, boolean has_required)
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		this.m_has_required = has_required;
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    build(namespace, name, nameAlias, elements, attributes, contentHandler,
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          classObject);
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ( (null != namespace)
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    &&  (namespace.equals(Constants.S_XSLNAMESPACEURL)
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        || namespace.equals(Constants.S_BUILTIN_EXTENSIONS_URL)
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        || namespace.equals(Constants.S_BUILTIN_OLD_EXTENSIONS_URL)))
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      schema.addAvailableElement(new QName(namespace, name));
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(null != nameAlias)
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        schema.addAvailableElement(new QName(namespace, nameAlias));
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an instance of XSLTElementDef.
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespace  The Namespace URI, "*", or null.
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The local name (without prefix), "*", or null.
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nameAlias A potential alias for the name, or null.
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elements An array of allowed child element defs, or null.
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param attributes An array of allowed attribute defs, or null.
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param contentHandler The element processor for this element.
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param classObject The class of the object that this element def should produce.
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param has_required true if this element has required elements by the XSLT specification.
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param required true if this element is required by the XSLT specification.
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XSLTElementDef(XSLTSchema schema, String namespace, String name, String nameAlias,
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XSLTElementDef[] elements, XSLTAttributeDef[] attributes,
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XSLTElementProcessor contentHandler, Class classObject,
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson								 boolean has_required, boolean required)
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this(schema, namespace, name,  nameAlias,
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 elements, attributes,
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 contentHandler, classObject, has_required);
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		this.m_required = required;
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an instance of XSLTElementDef.
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespace  The Namespace URI, "*", or null.
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The local name (without prefix), "*", or null.
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nameAlias A potential alias for the name, or null.
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elements An array of allowed child element defs, or null.
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param attributes An array of allowed attribute defs, or null.
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param contentHandler The element processor for this element.
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param classObject The class of the object that this element def should produce.
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param has_required true if this element has required elements by the XSLT specification.
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param required true if this element is required by the XSLT specification.
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param order the order this element should appear according to the XSLT specification.
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param multiAllowed whether this element is allowed more than once
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XSLTElementDef(XSLTSchema schema, String namespace, String name, String nameAlias,
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XSLTElementDef[] elements, XSLTAttributeDef[] attributes,
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XSLTElementProcessor contentHandler, Class classObject,
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson								 boolean has_required, boolean required, int order,
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson								 boolean multiAllowed)
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		this(schema, namespace, name,  nameAlias,
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 elements, attributes,
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 contentHandler, classObject, has_required, required);
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		this.m_order = order;
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		this.m_multiAllowed = multiAllowed;
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an instance of XSLTElementDef.
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespace  The Namespace URI, "*", or null.
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The local name (without prefix), "*", or null.
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nameAlias A potential alias for the name, or null.
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elements An array of allowed child element defs, or null.
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param attributes An array of allowed attribute defs, or null.
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param contentHandler The element processor for this element.
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param classObject The class of the object that this element def should produce.
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param has_required true if this element has required elements by the XSLT specification.
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param required true if this element is required by the XSLT specification.
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param has_order whether this element has ordered child elements
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param order the order this element should appear according to the XSLT specification.
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param multiAllowed whether this element is allowed more than once
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XSLTElementDef(XSLTSchema schema, String namespace, String name, String nameAlias,
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XSLTElementDef[] elements, XSLTAttributeDef[] attributes,
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XSLTElementProcessor contentHandler, Class classObject,
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson								 boolean has_required, boolean required, boolean has_order, int order,
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson								 boolean multiAllowed)
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		this(schema, namespace, name,  nameAlias,
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 elements, attributes,
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 contentHandler, classObject, has_required, required);
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		this.m_order = order;
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		this.m_multiAllowed = multiAllowed;
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.m_isOrdered = has_order;
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an instance of XSLTElementDef.
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespace  The Namespace URI, "*", or null.
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The local name (without prefix), "*", or null.
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nameAlias A potential alias for the name, or null.
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elements An array of allowed child element defs, or null.
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param attributes An array of allowed attribute defs, or null.
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param contentHandler The element processor for this element.
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param classObject The class of the object that this element def should produce.
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param has_order whether this element has ordered child elements
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param order the order this element should appear according to the XSLT specification.
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param multiAllowed whether this element is allowed more than once
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XSLTElementDef(XSLTSchema schema, String namespace, String name, String nameAlias,
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XSLTElementDef[] elements, XSLTAttributeDef[] attributes,
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XSLTElementProcessor contentHandler, Class classObject,
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson								 boolean has_order, int order, boolean multiAllowed)
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this(schema, namespace, name,  nameAlias,
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 elements, attributes,
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 contentHandler, classObject,
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson								 order, multiAllowed);
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		this.m_isOrdered = has_order;
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an instance of XSLTElementDef.
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespace  The Namespace URI, "*", or null.
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The local name (without prefix), "*", or null.
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nameAlias A potential alias for the name, or null.
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elements An array of allowed child element defs, or null.
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param attributes An array of allowed attribute defs, or null.
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param contentHandler The element processor for this element.
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param classObject The class of the object that this element def should produce.
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param order the order this element should appear according to the XSLT specification.
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param multiAllowed whether this element is allowed more than once
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XSLTElementDef(XSLTSchema schema, String namespace, String name, String nameAlias,
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XSLTElementDef[] elements, XSLTAttributeDef[] attributes,
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XSLTElementProcessor contentHandler, Class classObject,
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson								 int order, boolean multiAllowed)
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this(schema, namespace, name, nameAlias, elements, attributes, contentHandler,
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          classObject);
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.m_order = order;
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		this.m_multiAllowed = multiAllowed;
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an instance of XSLTElementDef that represents text.
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param classObject The class of the object that this element def should produce.
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param contentHandler The element processor for this element.
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param type Content type, one of T_ELEMENT, T_PCDATA, or T_ANY.
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XSLTElementDef(Class classObject, XSLTElementProcessor contentHandler,
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 int type)
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.m_classObject = classObject;
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.m_type = type;
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    setElementProcessor(contentHandler);
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an instance of XSLTElementDef.
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespace  The Namespace URI, "*", or null.
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The local name (without prefix), "*", or null.
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nameAlias A potential alias for the name, or null.
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elements An array of allowed child element defs, or null.
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param attributes An array of allowed attribute defs, or null.
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param contentHandler The element processor for this element.
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param classObject The class of the object that this element def should produce.
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void build(String namespace, String name, String nameAlias,
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             XSLTElementDef[] elements, XSLTAttributeDef[] attributes,
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             XSLTElementProcessor contentHandler, Class classObject)
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.m_namespace = namespace;
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.m_name = name;
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.m_nameAlias = nameAlias;
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.m_elements = elements;
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.m_attributes = attributes;
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    setElementProcessor(contentHandler);
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.m_classObject = classObject;
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		if (hasRequired() && m_elements != null)
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		{
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			int n = m_elements.length;
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			for (int i = 0; i < n; i++)
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			{
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				XSLTElementDef def = m_elements[i];
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				if (def != null && def.getRequired())
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				{
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson					if (m_requiredFound == null)
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson						m_requiredFound = new Hashtable();
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson					m_requiredFound.put(def.getName(), "xsl:" +def.getName());
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				}
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			}
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		}
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if two objects are equal, when either one may be null.
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If both are null, they are considered equal.
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj1 A reference to the first object, or null.
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj2 A reference to the second object, or null.
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if the to objects are equal by both being null or
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * because obj2.equals(obj1) returns true.
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static boolean equalsMayBeNull(Object obj1, Object obj2)
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (obj2 == obj1)
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           || ((null != obj1) && (null != obj2) && obj2.equals(obj1));
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if the two string refs are equal,
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * equality being defined as:
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * 1) Both strings are null.
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * 2) One string is null and the other is empty.
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * 3) Both strings are non-null, and equal.
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s1 A reference to the first string, or null.
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s2 A reference to the second string, or null.
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if Both strings are null, or if
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * one string is null and the other is empty, or if
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * both strings are non-null, and equal because
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * s1.equals(s2) returns true.
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static boolean equalsMayBeNullOrZeroLen(String s1, String s2)
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int len1 = (s1 == null) ? 0 : s1.length();
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int len2 = (s2 == null) ? 0 : s2.length();
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (len1 != len2) ? false
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson						 : (len1 == 0) ? true
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson								 : s1.equals(s2);
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Content type enumerations    */
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  static final int T_ELEMENT = 1, T_PCDATA = 2, T_ANY = 3;
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The type of this element.
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private int m_type = T_ELEMENT;
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the type of this element.
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Content type, one of T_ELEMENT, T_PCDATA, or T_ANY.
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  int getType()
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_type;
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the type of this element.
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param t Content type, one of T_ELEMENT, T_PCDATA, or T_ANY.
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void setType(int t)
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_type = t;
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The allowed namespace for this element.
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private String m_namespace;
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the allowed namespace for this element.
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The Namespace URI, "*", or null.
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  String getNamespace()
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_namespace;
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The name of this element.
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private String m_name;
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the local name of this element.
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The local name of this element, "*", or null.
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  String getName()
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_name;
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The name of this element.
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private String m_nameAlias;
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the name of this element.
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A potential alias for the name, or null.
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  String getNameAlias()
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_nameAlias;
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The allowed elements for this type.
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private XSLTElementDef[] m_elements;
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the allowed elements for this type.
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return An array of allowed child element defs, or null.
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage internal
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XSLTElementDef[] getElements()
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_elements;
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the allowed elements for this type.
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param defs An array of allowed child element defs, or null.
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void setElements(XSLTElementDef[] defs)
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_elements = defs;
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if the namespace URI and local name match this
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * element.
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param uri The namespace uri, which may be null.
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param localName The local name of an element, which may be null.
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if the uri and local name arguments are considered
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to match the uri and local name of this element def.
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean QNameEquals(String uri, String localName)
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (equalsMayBeNullOrZeroLen(m_namespace, uri)
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            && (equalsMayBeNullOrZeroLen(m_name, localName)
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                || equalsMayBeNullOrZeroLen(m_nameAlias, localName)));
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a namespace URI, and a local name, get the processor
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for the element, or return null if not allowed.
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param uri The Namespace URI, or an empty string.
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param localName The local name (without prefix), or empty string if not namespace processing.
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The element processor that matches the arguments, or null.
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XSLTElementProcessor getProcessorFor(String uri, String localName)
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	{
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XSLTElementProcessor elemDef = null;  // return value
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_elements)
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return null;
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int n = m_elements.length;
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int order = -1;
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		boolean multiAllowed = true;
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < n; i++)
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      XSLTElementDef def = m_elements[i];
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // A "*" signals that the element allows literal result
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // elements, so just assign the def, and continue to
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // see if anything else matches.
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (def.m_name.equals("*"))
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Don't allow xsl elements
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (!equalsMayBeNullOrZeroLen(uri, Constants.S_XSLNAMESPACEURL))
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				{
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          elemDef = def.m_elementProcessor;
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				  order = def.getOrder();
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson					multiAllowed = def.getMultiAllowed();
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				}
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			else if (def.QNameEquals(uri, localName))
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			{
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				if (def.getRequired())
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson					this.setRequiredFound(def.getName(), true);
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				order = def.getOrder();
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				multiAllowed = def.getMultiAllowed();
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				elemDef = def.m_elementProcessor;
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				break;
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			}
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		}
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		if (elemDef != null && this.isOrdered())
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		{
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			int lastOrder = getLastOrder();
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			if (order > lastOrder)
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				setLastOrder(order);
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			else if (order == lastOrder && !multiAllowed)
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			{
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				return null;
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			}
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			else if (order < lastOrder && order > 0)
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			{
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				return null;
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			}
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		}
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return elemDef;
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given an unknown element, get the processor
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for the element.
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param uri The Namespace URI, or an empty string.
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param localName The local name (without prefix), or empty string if not namespace processing.
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return normally a {@link ProcessorUnknown} reference.
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see ProcessorUnknown
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XSLTElementProcessor getProcessorForUnknown(String uri, String localName)
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // XSLTElementProcessor lreDef = null; // return value
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_elements)
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return null;
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int n = m_elements.length;
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < n; i++)
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      XSLTElementDef def = m_elements[i];
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (def.m_name.equals("unknown") && uri.length() > 0)
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return def.m_elementProcessor;
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The allowed attributes for this type.
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private XSLTAttributeDef[] m_attributes;
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the allowed attributes for this type.
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return An array of allowed attribute defs, or null.
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XSLTAttributeDef[] getAttributes()
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_attributes;
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a namespace URI, and a local name, return the element's
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * attribute definition, if it has one.
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param uri The Namespace URI, or an empty string.
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param localName The local name (without prefix), or empty string if not namespace processing.
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The attribute def that matches the arguments, or null.
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XSLTAttributeDef getAttributeDef(String uri, String localName)
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XSLTAttributeDef defaultDef = null;
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XSLTAttributeDef[] attrDefs = getAttributes();
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nAttrDefs = attrDefs.length;
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int k = 0; k < nAttrDefs; k++)
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      XSLTAttributeDef attrDef = attrDefs[k];
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String uriDef = attrDef.getNamespace();
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String nameDef = attrDef.getName();
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (nameDef.equals("*") && (equalsMayBeNullOrZeroLen(uri, uriDef) ||
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          (uriDef != null && uriDef.equals("*") && uri!=null && uri.length() > 0 )))
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return attrDef;
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (nameDef.equals("*") && (uriDef == null))
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // In this case, all attributes are legal, so return
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // this as the last resort.
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        defaultDef = attrDef;
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (equalsMayBeNullOrZeroLen(uri, uriDef)
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson               && localName.equals(nameDef))
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return attrDef;
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == defaultDef)
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (uri.length() > 0 && !equalsMayBeNullOrZeroLen(uri, Constants.S_XSLNAMESPACEURL))
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return XSLTAttributeDef.m_foreignAttr;
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return defaultDef;
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If non-null, the ContentHandler/TransformerFactory for this element.
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private XSLTElementProcessor m_elementProcessor;
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the XSLTElementProcessor for this element.
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The element processor for this element.
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage internal
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XSLTElementProcessor getElementProcessor()
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_elementProcessor;
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the XSLTElementProcessor for this element.
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param handler The element processor for this element.
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage internal
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setElementProcessor(XSLTElementProcessor handler)
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (handler != null)
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_elementProcessor = handler;
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_elementProcessor.setElemDef(this);
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If non-null, the class object that should in instantiated for
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a Xalan instance of this element.
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private Class m_classObject;
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the class object that should in instantiated for
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a Xalan instance of this element.
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The class of the object that this element def should produce, or null.
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  Class getClassObject()
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_classObject;
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If true, this has a required element.
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_has_required = false;
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get whether or not this has a required element.
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if this this has a required element.
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean hasRequired()
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_has_required;
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If true, this is a required element.
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_required = false;
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get whether or not this is a required element.
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if this is a required element.
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean getRequired()
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_required;
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	Hashtable m_requiredFound;
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set this required element found.
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void setRequiredFound(String elem, boolean found)
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   if (m_requiredFound.get(elem) != null)
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		 m_requiredFound.remove(elem);
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get whether all required elements were found.
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if all required elements were found.
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean getRequiredFound()
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		if (m_requiredFound == null)
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			return true;
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_requiredFound.isEmpty();
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get required elements that were not found.
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return required elements that were not found.
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  String getRequiredElem()
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		if (m_requiredFound == null)
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			return null;
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		Enumeration elems = m_requiredFound.elements();
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		String s = "";
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		boolean first = true;
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		while (elems.hasMoreElements())
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		{
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			if (first)
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				first = false;
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			else
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			 s = s + ", ";
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			s = s + (String)elems.nextElement();
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		}
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return s;
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	boolean m_isOrdered = false;
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get whether this element requires ordered children.
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if this element requires ordered children.
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean isOrdered()
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		/*if (!m_CheckedOrdered)
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		{
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			m_CheckedOrdered = true;
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			m_isOrdered = false;
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			if (null == m_elements)
7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				return false;
7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			int n = m_elements.length;
7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			for (int i = 0; i < n; i++)
7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			{
7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				if (m_elements[i].getOrder() > 0)
7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				{
7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson					m_isOrdered = true;
7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson					return true;
7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				}
7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			}
7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			return false;
7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		}
7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		else*/
7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			return m_isOrdered;
7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the order that this element should appear, or -1 if not ordered
7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private int m_order = -1;
7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the order that this element should appear .
7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the order that this element should appear.
7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  int getOrder()
7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_order;
7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the highest order of child elements have appeared so far,
7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or -1 if not ordered
7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private int m_lastOrder = -1;
7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the highest order of child elements have appeared so far .
8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the highest order of child elements have appeared so far.
8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  int getLastOrder()
8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_lastOrder;
8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the highest order of child elements have appeared so far .
8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param order the highest order of child elements have appeared so far.
8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void setLastOrder(int order)
8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_lastOrder = order ;
8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * True if this element can appear multiple times
8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_multiAllowed = true;
8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get whether this element can appear multiple times
8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if this element can appear multiple times
8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean getMultiAllowed()
8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_multiAllowed;
8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
834