[338494] [xpath2] prohibiting xpath expressions starting with / or // to be parsed
diff --git a/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/AbstractPsychoPathTest.java b/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/AbstractPsychoPathTest.java index bdf94bb..73586b5 100644 --- a/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/AbstractPsychoPathTest.java +++ b/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/AbstractPsychoPathTest.java
@@ -15,6 +15,7 @@ * Jesper S Moller - bug 275610 - Avoid big time and memory overhead for externals * Jesper Steen Moeller - bug 282096 - make test harness handle all string encoding * Jesper Steen Moller - bug 280555 - Add pluggable collation support + * Mukul Gandhi - bug 338494 - prohibiting xpath expressions starting with / or // to be parsed. *******************************************************************************/ package org.eclipse.wst.xml.xpath2.processor.test; @@ -277,8 +278,7 @@ dynamicContext.add_namespace(null, uri); } - protected XPath compileXPath(DynamicContext dc, String xpath) - throws XPathParserException, StaticError { + protected XPath compileXPath(DynamicContext dc, String xpath) throws XPathParserException, StaticError { XPathParser xpp = new JFlexCupParser(); XPath path = xpp.parse(xpath); @@ -286,6 +286,21 @@ name_check.check(path); return path; } + + protected XPath compileXPath(DynamicContext dc, String xpath, boolean isRootlessAccess) throws XPathParserException, StaticError { + XPathParser xpp = new JFlexCupParser(); + XPath path = null; + if (isRootlessAccess) { + path = xpp.parse(xpath, isRootlessAccess); + } + else { + path = xpp.parse(xpath); + } + + StaticChecker name_check = new StaticNameResolver(dc); + name_check.check(path); + return path; + } protected String getExpectedResult(String xqFile) { return getExpectedResult(xqFile, true);
diff --git a/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/TestBugs.java b/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/TestBugs.java index 04617c7..ad647c5 100644 --- a/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/TestBugs.java +++ b/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/TestBugs.java
@@ -49,7 +49,8 @@ * an user-defined variable. * Mukul Gandhi - bug 334478 implementation of xs:token data type * Mukul Gandhi - bug 334842 - improving support for the data types Name, NCName, ENTITY, - * ID, IDREF and NMTOKEN. + * ID, IDREF and NMTOKEN. + * Mukul Gandhi - bug 338494 - prohibiting xpath expressions starting with / or // to be parsed. *******************************************************************************/ package org.eclipse.wst.xml.xpath2.processor.test; @@ -70,6 +71,7 @@ import org.eclipse.wst.xml.xpath2.processor.Evaluator; import org.eclipse.wst.xml.xpath2.processor.ResultSequence; import org.eclipse.wst.xml.xpath2.processor.ResultSequenceFactory; +import org.eclipse.wst.xml.xpath2.processor.XPathParserException; import org.eclipse.wst.xml.xpath2.processor.ast.XPath; import org.eclipse.wst.xml.xpath2.processor.internal.types.QName; import org.eclipse.wst.xml.xpath2.processor.internal.types.XSBoolean; @@ -97,6 +99,7 @@ } + public void testNamesWhichAreKeywords() throws Exception { // Bug 273719 URL fileURL = bundle.getEntry("/bugTestFiles/bug311480.xml"); @@ -2038,6 +2041,113 @@ assertEquals("true", result.string_value()); } + public void testBugXX() throws Exception { + bundle = Platform.getBundle("org.w3c.xqts.testsuite"); + URL fileURL = bundle.getEntry("/TestSources/emptydoc.xml"); + loadDOMDocument(fileURL); + + // Get XML Schema Information for the Document + XSModel schema = getGrammar(); + + // set up XPath default namespace in Dynamic Context + DynamicContext dc = setupDynamicContext(schema); + dc.set_variable(new QName("value"), new XSString("2.5")); + addXPathDefaultNamespace("http://www.w3.org/2001/XMLSchema"); + + String xpath = "$value castable as double"; + XPath path = compileXPath(dc, xpath); + + Evaluator eval = new DefaultEvaluator(dc, null); + ResultSequence rs = eval.evaluate(path); + + XSBoolean result = (XSBoolean) rs.first(); + + String actual = result.string_value(); + + assertEquals("true", actual); + } + + public void testExprParsingBeginnigWithRootNode_bugXX() throws Exception { + // Bug ?? + bundle = Platform.getBundle("org.w3c.xqts.testsuite"); + URL fileURL = bundle.getEntry("/TestSources/emptydoc.xml"); + loadDOMDocument(fileURL); + + // Get XML Schema Information for the Document + XSModel schema = getGrammar(); + + DynamicContext dc = setupDynamicContext(schema); + + // test a) + String xpath = "/x"; + XPath path = null; + try { + path = compileXPath(dc, xpath, true); + // test fails + assertTrue(false); + } + catch(XPathParserException ex) { + if ("Expression starts with / or //".equals(ex.getMessage())) { + // test passes + assertTrue(true); + } + } + + // test b) + xpath = "//x"; + try { + path = compileXPath(dc, xpath, true); + // test fails + assertTrue(false); + } + catch(XPathParserException ex) { + if ("Expression starts with / or //".equals(ex.getMessage())) { + // test passes + assertTrue(true); + } + } + + // test c) + xpath = "/"; + try { + path = compileXPath(dc, xpath, true); + // test fails + assertTrue(false); + } + catch(XPathParserException ex) { + if ("Expression starts with / or //".equals(ex.getMessage())) { + // test passes + assertTrue(true); + } + } + + // test d) + xpath = "x/y[/a]"; + try { + path = compileXPath(dc, xpath, true); + // test fails + assertTrue(false); + } + catch(XPathParserException ex) { + if ("Expression starts with / or //".equals(ex.getMessage())) { + // test passes + assertTrue(true); + } + } + + // test e) + xpath = ".//x"; + try { + path = compileXPath(dc, xpath, true); + // test passes + assertTrue(true); + } + catch(XPathParserException ex) { + // test fails + assertTrue(false); + } + } + private CollationProvider createLengthCollatorProvider() { return new CollationProvider() { @SuppressWarnings("unchecked")