Repository: camel
Updated Branches:
  refs/heads/master 5b27ecc8a -> ea6d2fcc1


CAMEL-8684: Fixed load balancer model to not implement LoadBalancer/Processor 
as that is runtime. Also ensure Java DSL build the routes using the model 
classes instead of cheating.


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

Branch: refs/heads/master
Commit: ea6d2fcc19acd3ed283c82c4076720b05acde016
Parents: 5b27ecc
Author: Claus Ibsen <davscl...@apache.org>
Authored: Wed Apr 22 14:29:31 2015 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Wed Apr 22 15:07:18 2015 +0200

----------------------------------------------------------------------
 .../camel/model/LoadBalanceDefinition.java      | 57 ++++++++------------
 .../camel/model/LoadBalancerDefinition.java     | 41 +-------------
 .../CircuitBreakerLoadBalancerDefinition.java   | 27 ++++++++--
 .../FailoverLoadBalancerDefinition.java         | 31 +++++++++--
 .../DoubleLoadBalancerMisconfigurationTest.java |  6 +--
 5 files changed, 75 insertions(+), 87 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/ea6d2fcc/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java 
b/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java
index 05fc76b..c2d8291 100644
--- a/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java
@@ -38,16 +38,7 @@ import 
org.apache.camel.model.loadbalancer.RoundRobinLoadBalancerDefinition;
 import org.apache.camel.model.loadbalancer.StickyLoadBalancerDefinition;
 import org.apache.camel.model.loadbalancer.TopicLoadBalancerDefinition;
 import org.apache.camel.model.loadbalancer.WeightedLoadBalancerDefinition;
-import org.apache.camel.processor.loadbalancer.CircuitBreakerLoadBalancer;
-import org.apache.camel.processor.loadbalancer.FailOverLoadBalancer;
 import org.apache.camel.processor.loadbalancer.LoadBalancer;
-import org.apache.camel.processor.loadbalancer.RandomLoadBalancer;
-import org.apache.camel.processor.loadbalancer.RoundRobinLoadBalancer;
-import org.apache.camel.processor.loadbalancer.StickyLoadBalancer;
-import org.apache.camel.processor.loadbalancer.TopicLoadBalancer;
-import org.apache.camel.processor.loadbalancer.WeightedLoadBalancer;
-import org.apache.camel.processor.loadbalancer.WeightedRandomLoadBalancer;
-import org.apache.camel.processor.loadbalancer.WeightedRoundRobinLoadBalancer;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.util.CollectionStringBuffer;
@@ -204,10 +195,11 @@ public class LoadBalanceDefinition extends 
ProcessorDefinition<LoadBalanceDefini
      * @return the builder
      */
     public LoadBalanceDefinition failover(int maximumFailoverAttempts, boolean 
inheritErrorHandler, boolean roundRobin, Class<?>... exceptions) {
-        FailOverLoadBalancer failover = new 
FailOverLoadBalancer(Arrays.asList(exceptions));
-        failover.setMaximumFailoverAttempts(maximumFailoverAttempts);
-        failover.setRoundRobin(roundRobin);
-        setLoadBalancerType(new LoadBalancerDefinition(failover));
+        FailoverLoadBalancerDefinition def = new 
FailoverLoadBalancerDefinition();
+        def.setExceptionTypes(Arrays.asList(exceptions));
+        def.setMaximumFailoverAttempts(maximumFailoverAttempts);
+        def.setRoundRobin(roundRobin);
+        setLoadBalancerType(def);
         this.setInheritErrorHandler(inheritErrorHandler);
         return this;
     }
