Updated Branches:
  refs/heads/master d06f3cf90 -> 114ec60f7

CAMEL-6238: Added resultType to jsonpath languagae.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/114ec60f
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/114ec60f
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/114ec60f

Branch: refs/heads/master
Commit: 114ec60f704450e63f47636aa051d28f6a3445fe
Parents: d06f3cf
Author: Claus Ibsen <davscl...@apache.org>
Authored: Sun Nov 24 10:51:51 2013 +0100
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Sun Nov 24 10:51:51 2013 +0100

----------------------------------------------------------------------
 .../apache/camel/builder/ExpressionClause.java  | 13 ++++
 .../camel/builder/ExpressionClauseSupport.java  | 15 +++++
 .../model/language/JsonPathExpression.java      | 58 ++++++++++++++++
 .../camel/jsonpath/JsonPathExpression.java      | 70 ++++++++++++++++++++
 .../apache/camel/jsonpath/JsonPathLanguage.java | 54 +--------------
 .../JsonPathTransformResultTypeTest.java        | 60 +++++++++++++++++
 .../SpringJsonPathTransformResultTypeTest.java  | 49 ++++++++++++++
 .../SpringJsonPathTransformResultTypeTest.xml   | 41 ++++++++++++
 8 files changed, 308 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/114ec60f/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java 
b/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java
index 81fd32f..787ff78 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java
@@ -289,6 +289,19 @@ public class ExpressionClause<T> extends 
ExpressionDefinition {
     }
 
     /**
+     * Evaluates a <a
+     * href="http://camel.apache.org/jsonpath.html";>Json Path
+     * expression</a>
+     *
+     * @param text the expression to be evaluated
+     * @param resultType the return type expected by the expression
+     * @return the builder to continue processing the DSL
+     */
+    public T jsonpath(String text, Class<?> resultType) {
+        return delegate.jsonpath(text, resultType);
+    }
+
+    /**
      * Evaluates a <a href="http://commons.apache.org/jxpath/";>JXPath 
expression</a>
      * 
      * @param text the expression to be evaluated

http://git-wip-us.apache.org/repos/asf/camel/blob/114ec60f/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
 
b/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
index 763b8e2..db3acfd 100644
--- 
a/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
+++ 
b/camel-core/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
@@ -324,6 +324,21 @@ public class ExpressionClauseSupport<T> {
     }
 
     /**
+     * Evaluates a <a href="http://camel.apache.org/jsonpath.html";>Json Path
+     * expression</a>
+     *
+     * @param text the expression to be evaluated
+     * @param resultType the return type expected by the expression
+     * @return the builder to continue processing the DSL
+     */
+    public T jsonpath(String text, Class<?> resultType) {
+        JsonPathExpression expression = new JsonPathExpression(text);
+        expression.setResultType(resultType);
+        setExpressionType(expression);
+        return result;
+    }
+
+    /**
      * Evaluates a <a href="http://commons.apache.org/jxpath/";>JXPath 
expression</a>
      *
      * @param text the expression to be evaluated

http://git-wip-us.apache.org/repos/asf/camel/blob/114ec60f/camel-core/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
 
b/camel-core/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
index 31c32e2..6d6eb0a 100644
--- 
a/camel-core/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
+++ 
b/camel-core/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
@@ -18,7 +18,14 @@ 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 javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.util.ObjectHelper;
 
 /**
  * For JSonPath expressions and predicates
@@ -29,6 +36,12 @@ import javax.xml.bind.annotation.XmlRootElement;
 @XmlAccessorType(XmlAccessType.FIELD)
 public class JsonPathExpression extends ExpressionDefinition {
 
+    @XmlAttribute(name = "resultType")
+    private String resultTypeName;
+
+    @XmlTransient
+    private Class<?> resultType;
+
     public JsonPathExpression() {
     }
 
@@ -36,7 +49,52 @@ public class JsonPathExpression extends ExpressionDefinition 
{
         super(expression);
     }
 
+    public String getResultTypeName() {
+        return resultTypeName;
+    }
+
+    public void setResultTypeName(String resultTypeName) {
+        this.resultTypeName = resultTypeName;
+    }
+
+    public Class<?> getResultType() {
+        return resultType;
+    }
+
+    public void setResultType(Class<?> resultType) {
+        this.resultType = resultType;
+    }
+
     public String getLanguage() {
         return "jsonpath";
     }
+
+    @Override
+    public Expression createExpression(CamelContext camelContext) {
+        if (resultType == null && resultTypeName != null) {
+            try {
+                resultType = 
camelContext.getClassResolver().resolveMandatoryClass(resultTypeName);
+            } catch (ClassNotFoundException e) {
+                throw ObjectHelper.wrapRuntimeCamelException(e);
+            }
+        }
+        return super.createExpression(camelContext);
+    }
+
+    @Override
+    protected void configureExpression(CamelContext camelContext, Expression 
expression) {
+        if (resultType != null) {
+            setProperty(expression, "resultType", resultType);
+        }
+        super.configureExpression(camelContext, expression);
+    }
+
+    @Override
+    protected void configurePredicate(CamelContext camelContext, Predicate 
predicate) {
+        if (resultType != null) {
+            setProperty(predicate, "resultType", resultType);
+        }
+        super.configurePredicate(camelContext, predicate);
+    }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/114ec60f/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java
 
b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java
new file mode 100644
index 0000000..5a8ee70
--- /dev/null
+++ 
b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java
@@ -0,0 +1,70 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.jsonpath;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ExpressionEvaluationException;
+import org.apache.camel.ExpressionIllegalSyntaxException;
+import org.apache.camel.support.ExpressionAdapter;
+
+public class JsonPathExpression extends ExpressionAdapter {
+
+    private final String expression;
+    private Class<?> resultType;
+    private final JsonPathEngine engine;
+
+    public JsonPathExpression(String expression) {
+        this.expression = expression;
+        try {
+            engine = new JsonPathEngine(expression);
+        } catch (Exception e) {
+            throw new ExpressionIllegalSyntaxException(expression, e);
+        }
+    }
+
+    public Class<?> getResultType() {
+        return resultType;
+    }
+
+    public void setResultType(Class<?> resultType) {
+        this.resultType = resultType;
+    }
+
+    @Override
+    public Object evaluate(Exchange exchange) {
+        try {
+            Object result = evaluateJsonPath(exchange, engine);
+            if (resultType != null) {
+                return 
exchange.getContext().getTypeConverter().convertTo(resultType, exchange, 
result);
+            } else {
+                return result;
+            }
+        } catch (Exception e) {
+            throw new ExpressionEvaluationException(this, exchange, e);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "jsonpath[" + expression + "]";
+    }
+
+    private Object evaluateJsonPath(Exchange exchange, JsonPathEngine engine) 
throws Exception {
+        return engine.read(exchange);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/114ec60f/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
 
b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
index 1b313e7..e30ad8e 100644
--- 
a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
+++ 
b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
@@ -16,70 +16,20 @@
  */
 package org.apache.camel.jsonpath;
 
