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/13 12:45:03 UTC
svn commit: r584388 - in /activemq/camel/trunk:
camel-core/src/main/java/org/apache/camel/builder/xml/
camel-core/src/main/java/org/apache/camel/impl/
camel-core/src/main/java/org/apache/camel/model/dataformat/
camel-core/src/main/java/org/apache/camel...
Author: jstrachan
Date: Sat Oct 13 03:45:01 2007
New Revision: 584388
URL: http://svn.apache.org/viewvc?rev=584388&view=rev
Log:
made it easier to create xpath/xquery expressions with result types from Namespaces
Modified:
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/Namespaces.java
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/RouteContext.java
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/DataFormatType.java
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/NamespaceAwareExpression.java
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XPathExpression.java
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XQueryExpression.java
activemq/camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/builder/saxon/XQueryBuilder.java
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/Namespaces.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/Namespaces.java?rev=584388&r1=584387&r2=584388&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/Namespaces.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/xml/Namespaces.java Sat Oct 13 03:45:01 2007
@@ -40,6 +40,7 @@
public static final String SYSTEM_PROPERTIES_NAMESPACE = "http://camel.apache.org/xml/variables/system-properties";
public static final String ENVIRONMENT_VARIABLES = "http://camel.apache.org/xml/variables/environment-variables";
public static final String EXCHANGE_PROPERTY = "http://camel.apache.org/xml/variables/exchange-property";
+
private Map<String, String> namespaces = new HashMap<String, String>();
/**
@@ -105,6 +106,17 @@
*/
public XQueryExpression xquery(String expression) {
XQueryExpression answer = new XQueryExpression(expression);
+ configure(answer);
+ return answer;
+ }
+
+ /**
+ * Creates the XQuery expression using the current namespace context
+ * and the given expected return type
+ */
+ public XQueryExpression xquery(String expression, Class<?> returnType) {
+ XQueryExpression answer = new XQueryExpression(expression);
+ answer.setResultType(returnType);
configure(answer);
return answer;
}
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/RouteContext.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/RouteContext.java?rev=584388&r1=584387&r2=584388&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/RouteContext.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/RouteContext.java Sat Oct 13 03:45:01 2007
@@ -20,12 +20,12 @@
import java.util.Collection;
import java.util.List;
+import org.apache.camel.AsyncProcessor;
import org.apache.camel.CamelContext;
import org.apache.camel.Endpoint;
import org.apache.camel.NoSuchEndpointException;
import org.apache.camel.Processor;
import org.apache.camel.Route;
-import org.apache.camel.AsyncProcessor;
import org.apache.camel.impl.converter.AsyncProcessorTypeConverter;
import org.apache.camel.model.FromType;
import org.apache.camel.model.ProcessorType;
@@ -37,16 +37,17 @@
/**
* The context used to activate new routing rules
- *
+ *
* @version $Revision: $
*/
public class RouteContext {
- private final RouteType route;
- private final FromType from;
- private final Collection<Route> routes;
+ private RouteType route;
+ private FromType from;
+ private Collection<Route> routes;
private Endpoint endpoint;
private List<Processor> eventDrivenProcessors = new ArrayList<Processor>();
private Interceptor lastInterceptor;
+ private CamelContext camelContext;
public RouteContext(RouteType route, FromType from, Collection<Route> routes) {
this.route = route;
@@ -54,6 +55,15 @@
this.routes = routes;
}
+ /**
+ * Only used for lazy construction from inside ExpressionType
+ */
+ public RouteContext(CamelContext camelContext) {
+ this.camelContext = camelContext;
+ routes = new ArrayList<Route>();
+ route = new RouteType("temporary");
+ }
+
public Endpoint getEndpoint() {
if (endpoint == null) {
endpoint = from.resolveEndpoint(this);
@@ -70,7 +80,10 @@
}
public CamelContext getCamelContext() {
- return getRoute().getCamelContext();
+ if (camelContext == null) {
+ camelContext = getRoute().getCamelContext();
+ }
+ return camelContext;
}
public Processor createProcessor(ProcessorType node) throws Exception {
@@ -100,7 +113,8 @@
}
if (endpoint == null) {
throw new IllegalArgumentException("Either 'uri' or 'ref' must be specified on: " + this);
- } else {
+ }
+ else {
return endpoint;
}
}
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/DataFormatType.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/DataFormatType.java?rev=584388&r1=584387&r2=584388&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/DataFormatType.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/DataFormatType.java Sat Oct 13 03:45:01 2007
@@ -107,12 +107,12 @@
/**
* Sets a named property on the data format instance using introspection
*/
- protected void setProperty(DataFormat dataFormat, String name, Object value) {
+ protected void setProperty(Object bean, String name, Object value) {
try {
- IntrospectionSupport.setProperty(dataFormat, name, value);
+ IntrospectionSupport.setProperty(bean, name, value);
}
catch (Exception e) {
- throw new IllegalArgumentException("Failed to set property " + name + " on " + dataFormat + ". Reason: " + e, e);
+ throw new IllegalArgumentException("Failed to set property " + name + " on " + bean + ". Reason: " + e, e);
}
}
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=584388&r1=584387&r2=584388&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 Sat Oct 13 03:45:01 2007
@@ -36,6 +36,7 @@
import org.apache.camel.spi.Language;
import org.apache.camel.util.CollectionStringBuffer;
import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.IntrospectionSupport;
/**
* A useful base class for an expression
@@ -85,15 +86,12 @@
}
public Object evaluate(Exchange exchange) {
- if (expressionValue != null) {
- return expressionValue.evaluate(exchange);
- }
- else if (predicate != null) {
- return predicate.matches(exchange);
- }
- else {
- return null;
+ if (expressionValue == null) {
+ RouteContext routeContext = new RouteContext(exchange.getContext());
+ expressionValue = createExpression(routeContext);
}
+ ObjectHelper.notNull(expressionValue, "expressionValue");
+ return expressionValue.evaluate(exchange);
}
public String getLanguage() {
@@ -115,7 +113,7 @@
CamelContext camelContext = routeContext.getCamelContext();
Language language = camelContext.resolveLanguage(getLanguage());
expressionValue = language.createExpression(getExpression());
- configureExpresion(routeContext, expressionValue);
+ configureExpression(routeContext, expressionValue);
}
return expressionValue;
}
@@ -180,6 +178,20 @@
protected void configurePredicate(RouteContext routeContext, Predicate predicate) {
}
- protected void configureExpresion(RouteContext routeContext, Expression expression) {
+ protected void configureExpression(RouteContext routeContext, Expression expression) {
+ }
+
+
+ /**
+ * Sets a named property on the object instance using introspection
+ */
+ protected void setProperty(Object bean, String name, Object value) {
+ try {
+ IntrospectionSupport.setProperty(bean, name, value);
+ }
+ catch (Exception e) {
+ throw new IllegalArgumentException("Failed to set property " + name + " on " + bean + ". Reason: " + e, e);
+ }
}
+
}
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java?rev=584388&r1=584387&r2=584388&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java Sat Oct 13 03:45:01 2007
@@ -61,16 +61,16 @@
}
@Override
- protected void configureExpresion(RouteContext routeContext, Expression expression) {
- configureXPathBuilder(expression);
+ protected void configureExpression(RouteContext routeContext, Expression expression) {
+ configureNamespaceAware(expression);
}
@Override
protected void configurePredicate(RouteContext routeContext, Predicate predicate) {
- configureXPathBuilder(predicate);
+ configureNamespaceAware(predicate);
}
- protected void configureXPathBuilder(Object builder) {
+ protected void configureNamespaceAware(Object builder) {
if (namespaces != null && builder instanceof NamespaceAware) {
NamespaceAware namespaceAware = (NamespaceAware) builder;
namespaceAware.setNamespaces(namespaces);
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=584388&r1=584387&r2=584388&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 Sat Oct 13 03:45:01 2007
@@ -18,8 +18,13 @@
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.impl.RouteContext;
+
/**
* For XPath expresions and predicates
*
@@ -28,6 +33,9 @@
@XmlRootElement(name = "xpath")
@XmlAccessorType(XmlAccessType.FIELD)
public class XPathExpression extends NamespaceAwareExpression {
+ @XmlAttribute(required = false)
+ private Class resultType;
+
public XPathExpression() {
}
@@ -37,5 +45,29 @@
public String getLanguage() {
return "xpath";
+ }
+
+ public Class getResultType() {
+ return resultType;
+ }
+
+ public void setResultType(Class resultType) {
+ this.resultType = resultType;
+ }
+
+ @Override
+ protected void configureExpression(RouteContext routeContext, Expression expression) {
+ super.configureExpression(routeContext, expression);
+ if (resultType != null) {
+ setProperty(expression, "resultType", resultType);
+ }
+ }
+
+ @Override
+ protected void configurePredicate(RouteContext routeContext, Predicate predicate) {
+ super.configurePredicate(routeContext, predicate);
+ if (resultType != null) {
+ setProperty(predicate, "resultType", resultType);
+ }
}
}
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XQueryExpression.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XQueryExpression.java?rev=584388&r1=584387&r2=584388&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XQueryExpression.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XQueryExpression.java Sat Oct 13 03:45:01 2007
@@ -16,15 +16,26 @@
*/
package org.apache.camel.model.language;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
+import org.apache.camel.impl.RouteContext;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+
/**
* For XQuery expresions and predicates
*
* @version $Revision: 1.1 $
*/
@XmlRootElement(name = "xquery")
+@XmlAccessorType(XmlAccessType.FIELD)
public class XQueryExpression extends NamespaceAwareExpression {
+ @XmlAttribute(required = false)
+ private Class resultType;
+
public XQueryExpression() {
}
@@ -34,5 +45,29 @@
public String getLanguage() {
return "xquery";
+ }
+
+ public Class getResultType() {
+ return resultType;
+ }
+
+ public void setResultType(Class resultType) {
+ this.resultType = resultType;
+ }
+
+ @Override
+ protected void configureExpression(RouteContext routeContext, Expression expression) {
+ super.configureExpression(routeContext, expression);
+ if (resultType != null) {
+ setProperty(expression, "resultType", resultType);
+ }
+ }
+
+ @Override
+ protected void configurePredicate(RouteContext routeContext, Predicate predicate) {
+ super.configurePredicate(routeContext, predicate);
+ if (resultType != null) {
+ setProperty(predicate, "resultType", resultType);
+ }
}
}
Modified: activemq/camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/builder/saxon/XQueryBuilder.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/builder/saxon/XQueryBuilder.java?rev=584388&r1=584387&r2=584388&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/builder/saxon/XQueryBuilder.java (original)
+++ activemq/camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/builder/saxon/XQueryBuilder.java Sat Oct 13 03:45:01 2007
@@ -24,6 +24,7 @@
import java.io.Reader;
import java.io.StringWriter;
import java.net.URL;
+import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -74,6 +75,7 @@
private XmlConverter converter = new XmlConverter();
private ResultFormat resultsFormat = ResultFormat.DOM;
private Properties properties = new Properties();
+ private Class resultType;
@Override
public String toString() {
@@ -82,6 +84,20 @@
public Object evaluate(E exchange) {
try {
+ if (resultType != null) {
+ if (resultType.equals(String.class)) {
+ return evaluateAsString(exchange);
+ }
+ else if (resultType.isAssignableFrom(Collection.class)) {
+ return evaluateAsList(exchange);
+ }
+ else if (resultType.isAssignableFrom(Node.class)) {
+ return evaluateAsDOM(exchange);
+ }
+ else {
+ // TODO figure out how to convert to the given type
+ }
+ }
switch (resultsFormat) {
case Bytes:
return evaluateAsBytes(exchange);
@@ -107,10 +123,7 @@
* Configures the namespace context from the given DOM element
*/
public void setNamespaces(Map<String, String> namespaces) {
- Set<Map.Entry<String, String>> entries = namespaces.entrySet();
- for (Map.Entry<String, String> entry : entries) {
- namespace(entry.getKey(), entry.getValue());
- }
+ namespacePrefixes.putAll(namespaces);
}
public List evaluateAsList(E exchange) throws Exception {
@@ -218,6 +231,21 @@
// Fluent API
// -------------------------------------------------------------------------
+ public XQueryBuilder<E> parameter(String name, Object value) {
+ parameters.put(name, value);
+ return this;
+ }
+
+ public XQueryBuilder<E> namespace(String prefix, String uri) {
+ namespacePrefixes.put(prefix, uri);
+ return this;
+ }
+
+ public XQueryBuilder<E> resultType(Class resultType) {
+ setResultType(resultType);
+ return this;
+ }
+
public XQueryBuilder<E> asBytes() {
setResultsFormat(ResultFormat.Bytes);
return this;
@@ -253,16 +281,6 @@
return this;
}
- public XQueryBuilder<E> parameter(String name, Object value) {
- parameters.put(name, value);
- return this;
- }
-
- public XQueryBuilder<E> namespace(String prefix, String uri) {
- namespacePrefixes.put(prefix, uri);
- return this;
- }
-
// Properties
// -------------------------------------------------------------------------
@@ -326,6 +344,14 @@
public void setResultsFormat(ResultFormat resultsFormat) {
this.resultsFormat = resultsFormat;
+ }
+
+ public Class getResultType() {
+ return resultType;
+ }
+
+ public void setResultType(Class resultType) {
+ this.resultType = resultType;
}
// Implementation methods