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 2019/06/19 04:01:08 UTC

[camel] 01/06: CAMEL-13658: Using OutputNode instead of isOutputSupported method to mark if a node/definition supports outputs or not.

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 4279645d5be45cfad0b731b566714c59b98849e9
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Jun 18 20:44:41 2019 +0200

    CAMEL-13658: Using OutputNode instead of isOutputSupported method to mark if a node/definition supports outputs or not.
---
 .../apache/camel/model/AggregateDefinition.java    |  6 +---
 .../org/apache/camel/model/CatchDefinition.java    |  6 +---
 .../org/apache/camel/model/ChoiceDefinition.java   |  7 +----
 .../org/apache/camel/model/DelayDefinition.java    |  2 +-
 .../camel/model/DynamicRouterDefinition.java       |  2 +-
 .../org/apache/camel/model/EnrichDefinition.java   |  2 +-
 .../org/apache/camel/model/ExpressionNode.java     | 36 +++++++++++-----------
 .../org/apache/camel/model/FilterDefinition.java   |  2 +-
 .../org/apache/camel/model/HystrixDefinition.java  |  6 +---
 .../camel/model/IdempotentConsumerDefinition.java  |  2 +-
 .../apache/camel/model/LoadBalanceDefinition.java  |  6 +---
 .../org/apache/camel/model/LoopDefinition.java     |  2 +-
 .../org/apache/camel/model/NoOutputDefinition.java |  3 --
 .../apache/camel/model/OnCompletionDefinition.java |  6 +---
 .../apache/camel/model/OnExceptionDefinition.java  |  6 +---
 .../org/apache/camel/model/OutputDefinition.java   |  6 +---
 ...pressionNode.java => OutputExpressionNode.java} | 36 +++++++++-------------
 .../{NoOutputDefinition.java => OutputNode.java}   | 16 +++-------
 .../apache/camel/model/PollEnrichDefinition.java   |  2 +-
 .../apache/camel/model/ProcessorDefinition.java    |  6 ++--
 .../camel/model/RecipientListDefinition.java       |  2 +-
 .../apache/camel/model/ResequenceDefinition.java   |  7 +----
 .../org/apache/camel/model/RouteDefinition.java    |  6 +---
 .../apache/camel/model/RoutingSlipDefinition.java  |  2 +-
 .../org/apache/camel/model/ScriptDefinition.java   |  2 +-
 .../org/apache/camel/model/SetBodyDefinition.java  |  2 +-
 .../apache/camel/model/SetFaultBodyDefinition.java |  2 +-
 .../apache/camel/model/SetHeaderDefinition.java    |  2 +-
 .../apache/camel/model/SetPropertyDefinition.java  |  2 +-
 .../org/apache/camel/model/SortDefinition.java     |  2 +-
 .../org/apache/camel/model/SplitDefinition.java    |  2 +-
 .../org/apache/camel/model/ThrottleDefinition.java |  2 +-
 .../apache/camel/model/TransformDefinition.java    |  2 +-
 .../org/apache/camel/model/ValidateDefinition.java |  2 +-
 .../org/apache/camel/model/WhenDefinition.java     |  2 +-
 35 files changed, 68 insertions(+), 131 deletions(-)

diff --git a/core/camel-core/src/main/java/org/apache/camel/model/AggregateDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/AggregateDefinition.java
index e8b6727..3eff2d2 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/AggregateDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/AggregateDefinition.java
@@ -49,7 +49,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "aggregate")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class AggregateDefinition extends ProcessorDefinition<AggregateDefinition> implements ExecutorServiceAwareDefinition<AggregateDefinition> {
+public class AggregateDefinition extends ProcessorDefinition<AggregateDefinition> implements OutputNode, ExecutorServiceAwareDefinition<AggregateDefinition> {
     @XmlElement(name = "correlationExpression", required = true)
     private ExpressionSubElementDefinition correlationExpression;
     @XmlElement(name = "completionPredicate") @AsPredicate
@@ -943,10 +943,6 @@ public class AggregateDefinition extends ProcessorDefinition<AggregateDefinition
         return outputs;
     }
 
-    public boolean isOutputSupported() {
-        return true;
-    }
-
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
         this.outputs = outputs;
     }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/CatchDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/CatchDefinition.java
