xsdelementtraverser.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 509 行 · 第 1/2 页

JAVA
509
字号
/* * The Apache Software License, Version 1.1 * * * Copyright (c) 2001-2004 The Apache Software Foundation.  All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * 3. The end-user documentation included with the redistribution, *    if any, must include the following acknowledgment: *       "This product includes software developed by the *        Apache Software Foundation (http://www.apache.org/)." *    Alternately, this acknowledgment may appear in the software itself, *    if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xerces" and "Apache Software Foundation" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written *    permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", *    nor may "Apache" appear in their name, without prior written *    permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 2001, International * Business Machines, Inc., http://www.apache.org.  For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */package com.sun.org.apache.xerces.internal.impl.xs.traversers;import com.sun.org.apache.xerces.internal.impl.dv.ValidatedInfo;import com.sun.org.apache.xerces.internal.impl.dv.XSSimpleType;import com.sun.org.apache.xerces.internal.impl.xs.SchemaGrammar;import com.sun.org.apache.xerces.internal.impl.xs.SchemaSymbols;import com.sun.org.apache.xerces.internal.impl.xs.XSAnnotationImpl;import com.sun.org.apache.xerces.internal.impl.xs.XSComplexTypeDecl;import com.sun.org.apache.xerces.internal.impl.xs.XSConstraints;import com.sun.org.apache.xerces.internal.impl.xs.XSElementDecl;import com.sun.org.apache.xerces.internal.impl.xs.XSParticleDecl;import com.sun.org.apache.xerces.internal.xs.XSConstants;import com.sun.org.apache.xerces.internal.xs.XSObject;import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition;import com.sun.org.apache.xerces.internal.impl.xs.util.XInt;import com.sun.org.apache.xerces.internal.util.DOMUtil;import com.sun.org.apache.xerces.internal.util.SymbolTable;import com.sun.org.apache.xerces.internal.xni.QName;import org.w3c.dom.Element;import org.w3c.dom.Attr;/** * The element declaration schema component traverser. * <element *   abstract = boolean : false *   block = (#all | List of (extension | restriction | substitution)) *   default = string *   final = (#all | List of (extension | restriction)) *   fixed = string *   form = (qualified | unqualified) *   id = ID *   maxOccurs = (nonNegativeInteger | unbounded)  : 1 *   minOccurs = nonNegativeInteger : 1 *   name = NCName *   nillable = boolean : false *   ref = QName *   substitutionGroup = QName *   type = QName *   {any attributes with non-schema namespace . . .}> *   Content: (annotation?, ((simpleType | complexType)?, (unique | key | keyref)*)) * </element> * * @author Sandy Gao, IBM * * @version $Id: XSDElementTraverser.java,v 1.29 2004/02/03 17:27:45 sandygao Exp $ */class XSDElementTraverser extends XSDAbstractTraverser {    protected final XSElementDecl  fTempElementDecl  = new XSElementDecl();    // this controls what happens when a local element is encountered.    // We may not encounter all local elements when first parsing.    boolean fDeferTraversingLocalElements;    XSDElementTraverser (XSDHandler handler,                         XSAttributeChecker gAttrCheck) {        super(handler, gAttrCheck);    }    /**     * Traverse a locally declared element (or an element reference).     *     * To handle the recursive cases efficiently, we delay the traversal     * and return an empty particle node. We'll fill in this particle node     * later after we've done with all the global declarations.     * This method causes a number of data structures in the schema handler to be filled in.     *     * @param  elmDecl     * @param  schemaDoc     * @param  grammar     * @return the particle     */    XSParticleDecl traverseLocal(Element elmDecl,                                 XSDocumentInfo schemaDoc,                                 SchemaGrammar grammar,                                 int allContextFlags,                                 XSObject parent) {        XSParticleDecl particle = null;        if (fSchemaHandler.fDeclPool !=null) {            particle = fSchemaHandler.fDeclPool.getParticleDecl();        } else {            particle = new XSParticleDecl();        }        if(fDeferTraversingLocalElements) {            // The only thing we care about now is whether this element has            // minOccurs=0. This affects (if the element appears in a complex            // type) whether a type has emptiable content.            particle.fType = XSParticleDecl.PARTICLE_ELEMENT;            Attr attr = elmDecl.getAttributeNode(SchemaSymbols.ATT_MINOCCURS);            if (attr != null) {                String min = attr.getValue();                try {                    int m = Integer.parseInt(min.trim());                    if (m >= 0)                        particle.fMinOccurs = m;                }                catch (NumberFormatException ex) {                }            }            fSchemaHandler.fillInLocalElemInfo(elmDecl, schemaDoc, allContextFlags, parent, particle);        } else {            traverseLocal(particle, elmDecl, schemaDoc, grammar, allContextFlags, parent);            // If it's an empty particle, return null.            if (particle.fType == XSParticleDecl.PARTICLE_EMPTY)                particle = null;        }        return particle;    }    /**     * Traverse a locally declared element (or an element reference).     *     * This is the real traversal method. It's called after we've done with     * all the global declarations.     *     * @param  index     */    protected void traverseLocal(XSParticleDecl particle,                                 Element elmDecl,                                 XSDocumentInfo schemaDoc,                                 SchemaGrammar grammar,                                 int allContextFlags,                                 XSObject parent) {        // General Attribute Checking        Object[] attrValues = fAttrChecker.checkAttributes(elmDecl, false, schemaDoc);        QName refAtt = (QName) attrValues[XSAttributeChecker.ATTIDX_REF];        XInt  minAtt = (XInt)  attrValues[XSAttributeChecker.ATTIDX_MINOCCURS];        XInt  maxAtt = (XInt)  attrValues[XSAttributeChecker.ATTIDX_MAXOCCURS];        XSElementDecl element = null;        if (elmDecl.getAttributeNode(SchemaSymbols.ATT_REF) != null) {            if (refAtt != null) {                element = (XSElementDecl)fSchemaHandler.getGlobalDecl(schemaDoc, XSDHandler.ELEMENT_TYPE, refAtt, elmDecl);                Element child = DOMUtil.getFirstChildElement(elmDecl);                if (child != null && DOMUtil.getLocalName(child).equals(SchemaSymbols.ELT_ANNOTATION)) {                    // REVISIT:  put this somewhere                    traverseAnnotationDecl(child, attrValues, false, schemaDoc);                    child = DOMUtil.getNextSiblingElement(child);                }                // Element Declaration Representation OK                // 2 If the item's parent is not <schema>, then all of the following must be true:                // 2.1 One of ref or name must be present, but not both.                // 2.2 If ref is present, then all of <complexType>, <simpleType>, <key>, <keyref>, <unique>, nillable, default, fixed, form, block and type must be absent, i.e. only minOccurs, maxOccurs, id are allowed in addition to ref, along with <annotation>.                if (child != null) {                    reportSchemaError("src-element.2.2", new Object[]{refAtt.rawname, DOMUtil.getLocalName(child)}, child);                }            } else {                element = null;            }        } else {            element = traverseNamedElement(elmDecl, attrValues, schemaDoc, grammar, false, parent);        }        particle.fMinOccurs = minAtt.intValue();        particle.fMaxOccurs = maxAtt.intValue();        if (element != null) {            particle.fType = XSParticleDecl.PARTICLE_ELEMENT;            particle.fValue = element;        }        else {            particle.fType = XSParticleDecl.PARTICLE_EMPTY;        }        Long defaultVals = (Long)attrValues[XSAttributeChecker.ATTIDX_FROMDEFAULT];        checkOccurrences(particle, SchemaSymbols.ELT_ELEMENT,                         (Element)elmDecl.getParentNode(), allContextFlags,                         defaultVals.longValue());        fAttrChecker.returnAttrArray(attrValues, schemaDoc);    }    /**     * Traverse a globally declared element.     *     * @param  elmDecl     * @param  schemaDoc     * @param  grammar     * @return the element declaration     */    XSElementDecl traverseGlobal(Element elmDecl,                                 XSDocumentInfo schemaDoc,                                 SchemaGrammar grammar) {        // General Attribute Checking        Object[] attrValues = fAttrChecker.checkAttributes(elmDecl, true, schemaDoc);        XSElementDecl element = traverseNamedElement(elmDecl, attrValues, schemaDoc, grammar, true, null);        fAttrChecker.returnAttrArray(attrValues, schemaDoc);        return element;    }    /**     * Traverse a globally declared element.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?