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>");


Reply via email to