You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2009/05/19 07:59:38 UTC

svn commit: r776194 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/builder/ main/java/org/apache/camel/component/bean/ main/java/org/apache/camel/impl/ main/java/org/apache/camel/language/simple/ main/java/org/apache/camel/processor/ main...

Author: davsclaus
Date: Tue May 19 05:59:37 2009
New Revision: 776194

URL: http://svn.apache.org/viewvc?rev=776194&view=rev
Log:
CAMEL-1419: PredicateBuilder binary predicates uses type coerce when testing. This allows you to compare String with Integer even for > operators and the likes. Fixed CS.

Added:
    camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBinaryCoerceRouteTest.java   (with props)
    camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBinaryCoerceTypeTest.java   (with props)
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/CamelPostProcessorHelper.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguageSupport.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/SendProcessor.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanExcludedMethodTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleOperatorTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RandomLoadBalanceTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/async/AsyncRouteTest.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java?rev=776194&r1=776193&r2=776194&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/builder/PredicateBuilder.java Tue May 19 05:59:37 2009
@@ -138,7 +138,15 @@
         return new BinaryPredicateSupport(left, right) {
 
             protected boolean matches(Exchange exchange, Object leftValue, Object rightValue) {
-                return ObjectHelper.equal(leftValue, rightValue);
+                if (leftValue == null && rightValue == null) {
+                    // they are equal
+                    return true;
+                } else if (leftValue == null || rightValue == null) {
+                    // only one of them is null so they are not equal
+                    return false;
+                }
+
+                return ObjectHelper.typeCoerceEquals(exchange.getContext().getTypeConverter(), leftValue, rightValue);
             }
 
             protected String getOperationText() {
@@ -151,7 +159,15 @@
         return new BinaryPredicateSupport(left, right) {
 
             protected boolean matches(Exchange exchange, Object leftValue, Object rightValue) {
-                return !ObjectHelper.equal(leftValue, rightValue);
+                if (leftValue == null && rightValue == null) {
+                    // they are equal
+                    return false;
+                } else if (leftValue == null || rightValue == null) {
+                    // only one of them is null so they are not equal
+                    return true;
+                }
+
+                return ObjectHelper.typeCoerceNotEquals(exchange.getContext().getTypeConverter(), leftValue, rightValue);
             }
 
             protected String getOperationText() {
@@ -164,7 +180,15 @@
         return new BinaryPredicateSupport(left, right) {
 
             protected boolean matches(Exchange exchange, Object leftValue, Object rightValue) {
-                return compare(leftValue, rightValue) < 0;
+                if (leftValue == null && rightValue == null) {
+                    // they are equal
+                    return true;
+                } else if (leftValue == null || rightValue == null) {
+                    // only one of them is null so they are not equal
+                    return false;
+                }
+
+                return ObjectHelper.typeCoerceCompare(exchange.getContext().getTypeConverter(), leftValue, rightValue) < 0;
             }
 
             protected String getOperationText() {
@@ -177,7 +201,15 @@
         return new BinaryPredicateSupport(left, right) {
 
             protected boolean matches(Exchange exchange, Object leftValue, Object rightValue) {
-                return compare(leftValue, rightValue) <= 0;
+                if (leftValue == null && rightValue == null) {
+                    // they are equal
+                    return true;
+                } else if (leftValue == null || rightValue == null) {
+                    // only one of them is null so they are not equal
+                    return false;
+                }
+
+                return ObjectHelper.typeCoerceCompare(exchange.getContext().getTypeConverter(), leftValue, rightValue) <= 0;
             }
 
             protected String getOperationText() {
@@ -190,7 +222,15 @@
         return new BinaryPredicateSupport(left, right) {
 
             protected boolean matches(Exchange exchange, Object leftValue, Object rightValue) {
-                return compare(leftValue, rightValue) > 0;
+                if (leftValue == null && rightValue == null) {
+                    // they are equal
+                    return false;
+                } else if (leftValue == null || rightValue == null) {
+                    // only one of them is null so they are not equal
+                    return false;
+                }
+
+                return ObjectHelper.typeCoerceCompare(exchange.getContext().getTypeConverter(), leftValue, rightValue) > 0;
             }
 
             protected String getOperationText() {
@@ -203,7 +243,15 @@
         return new BinaryPredicateSupport(left, right) {
 
             protected boolean matches(Exchange exchange, Object leftValue, Object rightValue) {
-                return compare(leftValue, rightValue) >= 0;
+                if (leftValue == null && rightValue == null) {
+                    // they are equal
+                    return true;
+                } else if (leftValue == null || rightValue == null) {
+                    // only one of them is null so they are not equal
+                    return false;
+                }
+
+                return ObjectHelper.typeCoerceCompare(exchange.getContext().getTypeConverter(), leftValue, rightValue) >= 0;
             }
 
             protected String getOperationText() {
@@ -216,6 +264,14 @@
         return new BinaryPredicateSupport(left, right) {
 
             protected boolean matches(Exchange exchange, Object leftValue, Object rightValue) {
+                if (leftValue == null && rightValue == null) {
+                    // they are equal
+                    return true;
+                } else if (leftValue == null || rightValue == null) {
+                    // only one of them is null so they are not equal
+                    return false;
+                }
+
                 return ObjectHelper.contains(leftValue, rightValue);
             }
 
@@ -226,11 +282,43 @@
     }
 
     public static Predicate isNull(final Expression expression) {
-        return isEqualTo(expression, ExpressionBuilder.constantExpression(null));
+        return new BinaryPredicateSupport(expression, ExpressionBuilder.constantExpression(null)) {
+
+            protected boolean matches(Exchange exchange, Object leftValue, Object rightValue) {
+                if (leftValue == null) {
+                    // the left operator is null so its true
+                    return true;
+                } 
+
+                return ObjectHelper.typeCoerceEquals(exchange.getContext().getTypeConverter(), leftValue, rightValue);
+            }
+
+            protected String getOperationText() {
+                // leave the operation text as "is not" as Camel will insert right and left expression around it
+                // so it will be displayed as: XXX is null
+                return "is";
+            }
+        };
     }
 
     public static Predicate isNotNull(final Expression expression) {
-        return isNotEqualTo(expression, ExpressionBuilder.constantExpression(null));
+        return new BinaryPredicateSupport(expression, ExpressionBuilder.constantExpression(null)) {
+
+            protected boolean matches(Exchange exchange, Object leftValue, Object rightValue) {
+                if (leftValue != null) {
+                    // the left operator is not null so its true
+                    return true;
+                }
+
+                return ObjectHelper.typeCoerceNotEquals(exchange.getContext().getTypeConverter(), leftValue, rightValue);
+            }
+
+            protected String getOperationText() {
+                // leave the operation text as "is not" as Camel will insert right and left expression around it
+                // so it will be displayed as: XXX is not null
+                return "is not";
+            }
+        };
     }
 
     public static Predicate isInstanceOf(final Expression expression, final Class<?> type) {

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java?rev=776194&r1=776193&r2=776194&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java Tue May 19 05:59:37 2009
@@ -349,7 +349,7 @@
 
     @SuppressWarnings("unchecked")
     private MethodInfo chooseMethodWithMatchingBody(Exchange exchange, Collection<MethodInfo> operationList)
-            throws AmbiguousMethodCallException {
+        throws AmbiguousMethodCallException {
         // lets see if we can find a method who's body param type matches the message body
         Message in = exchange.getIn();
         Object body = in.getBody();
@@ -509,7 +509,7 @@
     }
 
     private MethodInfo chooseMethodWithCustomAnnotations(Exchange exchange, Collection<MethodInfo> possibles)
-            throws AmbiguousMethodCallException {
+        throws AmbiguousMethodCallException {
         // if we have only one method with custom annotations lets choose that
         MethodInfo chosen = null;
         for (MethodInfo possible : possibles) {

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/CamelPostProcessorHelper.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/CamelPostProcessorHelper.java?rev=776194&r1=776193&r2=776194&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/CamelPostProcessorHelper.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/CamelPostProcessorHelper.java Tue May 19 05:59:37 2009
@@ -120,9 +120,7 @@
      */
     public Object getInjectionValue(Class<?> type, String endpointUri, String endpointRef, String injectionPointName) {
         if (type.isAssignableFrom(ProducerTemplate.class)) {
-            // endpoint is optional for this injection point
-            Endpoint endpoint = getEndpointInjection(endpointUri, endpointRef, injectionPointName, false);
-            return new DefaultProducerTemplate(getCamelContext(), endpoint);
+            return createInjectionProducerTemplate(endpointUri, endpointRef, injectionPointName);
         } else {
             Endpoint endpoint = getEndpointInjection(endpointUri, endpointRef, injectionPointName, true);
             if (endpoint != null) {
@@ -148,8 +146,13 @@
         }
     }
 
-    protected RuntimeException createProxyInstantiationRuntimeException(Class<?> type, Endpoint endpoint, Exception e) {
-        return new ProxyInstantiationException(type, endpoint, e);
+    /**
+     * Factory method to create a {@link org.apache.camel.ProducerTemplate} to be injected into a POJO
+     */
+    protected ProducerTemplate createInjectionProducerTemplate(String endpointUri, String endpointRef, String injectionPointName) {
+        // endpoint is optional for this injection point
+        Endpoint endpoint = getEndpointInjection(endpointUri, endpointRef, injectionPointName, false);
+        return new DefaultProducerTemplate(getCamelContext(), endpoint);
     }
 
     /**
@@ -177,4 +180,8 @@
             throw ObjectHelper.wrapRuntimeCamelException(e);
         }
     }
+
+    protected RuntimeException createProxyInstantiationRuntimeException(Class<?> type, Endpoint endpoint, Exception e) {
+        return new ProxyInstantiationException(type, endpoint, e);
+    }
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguageSupport.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguageSupport.java?rev=776194&r1=776193&r2=776194&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguageSupport.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleLanguageSupport.java Tue May 19 05:59:37 2009
@@ -78,11 +78,14 @@
 
         final Expression right;
         final Expression rightConverted;
+        final Boolean isNull;
         // special null handling
-        if ("null".equals(text)) {
+        if ("null".equals(text) || "'null'".equals(text)) {
+            isNull = Boolean.TRUE;
             right = createConstantExpression(null);
             rightConverted = right;
         } else {
+            isNull = Boolean.FALSE;
             // text can either be a constant enclosed by ' ' or another expression using ${ } placeholders
             String constant = ObjectHelper.between(text, "'", "'");
             if (constant == null) {
@@ -100,7 +103,14 @@
         return new Expression() {
             public <T> T evaluate(Exchange exchange, Class<T> type) {
                 Predicate predicate = null;
-                if (operator == EQ) {
+
+                if (operator == EQ && isNull) {
+                    // special for EQ null
+                    predicate = PredicateBuilder.isNull(left);
+                } else if (operator == NOT && isNull) {
+                    // special for not EQ null
+                    predicate = PredicateBuilder.isNotNull(left);
+                } else if (operator == EQ) {
                     predicate = PredicateBuilder.isEqualTo(left, rightConverted);
                 } else if (operator == GT) {
                     predicate = PredicateBuilder.isGreaterThan(left, rightConverted);

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/SendProcessor.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/SendProcessor.java?rev=776194&r1=776193&r2=776194&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/SendProcessor.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/SendProcessor.java Tue May 19 05:59:37 2009
@@ -58,7 +58,7 @@
             if (isStopped()) {
                 LOG.warn("Ignoring exchange sent after processor is stopped: " + exchange);
             } else {
-                throw new IllegalStateException("No producer, this processor has not been started!");
+                throw new IllegalStateException("No producer, this processor has not been started: " + this);
             }
         } else {
             exchange = configureExchange(exchange);

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java?rev=776194&r1=776193&r2=776194&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java Tue May 19 05:59:37 2009
@@ -38,6 +38,7 @@
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.Exchange;
 import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.TypeConverter;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -56,6 +57,71 @@
     }
 
     /**
+     * A helper method for comparing objects for equality in which it uses type coerce to coerce
+     * types between the left and right values. This allows you to equal test eg String and Integer as
+     * Camel will be able to coerce the types
+     */
+    public static boolean typeCoerceEquals(TypeConverter converter, Object leftValue, Object rightValue) {
+        // try without type coerce
+        boolean answer = equal(leftValue, rightValue);
+        if (answer) {
+            return true;
+        }
+
+        if (leftValue == null || rightValue == null) {
+            // no reason to continue as the first equal did not match and now one of the values is null
+            // so it wont help to type coerece to a null type
+            return false;
+        }
+
+        // convert left to right
+        Object value = converter.convertTo(rightValue.getClass(), leftValue);
+        answer = equal(value, rightValue);
+        if (answer) {
+            return true;
+        }
+
+        // convert right to left
+        value = converter.convertTo(leftValue.getClass(), rightValue);
+        answer = equal(leftValue, value);
+        return answer;
+    }
+
+    /**
+     * A helper method for comparing objects for equality in which it uses type coerce to coerce
+     * types between the left and right values. This allows you to equal test eg String and Integer as
+     * Camel will be able to coerce the types
+     */
+    public static boolean typeCoerceNotEquals(TypeConverter converter, Object leftValue, Object rightValue) {
+        return !typeCoerceEquals(converter, leftValue, rightValue);
+    }
+
+    /**
+     * A helper method for comparing objects ordering in which it uses type coerce to coerce
+     * types between the left and right values. This allows you to equal test eg String and Integer as
+     * Camel will be able to coerce the types
+     */
+    @SuppressWarnings("unchecked")
+    public static int typeCoerceCompare(TypeConverter converter, Object leftValue, Object rightValue) {
+        if (rightValue instanceof Comparable) {
+            Object value = converter.convertTo(rightValue.getClass(), leftValue);
+            if (value != null) {
+                return ((Comparable) rightValue).compareTo(value) * -1;
+            }
+        }
+
+        if (leftValue instanceof Comparable) {
+            Object value = converter.convertTo(leftValue.getClass(), rightValue);
+            if (value != null) {
+                return ((Comparable) leftValue).compareTo(value);
+            }
+        }
+
+        // use regular compare
+        return compare(leftValue, rightValue);
+    }
+
+    /**
      * A helper method for comparing objects for equality while handling nulls
      */
     public static boolean equal(Object a, Object b) {
@@ -610,9 +676,9 @@
      * @return <tt>true</tt> if it override, <tt>false</tt> otherwise
      */
     public static boolean isOverridingMethod(Method source, Method target) {
-        if (source.getName().equals(target.getName()) &&
-                source.getReturnType().equals(target.getReturnType()) &&
-                source.getParameterTypes().length == target.getParameterTypes().length) {
+        if (source.getName().equals(target.getName())
+                && source.getReturnType().equals(target.getReturnType()) 
+                && source.getParameterTypes().length == target.getParameterTypes().length) {
 
             // test if parameter types is the same as well
             for (int i = 0; i < source.getParameterTypes().length; i++) {

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBinaryCoerceRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBinaryCoerceRouteTest.java?rev=776194&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBinaryCoerceRouteTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBinaryCoerceRouteTest.java Tue May 19 05:59:37 2009
@@ -0,0 +1,183 @@
+/**
+ * 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.builder;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.WaitForTaskToComplete;
+
+/**
+ * @version $Revision$
+ */
+public class PredicateBinaryCoerceRouteTest extends ContextTestSupport {
+
+    public void testNoHeder() throws Exception {
+        getMockEndpoint("mock:123").expectedMessageCount(0);
+        getMockEndpoint("mock:456").expectedMessageCount(0);
+        getMockEndpoint("mock:other").expectedMessageCount(1);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testHederAsNumber123() throws Exception {
+        getMockEndpoint("mock:123").expectedMessageCount(1);
+        getMockEndpoint("mock:456").expectedMessageCount(0);
+        getMockEndpoint("mock:other").expectedMessageCount(0);
+
+        template.sendBodyAndHeader("direct:start", "Hello World", "foo", 123);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testHederAsNumber456() throws Exception {
+        getMockEndpoint("mock:123").expectedMessageCount(0);
+        getMockEndpoint("mock:456").expectedMessageCount(1);
+        getMockEndpoint("mock:other").expectedMessageCount(0);
+
+        template.sendBodyAndHeader("direct:start", "Hello World", "foo", 456);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testHederAsNumber999() throws Exception {
+        getMockEndpoint("mock:123").expectedMessageCount(0);
+        getMockEndpoint("mock:456").expectedMessageCount(0);
+        getMockEndpoint("mock:other").expectedMessageCount(1);
+
+        template.sendBodyAndHeader("direct:start", "Hello World", "foo", 999);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testHederAsString123() throws Exception {
+        getMockEndpoint("mock:123").expectedMessageCount(1);
+        getMockEndpoint("mock:456").expectedMessageCount(0);
+        getMockEndpoint("mock:other").expectedMessageCount(0);
+
+        template.sendBodyAndHeader("direct:start", "Hello World", "foo", "123");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testHederAsString456() throws Exception {
+        getMockEndpoint("mock:123").expectedMessageCount(0);
+        getMockEndpoint("mock:456").expectedMessageCount(1);
+        getMockEndpoint("mock:other").expectedMessageCount(0);
+
+        template.sendBodyAndHeader("direct:start", "Hello World", "foo", "456");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testHederAsString999() throws Exception {
+        getMockEndpoint("mock:123").expectedMessageCount(0);
+        getMockEndpoint("mock:456").expectedMessageCount(0);
+        getMockEndpoint("mock:other").expectedMessageCount(1);
+
+        template.sendBodyAndHeader("direct:start", "Hello World", "foo", "999");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testHederAsEnum() throws Exception {
+        getMockEndpoint("mock:enum").expectedMessageCount(1);
+
+        template.sendBodyAndHeader("direct:start", "Hello World", "foo", WaitForTaskToComplete.Always);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testHederAsEnumString() throws Exception {
+        getMockEndpoint("mock:enum").expectedMessageCount(1);
+
+        template.sendBodyAndHeader("direct:start", "Hello World", "foo", "Always");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testOtherMax() throws Exception {
+        getMockEndpoint("mock:max").expectedMessageCount(1);
+        getMockEndpoint("mock:min").expectedMessageCount(0);
+
+        template.sendBodyAndHeader("direct:foo", "Hello World", "foo", "250");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testOtherMin() throws Exception {
+        getMockEndpoint("mock:max").expectedMessageCount(0);
+        getMockEndpoint("mock:min").expectedMessageCount(1);
+
+        template.sendBodyAndHeader("direct:foo", "Hello World", "foo", "200");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testOtherAlways() throws Exception {
+        getMockEndpoint("mock:max").expectedMessageCount(0);
+        getMockEndpoint("mock:min").expectedMessageCount(0);
+        getMockEndpoint("mock:enum").expectedMessageCount(1);
+
+        template.sendBodyAndHeader("direct:foo", "Hello World", "enum", "Always");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testOtherNewer() throws Exception {
+        getMockEndpoint("mock:max").expectedMessageCount(0);
+        getMockEndpoint("mock:min").expectedMessageCount(0);
+        getMockEndpoint("mock:enum").expectedMessageCount(0);
+        getMockEndpoint("mock:other").expectedMessageCount(1);
+
+        template.sendBodyAndHeader("direct:foo", "Hello World", "enum", "Newer");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testOtherIfReplyExpected() throws Exception {
+        getMockEndpoint("mock:max").expectedMessageCount(0);
+        getMockEndpoint("mock:min").expectedMessageCount(0);
+        getMockEndpoint("mock:enum").expectedMessageCount(1);
+
+        template.sendBodyAndHeader("direct:foo", "Hello World", "enum", WaitForTaskToComplete.IfReplyExpected);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .choice()
+                        .when(header("foo").isEqualTo("123")).to("mock:123")
+                        .when(header("foo").isEqualTo(456)).to("mock:456")
+                        .when(header("foo").isEqualTo(WaitForTaskToComplete.Always)).to("mock:enum")
+                        .otherwise().to("mock:other");
+
+                from("direct:foo")
+                    .choice()
+                        .when(header("enum").isGreaterThanOrEqualTo(WaitForTaskToComplete.IfReplyExpected)).to("mock:enum")
+                        .when(header("foo").isGreaterThan("200")).to("mock:max")
+                        .when(header("foo").isLessThanOrEqualTo(200)).to("mock:min")
+                        .otherwise().to("mock:other");
+            }
+        };
+    }
+}

Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBinaryCoerceRouteTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBinaryCoerceRouteTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBinaryCoerceTypeTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBinaryCoerceTypeTest.java?rev=776194&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBinaryCoerceTypeTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBinaryCoerceTypeTest.java Tue May 19 05:59:37 2009
@@ -0,0 +1,209 @@
+/**
+ * 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.builder;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Expression;
+import org.apache.camel.Message;
+import org.apache.camel.Predicate;
+import org.apache.camel.TestSupport;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.DefaultExchange;
+
+/**
+ * @version $Revision$
+ */
+public class PredicateBinaryCoerceTypeTest extends TestSupport {
+    protected Exchange exchange = new DefaultExchange(new DefaultCamelContext());
+
+    public void testIsNull() throws Exception {
+        Expression a = ExpressionBuilder.constantExpression("123");
+        assertDoesNotMatch(PredicateBuilder.isNull(a));
+
+        a = ExpressionBuilder.constantExpression(null);
+        assertMatches(PredicateBuilder.isNull(a));
+    }
+
+    public void testIsNotNull() throws Exception {
+        Expression a = ExpressionBuilder.constantExpression("123");
+        assertMatches(PredicateBuilder.isNotNull(a));
+
+        a = ExpressionBuilder.constantExpression(null);
+        assertDoesNotMatch(PredicateBuilder.isNotNull(a));
+    }
+
+    public void testEqual() throws Exception {
+        Expression a = ExpressionBuilder.constantExpression("123");
+        Expression b = ExpressionBuilder.constantExpression(Integer.valueOf("123"));
+        assertMatches(PredicateBuilder.isEqualTo(a, b));
+
+        // reverse the type and try again
+        a = ExpressionBuilder.constantExpression(Integer.valueOf("123"));
+        b = ExpressionBuilder.constantExpression("123");
+        assertMatches(PredicateBuilder.isEqualTo(a, b));
+    }
+
+    public void testEqualWithNull() throws Exception {
+        Expression a = ExpressionBuilder.constantExpression("123");
+        Expression b = ExpressionBuilder.constantExpression(null);
+        assertDoesNotMatch(PredicateBuilder.isEqualTo(a, b));
+
+        // reverse the type and try again
+        a = ExpressionBuilder.constantExpression(null);
+        b = ExpressionBuilder.constantExpression("123");
+        assertDoesNotMatch(PredicateBuilder.isEqualTo(a, b));
+
+        // try two null values
+        a = ExpressionBuilder.constantExpression(null);
+        b = ExpressionBuilder.constantExpression(null);
+        assertMatches(PredicateBuilder.isEqualTo(a, b));
+    }
+
+    public void testNotEqual() throws Exception {
+        Expression a = ExpressionBuilder.constantExpression("123");
+        Expression b = ExpressionBuilder.constantExpression(Integer.valueOf("123"));
+
+        assertDoesNotMatch(PredicateBuilder.isNotEqualTo(a, b));
+
+        a = ExpressionBuilder.constantExpression("333");
+        assertMatches(PredicateBuilder.isNotEqualTo(a, b));
+    }
+
+    public void testNotEqualWithNull() throws Exception {
+        Expression a = ExpressionBuilder.constantExpression("123");
+        Expression b = ExpressionBuilder.constantExpression(null);
+        assertMatches(PredicateBuilder.isNotEqualTo(a, b));
+
+        // reverse the type and try again
+        a = ExpressionBuilder.constantExpression(null);
+        b = ExpressionBuilder.constantExpression("123");
+        assertMatches(PredicateBuilder.isNotEqualTo(a, b));
+
+        // try two null values
+        a = ExpressionBuilder.constantExpression(null);
+        b = ExpressionBuilder.constantExpression(null);
+        assertDoesNotMatch(PredicateBuilder.isNotEqualTo(a, b));
+    }
+
+    public void testGreatherThan() throws Exception {
+        Expression a = ExpressionBuilder.constantExpression("200");
+        Expression b = ExpressionBuilder.constantExpression(Integer.valueOf("100"));
+
+        assertMatches(PredicateBuilder.isGreaterThan(a, b));
+        assertDoesNotMatch(PredicateBuilder.isGreaterThan(b, a));
+
+        // reverse the types and try again
+        a = ExpressionBuilder.constantExpression(Integer.valueOf("100"));
+        b = ExpressionBuilder.constantExpression("200");
+
+        assertDoesNotMatch(PredicateBuilder.isGreaterThan(a, b));
+        assertMatches(PredicateBuilder.isGreaterThan(b, a));
+    }
+
+    public void testGreatherThanOrEqual() throws Exception {
+        // greather than
+        Expression a = ExpressionBuilder.constantExpression("200");
+        Expression b = ExpressionBuilder.constantExpression(Integer.valueOf("100"));
+
+        assertMatches(PredicateBuilder.isGreaterThanOrEqualTo(a, b));
+        assertDoesNotMatch(PredicateBuilder.isGreaterThanOrEqualTo(b, a));
+
+        // reverse the types and try again
+        a = ExpressionBuilder.constantExpression(Integer.valueOf("100"));
+        b = ExpressionBuilder.constantExpression("200");
+
+        assertDoesNotMatch(PredicateBuilder.isGreaterThanOrEqualTo(a, b));
+        assertMatches(PredicateBuilder.isGreaterThanOrEqualTo(b, a));
+
+        // equal
+        a = ExpressionBuilder.constantExpression("100");
+        b = ExpressionBuilder.constantExpression(Integer.valueOf("100"));
+
+        assertMatches(PredicateBuilder.isGreaterThanOrEqualTo(a, b));
+        assertMatches(PredicateBuilder.isGreaterThanOrEqualTo(b, a));
+
+        // reverse the types and try again
+        a = ExpressionBuilder.constantExpression(Integer.valueOf("100"));
+        b = ExpressionBuilder.constantExpression("100");
+
+        assertMatches(PredicateBuilder.isGreaterThanOrEqualTo(a, b));
+        assertMatches(PredicateBuilder.isGreaterThanOrEqualTo(b, a));
+    }
+
+    public void testLessThan() throws Exception {
+        Expression a = ExpressionBuilder.constantExpression("100");
+        Expression b = ExpressionBuilder.constantExpression(Integer.valueOf("200"));
+
+        assertMatches(PredicateBuilder.isLessThan(a, b));
+        assertDoesNotMatch(PredicateBuilder.isLessThan(b, a));
+
+        // reverse the types and try again
+        a = ExpressionBuilder.constantExpression(Integer.valueOf("100"));
+        b = ExpressionBuilder.constantExpression("200");
+
+        assertMatches(PredicateBuilder.isLessThan(a, b));
+        assertDoesNotMatch(PredicateBuilder.isLessThan(b, a));
+    }
+
+    public void testLessThanOrEqual() throws Exception {
+        // less than
+        Expression a = ExpressionBuilder.constantExpression("100");
+        Expression b = ExpressionBuilder.constantExpression(Integer.valueOf("200"));
+
+        assertMatches(PredicateBuilder.isLessThanOrEqualTo(a, b));
+        assertDoesNotMatch(PredicateBuilder.isLessThanOrEqualTo(b, a));
+
+        // reverse the types and try again
+        a = ExpressionBuilder.constantExpression(Integer.valueOf("200"));
+        b = ExpressionBuilder.constantExpression("100");
+
+        assertDoesNotMatch(PredicateBuilder.isLessThanOrEqualTo(a, b));
+        assertMatches(PredicateBuilder.isLessThanOrEqualTo(b, a));
+
+        // equal
+        a = ExpressionBuilder.constantExpression("100");
+        b = ExpressionBuilder.constantExpression(Integer.valueOf("100"));
+
+        assertMatches(PredicateBuilder.isLessThanOrEqualTo(a, b));
+        assertMatches(PredicateBuilder.isLessThanOrEqualTo(b, a));
+
+        // reverse the types and try again
+        a = ExpressionBuilder.constantExpression(Integer.valueOf("100"));
+        b = ExpressionBuilder.constantExpression("100");
+
+        assertMatches(PredicateBuilder.isGreaterThanOrEqualTo(a, b));
+        assertMatches(PredicateBuilder.isGreaterThanOrEqualTo(b, a));
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        Message in = exchange.getIn();
+        in.setBody("Hello there!");
+        in.setHeader("name", "James");
+        in.setHeader("location", "Islington,London,UK");
+        in.setHeader("size", 10);
+    }
+
+    protected void assertMatches(Predicate predicate) {
+        assertPredicateMatches(predicate, exchange);
+    }
+
+    protected void assertDoesNotMatch(Predicate predicate) {
+        assertPredicateDoesNotMatch(predicate, exchange);
+    }
+}

Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBinaryCoerceTypeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/builder/PredicateBinaryCoerceTypeTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanExcludedMethodTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanExcludedMethodTest.java?rev=776194&r1=776193&r2=776194&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanExcludedMethodTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/bean/BeanExcludedMethodTest.java Tue May 19 05:59:37 2009
@@ -53,6 +53,11 @@
         }
 
         @Override
+        public int hashCode() {
+            return super.hashCode();
+        }
+
+        @Override
         public String toString() {
             return "dummy";
         }
@@ -67,6 +72,11 @@
         }
 
         @Override
+        public int hashCode() {
+            return super.hashCode();
+        }
+
+        @Override
         public String toString() {
             return "dummy";
         }

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleOperatorTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleOperatorTest.java?rev=776194&r1=776193&r2=776194&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleOperatorTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/language/SimpleOperatorTest.java Tue May 19 05:59:37 2009
@@ -129,11 +129,17 @@
     public void testIsNull() throws Exception {
         assertExpression("${in.header.foo} == null", false);
         assertExpression("${in.header.none} == null", true);
+
+        assertExpression("${in.header.foo} == 'null'", false);
+        assertExpression("${in.header.none} == 'null'", true);
     }
 
     public void testIsNotNull() throws Exception {
         assertExpression("${in.header.foo} != null", true);
         assertExpression("${in.header.none} != null", false);
+
+        assertExpression("${in.header.foo} != 'null'", true);
+        assertExpression("${in.header.none} != 'null'", false);
     }
 
     public void testRightOperatorIsSimpleLanauge() throws Exception {

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RandomLoadBalanceTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RandomLoadBalanceTest.java?rev=776194&r1=776193&r2=776194&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RandomLoadBalanceTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RandomLoadBalanceTest.java Tue May 19 05:59:37 2009
@@ -44,10 +44,10 @@
     }
 
     public void testRandom() throws Exception {
-        // it should be safe to assume that they should at least each get > 10 messages
-        x.expectedMinimumMessageCount(10);
-        y.expectedMinimumMessageCount(10);
-        z.expectedMinimumMessageCount(10);
+        // it should be safe to assume that they should at least each get > 5 messages
+        x.expectedMinimumMessageCount(5);
+        y.expectedMinimumMessageCount(5);
+        z.expectedMinimumMessageCount(5);
 
         for (int i = 0; i < 100; i++) {
             template.sendBody("direct:start", "Hello World");

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/async/AsyncRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/async/AsyncRouteTest.java?rev=776194&r1=776193&r2=776194&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/async/AsyncRouteTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/async/AsyncRouteTest.java Tue May 19 05:59:37 2009
@@ -112,13 +112,10 @@
         // as it turns into a async route later we get a Future as response
         assertIsInstanceOf(Exchange.class, out);
         Future future = out.getOut().getBody(Future.class);
+        assertFalse("Should not be done", future.isDone());
 
         assertMockEndpointsSatisfied();
 
-        // for slower computers we invoke the get with a timeout
-        future.get(1, TimeUnit.SECONDS);
-        assertTrue("Should be done", future.isDone());
-
         assertEquals("AB", route);
     }