sandygao 2004/02/03 07:45:23
Modified: java/src/org/apache/xerces/impl/xs XMLSchemaValidator.java
Log:
Fixing bug [26480]: when a child element matches a strict wildcard and there
is no corresponding global element decl for it, it's an error on the parent
element, not the sub-element itself.
Another bug is also fixed: when a sub-tree is skipped, for its root, we don't
need to push context for the xsi error reporter. No error will occur (because
it's skipped), and because we don't pop context at the end, push/pop won't
be in sync.
Revision Changes Path
1.150 +35 -15
xml-xerces/java/src/org/apache/xerces/impl/xs/XMLSchemaValidator.java
Index: XMLSchemaValidator.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/XMLSchemaValidator.java,v
retrieving revision 1.149
retrieving revision 1.150
diff -u -r1.149 -r1.150
--- XMLSchemaValidator.java 14 Nov 2003 09:25:12 -0000 1.149
+++ XMLSchemaValidator.java 3 Feb 2004 15:45:23 -0000 1.150
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 1999-2003 The Apache Software Foundation.
+ * Copyright (c) 1999-2004 The Apache Software Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -1764,9 +1764,6 @@
}
}
- // push error reporter context: record the current position
- fXSIErrorReporter.pushContext();
-
// if it's not the root element, we push the current states in the
stacks
if (fElementDepth != -1) {
ensureStackCapacity();
@@ -1827,11 +1824,6 @@
}
}
- // Element Locally Valid (Element)
- // 2 Its {abstract} must be false.
- if (fCurrentElemDecl != null && fCurrentElemDecl.getAbstract())
- reportSchemaError("cvc-elt.2", new Object[] { element.rawname
});
-
if (fCurrentElemDecl != null) {
// then get the type
fCurrentType = fCurrentElemDecl.fType;
@@ -1839,11 +1831,9 @@
// get type from xsi:type
String xsiType = attributes.getValue(SchemaSymbols.URI_XSI,
SchemaSymbols.XSI_TYPE);
- if (xsiType != null)
- fCurrentType = getAndCheckXsiType(element, xsiType,
attributes);
- // if the element decl is not found
- if (fCurrentType == null) {
+ // if no decl/type found for the current element
+ if (fCurrentType == null && xsiType == null) {
// if this is the validation root, report an error, because
// we can't find eith decl or type for this element
// REVISIT: should we report error, or warning?
@@ -1883,7 +1873,9 @@
new Object[] { element.rawname },
XMLErrorReporter.SEVERITY_ERROR);
}
- // if wildcard = strict, report error
+ // if wildcard = strict, report error.
+ // needs to be called before fXSIErrorReporter.pushContext()
+ // so that the error belongs to the parent element.
else if (wildcard != null && wildcard.fProcessContents ==
XSWildcardDecl.PC_STRICT) {
// report error, because wilcard = strict
reportSchemaError("cvc-complex-type.2.4.c", new
Object[] { element.rawname });
@@ -1896,7 +1888,30 @@
fNFullValidationDepth = fElementDepth;
// any type has mixed content, so we don't need to append
buffer
fAppendBuffer = false;
+
+ // push error reporter context: record the current position
+ // This has to happen after we process skip contents,
+ // otherwise push and pop won't be correctly paired.
+ fXSIErrorReporter.pushContext();
} else {
+ // push error reporter context: record the current position
+ // This has to happen after we process skip contents,
+ // otherwise push and pop won't be correctly paired.
+ fXSIErrorReporter.pushContext();
+
+ // get xsi:type
+ if (xsiType != null) {
+ XSTypeDefinition oldType = fCurrentType;
+ fCurrentType = getAndCheckXsiType(element, xsiType, attributes);
+ // If it fails, use the old type. Use anyType if ther is no old
type.
+ if (fCurrentType == null) {
+ if (oldType == null)
+ fCurrentType = SchemaGrammar.fAnyType;
+ else
+ fCurrentType = oldType;
+ }
+ }
+
fNNoneValidationDepth = fElementDepth;
// if the element has a fixed value constraint, we need to
append
if (fCurrentElemDecl != null
@@ -1912,6 +1927,11 @@
fAppendBuffer = (ctype.fContentType ==
XSComplexTypeDecl.CONTENTTYPE_SIMPLE);
}
}
+
+ // Element Locally Valid (Element)
+ // 2 Its {abstract} must be false.
+ if (fCurrentElemDecl != null && fCurrentElemDecl.getAbstract())
+ reportSchemaError("cvc-elt.2", new Object[] { element.rawname });
// make the current element validation root
if (fElementDepth == 0) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]