author | joehw |
Wed, 18 Oct 2017 13:25:49 -0700 | |
changeset 47359 | e1a6c0168741 |
parent 47216 | 71c04702a3d5 |
child 47712 | bde0215f1f70 |
permissions | -rw-r--r-- |
12005 | 1 |
/* |
47359
e1a6c0168741
8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents:
47216
diff
changeset
|
2 |
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. |
e1a6c0168741
8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents:
47216
diff
changeset
|
3 |
* @LastModified: Oct 2017 |
12005 | 4 |
*/ |
5 |
/* |
|
27111
7a491d709b83
8036951: Xerces Update: XMLSchemaValidator.java and XMLSchemaLoader.java
joehw
parents:
25868
diff
changeset
|
6 |
* Licensed to the Apache Software Foundation (ASF) under one or more |
7a491d709b83
8036951: Xerces Update: XMLSchemaValidator.java and XMLSchemaLoader.java
joehw
parents:
25868
diff
changeset
|
7 |
* contributor license agreements. See the NOTICE file distributed with |
7a491d709b83
8036951: Xerces Update: XMLSchemaValidator.java and XMLSchemaLoader.java
joehw
parents:
25868
diff
changeset
|
8 |
* this work for additional information regarding copyright ownership. |
7a491d709b83
8036951: Xerces Update: XMLSchemaValidator.java and XMLSchemaLoader.java
joehw
parents:
25868
diff
changeset
|
9 |
* The ASF licenses this file to You under the Apache License, Version 2.0 |
7a491d709b83
8036951: Xerces Update: XMLSchemaValidator.java and XMLSchemaLoader.java
joehw
parents:
25868
diff
changeset
|
10 |
* (the "License"); you may not use this file except in compliance with |
7a491d709b83
8036951: Xerces Update: XMLSchemaValidator.java and XMLSchemaLoader.java
joehw
parents:
25868
diff
changeset
|
11 |
* the License. You may obtain a copy of the License at |
12005 | 12 |
* |
13 |
* http://www.apache.org/licenses/LICENSE-2.0 |
|
14 |
* |
|
15 |
* Unless required by applicable law or agreed to in writing, software |
|
16 |
* distributed under the License is distributed on an "AS IS" BASIS, |
|
17 |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
18 |
* See the License for the specific language governing permissions and |
|
19 |
* limitations under the License. |
|
20 |
*/ |
|
21 |
||
22 |
package com.sun.org.apache.xerces.internal.impl.xs.traversers; |
|
23 |
||
24 |
import com.sun.org.apache.xerces.internal.impl.dv.InvalidDatatypeFacetException; |
|
25 |
import com.sun.org.apache.xerces.internal.impl.dv.XSSimpleType; |
|
26 |
import com.sun.org.apache.xerces.internal.impl.dv.xs.XSSimpleTypeDecl; |
|
27 |
import com.sun.org.apache.xerces.internal.impl.xs.SchemaGrammar; |
|
28 |
import com.sun.org.apache.xerces.internal.impl.xs.SchemaSymbols; |
|
29 |
import com.sun.org.apache.xerces.internal.impl.xs.XSAnnotationImpl; |
|
30 |
import com.sun.org.apache.xerces.internal.impl.xs.util.XInt; |
|
31 |
import com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl; |
|
32 |
import com.sun.org.apache.xerces.internal.util.DOMUtil; |
|
33 |
import com.sun.org.apache.xerces.internal.xni.QName; |
|
34 |
import com.sun.org.apache.xerces.internal.xs.XSConstants; |
|
47359
e1a6c0168741
8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents:
47216
diff
changeset
|
35 |
import com.sun.org.apache.xerces.internal.xs.XSObject; |
12005 | 36 |
import com.sun.org.apache.xerces.internal.xs.XSObjectList; |
37 |
import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition; |
|
47359
e1a6c0168741
8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents:
47216
diff
changeset
|
38 |
import java.util.ArrayList; |
e1a6c0168741
8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents:
47216
diff
changeset
|
39 |
import java.util.List; |
12005 | 40 |
import org.w3c.dom.Element; |
41 |
||
42 |
/** |
|
43 |
* The simple type definition schema component traverser. |
|
44 |
* |
|
45 |
* <simpleType |
|
46 |
* final = (#all | (list | union | restriction)) |
|
47 |
* id = ID |
|
48 |
* name = NCName |
|
49 |
* {any attributes with non-schema namespace . . .}> |
|
50 |
* Content: (annotation?, (restriction | list | union)) |
|
51 |
* </simpleType> |
|
52 |
* |
|
53 |
* <restriction |
|
54 |
* base = QName |
|
55 |
* id = ID |
|
56 |
* {any attributes with non-schema namespace . . .}> |
|
57 |
* Content: (annotation?, (simpleType?, (minExclusive | minInclusive | maxExclusive | maxInclusive | totalDigits | fractionDigits | length | minLength | maxLength | enumeration | whiteSpace | pattern)*)) |
|
58 |
* </restriction> |
|
59 |
* |
|
60 |
* <list |
|
61 |
* id = ID |
|
62 |
* itemType = QName |
|
63 |
* {any attributes with non-schema namespace . . .}> |
|
64 |
* Content: (annotation?, (simpleType?)) |
|
65 |
* </list> |
|
66 |
* |
|
67 |
* <union |
|
68 |
* id = ID |
|
69 |
* memberTypes = List of QName |
|
70 |
* {any attributes with non-schema namespace . . .}> |
|
71 |
* Content: (annotation?, (simpleType*)) |
|
72 |
* </union> |
|
73 |
* |
|
74 |
* @xerces.internal |
|
75 |
* |
|
76 |
* @author Elena Litani, IBM |
|
77 |
* @author Neeraj Bajaj, Sun Microsystems, Inc. |
|
78 |
* @author Sandy Gao, IBM |
|
79 |
* |
|
80 |
*/ |
|
81 |
class XSDSimpleTypeTraverser extends XSDAbstractTraverser { |
|
82 |
||
83 |
// whether the type being parsed is a S4S built-in type. |
|
84 |
private boolean fIsBuiltIn = false; |
|
85 |
||
86 |
XSDSimpleTypeTraverser (XSDHandler handler, |
|
87 |
XSAttributeChecker gAttrCheck) { |
|
88 |
super(handler, gAttrCheck); |
|
89 |
} |
|
90 |
||
91 |
//return qualified name of simpleType or empty string if error occured |
|
92 |
XSSimpleType traverseGlobal(Element elmNode, |
|
93 |
XSDocumentInfo schemaDoc, |
|
94 |
SchemaGrammar grammar) { |
|
95 |
||
96 |
// General Attribute Checking |
|
97 |
Object[] attrValues = fAttrChecker.checkAttributes(elmNode, true, schemaDoc); |
|
98 |
String nameAtt = (String)attrValues[XSAttributeChecker.ATTIDX_NAME]; |
|
99 |
if (nameAtt == null) { |
|
100 |
attrValues[XSAttributeChecker.ATTIDX_NAME] = NO_NAME; |
|
101 |
} |
|
102 |
XSSimpleType type = traverseSimpleTypeDecl(elmNode, attrValues, schemaDoc, grammar); |
|
103 |
fAttrChecker.returnAttrArray(attrValues, schemaDoc); |
|
104 |
||
105 |
// if it's a global type without a name, return null |
|
106 |
if (nameAtt == null) { |
|
107 |
reportSchemaError("s4s-att-must-appear", new Object[]{SchemaSymbols.ELT_SIMPLETYPE, SchemaSymbols.ATT_NAME}, elmNode); |
|
108 |
type = null; |
|
109 |
} |
|
110 |
||
111 |
// don't add global components without name to the grammar |
|
112 |
if (type != null) { |
|
113 |
if (grammar.getGlobalTypeDecl(type.getName()) == null) { |
|
114 |
grammar.addGlobalSimpleTypeDecl(type); |
|
115 |
} |
|
116 |
||
117 |
// also add it to extended map |
|
118 |
final String loc = fSchemaHandler.schemaDocument2SystemId(schemaDoc); |
|
119 |
final XSTypeDefinition type2 = grammar.getGlobalTypeDecl(type.getName(), loc); |
|
120 |
if (type2 == null) { |
|
121 |
grammar.addGlobalSimpleTypeDecl(type, loc); |
|
122 |
} |
|
123 |
||
124 |
// handle duplicates |
|
125 |
if (fSchemaHandler.fTolerateDuplicates) { |
|
126 |
if (type2 != null) { |
|
127 |
if (type2 instanceof XSSimpleType) { |
|
128 |
type = (XSSimpleType) type2; |
|
129 |
} |
|
130 |
} |
|
131 |
fSchemaHandler.addGlobalTypeDecl(type); |
|
132 |
} |
|
133 |
} |
|
134 |
||
135 |
return type; |
|
136 |
} |
|
137 |
||
138 |
XSSimpleType traverseLocal(Element elmNode, |
|
139 |
XSDocumentInfo schemaDoc, |
|
140 |
SchemaGrammar grammar) { |
|
141 |
||
142 |
// General Attribute Checking |
|
143 |
Object[] attrValues = fAttrChecker.checkAttributes(elmNode, false, schemaDoc); |
|
144 |
String name = genAnonTypeName(elmNode); |
|
145 |
XSSimpleType type = getSimpleType (name, elmNode, attrValues, schemaDoc, grammar); |
|
146 |
if (type instanceof XSSimpleTypeDecl) { |
|
147 |
((XSSimpleTypeDecl)type).setAnonymous(true); |
|
148 |
} |
|
149 |
fAttrChecker.returnAttrArray(attrValues, schemaDoc); |
|
150 |
||
151 |
return type; |
|
152 |
} |
|
153 |
||
154 |
private XSSimpleType traverseSimpleTypeDecl(Element simpleTypeDecl, |
|
155 |
Object[] attrValues, |
|
156 |
XSDocumentInfo schemaDoc, |
|
157 |
SchemaGrammar grammar) { |
|
158 |
||
159 |
// get name and final values |
|
160 |
String name = (String)attrValues[XSAttributeChecker.ATTIDX_NAME]; |
|
161 |
return getSimpleType(name, simpleTypeDecl, attrValues, schemaDoc, grammar); |
|
162 |
} |
|
163 |
||
164 |
/* |
|
165 |
* Generate a name for an anonymous type |
|
166 |
*/ |
|
167 |
private String genAnonTypeName(Element simpleTypeDecl) { |
|
168 |
||
169 |
// Generate a unique name for the anonymous type by concatenating together the |
|
170 |
// names of parent nodes |
|
171 |
// The name is quite good for debugging/error purposes, but we may want to |
|
172 |
// revisit how this is done for performance reasons (LM). |
|
173 |
StringBuffer typeName = new StringBuffer("#AnonType_"); |
|
174 |
Element node = DOMUtil.getParent(simpleTypeDecl); |
|
175 |
while (node != null && (node != DOMUtil.getRoot(DOMUtil.getDocument(node)))) { |
|
176 |
typeName.append(node.getAttribute(SchemaSymbols.ATT_NAME)); |
|
177 |
node = DOMUtil.getParent(node); |
|
178 |
} |
|
179 |
return typeName.toString(); |
|
180 |
} |
|
181 |
||
182 |
/** |
|
183 |
* @param name |
|
184 |
* @param simpleTypeDecl |
|
185 |
* @param attrValues |
|
186 |
* @param schemaDoc |
|
187 |
* @param grammar |
|
188 |
* @return |
|
189 |
*/ |
|
190 |
private XSSimpleType getSimpleType(String name, Element simpleTypeDecl, Object[] attrValues, XSDocumentInfo schemaDoc, SchemaGrammar grammar) { |
|
191 |
XInt finalAttr = (XInt)attrValues[XSAttributeChecker.ATTIDX_FINAL]; |
|
192 |
int finalProperty = finalAttr == null ? schemaDoc.fFinalDefault : finalAttr.intValue(); |
|
193 |
// annotation?,(list|restriction|union) |
|
194 |
Element child = DOMUtil.getFirstChildElement(simpleTypeDecl); |
|
195 |
XSAnnotationImpl [] annotations = null; |
|
196 |
if (child != null && DOMUtil.getLocalName(child).equals(SchemaSymbols.ELT_ANNOTATION)) { |
|
197 |
XSAnnotationImpl annotation = traverseAnnotationDecl(child, attrValues, false, schemaDoc); |
|
198 |
if (annotation != null) |
|
199 |
annotations = new XSAnnotationImpl [] {annotation}; |
|
200 |
child = DOMUtil.getNextSiblingElement(child); |
|
201 |
} |
|
202 |
else { |
|
203 |
String text = DOMUtil.getSyntheticAnnotation(simpleTypeDecl); |
|
204 |
if (text != null) { |
|
205 |
XSAnnotationImpl annotation = traverseSyntheticAnnotation(simpleTypeDecl, text, attrValues, false, schemaDoc); |
|
206 |
annotations = new XSAnnotationImpl[] {annotation}; |
|
207 |
} |
|
208 |
} |
|
209 |
// (list|restriction|union) |
|
210 |
if (child == null) { |
|
211 |
reportSchemaError("s4s-elt-must-match.2", new Object[]{SchemaSymbols.ELT_SIMPLETYPE, "(annotation?, (restriction | list | union))"}, simpleTypeDecl); |
|
212 |
return errorType(name, schemaDoc.fTargetNamespace, XSConstants.DERIVATION_RESTRICTION); |
|
213 |
} |
|
214 |
// derivation type: restriction/list/union |
|
215 |
String varietyProperty = DOMUtil.getLocalName(child); |
|
216 |
short refType = XSConstants.DERIVATION_RESTRICTION; |
|
217 |
boolean restriction = false, list = false, union = false; |
|
218 |
if (varietyProperty.equals(SchemaSymbols.ELT_RESTRICTION)) { |
|
219 |
refType = XSConstants.DERIVATION_RESTRICTION; |
|
220 |
restriction = true; |
|
221 |
} |
|
222 |
else if (varietyProperty.equals(SchemaSymbols.ELT_LIST)) { |
|
223 |
refType = XSConstants.DERIVATION_LIST; |
|
224 |
list = true; |
|
225 |
} |
|
226 |
else if (varietyProperty.equals(SchemaSymbols.ELT_UNION)) { |
|
227 |
refType = XSConstants.DERIVATION_UNION; |
|
228 |
union = true; |
|
229 |
} |
|
230 |
else { |
|
231 |
reportSchemaError("s4s-elt-must-match.1", new Object[]{SchemaSymbols.ELT_SIMPLETYPE, "(annotation?, (restriction | list | union))", varietyProperty}, simpleTypeDecl); |
|
232 |
return errorType(name, schemaDoc.fTargetNamespace, XSConstants.DERIVATION_RESTRICTION); |
|
233 |
} |
|
234 |
// nothing should follow this element |
|
235 |
Element nextChild = DOMUtil.getNextSiblingElement(child); |
|
236 |
if (nextChild != null) { |
|
237 |
reportSchemaError("s4s-elt-must-match.1", new Object[]{SchemaSymbols.ELT_SIMPLETYPE, "(annotation?, (restriction | list | union))", DOMUtil.getLocalName(nextChild)}, nextChild); |
|
238 |
} |
|
239 |
// General Attribute Checking: get base/item/member types |
|
240 |
Object[] contentAttrs = fAttrChecker.checkAttributes(child, false, schemaDoc); |
|
241 |
QName baseTypeName = (QName)contentAttrs[restriction ? |
|
242 |
XSAttributeChecker.ATTIDX_BASE : |
|
243 |
XSAttributeChecker.ATTIDX_ITEMTYPE]; |
|
47359
e1a6c0168741
8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents:
47216
diff
changeset
|
244 |
@SuppressWarnings("unchecked") |
e1a6c0168741
8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents:
47216
diff
changeset
|
245 |
List<QName> memberTypes = (ArrayList<QName>)contentAttrs[XSAttributeChecker.ATTIDX_MEMBERTYPES]; |
12005 | 246 |
//content = {annotation?,simpleType?...} |
247 |
Element content = DOMUtil.getFirstChildElement(child); |
|
248 |
//check content (annotation?, ...) |
|
249 |
if (content != null && DOMUtil.getLocalName(content).equals(SchemaSymbols.ELT_ANNOTATION)) { |
|
250 |
XSAnnotationImpl annotation = traverseAnnotationDecl(content, contentAttrs, false, schemaDoc); |
|
251 |
if (annotation != null ) { |
|
252 |
if(annotations == null) { |
|
253 |
annotations = new XSAnnotationImpl [] {annotation}; |
|
254 |
} |
|
255 |
else { |
|
256 |
XSAnnotationImpl [] tempArray = new XSAnnotationImpl[2]; |
|
257 |
tempArray[0] = annotations[0]; |
|
258 |
annotations = tempArray; |
|
259 |
annotations[1] = annotation; |
|
260 |
} |
|
261 |
} |
|
262 |
content = DOMUtil.getNextSiblingElement(content); |
|
263 |
} |
|
264 |
else { |
|
265 |
String text = DOMUtil.getSyntheticAnnotation(child); |
|
266 |
if (text != null) { |
|
267 |
XSAnnotationImpl annotation = traverseSyntheticAnnotation(child, text, contentAttrs, false, schemaDoc); |
|
268 |
if (annotations == null) { |
|
269 |
annotations = new XSAnnotationImpl [] {annotation}; |
|
270 |
} |
|
271 |
else { |
|
272 |
XSAnnotationImpl [] tempArray = new XSAnnotationImpl[2]; |
|
273 |
tempArray[0] = annotations[0]; |
|
274 |
annotations = tempArray; |
|
275 |
annotations[1] = annotation; |
|
276 |
} |
|
277 |
} |
|
278 |
} |
|
279 |
// get base type from "base" attribute |
|
280 |
XSSimpleType baseValidator = null; |
|
281 |
if ((restriction || list) && baseTypeName != null) { |
|
282 |
baseValidator = findDTValidator(child, name, baseTypeName, refType, schemaDoc); |
|
283 |
// if its the built-in type, return null from here |
|
284 |
if (baseValidator == null && fIsBuiltIn) { |
|
285 |
fIsBuiltIn = false; |
|
286 |
return null; |
|
287 |
} |
|
288 |
} |
|
289 |
// get types from "memberTypes" attribute |
|
47359
e1a6c0168741
8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents:
47216
diff
changeset
|
290 |
List<XSObject> dTValidators = null; |
12005 | 291 |
XSSimpleType dv = null; |
292 |
XSObjectList dvs; |
|
293 |
if (union && memberTypes != null && memberTypes.size() > 0) { |
|
294 |
int size = memberTypes.size(); |
|
47359
e1a6c0168741
8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents:
47216
diff
changeset
|
295 |
dTValidators = new ArrayList<>(size); |
12005 | 296 |
// for each qname in the list |
297 |
for (int i = 0; i < size; i++) { |
|
298 |
// get the type decl |
|
47359
e1a6c0168741
8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents:
47216
diff
changeset
|
299 |
dv = findDTValidator(child, name, (QName)memberTypes.get(i), |
12005 | 300 |
XSConstants.DERIVATION_UNION, schemaDoc); |
301 |
if (dv != null) { |
|
302 |
// if it's a union, expand it |
|
303 |
if (dv.getVariety() == XSSimpleType.VARIETY_UNION) { |
|
304 |
dvs = dv.getMemberTypes(); |
|
305 |
for (int j = 0; j < dvs.getLength(); j++) |
|
306 |
dTValidators.add(dvs.item(j)); |
|
307 |
} else { |
|
308 |
dTValidators.add(dv); |
|
309 |
} |
|
310 |
} |
|
311 |
} |
|
312 |
} |
|
313 |
||
314 |
// check if there is a child "simpleType" |
|
315 |
if (content != null && DOMUtil.getLocalName(content).equals(SchemaSymbols.ELT_SIMPLETYPE)) { |
|
316 |
if (restriction || list) { |
|
317 |
// it's an error for both "base" and "simpleType" to appear |
|
318 |
if (baseTypeName != null) { |
|
319 |
reportSchemaError(list ? "src-simple-type.3.a" : "src-simple-type.2.a", null, content); |
|
320 |
} |
|
321 |
if (baseValidator == null) { |
|
322 |
// traverse this child to get the base type |
|
323 |
baseValidator = traverseLocal(content, schemaDoc, grammar); |
|
324 |
} |
|
325 |
// get the next element |
|
326 |
content = DOMUtil.getNextSiblingElement(content); |
|
327 |
} |
|
328 |
else if (union) { |
|
329 |
if (dTValidators == null) { |
|
47359
e1a6c0168741
8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents:
47216
diff
changeset
|
330 |
dTValidators = new ArrayList<>(2); |
12005 | 331 |
} |
332 |
do { |
|
333 |
// traverse this child to get the member type |
|
334 |
dv = traverseLocal(content, schemaDoc, grammar); |
|
335 |
if (dv != null) { |
|
336 |
// if it's a union, expand it |
|
337 |
if (dv.getVariety() == XSSimpleType.VARIETY_UNION) { |
|
338 |
dvs = dv.getMemberTypes(); |
|
339 |
for (int j = 0; j < dvs.getLength(); j++) { |
|
340 |
dTValidators.add(dvs.item(j)); |
|
341 |
} |
|
342 |
} |
|
343 |
else { |
|
344 |
dTValidators.add(dv); |
|
345 |
} |
|
346 |
} |
|
347 |
// get the next element |
|
348 |
content = DOMUtil.getNextSiblingElement(content); |
|
349 |
} while (content != null && DOMUtil.getLocalName(content).equals(SchemaSymbols.ELT_SIMPLETYPE)); |
|
350 |
} |
|
351 |
} |
|
352 |
else if ((restriction || list) && baseTypeName == null) { |
|
353 |
// it's an error if neither "base/itemType" nor "simpleType" appears |
|
354 |
reportSchemaError(list ? "src-simple-type.3.b" : "src-simple-type.2.b", null, child); |
|
355 |
} |
|
356 |
else if (union && (memberTypes == null || memberTypes.size() == 0)) { |
|
357 |
// it's an error if "memberTypes" is empty and no "simpleType" appears |
|
358 |
reportSchemaError("src-union-memberTypes-or-simpleTypes", null, child); |
|
359 |
} |
|
360 |
// error finding "base" or error traversing "simpleType". |
|
361 |
// don't need to report an error, since some error has been reported. |
|
362 |
if ((restriction || list) && baseValidator == null) { |
|
363 |
fAttrChecker.returnAttrArray(contentAttrs, schemaDoc); |
|
364 |
return errorType(name, schemaDoc.fTargetNamespace, |
|
365 |
restriction ? XSConstants.DERIVATION_RESTRICTION : XSConstants.DERIVATION_LIST); |
|
366 |
} |
|
367 |
// error finding "memberTypes" or error traversing "simpleType". |
|
368 |
// don't need to report an error, since some error has been reported. |
|
369 |
if (union && (dTValidators == null || dTValidators.size() == 0)) { |
|
370 |
fAttrChecker.returnAttrArray(contentAttrs, schemaDoc); |
|
371 |
return errorType(name, schemaDoc.fTargetNamespace, |
|
372 |
XSConstants.DERIVATION_UNION); |
|
373 |
} |
|
374 |
// item type of list types can't have list content |
|
375 |
if (list && isListDatatype(baseValidator)) { |
|
376 |
reportSchemaError("cos-st-restricts.2.1", new Object[]{name, baseValidator.getName()}, child); |
|
377 |
fAttrChecker.returnAttrArray(contentAttrs, schemaDoc); |
|
378 |
return errorType(name, schemaDoc.fTargetNamespace, |
|
379 |
XSConstants.DERIVATION_LIST); |
|
380 |
} |
|
381 |
// create the simple type based on the "base" type |
|
382 |
XSSimpleType newDecl = null; |
|
383 |
if (restriction) { |
|
384 |
newDecl = fSchemaHandler.fDVFactory.createTypeRestriction(name, schemaDoc.fTargetNamespace, (short)finalProperty, baseValidator, |
|
385 |
annotations == null? null : new XSObjectListImpl(annotations, annotations.length)); |
|
386 |
} |
|
387 |
else if (list) { |
|
388 |
newDecl = fSchemaHandler.fDVFactory.createTypeList(name, schemaDoc.fTargetNamespace, (short)finalProperty, baseValidator, |
|
389 |
annotations == null? null : new XSObjectListImpl(annotations, annotations.length)); |
|
390 |
} |
|
391 |
else if (union) { |
|
392 |
XSSimpleType[] memberDecls = (XSSimpleType[]) dTValidators.toArray(new XSSimpleType[dTValidators.size()]); |
|
393 |
newDecl = fSchemaHandler.fDVFactory.createTypeUnion(name, schemaDoc.fTargetNamespace, (short)finalProperty, memberDecls, |
|
394 |
annotations == null? null : new XSObjectListImpl(annotations, annotations.length)); |
|
395 |
} |
|
396 |
// now traverse facets, if it's derived by restriction |
|
397 |
if (restriction && content != null) { |
|
398 |
FacetInfo fi = traverseFacets(content, baseValidator, schemaDoc); |
|
399 |
content = fi.nodeAfterFacets; |
|
400 |
||
401 |
try { |
|
402 |
fValidationState.setNamespaceSupport(schemaDoc.fNamespaceSupport); |
|
403 |
newDecl.applyFacets(fi.facetdata, fi.fPresentFacets, fi.fFixedFacets, fValidationState); |
|
404 |
} catch (InvalidDatatypeFacetException ex) { |
|
405 |
reportSchemaError(ex.getKey(), ex.getArgs(), child); |
|
406 |
// Recreate the type, ignoring the facets |
|
407 |
newDecl = fSchemaHandler.fDVFactory.createTypeRestriction(name, schemaDoc.fTargetNamespace, (short)finalProperty, baseValidator, |
|
408 |
annotations == null? null : new XSObjectListImpl(annotations, annotations.length)); |
|
409 |
} |
|
410 |
} |
|
411 |
// no element should appear after this point |
|
412 |
if (content != null) { |
|
413 |
if (restriction) { |
|
414 |
reportSchemaError("s4s-elt-must-match.1", new Object[]{SchemaSymbols.ELT_RESTRICTION, "(annotation?, (simpleType?, (minExclusive | minInclusive | maxExclusive | maxInclusive | totalDigits | fractionDigits | length | minLength | maxLength | enumeration | whiteSpace | pattern)*))", DOMUtil.getLocalName(content)}, content); |
|
415 |
} |
|
416 |
else if (list) { |
|
417 |
reportSchemaError("s4s-elt-must-match.1", new Object[]{SchemaSymbols.ELT_LIST, "(annotation?, (simpleType?))", DOMUtil.getLocalName(content)}, content); |
|
418 |
} |
|
419 |
else if (union) { |
|
420 |
reportSchemaError("s4s-elt-must-match.1", new Object[]{SchemaSymbols.ELT_UNION, "(annotation?, (simpleType*))", DOMUtil.getLocalName(content)}, content); |
|
421 |
} |
|
422 |
} |
|
423 |
fAttrChecker.returnAttrArray(contentAttrs, schemaDoc); |
|
424 |
// return the new type |
|
425 |
return newDecl; |
|
426 |
} |
|
427 |
||
428 |
//@param: elm - top element |
|
429 |
//@param: baseTypeStr - type (base/itemType/memberTypes) |
|
430 |
//@param: baseRefContext: whether the caller is using this type as a base for restriction, union or list |
|
431 |
//return XSSimpleType available for the baseTypeStr, null if not found or disallowed. |
|
432 |
// also throws an error if the base type won't allow itself to be used in this context. |
|
433 |
// REVISIT: can this code be re-used? |
|
434 |
private XSSimpleType findDTValidator(Element elm, String refName, |
|
435 |
QName baseTypeStr, short baseRefContext, |
|
436 |
XSDocumentInfo schemaDoc) { |
|
437 |
if (baseTypeStr == null) |
|
438 |
return null; |
|
439 |
||
440 |
XSTypeDefinition baseType = (XSTypeDefinition)fSchemaHandler.getGlobalDecl(schemaDoc, XSDHandler.TYPEDECL_TYPE, baseTypeStr, elm); |
|
441 |
if (baseType == null) { |
|
442 |
return null; |
|
443 |
} |
|
444 |
if (baseType.getTypeCategory() != XSTypeDefinition.SIMPLE_TYPE) { |
|
445 |
reportSchemaError("cos-st-restricts.1.1", new Object[]{baseTypeStr.rawname, refName}, elm); |
|
446 |
return null; |
|
447 |
} |
|
448 |
||
449 |
// if it's a complex type, or if its restriction of anySimpleType |
|
450 |
if (baseType == SchemaGrammar.fAnySimpleType && |
|
451 |
baseRefContext == XSConstants.DERIVATION_RESTRICTION) { |
|
452 |
// if the base type is anySimpleType and the current type is |
|
453 |
// a S4S built-in type, return null. (not an error). |
|
454 |
if (checkBuiltIn(refName, schemaDoc.fTargetNamespace)) { |
|
455 |
return null; |
|
456 |
} |
|
457 |
reportSchemaError("cos-st-restricts.1.1", new Object[]{baseTypeStr.rawname, refName}, elm); |
|
458 |
return null; |
|
459 |
} |
|
460 |
||
461 |
if ((baseType.getFinal() & baseRefContext) != 0) { |
|
462 |
if (baseRefContext == XSConstants.DERIVATION_RESTRICTION) { |
|
463 |
reportSchemaError("st-props-correct.3", new Object[]{refName, baseTypeStr.rawname}, elm); |
|
464 |
} |
|
465 |
else if (baseRefContext == XSConstants.DERIVATION_LIST) { |
|
466 |
reportSchemaError("cos-st-restricts.2.3.1.1", new Object[]{baseTypeStr.rawname, refName}, elm); |
|
467 |
} |
|
468 |
else if (baseRefContext == XSConstants.DERIVATION_UNION) { |
|
469 |
reportSchemaError("cos-st-restricts.3.3.1.1", new Object[]{baseTypeStr.rawname, refName}, elm); |
|
470 |
} |
|
471 |
return null; |
|
472 |
} |
|
473 |
||
474 |
return (XSSimpleType)baseType; |
|
475 |
} |
|
476 |
||
477 |
// check whethe the type denoted by the name and namespace is a S4S |
|
478 |
// built-in type. update fIsBuiltIn at the same time. |
|
479 |
private final boolean checkBuiltIn(String name, String namespace) { |
|
480 |
if (namespace != SchemaSymbols.URI_SCHEMAFORSCHEMA) |
|
481 |
return false; |
|
482 |
if (SchemaGrammar.SG_SchemaNS.getGlobalTypeDecl(name) != null) |
|
483 |
fIsBuiltIn = true; |
|
484 |
return fIsBuiltIn; |
|
485 |
} |
|
486 |
||
487 |
// find if a datatype validator is a list or has list datatype member. |
|
488 |
private boolean isListDatatype(XSSimpleType validator) { |
|
489 |
if (validator.getVariety() == XSSimpleType.VARIETY_LIST) |
|
490 |
return true; |
|
491 |
||
492 |
if (validator.getVariety() == XSSimpleType.VARIETY_UNION) { |
|
493 |
XSObjectList temp = validator.getMemberTypes(); |
|
494 |
for (int i = 0; i < temp.getLength(); i++) { |
|
495 |
if (((XSSimpleType)temp.item(i)).getVariety() == XSSimpleType.VARIETY_LIST) { |
|
496 |
return true; |
|
497 |
} |
|
498 |
} |
|
499 |
} |
|
500 |
||
501 |
return false; |
|
502 |
}//isListDatatype(XSSimpleTypeDecl):boolean |
|
503 |
||
504 |
private XSSimpleType errorType(String name, String namespace, short refType) { |
|
505 |
XSSimpleType stringType = (XSSimpleType)SchemaGrammar.SG_SchemaNS.getTypeDefinition("string"); |
|
506 |
switch (refType) { |
|
507 |
case XSConstants.DERIVATION_RESTRICTION: |
|
508 |
return fSchemaHandler.fDVFactory.createTypeRestriction(name, namespace, (short)0, |
|
509 |
stringType, null); |
|
510 |
case XSConstants.DERIVATION_LIST: |
|
511 |
return fSchemaHandler.fDVFactory.createTypeList(name, namespace, (short)0, |
|
512 |
stringType, null); |
|
513 |
case XSConstants.DERIVATION_UNION: |
|
514 |
return fSchemaHandler.fDVFactory.createTypeUnion(name, namespace, (short)0, |
|
515 |
new XSSimpleType[]{stringType}, null); |
|
516 |
} |
|
517 |
||
518 |
return null; |
|
519 |
} |
|
520 |
||
521 |
}//class XSDSimpleTypeTraverser |