-import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
-import org.apache.camel.ExpressionEvaluationException;
-import org.apache.camel.ExpressionIllegalSyntaxException;
 import org.apache.camel.Predicate;
-import org.apache.camel.support.ExpressionAdapter;
 import org.apache.camel.support.LanguageSupport;
 
 public class JsonPathLanguage extends LanguageSupport {
 
     @Override
     public Predicate createPredicate(final String predicate) {
-        final JsonPathEngine engine;
-        try {
-            engine = new JsonPathEngine(predicate);
-        } catch (Exception e) {
-            throw new ExpressionIllegalSyntaxException(predicate, e);
-        }
-
-        return new ExpressionAdapter() {
-            @Override
-            public Object evaluate(Exchange exchange) {
-                try {
-                    return evaluateJsonPath(exchange, engine);
-                } catch (Exception e) {
-                    throw new ExpressionEvaluationException(this, exchange, e);
-                }
-            }
-
-            @Override
-            public String toString() {
-                return "jsonpath[" + predicate + "]";
-            }
-        };
+        return new JsonPathExpression(predicate);
     }
 
     @Override
     public Expression createExpression(final String expression) {
-        final JsonPathEngine engine;
-        try {
-            engine = new JsonPathEngine(expression);
-        } catch (Exception e) {
-            throw new ExpressionIllegalSyntaxException(expression, e);
-        }
-
-        return new ExpressionAdapter() {
-            @Override
-            public Object evaluate(Exchange exchange) {
-                try {
-                    return evaluateJsonPath(exchange, engine);
-                } catch (Exception e) {
-                    throw new ExpressionEvaluationException(this, exchange, e);
-                }
-            }
-
-            @Override
-            public String toString() {
-                return "jsonpath[" + expression + "]";
-            }
-        };
-    }
-
-    private Object evaluateJsonPath(Exchange exchange, JsonPathEngine engine) 
throws Exception {
-        return engine.read(exchange);
+        return new JsonPathExpression(expression);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/114ec60f/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathTransformResultTypeTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathTransformResultTypeTest.java
 
b/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathTransformResultTypeTest.java
new file mode 100644
index 0000000..b734bb8
--- /dev/null
+++ 
b/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathTransformResultTypeTest.java
@@ -0,0 +1,60 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.jsonpath;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class JsonPathTransformResultTypeTest extends CamelTestSupport {
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .transform().jsonpath("$.store.book[0].price", Float.class)
+                    .to("mock:price");
+
+                from("direct:second")
+                    .transform().jsonpath("$.store.book[0].price", 
Double.class)
+                    .to("mock:price");
+            }
+        };
+    }
+
+    @Test
+    public void testPriceResultType() throws Exception {
+        getMockEndpoint("mock:price").expectedMessageCount(4);
+        
getMockEndpoint("mock:price").message(0).body().isInstanceOf(Float.class);
+        
getMockEndpoint("mock:price").message(1).body().isInstanceOf(Double.class);
+        
getMockEndpoint("mock:price").message(2).body().isInstanceOf(Float.class);
+        
getMockEndpoint("mock:price").message(3).body().isInstanceOf(Double.class);
+
+        template.sendBody("direct:start", new 
File("src/test/resources/books.json"));
+        template.sendBody("direct:second", new 
File("src/test/resources/books.json"));
+        template.sendBody("direct:start", new 
File("src/test/resources/books.json"));
+        template.sendBody("direct:second", new 
File("src/test/resources/books.json"));
+
+        assertMockEndpointsSatisfied();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/114ec60f/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/SpringJsonPathTransformResultTypeTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/SpringJsonPathTransformResultTypeTest.java
 
b/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/SpringJsonPathTransformResultTypeTest.java
new file mode 100644
index 0000000..2a6b562
--- /dev/null
+++ 
b/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/SpringJsonPathTransformResultTypeTest.java
@@ -0,0 +1,49 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.jsonpath;
+
+import java.io.File;
+
+import org.apache.camel.test.spring.CamelSpringTestSupport;
+import org.junit.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class SpringJsonPathTransformResultTypeTest extends 
CamelSpringTestSupport {
+
+    @Override
+    protected AbstractApplicationContext createApplicationContext() {
+        return new 
ClassPathXmlApplicationContext("org/apache/camel/jsonpath/SpringJsonPathTransformResultTypeTest.xml");
+    }
+
+    @Test
+    public void testPriceResultType() throws Exception {
+        getMockEndpoint("mock:price").expectedMessageCount(4);
+        
getMockEndpoint("mock:price").message(0).body().isInstanceOf(Float.class);
+        
getMockEndpoint("mock:price").message(1).body().isInstanceOf(Double.class);
+        
getMockEndpoint("mock:price").message(2).body().isInstanceOf(Float.class);
+        
getMockEndpoint("mock:price").message(3).body().isInstanceOf(Double.class);
+
+        template.sendBody("direct:start", new 
File("src/test/resources/books.json"));
+        template.sendBody("direct:second", new 
File("src/test/resources/books.json"));
+        template.sendBody("direct:start", new 
File("src/test/resources/books.json"));
+        template.sendBody("direct:second", new 
File("src/test/resources/books.json"));
+
+        assertMockEndpointsSatisfied();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/114ec60f/components/camel-jsonpath/src/test/resources/org/apache/camel/jsonpath/SpringJsonPathTransformResultTypeTest.xml
----------------------------------------------------------------------
diff --git 
a/components/camel-jsonpath/src/test/resources/org/apache/camel/jsonpath/SpringJsonPathTransformResultTypeTest.xml
 
b/components/camel-jsonpath/src/test/resources/org/apache/camel/jsonpath/SpringJsonPathTransformResultTypeTest.xml
new file mode 100644
index 0000000..0758f25
--- /dev/null
+++ 
b/components/camel-jsonpath/src/test/resources/org/apache/camel/jsonpath/SpringJsonPathTransformResultTypeTest.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans";
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xsi:schemaLocation="
+            http://camel.apache.org/schema/spring 
http://camel.apache.org/schema/spring/camel-spring.xsd
+            http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd";>
+
+  <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring";>
+    <route>
+      <from uri="direct:start"/>
+      <transform>
+        <jsonpath resultType="Float">$.store.book[0].price</jsonpath>
+      </transform>
+      <to uri="mock:price"/>
+    </route>
+    <route>
+      <from uri="direct:second"/>
+      <transform>
+        <jsonpath resultType="Double">$.store.book[0].price</jsonpath>
+      </transform>
+      <to uri="mock:price"/>
+    </route>
+  </camelContext>
+
+</beans>
\ No newline at end of file

Reply via email to