You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by js...@apache.org on 2007/10/12 10:45:06 UTC

svn commit: r584100 - in /activemq/camel/trunk: camel-core/src/main/java/org/apache/camel/model/language/ camel-core/src/test/java/org/apache/camel/processor/ components/camel-spring/src/main/java/org/apache/camel/spring/handler/

Author: jstrachan
Date: Fri Oct 12 01:45:04 2007
New Revision: 584100

URL: http://svn.apache.org/viewvc?rev=584100&view=rev
Log:
fix for https://issues.apache.org/activemq/browse/CAMEL-143 to configure namespaces for XPath expressions

Modified:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/ExpressionType.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XPathExpression.java
    activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/XPathFilterTest.java
    activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/ExpressionType.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/ExpressionType.java?rev=584100&r1=584099&r2=584100&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/ExpressionType.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/ExpressionType.java Fri Oct 12 01:45:04 2007
@@ -87,11 +87,12 @@
         return "";
     }
 
-    public Predicate<Exchange> createPredicate(RouteContext route) {
+    public Predicate<Exchange> createPredicate(RouteContext routeContext) {
         if (predicate == null) {
-            CamelContext camelContext = route.getCamelContext();
+            CamelContext camelContext = routeContext.getCamelContext();
             Language language = camelContext.resolveLanguage(getLanguage());
             predicate = language.createPredicate(getExpression());
+            configurePredicate(routeContext, predicate);
         }
         return predicate;
     }
@@ -101,6 +102,7 @@
             CamelContext camelContext = routeContext.getCamelContext();
             Language language = camelContext.resolveLanguage(getLanguage());
             expressionValue = language.createExpression(getExpression());
+            configureExpresion(routeContext, expressionValue);
         }
         return expressionValue;
     }
@@ -161,4 +163,11 @@
         }
         return "";
     }
+
+    protected void configurePredicate(RouteContext routeContext, Predicate predicate) {
+    }
+
+    protected void configureExpresion(RouteContext routeContext, Expression expression) {
+    }
+
 }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XPathExpression.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XPathExpression.java?rev=584100&r1=584099&r2=584100&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XPathExpression.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XPathExpression.java Fri Oct 12 01:45:04 2007
@@ -16,7 +16,16 @@
  */
 package org.apache.camel.model.language;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.builder.xml.XPathBuilder;
+import org.apache.camel.impl.RouteContext;
+import org.w3c.dom.Element;
 
 /**
  * For XPath expresions and predicates
@@ -24,7 +33,11 @@
  * @version $Revision: 1.1 $
  */
 @XmlRootElement(name = "xpath")