@@ -232,11 +224,11 @@ public class LoadBalanceDefinition extends 
ProcessorDefinition<LoadBalanceDefini
      * @return the builder
      */
     public LoadBalanceDefinition circuitBreaker(int threshold, long 
halfOpenAfter, Class<?>... exceptions) {
-        CircuitBreakerLoadBalancer breakerLoadBalancer = new 
CircuitBreakerLoadBalancer(Arrays.asList(exceptions));
-        breakerLoadBalancer.setThreshold(threshold);
-        breakerLoadBalancer.setHalfOpenAfter(halfOpenAfter);
-
-        setLoadBalancerType(new LoadBalancerDefinition(breakerLoadBalancer));
+        CircuitBreakerLoadBalancerDefinition def = new 
CircuitBreakerLoadBalancerDefinition();
+        def.setExceptionTypes(Arrays.asList(exceptions));
+        def.setThreshold(threshold);
+        def.setHalfOpenAfter(halfOpenAfter);
+        setLoadBalancerType(def);
         return this;
     }
     
@@ -249,20 +241,11 @@ public class LoadBalanceDefinition extends 
ProcessorDefinition<LoadBalanceDefini
      * @return the builder
      */
     public LoadBalanceDefinition weighted(boolean roundRobin, String 
distributionRatio, String distributionRatioDelimiter) {
-        WeightedLoadBalancer weighted;
-        List<Integer> distributionRatioList = new ArrayList<Integer>();
-        
-        String[] ratios = distributionRatio.split(distributionRatioDelimiter);
-        for (String ratio : ratios) {
-            distributionRatioList.add(new Integer(ratio.trim()));
-        }
-        
-        if (!roundRobin) {
-            weighted = new WeightedRandomLoadBalancer(distributionRatioList);
-        } else {
-            weighted = new 
WeightedRoundRobinLoadBalancer(distributionRatioList);
-        }
-        setLoadBalancerType(new LoadBalancerDefinition(weighted));
+        WeightedLoadBalancerDefinition def = new 
WeightedLoadBalancerDefinition();
+        def.setRoundRobin(roundRobin);
+        def.setDistributionRatio(distributionRatio);
+        def.setDistributionRatioDelimiter(distributionRatioDelimiter);
+        setLoadBalancerType(def);
         return this;
     }
     
@@ -272,7 +255,7 @@ public class LoadBalanceDefinition extends 
ProcessorDefinition<LoadBalanceDefini
      * @return the builder
      */
     public LoadBalanceDefinition roundRobin() {
-        setLoadBalancerType(new LoadBalancerDefinition(new 
RoundRobinLoadBalancer()));
+        setLoadBalancerType(new RoundRobinLoadBalancerDefinition());
         return this;
     }
 
@@ -282,7 +265,7 @@ public class LoadBalanceDefinition extends 
ProcessorDefinition<LoadBalanceDefini
      * @return the builder
      */
     public LoadBalanceDefinition random() {
-        setLoadBalancerType(new LoadBalancerDefinition(new 
RandomLoadBalancer()));
+        setLoadBalancerType(new RandomLoadBalancerDefinition());
         return this;
     }
 
@@ -306,7 +289,9 @@ public class LoadBalanceDefinition extends 
ProcessorDefinition<LoadBalanceDefini
      * @return  the builder
      */
     public LoadBalanceDefinition sticky(Expression correlationExpression) {
-        setLoadBalancerType(new LoadBalancerDefinition(new 
StickyLoadBalancer(correlationExpression)));
+        StickyLoadBalancerDefinition def = new StickyLoadBalancerDefinition();
+        def.setCorrelationExpression(new 
ExpressionSubElementDefinition(correlationExpression));
+        setLoadBalancerType(def);
         return this;
     }
 
