Author: davsclaus
Date: Sat Dec  3 07:42:56 2011
New Revision: 1209845

URL: http://svn.apache.org/viewvc?rev=1209845&view=rev
Log:
CAMEL-4733: Fixed issue with Java DSL creating expression with expression 
clause, not ensuring the model is update with the expression definition being 
used. This would cause the JAXB model of the route to not contain the actual 
expression in use.

Added:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/model/ExpressionNodeHelper.java
    
camel/trunk/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlRoutePredicateTest.java
Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/SimpleBuilder.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/model/ExpressionNode.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/SimpleExpression.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XPathExpression.java

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java?rev=1209845&r1=1209844&r2=1209845&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java
 Sat Dec  3 07:42:56 2011
@@ -27,6 +27,9 @@ import org.apache.camel.LoggingLevel;
 import org.apache.camel.NoSuchEndpointException;
 import org.apache.camel.builder.xml.XPathBuilder;
 import org.apache.camel.model.ModelCamelContext;
+import org.apache.camel.model.language.HeaderExpression;
+import org.apache.camel.model.language.MethodCallExpression;
+import org.apache.camel.model.language.PropertyExpression;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,15 +55,17 @@ public abstract class BuilderSupport {
      * Returns a value builder for the given header
      */
     public ValueBuilder header(String name) {
-        return Builder.header(name);
+        HeaderExpression expression = new HeaderExpression(name);
+        return new ValueBuilder(expression);
     }
 
     /**
      * Returns a value builder for the given property
      */
     public ValueBuilder property(String name) {
-        return Builder.property(name);
-    }   
+        PropertyExpression expression = new PropertyExpression(name);
+        return new ValueBuilder(expression);
+    }
     
     /**
      * Returns a predicate and value builder for the inbound body on an 
exchange
@@ -175,7 +180,13 @@ public abstract class BuilderSupport {
      * @return the builder
      */
     public ValueBuilder bean(Object beanOrBeanRef, String method) {
-        return Builder.bean(beanOrBeanRef, method);
+        MethodCallExpression expression;
+        if (beanOrBeanRef instanceof String) {
+            expression = new MethodCallExpression((String) beanOrBeanRef, 
method);
+        } else {
+            expression = new MethodCallExpression((Object) beanOrBeanRef, 
method);
+        }
+        return new ValueBuilder(expression);
     }
 
     /**
@@ -186,7 +197,8 @@ public abstract class BuilderSupport {
      * @return the builder
      */
     public ValueBuilder bean(Class<?> beanType) {
-        return Builder.bean(beanType, null);
+        MethodCallExpression expression = new MethodCallExpression(beanType);
+        return new ValueBuilder(expression);
     }
     
     /**
@@ -198,7 +210,8 @@ public abstract class BuilderSupport {
      * @return the builder
      */
     public ValueBuilder bean(Class<?> beanType, String method) {
-        return Builder.bean(beanType, method);
+        MethodCallExpression expression = new MethodCallExpression(beanType, 
method);
+        return new ValueBuilder(expression);
     }
 
     /**

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/SimpleBuilder.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/SimpleBuilder.java?rev=1209845&r1=1209844&r2=1209845&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/SimpleBuilder.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/SimpleBuilder.java
 Sat Dec  3 07:42:56 2011
@@ -51,6 +51,10 @@ public class SimpleBuilder implements Pr
         return answer;
     }
 
+    public String getText() {
+        return text;
+    }
+
     public Class<?> getResultType() {
         return resultType;
     }

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/ExpressionNode.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ExpressionNode.java?rev=1209845&r1=1209844&r2=1209845&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/ExpressionNode.java 
(original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/ExpressionNode.java 
Sat Dec  3 07:42:56 2011
@@ -52,13 +52,13 @@ public class ExpressionNode extends Proc
 
     public ExpressionNode(Expression expression) {
         if (expression != null) {
-            setExpression(new ExpressionDefinition(expression));
+            
setExpression(ExpressionNodeHelper.toExpressionDefinition(expression));
         }
     }
 
     public ExpressionNode(Predicate predicate) {
         if (predicate != null) {
-            setExpression(new ExpressionDefinition(predicate));
+            
setExpression(ExpressionNodeHelper.toExpressionDefinition(predicate));
         }
     }
 

Added: 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/ExpressionNodeHelper.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ExpressionNodeHelper.java?rev=1209845&view=auto
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/ExpressionNodeHelper.java
 (added)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/ExpressionNodeHelper.java
 Sat Dec  3 07:42:56 2011
@@ -0,0 +1,100 @@
+/**
+ * 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.model;
+
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.builder.SimpleBuilder;
+import org.apache.camel.builder.ValueBuilder;
+import org.apache.camel.builder.xml.XPathBuilder;
+import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.model.language.SimpleExpression;
+import org.apache.camel.model.language.XPathExpression;
+
+/**
+ * Helper for {@link ExpressionNode}
+ */
+public final class ExpressionNodeHelper {
+
+    private ExpressionNodeHelper() {
+    }
+
+    /**
+     * Determines which {@link ExpressionDefinition} describes the given 
expression best possible.
+     * <p/>
+     * This implementation will use types such as {@link SimpleExpression}, 
{@link XPathExpression} etc.
+     * if the given expression is detect as such a type.
+     *
+     * @param expression the expression
+     * @return a definition which describes the expression
+     */
+    public static ExpressionDefinition toExpressionDefinition(Expression 
expression) {
+        if (expression instanceof SimpleBuilder) {
+            SimpleBuilder builder = (SimpleBuilder) expression;
+            // we keep the original expression by using the constructor that 
accepts an expression
+            SimpleExpression answer = new SimpleExpression(builder);
+            answer.setExpression(builder.getText());
+            answer.setResultType(builder.getResultType());
+            return answer;
+        } else if (expression instanceof XPathBuilder) {
+            XPathBuilder builder = (XPathBuilder) expression;
+            // we keep the original expression by using the constructor that 
accepts an expression
+            XPathExpression answer = new XPathExpression(builder);
+            answer.setExpression(builder.getText());
+            answer.setResultType(builder.getResultType());
+            return answer;
+        } else if (expression instanceof ValueBuilder) {
+            ValueBuilder builder = (ValueBuilder) expression;
+            expression = builder.getExpression();
+        }
+
+        if (expression instanceof ExpressionDefinition) {
+            return (ExpressionDefinition) expression;
+        }
+        return new ExpressionDefinition(expression);
+    }
+
+    /**
+     * Determines which {@link ExpressionDefinition} describes the given 
predicate best possible.
+     * <p/>
+     * This implementation will use types such as {@link SimpleExpression}, 
{@link XPathExpression} etc.
+     * if the given predicate is detect as such a type.
+     *
+     * @param predicate the predicate
+     * @return a definition which describes the predicate
+     */
+    public static ExpressionDefinition toExpressionDefinition(Predicate 
predicate) {
+        if (predicate instanceof SimpleBuilder) {
+            SimpleBuilder builder = (SimpleBuilder) predicate;
+            // we keep the original expression by using the constructor that 
accepts an expression
+            SimpleExpression answer = new SimpleExpression(builder);
+            answer.setExpression(builder.getText());
+            return answer;
+        } else if (predicate instanceof XPathBuilder) {
+            XPathBuilder builder = (XPathBuilder) predicate;
+            // we keep the original expression by using the constructor that 
accepts an expression
+            XPathExpression answer = new XPathExpression(builder);
+            answer.setExpression(builder.getText());
+            return answer;
+        }
+
+        if (predicate instanceof ExpressionDefinition) {
+            return (ExpressionDefinition) predicate;
+        }
+        return new ExpressionDefinition(predicate);
+    }
+}

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/MethodCallExpression.java?rev=1209845&r1=1209844&r2=1209845&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
 Sat Dec  3 07:42:56 2011
