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/11/16 14:22:30 UTC
svn commit: r595654 - in /activemq/camel/trunk:
camel-core/src/main/java/org/apache/camel/
camel-core/src/main/java/org/apache/camel/builder/
camel-core/src/main/java/org/apache/camel/component/bean/
camel-core/src/main/java/org/apache/camel/language/b...
Author: jstrachan
Date: Fri Nov 16 05:22:28 2007
New Revision: 595654
URL: http://svn.apache.org/viewvc?rev=595654&view=rev
Log:
added support for bean method calls as expressions/predicates for https://issues.apache.org/activemq/browse/CAMEL-226 which makes adding custom predicates/beans really easy without clever expression languages. Also fixed up the failing Aggregator test
Added:
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/NoSuchBeanException.java
- copied, changed from r594497, activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/NoSuchEndpointException.java
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java (with props)
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanLanguage.java
- copied, changed from r594497, activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/RuntimeBeanExpressionException.java (with props)
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/MethodCall.java (with props)
activemq/camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/language/bean
- copied, changed from r594497, activemq/camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/language/simple
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/language/BeanTest.java
- copied, changed from r594497, activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MyAggregationStrategy.java (with props)
Modified:
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/SimpleExpression.java
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/SqlExpression.java
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java
activemq/camel/trunk/camel-core/src/main/resources/org/apache/camel/model/language/jaxb.index
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/AggregatorTest.java
activemq/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/aggregator.xml
Copied: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/NoSuchBeanException.java (from r594497, activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/NoSuchEndpointException.java)
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/NoSuchBeanException.java?p2=activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/NoSuchBeanException.java&p1=activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/NoSuchEndpointException.java&r1=594497&r2=595654&rev=595654&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/NoSuchEndpointException.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/NoSuchBeanException.java Fri Nov 16 05:22:28 2007
@@ -16,23 +16,23 @@
*/
package org.apache.camel;
+import org.apache.camel.spi.Registry;
/**
- * A runtime exception thrown if a routing processor such as a
- * {@link RecipientList} is unable to resolve an {@link Endpoint} from a URI.
- *
+ * A runtime exception if a given bean could not be found in the {@link Registry}
+ *
* @version $Revision$
*/
-public class NoSuchEndpointException extends RuntimeCamelException {
+public class NoSuchBeanException extends RuntimeCamelException {
private static final long serialVersionUID = -8721487431101572630L;
- private final String uri;
+ private final String name;
- public NoSuchEndpointException(String uri) {
- super("No endpoint could be found for: " + uri);
- this.uri = uri;
+ public NoSuchBeanException(String name) {
+ super("No bean could be found in the registry for: " + name);
+ this.name = name;
}
- public String getUri() {
- return uri;
+ public String getName() {
+ return name;
}
-}
+}
\ No newline at end of file
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java?rev=595654&r1=595653&r2=595654&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionClause.java Fri Nov 16 05:22:28 2007
@@ -21,6 +21,7 @@
import org.apache.camel.builder.xml.Namespaces;
import org.apache.camel.model.ExpressionNode;
+import org.apache.camel.model.language.MethodCall;
import org.apache.camel.model.language.ExpressionType;
import org.apache.camel.model.language.XPathExpression;
import org.apache.camel.model.language.XQueryExpression;
@@ -47,6 +48,35 @@
// Fluent API
//-------------------------------------------------------------------------
+
+ /**
+ * Evaluates an expression using the
+ * <a href="http://activemq.apache.org/camel/bean-language.html>bean language</a>
+ * which basically means the bean is invoked to determine the expression value.
+ *
+ * @param bean the name of the bean looked up the registry
+ * @return the builder to continue processing the DSL
+ */
+ public T bean(String bean) {
+ MethodCall expression = new MethodCall(bean);
+ setExpressionType(expression);
+ return result;
+ }
+
+ /**
+ * Evaluates an expression using the
+ * <a href="http://activemq.apache.org/camel/bean-language.html>bean language</a>
+ * which basically means the bean is invoked to determine the expression value.
+ *
+ * @param bean the name of the bean looked up the registry
+ * @param method the name of the method to invoke on the bean
+ * @return the builder to continue processing the DSL
+ */
+ public T bean(String bean, String method) {
+ MethodCall expression = new MethodCall(bean, method);
+ setExpressionType(expression);
+ return result;
+ }
/**
* Evaluates the <a href="http://activemq.apache.org/camel/el.html">EL Language from JSP and JSF</a>
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java?rev=595654&r1=595653&r2=595654&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java Fri Nov 16 05:22:28 2007
@@ -139,7 +139,12 @@
hasCustomAnnotation |= ObjectHelper.hasAnnotation(parameterAnnotations, Body.class);
if (bodyParameters.isEmpty()) {
// lets assume its the body
- expression = ExpressionBuilder.bodyExpression(parameterType);
+ if (Exchange.class.isAssignableFrom(parameterType)) {
+ expression = ExpressionBuilder.exchangeExpression();
+ }
+ else {
+ expression = ExpressionBuilder.bodyExpression(parameterType);
+ }
parameterInfo.setExpression(expression);
bodyParameters.add(parameterInfo);
} else {
Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java?rev=595654&view=auto
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java Fri Nov 16 05:22:28 2007
@@ -0,0 +1,63 @@
+/**
+ *
+ * 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.language.bean;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.bean.BeanProcessor;
+import org.apache.camel.impl.ExpressionSupport;
+import org.apache.camel.util.ExchangeHelper;
+
+/**
+ * Evaluates an expression using a bean method invocation
+ *
+ * @version $Revision: 1.1 $
+ */
+public class BeanExpression<E extends Exchange> extends ExpressionSupport<E> {
+ private String beanName;
+ private String method;
+
+ public BeanExpression(String beanName, String method) {
+ this.beanName = beanName;
+ this.method = method;
+ }
+
+ @Override
+ public String toString() {
+ return "BeanExpression[bean: " + beanName + " method: " + method + "]";
+ }
+
+ protected String assertionFailureMessage(E exchange) {
+ return "bean: " + beanName + " method: " + method;
+ }
+
+ public Object evaluate(E exchange) {
+ Object bean = ExchangeHelper.lookupMandatoryBean(exchange, beanName);
+ BeanProcessor processor = new BeanProcessor(bean, exchange.getContext());
+ if (method != null) {
+ processor.setMethod(method);
+ }
+ try {
+ Exchange newExchange = exchange.copy();
+ processor.process(newExchange);
+ return newExchange.getOut(true).getBody();
+ }
+ catch (Exception e) {
+ throw new RuntimeBeanExpressionException(exchange, bean, method, e);
+ }
+ }
+}
Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
------------------------------------------------------------------------------
svn:eol-style = native
Copied: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanLanguage.java (from r594497, activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java)
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanLanguage.java?p2=activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanLanguage.java&p1=activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java&r1=594497&r2=595654&rev=595654&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguage.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/BeanLanguage.java Fri Nov 16 05:22:28 2007
@@ -14,140 +14,42 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.language.simple;
-
-import java.util.ArrayList;
-import java.util.List;
+package org.apache.camel.language.bean;
import org.apache.camel.Exchange;
import org.apache.camel.Expression;
import org.apache.camel.Predicate;
-import org.apache.camel.builder.ExpressionBuilder;
import org.apache.camel.builder.PredicateBuilder;
-import org.apache.camel.language.IllegalSyntaxException;
import org.apache.camel.spi.Language;
import org.apache.camel.util.ObjectHelper;
/**
- * A <a href="http://activemq.apache.org/camel/simple.html>simple language</a>
- * which maps simple property style notations to acces headers and bodies.
- * Examples of supported expressions are <p/>
- * <ul>
- * <li>in.header.foo or header.foo to access an inbound header called 'foo'</li>
- * <li>in.body or body to access the inbound body</li>
- * <li>out.header.foo to access an outbound header called 'foo'</li>
- * <li>out.body to access the inbound body</li>
- * <li>property.foo to access the exchange property called 'foo'</li>
- * <li>sys.foo to access the system property called 'foo'</li>
- * </ul>
+ * A <a href="http://activemq.apache.org/camel/bean-language.html>bean language</a>
+ * which uses a simple text notation to invoke methods on beans to evaluate predicates or expressions<p/>
+ * <p/>
+ * The notation is essentially <code>beanName.methodName</code> which is then invoked using the
+ * beanName to lookup in the <a href="http://activemq.apache.org/camel/registry.html>registry</a>
+ * then the method is invoked to evaluate the expression using the
+ * <a href="http://activemq.apache.org/camel/bean-integration.html>bean integration</a> to bind the
+ * {@link Exchange} to the method arguments.
*
* @version $Revision: $
*/
-public class SimpleLanguage implements Language {
-
- public static Expression simple(String expression) {
- SimpleLanguage language = new SimpleLanguage();
- return language.createExpression(expression);
- }
-
+public class BeanLanguage implements Language {
public Predicate<Exchange> createPredicate(String expression) {
return PredicateBuilder.toPredicate(createExpression(expression));
}
public Expression<Exchange> createExpression(String expression) {
- if (expression.indexOf("${") >= 0) {
- return createComplexExpression(expression);
- }
- return createSimpleExpression(expression);
- }
-
- protected Expression<Exchange> createComplexExpression(String expression) {
- List<Expression> results = new ArrayList<Expression>();
-
- int pivot = 0;
- int size = expression.length();
- while (pivot < size) {
- int idx = expression.indexOf("${", pivot);
- if (idx < 0) {
- results.add(createConstantExpression(expression, pivot, size));
- break;
- }
- else {
- if (pivot < idx) {
- results.add(createConstantExpression(expression, pivot, idx));
- }
- pivot = idx + 2;
- int endIdx = expression.indexOf("}", pivot);
- if (endIdx < 0) {
- throw new IllegalArgumentException("Expecting } but found end of string for simple expression: " + expression);
- }
- String simpleText = expression.substring(pivot, endIdx);
-
- Expression simpleExpression = createSimpleExpression(simpleText);
- results.add(simpleExpression);
- pivot = endIdx + 1;
- }
- }
- return ExpressionBuilder.concatExpression(results, expression);
- }
-
- protected Expression createConstantExpression(String expression, int start, int end) {
- return ExpressionBuilder.constantExpression(expression.substring(start, end));
- }
-
- protected Expression<Exchange> createSimpleExpression(String expression) {
- if (ObjectHelper.isEqualToAny(expression, "body", "in.body")) {
- return ExpressionBuilder.bodyExpression();
- }
- else if (ObjectHelper.equal(expression, "out.body")) {
- return ExpressionBuilder.outBodyExpression();
- }
-
- // in header expression
- String remainder = ifStartsWithReturnRemainder("in.header.", expression);
- if (remainder == null) {
- remainder = ifStartsWithReturnRemainder("header.", expression);
- }
- if (remainder == null) {
- remainder = ifStartsWithReturnRemainder("headers.", expression);
- }
- if (remainder == null) {
- remainder = ifStartsWithReturnRemainder("in.headers.", expression);
- }
- if (remainder != null) {
- return ExpressionBuilder.headerExpression(remainder);
- }
-
- // out header expression
- remainder = ifStartsWithReturnRemainder("out.header.", expression);
- if (remainder == null) {
- remainder = ifStartsWithReturnRemainder("out.headers.", expression);
- }
- if (remainder != null) {
- return ExpressionBuilder.outHeaderExpression(remainder);
- }
-
- // property
- remainder = ifStartsWithReturnRemainder("property.", expression);
- if (remainder != null) {
- return ExpressionBuilder.propertyExpression(remainder);
- }
-
- // system property
- remainder = ifStartsWithReturnRemainder("sys.", expression);
- if (remainder != null) {
- return ExpressionBuilder.propertyExpression(remainder);
- }
- throw new IllegalSyntaxException(this, expression);
- }
+ ObjectHelper.notNull(expression, "expression");
- protected String ifStartsWithReturnRemainder(String prefix, String text) {
- if (text.startsWith(prefix)) {
- String remainder = text.substring(prefix.length());
- if (remainder.length() > 0) {
- return remainder;
- }
+ int idx = expression.lastIndexOf('.');
+ String beanName = expression;
+ String method = null;
+ if (idx > 0) {
+ beanName = expression.substring(0, idx);
+ method = expression.substring(idx + 1);
}
- return null;
+ return new BeanExpression(beanName, method);
}
-}
+}
\ No newline at end of file
Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/RuntimeBeanExpressionException.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/RuntimeBeanExpressionException.java?rev=595654&view=auto
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/RuntimeBeanExpressionException.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/RuntimeBeanExpressionException.java Fri Nov 16 05:22:28 2007
@@ -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.language.bean;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.RuntimeExpressionException;
+
+/**
+ * @version $Revision: 1.1 $
+ */
+public class RuntimeBeanExpressionException extends RuntimeExpressionException {
+ private Exchange exchange;
+ private Object bean;
+ private String method;
+
+ public RuntimeBeanExpressionException(Exchange exchange, Object bean, String method, Throwable e) {
+ super("Failed to invoke method: " + method + " on " + bean + " due to: " + e, e);
+ this.exchange = exchange;
+ this.bean = bean;
+ this.method = method;
+ }
+
+ public Object getBean() {
+ return bean;
+ }
+
+ public Exchange getExchange() {
+ return exchange;
+ }
+
+ public String getMethod() {
+ return method;
+ }
+}
Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/language/bean/RuntimeBeanExpressionException.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/MethodCall.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/MethodCall.java?rev=595654&view=auto
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/MethodCall.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/MethodCall.java Fri Nov 16 05:22:28 2007
@@ -0,0 +1,81 @@
+/**
+ * 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.language;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.camel.Expression;
+import org.apache.camel.Exchange;
+import org.apache.camel.Predicate;
+import org.apache.camel.impl.RouteContext;
+import org.apache.camel.language.bean.BeanExpression;
+
+/**
+ * For expresions and predicates using the
+ * <a href="http://activemq.apache.org/camel/bean-language.html>bean language</a>
+ *
+ * @version $Revision: 1.1 $
+ */
+@XmlRootElement(name = "methodCall")
+public class MethodCall extends ExpressionType {
+ @XmlAttribute(required = false)
+ private String bean;
+ @XmlAttribute(required = false)
+ private String method;
+
+ public MethodCall() {
+ }
+
+ public MethodCall(String beanName) {
+ super(beanName);
+ }
+
+ public MethodCall(String beanName, String method) {
+ super(beanName);
+ this.method = method;
+ }
+
+ public String getLanguage() {
+ return "bean";
+ }
+
+ public String getMethod() {
+ return method;
+ }
+
+ public void setMethod(String method) {
+ this.method = method;
+ }
+
+ @Override
+ public Expression createExpression(RouteContext routeContext) {
+ return new BeanExpression(beanName(), getMethod());
+ }
+
+ @Override
+ public Predicate<Exchange> createPredicate(RouteContext routeContext) {
+ return new BeanExpression<Exchange>(beanName(), getMethod());
+ }
+
+ protected String beanName() {
+ if (bean != null) {
+ return bean;
+ }
+ return getExpression();
+ }
+}
\ No newline at end of file
Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/MethodCall.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/SimpleExpression.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/SimpleExpression.java?rev=595654&r1=595653&r2=595654&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/SimpleExpression.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/SimpleExpression.java Fri Nov 16 05:22:28 2007
@@ -19,7 +19,8 @@
import javax.xml.bind.annotation.XmlRootElement;
/**
- * For Groovy expresions and predicates
+ * For expresions and predicates using the
+ * <a href="http://activemq.apache.org/camel/simple.html>simple language</a>
*
* @version $Revision: 1.1 $
*/
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/SqlExpression.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/SqlExpression.java?rev=595654&r1=595653&r2=595654&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/SqlExpression.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/SqlExpression.java Fri Nov 16 05:22:28 2007
@@ -19,7 +19,7 @@
import javax.xml.bind.annotation.XmlRootElement;
/**
- * For SQ: expresions and predicates
+ * For SQL expresions and predicates
*
* @version $Revision: 1.1 $
*/
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java?rev=595654&r1=595653&r2=595654&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java Fri Nov 16 05:22:28 2007
@@ -116,4 +116,5 @@
}
return expression;
}
+
}
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java?rev=595654&r1=595653&r2=595654&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java Fri Nov 16 05:22:28 2007
@@ -16,8 +16,8 @@
*/
package org.apache.camel.util;
-import java.util.Map;
import java.util.HashMap;
+import java.util.Map;
import org.apache.camel.Endpoint;
import org.apache.camel.Exchange;
@@ -25,9 +25,9 @@
import org.apache.camel.InvalidPayloadException;
import org.apache.camel.InvalidTypeException;
import org.apache.camel.Message;
+import org.apache.camel.NoSuchBeanException;
import org.apache.camel.NoSuchEndpointException;
import org.apache.camel.NoSuchPropertyException;
-import org.apache.camel.CamelContext;
/**
* Some helper methods for working with {@link Exchange} objects
@@ -266,5 +266,41 @@
*/
public static String getContentType(Exchange exchange) {
return exchange.getIn().getHeader("Content-Type", String.class);
+ }
+
+ /**
+ * Performs a lookup in the registry of the mandatory bean name and throws an exception if it could not be found
+ */
+ public static Object lookupMandatoryBean(Exchange exchange, String name) {
+ Object value = lookupBean(exchange, name);
+ if (value == null) {
+ throw new NoSuchBeanException(name);
+ }
+ return value;
+ }
+
+ /**
+ * Performs a lookup in the registry of the mandatory bean name and throws an exception if it could not be found
+ */
+ public static <T> T lookupMandatoryBean(Exchange exchange, String name, Class<T> type) {
+ T value = lookupBean(exchange, name, type);
+ if (value == null) {
+ throw new NoSuchBeanException(name);
+ }
+ return value;
+ }
+
+ /**
+ * Performs a lookup in the registry of the bean name
+ */
+ public static Object lookupBean(Exchange exchange, String name) {
+ return exchange.getContext().getRegistry().lookup(name);
+ }
+
+ /**
+ * Performs a lookup in the registry of the bean name and type
+ */
+ public static <T> T lookupBean(Exchange exchange, String name, Class<T> type) {
+ return exchange.getContext().getRegistry().lookup(name, type);
}
}
Copied: activemq/camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/language/bean (from r594497, activemq/camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/language/simple)
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/language/bean?p2=activemq/camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/language/bean&p1=activemq/camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/language/simple&r1=594497&r2=595654&rev=595654&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/language/simple (original)
+++ activemq/camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/language/bean Fri Nov 16 05:22:28 2007
@@ -15,4 +15,4 @@
# limitations under the License.
#
-class=org.apache.camel.language.simple.SimpleLanguage
+class=org.apache.camel.language.bean.BeanLanguage
Modified: activemq/camel/trunk/camel-core/src/main/resources/org/apache/camel/model/language/jaxb.index
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/resources/org/apache/camel/model/language/jaxb.index?rev=595654&r1=595653&r2=595654&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/resources/org/apache/camel/model/language/jaxb.index (original)
+++ activemq/camel/trunk/camel-core/src/main/resources/org/apache/camel/model/language/jaxb.index Fri Nov 16 05:22:28 2007
@@ -20,6 +20,7 @@
HeaderExpression
JavaScriptExpression
LanguageExpression
+MethodCall
OgnlExpression
PhpExpression
PythonExpression
Copied: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/language/BeanTest.java (from r594497, activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java)
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/language/BeanTest.java?p2=activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/language/BeanTest.java&p1=activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java&r1=594497&r2=595654&rev=595654&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleTest.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/language/BeanTest.java Fri Nov 16 05:22:28 2007
@@ -16,48 +16,44 @@
*/
package org.apache.camel.language;
+import javax.naming.Context;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Header;
import org.apache.camel.LanguageTestSupport;
+import org.apache.camel.Message;
/**
* @version $Revision: $
*/
-public class SimpleTest extends LanguageTestSupport {
-
+public class BeanTest extends LanguageTestSupport {
public void testSimpleExpressions() throws Exception {
- assertExpression("body", "<hello id='m123'>world!</hello>");
- assertExpression("in.body", "<hello id='m123'>world!</hello>");
- assertExpression("in.header.foo", "abc");
- assertExpression("header.foo", "abc");
+ assertExpression("foo.cheese", "abc");
}
- public void testComplexExpressions() throws Exception {
- assertExpression("hey ${in.header.foo}", "hey abc");
- assertExpression("hey ${in.header.foo}!", "hey abc!");
- assertExpression("hey ${in.header.foo}-${in.header.foo}!", "hey abc-abc!");
- assertExpression("hey ${in.header.foo}${in.header.foo}", "hey abcabc");
- assertExpression("${in.header.foo}${in.header.foo}", "abcabc");
- assertExpression("${in.header.foo}", "abc");
- assertExpression("${in.header.foo}!", "abc!");
+ public void testPredicates() throws Exception {
+ assertPredicate("foo.isFooHeaderAbc");
}
-
- public void testInvalidComplexExpression() throws Exception {
- try {
- assertExpression("hey ${foo", "bad expression!");
- fail("Should have thrown an exception!");
- }
- catch (IllegalArgumentException e) {
- log.debug("Caught expected exception: " + e, e);
- }
+ protected String getLanguageName() {
+ return "bean";
}
- public void testPredicates() throws Exception {
- assertPredicate("body");
- assertPredicate("header.foo");
- assertPredicate("header.madeUpHeader", false);
+ @Override
+ protected Context createJndiContext() throws Exception {
+ Context context = super.createJndiContext();
+ context.bind("foo", new MyBean());
+ return context;
}
- protected String getLanguageName() {
- return "simple";
+ public static class MyBean {
+ public Object cheese(Exchange exchange) {
+ Message in = exchange.getIn();
+ return in.getHeader("foo");
+ }
+
+ public boolean isFooHeaderAbc(@Header(name = "foo")String foo) {
+ return "abc".equals(foo);
+ }
}
}
Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/AggregatorTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/AggregatorTest.java?rev=595654&r1=595653&r2=595654&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/AggregatorTest.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/AggregatorTest.java Fri Nov 16 05:22:28 2007
@@ -17,10 +17,8 @@
package org.apache.camel.processor;
import org.apache.camel.ContextTestSupport;
-import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.processor.aggregate.UseLatestAggregationStrategy;
/**
* @version $Revision: 1.1 $
@@ -52,31 +50,17 @@
template.sendBodyAndHeader("direct:predicate", body, "cheese", 123);
}
- resultEndpoint.assertIsSatisfied();
+ resultEndpoint.assertIsSatisfied();
}
-
+
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() {
// START SNIPPET: ex
from("direct:start").aggregator(header("cheese")).to("mock:result");
-
- from("direct:predicate").aggregator(header("cheese"), new UseLatestAggregationStrategy() {
-
- @Override
- public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
- Exchange result = super.aggregate(oldExchange, newExchange);
- Integer old = (Integer) oldExchange.getProperty("aggregated");
- if (old == null) {
- old = 1;
- }
- result.setProperty("aggregated", old + 1);
- return result;
- }
-
- }).
- completedPredicate(header("aggregated").
- isEqualTo(5)).to("mock:result");
+
+ from("direct:predicate").aggregator(header("cheese"), new MyAggregationStrategy()).
+ completedPredicate(header("aggregated").isEqualTo(5)).to("mock:result");
// END SNIPPET: ex
}
};
Added: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MyAggregationStrategy.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MyAggregationStrategy.java?rev=595654&view=auto
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MyAggregationStrategy.java (added)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MyAggregationStrategy.java Fri Nov 16 05:22:28 2007
@@ -0,0 +1,48 @@
+/**
+ *
+ * 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.processor;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Header;
+import org.apache.camel.processor.aggregate.UseLatestAggregationStrategy;
+
+/**
+ * @version $Revision: 1.1 $
+*/
+public class MyAggregationStrategy extends UseLatestAggregationStrategy {
+ @Override
+ public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
+ Exchange result = super.aggregate(oldExchange, newExchange);
+ Integer old = (Integer) oldExchange.getProperty("aggregated");
+ if (old == null) {
+ old = 1;
+ }
+ result.setProperty("aggregated", old + 1);
+ return result;
+ }
+
+ /**
+ * An expression used to determine if the aggreagation is complete
+ */
+ public boolean isCompleted(@Header(name="aggregated") Integer aggregated) {
+ if (aggregated == null) {
+ return false;
+ }
+ return aggregated == 5;
+ }
+}
Propchange: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MyAggregationStrategy.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: activemq/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/aggregator.xml
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/aggregator.xml?rev=595654&r1=595653&r2=595654&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/aggregator.xml (original)
+++ activemq/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/aggregator.xml Fri Nov 16 05:22:28 2007
@@ -31,7 +31,19 @@
<to uri="mock:result"/>
</aggregator>
</route>
+
+ <route>
+ <from uri="direct:predicate"/>
+ <aggregator strategyRef="myAggregatorStrategy">
+ <simple>header.cheese</simple>
+ <to uri="mock:result"/>
+ <completedPredicate>
+ <methodCall method="isCompleted">myAggregatorStrategy</methodCall>
+ </completedPredicate>
+ </aggregator>
+ </route>
</camelContext>
<!-- END SNIPPET: example -->
+ <bean id="myAggregatorStrategy" class="org.apache.camel.processor.MyAggregationStrategy"/>
</beans>