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 + -
显示快捷键?