@@ -75,7 +75,7 @@ public class MethodCallExpression extend
     }
     
     public MethodCallExpression(Object instance, String method) {
-        super(instance.getClass().getName());
+        super(ObjectHelper.className(instance));
         this.instance = instance;
         this.method = method;
     }
@@ -85,7 +85,7 @@ public class MethodCallExpression extend
     }
     
     public MethodCallExpression(Class<?> type, String method) {
-        super(type.toString());
+        super(type.getName());
         this.beanType = type;
         this.method = method;
     }

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/SimpleExpression.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/SimpleExpression.java?rev=1209845&r1=1209844&r2=1209845&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/SimpleExpression.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/SimpleExpression.java
 Sat Dec  3 07:42:56 2011
@@ -49,6 +49,10 @@ public class SimpleExpression extends Ex
         super(expression);
     }
 
+    public SimpleExpression(Expression expression) {
+        super(expression);
+    }
+
     public String getLanguage() {
         return "simple";
     }

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XPathExpression.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XPathExpression.java?rev=1209845&r1=1209844&r2=1209845&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XPathExpression.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/XPathExpression.java
 Sat Dec  3 07:42:56 2011
@@ -47,6 +47,10 @@ public class XPathExpression extends Nam
         super(expression);
     }
 
+    public XPathExpression(Expression expression) {
+        setExpressionValue(expression);
+    }
+
     public String getLanguage() {
         return "xpath";
     }