@@ -316,7 +301,7 @@ public class LoadBalanceDefinition extends 
ProcessorDefinition<LoadBalanceDefini
      * @return the builder
      */
     public LoadBalanceDefinition topic() {
-        setLoadBalancerType(new LoadBalancerDefinition(new 
TopicLoadBalancer()));
+        setLoadBalancerType(new TopicLoadBalancerDefinition());
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/ea6d2fcc/camel-core/src/main/java/org/apache/camel/model/LoadBalancerDefinition.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/model/LoadBalancerDefinition.java 
b/camel-core/src/main/java/org/apache/camel/model/LoadBalancerDefinition.java
index 2724126..c5a99fd 100644
--- 
a/camel-core/src/main/java/org/apache/camel/model/LoadBalancerDefinition.java
+++ 
b/camel-core/src/main/java/org/apache/camel/model/LoadBalancerDefinition.java
@@ -16,15 +16,11 @@
  */
 package org.apache.camel.model;
 
-import java.util.List;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 
-import org.apache.camel.AsyncCallback;
-import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
 import org.apache.camel.processor.loadbalancer.LoadBalancer;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.RouteContext;
@@ -37,7 +33,7 @@ import org.apache.camel.util.ObjectHelper;
 @Metadata(label = "eip,routing")
 @XmlType(name = "loadBalancer")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class LoadBalancerDefinition extends IdentifiedType implements 
LoadBalancer {
+public class LoadBalancerDefinition extends IdentifiedType {
     @XmlTransient
     private LoadBalancer loadBalancer;
     @XmlTransient
@@ -108,41 +104,6 @@ public class LoadBalancerDefinition extends IdentifiedType 
implements LoadBalanc
         return null;
     }
 
-
-    public void addProcessor(Processor processor) {
-        ObjectHelper.notNull(loadBalancer, "loadBalancer", this);
-        loadBalancer.addProcessor(processor);
-    }
-
-    public List<Processor> getProcessors() {
-        ObjectHelper.notNull(loadBalancer, "loadBalancer", this);
-        return loadBalancer.getProcessors();
-    }
-
-    public void removeProcessor(Processor processor) {
-        ObjectHelper.notNull(loadBalancer, "loadBalancer", this);
-        loadBalancer.removeProcessor(processor);
-    }
-
-    public void process(Exchange exchange) throws Exception {
-        ObjectHelper.notNull(loadBalancer, "loadBalancer", this);
-        loadBalancer.process(exchange);
-    }
-
-    public boolean process(Exchange exchange, final AsyncCallback callback) {
-        ObjectHelper.notNull(loadBalancer, "loadBalancer");
-        return loadBalancer.process(exchange, new AsyncCallback() {
-            public void done(boolean doneSync) {
-                // only handle the async case
-                if (doneSync) {
-                    return;
-                } else {
-                    callback.done(false);
-                }
-            }
-        });
-    }
-
     @Override
     public String toString() {
         if (loadBalancer != null) {

http://git-wip-us.apache.org/repos/asf/camel/blob/ea6d2fcc/camel-core/src/main/java/org/apache/camel/model/loadbalancer/CircuitBreakerLoadBalancerDefinition.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/model/loadbalancer/CircuitBreakerLoadBalancerDefinition.java
 
b/camel-core/src/main/java/org/apache/camel/model/loadbalancer/CircuitBreakerLoadBalancerDefinition.java
index acedd6f..54b2a7d 100644
--- 
a/camel-core/src/main/java/org/apache/camel/model/loadbalancer/CircuitBreakerLoadBalancerDefinition.java
+++ 
b/camel-core/src/main/java/org/apache/camel/model/loadbalancer/CircuitBreakerLoadBalancerDefinition.java
@@ -23,6 +23,7 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.model.LoadBalancerDefinition;
 import org.apache.camel.processor.loadbalancer.CircuitBreakerLoadBalancer;
@@ -44,6 +45,8 @@ import org.apache.camel.util.ObjectHelper;
 @XmlRootElement(name = "circuitBreaker")
 @XmlAccessorType(XmlAccessType.FIELD)
 public class CircuitBreakerLoadBalancerDefinition extends 
LoadBalancerDefinition {
+    @XmlTransient
+    private List<Class<?>> exceptionTypes = new ArrayList<Class<?>>();
     @XmlElement(name = "exception")
     private List<String> exceptions = new ArrayList<String>();
     @XmlAttribute
@@ -58,8 +61,10 @@ public class CircuitBreakerLoadBalancerDefinition extends 
LoadBalancerDefinition
     protected LoadBalancer createLoadBalancer(RouteContext routeContext) {
         CircuitBreakerLoadBalancer answer;
 
-        if (!exceptions.isEmpty()) {
-            List<Class<?>> classes = new ArrayList<Class<?>>();
+        List<Class<?>> classes = new ArrayList<Class<?>>();
+        if (!exceptionTypes.isEmpty()) {
+            classes.addAll(exceptionTypes);
+        } else if (!exceptions.isEmpty()) {
             for (String name : exceptions) {
                 Class<?> type = 
routeContext.getCamelContext().getClassResolver().resolveClass(name);
                 if (type == null) {
@@ -70,9 +75,11 @@ public class CircuitBreakerLoadBalancerDefinition extends 
LoadBalancerDefinition
                 }
                 classes.add(type);
             }
-            answer = new CircuitBreakerLoadBalancer(classes);
-        } else {
+        }
+        if (classes.isEmpty()) {
             answer = new CircuitBreakerLoadBalancer();
+        } else {
+            answer = new CircuitBreakerLoadBalancer(classes);
         }
 
         if (getHalfOpenAfter() != null) {
@@ -118,6 +125,18 @@ public class CircuitBreakerLoadBalancerDefinition extends 
LoadBalancerDefinition
         this.exceptions = exceptions;
     }
 
+    public List<Class<?>> getExceptionTypes() {
+        return exceptionTypes;
+    }
+
+    /**
+     * A list of specific exceptions to monitor.
+     * If no exceptions is configured then all exceptions is monitored
+     */
+    public void setExceptionTypes(List<Class<?>> exceptionTypes) {
+        this.exceptionTypes = exceptionTypes;
+    }
+
     @Override
     public String toString() {
         return "CircuitBreakerLoadBalancer";

http://git-wip-us.apache.org/repos/asf/camel/blob/ea6d2fcc/camel-core/src/main/java/org/apache/camel/model/loadbalancer/FailoverLoadBalancerDefinition.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/model/loadbalancer/FailoverLoadBalancerDefinition.java
 
b/camel-core/src/main/java/org/apache/camel/model/loadbalancer/FailoverLoadBalancerDefinition.java
index f68db8c..523f794 100644
--- 
a/camel-core/src/main/java/org/apache/camel/model/loadbalancer/FailoverLoadBalancerDefinition.java
+++ 
b/camel-core/src/main/java/org/apache/camel/model/loadbalancer/FailoverLoadBalancerDefinition.java
@@ -23,12 +23,14 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.model.LoadBalancerDefinition;
 import org.apache.camel.processor.loadbalancer.FailOverLoadBalancer;
 import org.apache.camel.processor.loadbalancer.LoadBalancer;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.RouteContext;
+import org.apache.camel.util.ObjectHelper;
 
 /**
  * Failover load balancer
@@ -42,6 +44,8 @@ import org.apache.camel.spi.RouteContext;
 @XmlRootElement(name = "failover")
 @XmlAccessorType(XmlAccessType.FIELD)
 public class FailoverLoadBalancerDefinition extends LoadBalancerDefinition {
+    @XmlTransient
+    private List<Class<?>> exceptionTypes = new ArrayList<Class<?>>();
     @XmlElement(name = "exception")
     private List<String> exceptions = new ArrayList<String>();
     @XmlAttribute
@@ -56,18 +60,25 @@ public class FailoverLoadBalancerDefinition extends 
LoadBalancerDefinition {
     protected LoadBalancer createLoadBalancer(RouteContext routeContext) {
         FailOverLoadBalancer answer;
 
-        if (!exceptions.isEmpty()) {
-            List<Class<?>> classes = new ArrayList<Class<?>>();
+        List<Class<?>> classes = new ArrayList<Class<?>>();
+        if (!exceptionTypes.isEmpty()) {
+            classes.addAll(exceptionTypes);
+        } else if (!exceptions.isEmpty()) {
             for (String name : exceptions) {
                 Class<?> type = 
routeContext.getCamelContext().getClassResolver().resolveClass(name);
                 if (type == null) {
                     throw new IllegalArgumentException("Cannot find class: " + 
name + " in the classpath");
                 }
+                if (!ObjectHelper.isAssignableFrom(Throwable.class, type)) {
+                    throw new IllegalArgumentException("Class is not an 
instance of Throwable: " + type);
+                }
                 classes.add(type);
             }
-            answer = new FailOverLoadBalancer(classes);
-        } else {
+        }
+        if (classes.isEmpty()) {
             answer = new FailOverLoadBalancer();
+        } else {
+            answer = new FailOverLoadBalancer(classes);
         }
 
         if (getMaximumFailoverAttempts() != null) {
@@ -92,6 +103,18 @@ public class FailoverLoadBalancerDefinition extends 
LoadBalancerDefinition {
         this.exceptions = exceptions;
     }
 
+    public List<Class<?>> getExceptionTypes() {
+        return exceptionTypes;
+    }
+
+    /**
+     * A list of specific exceptions to monitor.
+     * If no exceptions is configured then all exceptions is monitored
+     */
+    public void setExceptionTypes(List<Class<?>> exceptionTypes) {
+        this.exceptionTypes = exceptionTypes;
+    }
+
     public Boolean getRoundRobin() {
         return roundRobin;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/ea6d2fcc/camel-core/src/test/java/org/apache/camel/processor/DoubleLoadBalancerMisconfigurationTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/processor/DoubleLoadBalancerMisconfigurationTest.java
 
b/camel-core/src/test/java/org/apache/camel/processor/DoubleLoadBalancerMisconfigurationTest.java
index 0942969..a23c172 100644
--- 
a/camel-core/src/test/java/org/apache/camel/processor/DoubleLoadBalancerMisconfigurationTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/processor/DoubleLoadBalancerMisconfigurationTest.java
@@ -41,7 +41,7 @@ public class DoubleLoadBalancerMisconfigurationTest extends 
ContextTestSupport {
             });
             fail("Should have thrown an exception");
         } catch (IllegalArgumentException e) {
-            assertEquals("Loadbalancer already configured to: 
FailoverLoadBalancer[[]]. Cannot set it to: RoundRobinLoadBalancer", 
e.getMessage());
+            assertEquals("Loadbalancer already configured to: 
FailoverLoadBalancer. Cannot set it to: RoundRobinLoadBalancer", 
e.getMessage());
         }
     }
 
@@ -57,7 +57,7 @@ public class DoubleLoadBalancerMisconfigurationTest extends 
ContextTestSupport {
             });
             fail("Should have thrown an exception");
         } catch (IllegalArgumentException e) {
-            assertEquals("Loadbalancer already configured to: 
FailoverLoadBalancer[[]]. Cannot set it to: RandomLoadBalancer", 
e.getMessage());
+            assertEquals("Loadbalancer already configured to: 
FailoverLoadBalancer. Cannot set it to: RandomLoadBalancer", e.getMessage());
         }
     }
 
@@ -73,7 +73,7 @@ public class DoubleLoadBalancerMisconfigurationTest extends 
ContextTestSupport {
             });
             fail("Should have thrown an exception");
         } catch (IllegalArgumentException e) {
-            assertEquals("Loadbalancer already configured to: 
RandomLoadBalancer. Cannot set it to: FailoverLoadBalancer[[]]", 
e.getMessage());
+            assertEquals("Loadbalancer already configured to: 
RandomLoadBalancer. Cannot set it to: FailoverLoadBalancer", e.getMessage());
         }
     }
 }

Reply via email to