[
https://issues.apache.org/jira/browse/XERCESJ-1462?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Michael Glavassevich updated XERCESJ-1462:
------------------------------------------
Fix Version/s: (was: 2.11.0)
> When Reusing an XMLGrammarPool and reusing a validating XMLDocumentParser,
> parsing will fail on consecutive documents using different Schemas
> ---------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: XERCESJ-1462
> URL: https://issues.apache.org/jira/browse/XERCESJ-1462
> Project: Xerces2-J
> Issue Type: Bug
> Components: JAXP (javax.xml.validation)
> Affects Versions: 2.10.0
> Environment: N/A
> Reporter: Philip Arickx
> Original Estimate: 0.5h
> Remaining Estimate: 0.5h
>
> The issue is triggered with the following sequence :
> * Create an XML11Xonfiguration()
> * Set the config to validating
> * Create an XMLGrammarPoolImpl()
> * Set the "http://apache.org/xml/properties/internal/grammar-pool" to the pool
> * Create a parser with the config
> * Parse a document referring to a schema
> * Parse a second document referring to a different schema, using the same
> parser
> This will fail, specifying that it cannot find the element.
> The reason is the XMLSchemaValidator findSchemaGrammar() method.
> At line 2632, the GrammarPool, if one is configured, is asked for the schema.
> The problem is that the fXSDDescription object for a second parse at this
> point is still identical to what it was at the end of the first parse. In
> other words, it refers to the schema that was used on the first parse. This
> schema is retrieved, and the new document is validated against the old schema.
> To fix this, lines 2652 - 2670 should be moved and inserted after line 2629.
> This ensures that the fXSDDescription is updated with the current schema
> information before interrogating the GrammarPool.
> ----------------------
> The following test case + xml documents illustrates the issue.
> ====== Test Case Output ======
> Doc 1 Parsed
> :file:/D:/RX/Perforce/arickp_Solor/XDB_10.1/test2.xml:file:/D:/RX/Perforce/arickp_Solor/XDB_10.1/test2.xml:file:/D:/RX/Perforce/arickp_Solor/XDB_10.1/test2.xml:3:44:143:cvc-elt.1.a:
> Cannot find the declaration of element 'root2'.
> at
> org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:374)
> at
> org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:325)
> at
> org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:282)
> [...]
> ====== Test Case Code ======
> public class ParserTest {
> @Test
> public void testParser() {
> CountingErrorHandler errorHandler = new CountingErrorHandler();
> XMLParserConfiguration parserConfig = new XML11Configuration();
> parserConfig.setErrorHandler(errorHandler);
> XMLDocumentParser parser = new XMLDocumentParser(parserConfig);
> parserConfig.setFeature("http://xml.org/sax/features/validation", true);
>
> parserConfig.setFeature("http://apache.org/xml/features/validation/schema",
> true);
>
> parserConfig.setFeature("http://apache.org/xml/features/validation/schema/normalized-value",
> false);
> XMLGrammarPool pool = new XMLGrammarPoolImpl();
>
> parserConfig.setProperty("http://apache.org/xml/properties/internal/grammar-pool",
> pool);
> try {
> File file1 = new File("test1.xml");
> URL url1 = file1.toURI().toURL();
> XMLInputSource source1 = new XMLInputSource(null, url1.toString(),
> null);
> parser.parse(source1);
> System.out.println("Doc 1 Parsed");
> File file2 = new File("test2.xml");
> URL url2 = file2.toURI().toURL();
> XMLInputSource source2 = new XMLInputSource(null, url2.toString(),
> null);
> parser.parse(source2);
> System.out.println("Doc 2 Parsed");
> assertEquals(
> "Found " + errorHandler.getWarningCount() + " warnings, " +
> errorHandler.getErrorCount()
> + " errors, " + errorHandler.getFatalErrorCount() + " fatal
> errors", 0,
> errorHandler.getTotalCount());
> } catch (IOException ioe) {
> ioe.printStackTrace();
> fail("Test failed with unexpected IO exception : " + ioe.getMessage());
> } catch (XNIException xnie) {
> xnie.printStackTrace();
> fail("Test failed with unexpected XNI exception : " +
> xnie.getMessage());
> }
> }
> public class CountingErrorHandler implements XMLErrorHandler {
> private int warningCount;
> private int errorCount;
> private int fatalErrorCount;
> @Override
> public void warning(String domain, String key, XMLParseException
> exception) throws XNIException {
> warningCount++;
> throw exception;
> }
> @Override
> public void fatalError(String domain, String key, XMLParseException
> exception)
> throws XNIException {
> fatalErrorCount++;
> throw exception;
> }
> @Override
> public void error(String domain, String key, XMLParseException exception)
> throws XNIException {
> errorCount++;
> throw exception;
> }
> public int getTotalCount() {
> return warningCount + errorCount + fatalErrorCount;
> }
> public int getWarningCount() {
> return warningCount;
> }
> public int getErrorCount() {
> return errorCount;
> }
> public int getFatalErrorCount() {
> return fatalErrorCount;
> }
> }
> }
> ====== test1.xml ======
> <?xml version="1.0" encoding="UTF-8"?>
> <root1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:noNamespaceSchemaLocation='test1.xsd'>
> <el1>hello</el1>
> <el1>world</el1>
> </root1>
> ====== test1.xsd ======
> <?xml version="1.0" encoding="UTF-8"?>
> <xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
> <xsd:element name="root1">
> <xsd:complexType>
> <xsd:sequence>
> <xsd:element ref="el1" minOccurs='1'
> maxOccurs='unbounded' />
> </xsd:sequence>
> </xsd:complexType>
> </xsd:element>
> <xsd:element name="el1" type='xsd:string' />
> </xsd:schema>
> ====== test2.xml ======
> <?xml version="1.0" encoding="UTF-8"?>
> <root2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:noNamespaceSchemaLocation='test2.xsd'>
> <el2>hello</el2>
> <el2>world</el2>
> </root2>
> ====== test2.xsd ======
> <?xml version="1.0" encoding="UTF-8"?>
> <xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
> <xsd:element name="root2">
> <xsd:complexType>
> <xsd:sequence>
> <xsd:element ref="el2" minOccurs='1'
> maxOccurs='unbounded' />
> </xsd:sequence>
> </xsd:complexType>
> </xsd:element>
> <xsd:element name="el2" type='xsd:string' />
> </xsd:schema>
--
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: [email protected]
For additional commands, e-mail: [email protected]