sandygao 2002/09/11 19:50:27 Modified: java/src/org/apache/xerces/impl/xs XMLSchemaValidator.java Log: Some cleanup in the schema validator: 1. Removed some code/variable that are never used; 2. Moved some one-time initialization code from "reset()" to the constructor; 3. Moved PSVI-related code closer to each other to improve readability. Revision Changes Path 1.92 +94 -112 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.91 retrieving revision 1.92 diff -u -r1.91 -r1.92 --- XMLSchemaValidator.java 10 Sep 2002 17:08:00 -0000 1.91 +++ XMLSchemaValidator.java 12 Sep 2002 02:50:27 -0000 1.92 @@ -146,11 +146,8 @@ // Constants // private static final boolean DEBUG = false; - // feature identifiers - - protected static final String NAMESPACES = - Constants.SAX_FEATURE_PREFIX + Constants.NAMESPACES_FEATURE; + // feature identifiers /** Feature identifier: validation. */ protected static final String VALIDATION = @@ -221,7 +218,6 @@ /** Recognized features. */ private static final String[] RECOGNIZED_FEATURES = { VALIDATION, - NAMESPACES, SCHEMA_VALIDATION, DYNAMIC_VALIDATION, SCHEMA_FULL_CHECKING, @@ -240,17 +236,12 @@ // this is the number of valuestores of each kind // we expect an element to have. It's almost - // never > 1; so leave it at that. + // never > 1; so leave it at that. protected static final int ID_CONSTRAINT_NUM = 1; // // Data // - protected boolean fSeenRoot = false; - // features - // REVISIT: what does it mean if namespaces is off - // while schema validation is on? - protected boolean fNamespaces = false; /** PSV infoset information for element */ protected final ElementPSVImpl fElemPSVI = new ElementPSVImpl(); @@ -355,7 +346,7 @@ } /** Error reporter. */ - protected XSIErrorReporter fXSIErrorReporter = new XSIErrorReporter(); + protected final XSIErrorReporter fXSIErrorReporter = new XSIErrorReporter(); /** Entity resolver */ protected XMLEntityResolver fEntityResolver; @@ -373,7 +364,7 @@ protected Object fJaxpSchemaSource = null ; //ResourceIdentifier for use in calling EntityResolver - XMLResourceIdentifierImpl fResourceIdentifier = new XMLResourceIdentifierImpl(); + final XMLResourceIdentifierImpl fResourceIdentifier = new XMLResourceIdentifierImpl(); /** Schema Grammar Description passed, to give a chance to application to supply the Grammar */ protected final XSDDescription fXSDDescription = new XSDDescription() ; @@ -387,7 +378,7 @@ /** Document handler. */ protected XMLDocumentHandler fDocumentHandler; - + protected XMLDocumentSource fDocumentSource; // @@ -635,7 +626,7 @@ public void characters(XMLString text, Augmentations augs) throws XNIException { boolean emptyAug = false; - + if (fNormalizeData) { if (augs == null) { emptyAug = true; @@ -805,7 +796,7 @@ public boolean characterData(String data, Augmentations augs){ - // REVISIT: this methods basically duplicates implementation of + // REVISIT: this methods basically duplicates implementation of // handleCharacters(). We should be able to reuse some code boolean allWhiteSpace = true; @@ -842,7 +833,7 @@ } } - if (DEBUG) { + if (DEBUG) { System.out.println("==>characters("+data+")," +fCurrentType.getName()+","+mixed); } @@ -884,11 +875,11 @@ } return allWhiteSpace; } - + public void elementDefault(String data){ // no-op } - + // // XMLDocumentHandler and XMLDTDHandler methods @@ -1106,10 +1097,10 @@ /** notation value of the current element */ XSNotationDecl fNotation; - + /** notation stack */ XSNotationDecl[] fNotationStack = new XSNotationDecl[INITIAL_STACK_SIZE]; - + /** Current type. */ XSTypeDecl fCurrentType; @@ -1190,6 +1181,12 @@ // initialize the schema loader fSchemaLoader = new XMLSchemaLoader(fXSIErrorReporter.fErrorReporter, fGrammarBucket, fSubGroupHandler, fCMBuilder); + fValidationState.setNamespaceSupport(fNamespaceSupport); + fState4XsiType.setExtraChecking(false); + fState4XsiType.setNamespaceSupport(fNamespaceSupport); + fState4ApplyDefault.setFacetChecking(false); + fState4ApplyDefault.setNamespaceSupport(fNamespaceSupport); + } // <init>() /* @@ -1216,16 +1213,9 @@ SymbolTable symbolTable = (SymbolTable)componentManager.getProperty(SYMBOL_TABLE); if (symbolTable != fSymbolTable) { fSchemaLoader.setProperty(SYMBOL_TABLE, symbolTable); + fSymbolTable = symbolTable; } - fSymbolTable = symbolTable; - // sax features - try { - fNamespaces = componentManager.getFeature(NAMESPACES); - } - catch (XMLConfigurationException e) { - fNamespaces = true; - } try { fValidation = componentManager.getFeature(VALIDATION); } @@ -1273,21 +1263,20 @@ } fEntityResolver = (XMLEntityResolver)componentManager.getProperty(ENTITY_MANAGER); - fSchemaLoader.setEntityResolver(fEntityResolver); - + fSchemaLoader.setEntityResolver(fEntityResolver); + // initialize namespace support fNamespaceSupport.reset(); fPushForNextBinding = true; fValidationManager = (ValidationManager)componentManager.getProperty(VALIDATION_MANAGER); fValidationManager.addValidationState(fValidationState); - fValidationState.setNamespaceSupport(fNamespaceSupport); fValidationState.setSymbolTable(fSymbolTable); // get schema location properties try { fExternalSchemas = (String)componentManager.getProperty(SCHEMA_LOCATION); fExternalNoNamespaceSchema = (String)componentManager.getProperty(SCHEMA_NONS_LOCATION); - } + } catch (XMLConfigurationException e) { fExternalSchemas = null; fExternalNoNamespaceSchema = null; @@ -1296,7 +1285,7 @@ fSchemaLoader.setProperty(SCHEMA_NONS_LOCATION, fExternalNoNamespaceSchema); - try { + try { fJaxpSchemaSource = componentManager.getProperty(JAXP_SCHEMA_SOURCE); } catch (XMLConfigurationException e){ @@ -1307,7 +1296,7 @@ fResourceIdentifier.clear(); // clear grammars, and put the one for schema namespace there - try { + try { fGrammarPool = (XMLGrammarPool)componentManager.getProperty(XMLGRAMMAR_POOL); } catch (XMLConfigurationException e){ @@ -1365,15 +1354,8 @@ fMatcherStack.clear(); fBaseURI = null; - fState4XsiType.setExtraChecking(false); - fState4XsiType.setSymbolTable(symbolTable); fState4XsiType.setSymbolTable(symbolTable); - fState4XsiType.setNamespaceSupport(fNamespaceSupport); - - fState4ApplyDefault.setFacetChecking(false); fState4ApplyDefault.setSymbolTable(symbolTable); - fState4ApplyDefault.setSymbolTable(symbolTable); - fState4ApplyDefault.setNamespaceSupport(fNamespaceSupport); } // reset(XMLComponentManager) @@ -1460,7 +1442,7 @@ XSNotationDecl[] newArrayN = new XSNotationDecl[newSize]; System.arraycopy(fNotationStack, 0, newArrayN, 0, fElementDepth); fNotationStack = newArrayN; - + XSTypeDecl[] newArrayT = new XSTypeDecl[newSize]; System.arraycopy(fTypeStack, 0, newArrayT, 0, fElementDepth); fTypeStack = newArrayT; @@ -1650,7 +1632,7 @@ int leading = 0; int trailing = 0; int c; - int size = value.length(); + int size = value.length(); fNormalizedStr.setLength(0); for (int i = 0; i < size; i++) { c = value.charAt(i); @@ -1694,6 +1676,9 @@ if (fSkipValidationDepth >= 0) return; + // REVISIT: the same process needs to be performed as handleCharacters. + // only it's simpler here: we know all characters are whitespaces. + } // handleIgnorableWhitespace(XMLString) /** Handle element. */ @@ -1702,14 +1687,18 @@ if (DEBUG) { System.out.println("==>handleStartElement: " +element); } - // should really determine whether a null augmentation is to - // be returned on a case-by-case basis, rather than assuming - // this method will always produce augmentations... + if(augs == null) { augs = fAugmentations; augs.clear(); } + fCurrentPSVI = (ElementPSVImpl)augs.getItem(Constants.ELEMENT_PSVI); + if (fCurrentPSVI == null) { + fCurrentPSVI = fElemPSVI; + augs.putItem(Constants.ELEMENT_PSVI, fCurrentPSVI); + } + fCurrentPSVI.reset(); // we receive prefix binding events before this one, // so at this point, the prefix bindings for this element is done, @@ -1728,20 +1717,13 @@ // at this point we assume that no XML schemas found in the instance document // thus we will not validate in the case dynamic feature is on or we found dtd grammar fDoValidation = fValidation && !(fValidationManager.isGrammarFound() || fDynamicValidation); - + //store the external schema locations, these locations will be set at root element, so any other // schemaLocation declaration for the same namespace will be effectively ignored.. becuase we // choose to take first location hint available for a particular namespace. - storeLocations(fExternalSchemas, fExternalNoNamespaceSchema) ; + storeLocations(fExternalSchemas, fExternalNoNamespaceSchema) ; } - fCurrentPSVI = (ElementPSVImpl)augs.getItem(Constants.ELEMENT_PSVI); - if (fCurrentPSVI == null) { - fCurrentPSVI = fElemPSVI; - augs.putItem(Constants.ELEMENT_PSVI, fCurrentPSVI); - } - fCurrentPSVI.reset(); - // get xsi:schemaLocation and xsi:noNamespaceSchemaLocation attributes, // parse them to get the grammars @@ -1765,7 +1747,7 @@ fDoValidation = fValidation; } - + // update normalization flags if (fNormalizeData) { // reset values @@ -1792,7 +1774,7 @@ // error reported here (if any) is stored within the parent element's // context, instead of that of the current element. Object decl = null; - if (fSkipValidationDepth < 0 && fCurrentCM != null) { + if (fCurrentCM != null) { decl = fCurrentCM.oneTransition(element, fCurrCMState, fSubGroupHandler); // it could be an element decl or a wildcard decl if (fCurrCMState[0] == XSCMValidator.FIRST_ERROR && fDoValidation) { @@ -1824,8 +1806,8 @@ fStringContent[fElementDepth] = fSawCharacters; fSawChildrenStack[fElementDepth] = fSawChildren; } - - // increase the element depth after we've saved + + // increase the element depth after we've saved // all states for the parent element fElementDepth++; fCurrentElemDecl = null; @@ -1839,7 +1821,7 @@ fSawCharacters = false; fSawChildren = false; - // check what kind of declaration the "decl" from + // check what kind of declaration the "decl" from // oneTransition() maps to if (decl != null) { if (decl instanceof XSElementDecl) { @@ -2025,6 +2007,7 @@ if (DEBUG) { System.out.println("==>handleEndElement:" +element); } + if(augs == null) { // again, always assume adding augmentations... augs = fAugmentations; augs.clear(); @@ -2082,11 +2065,6 @@ return augs; } - fCurrentPSVI.fDeclaration = this.fCurrentElemDecl; - fCurrentPSVI.fTypeDecl = this.fCurrentType; - fCurrentPSVI.fNotation = this.fNotation; - fCurrentPSVI.fValidationContext = this.fValidationRoot; - // now validate the content of the element XMLString defaultValue = processElementContent(element); @@ -2129,20 +2107,6 @@ } fValueStoreCache.endElement(); - // PSVI: validation attempted - if (fElementDepth <= fPartialValidationDepth) { - // the element had child with a content skip. - fCurrentPSVI.fValidationAttempted = ElementPSVI.VALIDATION_PARTIAL; - if (fElementDepth == fPartialValidationDepth) { - // set depth to the depth of the parent - fPartialValidationDepth--; - } - } - else { - fCurrentPSVI.fValidationAttempted = ElementPSVI.VALIDATION_FULL; - } - - // decrease element depth and restore states fElementDepth--; // have we reached the end tag of the validation root? @@ -2159,7 +2123,7 @@ } } fValidationState.resetIDTables(); - + SchemaGrammar[] grammars = fGrammarBucket.getGrammars(); // return the final set of grammars validator ended up with if (fGrammarPool != null) { @@ -2185,6 +2149,24 @@ // discarded. fNamespaceSupport.popContext(); + fCurrentPSVI.fDeclaration = this.fCurrentElemDecl; + fCurrentPSVI.fTypeDecl = this.fCurrentType; + fCurrentPSVI.fNotation = this.fNotation; + fCurrentPSVI.fValidationContext = this.fValidationRoot; + + // PSVI: validation attempted + if (fElementDepth <= fPartialValidationDepth) { + // the element had child with a content skip. + fCurrentPSVI.fValidationAttempted = ElementPSVI.VALIDATION_PARTIAL; + if (fElementDepth == fPartialValidationDepth) { + // set depth to the depth of the parent + fPartialValidationDepth--; + } + } + else { + fCurrentPSVI.fValidationAttempted = ElementPSVI.VALIDATION_FULL; + } + // pop error reporter context: get all errors for the current // element, and remove them from the error list String[] errors = fXSIErrorReporter.popContext(); @@ -2193,7 +2175,7 @@ fCurrentPSVI.fErrorCodes = errors; // PSVI: validity fCurrentPSVI.fValidity = (errors == null) ? ElementPSVI.VALIDITY_VALID - : ElementPSVI.VALIDITY_INVALID; + : ElementPSVI.VALIDITY_INVALID; fDefaultValue = defaultValue; @@ -2285,13 +2267,12 @@ } if (grammar == null) { // try to parse the grammar using location hints from that namespace.. - fLocationPairs.put("", fNoNamespaceLocationArray); try { XMLInputSource xis = XMLSchemaLoader.resolveDocument(fXSDDescription, fLocationPairs, fEntityResolver); - grammar = fSchemaLoader.loadSchema(fXSDDescription, xis, fLocationPairs); + grammar = fSchemaLoader.loadSchema(fXSDDescription, xis, fLocationPairs); } catch (IOException ex) { fXSIErrorReporter.fErrorReporter.reportError(XSMessageFormatter.SCHEMA_DOMAIN, - "schema_reference.4", + "schema_reference.4", new Object[]{fXSDDescription.getLocationHints()[0]}, XMLErrorReporter.SEVERITY_WARNING); } @@ -2378,15 +2359,17 @@ void processAttributes(QName element, XMLAttributes attributes, XSAttributeGroupDecl attrGrp) { + if (DEBUG) { + System.out.println("==>processAttributes: " +attributes.getLength()); + } + // REVISIT: should we assume that XMLAttributeImpl removes // all augmentations from Augmentations? if yes.. we loose objects // if no - we always produce attribute psvi objects which may not be filled in // in this case we need to create/reset here all objects Augmentations augs = null; AttributePSVImpl attrPSVI = null; - if (DEBUG) { - System.out.println("==>processAttributes: " +attributes.getLength()); - } + for (int k=0;k<attributes.getLength();k++) { augs = attributes.getAugmentations(k); attrPSVI = (AttributePSVImpl) augs.getItem(Constants.ATTRIBUTE_PSVI); @@ -2399,7 +2382,7 @@ // PSVI attribute: validation context attrPSVI.fValidationContext = fValidationRoot; } - + // add default attributes if (attrGrp != null) { addDefaultAttributes(element, attributes, attrGrp); @@ -2421,13 +2404,13 @@ for (int index = 0; index < attCount; index++) { - if (DEBUG) { + if (DEBUG) { System.out.println("==>process attribute: "+fTempQName); } attributes.getName(index, fTempQName); // get attribute PSVI attrPSVI = (AttributePSVImpl)attributes.getAugmentations(index).getItem(Constants.ATTRIBUTE_PSVI); - + // for the 4 xsi attributes, get appropriate decl, and validate if (fTempQName.uri == SchemaSymbols.URI_XSI) { XSAttributeDecl attrDecl = null; @@ -2469,12 +2452,12 @@ // get the corresponding attribute decl for (int index = 0; index < attCount; index++) { attributes.getName(index, fTempQName); - if (DEBUG) { + if (DEBUG) { System.out.println("==>process attribute: "+fTempQName); } - // get attribute PSVI + // get attribute PSVI attrPSVI = (AttributePSVImpl)attributes.getAugmentations(index).getItem(Constants.ATTRIBUTE_PSVI); - + // for the 4 xsi attributes, get appropriate decl, and validate if (fTempQName.uri == SchemaSymbols.URI_XSI) { XSAttributeDecl attrDecl = null; @@ -2492,12 +2475,12 @@ continue; } } - + // for namespace attributes, no_validation/unknow_validity if (fTempQName.rawname == XMLSymbols.PREFIX_XMLNS || fTempQName.rawname.startsWith("xmlns:")) { continue; } - + // it's not xmlns, and not xsi, then we need to find a decl for it XSAttributeUseImpl currUse = null, oneUse; for (int i = 0; i < useCount; i++) { @@ -2569,7 +2552,7 @@ } } } - + processOneAttribute(element, attributes.getValue(index), currDecl, currUse, attrPSVI); } // end of for (all attributes) @@ -2592,16 +2575,16 @@ // 3 The item's normalized value must be locally valid with respect to that {type definition} as per String Valid (3.14.4). // get simple type XSSimpleType attDV = currDecl.fType; - + // PSVI: attribute declaration attrPSVI.fDeclaration = currDecl; // PSVI: attribute type attrPSVI.fTypeDecl = attDV; - + // PSVI: validation attempted: attrPSVI.fValidationAttempted = AttributePSVI.VALIDATION_FULL; attrPSVI.fValidity = AttributePSVI.VALIDITY_VALID; - + Object actualValue = null; try { actualValue = attDV.validate(attrValue, fValidationState, fValidatedInfo); @@ -2612,13 +2595,13 @@ attDV.getPrimitiveKind() == XSSimpleType.PRIMITIVE_NOTATION){ QName qName = (QName)actualValue; SchemaGrammar grammar = fGrammarBucket.getGrammar(qName.uri); - + //REVISIT: is it possible for the notation to be in different namespace than the attribute //with which it is associated, CHECK !! <fof n1:att1 = "n2:notation1" ..> // should we give chance to the application to be able to retrieve a grammar - nb //REVISIT: what would be the triggering component here.. if it is attribute value that // triggered the loading of grammar ?? -nb - + if (grammar != null) { fNotation = grammar.getGlobalNotationDecl(qName.localpart); fCurrentPSVI.fNotation = fNotation; @@ -2626,7 +2609,7 @@ } } catch (InvalidDatatypeValueException idve) { - + // PSVI: attribute is invalid, record errors attrPSVI.fValidity = AttributePSVI.VALIDITY_INVALID; attrPSVI.addErrorCode("cvc-attribute.3"); @@ -2638,20 +2621,20 @@ // because it might still be useful to the user. But when the it's // not valid, the normalized value is not trustable. attrPSVI.fNormalizedValue = fValidatedInfo.normalizedValue; - + // get the value constraint from use or decl // 4 The item's actual value must match the value of the {value constraint}, if it is present and fixed. // now check the value against the simpleType if (actualValue != null && currDecl.getConstraintType() == XSConstants.VC_FIXED) { if (!attDV.isEqual(actualValue, currDecl.fDefault.actualValue)){ - + // PSVI: attribute is invalid, record errors attrPSVI.fValidity = AttributePSVI.VALIDITY_INVALID; attrPSVI.addErrorCode("cvc-attribute.4"); reportSchemaError("cvc-attribute.4", new Object[]{element.rawname, fTempQName.rawname, attrValue}); } } - + // 3.1 If there is among the {attribute uses} an attribute use with an {attribute declaration} whose {name} matches the attribute information item's [local name] and whose {target namespace} is identical to the attribute information item's [namespace name] (where an absent {target namespace} is taken to be identical to a [namespace name] with no value), then the attribute information must be valid with respect to that attribute use as per Attribute Locally Valid (Use) (3.5.4). In this case the {attribute declaration} of that attribute use is the context-determined declaration for the attribute information item with respect to Schema-Validity Assessment (Attribute) (3.2.4) and Assessment Outcome (Attribute) (3.2.5). if (actualValue != null && currUse != null && currUse.fConstraintType == XSConstants.VC_FIXED) { @@ -2663,7 +2646,7 @@ } } } - + void addDefaultAttributes(QName element, XMLAttributes attributes, XSAttributeGroupDecl attrGrp) { // Check after all specified attrs are scanned // (1) report error for REQUIRED attrs that are missing (V_TAGc) @@ -3521,8 +3504,8 @@ /** stores all global Values stores. */ protected final Vector fValueStores = new Vector(); - /** - * Values stores associated to specific identity constraints. + /** + * Values stores associated to specific identity constraints. * This hashtable maps IdentityConstraints and * the 0-based element on which their selectors first matched to * a corresponding ValueStore. This should take care @@ -3591,7 +3574,7 @@ Hashtable oldMap = (Hashtable)fGlobalMapStack.pop(); // return if there is no element if (oldMap == null) return; - + Enumeration keys = oldMap.keys(); while (keys.hasMoreElements()) { IdentityConstraint id = (IdentityConstraint)keys.nextElement(); @@ -3602,7 +3585,6 @@ fGlobalIDConstraintMap.put(id, oldVal); else { currVal.append(oldVal); - fGlobalIDConstraintMap.put(id, currVal); } } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]