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 2015/03/15 10:51:12 UTC

[4/5] camel git commit: CAMEL-8488: Java DSL - Improved CBR to detect if endChoice vs end was invalid used

CAMEL-8488: Java DSL - Improved CBR to detect if endChoice vs end was invalid used


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

Branch: refs/heads/camel-2.15.x
Commit: 5c286b322fc910ebf4a53f9f7a2b8f5b7c505d3a
Parents: c75ca16
Author: Claus Ibsen <da...@apache.org>
Authored: Sun Mar 15 09:50:51 2015 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Sun Mar 15 10:52:11 2015 +0100

----------------------------------------------------------------------
 .../apache/camel/model/ChoiceDefinition.java    |  30 ++++++
 .../issues/ChoiceEndOrEndChoiceIssueTest.java   | 105 +++++++++++++++++++
 2 files changed, 135 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/5c286b32/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java b/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java
index b2160de..a27502b 100644
--- a/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java
@@ -48,6 +48,8 @@ public class ChoiceDefinition extends ProcessorDefinition<ChoiceDefinition> {
     @XmlElement
     private OtherwiseDefinition otherwise;
 
+    private transient boolean onlyWhenOrOtherwise = true;
+
     public ChoiceDefinition() {
     }
     
@@ -138,6 +140,33 @@ public class ChoiceDefinition extends ProcessorDefinition<ChoiceDefinition> {
         return new ChoiceProcessor(filters, otherwiseProcessor);
     }
 
+    @Override
+    public void addOutput(ProcessorDefinition<?> output) {
+        if (onlyWhenOrOtherwise) {
+            if (output instanceof WhenDefinition || output instanceof OtherwiseDefinition) {
+                // okay we are adding a when or otherwise so allow any kind of output after this again
+                onlyWhenOrOtherwise = false;
+            } else {
+                throw new IllegalArgumentException("A new choice clause should start with a when() or otherwise(). If you intend to end the entire choice and are using endChoice() then use end() instead.");
+            }
+        }
+        super.addOutput(output);
+    }
+
+    @Override
+    public ProcessorDefinition<?> end() {
+        // we end a block so only when or otherwise is supported
+        onlyWhenOrOtherwise = true;
+        return super.end();
+    }
+
+    @Override
+    public ChoiceDefinition endChoice() {
+        // we end a block so only when or otherwise is supported
+        onlyWhenOrOtherwise = true;
+        return super.endChoice();
+    }
+
     // Fluent API
     // -------------------------------------------------------------------------
 
@@ -164,6 +193,7 @@ public class ChoiceDefinition extends ProcessorDefinition<ChoiceDefinition> {
     }
     
     private void addClause(ProcessorDefinition<?> when) {
+        onlyWhenOrOtherwise = true;
         popBlock();
         addOutput(when);
         pushBlock(when);

http://git-wip-us.apache.org/repos/asf/camel/blob/5c286b32/camel-core/src/test/java/org/apache/camel/issues/ChoiceEndOrEndChoiceIssueTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/issues/ChoiceEndOrEndChoiceIssueTest.java b/camel-core/src/test/java/org/apache/camel/issues/ChoiceEndOrEndChoiceIssueTest.java
new file mode 100644
index 0000000..5566a8e
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/issues/ChoiceEndOrEndChoiceIssueTest.java
@@ -0,0 +1,105 @@
+/**
+ * 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.issues;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+public class ChoiceEndOrEndChoiceIssueTest extends ContextTestSupport {
+
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    public void testEndChoiceInvalid() throws Exception {
+        try {
+            context.addRoutes(new RouteBuilder() {
+                @Override
+                public void configure() throws Exception {
+                    from("direct:start")
+                        .choice()
+                            .when(header("number").isEqualTo("one")).to("mock:one")
+                            .when(header("number").isEqualTo("two")).to("mock:two")
+                            .when(header("number").isEqualTo("three")).to("mock:three")
+                        .endChoice()
+                        .to("mock:finally");
+                }
+            });
+            context.start();
+            fail("Should have thrown exception");
+        } catch (IllegalArgumentException e) {
+            assertEquals("A new choice clause should start with a when() or otherwise()."
+                    + " If you intend to end the entire choice and are using endChoice() then use end() instead.", e.getMessage());
+        }
+    }
+
+    public void testEndChoiceValid() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .choice()
+                        .when(header("number").isEqualTo("one")).to("mock:one")
+                        .when(header("number").isEqualTo("two")).to("mock:two")
+                        .when(header("number").isEqualTo("three")).to("mock:three")
+                    .end()
+                    .to("mock:finally");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:one").expectedHeaderReceived("number", "one");
+        getMockEndpoint("mock:two").expectedHeaderReceived("number", "two");
+        getMockEndpoint("mock:three").expectedHeaderReceived("number", "three");
+        getMockEndpoint("mock:finally").expectedBodiesReceived("1", "2", "3");
+
+        template.sendBodyAndHeader("direct:start", "1", "number", "one");
+        template.sendBodyAndHeader("direct:start", "2", "number", "two");
+        template.sendBodyAndHeader("direct:start", "3", "number", "three");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testEndChoiceEndValid() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .choice()
+                        .when(header("number").isEqualTo("one")).to("mock:one")
+                        .when(header("number").isEqualTo("two")).to("mock:two")
+                        .when(header("number").isEqualTo("three")).to("mock:three")
+                    .endChoice().end()
+                    .to("mock:finally");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:one").expectedHeaderReceived("number", "one");
+        getMockEndpoint("mock:two").expectedHeaderReceived("number", "two");
+        getMockEndpoint("mock:three").expectedHeaderReceived("number", "three");
+        getMockEndpoint("mock:finally").expectedBodiesReceived("1", "2", "3");
+
+        template.sendBodyAndHeader("direct:start", "1", "number", "one");
+        template.sendBodyAndHeader("direct:start", "2", "number", "two");
+        template.sendBodyAndHeader("direct:start", "3", "number", "three");
+
+        assertMockEndpointsSatisfied();
+    }
+
+}