Return-Path: Delivered-To: apmail-tuscany-commits-archive@www.apache.org Received: (qmail 98383 invoked from network); 9 Sep 2009 16:31:15 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 9 Sep 2009 16:31:15 -0000 Received: (qmail 1074 invoked by uid 500); 9 Sep 2009 16:31:15 -0000 Delivered-To: apmail-tuscany-commits-archive@tuscany.apache.org Received: (qmail 1041 invoked by uid 500); 9 Sep 2009 16:31:15 -0000 Mailing-List: contact commits-help@tuscany.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@tuscany.apache.org Delivered-To: mailing list commits@tuscany.apache.org Received: (qmail 1032 invoked by uid 99); 9 Sep 2009 16:31:15 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 09 Sep 2009 16:31:15 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 09 Sep 2009 16:31:07 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 54A8723888E9; Wed, 9 Sep 2009 16:30:46 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r813042 - in /tuscany/java/sca/modules/common-xml/src: main/java/org/apache/tuscany/sca/common/xml/xpath/ test/java/org/apache/tuscany/sca/common/xml/xpath/ Date: Wed, 09 Sep 2009 16:30:46 -0000 To: commits@tuscany.apache.org From: rfeng@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090909163046.54A8723888E9@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: rfeng Date: Wed Sep 9 16:30:45 2009 New Revision: 813042 URL: http://svn.apache.org/viewvc?rev=813042&view=rev Log: Fix the calculation of prefixes and add a test case Added: tuscany/java/sca/modules/common-xml/src/test/java/org/apache/tuscany/sca/common/xml/xpath/ tuscany/java/sca/modules/common-xml/src/test/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelperTestCase.java (with props) Modified: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelper.java Modified: tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelper.java URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelper.java?rev=813042&r1=813041&r2=813042&view=diff ============================================================================== --- tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelper.java (original) +++ tuscany/java/sca/modules/common-xml/src/main/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelper.java Wed Sep 9 16:30:45 2009 @@ -62,14 +62,27 @@ public XPath newXPath() { return factory.newXPath(); } - + public XPathExpression compile(NamespaceContext context, String expression) throws XPathExpressionException { XPath path = newXPath(); - path.setNamespaceContext(getNamespaceContext(expression, context)); + context = getNamespaceContext(expression, context); + return compile(path, context, expression); + } + + public XPathExpression compile(XPath path, NamespaceContext context, String expression) + throws XPathExpressionException { + path.setNamespaceContext(context); return path.compile(expression); } - private NamespaceContext getNamespaceContext(String expression, NamespaceContext context) { + /** + * Take a snapshot of the given namespace context based on the prefixes found in the expression. + * In StAX, the prefix/namespace mapping in the namespace context can change as the event moves + * @param expression + * @param context + * @return + */ + public NamespaceContext getNamespaceContext(String expression, NamespaceContext context) { NamespaceContextImpl nsContext = new NamespaceContextImpl(null); for (String prefix : getPrefixes(expression)) { @@ -81,6 +94,11 @@ return nsContext; } + /** + * Parse the XPath expression to collect all the prefixes for namespaces + * @param expression + * @return A collection of prefixes + */ private Collection getPrefixes(String expression) { List prefixes = new ArrayList(); prefixes.add(""); @@ -95,14 +113,12 @@ if (XMLCharHelper.isNCName(prefix.charAt(j))) { continue; } - j--; break; } + // j is before the first char of the prefix if (j != (prefix.length() - 1) && XMLCharHelper.isNCNameStart(prefix.charAt(j + 1))) { prefixes.add(prefix.substring(j + 1)); } - break; - } return prefixes; } Added: tuscany/java/sca/modules/common-xml/src/test/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelperTestCase.java URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/common-xml/src/test/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelperTestCase.java?rev=813042&view=auto ============================================================================== --- tuscany/java/sca/modules/common-xml/src/test/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelperTestCase.java (added) +++ tuscany/java/sca/modules/common-xml/src/test/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelperTestCase.java Wed Sep 9 16:30:45 2009 @@ -0,0 +1,120 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.common.xml.xpath; + +import javax.xml.stream.XMLStreamReader; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; + +import org.apache.tuscany.sca.common.xml.dom.DOMHelper; +import org.apache.tuscany.sca.common.xml.stax.StAXHelper; +import org.apache.tuscany.sca.core.DefaultExtensionPointRegistry; +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * + */ +public class XPathHelperTestCase { + private static XPathHelper xpathHelper; + private static StAXHelper staxHelper; + private static DOMHelper domHelper; + + private static String XML = + "" + "" + + "" + + "" + + ""; + + private static String XPATH = + "" + ""; + + /** + * @throws java.lang.Exception + */ + @BeforeClass + public static void setUpBeforeClass() throws Exception { + ExtensionPointRegistry registry = new DefaultExtensionPointRegistry(); + xpathHelper = XPathHelper.getInstance(registry); + domHelper = DOMHelper.getInstance(registry); + staxHelper = StAXHelper.getInstance(registry); + } + + @Test + public void testNewXPath() { + XPath path = xpathHelper.newXPath(); + Assert.assertNotNull(path); + } + + @Test + public void testCompile() throws Exception { + XMLStreamReader reader = staxHelper.createXMLStreamReader(XPATH); + reader.nextTag(); + String xpath = reader.getAttributeValue(null, "attachTo"); + XPathExpression expression = xpathHelper.compile(reader.getNamespaceContext(), xpath); + // Advance the reader so that the namespace context changes its prefix/namespace mapping + reader.nextTag(); + reader.close(); + + Document doc = domHelper.load(XML); + NodeList nodes = (NodeList)expression.evaluate(doc, XPathConstants.NODESET); + Assert.assertEquals(1, nodes.getLength()); + Node node = nodes.item(0); + Assert.assertTrue(node instanceof Element); + Assert.assertEquals(node.getNodeName(), "c:child1"); + } + + @Test + public void testCompile2() throws Exception { + XMLStreamReader reader = staxHelper.createXMLStreamReader(XPATH); + reader.nextTag(); + String xpathExp = reader.getAttributeValue(null, "attachTo"); + XPath xpath = xpathHelper.newXPath(); + // Compile the expression without taking a snapshot of the namespace context + XPathExpression expression = xpathHelper.compile(xpath, reader.getNamespaceContext(), xpathExp); + // Advance the reader so that the namespace context changes its prefix/namespace mapping + reader.nextTag(); + reader.close(); + + Document doc = domHelper.load(XML); + NodeList nodes = (NodeList)expression.evaluate(doc, XPathConstants.NODESET); + Assert.assertEquals(1, nodes.getLength()); + Node node = nodes.item(0); + Assert.assertTrue(node instanceof Element); + Assert.assertEquals(node.getNodeName(), "c:child1"); + } + + /** + * @throws java.lang.Exception + */ + @AfterClass + public static void tearDownAfterClass() throws Exception { + xpathHelper = null; + } + +} Propchange: tuscany/java/sca/modules/common-xml/src/test/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelperTestCase.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tuscany/java/sca/modules/common-xml/src/test/java/org/apache/tuscany/sca/common/xml/xpath/XPathHelperTestCase.java ------------------------------------------------------------------------------ svn:keywords = Rev Date