You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gn...@apache.org on 2020/01/15 16:12:10 UTC

[camel] 04/07: Small changes to the model to make it easier to work with

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

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

commit 3a4bfe51dbde6bd3bacf26da6b77d075cbaab5c2
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Wed Jan 15 14:48:56 2020 +0100

    Small changes to the model to make it easier to work with
---
 .../camel/component/hbase/model/HBaseCell.java     |   6 +-
 .../camel/component/hbase/model/HBaseRow.java      |   2 +-
 .../apache/camel/model/AggregateDefinition.java    |   7 +-
 .../org/apache/camel/model/CatchDefinition.java    |   8 +-
 .../camel/model/CircuitBreakerDefinition.java      |  13 +--
 .../org/apache/camel/model/FinallyDefinition.java  |  13 +++
 .../apache/camel/model/InterceptDefinition.java    |  12 +++
 .../camel/model/InterceptFromDefinition.java       |   3 +
 .../model/InterceptSendToEndpointDefinition.java   |  14 +++
 .../apache/camel/model/LoadBalanceDefinition.java  |  13 +--
 .../apache/camel/model/MulticastDefinition.java    |  13 +++
 .../apache/camel/model/OnCompletionDefinition.java |  10 +-
 .../apache/camel/model/OnExceptionDefinition.java  |   8 +-
 .../apache/camel/model/OnFallbackDefinition.java   |  13 +++
 .../apache/camel/model/OtherwiseDefinition.java    |  13 +++
 .../org/apache/camel/model/OutputDefinition.java   |   4 +-
 .../org/apache/camel/model/PipelineDefinition.java |  14 +++
 .../org/apache/camel/model/PolicyDefinition.java   |  14 +++
 .../apache/camel/model/ResequenceDefinition.java   |   8 +-
 .../org/apache/camel/model/RouteDefinition.java    |  15 +--
 .../org/apache/camel/model/SagaDefinition.java     |   7 ++
 .../org/apache/camel/model/StepDefinition.java     |  14 +++
 .../apache/camel/model/TransactedDefinition.java   |   9 ++
 .../java/org/apache/camel/model/TryDefinition.java |   7 ++
 .../model/cloud/ServiceCallConfiguration.java      | 104 +++++++++++++++++++++
 .../cloud/ServiceCallExpressionConfiguration.java  |  68 +-------------
 .../ServiceCallServiceChooserConfiguration.java    |  66 +------------
 .../ServiceCallServiceDiscoveryConfiguration.java  |  66 +------------
 .../ServiceCallServiceFilterConfiguration.java     |  59 +-----------
 ...erviceCallServiceLoadBalancerConfiguration.java |  59 +-----------
 .../camel/model/dataformat/BindyDataFormat.java    |   7 ++
 .../apache/camel/model/ModelSanityCheckerTest.java |   3 +-
 32 files changed, 310 insertions(+), 362 deletions(-)

diff --git a/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseCell.java b/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseCell.java
index 41774c8..6847acc 100644
--- a/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseCell.java
+++ b/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseCell.java
@@ -37,20 +37,20 @@ public class HBaseCell {
         return "HBaseCell=[family=" + family + ", qualifier=" + qualifier + ", value=" + value + ", valueType=" + valueType.getName();
     }
 
-    @XmlAttribute(name = "family")
     public String getFamily() {
         return family;
     }
 
+    @XmlAttribute(name = "family")
     public void setFamily(String family) {
         this.family = family;
     }
 
-    @XmlAttribute(name = "qualifier")
     public String getQualifier() {
         return qualifier;
     }
 
+    @XmlAttribute(name = "qualifier")
     public void setQualifier(String qualifier) {
         this.qualifier = qualifier;
     }
@@ -63,11 +63,11 @@ public class HBaseCell {
         this.value = value;
     }
 
-    @XmlAttribute(name = "type")
     public Class<?> getValueType() {
         return valueType;
     }
 
