1 /*
2  * reserved comment block
3  * DO NOT REMOVE OR ALTER!
4  */
5 /*
6  * Copyright 2001-2004 The Apache Software Foundation.
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20 
21 package com.sun.org.apache.xerces.internal.impl.xs.traversers;
22 
23 import com.sun.org.apache.xerces.internal.impl.xs.SchemaGrammar;
24 import com.sun.org.apache.xerces.internal.impl.xs.SchemaSymbols;
25 import com.sun.org.apache.xerces.internal.impl.xs.XSAnnotationImpl;
26 import com.sun.org.apache.xerces.internal.impl.xs.XSParticleDecl;
27 import com.sun.org.apache.xerces.internal.impl.xs.XSWildcardDecl;
28 import com.sun.org.apache.xerces.internal.impl.xs.util.XInt;
29 import com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl;
30 import com.sun.org.apache.xerces.internal.util.DOMUtil;
31 import com.sun.org.apache.xerces.internal.xs.XSObjectList;
32 import org.w3c.dom.Element;
33 
34 /**
35  * The wildcard schema component traverser.
36  *
37  * <any
38  *   id = ID
39  *   maxOccurs = (nonNegativeInteger | unbounded)  : 1
40  *   minOccurs = nonNegativeInteger : 1
41  *   namespace = ((##any | ##other) | List of (anyURI | (##targetNamespace | ##local)) )  : ##any
42  *   processContents = (lax | skip | strict) : strict
43  *   {any attributes with non-schema namespace . . .}>
44  *   Content: (annotation?)
45  * </any>
46  *
47  * <anyAttribute
48  *   id = ID
49  *   namespace = ((##any | ##other) | List of (anyURI | (##targetNamespace | ##local)) )  : ##any
50  *   processContents = (lax | skip | strict) : strict
51  *   {any attributes with non-schema namespace . . .}>
52  *   Content: (annotation?)
53  * </anyAttribute>
54  *
55  * @xerces.internal
56  *
57  * @author Rahul Srivastava, Sun Microsystems Inc.
58  * @author Sandy Gao, IBM
59  *
60  * @version $Id: XSDWildcardTraverser.java,v 1.7 2010-11-01 04:40:02 joehw Exp $
61  */
62 class XSDWildcardTraverser extends XSDAbstractTraverser {
63 
64     /**
65      * constructor
66      *
67      * @param  handler
68      * @param  errorReporter
69      * @param  gAttrCheck
70      */
XSDWildcardTraverser(XSDHandler handler, XSAttributeChecker gAttrCheck)71     XSDWildcardTraverser (XSDHandler handler,
72             XSAttributeChecker gAttrCheck) {
73         super(handler, gAttrCheck);
74     }
75 
76 
77     /**
78      * Traverse <any>
79      *
80      * @param  elmNode
81      * @param  schemaDoc
82      * @param  grammar
83      * @return the wildcard node index
84      */
traverseAny(Element elmNode, XSDocumentInfo schemaDoc, SchemaGrammar grammar)85     XSParticleDecl traverseAny(Element elmNode,
86             XSDocumentInfo schemaDoc,
87             SchemaGrammar grammar) {
88 
89         // General Attribute Checking for elmNode
90         Object[] attrValues = fAttrChecker.checkAttributes(elmNode, false, schemaDoc);
91         XSWildcardDecl wildcard = traverseWildcardDecl(elmNode, attrValues, schemaDoc, grammar);
92 
93         // for <any>, need to create a new particle to reflect the min/max values
94         XSParticleDecl particle = null;
95         if (wildcard != null) {
96             int min = ((XInt)attrValues[XSAttributeChecker.ATTIDX_MINOCCURS]).intValue();
97             int max = ((XInt)attrValues[XSAttributeChecker.ATTIDX_MAXOCCURS]).intValue();
98             if (max != 0) {
99                 if (fSchemaHandler.fDeclPool !=null) {
100                     particle = fSchemaHandler.fDeclPool.getParticleDecl();
101                 } else {
102                     particle = new XSParticleDecl();
103                 }
104                 particle.fType = XSParticleDecl.PARTICLE_WILDCARD;
105                 particle.fValue = wildcard;
106                 particle.fMinOccurs = min;
107                 particle.fMaxOccurs = max;
108                 particle.fAnnotations = wildcard.fAnnotations;
109             }
110         }
111 
112         fAttrChecker.returnAttrArray(attrValues, schemaDoc);
113 
114         return particle;
115     }
116 
117 
118     /**
119      * Traverse &lt;anyAttribute&gt;
120      *
121      * @param  elmNode
122      * @param  schemaDoc
123      * @param  grammar
124      * @return the wildcard node index
125      */
traverseAnyAttribute(Element elmNode, XSDocumentInfo schemaDoc, SchemaGrammar grammar)126     XSWildcardDecl traverseAnyAttribute(Element elmNode,
127             XSDocumentInfo schemaDoc,
128             SchemaGrammar grammar) {
129 
130         // General Attribute Checking for elmNode
131         Object[] attrValues = fAttrChecker.checkAttributes(elmNode, false, schemaDoc);
132         XSWildcardDecl wildcard = traverseWildcardDecl(elmNode, attrValues, schemaDoc, grammar);
133         fAttrChecker.returnAttrArray(attrValues, schemaDoc);
134 
135         return wildcard;
136     }
137 
138 
139     /**
140      *
141      * @param  elmNode
142      * @param  attrValues
143      * @param  schemaDoc
144      * @param  grammar
145      * @return the wildcard node index
146      */
traverseWildcardDecl(Element elmNode, Object[] attrValues, XSDocumentInfo schemaDoc, SchemaGrammar grammar)147     XSWildcardDecl traverseWildcardDecl(Element elmNode,
148             Object[] attrValues,
149             XSDocumentInfo schemaDoc,
150             SchemaGrammar grammar) {
151 
152         //get all attributes
153         XSWildcardDecl wildcard = new XSWildcardDecl();
154         // namespace type
155         XInt namespaceTypeAttr = (XInt) attrValues[XSAttributeChecker.ATTIDX_NAMESPACE];
156         wildcard.fType = namespaceTypeAttr.shortValue();
157         // namespace list
158         wildcard.fNamespaceList = (String[])attrValues[XSAttributeChecker.ATTIDX_NAMESPACE_LIST];
159         // process contents
160         XInt processContentsAttr = (XInt) attrValues[XSAttributeChecker.ATTIDX_PROCESSCONTENTS];
161         wildcard.fProcessContents = processContentsAttr.shortValue();
162 
163         //check content
164         Element child = DOMUtil.getFirstChildElement(elmNode);
165         XSAnnotationImpl annotation = null;
166         if (child != null)
167         {
168             if (DOMUtil.getLocalName(child).equals(SchemaSymbols.ELT_ANNOTATION)) {
169                 annotation = traverseAnnotationDecl(child, attrValues, false, schemaDoc);
170                 child = DOMUtil.getNextSiblingElement(child);
171             }
172             else {
173                 String text = DOMUtil.getSyntheticAnnotation(elmNode);
174                 if (text != null) {
175                     annotation = traverseSyntheticAnnotation(elmNode, text, attrValues, false, schemaDoc);
176                 }
177             }
178 
179             if (child != null) {
180                 reportSchemaError("s4s-elt-must-match.1", new Object[]{"wildcard", "(annotation?)", DOMUtil.getLocalName(child)}, elmNode);
181             }
182         }
183         else {
184             String text = DOMUtil.getSyntheticAnnotation(elmNode);
185             if (text != null) {
186                 annotation = traverseSyntheticAnnotation(elmNode, text, attrValues, false, schemaDoc);
187             }
188         }
189         XSObjectList annotations;
190         if (annotation != null) {
191             annotations = new XSObjectListImpl();
192             ((XSObjectListImpl) annotations).addXSObject(annotation);
193         } else {
194             annotations = XSObjectListImpl.EMPTY_LIST;
195         }
196         wildcard.fAnnotations = annotations;
197 
198         return wildcard;
199 
200     } // traverseWildcardDecl
201 
202 } // XSDWildcardTraverser
203