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