[ 
https://issues.apache.org/jira/browse/XERCESJ-1130?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13047920#comment-13047920
 ] 

Martin Vanek commented on XERCESJ-1130:
---------------------------------------

2.11.0 and it still does not work :(

> Cannot validate against multiple XML schemas within the same namespace
> ----------------------------------------------------------------------
>
>                 Key: XERCESJ-1130
>                 URL: https://issues.apache.org/jira/browse/XERCESJ-1130
>             Project: Xerces2-J
>          Issue Type: Bug
>          Components: XML Schema 1.0 Structures
>    Affects Versions: 2.7.1
>         Environment: All platforms
>            Reporter: Sunitha
>
> The javax.xml.validation.SchemaFactory.newSchema method can take an array of 
> schema sources and construct a composite schema. Unfortunately, this does not 
> work if the schema are in the same namespace. When the schema are in the same 
> namespace, only the first schema is used.
> The bug is caused by the computation of the hashcode for a grammar in the 
> grammar cache. The hashcode is computed based only on the namespace of a 
> grammar (i.e. schema file). Thus if multiple schemas are specified from the 
> same namespace, they will all hash to the same code and only the first will 
> be cached and returned for all subsequent caching attempts.
> If each schema is in a separate namespace, the newSchema method works 
> properly. Effectively, the assumption that was made in the code was that 
> there will only be a single schema per namespace. This is an incorrect 
> assumption.
> One of the more major implications of this bug is that the XML Schema 
> "include" element can never work since by definition, included schemas must 
> be in the same namespace. Because of this bug, inclusion can only be done 
> using the "import" element since it supports different namespaces.
> STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
> 1. Create a sample XML file called test.xml
> 2. Create a schema for the test file but split it between two schema files: 
> schema1.xsd and schema2.xsd
> 3. Create a java class that uses SAX (DOM shows the same problem) to parse 
> the file and extends defaultHandler.
> 4. Call the SchemaFactory.newSchema method with a source array containing 
> schema1.xsd and schema2.xsd.
> 5. Set the resulting schema on the parser
> 6. Implement an error method in the class
> 7. Run the program and observe that there is a validation failure. This is 
> becuase the second schema in the array was never processed and so the 
> validator does not accept the test XML file.
> The source code, test XML file, and schemas are included in this bug report.
> EXPECTED VERSUS ACTUAL BEHAVIOR :
> EXPECTED -
> The test XML file should have validated properly against the composite schema.
> ACTUAL -
> There was a validation failure. This is becuase the second schema in the 
> array was never processed and so the validator does not accept the test XML 
> file.
> ERROR MESSAGES/STACK TRACES THAT OCCUR :
> SAX Error: http://www.w3.org/TR/xml-schema-1#cvc-elt.1?root
> REPRODUCIBILITY :
> This bug can be reproduced always.
> ---------- BEGIN SOURCE ----------
> ------------- schemaTest.java ----------------------------
> import org.xml.sax.Attributes;
> import org.xml.sax.SAXException;
> import org.xml.sax.SAXParseException;
> import org.xml.sax.helpers.DefaultHandler;
> public class SchemaTest extends DefaultHandler {
> public static void main(String[] args)
> {
>     try {
>         FileInputStream is = new FileInputStream("test.xml");
>         
>         StreamSource[] sources = new StreamSource[2];
>         FileInputStream ss = new FileInputStream("schema2.xsd");
>         sources[0] = new StreamSource(ss);
>         ss = new FileInputStream("schema1.xsd");
>         sources[1] = new StreamSource(ss);
>         
>         SchemaFactory schemaFactory =
>             SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
>         Schema schema = schemaFactory.newSchema(sources);
>         
>         SAXParserFactory saxFactory = SAXParserFactory.newInstance();
>         saxFactory.setNamespaceAware(true);
>         saxFactory.setValidating(false);
>         saxFactory.setXIncludeAware(true);
>         saxFactory.setSchema(schema);
>         
>         SAXParser parser = saxFactory.newSAXParser();
>         parser.parse(is, new SchemaTest());
>     }
>     catch (FileNotFoundException e) {
>         e.printStackTrace();
>     }
>     catch (SAXException e) {
>         e.printStackTrace();
>     }
>     catch (ParserConfigurationException e) {
>         e.printStackTrace();
>     }
>     catch (IOException e) {
>         e.printStackTrace();
>     }
> }
> /**
>  * @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException)
>  */
> public void warning(SAXParseException e) throws SAXException
> {
>     System.err.println("SAX Warning: " + e.getLocalizedMessage());
> }
> /**
>  * @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException)
>  */
> public void error(SAXParseException e) throws SAXException
> {
>     System.err.println("SAX Error: " + e.getLocalizedMessage());
> }
> /**
>  * @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException)
>  */
> public void fatalError(SAXParseException e) throws SAXException
> {
>     System.err.println("SAX Fatal Error: " + e.getLocalizedMessage());
> }
> /**
>  * @see org.xml.sax.ContentHandler#startElement(java.lang.String, 
> java.lang.String, java.lang.String, org.xml.sax.Attributes)
>  */
> public void startElement(String uri, String localName, String qName,
>         Attributes attributes) throws SAXException
> {
>     System.out.println("Start element: " + localName);
> }
> /**
>  * @see org.xml.sax.ContentHandler#endElement(java.lang.String, 
> java.lang.String, java.lang.String)
>  */
> public void endElement(String uri, String localName, String qName)
>         throws SAXException
> {
>     System.out.println("End element: " + localName);
> }
> } // End of class SchemaTest
> -------------------- test.xml -------------------------
> <?xml version="1.0"?>
> <root>
>     <elem1 value="abc"/>
> </root>
> ---------------- schema1.xsd ------------------------
> <?xml version="1.0" encoding="UTF-8"?>
> <xs:schema elementFormDefault="qualified" xml:lang="EN" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema";>
>     
>     <xs:include schemaLocation="schema2.xsd"/>
>       
>     <xs:element name="root">
>         <xs:complexType>
>             <xs:all>
>                 <xs:element ref="elem1" minOccurs="0"/>
>             </xs:all>
>         </xs:complexType>
>     </xs:element>
>     <xs:element name="elem1">
>         <xs:complexType>
>             <xs:attribute name="value" type="ValueType" use="required"/>
>         </xs:complexType>
>     </xs:element>
> </xs:schema>
> --------------------- schema2.xsd ------------------------------
> <?xml version="1.0" encoding="UTF-8"?>
> <xs:schema elementFormDefault="qualified" xml:lang="EN" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema";>
>     <xs:simpleType name="ValueType">
>       <xs:restriction base="xs:string">
>         <xs:enumeration value="abc"/>
>         <xs:enumeration value="def"/>
>       </xs:restriction>
>     </xs:simpleType>
> </xs:schema>
> ---------- END SOURCE ----------

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

---------------------------------------------------------------------
To unsubscribe, e-mail: j-dev-unsubscr...@xerces.apache.org
For additional commands, e-mail: j-dev-h...@xerces.apache.org

Reply via email to