+    @XmlAttribute(name = "type")
     public void setValueType(Class<?> valueType) {
         if (valueType == null) {
             throw new IllegalArgumentException("Value type can not be null");
diff --git a/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseRow.java b/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseRow.java
index 56a09da..8b5fe6b 100644
--- a/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseRow.java
+++ b/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseRow.java
@@ -48,11 +48,11 @@ public class HBaseRow implements Cloneable {
         this.id = id;
     }
 
-    @XmlAttribute(name = "type")
     public Class<?> getRowType() {
         return rowType;
     }
 
+    @XmlAttribute(name = "type")
     public void setRowType(Class<?> rowType) {
         this.rowType = rowType;
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/AggregateDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/AggregateDefinition.java
index a24c262..3049b1a 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/AggregateDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/AggregateDefinition.java
@@ -50,7 +50,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "aggregate")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class AggregateDefinition extends ProcessorDefinition<AggregateDefinition> implements OutputNode, ExecutorServiceAwareDefinition<AggregateDefinition> {
+public class AggregateDefinition extends OutputDefinition<AggregateDefinition> implements ExecutorServiceAwareDefinition<AggregateDefinition> {
     @XmlElement(name = "correlationExpression", required = true)
     private ExpressionSubElementDefinition correlationExpression;
     @XmlElement(name = "completionPredicate")
@@ -136,8 +136,6 @@ public class AggregateDefinition extends ProcessorDefinition<AggregateDefinition
     private AggregateController aggregateController;
     @XmlAttribute
     private String aggregateControllerRef;
-    @XmlElementRef
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
 
     public AggregateDefinition() {
     }
@@ -1145,8 +1143,9 @@ public class AggregateDefinition extends ProcessorDefinition<AggregateDefinition
         return outputs;
     }
 
+    @XmlElementRef
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
+        super.setOutputs(outputs);
     }
 
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/CatchDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/CatchDefinition.java
index baee0d0..e400e15 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/CatchDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/CatchDefinition.java
@@ -37,14 +37,12 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "error")
 @XmlRootElement(name = "doCatch")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class CatchDefinition extends ProcessorDefinition<CatchDefinition> implements OutputNode {
+public class CatchDefinition extends OutputDefinition<CatchDefinition> {
     @XmlElement(name = "exception")
     private List<String> exceptions = new ArrayList<>();
     @XmlElement(name = "onWhen")
     @AsPredicate
     private WhenDefinition onWhen;
-    @XmlElementRef
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
     @XmlTransient
     private List<Class<? extends Throwable>> exceptionClasses;
 
@@ -80,8 +78,10 @@ public class CatchDefinition extends ProcessorDefinition<CatchDefinition> implem
         return outputs;
     }
 
+    @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
+        super.setOutputs(outputs);
     }
 
     public List<Class<? extends Throwable>> getExceptionClasses() {
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/CircuitBreakerDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/CircuitBreakerDefinition.java
index 5ff3f91..122eb29 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/CircuitBreakerDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/CircuitBreakerDefinition.java
@@ -33,7 +33,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing,circuitbreaker")
 @XmlRootElement(name = "circuitBreaker")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class CircuitBreakerDefinition extends ProcessorDefinition<CircuitBreakerDefinition> implements OutputNode {
+public class CircuitBreakerDefinition extends OutputDefinition<CircuitBreakerDefinition> {
 
     @XmlElement
     private HystrixConfigurationDefinition hystrixConfiguration;
@@ -41,8 +41,6 @@ public class CircuitBreakerDefinition extends ProcessorDefinition<CircuitBreaker
     private Resilience4jConfigurationDefinition resilience4jConfiguration;
     @XmlAttribute
     private String configurationRef;
-    @XmlElementRef
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
     @XmlTransient
     private OnFallbackDefinition onFallback;
 
@@ -69,13 +67,10 @@ public class CircuitBreakerDefinition extends ProcessorDefinition<CircuitBreaker
         return outputs;
     }
 
+    @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
-        if (outputs != null) {
-            for (ProcessorDefinition<?> output : outputs) {
-                configureChild(output);
-            }
-        }
+        super.setOutputs(outputs);
     }
 
     @Override
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/FinallyDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/FinallyDefinition.java
index 5bec371..1bf5f9f 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/FinallyDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/FinallyDefinition.java
@@ -16,8 +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.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.spi.Metadata;
@@ -45,4 +48,14 @@ public class FinallyDefinition extends OutputDefinition<FinallyDefinition> {
         return "doFinally";
     }
 
+    @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptDefinition.java
index dbf2d0a..98d603d 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptDefinition.java
@@ -21,6 +21,7 @@ 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.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -67,6 +68,17 @@ public class InterceptDefinition extends OutputDefinition<InterceptDefinition> {
         return true;
     }
 
+    @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
     /**
      * Applies this interceptor only if the given predicate is true
      *
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptFromDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptFromDefinition.java
index c39e088..e99c6da 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptFromDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptFromDefinition.java
@@ -16,9 +16,12 @@
  */
 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.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.spi.Metadata;
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java
index 1cb0d13..87155da 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java
@@ -16,9 +16,12 @@
  */
 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.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.Predicate;
@@ -48,6 +51,17 @@ public class InterceptSendToEndpointDefinition extends OutputDefinition<Intercep
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
+    @Override
     public String toString() {
         return "InterceptSendToEndpoint[" + uri + " -> " + getOutputs() + "]";
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java
index 5fa0735..c46716d 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java
@@ -45,7 +45,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "loadBalance")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefinition> implements OutputNode {
+public class LoadBalanceDefinition extends OutputDefinition<LoadBalanceDefinition> {
     @XmlElements({@XmlElement(required = false, name = "failover", type = FailoverLoadBalancerDefinition.class),
                   @XmlElement(required = false, name = "random", type = RandomLoadBalancerDefinition.class),
                   @XmlElement(required = false, name = "customLoadBalancer", type = CustomLoadBalancerDefinition.class),
@@ -54,8 +54,6 @@ public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefini
                   @XmlElement(required = false, name = "topic", type = TopicLoadBalancerDefinition.class),
                   @XmlElement(required = false, name = "weighted", type = WeightedLoadBalancerDefinition.class)})
     private LoadBalancerDefinition loadBalancerType;
-    @XmlElementRef
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
 
     public LoadBalanceDefinition() {
     }
@@ -65,13 +63,10 @@ public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefini
         return outputs;
     }
 
+    @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
-        if (outputs != null) {
-            for (ProcessorDefinition<?> output : outputs) {
-                configureChild(output);
-            }
-        }
+        super.setOutputs(outputs);
     }
 
     public LoadBalancerDefinition getLoadBalancerType() {
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/MulticastDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/MulticastDefinition.java
index 79d9233..a7bf4e8 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/MulticastDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/MulticastDefinition.java
@@ -16,12 +16,14 @@
  */
 package org.apache.camel.model;
 
+import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.function.Supplier;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -74,6 +76,17 @@ public class MulticastDefinition extends OutputDefinition<MulticastDefinition> i
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
+    @Override
     public String toString() {
         return "Multicast[" + getOutputs() + "]";
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/OnCompletionDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
index f82d93f..a0086e6 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
@@ -27,6 +27,7 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
 
 import org.apache.camel.Predicate;
 import org.apache.camel.spi.AsPredicate;
@@ -37,8 +38,9 @@ import org.apache.camel.spi.Metadata;
  */
 @Metadata(label = "configuration")
 @XmlRootElement(name = "onCompletion")
+@XmlType(propOrder = {"onWhen", "outputs"})
 @XmlAccessorType(XmlAccessType.FIELD)
-public class OnCompletionDefinition extends ProcessorDefinition<OnCompletionDefinition> implements OutputNode, ExecutorServiceAwareDefinition<OnCompletionDefinition> {
+public class OnCompletionDefinition extends OutputDefinition<OnCompletionDefinition> implements ExecutorServiceAwareDefinition<OnCompletionDefinition> {
     @XmlAttribute
     @Metadata(defaultValue = "AfterConsumer")
     private OnCompletionMode mode;
@@ -55,8 +57,6 @@ public class OnCompletionDefinition extends ProcessorDefinition<OnCompletionDefi
     private String executorServiceRef;
     @XmlAttribute(name = "useOriginalMessage")
     private String useOriginalMessage;
-    @XmlElementRef
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
     @XmlTransient
     private ExecutorService executorService;
     @XmlTransient
@@ -268,8 +268,10 @@ public class OnCompletionDefinition extends ProcessorDefinition<OnCompletionDefi
         return outputs;
     }
 
+    @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
+        super.setOutputs(outputs);
     }
 
     public OnCompletionMode getMode() {
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/OnExceptionDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/OnExceptionDefinition.java
index a842798..4f1bef5 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/OnExceptionDefinition.java
+++ b/core/camel-core-engine/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> implements OutputNode {
+public class OnExceptionDefinition extends OutputDefinition<OnExceptionDefinition> {
     @XmlElement(name = "exception", required = true)
     private List<String> exceptions = new ArrayList<>();
     @XmlElement(name = "onWhen")
@@ -72,8 +72,6 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini
     private String useOriginalMessage;
     @XmlAttribute(name = "useOriginalBody")
     private String useOriginalBody;
-    @XmlElementRef
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
     @XmlTransient
     private Predicate handledPolicy;
     @XmlTransient
@@ -808,8 +806,10 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini
         return outputs;
     }
 
+    @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
+        super.setOutputs(outputs);
     }
 
     public List<String> getExceptions() {
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/OnFallbackDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/OnFallbackDefinition.java
index ccec8a7..90a607f 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/OnFallbackDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/OnFallbackDefinition.java
@@ -16,11 +16,13 @@
  */
 package org.apache.camel.model;
 
+import java.util.List;
 import java.util.stream.Collectors;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.spi.Metadata;
@@ -41,6 +43,17 @@ public class OnFallbackDefinition extends OutputDefinition<OnFallbackDefinition>
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
+    @Override
     public String toString() {
         if (Boolean.toString(true).equals(fallbackViaNetwork)) {
             return "OnFallbackViaNetwork[" + getOutputs() + "]";
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/OtherwiseDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/OtherwiseDefinition.java
index 573fd71..a2e9289 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/OtherwiseDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/OtherwiseDefinition.java
@@ -16,10 +16,12 @@
  */
 package org.apache.camel.model;
 
+import java.util.List;
 import java.util.stream.Collectors;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.spi.Metadata;
@@ -36,6 +38,17 @@ public class OtherwiseDefinition extends OutputDefinition<OtherwiseDefinition> {
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
+    @Override
     public String toString() {
         return "Otherwise[" + getOutputs() + "]";
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/OutputDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/OutputDefinition.java
index c8b6e30..6ad7880 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/OutputDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/OutputDefinition.java
@@ -22,6 +22,7 @@ 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 javax.xml.bind.annotation.XmlType;
 
 import org.apache.camel.spi.Metadata;
@@ -31,10 +32,9 @@ import org.apache.camel.spi.Metadata;
  */
 @Metadata(label = "configuration")
 @XmlType(name = "output")
-@XmlAccessorType(XmlAccessType.FIELD)
+@XmlAccessorType(XmlAccessType.NONE)
 public class OutputDefinition<Type extends ProcessorDefinition<Type>> extends ProcessorDefinition<Type> implements OutputNode {
 
-    @XmlElementRef
     protected List<ProcessorDefinition<?>> outputs = new ArrayList<>();
 
     @Override
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/PipelineDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/PipelineDefinition.java
index 501aef4..cfbad09 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/PipelineDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/PipelineDefinition.java
@@ -16,8 +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.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.spi.Metadata;
@@ -34,6 +37,17 @@ public class PipelineDefinition extends OutputDefinition<PipelineDefinition> {
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
+    @Override
     public String getShortName() {
         return "pipeline";
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/PolicyDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/PolicyDefinition.java
index 375da46..f2f7536 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/PolicyDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/PolicyDefinition.java
@@ -16,9 +16,12 @@
  */
 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.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -49,6 +52,17 @@ public class PolicyDefinition extends OutputDefinition<PolicyDefinition> {
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
+    @Override
     public String toString() {
         return "Policy[" + description() + "]";
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/ResequenceDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/ResequenceDefinition.java
index 4bd193d..ef0ece2 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/ResequenceDefinition.java
+++ b/core/camel-core-engine/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> implements OutputNode {
+public class ResequenceDefinition extends OutputDefinition<ResequenceDefinition> {
     @Metadata(required = false)
     @XmlElements({@XmlElement(name = "batch-config", type = BatchResequencerConfig.class), @XmlElement(name = "stream-config", type = StreamResequencerConfig.class)})
     private ResequencerConfig resequencerConfig;
@@ -52,8 +52,6 @@ public class ResequenceDefinition extends ProcessorDefinition<ResequenceDefiniti
     @XmlElementRef
     @Metadata(required = true)
     private ExpressionDefinition expression;
-    @XmlElementRef
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
 
     public ResequenceDefinition() {
     }
@@ -69,8 +67,10 @@ public class ResequenceDefinition extends ProcessorDefinition<ResequenceDefiniti
         return outputs;
     }
 
+    @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
+        super.setOutputs(outputs);
     }
 
     // Fluent API
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinition.java
index 7e839eb..470a9d6 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinition.java
@@ -53,10 +53,9 @@ 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> implements OutputNode, NamedRoute {
+public class RouteDefinition extends OutputDefinition<RouteDefinition> implements NamedRoute {
     private final AtomicBoolean prepared = new AtomicBoolean(false);
     private FromDefinition input;
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
     private String group;
     private String streamCache;
     private String trace;
@@ -693,14 +692,9 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> implem
      * route.
      */
     @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
-
-        if (outputs != null) {
-            for (ProcessorDefinition<?> output : outputs) {
-                configureChild(output);
-            }
-        }
+        super.setOutputs(outputs);
     }
 
     /**
@@ -853,6 +847,7 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> implem
     /**
      * Sets the error handler if one is not already set
      */
+    @XmlTransient
     public void setErrorHandlerFactoryIfNull(ErrorHandlerFactory errorHandlerFactory) {
         if (this.errorHandlerFactory == null) {
             setErrorHandlerFactory(errorHandlerFactory);
@@ -925,7 +920,6 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> implem
         return new ErrorHandlerBuilderRef(ErrorHandlerReifier.DEFAULT_ERROR_HANDLER_BUILDER);
     }
 
-    @XmlTransient
     public ErrorHandlerFactory getErrorHandlerFactory() {
         if (errorHandlerFactory == null) {
             errorHandlerFactory = createErrorHandlerBuilder();
@@ -936,6 +930,7 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> implem
     /**
      * Sets the error handler to use with processors created by this builder
      */
+    @XmlTransient
     public void setErrorHandlerFactory(ErrorHandlerFactory errorHandlerFactory) {
         this.errorHandlerFactory = errorHandlerFactory;
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/SagaDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/SagaDefinition.java
index d0ba02d..e1d9269 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/SagaDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/SagaDefinition.java
@@ -24,6 +24,7 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -68,6 +69,12 @@ public class SagaDefinition extends OutputDefinition<SagaDefinition> {
     public SagaDefinition() {
     }
 
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
     @Override
     public boolean isAbstract() {
         return true;
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/StepDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/StepDefinition.java
index c51436e..4b88aef 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/StepDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/StepDefinition.java
@@ -16,8 +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.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.spi.Metadata;
@@ -35,6 +38,17 @@ public class StepDefinition extends OutputDefinition<StepDefinition> {
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return super.getOutputs();
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
+    @Override
     public String getShortName() {
         return "step";
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/TransactedDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/TransactedDefinition.java
index 4d3ed22..ba7fcdf 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/TransactedDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/TransactedDefinition.java
@@ -16,9 +16,12 @@
  */
 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.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -54,6 +57,12 @@ public class TransactedDefinition extends OutputDefinition<TransactedDefinition>
         this.policy = policy;
     }
 
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
     @Override
     public String toString() {
         String desc = description();
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/TryDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/TryDefinition.java
index 116ce4f..5a202c7 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/TryDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/TryDefinition.java
@@ -23,6 +23,7 @@ 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.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -157,6 +158,12 @@ public class TryDefinition extends OutputDefinition<TryDefinition> {
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return super.getOutputs();
+    }
+
+    @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
         initialized = false;
         super.setOutputs(outputs);
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallConfiguration.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallConfiguration.java
new file mode 100644
index 0000000..610b5ee
--- /dev/null
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallConfiguration.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.model.cloud;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.model.IdentifiedType;
+import org.apache.camel.model.PropertyDefinition;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.support.CamelContextHelper;
+
+@XmlType(name = "serviceCallConfiguration")
+@XmlAccessorType(XmlAccessType.FIELD)
+public abstract class ServiceCallConfiguration extends IdentifiedType {
+    @XmlElement(name = "properties")
+    @Metadata(label = "advanced")
+    protected List<PropertyDefinition> properties;
+
+    // *************************************************************************
+    //
+    // *************************************************************************
+
+    public List<PropertyDefinition> getProperties() {
+        return properties;
+    }
+
+    /**
+     * Set client properties to use.
+     * <p/>
+     * These properties are specific to what service call implementation are in
+     * use. For example if using ribbon, then the client properties are define
+     * in com.netflix.client.config.CommonClientConfigKey.
+     */
+    public void setProperties(List<PropertyDefinition> properties) {
+        this.properties = properties;
+    }
+
+    /**
+     * Adds a custom property to use.
+     * <p/>
+     * These properties are specific to what service call implementation are in
+     * use. For example if using ribbon, then the client properties are define
+     * in com.netflix.client.config.CommonClientConfigKey.
+     */
+    public ServiceCallConfiguration property(String key, String value) {
+        if (properties == null) {
+            properties = new ArrayList<>();
+        }
+        PropertyDefinition prop = new PropertyDefinition();
+        prop.setKey(key);
+        prop.setValue(value);
+        properties.add(prop);
+        return this;
+    }
+
+    protected Map<String, String> getPropertiesAsMap(CamelContext camelContext) throws Exception {
+        Map<String, String> answer;
+
+        if (properties == null || properties.isEmpty()) {
+            answer = Collections.emptyMap();
+        } else {
+            answer = new HashMap<>();
+            for (PropertyDefinition prop : properties) {
+                // support property placeholders
+                String key = CamelContextHelper.parseText(camelContext, prop.getKey());
+                String value = CamelContextHelper.parseText(camelContext, prop.getValue());
+                answer.put(key, value);
+            }
+        }
+
+        return answer;
+    }
+
+    // *************************************************************************
+    // Utilities
+    // *************************************************************************
+
+    protected void postProcessFactoryParameters(CamelContext camelContext, Map<String, Object> parameters) throws Exception {
+    }
+}
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
index cfaa939..0de723d 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
@@ -16,16 +16,12 @@
  */
 package org.apache.camel.model.cloud;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
@@ -36,9 +32,7 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.cloud.ServiceCallConstants;
 import org.apache.camel.cloud.ServiceExpressionFactory;
-import org.apache.camel.model.IdentifiedType;
 import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.model.PropertyDefinition;
 import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.support.CamelContextHelper;
@@ -47,14 +41,11 @@ import org.apache.camel.support.PropertyBindingSupport;
 @Metadata(label = "routing,cloud")
 @XmlRootElement(name = "serviceExpression")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ServiceCallExpressionConfiguration extends IdentifiedType implements ServiceExpressionFactory {
+public class ServiceCallExpressionConfiguration extends ServiceCallConfiguration implements ServiceExpressionFactory {
     @XmlTransient
     private final ServiceCallDefinition parent;
     @XmlTransient
     private final String factoryKey;
-    @XmlElement(name = "properties")
-    @Metadata(label = "advanced")
-    private List<PropertyDefinition> properties;
     @XmlAttribute
     @Metadata(defaultValue = ServiceCallConstants.SERVICE_HOST)
     private String hostHeader = ServiceCallConstants.SERVICE_HOST;
@@ -87,55 +78,8 @@ public class ServiceCallExpressionConfiguration extends IdentifiedType implement
     //
     // *************************************************************************
 
-    public List<PropertyDefinition> getProperties() {
-        return properties;
-    }
-
-    /**
-     * Set client properties to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
-    public void setProperties(List<PropertyDefinition> properties) {
-        this.properties = properties;
-    }
-
-    /**
-     * Adds a custom property to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
-    public ServiceCallExpressionConfiguration property(String key, String value) {
-        if (properties == null) {
-            properties = new ArrayList<>();
-        }
-        PropertyDefinition prop = new PropertyDefinition();
-        prop.setKey(key);
-        prop.setValue(value);
-        properties.add(prop);
-        return this;
-    }
-
-    protected Map<String, String> getPropertiesAsMap(CamelContext camelContext) throws Exception {
-        Map<String, String> answer;
-
-        if (properties == null || properties.isEmpty()) {
-            answer = Collections.emptyMap();
-        } else {
-            answer = new HashMap<>();
-            for (PropertyDefinition prop : properties) {
-                // support property placeholders
-                String key = CamelContextHelper.parseText(camelContext, prop.getKey());
-                String value = CamelContextHelper.parseText(camelContext, prop.getValue());
-                answer.put(key, value);
-            }
-        }
-
-        return answer;
+    public ServiceCallServiceChooserConfiguration property(String key, String value) {
+        return (ServiceCallServiceChooserConfiguration) super.property(key, value);
     }
 
     public String getHostHeader() {
@@ -282,10 +226,4 @@ public class ServiceCallExpressionConfiguration extends IdentifiedType implement
         return answer;
     }
 
-    // *************************************************************************
-    // Utilities
-    // *************************************************************************
-
-    protected void postProcessFactoryParameters(CamelContext camelContext, Map<String, Object> parameters) throws Exception {
-    }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
index cca7642..2ceedfa 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
@@ -16,15 +16,11 @@
  */
 package org.apache.camel.model.cloud;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -33,9 +29,7 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.cloud.ServiceChooser;
 import org.apache.camel.cloud.ServiceChooserFactory;
-import org.apache.camel.model.IdentifiedType;
 import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.model.PropertyDefinition;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.PropertyBindingSupport;
@@ -44,14 +38,11 @@ import org.apache.camel.util.ObjectHelper;
 @Metadata(label = "routing,cloud,service-discovery")
 @XmlRootElement(name = "serviceChooserConfiguration")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ServiceCallServiceChooserConfiguration extends IdentifiedType implements ServiceChooserFactory {
+public class ServiceCallServiceChooserConfiguration extends ServiceCallConfiguration implements ServiceChooserFactory {
     @XmlTransient
     private final ServiceCallDefinition parent;
     @XmlTransient
     private final String factoryKey;
-    @XmlElement(name = "properties")
-    @Metadata(label = "advanced")
-    private List<PropertyDefinition> properties;
 
     public ServiceCallServiceChooserConfiguration() {
         this(null, null);
@@ -74,55 +65,8 @@ public class ServiceCallServiceChooserConfiguration extends IdentifiedType imple
     //
     // *************************************************************************
 
-    public List<PropertyDefinition> getProperties() {
-        return properties;
-    }
-
-    /**
-     * Set client properties to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
-    public void setProperties(List<PropertyDefinition> properties) {
-        this.properties = properties;
-    }
-
-    /**
-     * Adds a custom property to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
     public ServiceCallServiceChooserConfiguration property(String key, String value) {
-        if (properties == null) {
-            properties = new ArrayList<>();
-        }
-        PropertyDefinition prop = new PropertyDefinition();
-        prop.setKey(key);
-        prop.setValue(value);
-        properties.add(prop);
-        return this;
-    }
-
-    protected Map<String, String> getPropertiesAsMap(CamelContext camelContext) throws Exception {
-        Map<String, String> answer;
-
-        if (properties == null || properties.isEmpty()) {
-            answer = Collections.emptyMap();
-        } else {
-            answer = new HashMap<>();
-            for (PropertyDefinition prop : properties) {
-                // support property placeholders
-                String key = CamelContextHelper.parseText(camelContext, prop.getKey());
-                String value = CamelContextHelper.parseText(camelContext, prop.getValue());
-                answer.put(key, value);
-            }
-        }
-
-        return answer;
+        return (ServiceCallServiceChooserConfiguration) super.property(key, value);
     }
 
     // *************************************************************************
@@ -192,10 +136,4 @@ public class ServiceCallServiceChooserConfiguration extends IdentifiedType imple
         return answer;
     }
 
-    // *************************************************************************
-    // Utilities
-    // *************************************************************************
-
-    protected void postProcessFactoryParameters(CamelContext camelContext, Map<String, Object> parameters) throws Exception {
-    }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
index 8c9a650..4315cb8 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
@@ -16,16 +16,12 @@
  */
 package org.apache.camel.model.cloud;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -34,9 +30,7 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.cloud.ServiceDiscovery;
 import org.apache.camel.cloud.ServiceDiscoveryFactory;
-import org.apache.camel.model.IdentifiedType;
 import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.model.PropertyDefinition;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.PropertyBindingSupport;
@@ -45,14 +39,11 @@ import org.apache.camel.util.ObjectHelper;
 @Metadata(label = "routing,cloud,service-discovery")
 @XmlRootElement(name = "serviceDiscoveryConfiguration")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ServiceCallServiceDiscoveryConfiguration extends IdentifiedType implements ServiceDiscoveryFactory {
+public class ServiceCallServiceDiscoveryConfiguration extends ServiceCallConfiguration implements ServiceDiscoveryFactory {
     @XmlTransient
     private final Optional<ServiceCallDefinition> parent;
     @XmlTransient
     private final String factoryKey;
-    @XmlElement(name = "properties")
-    @Metadata(label = "advanced")
-    private List<PropertyDefinition> properties;
 
     public ServiceCallServiceDiscoveryConfiguration() {
         this(null, null);
@@ -75,55 +66,8 @@ public class ServiceCallServiceDiscoveryConfiguration extends IdentifiedType imp
     //
     // *************************************************************************
 
-    public List<PropertyDefinition> getProperties() {
-        return properties;
-    }
-
-    /**
-     * Set client properties to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
-    public void setProperties(List<PropertyDefinition> properties) {
-        this.properties = properties;
-    }
-
-    /**
-     * Adds a custom property to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
     public ServiceCallServiceDiscoveryConfiguration property(String key, String value) {
-        if (properties == null) {
-            properties = new ArrayList<>();
-        }
-        PropertyDefinition prop = new PropertyDefinition();
-        prop.setKey(key);
-        prop.setValue(value);
-        properties.add(prop);
-        return this;
-    }
-
-    protected Map<String, String> getPropertiesAsMap(CamelContext camelContext) throws Exception {
-        Map<String, String> answer;
-
-        if (properties == null || properties.isEmpty()) {
-            answer = Collections.emptyMap();
-        } else {
-            answer = new HashMap<>();
-            for (PropertyDefinition prop : properties) {
-                // support property placeholders
-                String key = CamelContextHelper.parseText(camelContext, prop.getKey());
-                String value = CamelContextHelper.parseText(camelContext, prop.getValue());
-                answer.put(key, value);
-            }
-        }
-
-        return answer;
+        return (ServiceCallServiceDiscoveryConfiguration) super.property(key, value);
     }
 
     // *************************************************************************
@@ -193,10 +137,4 @@ public class ServiceCallServiceDiscoveryConfiguration extends IdentifiedType imp
         return answer;
     }
 
-    // *************************************************************************
-    // Utilities
-    // *************************************************************************
-
-    protected void postProcessFactoryParameters(CamelContext camelContext, Map<String, Object> parameters) throws Exception {
-    }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
index 52a0c3f..25d7a33 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
@@ -16,15 +16,11 @@
  */
 package org.apache.camel.model.cloud;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -33,9 +29,7 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.cloud.ServiceFilter;
 import org.apache.camel.cloud.ServiceFilterFactory;
-import org.apache.camel.model.IdentifiedType;
 import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.model.PropertyDefinition;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.PropertyBindingSupport;
@@ -44,14 +38,11 @@ import org.apache.camel.util.ObjectHelper;
 @Metadata(label = "routing,cloud,service-discovery")
 @XmlRootElement(name = "serviceFilterConfiguration")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ServiceCallServiceFilterConfiguration extends IdentifiedType implements ServiceFilterFactory {
+public class ServiceCallServiceFilterConfiguration extends ServiceCallConfiguration implements ServiceFilterFactory {
     @XmlTransient
     private final ServiceCallDefinition parent;
     @XmlTransient
     private final String factoryKey;
-    @XmlElement(name = "properties")
-    @Metadata(label = "advanced")
-    private List<PropertyDefinition> properties;
 
     public ServiceCallServiceFilterConfiguration() {
         this(null, null);
@@ -74,21 +65,6 @@ public class ServiceCallServiceFilterConfiguration extends IdentifiedType implem
     //
     // *************************************************************************
 
-    public List<PropertyDefinition> getProperties() {
-        return properties;
-    }
-
-    /**
-     * Set client properties to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
-    public void setProperties(List<PropertyDefinition> properties) {
-        this.properties = properties;
-    }
-
     /**
      * Adds a custom property to use.
      * <p/>
@@ -97,32 +73,7 @@ public class ServiceCallServiceFilterConfiguration extends IdentifiedType implem
      * in com.netflix.client.config.CommonClientConfigKey.
      */
     public ServiceCallServiceFilterConfiguration property(String key, String value) {
-        if (properties == null) {
-            properties = new ArrayList<>();
-        }
-        PropertyDefinition prop = new PropertyDefinition();
-        prop.setKey(key);
-        prop.setValue(value);
-        properties.add(prop);
-        return this;
-    }
-
-    protected Map<String, String> getPropertiesAsMap(CamelContext camelContext) throws Exception {
-        Map<String, String> answer;
-
-        if (properties == null || properties.isEmpty()) {
-            answer = Collections.emptyMap();
-        } else {
-            answer = new HashMap<>();
-            for (PropertyDefinition prop : properties) {
-                // support property placeholders
-                String key = CamelContextHelper.parseText(camelContext, prop.getKey());
-                String value = CamelContextHelper.parseText(camelContext, prop.getValue());
-                answer.put(key, value);
-            }
-        }
-
-        return answer;
+        return (ServiceCallServiceFilterConfiguration) super.property(key, value);
     }
 
     // *************************************************************************
@@ -192,10 +143,4 @@ public class ServiceCallServiceFilterConfiguration extends IdentifiedType implem
         return answer;
     }
 
-    // *************************************************************************
-    // Utilities
-    // *************************************************************************
-
-    protected void postProcessFactoryParameters(CamelContext camelContext, Map<String, Object> parameters) throws Exception {
-    }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
index e6afc97..3fb9fd5 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
@@ -16,15 +16,11 @@
  */
 package org.apache.camel.model.cloud;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -33,9 +29,7 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.cloud.ServiceLoadBalancer;
 import org.apache.camel.cloud.ServiceLoadBalancerFactory;
-import org.apache.camel.model.IdentifiedType;
 import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.model.PropertyDefinition;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.PropertyBindingSupport;
@@ -44,14 +38,11 @@ import org.apache.camel.util.ObjectHelper;
 @Metadata(label = "routing,cloud,load-balancing")
 @XmlRootElement(name = "loadBalancerConfiguration")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ServiceCallServiceLoadBalancerConfiguration extends IdentifiedType implements ServiceLoadBalancerFactory {
+public class ServiceCallServiceLoadBalancerConfiguration extends ServiceCallConfiguration implements ServiceLoadBalancerFactory {
     @XmlTransient
     private final ServiceCallDefinition parent;
     @XmlTransient
     private final String factoryKey;
-    @XmlElement(name = "properties")
-    @Metadata(label = "advanced")
-    private List<PropertyDefinition> properties;
 
     public ServiceCallServiceLoadBalancerConfiguration() {
         this(null, null);
@@ -74,21 +65,6 @@ public class ServiceCallServiceLoadBalancerConfiguration extends IdentifiedType
     //
     // *************************************************************************
 
-    public List<PropertyDefinition> getProperties() {
-        return properties;
-    }
-
-    /**
-     * Set client properties to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
-    public void setProperties(List<PropertyDefinition> properties) {
-        this.properties = properties;
-    }
-
     /**
      * Adds a custom property to use.
      * <p/>
@@ -97,32 +73,7 @@ public class ServiceCallServiceLoadBalancerConfiguration extends IdentifiedType
      * in com.netflix.client.config.CommonClientConfigKey.
      */
     public ServiceCallServiceLoadBalancerConfiguration property(String key, String value) {
-        if (properties == null) {
-            properties = new ArrayList<>();
-        }
-        PropertyDefinition prop = new PropertyDefinition();
-        prop.setKey(key);
-        prop.setValue(value);
-        properties.add(prop);
-        return this;
-    }
-
-    protected Map<String, String> getPropertiesAsMap(CamelContext camelContext) throws Exception {
-        Map<String, String> answer;
-
-        if (properties == null || properties.isEmpty()) {
-            answer = Collections.emptyMap();
-        } else {
-            answer = new HashMap<>();
-            for (PropertyDefinition prop : properties) {
-                // support property placeholders
-                String key = CamelContextHelper.parseText(camelContext, prop.getKey());
-                String value = CamelContextHelper.parseText(camelContext, prop.getValue());
-                answer.put(key, value);
-            }
-        }
-
-        return answer;
+        return (ServiceCallServiceLoadBalancerConfiguration) super.property(key, value);
     }
 
     // *************************************************************************
@@ -192,10 +143,4 @@ public class ServiceCallServiceLoadBalancerConfiguration extends IdentifiedType
         return answer;
     }
 
-    // *************************************************************************
-    // Utilities
-    // *************************************************************************
-
-    protected void postProcessFactoryParameters(CamelContext camelContext, Map<String, Object> parameters) throws Exception {
-    }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java
index 001eca9..29d2e8b 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java
@@ -77,6 +77,13 @@ public class BindyDataFormat extends DataFormatDefinition {
     /**
      * Name of model class to use.
      */
+    public void setClassType(String classType) {
+        setClassTypeAsString(classType);
+    }
+
+    /**
+     * Name of model class to use.
+     */
     public void setClassType(Class<?> classType) {
         this.clazz = classType;
     }
diff --git a/core/camel-core/src/test/java/org/apache/camel/model/ModelSanityCheckerTest.java b/core/camel-core/src/test/java/org/apache/camel/model/ModelSanityCheckerTest.java
index d2a485e..7417def 100644
--- a/core/camel-core/src/test/java/org/apache/camel/model/ModelSanityCheckerTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/model/ModelSanityCheckerTest.java
@@ -108,7 +108,8 @@ public class ModelSanityCheckerTest extends Assert {
 
                 assertFalse("Class " + clazz.getName() + " has method " + method.getName() + " should not have @XmlAttribute annotation", attribute);
                 assertFalse("Class " + clazz.getName() + " has method " + method.getName() + " should not have @XmlElement annotation", element);
-                assertFalse("Class " + clazz.getName() + " has method " + method.getName() + " should not have @XmlElementRef annotation", elementRef);
+                assertFalse("Class " + clazz.getName() + " has method " + method.getName() + " should not have @XmlElementRef annotation",
+                        elementRef && !"setOutputs".equals(method.getName()));
             }
         }