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);
+ }
}
}
}