+@XmlAccessorType(XmlAccessType.FIELD)
 public class XPathExpression extends ExpressionType {
+    @XmlTransient
+    private Element element;
+
     public XPathExpression() {
     }
 
@@ -34,5 +47,36 @@
 
     public String getLanguage() {
         return "xpath";
+    }
+
+    public Element getElement() {
+        return element;
+    }
+
+    /**
+     * Sets the XML element in which this XPath node is defined so that
+     * the namespace context can be reused by the XPath expression
+     *
+     * @param element the XML element node which defines this xpath expression
+     */
+    public void setElement(Element element) {
+        this.element = element;
+    }
+
+    @Override
+    protected void configureExpresion(RouteContext routeContext, Expression expression) {
+        configureXPathBuilder(expression);
+    }
+
+    @Override
+    protected void configurePredicate(RouteContext routeContext, Predicate predicate) {
+        configureXPathBuilder(predicate);
+    }
+
+    protected void configureXPathBuilder(Object builder) {
+        if (element != null && builder instanceof XPathBuilder) {
+            XPathBuilder xPathBuilder = (XPathBuilder) builder;
+            xPathBuilder.setNamespacesFromDom(element);
+        }
     }
 }

Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/XPathFilterTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/XPathFilterTest.java?rev=584100&r1=584099&r2=584100&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/XPathFilterTest.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/XPathFilterTest.java Fri Oct 12 01:45:04 2007
@@ -30,11 +30,13 @@
 public class XPathFilterTest extends ContextTestSupport {
     protected Endpoint<Exchange> startEndpoint;
     protected MockEndpoint resultEndpoint;
+    protected String matchingBody = "<person name='James' city='London'/>";
+    protected String notMatchingBody = "<person name='Hiram' city='Tampa'/>";
 
     public void testSendMatchingMessage() throws Exception {
         resultEndpoint.expectedMessageCount(1);
 
-        sendBody("direct:start", "<person name='James' city='London'/>");
+        sendBody("direct:start", matchingBody);
 
         resultEndpoint.assertIsSatisfied();
     }
@@ -42,7 +44,7 @@
     public void testSendNotMatchingMessage() throws Exception {
         resultEndpoint.expectedMessageCount(0);
 
-        sendBody("direct:start", "<person name='Hiram' city='Tampa'/>");
+        sendBody("direct:start", notMatchingBody);
 
         resultEndpoint.assertIsSatisfied();
     }

Modified: activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java?rev=584100&r1=584099&r2=584100&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java (original)
+++ activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java Fri Oct 12 01:45:04 2007
@@ -24,12 +24,14 @@
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.Binder;
 
 import org.apache.camel.builder.xml.XPathBuilder;
 import org.apache.camel.model.dataformat.ArtixDSDataFormat;
 import org.apache.camel.model.dataformat.JaxbDataFormat;
 import org.apache.camel.model.dataformat.SerializationDataFormat;
 import org.apache.camel.model.dataformat.XMLBeansDataFormat;
+import org.apache.camel.model.language.XPathExpression;
 import org.apache.camel.spring.CamelBeanPostProcessor;
 import org.apache.camel.spring.CamelContextFactoryBean;
 import org.apache.camel.spring.EndpointFactoryBean;
@@ -57,6 +59,7 @@
     protected Set<String> parserElementNames = new HashSet<String>();
     private JAXBContext jaxbContext;
     private Map<String, BeanDefinitionParser> parserMap =new HashMap<String, BeanDefinitionParser>();
+    private Binder<Node> binder;
 
     public void init() {
         // remoting
@@ -73,6 +76,7 @@
 
         registerParser("camelContext", new CamelContextBeanDefinitionParser(CamelContextFactoryBean.class));
 
+        /* TODO dead old code
         registerParser("xpath", new BeanDefinitionParser(XPathBuilder.class) {
             @Override
             protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
@@ -83,6 +87,7 @@
                 builder.addPropertyValue("namespacesFromDom", element);
             }
         });
+        */
     }
 
     private void addBeanDefinitionParser(String elementName, Class<?> type) {
@@ -113,8 +118,12 @@
 
     protected Object parseUsingJaxb(Element element, ParserContext parserContext) {
         try {
+            binder = getJaxbContext().createBinder();
+            return binder.unmarshal(element);
+/*
             Unmarshaller unmarshaller = getJaxbContext().createUnmarshaller();
             return unmarshaller.unmarshal(element);
+*/
         } catch (JAXBException e) {
             throw new BeanDefinitionStoreException("Failed to parse JAXB element: " + e, e);
         }
@@ -194,11 +203,35 @@
                     }
                 }
             }
+            // lets inject the namespaces into any namespace aware POJOs
+            injectNamespaces(element);
             if (!createdBeanPostProcessor) {
                 // no bean processor element so lets add a fake one
                 Element childElement = element.getOwnerDocument().createElement("beanPostProcessor");
                 element.appendChild(childElement);
                 createBeanPostProcessor(parserContext, contextId, childElement);
+            }
+        }
+    }
+
+    protected void injectNamespaces(Element element) {
+        NodeList list = element.getChildNodes();
+        int size = list.getLength();
+        for (int i = 0; i < size; i++) {
+            Node child = list.item(i);
+            if (child instanceof Element) {
+                Element childElement = (Element)child;
+                String localName = child.getLocalName();
+                if (localName.equals("xpath")) {
+                    Object object = binder.getJAXBNode(child);
+                    if (object instanceof XPathExpression) {
+                        XPathExpression xPathExpression = (XPathExpression) object;
+                        xPathExpression.setElement(childElement);
+                    }
+                }
+                else {
+                    injectNamespaces(childElement);
+                }
             }
         }
     }