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=707475&r1=707474&r2=707475&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 Thu Oct 23 14:12:24 2008 @@ -23,6 +23,7 @@ import org.apache.xerces.impl.Constants; import org.apache.xerces.impl.dtd.models.CMNode; import org.apache.xerces.impl.dtd.models.CMStateSet; +import org.apache.xerces.impl.xs.SchemaGrammar; import org.apache.xerces.impl.xs.SchemaSymbols; import org.apache.xerces.impl.xs.SubstitutionGroupHandler; import org.apache.xerces.impl.xs.XMLSchemaException; @@ -268,7 +269,7 @@ * * @exception RuntimeException thrown on error */ - public Object oneTransition(QName curElem, int[] state, SubstitutionGroupHandler subGroupHandler) { + public Object oneTransition(QName curElem, int[] state, SubstitutionGroupHandler subGroupHandler, SchemaGrammar grammar) { int curState = state[0]; if(curState == XSCMValidator.FIRST_ERROR || curState == XSCMValidator.SUBSEQUENT_ERROR) { @@ -282,14 +283,13 @@ } // apply open content - suffix mode else if (state[3] == STATE_SUFFIX) { - if (fOpenContent.fWildcard.allowQName(curElem)) { + if (allowExpandedName(fOpenContent.fWildcard, curElem, subGroupHandler, grammar)) {//if (fOpenContent.fWildcard.allowQName(curElem)) { return fOpenContent; } - else { - state[1] = curState; - state[0] = XSCMValidator.FIRST_ERROR; - return findMatchingDecl(curElem, subGroupHandler); - } + + state[1] = curState; + state[0] = XSCMValidator.FIRST_ERROR; + return findMatchingDecl(curElem, subGroupHandler); } int nextState = 0; @@ -309,15 +309,21 @@ } } else if (type == XSParticleDecl.PARTICLE_WILDCARD) { - if (((XSWildcardDecl)fElemMap[elemIndex]).allowNamespace(curElem.uri)) { + // XML Schema 1.0 + if (fSchemaVersion < Constants.SCHEMA_VERSION_1_1) { + if (((XSWildcardDecl)fElemMap[elemIndex]).allowNamespace(curElem.uri)) { + matchingDecl = fElemMap[elemIndex]; + break; + } + } + // XML Schema 1.1 + else if (allowExpandedName((XSWildcardDecl)fElemMap[elemIndex], curElem, subGroupHandler, grammar)) { matchingDecl = fElemMap[elemIndex]; - // XML Schema 1.1 - and element has precedence over a wildcard + // Element has precedence over a wildcard // if no occurences or we reached minOccurs, keep looking for // and element declaration - if (fSchemaVersion == Constants.SCHEMA_VERSION_1_1) { - if (fCountingStates == null || fCountingStates[curState] == null || state[2] == fCountingStates[curState].minOccurs) { - toMatchElementDecl = true; - } + if (fCountingStates == null || fCountingStates[curState] == null || state[2] == fCountingStates[curState].minOccurs) { + toMatchElementDecl = true; } break; } @@ -348,30 +354,8 @@ if (matchingDecl == null) { // XML Schema 1.1 // Validate against Open Content - if (fOpenContent != null) { - // if suffix mode, we should have reached a final state - if (fOpenContent.fMode == XSOpenContentDecl.MODE_SUFFIX) { - if (fFinalStateFlags[curState]) { - if (fCountingStates != null) { - Occurence o = fCountingStates[curState]; - if (o != null && state[2] < o.minOccurs) { - // not enough loops on the current state to be considered final. - state[1] = state[0]; - state[0] = XSCMValidator.FIRST_ERROR; - return findMatchingDecl(curElem, subGroupHandler); - } - } - state[3] = STATE_SUFFIX; - } - else { - state[1] = state[0]; - state[0] = XSCMValidator.FIRST_ERROR; - return findMatchingDecl(curElem, subGroupHandler); - } - } - if (fOpenContent.fWildcard.allowQName(curElem)) { - return fOpenContent; - } + if (fOpenContent != null && matchOpenContentModel(curElem, state, subGroupHandler, curState, grammar)) { + return fOpenContent; } state[1] = state[0]; @@ -409,7 +393,7 @@ // we've already seen enough instances of the first "foo" perhaps there is // another element declaration or wildcard deeper in the element map which // matches. - return findMatchingDecl(curElem, state, subGroupHandler, elemIndex); + return findMatchingDecl(curElem, state, subGroupHandler, elemIndex, grammar); } } else if (state[2] < o.minOccurs) { @@ -455,7 +439,7 @@ } } else if (type == XSParticleDecl.PARTICLE_WILDCARD) { - if (((XSWildcardDecl)fElemMap[elemIndex]).allowNamespace(curElem.uri)) { + if (((XSWildcardDecl)fElemMap[elemIndex]).allowQName(curElem)) { return fElemMap[elemIndex]; } } @@ -464,11 +448,12 @@ return null; } // findMatchingDecl(QName, SubstitutionGroupHandler): Object - Object findMatchingDecl(QName curElem, int[] state, SubstitutionGroupHandler subGroupHandler, int elemIndex) { + Object findMatchingDecl(QName curElem, int[] state, SubstitutionGroupHandler subGroupHandler, int elemIndex, SchemaGrammar grammar) { int curState = state[0]; int nextState = 0; Object matchingDecl = null; + boolean toMatchElementDecl = false; while (++elemIndex < fElemMapSize) { nextState = fTransTable[curState][elemIndex]; @@ -482,20 +467,60 @@ } } else if (type == XSParticleDecl.PARTICLE_WILDCARD) { - if (((XSWildcardDecl)fElemMap[elemIndex]).allowNamespace(curElem.uri)) { + // XML Schema 1.0 + if (fSchemaVersion < Constants.SCHEMA_VERSION_1_1) { + if (((XSWildcardDecl)fElemMap[elemIndex]).allowNamespace(curElem.uri)) { + matchingDecl = fElemMap[elemIndex]; + break; + } + } + // XML Schema 1.1 + else if (allowExpandedName((XSWildcardDecl)fElemMap[elemIndex], curElem, subGroupHandler, grammar)) { matchingDecl = fElemMap[elemIndex]; + // Element has precedence over a wildcard + // if no occurences or we reached minOccurs, keep looking for + // and element declaration + if (fCountingStates == null || fCountingStates[curState] == null || state[2] == fCountingStates[curState].minOccurs) { + toMatchElementDecl = true; + } break; } } } - // if we still can't find a match, set the state to FIRST_ERROR and return null - if (elemIndex == fElemMapSize) { + // XML Schema 1.1 + // We matched against a wildcard, but need to also check + // if we can find a matching element declaration + if (toMatchElementDecl) { + int newState = 0; + Object newMatchingDecl = null; + while (++elemIndex < fElemMapSize) { + newState = fTransTable[curState][elemIndex]; + if (newState != -1 && fElemMapType[elemIndex] == XSParticleDecl.PARTICLE_ELEMENT) { + newMatchingDecl = subGroupHandler.getMatchingElemDecl(curElem, (XSElementDecl)fElemMap[elemIndex]); + if (newMatchingDecl != null) { + matchingDecl = newMatchingDecl; + nextState = newState; + break; + } + } + } + } + + // if we still can't find a match, set the state to first_error + // and return null + if (matchingDecl == null) { + // XML Schema 1.1 + // Validate against Open Content + if (fOpenContent != null && matchOpenContentModel(curElem, state, subGroupHandler, curState, grammar)) { + return fOpenContent; + } + state[1] = state[0]; state[0] = XSCMValidator.FIRST_ERROR; return findMatchingDecl(curElem, subGroupHandler); } - + // if we found a match, set the next state and reset the // counter if the next state is a counting state. state[0] = nextState; @@ -506,6 +531,58 @@ return matchingDecl; } // findMatchingDecl(QName, int[], SubstitutionGroupHandler, int): Object + XSElementDecl findMatchingElemDecl(QName curElem, SubstitutionGroupHandler subGroupHandler) { + XSElementDecl matchingDecl = null; + + for (int elemIndex = 0; elemIndex < fElemMapSize; elemIndex++) { + int type = fElemMapType[elemIndex] ; + if (type == XSParticleDecl.PARTICLE_ELEMENT) { + matchingDecl = subGroupHandler.getMatchingElemDecl(curElem, (XSElementDecl)fElemMap[elemIndex]); + if (matchingDecl != null) { + return matchingDecl; + } + } + } + + return null; + } // findMatchingDecl(QName, SubstitutionGroupHandler): Object + + boolean allowExpandedName(XSWildcardDecl wildcard, QName curElem, SubstitutionGroupHandler subGroupHandler, SchemaGrammar grammar) { + if (wildcard.allowQName(curElem)) { + if (wildcard.fDisallowedSibling && findMatchingElemDecl(curElem, subGroupHandler) != null) { + return false; + } + if (wildcard.fDisallowedDefined && grammar != null && grammar.getElementDeclaration(curElem.localpart) != null) { + return false; + } + return true; + } + return false; + } + + boolean matchOpenContentModel(QName curElem, int[] state, SubstitutionGroupHandler subGroupHandler, int curState, SchemaGrammar grammar) { + // if suffix mode, we should have reached a final state + if (fOpenContent.fMode == XSOpenContentDecl.MODE_SUFFIX) { + if (fFinalStateFlags[curState]) { + if (fCountingStates != null) { + Occurence o = fCountingStates[curState]; + if (o != null && state[2] < o.minOccurs) { + return false; + } + } + state[3] = STATE_SUFFIX; + } + else { + return false; + } + } + if (allowExpandedName(fOpenContent.fWildcard, curElem, subGroupHandler, grammar)) { + return true; + } + + return false; + } + // This method returns the start states of the content model. public int[] startContentModel() { // [0] : the current state
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=707475&r1=707474&r2=707475&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 Thu Oct 23 14:12:24 2008 @@ -19,6 +19,7 @@ import java.util.Vector; +import org.apache.xerces.impl.xs.SchemaGrammar; import org.apache.xerces.impl.xs.SubstitutionGroupHandler; import org.apache.xerces.impl.xs.XMLSchemaException; import org.apache.xerces.impl.xs.XSConstraints; @@ -74,7 +75,7 @@ * @param subGroupHandler the substitution group handler * @return element index corresponding to the element from the Schema grammar */ - public Object oneTransition (QName elementName, int[] currentState, SubstitutionGroupHandler subGroupHandler){ + public Object oneTransition (QName elementName, int[] currentState, SubstitutionGroupHandler subGroupHandler, SchemaGrammar grammar){ // error state if (currentState[0] < 0) { Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSAttributeChecker.java URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSAttributeChecker.java?rev=707475&r1=707474&r2=707475&view=diff ============================================================================== --- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSAttributeChecker.java (original) +++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSAttributeChecker.java Thu Oct 23 14:12:24 2008 @@ -128,6 +128,8 @@ public static final int ATTIDX_DEFAULTATTRAPPLY = ATTIDX_COUNT++; public static final int ATTIDX_DEFAULTATTRIBUTES = ATTIDX_COUNT++; public static final int ATTIDX_MODE = ATTIDX_COUNT++; + public static final int ATTIDX_NOTNAMESPACE = ATTIDX_COUNT++; + public static final int ATTIDX_NOTQNAME = ATTIDX_COUNT++; public static final int ATTIDX_XPATHDEFAULTNS = ATTIDX_COUNT++; private static final XIntPool fXIntPool = new XIntPool(); @@ -224,9 +226,12 @@ protected static final int DT_BOOLEAN = -15; protected static final int DT_NONNEGINT = -16; protected static final int DT_POSINT = -17; + protected static final int DT_XPATH_DEFAULT_NS = -18; protected static final int DT_MODE = -19; protected static final int DT_MODE1 = -20; + protected static final int DT_NOTNAMESPACE = -21; + protected static final int DT_NOTQNAME = -22; static { // step 2: all possible attributes for all elements @@ -287,6 +292,9 @@ int ATT_DEFAULT_XPATH_NS_N = attCount++; int ATT_MODE_D = attCount++; int ATT_MODE1_D = attCount++; + int ATT_NAMESPACE1_N = attCount++; + int ATT_NOTNAMESPACE_N = attCount++; + int ATT_NOTQNAME_N = attCount++; int ATT_TEST_XPATH_R = attCount++; // step 3: store all these attributes in an array @@ -509,6 +517,18 @@ DT_MODE1, ATTIDX_MODE, INT_MODE_INTERLEAVE); + allAttrs[ATT_NAMESPACE1_N] = new OneAttr(SchemaSymbols.ATT_NAMESPACE, + DT_NAMESPACE, + ATTIDX_NAMESPACE, + null); + allAttrs[ATT_NOTNAMESPACE_N] = new OneAttr(SchemaSymbols.ATT_NAMESPACE, + DT_NOTNAMESPACE, + ATTIDX_NOTNAMESPACE, + null); + allAttrs[ATT_NOTQNAME_N] = new OneAttr(SchemaSymbols.ATT_NOTQNAME, + DT_NOTQNAME, + ATTIDX_NOTQNAME, + null); allAttrs[ATT_TEST_XPATH_R] = new OneAttr(SchemaSymbols.ATT_TEST, DT_XPATH1, ATTIDX_XPATH, @@ -721,8 +741,6 @@ // processContents = (lax | skip | strict) : strict attrList.put(SchemaSymbols.ATT_PROCESSCONTENTS, allAttrs[ATT_PROCESS_C_D]); fEleAttrsMapL.put(SchemaSymbols.ELT_ANYATTRIBUTE, attrList); - // TODO: XML Schema 1.1 different attribute list - fEleAttrs11MapL.put(SchemaSymbols.ELT_ANYATTRIBUTE, attrList); // for element "complexContent" - local attrList = Container.getContainer(2); @@ -810,8 +828,6 @@ // processContents = (lax | skip | strict) : strict attrList.put(SchemaSymbols.ATT_PROCESSCONTENTS, allAttrs[ATT_PROCESS_C_D]); fEleAttrsMapL.put(SchemaSymbols.ELT_ANY, attrList); - // TODO: XML Schema 1.1 different attribute list - fEleAttrs11MapL.put(SchemaSymbols.ELT_ANY, attrList); // for element "unique" - local attrList = Container.getContainer(2); @@ -1141,6 +1157,37 @@ attrList.put(SchemaSymbols.ATT_XPATH_DEFAULT_NS, allAttrs[ATT_DEFAULT_XPATH_NS_N]); fEleAttrs11MapL.put(SchemaSymbols.ELT_FIELD, attrList); + // for element "any" - local + attrList = Container.getContainer(7); + // id = ID + attrList.put(SchemaSymbols.ATT_ID, allAttrs[ATT_ID_N]); + // maxOccurs = (nonNegativeInteger | unbounded) : 1 + attrList.put(SchemaSymbols.ATT_MAXOCCURS, allAttrs[ATT_MAXOCCURS_D]); + // minOccurs = nonNegativeInteger : 1 + attrList.put(SchemaSymbols.ATT_MINOCCURS, allAttrs[ATT_MINOCCURS_D]); + // namespace = ((##any | ##other) | List of (anyURI | (##targetNamespace | ##local)) ) + attrList.put(SchemaSymbols.ATT_NAMESPACE, allAttrs[ATT_NAMESPACE1_N]); + // notNamespace = List of (anyURI | (##targetNamespace | ##local)) + attrList.put(SchemaSymbols.ATT_NOTNAMESPACE, allAttrs[ATT_NOTNAMESPACE_N]); + // notQName = List of (QName | (##defined | ##definedSibling)) + attrList.put(SchemaSymbols.ATT_NOTQNAME, allAttrs[ATT_NOTQNAME_N]); + // processContents = (lax | skip | strict) : strict + attrList.put(SchemaSymbols.ATT_PROCESSCONTENTS, allAttrs[ATT_PROCESS_C_D]); + fEleAttrs11MapL.put(SchemaSymbols.ELT_ANY, attrList); + + // for element "anyAttribute" - local + attrList = Container.getContainer(5); + // id = ID + attrList.put(SchemaSymbols.ATT_ID, allAttrs[ATT_ID_N]); + // namespace = ((##any | ##other) | List of (anyURI | (##targetNamespace | ##local)) ) + attrList.put(SchemaSymbols.ATT_NAMESPACE, allAttrs[ATT_NAMESPACE1_N]); + // notNamespace = List of (anyURI | (##targetNamespace | ##local)) + attrList.put(SchemaSymbols.ATT_NOTNAMESPACE, allAttrs[ATT_NOTNAMESPACE_N]); + // notQName = List of (QName | (##defined | ##definedSibling)) + attrList.put(SchemaSymbols.ATT_NOTQNAME, allAttrs[ATT_NOTQNAME_N]); + // processContents = (lax | skip | strict) : strict + attrList.put(SchemaSymbols.ATT_PROCESSCONTENTS, allAttrs[ATT_PROCESS_C_D]); + fEleAttrs11MapL.put(SchemaSymbols.ELT_ANYATTRIBUTE, attrList); // new components @@ -1737,41 +1784,7 @@ } else { // list retValue = INT_ANY_LIST; - - fNamespaceList.removeAllElements(); - - // tokenize - StringTokenizer tokens = new StringTokenizer(value, " \n\t\r"); - String token; - String tempNamespace; - try { - while (tokens.hasMoreTokens()) { - token = tokens.nextToken(); - if (token.equals(SchemaSymbols.ATTVAL_TWOPOUNDLOCAL)) { - tempNamespace = null; - } else if (token.equals(SchemaSymbols.ATTVAL_TWOPOUNDTARGETNS)) { - tempNamespace = schemaDoc.fTargetNamespace; - } else { - // we have found namespace URI here - // need to add it to the symbol table - fExtraDVs[DT_ANYURI].validate(token, schemaDoc.fValidationContext, null); - tempNamespace = fSymbolTable.addSymbol(token); - } - - //check for duplicate namespaces in the list - if (!fNamespaceList.contains(tempNamespace)) { - fNamespaceList.addElement(tempNamespace); - } - } - } catch (InvalidDatatypeValueException ide) { - throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.3", new Object[]{value, "((##any | ##other) | List of (anyURI | (##targetNamespace | ##local)) )"}); - } - - // convert the vector to an array - int num = fNamespaceList.size(); - String[] list = new String[num]; - fNamespaceList.copyInto(list); - attrValues[ATTIDX_NAMESPACE_LIST] = list; + attrValues[ATTIDX_NAMESPACE_LIST] = processNamespaceList(value, schemaDoc); } break; case DT_PROCESSCONTENTS: @@ -1815,6 +1828,60 @@ (dvIndex == DT_MODE1) ? new Object[]{value, "(none | interleave | suffix)"} : new Object[]{value, "(interleave | sufix)"}); break; + case DT_NOTQNAME: + { + // notQName = List of (QName | (##defined| ##definedSibling)) + if (attrValues[ATTIDX_NOTQNAME] == null) { + attrValues[ATTIDX_NOTQNAME] = new Vector(); + } + final Vector notQNameList = (Vector)attrValues[ATTIDX_NOTQNAME]; + + // tokenize + StringTokenizer tokens = new StringTokenizer(value, " \n\t\r"); + String token; + QName qname; + Boolean definedKeyword = Boolean.FALSE; + Boolean siblingKeyword = Boolean.FALSE; + try { + while (tokens.hasMoreTokens()) { + token = tokens.nextToken(); + if (token.equals(SchemaSymbols.ATTVAL_TWOPOUNDDEFINED)) { + definedKeyword = Boolean.TRUE; + } + else if (token.equals(SchemaSymbols.ATTVAL_TWOPOUNDDEFINEDSIBLING)) { + siblingKeyword = Boolean.TRUE; + } + else { + // we have found a qname here + qname = (QName)fExtraDVs[DT_QNAME].validate(token, schemaDoc.fValidationContext, null); + // check for duplicate qnames in the list + if (!notQNameList.contains(qname)) { + notQNameList.addElement(qname); + } + } + } + + // convert to a QName[] and add it back to the list + int num = notQNameList.size(); + QName[] list = new QName[num]; + notQNameList.copyInto(list); + notQNameList.clear(); + notQNameList.add(list); + + // add ##defined and ##definedSibling keyword to the list + notQNameList.add(definedKeyword); + notQNameList.add(siblingKeyword); + } catch (InvalidDatatypeValueException ide) { + throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.3", new Object[]{value, "(List of (QName | ##defined) )"}); + } + + retValue = notQNameList; + } + break; + case DT_NOTNAMESPACE: + // notNamespace = List of (anyURI | (##targetNamespace | ##local)) + retValue = processNamespaceList(value, schemaDoc); + break; case DT_WHITESPACE: // value = preserve | replace | collapse if (value.equals (SchemaSymbols.ATTVAL_PRESERVE)) @@ -1853,6 +1920,43 @@ return retValue; } + private String[] processNamespaceList(String value, XSDocumentInfo schemaDoc) throws InvalidDatatypeValueException { + fNamespaceList.removeAllElements(); + + // tokenize + StringTokenizer tokens = new StringTokenizer(value, " \n\t\r"); + String token; + String tempNamespace; + try { + while (tokens.hasMoreTokens()) { + token = tokens.nextToken(); + if (token.equals(SchemaSymbols.ATTVAL_TWOPOUNDLOCAL)) { + tempNamespace = null; + } else if (token.equals(SchemaSymbols.ATTVAL_TWOPOUNDTARGETNS)) { + tempNamespace = schemaDoc.fTargetNamespace; + } else { + // we have found namespace URI here + // need to add it to the symbol table + fExtraDVs[DT_ANYURI].validate(token, schemaDoc.fValidationContext, null); + tempNamespace = fSymbolTable.addSymbol(token); + } + + //check for duplicate namespaces in the list + if (!fNamespaceList.contains(tempNamespace)) { + fNamespaceList.addElement(tempNamespace); + } + } + } catch (InvalidDatatypeValueException ide) { + throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.3", new Object[]{value, "((##any | ##other) | List of (anyURI | (##targetNamespace | ##local)) )"}); + } + + // convert the vector to an array + int num = fNamespaceList.size(); + String[] list = new String[num]; + fNamespaceList.copyInto(list); + return list; + } + void reportSchemaError (String key, Object[] args, Element ele) { fSchemaHandler.reportSchemaError(key, args, ele); } @@ -2019,6 +2123,9 @@ // clear the subsgroup vector if(attrArray[ATTIDX_SUBSGROUP] != null) ((Vector)attrArray[ATTIDX_SUBSGROUP]).clear(); + // clear notQname vector + if (attrArray[ATTIDX_NOTQNAME] != null) + ((Vector)attrArray[ATTIDX_NOTQNAME]).clear(); // and put it into the pool fArrayPool[--fPoolPos] = attrArray; } Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDWildcardTraverser.java URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDWildcardTraverser.java?rev=707475&r1=707474&r2=707475&view=diff ============================================================================== --- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDWildcardTraverser.java (original) +++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/traversers/XSDWildcardTraverser.java Thu Oct 23 14:12:24 2008 @@ -17,6 +17,9 @@ package org.apache.xerces.impl.xs.traversers; +import java.util.Vector; + +import org.apache.xerces.impl.Constants; import org.apache.xerces.impl.xs.SchemaGrammar; import org.apache.xerces.impl.xs.SchemaSymbols; import org.apache.xerces.impl.xs.XSAnnotationImpl; @@ -25,6 +28,7 @@ import org.apache.xerces.impl.xs.util.XInt; import org.apache.xerces.impl.xs.util.XSObjectListImpl; import org.apache.xerces.util.DOMUtil; +import org.apache.xerces.xni.QName; import org.apache.xerces.xs.XSObjectList; import org.w3c.dom.Element; @@ -145,18 +149,23 @@ Object[] attrValues, XSDocumentInfo schemaDoc, SchemaGrammar grammar) { - + //get all attributes XSWildcardDecl wildcard = new XSWildcardDecl(); // namespace type XInt namespaceTypeAttr = (XInt) attrValues[XSAttributeChecker.ATTIDX_NAMESPACE]; - wildcard.fType = namespaceTypeAttr.shortValue(); + wildcard.fType = (namespaceTypeAttr != null) ? namespaceTypeAttr.shortValue() : XSWildcardDecl.NSCONSTRAINT_ANY; // namespace list wildcard.fNamespaceList = (String[])attrValues[XSAttributeChecker.ATTIDX_NAMESPACE_LIST]; // process contents XInt processContentsAttr = (XInt) attrValues[XSAttributeChecker.ATTIDX_PROCESSCONTENTS]; wildcard.fProcessContents = processContentsAttr.shortValue(); - + + // handle XML Schema 1.1 attributes + if (fSchemaHandler.fSchemaVersion == Constants.SCHEMA_VERSION_1_1) { + processExtraAttributes(elmNode, attrValues, wildcard); + } + //check content Element child = DOMUtil.getFirstChildElement(elmNode); XSAnnotationImpl annotation = null; @@ -196,4 +205,46 @@ } // traverseWildcardDecl + private void processExtraAttributes(Element elmNode, + Object[] attrValues, + XSWildcardDecl wildcard) { + + // notNamespace + String[] notNamespaceTypeAttr = (String[]) attrValues[XSAttributeChecker.ATTIDX_NOTNAMESPACE]; + if (notNamespaceTypeAttr != null) { + XInt namespaceTypeAttr = (XInt) attrValues[XSAttributeChecker.ATTIDX_NAMESPACE]; + // 1 namespace and notNamespace must not both be present. + if (namespaceTypeAttr != null) { + reportSchemaError("src-wildcard.1", null, elmNode); + } + else { + wildcard.fType = XSWildcardDecl.NSCONSTRAINT_NOT; + wildcard.fNamespaceList = notNamespaceTypeAttr; + + // 2 If {variety} is not, {namespaces} has at least one member. + if (notNamespaceTypeAttr.length == 0) { + reportSchemaError("wc-props-correct.2", null, elmNode); + } + } + } + + // notQName + Vector notQNameAttr = (Vector) attrValues[XSAttributeChecker.ATTIDX_NOTQNAME]; + if (notQNameAttr != null && notQNameAttr.size() > 0) { + // get disallowed names and keywords + wildcard.fDisallowedNamesList = (QName[]) notQNameAttr.get(0); + wildcard.fDisallowedDefined = ((Boolean)notQNameAttr.get(1)).booleanValue(); + wildcard.fDisallowedSibling = ((Boolean)notQNameAttr.get(2)).booleanValue(); + + // 4 The namespace name of each QName member in {disallowed names} is allowed by + // the {namespace constraint}, as defined in Wildcard allows Namespace Name (3.10.4.3). + for (int i=0; i<wildcard.fDisallowedNamesList.length; i++) { + QName name = wildcard.fDisallowedNamesList[i]; + if (!wildcard.allowNamespace(name.uri)) { + reportSchemaError("wc-props-correct.4", new Object[] {name.uri, name.localpart}, elmNode); + } + } + } + } + } // XSDWildcardTraverser --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