Added: 
camel/trunk/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlRoutePredicateTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlRoutePredicateTest.java?rev=1209845&view=auto
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlRoutePredicateTest.java
 (added)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/util/DumpModelAsXmlRoutePredicateTest.java
 Sat Dec  3 07:42:56 2011
@@ -0,0 +1,93 @@
+/**
+ * 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.util;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.MyBarSingleton;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.model.ModelHelper;
+
+/**
+ *
+ */
+public class DumpModelAsXmlRoutePredicateTest extends ContextTestSupport {
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry jndi = super.createRegistry();
+        jndi.bind("myCoolBean", new MyBarSingleton());
+        return jndi;
+    }
+
+    public void testDumpModelAsXml() throws Exception {
+        String xml = 
ModelHelper.dumpModelAsXml(context.getRouteDefinition("myRoute"));
+        assertNotNull(xml);
+        log.info(xml);
+
+        assertTrue(xml.contains("<simple>${body} &gt; 10</simple>"));
+    }
+
+    public void testDumpModelAsXmlXPath() throws Exception {
+        String xml = 
ModelHelper.dumpModelAsXml(context.getRouteDefinition("myOtherRoute"));
+        assertNotNull(xml);
+        log.info(xml);
+
+        assertTrue(xml.contains("<xpath>/foo</xpath>"));
+    }
+
+    public void testDumpModelAsXmlHeader() throws Exception {
+        String xml = 
ModelHelper.dumpModelAsXml(context.getRouteDefinition("myFooRoute"));
+        assertNotNull(xml);
+        log.info(xml);
+
+        assertTrue(xml.contains("<header>bar</header>"));
+    }
+
+    public void testDumpModelAsXmlBean() throws Exception {
+        String xml = 
ModelHelper.dumpModelAsXml(context.getRouteDefinition("myBeanRoute"));
+        assertNotNull(xml);
+        log.info(xml);
+
+        assertTrue(xml.contains("<method>myCoolBean</method>"));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").routeId("myRoute")
+                   .filter(simple("${body} > 10"))
+                     .to("mock:result");
+
+                from("direct:other").routeId("myOtherRoute")
+                   .filter(xpath("/foo"))
+                     .to("mock:result");
+
+                from("direct:foo").routeId("myFooRoute")
+                   .filter().header("bar")
+                     .to("mock:result");
+
+                from("direct:bean").routeId("myBeanRoute")
+                   .filter().method("myCoolBean")
+                     .to("mock:result");
+            }
+        };
+    }
+
+}


Reply via email to