You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-dev@xerces.apache.org by "Sunitha (JIRA)" <xe...@xml.apache.org> on 2006/01/19 14:29:42 UTC

[jira] Created: (XERCESJ-1130) Cannot validate against multiple XML schemas within the same namespace

Cannot validate against multiple XML schemas within the same namespace
----------------------------------------------------------------------

         Key: XERCESJ-1130
         URL: http://issues.apache.org/jira/browse/XERCESJ-1130
     Project: Xerces2-J
        Type: Bug
  Components: XML Schema Structures  
    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.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


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


[jira] Commented: (XERCESJ-1130) Cannot validate against multiple XML schemas within the same namespace

Posted by "JJC (JIRA)" <xe...@xml.apache.org>.
    [ https://issues.apache.org/jira/browse/XERCESJ-1130?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12868463#action_12868463 ] 

JJC commented on XERCESJ-1130:
------------------------------

Is this problem going to be fixed? 

Is there a workaround for this?

> 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.
-
You can reply to this email to add a comment to the issue online.


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


[jira] Commented: (XERCESJ-1130) Cannot validate against multiple XML schemas within the same namespace

Posted by "Henrik Segesten (JIRA)" <xe...@xml.apache.org>.
    [ https://issues.apache.org/jira/browse/XERCESJ-1130?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12699179#action_12699179 ] 

Henrik Segesten commented on XERCESJ-1130:
------------------------------------------

Hi

No activity for almost three years :(
Anyone has any news of it?

Greetings
Henrik

> 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.
-
You can reply to this email to add a comment to the issue online.


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