Author: knoaman Date: Mon Aug 8 20:02:50 2011 New Revision: 1155073 URL: http://svn.apache.org/viewvc?rev=1155073&view=rev Log: Element Delcaration Consistent When matching a wildcard, the type of the matched global declaration must be same or validly derived from the type of any local element delcaration with the same name
Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XMLSchemaValidator.java xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XSConstraints.java xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XS11AllCM.java xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSAllCM.java xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSCMValidator.java xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSDFACM.java xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSEmptyCM.java xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XMLSchemaValidator.java URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XMLSchemaValidator.java?rev=1155073&r1=1155072&r2=1155073&view=diff ============================================================================== --- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XMLSchemaValidator.java (original) +++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XMLSchemaValidator.java Mon Aug 8 20:02:50 2011 @@ -410,7 +410,9 @@ public class XMLSchemaValidator * While parsing a document, keep the location of the document. */ private XMLLocator fLocator; - + + private ArrayList fXSITypeErrors = new ArrayList(4); + private IDContext fIDContext = null; /** @@ -2230,6 +2232,8 @@ public class XMLSchemaValidator } // if no decl/type found for the current element + final boolean isSchema11 = (fSchemaVersion == Constants.SCHEMA_VERSION_1_1); + boolean needToPushErrorContext = false; 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 @@ -2289,17 +2293,35 @@ public class XMLSchemaValidator // 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(); + if (isSchema11) { + needToPushErrorContext = true; + } + else { + 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(); + if (isSchema11) { + needToPushErrorContext = true; + } + else { + fXSIErrorReporter.pushContext(); + } // get xsi:type if (xsiType != null) { XSTypeDefinition oldType = fCurrentType; - fCurrentType = getAndCheckXsiType(element, xsiType, attributes); + if (isSchema11) { + if (fXSITypeErrors.size() > 0) { + fXSITypeErrors.clear(); + } + fCurrentType = getAndCheckXsiType(element, xsiType, attributes, fXSITypeErrors); + } + else { + 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) @@ -2325,6 +2347,39 @@ public class XMLSchemaValidator } } + // EDC rule + if (isSchema11) { + if (wildcard != null && fCurrentCM != null) { + XSElementDecl elemDecl = fCurrentCM.findMatchingElemDecl(element, fSubGroupHandler); + if (elemDecl != null) { + final XSTypeDefinition elemType = elemDecl.getTypeDefinition(); + // types need to be equivalent + if (fCurrentType != elemType) { + short block = elemDecl.fBlock; + if (elemType.getTypeCategory() == XSTypeDefinition.COMPLEX_TYPE) { + block |= ((XSComplexTypeDecl) elemType).fBlock; + } + if (!fXSConstraints.checkTypeDerivationOk(fCurrentType, elemType, block)) { + reportSchemaError( + "cvc-elt.4.cos-element-consistent.4.a", + new Object[] { element.rawname, fCurrentType, elemType.getName()}); + } + } + } + } + + if (needToPushErrorContext) { + fXSIErrorReporter.pushContext(); + final int errorSize = fXSITypeErrors.size(); + if (errorSize > 0) { + for (int i=0; i<errorSize; ++i) { + reportSchemaError((String)fXSITypeErrors.get(i), (Object[])fXSITypeErrors.get(++i)); + } + fXSITypeErrors.clear(); + } + } + } + // Element Locally Valid (Element) // 2 Its {abstract} must be false. if (fCurrentElemDecl != null && fCurrentElemDecl.getAbstract()) @@ -3082,6 +3137,81 @@ public class XMLSchemaValidator return type; } //getAndCheckXsiType + + XSTypeDefinition getAndCheckXsiType(QName element, String xsiType, XMLAttributes attributes, + ArrayList errorList) { + // This method also deals with clause 1.2.1.2 of the constraint + // Validation Rule: Schema-Validity Assessment (Element) + + // Element Locally Valid (Element) + // 4 If there is an attribute information item among the element information item's [attributes] whose [namespace name] is identical to http://www.w3.org/2001/XMLSchema-instance and whose [local name] is type, then all of the following must be true: + // 4.1 The normalized value of that attribute information item must be valid with respect to the built-in QName simple type, as defined by String Valid (3.14.4); + QName typeName = null; + try { + typeName = (QName) fQNameDV.validate(xsiType, fValidationState, null); + } catch (InvalidDatatypeValueException e) { + errorList.add(e.getKey()); + errorList.add(e.getArgs()); + errorList.add("cvc-elt.4.1"); + errorList.add(new Object[] { + element.rawname, + SchemaSymbols.URI_XSI + "," + SchemaSymbols.XSI_TYPE, + xsiType }); + return null; + } + + // 4.2 The local name and namespace name (as defined in QName Interpretation (3.15.3)), of the actual value of that attribute information item must resolve to a type definition, as defined in QName resolution (Instance) (3.15.4) + XSTypeDefinition type = null; + // if the namespace is schema namespace, first try built-in types + if (typeName.uri == SchemaSymbols.URI_SCHEMAFORSCHEMA) { + if (isValidBuiltInTypeName(typeName.localpart)) { + SchemaGrammar s4s = SchemaGrammar.getS4SGrammar(fSchemaVersion); + type = s4s.getGlobalTypeDecl(typeName.localpart); + } + } + // if it's not schema built-in types, then try to get a grammar + if (type == null) { + //try to find schema grammar by different means.... + SchemaGrammar grammar = + findSchemaGrammar( + XSDDescription.CONTEXT_XSITYPE, + typeName.uri, + element, + typeName, + attributes); + + if (grammar != null) + type = grammar.getGlobalTypeDecl(typeName.localpart); + } + // still couldn't find the type, report an error + if (type == null) { + errorList.add("cvc-elt.4.2"); + errorList.add(new Object[] { element.rawname, xsiType }); + return null; + } + + // if there is no current type, set this one as current. + // and we don't need to do extra checking + if (fCurrentType != null) { + short block = XSConstants.DERIVATION_NONE; + // 4.3 The local type definition must be validly derived from the {type definition} given the union of the {disallowed substitutions} and the {type definition}'s {prohibited substitutions}, as defined in Type Derivation OK (Complex) (3.4.6) (if it is a complex type definition), or given {disallowed substitutions} as defined in Type Derivation OK (Simple) (3.14.6) (if it is a simple type definition). + // Note: It's possible to have fCurrentType be non-null and fCurrentElemDecl + // be null, if the current type is set using the property "root-type-definition". + // In that case, we don't disallow any substitutions. -PM + if (fCurrentElemDecl != null) { + block = fCurrentElemDecl.fBlock; + } + if (fCurrentType.getTypeCategory() == XSTypeDefinition.COMPLEX_TYPE) { + block |= ((XSComplexTypeDecl) fCurrentType).fBlock; + } + if (!fXSConstraints.checkTypeDerivationOk(type, fCurrentType, block)) { + errorList.add("cvc-elt.4.3"); + errorList.add(new Object[] { element.rawname, xsiType, fCurrentType.getName()}); + } + } + + return type; + } //getAndCheckXsiType boolean getXsiNil(QName element, String xsiNil) { // Element Locally Valid (Element) Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XSConstraints.java URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XSConstraints.java?rev=1155073&r1=1155072&r2=1155073&view=diff ============================================================================== --- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XSConstraints.java (original) +++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XSConstraints.java Mon Aug 8 20:02:50 2011 @@ -544,7 +544,7 @@ public abstract class XSConstraints { } else if (fSchemaVersion == Constants.SCHEMA_VERSION_1_1 && !isTypeTablesEquivalent(elem, existingElem)) { // Type tables are not equivalent - throw new XMLSchemaException("cos-element-consistent.4", new Object[] {type.fName, elem.fName}); + throw new XMLSchemaException("cos-element-consistent.4.b", new Object[] {type.fName, elem.fName}); } } } Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XS11AllCM.java URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XS11AllCM.java?rev=1155073&r1=1155072&r2=1155073&view=diff ============================================================================== --- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XS11AllCM.java (original) +++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XS11AllCM.java Mon Aug 8 20:02:50 2011 @@ -162,7 +162,7 @@ public class XS11AllCM implements XSCMVa } // convenient method: to find a matching element decl - XSElementDecl findMatchingElemDecl(QName elementName, SubstitutionGroupHandler subGroupHandler) { + public XSElementDecl findMatchingElemDecl(QName elementName, SubstitutionGroupHandler subGroupHandler) { for (int i = 1; i < fNumElements; i++) { final XSElementDecl matchingDecl = subGroupHandler.getMatchingElemDecl(elementName, fElements[i], Constants.SCHEMA_VERSION_1_1); if (matchingDecl != null) { Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSAllCM.java URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSAllCM.java?rev=1155073&r1=1155072&r2=1155073&view=diff ============================================================================== --- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSAllCM.java (original) +++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSAllCM.java Mon Aug 8 20:02:50 2011 @@ -19,6 +19,7 @@ package org.apache.xerces.impl.xs.models import java.util.Vector; +import org.apache.xerces.impl.Constants; import org.apache.xerces.impl.xs.SubstitutionGroupHandler; import org.apache.xerces.impl.xs.XMLSchemaException; import org.apache.xerces.impl.xs.XSConstraints; @@ -228,5 +229,16 @@ public class XSAllCM implements XSCMVali public boolean isCompactedForUPA() { return false; } + + public XSElementDecl findMatchingElemDecl(QName elementName, SubstitutionGroupHandler subGroupHandler) { + for (int i = 1; i < fNumElements; i++) { + final XSElementDecl matchingDecl = subGroupHandler.getMatchingElemDecl(elementName, fAllElements[i], Constants.SCHEMA_VERSION_1_0); + if (matchingDecl != null) { + return matchingDecl; + } + } + + return null; + } } // class XSAllCM Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSCMValidator.java URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSCMValidator.java?rev=1155073&r1=1155072&r2=1155073&view=diff ============================================================================== --- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSCMValidator.java (original) +++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSCMValidator.java Mon Aug 8 20:02:50 2011 @@ -22,6 +22,7 @@ import java.util.Vector; import org.apache.xerces.impl.xs.SubstitutionGroupHandler; import org.apache.xerces.impl.xs.XMLSchemaException; import org.apache.xerces.impl.xs.XSConstraints; +import org.apache.xerces.impl.xs.XSElementDecl; import org.apache.xerces.impl.xs.XSElementDeclHelper; import org.apache.xerces.xni.QName; @@ -128,4 +129,6 @@ public interface XSCMValidator { * @return a boolean that says whether this content has been compacted for UPA */ public boolean isCompactedForUPA(); + + public XSElementDecl findMatchingElemDecl(QName elementName, SubstitutionGroupHandler subGroupHandler); } // XSCMValidator Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSDFACM.java URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSDFACM.java?rev=1155073&r1=1155072&r2=1155073&view=diff ============================================================================== --- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSDFACM.java (original) +++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSDFACM.java Mon Aug 8 20:02:50 2011 @@ -457,7 +457,7 @@ public class XSDFACM return matchingDecl; } // findMatchingDecl(QName, int[], SubstitutionGroupHandler, int): Object - XSElementDecl findMatchingElemDecl(QName curElem, SubstitutionGroupHandler subGroupHandler) { + public XSElementDecl findMatchingElemDecl(QName curElem, SubstitutionGroupHandler subGroupHandler) { XSElementDecl matchingDecl = null; for (int elemIndex = 0; elemIndex < fNumElements; elemIndex++) { Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSEmptyCM.java URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSEmptyCM.java?rev=1155073&r1=1155072&r2=1155073&view=diff ============================================================================== --- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSEmptyCM.java (original) +++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/models/XSEmptyCM.java Mon Aug 8 20:02:50 2011 @@ -208,4 +208,8 @@ public class XSEmptyCM implements XSCMVa public XSOpenContentDecl getOpenContent() { return fOpenContent; } + + public XSElementDecl findMatchingElemDecl(QName elementName, SubstitutionGroupHandler subGroupHandler) { + return null; + } } // class XSEmptyCM Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java?rev=1155073&r1=1155072&r2=1155073&view=diff ============================================================================== --- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java (original) +++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java Mon Aug 8 20:02:50 2011 @@ -1381,7 +1381,7 @@ public class XSDHandler { String qName = currSchemaDoc.fTargetNamespace == null ? ","+lName: currSchemaDoc.fTargetNamespace +","+lName; - qName = XMLChar.trim(qName); + //qName = XMLChar.trim(qName); String componentType = DOMUtil.getLocalName(redefineComp); if (componentType.equals(SchemaSymbols.ELT_ATTRIBUTEGROUP)) { checkForDuplicateNames(qName, ATTRIBUTEGROUP_TYPE, fUnparsedAttributeGroupRegistry, fUnparsedAttributeGroupRegistrySub, redefineComp, currSchemaDoc); @@ -1438,7 +1438,7 @@ public class XSDHandler { String qName = currSchemaDoc.fTargetNamespace == null? ","+lName: currSchemaDoc.fTargetNamespace +","+lName; - qName = XMLChar.trim(qName); + //qName = XMLChar.trim(qName); if (componentType.equals(SchemaSymbols.ELT_ATTRIBUTE)) { checkForDuplicateNames(qName, ATTRIBUTE_TYPE, fUnparsedAttributeRegistry, fUnparsedAttributeRegistrySub, globalComp, currSchemaDoc); } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@xerces.apache.org For additional commands, e-mail: commits-h...@xerces.apache.org