Author: asankha
Date: Wed Jul 9 18:43:31 2008
New Revision: 675403
URL: http://svn.apache.org/viewvc?rev=675403&view=rev
Log:
Support String XPath expressions at API level (e.g. for class mediator instance
properties etc) that includes namespaces i.e. of the form
"$body/{http://somens}SomeElement"
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPath.java
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/SynapseXPathTest.java
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPath.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPath.java?rev=675403&r1=675402&r2=675403&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPath.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPath.java
Wed Jul 9 18:43:31 2008
@@ -32,7 +32,7 @@
import org.jaxen.*;
import org.jaxen.util.SingletonList;
-import java.util.List;
+import java.util.*;
/**
* <p>XPath that has been used inside Synapse xpath processing. This has a
extension function named
@@ -90,6 +90,44 @@
super(xpathString);
}
+ public static SynapseXPath parseXPathString(String xPathStr) throws
JaxenException {
+ if (xPathStr.indexOf('{') == -1) {
+ return new SynapseXPath(xPathStr);
+ }
+
+ int count = 0;
+ StringBuffer newXPath = new StringBuffer();
+
+ Map<String, String> nameSpaces = new HashMap<String, String>();
+ String curSegment = null;
+ boolean xPath = false;
+
+ StringTokenizer st = new StringTokenizer(xPathStr, "{}", true);
+ while (st.hasMoreTokens()) {
+ String s = st.nextToken();
+ if ("{".equals(s)) {
+ xPath = true;
+ } else if ("}".equals(s)) {
+ xPath = false;
+ String prefix = "rp" + count++;
+ nameSpaces.put(prefix, curSegment);
+ newXPath.append(prefix + ":");
+ } else {
+ if (xPath) {
+ curSegment = s;
+ } else {
+ newXPath.append(s);
+ }
+ }
+ }
+
+ SynapseXPath synXPath = new SynapseXPath(newXPath.toString());
+ for (String prefix : nameSpaces.keySet()) {
+ synXPath.addNamespace(prefix, nameSpaces.get(prefix));
+ }
+ return synXPath;
+ }
+
/**
* <P>Evaluates the XPath expression against the MessageContext of the
current message and
* returns a String representation of the result</p>
Modified:
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/SynapseXPathTest.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/SynapseXPathTest.java?rev=675403&r1=675402&r2=675403&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/SynapseXPathTest.java
(original)
+++
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/SynapseXPathTest.java
Wed Jul 9 18:43:31 2008
@@ -40,6 +40,18 @@
String message = "This is XPath test";
+ public void testStringXPath() throws Exception {
+ SynapseXPath xpath =
SynapseXPath.parseXPathString("$body//{http://somens}test");
+ MessageContext ctx = TestUtils.getTestContext("<m0:test
xmlns:m0=\"http://somens\">" + message + "</m0:test>");
+ assertEquals(message, xpath.stringValueOf(ctx));
+ }
+
+ public void testStringXPath2() throws Exception {
+ SynapseXPath xpath =
SynapseXPath.parseXPathString("$body//{http://somens}test/{http://someother}another");
+ MessageContext ctx = TestUtils.getTestContext("<m0:test
xmlns:m0=\"http://somens\"><m1:another xmlns:m1=\"http://someother\">" +
message + "</m1:another></m0:test>");
+ assertEquals(message, xpath.stringValueOf(ctx));
+ }
+
public void testAbsoluteXPath() throws Exception {
SynapseXPath xpath = new SynapseXPath("//test");
MessageContext ctx = TestUtils.getTestContext("<test>" + message +
"</test>");