index c0d7782..acba75a 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/CatchDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/CatchDefinition.java
@@ -37,7 +37,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "error")
 @XmlRootElement(name = "doCatch")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class CatchDefinition extends ProcessorDefinition<CatchDefinition> {
+public class CatchDefinition extends ProcessorDefinition<CatchDefinition> implements OutputNode {
     @XmlElement(name = "exception")
     private List<String> exceptions = new ArrayList<>();
     @XmlElement(name = "onWhen") @AsPredicate
@@ -83,10 +83,6 @@ public class CatchDefinition extends ProcessorDefinition<CatchDefinition> {
         this.outputs = outputs;
     }
 
-    public boolean isOutputSupported() {
-        return true;
-    }
-
     public List<Class<? extends Throwable>> getExceptionClasses() {
         return exceptionClasses;
     }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java
index de4dd2a..e1c4a0b 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java
@@ -41,7 +41,7 @@ import org.apache.camel.util.ObjectHelper;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "choice")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ChoiceDefinition extends ProcessorDefinition<ChoiceDefinition> {
+public class ChoiceDefinition extends ProcessorDefinition<ChoiceDefinition> implements OutputNode {
     @XmlElementRef @AsPredicate
     private List<WhenDefinition> whenClauses = new ArrayList<>();
     @XmlElement
@@ -117,11 +117,6 @@ public class ChoiceDefinition extends ProcessorDefinition<ChoiceDefinition> {
     }
 
     @Override
-    public boolean isOutputSupported() {
-        return true;
-    }
-    
-    @Override
     public String toString() {
         return "Choice[" + getWhenClauses() + (getOtherwise() != null ? " " + getOtherwise() : "") + "]";
     }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/DelayDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/DelayDefinition.java
index 23dcd1d..16247b4 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/DelayDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/DelayDefinition.java
@@ -35,7 +35,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "delay")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class DelayDefinition extends NoOutputExpressionNode implements ExecutorServiceAwareDefinition<DelayDefinition> {
+public class DelayDefinition extends ExpressionNode implements ExecutorServiceAwareDefinition<DelayDefinition> {
 
     @XmlTransient
     private ExecutorService executorService;
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/DynamicRouterDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/DynamicRouterDefinition.java
index da42596..3e243e1 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/DynamicRouterDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/DynamicRouterDefinition.java
@@ -34,7 +34,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,endpoint,routing")
 @XmlRootElement(name = "dynamicRouter")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class DynamicRouterDefinition<Type extends ProcessorDefinition<Type>> extends NoOutputExpressionNode {
+public class DynamicRouterDefinition<Type extends ProcessorDefinition<Type>> extends ExpressionNode {
 
     public static final String DEFAULT_DELIMITER = ",";
 
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/EnrichDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/EnrichDefinition.java
index df760d2..498349f 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/EnrichDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/EnrichDefinition.java
@@ -34,7 +34,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,transformation")
 @XmlRootElement(name = "enrich")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class EnrichDefinition extends NoOutputExpressionNode {
+public class EnrichDefinition extends ExpressionNode {
     @XmlAttribute(name = "strategyRef")
     private String aggregationStrategyRef;
     @XmlAttribute(name = "strategyMethodName")
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/ExpressionNode.java b/core/camel-core/src/main/java/org/apache/camel/model/ExpressionNode.java
index 596432c..e5d47f1 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/ExpressionNode.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/ExpressionNode.java
@@ -16,7 +16,7 @@
  */
 package org.apache.camel.model;
 
-import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import javax.xml.bind.annotation.XmlAccessType;
@@ -31,15 +31,17 @@ import org.apache.camel.builder.ExpressionClause;
 import org.apache.camel.model.language.ExpressionDefinition;
 
 /**
- * A base class for nodes which contain an expression and a number of outputs
+ * A base {@link ExpressionNode} which does <b>not</b> support any outputs.
+ * <p/>
+ * This node is to be extended by definitions which need to support an expression but the definition should not
+ * contain any outputs, such as {@link org.apache.camel.model.TransformDefinition}.
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlTransient
 public abstract class ExpressionNode extends ProcessorDefinition<ExpressionNode> {
+
     @XmlElementRef
     private ExpressionDefinition expression;
-    @XmlElementRef
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
 
     public ExpressionNode() {
     }
@@ -74,20 +76,6 @@ public abstract class ExpressionNode extends ProcessorDefinition<ExpressionNode>
     }
 
     @Override
-    public List<ProcessorDefinition<?>> getOutputs() {
-        return outputs;
-    }
-
-    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
-    }
-
-    @Override
-    public boolean isOutputSupported() {
-        return true;
-    }
-
-    @Override
     public String getLabel() {
         if (getExpression() == null) {
             return "";
@@ -132,4 +120,16 @@ public abstract class ExpressionNode extends ProcessorDefinition<ExpressionNode>
         }
     }
 
+    @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public ExpressionNode id(String id) {
+        // let parent handle assigning the id, as we do not support outputs
+        getParent().id(id);
+        return this;
+    }
 }
+
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/FilterDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/FilterDefinition.java
index 2a59f3c..a899f42 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/FilterDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/FilterDefinition.java
@@ -31,7 +31,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing") @AsPredicate
 @XmlRootElement(name = "filter")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class FilterDefinition extends ExpressionNode {
+public class FilterDefinition extends OutputExpressionNode {
 
     public FilterDefinition() {
     }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/HystrixDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/HystrixDefinition.java
index 573a8d9..d0821f2 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/HystrixDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/HystrixDefinition.java
@@ -36,7 +36,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing,circuitbreaker")
 @XmlRootElement(name = "hystrix")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class HystrixDefinition extends ProcessorDefinition<HystrixDefinition> {
+public class HystrixDefinition extends ProcessorDefinition<HystrixDefinition> implements OutputNode {
 
     @XmlElement
     private HystrixConfigurationDefinition hystrixConfiguration;
@@ -69,10 +69,6 @@ public class HystrixDefinition extends ProcessorDefinition<HystrixDefinition> {
         return outputs;
     }
 
-    public boolean isOutputSupported() {
-        return true;
-    }
-
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
         this.outputs = outputs;
         if (outputs != null) {
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/IdempotentConsumerDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/IdempotentConsumerDefinition.java
index 1d52d89..b180c00 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/IdempotentConsumerDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/IdempotentConsumerDefinition.java
@@ -33,7 +33,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "idempotentConsumer")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class IdempotentConsumerDefinition extends ExpressionNode {
+public class IdempotentConsumerDefinition extends OutputExpressionNode {
 
     @XmlAttribute(required = true)
     private String messageIdRepositoryRef;
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java
index 980743b..e94ef72 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java
@@ -45,7 +45,7 @@ import org.apache.camel.util.CollectionStringBuffer;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "loadBalance")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefinition> {
+public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefinition> implements OutputNode {
     @XmlElements({
             @XmlElement(required = false, name = "failover", type = FailoverLoadBalancerDefinition.class),
             @XmlElement(required = false, name = "random", type = RandomLoadBalancerDefinition.class),
@@ -76,10 +76,6 @@ public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefini
         }
     }
 
-    public boolean isOutputSupported() {
-        return true;
-    }
-
     public LoadBalancerDefinition getLoadBalancerType() {
         return loadBalancerType;
     }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/LoopDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/LoopDefinition.java
index 152575b..f28a897 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/LoopDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/LoopDefinition.java
@@ -32,7 +32,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "loop")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class LoopDefinition extends ExpressionNode {
+public class LoopDefinition extends OutputExpressionNode {
 
     @XmlAttribute
     private Boolean copy;
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/NoOutputDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/NoOutputDefinition.java
index ef04578..5fd252f 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/NoOutputDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/NoOutputDefinition.java
@@ -28,7 +28,4 @@ public abstract class NoOutputDefinition<Type extends ProcessorDefinition<Type>>
         return Collections.emptyList();
     }
 
-    public boolean isOutputSupported() {
-        return false;
-    }
 }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
index b7b43f0..ead26c1 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
@@ -39,7 +39,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "configuration")
 @XmlRootElement(name = "onCompletion")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class OnCompletionDefinition extends ProcessorDefinition<OnCompletionDefinition> implements ExecutorServiceAwareDefinition<OnCompletionDefinition> {
+public class OnCompletionDefinition extends ProcessorDefinition<OnCompletionDefinition> implements OutputNode, ExecutorServiceAwareDefinition<OnCompletionDefinition> {
     @XmlAttribute @Metadata(defaultValue = "AfterConsumer")
     private OnCompletionMode mode;
     @XmlAttribute
@@ -255,10 +255,6 @@ public class OnCompletionDefinition extends ProcessorDefinition<OnCompletionDefi
         this.outputs = outputs;
     }
 
-    public boolean isOutputSupported() {
-        return true;
-    }
-
     public OnCompletionMode getMode() {
         return mode;
     }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java
index 87bb2eb..8b91274 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java
@@ -45,7 +45,7 @@ import org.apache.camel.util.ObjectHelper;
 @Metadata(label = "error")
 @XmlRootElement(name = "onException")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefinition> {
+public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefinition> implements OutputNode {
     @XmlElement(name = "exception", required = true)
     private List<String> exceptions = new ArrayList<>();
     @XmlElement(name = "onWhen") @AsPredicate
@@ -712,10 +712,6 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini
         this.outputs = outputs;
     }
 
-    public boolean isOutputSupported() {
-        return true;
-    }
-
     public List<String> getExceptions() {
         return exceptions;
     }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/OutputDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/OutputDefinition.java
index 776dbc3..1401e59 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/OutputDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/OutputDefinition.java
@@ -32,7 +32,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "configuration")
 @XmlType(name = "output")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class OutputDefinition<Type extends ProcessorDefinition<Type>> extends ProcessorDefinition<Type> {
+public class OutputDefinition<Type extends ProcessorDefinition<Type>> extends ProcessorDefinition<Type> implements OutputNode {
 
     @XmlElementRef
     protected List<ProcessorDefinition<?>> outputs = new ArrayList<>();
@@ -41,10 +41,6 @@ public class OutputDefinition<Type extends ProcessorDefinition<Type>> extends Pr
         return outputs;
     }
 
-    public boolean isOutputSupported() {
-        return true;
-    }
-
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
         this.outputs = outputs;
         if (outputs != null) {
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/NoOutputExpressionNode.java b/core/camel-core/src/main/java/org/apache/camel/model/OutputExpressionNode.java
similarity index 60%
rename from core/camel-core/src/main/java/org/apache/camel/model/NoOutputExpressionNode.java
rename to core/camel-core/src/main/java/org/apache/camel/model/OutputExpressionNode.java
index fb30e04..0de1ff1 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/NoOutputExpressionNode.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/OutputExpressionNode.java
@@ -16,11 +16,11 @@
  */
 package org.apache.camel.model;
 
-import java.util.Collections;
+import java.util.ArrayList;
 import java.util.List;
-
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.Expression;
@@ -28,45 +28,37 @@ import org.apache.camel.Predicate;
 import org.apache.camel.model.language.ExpressionDefinition;
 
 /**
- * An {@link org.apache.camel.model.ExpressionNode} which does <b>not</b> support any outputs.
- * <p/>
- * This node is to be extended by definitions which need to support an expression but the definition should not
- * contain any outputs, such as {@link org.apache.camel.model.TransformDefinition}.
+ * A base class for nodes which contain an expression and a number of outputs.
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlTransient
-public abstract class NoOutputExpressionNode extends ExpressionNode {
+public abstract class OutputExpressionNode extends ExpressionNode implements OutputNode {
+
+    @XmlElementRef
+    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
 
-    public NoOutputExpressionNode() {
+    public OutputExpressionNode() {
     }
 
-    public NoOutputExpressionNode(ExpressionDefinition expression) {
+    public OutputExpressionNode(ExpressionDefinition expression) {
         super(expression);
     }
 
-    public NoOutputExpressionNode(Expression expression) {
+    public OutputExpressionNode(Expression expression) {
         super(expression);
     }
 
-    public NoOutputExpressionNode(Predicate predicate) {
+    public OutputExpressionNode(Predicate predicate) {
         super(predicate);
     }
 
     @Override
     public List<ProcessorDefinition<?>> getOutputs() {
-        return Collections.emptyList();
+        return outputs;
     }
 
-    @Override
-    public boolean isOutputSupported() {
-        return false;
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        this.outputs = outputs;
     }
 
-    @Override
-    public ExpressionNode id(String id) {
-        // let parent handle assigning the id, as we do not support outputs
-        getParent().id(id);
-        return this;
-    }
 }
-
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/NoOutputDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/OutputNode.java
similarity index 67%
copy from core/camel-core/src/main/java/org/apache/camel/model/NoOutputDefinition.java
copy to core/camel-core/src/main/java/org/apache/camel/model/OutputNode.java
index ef04578..b14958a 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/NoOutputDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/OutputNode.java
@@ -16,19 +16,11 @@
  */
 package org.apache.camel.model;
 
-import java.util.Collections;
-import java.util.List;
+import javax.xml.bind.annotation.XmlTransient;
 
 /**
- * Base class for definitions which does not support outputs.
+ * Marker interface to mark a {@link ProcessorDefinition} that supports outputs
  */
-public abstract class NoOutputDefinition<Type extends ProcessorDefinition<Type>> extends ProcessorDefinition<Type> {
-
-    public List<ProcessorDefinition<?>> getOutputs() {
-        return Collections.emptyList();
-    }
-
-    public boolean isOutputSupported() {
-        return false;
-    }
+@XmlTransient
+public interface OutputNode {
 }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/PollEnrichDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/PollEnrichDefinition.java
index 1bf18db..6446d5b 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/PollEnrichDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/PollEnrichDefinition.java
@@ -34,7 +34,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,transformation")
 @XmlRootElement(name = "pollEnrich")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class PollEnrichDefinition extends NoOutputExpressionNode {
+public class PollEnrichDefinition extends ExpressionNode {
     @XmlAttribute @Metadata(defaultValue = "-1")
     private Long timeout;
     @XmlAttribute(name = "strategyRef")
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
index ce50486..741a015 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
@@ -115,8 +115,6 @@ public abstract class ProcessorDefinition<Type extends ProcessorDefinition<Type>
     // else to use an optional attribute in JAXB2
     public abstract List<ProcessorDefinition<?>> getOutputs();
 
-    public abstract boolean isOutputSupported();
-
     /**
      * Whether this definition can only be added as top-level directly on the route itself (such as onException,onCompletion,intercept, etc.)
      * <p/>
@@ -162,7 +160,7 @@ public abstract class ProcessorDefinition<Type extends ProcessorDefinition<Type>
 
     @Override
     public void addOutput(ProcessorDefinition<?> output) {
-        if (!isOutputSupported()) {
+        if (!(this instanceof OutputNode)) {
             getParent().addOutput(output);
             return;
         }
@@ -730,7 +728,7 @@ public abstract class ProcessorDefinition<Type extends ProcessorDefinition<Type>
      * @return the builder
      */
     public Type id(String id) {
-        if (isOutputSupported() && getOutputs().isEmpty()) {
+        if (this instanceof OutputNode && getOutputs().isEmpty()) {
             // set id on this
             setId(id);
         } else {
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/RecipientListDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/RecipientListDefinition.java
index 01c6367..100bf72 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/RecipientListDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/RecipientListDefinition.java
@@ -37,7 +37,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,endpoint,routing")
 @XmlRootElement(name = "recipientList")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class RecipientListDefinition<Type extends ProcessorDefinition<Type>> extends NoOutputExpressionNode implements ExecutorServiceAwareDefinition<RecipientListDefinition<Type>> {
+public class RecipientListDefinition<Type extends ProcessorDefinition<Type>> extends ExpressionNode implements ExecutorServiceAwareDefinition<RecipientListDefinition<Type>> {
     @XmlTransient
     private AggregationStrategy aggregationStrategy;
     @XmlTransient
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/ResequenceDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/ResequenceDefinition.java
index 5285f3e..fce95bd 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/ResequenceDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/ResequenceDefinition.java
@@ -41,7 +41,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "resequence")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ResequenceDefinition extends ProcessorDefinition<ResequenceDefinition> {
+public class ResequenceDefinition extends ProcessorDefinition<ResequenceDefinition> implements OutputNode {
     @Metadata(required = false)
     @XmlElements({
         @XmlElement(name = "batch-config", type = BatchResequencerConfig.class),
@@ -74,11 +74,6 @@ public class ResequenceDefinition extends ProcessorDefinition<ResequenceDefiniti
         this.outputs = outputs;
     }
 
-    @Override
-    public boolean isOutputSupported() {
-        return true;
-    }
-
     // Fluent API
     // -------------------------------------------------------------------------
     /**
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java
index 338cf4d..8b2d1a4 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java
@@ -50,7 +50,7 @@ import org.apache.camel.spi.RoutePolicy;
 @XmlType(propOrder = {"input", "inputType", "outputType", "outputs", "routeProperties"})
 @XmlAccessorType(XmlAccessType.PROPERTY)
 // must use XmlAccessType.PROPERTY as there is some custom logic needed to be executed in the setter methods
-public class RouteDefinition extends ProcessorDefinition<RouteDefinition> {
+public class RouteDefinition extends ProcessorDefinition<RouteDefinition> implements OutputNode {
     private final AtomicBoolean prepared = new AtomicBoolean(false);
     private FromDefinition input;
     private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
@@ -694,10 +694,6 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> {
         }
     }
 
-    public boolean isOutputSupported() {
-        return true;
-    }
-
     /**
      * The group that this route belongs to; could be the name of the RouteBuilder class
      * or be explicitly configured in the XML.
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java
index c77f05a..90a3844 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java
@@ -35,7 +35,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,endpoint,routing")
 @XmlRootElement(name = "routingSlip")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class RoutingSlipDefinition<Type extends ProcessorDefinition<Type>> extends NoOutputExpressionNode {
+public class RoutingSlipDefinition<Type extends ProcessorDefinition<Type>> extends ExpressionNode {
     public static final String DEFAULT_DELIMITER = ",";
 
     @XmlAttribute @Metadata(defaultValue = ",")
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/ScriptDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/ScriptDefinition.java
index fc369fb..8ecbafd 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/ScriptDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/ScriptDefinition.java
@@ -30,7 +30,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,transformation")
 @XmlRootElement(name = "script")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ScriptDefinition extends NoOutputExpressionNode {
+public class ScriptDefinition extends ExpressionNode {
 
     public ScriptDefinition() {
     }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/SetBodyDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/SetBodyDefinition.java
index bbe090d..a889c4a 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/SetBodyDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/SetBodyDefinition.java
@@ -30,7 +30,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,transformation")
 @XmlRootElement(name = "setBody")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class SetBodyDefinition extends NoOutputExpressionNode {
+public class SetBodyDefinition extends ExpressionNode {
 
     public SetBodyDefinition() {
     }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/SetFaultBodyDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/SetFaultBodyDefinition.java
index 1c06758..d5090a2 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/SetFaultBodyDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/SetFaultBodyDefinition.java
@@ -30,7 +30,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,transformation")
 @XmlRootElement(name = "setFaultBody")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class SetFaultBodyDefinition extends NoOutputExpressionNode {
+public class SetFaultBodyDefinition extends ExpressionNode {
 
     public SetFaultBodyDefinition() {
     }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/SetHeaderDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/SetHeaderDefinition.java
index ad35fdb..f54a84b 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/SetHeaderDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/SetHeaderDefinition.java
@@ -32,7 +32,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,transformation")
 @XmlRootElement(name = "setHeader")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class SetHeaderDefinition extends NoOutputExpressionNode {
+public class SetHeaderDefinition extends ExpressionNode {
     @XmlAttribute(required = true)
     private String headerName;
 
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/SetPropertyDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/SetPropertyDefinition.java
index bfa3ffa..c2b91d7 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/SetPropertyDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/SetPropertyDefinition.java
@@ -32,7 +32,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,transformation")
 @XmlRootElement(name = "setProperty")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class SetPropertyDefinition extends NoOutputExpressionNode {
+public class SetPropertyDefinition extends ExpressionNode {
     @XmlAttribute(required = true)
     private String propertyName;
     
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/SortDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/SortDefinition.java
index 2014c4a..cb76ec2 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/SortDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/SortDefinition.java
@@ -34,7 +34,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "sort")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class SortDefinition<T> extends NoOutputExpressionNode {
+public class SortDefinition<T> extends ExpressionNode {
     @XmlTransient
     private Comparator<? super T> comparator;
     @XmlAttribute
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/SplitDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/SplitDefinition.java
index 28f6ffc..aeb5141 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/SplitDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/SplitDefinition.java
@@ -36,7 +36,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "split")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class SplitDefinition extends ExpressionNode implements ExecutorServiceAwareDefinition<SplitDefinition> {
+public class SplitDefinition extends OutputExpressionNode implements ExecutorServiceAwareDefinition<SplitDefinition> {
     @XmlTransient
     private AggregationStrategy aggregationStrategy;
     @XmlTransient
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/ThrottleDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/ThrottleDefinition.java
index 1e9adbe..a1436ee 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/ThrottleDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/ThrottleDefinition.java
@@ -38,7 +38,7 @@ import org.apache.camel.spi.Metadata;
 @XmlRootElement(name = "throttle")
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(propOrder = {"expression", "correlationExpression", "outputs"})
-public class ThrottleDefinition extends NoOutputExpressionNode implements ExecutorServiceAwareDefinition<ThrottleDefinition> {
+public class ThrottleDefinition extends ExpressionNode implements ExecutorServiceAwareDefinition<ThrottleDefinition> {
 
     @XmlElement(name = "correlationExpression")
     private ExpressionSubElementDefinition correlationExpression;
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/TransformDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/TransformDefinition.java
index d97f89a..75c6c92 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/TransformDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/TransformDefinition.java
@@ -30,7 +30,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,transformation")
 @XmlRootElement(name = "transform")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class TransformDefinition extends NoOutputExpressionNode {
+public class TransformDefinition extends ExpressionNode {
 
     public TransformDefinition() {
     }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/ValidateDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/ValidateDefinition.java
index 8b59d50..3e9ba4d 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/ValidateDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/ValidateDefinition.java
@@ -32,7 +32,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,transformation") @AsPredicate
 @XmlRootElement(name = "validate")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ValidateDefinition extends NoOutputExpressionNode {
+public class ValidateDefinition extends ExpressionNode {
 
     public ValidateDefinition() {
     }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/WhenDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/WhenDefinition.java
index 9022a03..fdf63eb 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/WhenDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/WhenDefinition.java
@@ -28,7 +28,7 @@ import org.apache.camel.spi.Metadata;
  */
 @Metadata(label = "eip,routing") @AsPredicate
 @XmlRootElement(name = "when")
-public class WhenDefinition extends ExpressionNode {
+public class WhenDefinition extends OutputExpressionNode {
 
     public WhenDefinition() {
     }