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