This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 265011ea1026 CAMEL-25157: camel-java-io - LwModelToJavaDumper writes
valid Java DSL for more routes (#27129)
265011ea1026 is described below
commit 265011ea1026da8cafb06a892ce2bdfd3a71399e
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Sep 30 15:01:36 2026 +0200
CAMEL-25157: camel-java-io - LwModelToJavaDumper writes valid Java DSL for
more routes (#27129)
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
---
.../apache/camel/java/out/JavaDslModelWriter.java | 110 +++++
.../org/apache/camel/java/in/ModelNormalizer.java | 11 +
.../camel/java/out/JavaDslModelWriterSupport.java | 511 ++++++++++++++++++++-
.../apache/camel/java/LwModelToJavaDumperTest.java | 33 ++
.../org/apache/camel/java/in/RoundTripTest.java | 14 +-
.../resources/stepArgumentsAndTypedOptions.xml | 78 ++++
.../resources/velocity/model-java-dsl-writer.vm | 1 +
7 files changed, 742 insertions(+), 16 deletions(-)
diff --git
a/core/camel-java-io/src/generated/java/org/apache/camel/java/out/JavaDslModelWriter.java
b/core/camel-java-io/src/generated/java/org/apache/camel/java/out/JavaDslModelWriter.java
index df5d2c563441..a85cc4ac9fee 100644
---
a/core/camel-java-io/src/generated/java/org/apache/camel/java/out/JavaDslModelWriter.java
+++
b/core/camel-java-io/src/generated/java/org/apache/camel/java/out/JavaDslModelWriter.java
@@ -4125,6 +4125,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "AggregateDefinition" -> {
AggregateDefinition _d = (AggregateDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".aggregate(");
boolean _first = true;
if (_d.getCorrelationExpression() != null &&
_d.getCorrelationExpression().getExpressionType() != null) {
@@ -4141,6 +4142,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "BeanDefinition" -> {
BeanDefinition _d = (BeanDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".bean(");
boolean _first = true;
if (_d.getRef() != null) {
@@ -4162,6 +4164,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "CacheDefinition" -> {
CacheDefinition _d = (CacheDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".cache(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -4178,6 +4181,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "CatchDefinition" -> {
CatchDefinition _d = (CatchDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".doCatch(");
boolean _first = true;
if (_d.getExceptions() != null) {
@@ -4206,6 +4210,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ClaimCheckDefinition" -> {
ClaimCheckDefinition _d = (ClaimCheckDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".claimCheck(");
boolean _first = true;
if (_d.getOperation() != null) {
@@ -4233,6 +4238,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ConvertBodyDefinition" -> {
ConvertBodyDefinition _d = (ConvertBodyDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".convertBodyTo(");
boolean _first = true;
if (_d.getType() != null) {
@@ -4248,6 +4254,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ConvertHeaderDefinition" -> {
ConvertHeaderDefinition _d = (ConvertHeaderDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".convertHeaderTo(");
boolean _first = true;
if (_d.getName() != null) {
@@ -4269,6 +4276,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ConvertVariableDefinition" -> {
ConvertVariableDefinition _d = (ConvertVariableDefinition)
v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".convertVariableTo(");
boolean _first = true;
if (_d.getName() != null) {
@@ -4290,6 +4298,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "DelayDefinition" -> {
DelayDefinition _d = (DelayDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".delay(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -4306,6 +4315,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "DynamicRouterDefinition" -> {
DynamicRouterDefinition _d = (DynamicRouterDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".dynamicRouter(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -4327,6 +4337,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "FilterDefinition" -> {
FilterDefinition _d = (FilterDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".filter(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -4353,6 +4364,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "IdempotentConsumerDefinition" -> {
IdempotentConsumerDefinition _d =
(IdempotentConsumerDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".idempotentConsumer(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -4379,6 +4391,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "InterceptFromDefinition" -> {
InterceptFromDefinition _d = (InterceptFromDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".interceptFrom(");
boolean _first = true;
if (_d.getUri() != null) {
@@ -4394,6 +4407,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "InterceptSendToEndpointDefinition" -> {
InterceptSendToEndpointDefinition _d =
(InterceptSendToEndpointDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".interceptSendToEndpoint(");
boolean _first = true;
if (_d.getUri() != null) {
@@ -4409,6 +4423,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "KameletDefinition" -> {
KameletDefinition _d = (KameletDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".kamelet(");
boolean _first = true;
if (_d.getName() != null) {
@@ -4429,6 +4444,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "LogDefinition" -> {
LogDefinition _d = (LogDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".log(");
boolean _first = true;
if (_d.getLoggingLevel() != null) {
@@ -4450,6 +4466,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "LoopDefinition" -> {
LoopDefinition _d = (LoopDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".loop(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -4481,6 +4498,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "OnExceptionDefinition" -> {
OnExceptionDefinition _d = (OnExceptionDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".onException(");
boolean _first = true;
if (_d.getExceptions() != null) {
@@ -4529,6 +4547,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "PolicyDefinition" -> {
PolicyDefinition _d = (PolicyDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".policy(");
boolean _first = true;
if (_d.getRef() != null) {
@@ -4544,6 +4563,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "PollDefinition" -> {
PollDefinition _d = (PollDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".poll(");
boolean _first = true;
if (_d.getUri() != null) {
@@ -4570,6 +4590,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ProcessDefinition" -> {
ProcessDefinition _d = (ProcessDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".process(");
boolean _first = true;
if (_d.getRef() != null) {
@@ -4585,6 +4606,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RecipientListDefinition" -> {
RecipientListDefinition _d = (RecipientListDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".recipientList(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -4601,6 +4623,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RemoveHeaderDefinition" -> {
RemoveHeaderDefinition _d = (RemoveHeaderDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".removeHeader(");
boolean _first = true;
if (_d.getName() != null) {
@@ -4616,6 +4639,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RemoveHeadersDefinition" -> {
RemoveHeadersDefinition _d = (RemoveHeadersDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".removeHeaders(");
boolean _first = true;
if (_d.getPattern() != null) {
@@ -4631,6 +4655,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RemovePropertiesDefinition" -> {
RemovePropertiesDefinition _d =
(RemovePropertiesDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".removeProperties(");
boolean _first = true;
if (_d.getPattern() != null) {
@@ -4646,6 +4671,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RemovePropertyDefinition" -> {
RemovePropertyDefinition _d = (RemovePropertyDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".removeProperty(");
boolean _first = true;
if (_d.getName() != null) {
@@ -4661,6 +4687,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RemoveVariableDefinition" -> {
RemoveVariableDefinition _d = (RemoveVariableDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".removeVariable(");
boolean _first = true;
if (_d.getName() != null) {
@@ -4686,6 +4713,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RollbackDefinition" -> {
RollbackDefinition _d = (RollbackDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".rollback(");
boolean _first = true;
if (_d.getMessage() != null) {
@@ -4731,6 +4759,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RoutingSlipDefinition" -> {
RoutingSlipDefinition _d = (RoutingSlipDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".routingSlip(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -4757,6 +4786,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ScriptDefinition" -> {
ScriptDefinition _d = (ScriptDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".script(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -4773,6 +4803,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SetBodyDefinition" -> {
SetBodyDefinition _d = (SetBodyDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".setBody(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -4789,6 +4820,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SetExchangePatternDefinition" -> {
SetExchangePatternDefinition _d =
(SetExchangePatternDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".setExchangePattern(");
boolean _first = true;
if (_d.getPattern() != null) {
@@ -4804,6 +4836,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SetHeaderDefinition" -> {
SetHeaderDefinition _d = (SetHeaderDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".setHeader(");
boolean _first = true;
if (_d.getName() != null) {
@@ -4831,6 +4864,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SetPropertyDefinition" -> {
SetPropertyDefinition _d = (SetPropertyDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".setProperty(");
boolean _first = true;
if (_d.getName() != null) {
@@ -4853,6 +4887,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SetVariableDefinition" -> {
SetVariableDefinition _d = (SetVariableDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".setVariable(");
boolean _first = true;
if (_d.getName() != null) {
@@ -4880,6 +4915,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SortDefinition" -> {
SortDefinition _d = (SortDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".sort(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -4896,6 +4932,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SplitDefinition" -> {
SplitDefinition _d = (SplitDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".split(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -4938,6 +4975,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ThreadsDefinition" -> {
ThreadsDefinition _d = (ThreadsDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".threads(");
boolean _first = true;
if (_d.getPoolSize() != null) {
@@ -4959,6 +4997,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ThrottleDefinition" -> {
ThrottleDefinition _d = (ThrottleDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".throttle(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -4975,6 +5014,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ThrowExceptionDefinition" -> {
ThrowExceptionDefinition _d = (ThrowExceptionDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".throwException(");
boolean _first = true;
if (_d.getExceptionType() != null) {
@@ -4996,6 +5036,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ToDefinition" -> {
ToDefinition _d = (ToDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".to(");
boolean _first = true;
if (_d.getPattern() != null) {
@@ -5017,6 +5058,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ToDynamicDefinition" -> {
ToDynamicDefinition _d = (ToDynamicDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".toD(");
boolean _first = true;
if (_d.getUri() != null) {
@@ -5042,6 +5084,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "TransformDataTypeDefinition" -> {
TransformDataTypeDefinition _d =
(TransformDataTypeDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".transformDataType(");
boolean _first = true;
if (_d.getFromType() != null) {
@@ -5063,6 +5106,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "TransformDefinition" -> {
TransformDefinition _d = (TransformDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".transform(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -5089,6 +5133,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ValidateDefinition" -> {
ValidateDefinition _d = (ValidateDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".validate(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -5105,6 +5150,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "WhenDefinition" -> {
WhenDefinition _d = (WhenDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".when(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -5121,6 +5167,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "WireTapDefinition" -> {
WireTapDefinition _d = (WireTapDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".wireTap(");
boolean _first = true;
if (_d.getUri() != null) {
@@ -5136,6 +5183,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "DeleteDefinition" -> {
DeleteDefinition _d = (DeleteDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".delete(");
boolean _first = true;
if (_d.getPath() != null) {
@@ -5151,6 +5199,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "GetDefinition" -> {
GetDefinition _d = (GetDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".get(");
boolean _first = true;
if (_d.getPath() != null) {
@@ -5166,6 +5215,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "HeadDefinition" -> {
HeadDefinition _d = (HeadDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".head(");
boolean _first = true;
if (_d.getPath() != null) {
@@ -5186,6 +5236,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "PatchDefinition" -> {
PatchDefinition _d = (PatchDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".patch(");
boolean _first = true;
if (_d.getPath() != null) {
@@ -5201,6 +5252,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "PostDefinition" -> {
PostDefinition _d = (PostDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".post(");
boolean _first = true;
if (_d.getPath() != null) {
@@ -5216,6 +5268,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "PutDefinition" -> {
PutDefinition _d = (PutDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".put(");
boolean _first = true;
if (_d.getPath() != null) {
@@ -5236,6 +5289,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RestDefinition" -> {
RestDefinition _d = (RestDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".rest(");
boolean _first = true;
if (_d.getPath() != null) {
@@ -5278,6 +5332,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "AggregateDefinition" -> {
AggregateDefinition _d = (AggregateDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".aggregate(");
boolean _first = true;
if (_d.getCorrelationExpression() != null &&
_d.getCorrelationExpression().getExpressionType() != null) {
@@ -5294,6 +5349,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "BeanDefinition" -> {
BeanDefinition _d = (BeanDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".bean(");
boolean _first = true;
if (_d.getRef() != null) {
@@ -5315,6 +5371,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "CacheDefinition" -> {
CacheDefinition _d = (CacheDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".cache(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -5331,6 +5388,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "CatchDefinition" -> {
CatchDefinition _d = (CatchDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".doCatch(");
boolean _first = true;
if (_d.getExceptions() != null) {
@@ -5359,6 +5417,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ClaimCheckDefinition" -> {
ClaimCheckDefinition _d = (ClaimCheckDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".claimCheck(");
boolean _first = true;
if (_d.getOperation() != null) {
@@ -5386,6 +5445,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ConvertBodyDefinition" -> {
ConvertBodyDefinition _d = (ConvertBodyDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".convertBodyTo(");
boolean _first = true;
if (_d.getType() != null) {
@@ -5401,6 +5461,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ConvertHeaderDefinition" -> {
ConvertHeaderDefinition _d = (ConvertHeaderDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".convertHeaderTo(");
boolean _first = true;
if (_d.getName() != null) {
@@ -5422,6 +5483,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ConvertVariableDefinition" -> {
ConvertVariableDefinition _d = (ConvertVariableDefinition)
v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".convertVariableTo(");
boolean _first = true;
if (_d.getName() != null) {
@@ -5443,6 +5505,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "DelayDefinition" -> {
DelayDefinition _d = (DelayDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".delay(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -5459,6 +5522,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "DynamicRouterDefinition" -> {
DynamicRouterDefinition _d = (DynamicRouterDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".dynamicRouter(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -5480,6 +5544,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "FilterDefinition" -> {
FilterDefinition _d = (FilterDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".filter(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -5501,6 +5566,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "IdempotentConsumerDefinition" -> {
IdempotentConsumerDefinition _d =
(IdempotentConsumerDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".idempotentConsumer(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -5522,6 +5588,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "InterceptFromDefinition" -> {
InterceptFromDefinition _d = (InterceptFromDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".interceptFrom(");
boolean _first = true;
if (_d.getUri() != null) {
@@ -5537,6 +5604,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "InterceptSendToEndpointDefinition" -> {
InterceptSendToEndpointDefinition _d =
(InterceptSendToEndpointDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".interceptSendToEndpoint(");
boolean _first = true;
if (_d.getUri() != null) {
@@ -5552,6 +5620,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "KameletDefinition" -> {
KameletDefinition _d = (KameletDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".kamelet(");
boolean _first = true;
if (_d.getName() != null) {
@@ -5572,6 +5641,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "LogDefinition" -> {
LogDefinition _d = (LogDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".log(");
boolean _first = true;
if (_d.getLoggingLevel() != null) {
@@ -5593,6 +5663,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "LoopDefinition" -> {
LoopDefinition _d = (LoopDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".loop(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -5624,6 +5695,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "OnExceptionDefinition" -> {
OnExceptionDefinition _d = (OnExceptionDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".onException(");
boolean _first = true;
if (_d.getExceptions() != null) {
@@ -5652,6 +5724,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "PolicyDefinition" -> {
PolicyDefinition _d = (PolicyDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".policy(");
boolean _first = true;
if (_d.getRef() != null) {
@@ -5667,6 +5740,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "PollDefinition" -> {
PollDefinition _d = (PollDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".poll(");
boolean _first = true;
if (_d.getUri() != null) {
@@ -5693,6 +5767,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ProcessDefinition" -> {
ProcessDefinition _d = (ProcessDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".process(");
boolean _first = true;
if (_d.getRef() != null) {
@@ -5708,6 +5783,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RecipientListDefinition" -> {
RecipientListDefinition _d = (RecipientListDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".recipientList(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -5724,6 +5800,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RemoveHeaderDefinition" -> {
RemoveHeaderDefinition _d = (RemoveHeaderDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".removeHeader(");
boolean _first = true;
if (_d.getName() != null) {
@@ -5739,6 +5816,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RemoveHeadersDefinition" -> {
RemoveHeadersDefinition _d = (RemoveHeadersDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".removeHeaders(");
boolean _first = true;
if (_d.getPattern() != null) {
@@ -5754,6 +5832,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RemovePropertiesDefinition" -> {
RemovePropertiesDefinition _d =
(RemovePropertiesDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".removeProperties(");
boolean _first = true;
if (_d.getPattern() != null) {
@@ -5769,6 +5848,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RemovePropertyDefinition" -> {
RemovePropertyDefinition _d = (RemovePropertyDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".removeProperty(");
boolean _first = true;
if (_d.getName() != null) {
@@ -5784,6 +5864,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RemoveVariableDefinition" -> {
RemoveVariableDefinition _d = (RemoveVariableDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".removeVariable(");
boolean _first = true;
if (_d.getName() != null) {
@@ -5809,6 +5890,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RollbackDefinition" -> {
RollbackDefinition _d = (RollbackDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".rollback(");
boolean _first = true;
if (_d.getMessage() != null) {
@@ -5829,6 +5911,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RoutingSlipDefinition" -> {
RoutingSlipDefinition _d = (RoutingSlipDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".routingSlip(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -5855,6 +5938,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ScriptDefinition" -> {
ScriptDefinition _d = (ScriptDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".script(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -5871,6 +5955,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SetBodyDefinition" -> {
SetBodyDefinition _d = (SetBodyDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".setBody(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -5887,6 +5972,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SetExchangePatternDefinition" -> {
SetExchangePatternDefinition _d =
(SetExchangePatternDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".setExchangePattern(");
boolean _first = true;
if (_d.getPattern() != null) {
@@ -5902,6 +5988,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SetHeaderDefinition" -> {
SetHeaderDefinition _d = (SetHeaderDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".setHeader(");
boolean _first = true;
if (_d.getName() != null) {
@@ -5929,6 +6016,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SetPropertyDefinition" -> {
SetPropertyDefinition _d = (SetPropertyDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".setProperty(");
boolean _first = true;
if (_d.getName() != null) {
@@ -5951,6 +6039,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SetVariableDefinition" -> {
SetVariableDefinition _d = (SetVariableDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".setVariable(");
boolean _first = true;
if (_d.getName() != null) {
@@ -5978,6 +6067,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SortDefinition" -> {
SortDefinition _d = (SortDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".sort(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -5994,6 +6084,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SplitDefinition" -> {
SplitDefinition _d = (SplitDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".split(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -6021,6 +6112,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ThreadsDefinition" -> {
ThreadsDefinition _d = (ThreadsDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".threads(");
boolean _first = true;
if (_d.getPoolSize() != null) {
@@ -6042,6 +6134,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ThrottleDefinition" -> {
ThrottleDefinition _d = (ThrottleDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".throttle(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -6058,6 +6151,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ThrowExceptionDefinition" -> {
ThrowExceptionDefinition _d = (ThrowExceptionDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".throwException(");
boolean _first = true;
if (_d.getExceptionType() != null) {
@@ -6079,6 +6173,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ToDefinition" -> {
ToDefinition _d = (ToDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".to(");
boolean _first = true;
if (_d.getPattern() != null) {
@@ -6100,6 +6195,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ToDynamicDefinition" -> {
ToDynamicDefinition _d = (ToDynamicDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".toD(");
boolean _first = true;
if (_d.getUri() != null) {
@@ -6125,6 +6221,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "TransformDataTypeDefinition" -> {
TransformDataTypeDefinition _d =
(TransformDataTypeDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".transformDataType(");
boolean _first = true;
if (_d.getFromType() != null) {
@@ -6146,6 +6243,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "TransformDefinition" -> {
TransformDefinition _d = (TransformDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".transform(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -6172,6 +6270,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "ValidateDefinition" -> {
ValidateDefinition _d = (ValidateDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".validate(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -6188,6 +6287,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "WireTapDefinition" -> {
WireTapDefinition _d = (WireTapDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".wireTap(");
boolean _first = true;
if (_d.getUri() != null) {
@@ -6242,6 +6342,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SetHeaderDefinition" -> {
SetHeaderDefinition _d = (SetHeaderDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".setHeader(");
boolean _first = true;
if (_d.getName() != null) {
@@ -6270,6 +6371,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "SetVariableDefinition" -> {
SetVariableDefinition _d = (SetVariableDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".setVariable(");
boolean _first = true;
if (_d.getName() != null) {
@@ -6309,6 +6411,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "WhenDefinition" -> {
WhenDefinition _d = (WhenDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".when(");
boolean _first = true;
if (_d.getExpression() != null) {
@@ -6510,6 +6613,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "RestDefinition" -> {
RestDefinition _d = (RestDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".rest(");
boolean _first = true;
if (_d.getPath() != null) {
@@ -6542,6 +6646,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "DeleteDefinition" -> {
DeleteDefinition _d = (DeleteDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".delete(");
boolean _first = true;
if (_d.getPath() != null) {
@@ -6557,6 +6662,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "GetDefinition" -> {
GetDefinition _d = (GetDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".get(");
boolean _first = true;
if (_d.getPath() != null) {
@@ -6572,6 +6678,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "HeadDefinition" -> {
HeadDefinition _d = (HeadDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".head(");
boolean _first = true;
if (_d.getPath() != null) {
@@ -6587,6 +6694,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "PatchDefinition" -> {
PatchDefinition _d = (PatchDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".patch(");
boolean _first = true;
if (_d.getPath() != null) {
@@ -6602,6 +6710,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "PostDefinition" -> {
PostDefinition _d = (PostDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".post(");
boolean _first = true;
if (_d.getPath() != null) {
@@ -6617,6 +6726,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "PutDefinition" -> {
PutDefinition _d = (PutDefinition) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".put(");
boolean _first = true;
if (_d.getPath() != null) {
diff --git
a/core/camel-java-io/src/main/java/org/apache/camel/java/in/ModelNormalizer.java
b/core/camel-java-io/src/main/java/org/apache/camel/java/in/ModelNormalizer.java
index a084af72c929..e0706bffa2d5 100644
---
a/core/camel-java-io/src/main/java/org/apache/camel/java/in/ModelNormalizer.java
+++
b/core/camel-java-io/src/main/java/org/apache/camel/java/in/ModelNormalizer.java
@@ -27,6 +27,8 @@ import java.util.Map;
import java.util.Set;
import org.apache.camel.builder.ExpressionClause;
+import org.apache.camel.model.RemoveHeadersDefinition;
+import org.apache.camel.model.RemovePropertiesDefinition;
import org.apache.camel.model.language.ConstantExpression;
import org.apache.camel.model.language.ExpressionDefinition;
import org.apache.camel.support.builder.ValueBuilder;
@@ -72,6 +74,15 @@ final class ModelNormalizer {
if (!o.getClass().getName().startsWith("org.apache.camel.model.")) {
return;
}
+ // removeHeaders("*", "keep") keeps one exclude in an array, XML and
YAML in the excludePattern option
+ if (o instanceof RemoveHeadersDefinition rh && rh.getExcludePattern()
== null && rh.getExcludePatterns() != null
+ && rh.getExcludePatterns().length == 1) {
+ rh.setExcludePattern(rh.getExcludePatterns()[0]);
+ }
+ if (o instanceof RemovePropertiesDefinition rp &&
rp.getExcludePattern() == null
+ && rp.getExcludePatterns() != null &&
rp.getExcludePatterns().length == 1) {
+ rp.setExcludePattern(rp.getExcludePatterns()[0]);
+ }
if (o instanceof ConstantExpression ce && ce.getExpression() == null
&& ce.getExpressionValue() != null) {
// expression().constant(value) keeps the value as a runtime
expression; the other DSLs have its text
ce.setExpression(ce.getExpressionValue().toString());
diff --git
a/core/camel-java-io/src/main/java/org/apache/camel/java/out/JavaDslModelWriterSupport.java
b/core/camel-java-io/src/main/java/org/apache/camel/java/out/JavaDslModelWriterSupport.java
index afbffa2a0cb2..43a77f1eaba4 100644
---
a/core/camel-java-io/src/main/java/org/apache/camel/java/out/JavaDslModelWriterSupport.java
+++
b/core/camel-java-io/src/main/java/org/apache/camel/java/out/JavaDslModelWriterSupport.java
@@ -16,6 +16,9 @@
*/
package org.apache.camel.java.out;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
import java.util.Base64;
import java.util.HashSet;
import java.util.List;
@@ -23,30 +26,53 @@ import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
+import org.apache.camel.builder.ExpressionClause;
+import org.apache.camel.model.BeanDefinition;
import org.apache.camel.model.BeanFactoryDefinition;
+import org.apache.camel.model.ConvertBodyDefinition;
+import org.apache.camel.model.ConvertHeaderDefinition;
+import org.apache.camel.model.ConvertVariableDefinition;
import org.apache.camel.model.DataFormatDefinition;
+import org.apache.camel.model.EnrichDefinition;
import org.apache.camel.model.ErrorHandlerDefinition;
+import org.apache.camel.model.ExpressionNode;
import org.apache.camel.model.ExpressionSubElementDefinition;
+import org.apache.camel.model.InputTypeDefinition;
import org.apache.camel.model.InterceptDefinition;
import org.apache.camel.model.InterceptFromDefinition;
import org.apache.camel.model.InterceptSendToEndpointDefinition;
import org.apache.camel.model.LoadBalancerDefinition;
+import org.apache.camel.model.LogDefinition;
+import org.apache.camel.model.LoopDefinition;
import org.apache.camel.model.OnWhenDefinition;
import org.apache.camel.model.OptionalIdentifiedDefinition;
+import org.apache.camel.model.OutputTypeDefinition;
+import org.apache.camel.model.PollEnrichDefinition;
import org.apache.camel.model.ProcessorDefinition;
import org.apache.camel.model.PropertyDefinition;
import org.apache.camel.model.PropertyExpressionDefinition;
+import org.apache.camel.model.RemoveHeadersDefinition;
+import org.apache.camel.model.RemovePropertiesDefinition;
+import org.apache.camel.model.RollbackDefinition;
import org.apache.camel.model.RouteConfigurationDefinition;
import org.apache.camel.model.RouteDefinition;
import org.apache.camel.model.RouteTemplateDefinition;
import org.apache.camel.model.RouteTemplateParameterDefinition;
+import org.apache.camel.model.SamplingDefinition;
+import org.apache.camel.model.SetHeaderDefinition;
+import org.apache.camel.model.SetHeadersDefinition;
+import org.apache.camel.model.SetVariableDefinition;
+import org.apache.camel.model.SetVariablesDefinition;
import org.apache.camel.model.SwitchCaseDefinition;
import org.apache.camel.model.SwitchDefinition;
import org.apache.camel.model.TemplatedRouteDefinition;
import org.apache.camel.model.TemplatedRouteParameterDefinition;
+import org.apache.camel.model.ThrowExceptionDefinition;
import org.apache.camel.model.ToDefinition;
+import org.apache.camel.model.ToDynamicDefinition;
import org.apache.camel.model.ValueDefinition;
import org.apache.camel.model.config.BatchResequencerConfig;
+import org.apache.camel.model.config.StreamResequencerConfig;
import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
import org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition;
import org.apache.camel.model.language.ConstantExpression;
@@ -66,8 +92,10 @@ import org.apache.camel.model.language.WasmExpression;
import org.apache.camel.model.language.XMLTokenizerExpression;
import org.apache.camel.model.language.XPathExpression;
import org.apache.camel.model.language.XQueryExpression;
+import org.apache.camel.model.loadbalancer.CustomLoadBalancerDefinition;
import org.apache.camel.model.loadbalancer.FailoverLoadBalancerDefinition;
import org.apache.camel.model.loadbalancer.StickyLoadBalancerDefinition;
+import org.apache.camel.model.loadbalancer.WeightedLoadBalancerDefinition;
import org.apache.camel.model.rest.ResponseHeaderDefinition;
import org.apache.camel.model.rest.RestConfigurationDefinition;
import org.apache.camel.model.rest.RestDefinition;
@@ -80,6 +108,8 @@ import
org.apache.camel.model.transformer.TransformerDefinition;
import org.apache.camel.model.validator.CustomValidatorDefinition;
import org.apache.camel.model.validator.EndpointValidatorDefinition;
import org.apache.camel.model.validator.ValidatorDefinition;
+import org.apache.camel.support.builder.ValueBuilder;
+import org.apache.camel.util.TimeUtils;
/**
* Base class for the generated {@link JavaDslModelWriter}. Provides helper
methods for building Java DSL source code
@@ -122,13 +152,17 @@ public abstract class JavaDslModelWriterSupport {
"doTry", "circuitBreaker", "step", "saga", "loop",
"transacted", "aggregate", "resequence", "idempotentConsumer",
"onCompletion", "loadBalance", "kamelet", "onException",
- "intercept", "interceptFrom", "interceptSendToEndpoint");
+ "intercept", "interceptFrom", "interceptSendToEndpoint", "policy");
private static final Set<String> BLOCK_CHILDREN = Set.of(
"otherwise", "doFinally", "onFallback");
private static final Set<String> PREDICATE_CHILDREN = Set.of("handled",
"continued", "retryWhile");
+ /** Expression options whose fluent method has another name: aggregate's
completionSize(Expression). */
+ private static final Map<String, String> CHILD_RENAMES = Map.of(
+ "completionSizeExpression", "completionSize",
"completionTimeoutExpression", "completionTimeout");
+
private static final Set<String> SKIP_ATTRIBUTES = Set.of("customId");
// Builder methods that are no-arg toggles: .name() when "true", skip when
"false"
@@ -177,6 +211,12 @@ public abstract class JavaDslModelWriterSupport {
private boolean inDataFormatBuilder;
private boolean inSubBuilder;
+ /** The definition whose options are being written, whose fluent methods
say how to write each one. */
+ private Object optionOwner;
+ /** Where the call of the step being written starts, for a step whose
options must be its arguments. */
+ private int stepStart = -1;
+ /** The onFallback() of the circuit breaker being written, written last. */
+ private Runnable pendingFallback;
private boolean inRestParam;
private boolean generatedIds;
private boolean sourceLocation;
@@ -203,9 +243,12 @@ public abstract class JavaDslModelWriterSupport {
inDataFormatBuilder = false;
inSubBuilder = false;
inRestParam = false;
+ optionOwner = null;
+ pendingFallback = null;
}
protected void writeRoute(StringBuilder sb, RouteDefinition def) {
+ optionOwner = def;
// extract intercepts from outputs — they are RouteBuilder-level in
Java DSL
if (def.getOutputs() != null) {
for (ProcessorDefinition<?> output : def.getOutputs()) {
@@ -508,10 +551,26 @@ public abstract class JavaDslModelWriterSupport {
*/
protected void beginStep(StringBuilder sb, String name, Object def) {
handledAttributes.clear();
+ optionOwner = def;
+ stepStart = sb.length();
if ("param".equals(name)) {
inRestParam = true;
}
sb.append(NL).append(indent()).append(".").append(name).append("()");
+ // enrich().constant("uri"): the expression clause comes first, the
options after it
+ if ((def instanceof EnrichDefinition || def instanceof
PollEnrichDefinition)
+ && ((ExpressionNode) def).getExpression() != null) {
+ sb.append(NL).append(indent()).append("
.").append(expressionDsl(((ExpressionNode) def).getExpression()));
+ handledAttributes.add("expression");
+ }
+ }
+
+ /**
+ * A step the writer writes with its arguments inline ({@code
.recipientList(header("to"))}): its options follow.
+ */
+ protected void beginInlineStep(StringBuilder sb, Object def) {
+ optionOwner = def;
+ stepStart = sb.length();
}
/**
@@ -522,10 +581,16 @@ public abstract class JavaDslModelWriterSupport {
if ("param".equals(name)) {
inRestParam = false;
}
+ rewriteFromJavaForms(sb, def);
String restEnd = REST_END_METHODS.get(name);
if (restEnd != null) {
sb.append(NL).append(indent()).append(".").append(restEnd).append("()");
} else if (BLOCK_EIPS.contains(name)) {
+ if ("circuitBreaker".equals(name) && pendingFallback != null) {
+ Runnable fallback = pendingFallback;
+ pendingFallback = null;
+ fallback.run();
+ }
sb.append(NL).append(indent()).append(".end()");
}
}
@@ -543,9 +608,14 @@ public abstract class JavaDslModelWriterSupport {
if (defaultValue != null && defaultValue.equals(value)) {
return;
}
+ if (!inSubBuilder && !inDataFormatBuilder && !inRestParam &&
stepArgumentOption(sb, key)) {
+ return;
+ }
String methodName = key;
if (inDataFormatBuilder) {
methodName = DATAFORMAT_ATTR_RENAMES.getOrDefault(key, key);
+ } else if (!inSubBuilder && !inRestParam) {
+ methodName = OPTION_RENAMES.getOrDefault(key, key);
}
if (CLASS_LITERAL_ATTRIBUTES.contains(key)) {
sb.append(NL).append(indent()).append("
.").append(methodName).append("(").append(value).append(".class)");
@@ -561,7 +631,8 @@ public abstract class JavaDslModelWriterSupport {
}
return;
}
- if (BOOLEAN_ATTRIBUTES.contains(key)) {
+ if (BOOLEAN_ATTRIBUTES.contains(key) && ("true".equals(value) ||
"false".equals(value))) {
+ // a placeholder ({{enabled}}) is quoted below, for the String
variant of the option
sb.append(NL).append(indent()).append("
.").append(methodName).append("(").append(value).append(")");
return;
}
@@ -569,9 +640,315 @@ public abstract class JavaDslModelWriterSupport {
sb.append(NL).append(indent()).append("
.").append(methodName).append("(").append(value).append(")");
return;
}
+ if (!inSubBuilder && !inDataFormatBuilder && !inRestParam &&
optionOwner != null) {
+ String call = typedOption(optionOwner.getClass(), methodName,
value);
+ if (call != null) {
+ if (!call.isEmpty()) {
+ sb.append(NL).append(indent()).append("
.").append(call);
+ }
+ return;
+ }
+ }
sb.append(NL).append(indent()).append("
.").append(methodName).append("(").append(quote(value)).append(")");
}
+ /**
+ * Options the Java DSL takes as arguments of the step itself, not as
calls after it: the step's call is written
+ * again from its definition, with them. {@code
convertBodyTo(byte[].class, "UTF-8")}, {@code removeHeaders("*",
+ * "foo")}, {@code toV("direct:x", "send", null)}, {@code
log(LoggingLevel.INFO, "my.log", "hi")},
+ * {@code sample(10)}, {@code loopDoWhile(...)}.
+ *
+ * @return whether the option was written as an argument
+ */
+ private boolean stepArgumentOption(StringBuilder sb, String key) {
+ Object d = optionOwner;
+ String call = null;
+ Set<String> keys = Set.of();
+ if (d instanceof ConvertBodyDefinition c && Set.of("charset",
"mandatory").contains(key)) {
+ String type = classLiteral(c.getType());
+ call = c.getCharset() != null
+ ? "convertBodyTo(" + type + ", " + quote(c.getCharset()) +
")"
+ : "convertBodyTo(" + type + ", " +
booleanLiteral(c.getMandatory()) + ")";
+ keys = Set.of("charset", "mandatory");
+ } else if (d instanceof ConvertHeaderDefinition c && Set.of("toName",
"charset", "mandatory").contains(key)) {
+ call = convertTo("convertHeaderTo", c.getName(), c.getToName(),
c.getType(), c.getCharset(), c.getMandatory());
+ keys = Set.of("toName", "charset", "mandatory");
+ } else if (d instanceof ConvertVariableDefinition c &&
Set.of("toName", "charset", "mandatory").contains(key)) {
+ call = convertTo("convertVariableTo", c.getName(), c.getToName(),
c.getType(), c.getCharset(), c.getMandatory());
+ keys = Set.of("toName", "charset", "mandatory");
+ } else if (d instanceof RemoveHeadersDefinition r &&
"excludePattern".equals(key)) {
+ call = "removeHeaders(" + quote(r.getPattern()) + ", " +
quote(r.getExcludePattern()) + ")";
+ keys = Set.of("excludePattern");
+ } else if (d instanceof ToDefinition t && !(d instanceof
ToDynamicDefinition)
+ && Set.of("variableSend", "variableReceive").contains(key)) {
+ call = "toV(" + quote(t.getUri()) + ", " +
quoteOrNull(t.getVariableSend()) + ", "
+ + quoteOrNull(t.getVariableReceive()) + ")";
+ keys = Set.of("variableSend", "variableReceive");
+ } else if (d != null && d.getClass() == ToDynamicDefinition.class
+ && Set.of("variableSend", "variableReceive",
"ignoreInvalidEndpoint", "cacheSize").contains(key)) {
+ // toD(uri) returns the parent: its options are arguments of
toD(uri, ...), one of them at most
+ ToDynamicDefinition t = (ToDynamicDefinition) d;
+ if (t.getVariableSend() != null || t.getVariableReceive() != null)
{
+ call = "toD(" + quote(t.getUri()) + ", " +
quoteOrNull(t.getVariableSend()) + ", "
+ + quoteOrNull(t.getVariableReceive()) + ")";
+ } else if (t.getIgnoreInvalidEndpoint() != null) {
+ call = "toD(" + quote(t.getUri()) + ", " +
booleanLiteral(t.getIgnoreInvalidEndpoint()) + ")";
+ } else if (t.getCacheSize() != null &&
wholeNumber(t.getCacheSize()) != null) {
+ call = "toD(" + quote(t.getUri()) + ", " + t.getCacheSize() +
")";
+ }
+ keys = Set.of("variableSend", "variableReceive",
"ignoreInvalidEndpoint", "cacheSize");
+ } else if (d instanceof RemovePropertiesDefinition r &&
"excludePattern".equals(key)) {
+ call = "removeProperties(" + quote(r.getPattern()) + ", " +
quote(r.getExcludePattern()) + ")";
+ keys = Set.of("excludePattern");
+ } else if (d instanceof BeanDefinition b && "beanType".equals(key) &&
b.getRef() == null) {
+ call = "bean(" + classLiteral(b.getBeanType()) + (b.getMethod() !=
null ? ", " + quote(b.getMethod()) : "") + ")";
+ keys = Set.of("beanType", "method");
+ } else if (d instanceof LogDefinition l && Set.of("loggingLevel",
"logName", "marker").contains(key)) {
+ // log(message) returns the parent: its options are arguments of
log(level, logName, marker, message)
+ String level = "LoggingLevel." + (l.getLoggingLevel() != null ?
l.getLoggingLevel() : "INFO");
+ if (l.getMarker() != null) {
+ call = "log(" + level + ", " + (l.getLogName() != null ?
quote(l.getLogName()) : "(String) null") + ", "
+ + quote(l.getMarker()) + ", " + quote(l.getMessage()) +
")";
+ } else if (l.getLogName() != null) {
+ call = "log(" + level + ", " + quote(l.getLogName()) + ", " +
quote(l.getMessage()) + ")";
+ } else {
+ call = "log(" + level + ", " + quote(l.getMessage()) + ")";
+ }
+ keys = Set.of("loggingLevel", "logName", "marker");
+ } else if (d instanceof SamplingDefinition sd &&
Set.of("messageFrequency", "samplePeriod").contains(key)) {
+ call = sd.getMessageFrequency() != null
+ ? "sample(" + sd.getMessageFrequency() +
(isLongLiteral(sd.getMessageFrequency()) ? "L" : "") + ")"
+ : "sample(" + quote(sd.getSamplePeriod()) + ")";
+ keys = Set.of("messageFrequency", "samplePeriod");
+ } else if (d instanceof RollbackDefinition rb &&
Set.of("markRollbackOnly", "markRollbackOnlyLast").contains(key)) {
+ // rollback() returns the parent: markRollbackOnly() is the step,
not an option of it
+ if ("true".equals(rb.getMarkRollbackOnly())) {
+ call = "markRollbackOnly()";
+ } else if ("true".equals(rb.getMarkRollbackOnlyLast())) {
+ call = "markRollbackOnlyLast()";
+ }
+ keys = Set.of("markRollbackOnly", "markRollbackOnlyLast");
+ } else if (d instanceof LoopDefinition loop && "doWhile".equals(key)) {
+ if ("true".equals(loop.getDoWhile()) && loop.getExpression() !=
null) {
+ call = "loopDoWhile(" + expressionDsl(loop.getExpression()) +
")";
+ }
+ keys = Set.of("doWhile");
+ }
+ if (keys.isEmpty()) {
+ return false;
+ }
+ handledAttributes.addAll(keys);
+ if (call != null && stepStart >= 0 && stepStart < sb.length()) {
+ int end = sb.indexOf(NL, stepStart + 1);
+ if (end < 0) {
+ end = sb.length();
+ }
+ String line = sb.substring(stepStart, end);
+ int dot = line.indexOf('.');
+ if (dot > 0) {
+ sb.replace(stepStart, end, line.substring(0, dot + 1) + call);
+ }
+ }
+ return true;
+ }
+
+ /**
+ * A route built in Java keeps some options in forms XML and YAML do not
have (a Class, an array): the step's call
+ * is written again with them, without changing the model. {@code
throwException(Foo.class, "msg")},
+ * {@code removeHeaders("*", "Keep*")}.
+ */
+ private void rewriteFromJavaForms(StringBuilder sb, Object def) {
+ String call = null;
+ if (def instanceof ThrowExceptionDefinition t && t.getExceptionType()
== null && t.getExceptionClass() != null) {
+ call = "throwException(" + typeName(t.getExceptionClass()) +
".class, " + quote(t.getMessage()) + ")";
+ } else if (def instanceof RemoveHeadersDefinition r &&
r.getExcludePattern() == null
+ && r.getExcludePatterns() != null &&
r.getExcludePatterns().length > 0) {
+ call = "removeHeaders(" + quote(r.getPattern()) + ", " +
quotedList(r.getExcludePatterns()) + ")";
+ } else if (def instanceof RemovePropertiesDefinition r &&
r.getExcludePattern() == null
+ && r.getExcludePatterns() != null &&
r.getExcludePatterns().length > 0) {
+ call = "removeProperties(" + quote(r.getPattern()) + ", " +
quotedList(r.getExcludePatterns()) + ")";
+ }
+ if (call == null || stepStart < 0 || stepStart >= sb.length()) {
+ return;
+ }
+ int end = sb.indexOf(NL, stepStart + 1);
+ if (end < 0) {
+ end = sb.length();
+ }
+ String line = sb.substring(stepStart, end);
+ int dot = line.indexOf('.');
+ if (dot > 0) {
+ sb.replace(stepStart, end, line.substring(0, dot + 1) + call);
+ }
+ }
+
+ private String quotedList(String[] values) {
+ StringBuilder b = new StringBuilder();
+ for (String v : values) {
+ b.append(b.isEmpty() ? "" : ", ").append(quote(v));
+ }
+ return b.toString();
+ }
+
+ /** A class as Java names it in source: java.lang.String as String, byte[]
as byte[], a nested one with a dot. */
+ private String typeName(Class<?> type) {
+ if (type.isArray()) {
+ return typeName(type.getComponentType()) + "[]";
+ }
+ String name = type.getName().replace('$', '.');
+ return name.startsWith("java.lang.") && name.indexOf('.', 10) < 0 ?
name.substring(10) : name;
+ }
+
+ /** setHeaders("h1", expr1, "h2", expr2): the Java DSL takes the names and
values as varargs of the step. */
+ private boolean writeNamesAndValues(StringBuilder sb, String key, List<?>
list) {
+ StringBuilder args = new StringBuilder();
+ for (Object o : list) {
+ String name;
+ ExpressionDefinition expr;
+ if (o instanceof SetHeaderDefinition h) {
+ name = h.getName();
+ expr = h.getExpression();
+ } else if (o instanceof SetVariableDefinition v) {
+ name = v.getName();
+ expr = v.getExpression();
+ } else {
+ return false;
+ }
+ if (name == null || expr == null) {
+ return false;
+ }
+ args.append(args.isEmpty() ? "" : ",
").append(quote(name)).append(", ").append(expressionDsl(expr));
+ }
+ if (stepStart < 0 || stepStart >= sb.length()) {
+ return false;
+ }
+ int end = sb.indexOf(NL, stepStart + 1);
+ if (end < 0) {
+ end = sb.length();
+ }
+ String line = sb.substring(stepStart, end);
+ int dot = line.indexOf('.');
+ String method = "headers".equals(key) ? "setHeaders" : "setVariables";
+ sb.replace(stepStart, end, line.substring(0, dot + 1) + method + "(" +
args + ")");
+ handledAttributes.add(key);
+ return true;
+ }
+
+ private String convertTo(String method, String name, String toName, String
type, String charset, String mandatory) {
+ String cls = classLiteral(type);
+ if (toName != null) {
+ return method + "(" + quote(name) + ", " + quote(toName) + ", " +
cls + ")";
+ }
+ if (charset != null) {
+ return method + "(" + quote(name) + ", " + cls + ", " +
quote(charset) + ")";
+ }
+ return method + "(" + quote(name) + ", " + cls + ", " +
booleanLiteral(mandatory) + ")";
+ }
+
+ private static String booleanLiteralOrFalse(String value) {
+ return "true".equalsIgnoreCase(value) ? "true" : "false";
+ }
+
+ private static String booleanLiteral(String value) {
+ return "false".equalsIgnoreCase(value) ? "false" : "true";
+ }
+
+ private String quoteOrNull(String value) {
+ return value != null ? quote(value) : "null";
+ }
+
+ /** Options whose fluent method in the Java DSL has another name than the
option. */
+ private static final Map<String, String> OPTION_RENAMES =
Map.of("errorHandlerRef", "errorHandler");
+
+ /**
+ * How an option is written when its fluent method does not take a String:
{@code name()} for a toggle (nothing when
+ * false), {@code name(10)} for a number (a duration such as {@code 2s} in
millis), {@code name(true)},
+ * {@code name(LoggingLevel.WARN)}. Null when a {@code name(String)}
method exists (the value is quoted, as a
+ * placeholder must be) or no method fits; the empty string when nothing
is to be written.
+ */
+ static String typedOption(Class<?> type, String name, String value) {
+ Method noArg = null;
+ List<Class<?>> params = new ArrayList<>();
+ for (Method m : type.getMethods()) {
+ if (!m.getName().equals(name) || m.isBridge() ||
Modifier.isStatic(m.getModifiers())) {
+ continue;
+ }
+ if (m.getParameterCount() == 0) {
+ noArg = m;
+ } else if (m.getParameterCount() == 1) {
+ params.add(m.getParameterTypes()[0]);
+ }
+ }
+ if (params.contains(String.class) || params.contains(Object.class)) {
+ return null;
+ }
+ String v = value.strip();
+ // a property placeholder can only go where a String does
+ if (v.startsWith("{{")) {
+ return null;
+ }
+ for (Class<?> p : params) {
+ if ((p == boolean.class || p == Boolean.class) &&
("true".equals(v) || "false".equals(v))) {
+ return name + "(" + v + ")";
+ }
+ if (p == int.class || p == Integer.class || p == long.class || p
== Long.class) {
+ String number = wholeNumber(v);
+ if (number != null) {
+ return name + "(" + number + ((p == long.class || p ==
Long.class) && isLongLiteral(number) ? "L" : "")
+ + ")";
+ }
+ }
+ if (p == double.class || p == Double.class || p == float.class ||
p == Float.class) {
+ try {
+ Double.parseDouble(v);
+ return name + "(" + v + (p == float.class || p ==
Float.class ? "f" : "") + ")";
+ } catch (NumberFormatException e) {
+ // not a number
+ }
+ }
+ if (p.isEnum()) {
+ for (Object c : p.getEnumConstants()) {
+ if (((Enum<?>) c).name().equalsIgnoreCase(v)) {
+ return name + "(" + p.getSimpleName() + "." +
((Enum<?>) c).name() + ")";
+ }
+ }
+ }
+ }
+ if (noArg != null && params.isEmpty()) {
+ return "true".equals(v) ? name + "()" : "";
+ }
+ // mode="BeforeConsumer" is modeBeforeConsumer()
+ if (params.isEmpty() && !v.isEmpty()) {
+ String combined = name + Character.toUpperCase(v.charAt(0)) +
v.substring(1);
+ try {
+ if (type.getMethod(combined).getParameterCount() == 0) {
+ return combined + "()";
+ }
+ } catch (NoSuchMethodException e) {
+ // not that either
+ }
+ }
+ return null;
+ }
+
+ /** A whole number, or a duration such as 2s or 1m30s in millis; null for
anything else. */
+ private static String wholeNumber(String value) {
+ try {
+ return String.valueOf(Long.parseLong(value));
+ } catch (NumberFormatException e) {
+ try {
+ return String.valueOf(TimeUtils.toMilliSeconds(value));
+ } catch (RuntimeException ex) {
+ return null;
+ }
+ }
+ }
+
+ private static boolean isLongLiteral(String number) {
+ long l = Long.parseLong(number);
+ return l > Integer.MAX_VALUE || l < Integer.MIN_VALUE;
+ }
+
private static boolean isPrimitiveLiteral(String value) {
if ("true".equals(value) || "false".equals(value)) {
return true;
@@ -596,15 +973,25 @@ public abstract class JavaDslModelWriterSupport {
protected <T> void doWriteChildElement(StringBuilder sb, String key, T
value, BiConsumer<StringBuilder, T> writer) {
if (value != null && !handledAttributes.contains(key)) {
- if (BLOCK_CHILDREN.contains(key)) {
+ if ("onFallback".equals(key)) {
+ // onFallback() takes every step after it: it is written last,
before the circuit breaker's end()
+ pendingFallback = () -> {
+ indentLevel++;
+ sb.append(NL).append(indent()).append(".onFallback()");
+ writer.accept(sb, value);
+ indentLevel--;
+ };
+ } else if (BLOCK_CHILDREN.contains(key)) {
indentLevel++;
sb.append(NL).append(indent()).append(".").append(key).append("()");
writer.accept(sb, value);
indentLevel--;
+ } else if (value instanceof StreamResequencerConfig src) {
+ writeStreamResequencerConfig(sb, src);
} else if (value instanceof ExpressionSubElementDefinition esd) {
if (esd.getExpressionType() != null) {
boolean isPredicate = PREDICATE_CHILDREN.contains(key);
- sb.append(NL).append(indent()).append("
.").append(key).append("(");
+ sb.append(NL).append(indent()).append("
.").append(CHILD_RENAMES.getOrDefault(key, key)).append("(");
if (isPredicate) {
sb.append("(Predicate) ");
}
@@ -646,6 +1033,19 @@ public abstract class JavaDslModelWriterSupport {
protected <T> void doWriteElementRef(StringBuilder sb, String key, T
value, BiConsumer<StringBuilder, T> writer) {
if (value != null && !handledAttributes.contains(key)) {
+ // a route's input and output types are options of the route:
.inputType("urn")
+ if (value instanceof InputTypeDefinition in && in.getUrn() !=
null) {
+ sb.append(NL).append(indent()).append(".inputType")
+ .append("true".equals(in.getValidate()) ?
"WithValidate" : "")
+ .append("(").append(quote(in.getUrn())).append(")");
+ return;
+ }
+ if (value instanceof OutputTypeDefinition out && out.getUrn() !=
null) {
+ sb.append(NL).append(indent()).append(".outputType")
+ .append("true".equals(out.getValidate()) ?
"WithValidate" : "")
+ .append("(").append(quote(out.getUrn())).append(")");
+ return;
+ }
writer.accept(sb, value);
}
}
@@ -666,6 +1066,11 @@ public abstract class JavaDslModelWriterSupport {
protected <T> void doWriteChildList(
StringBuilder sb, String key, List<T> list,
BiConsumer<StringBuilder, T> writer) {
if (list != null && !list.isEmpty() &&
!handledAttributes.contains(key)) {
+ if (("headers".equals(key) && optionOwner instanceof
SetHeadersDefinition
+ || "variables".equals(key) && optionOwner instanceof
SetVariablesDefinition)
+ && writeNamesAndValues(sb, key, list)) {
+ return;
+ }
if ("value".equals(key) && list.get(0) instanceof ValueDefinition)
{
writeAllowableValues(sb, list);
return;
@@ -864,13 +1269,42 @@ public abstract class JavaDslModelWriterSupport {
|| def instanceof InterceptSendToEndpointDefinition;
}
+ /**
+ * resequence().stream() with its options: capacity(int), timeout(long)
and deliveryAttemptInterval(long) in millis.
+ */
+ protected void writeStreamResequencerConfig(StringBuilder sb,
StreamResequencerConfig src) {
+ sb.append(NL).append(indent()).append(" .stream()");
+ if (src.getCapacity() != null) {
+ sb.append(NL).append(indent()).append("
.capacity(").append(src.getCapacity()).append(")");
+ }
+ if (src.getTimeout() != null) {
+ String millis = wholeNumber(src.getTimeout());
+ sb.append(NL).append(indent()).append("
.timeout(").append(millis != null ? millis : src.getTimeout())
+ .append(")");
+ }
+ if (src.getDeliveryAttemptInterval() != null) {
+ String millis = wholeNumber(src.getDeliveryAttemptInterval());
+ sb.append(NL).append(indent()).append("
.deliveryAttemptInterval(")
+ .append(millis != null ? millis :
src.getDeliveryAttemptInterval()).append(")");
+ }
+ if ("true".equals(src.getIgnoreInvalidExchanges())) {
+ sb.append(NL).append(indent()).append("
.ignoreInvalidExchanges()");
+ }
+ if ("true".equals(src.getRejectOld())) {
+ sb.append(NL).append(indent()).append(" .rejectOld()");
+ }
+ }
+
protected void writeBatchResequencerConfig(StringBuilder sb,
BatchResequencerConfig brc) {
sb.append(NL).append(indent()).append(" .batch()");
if (brc.getBatchSize() != null) {
sb.append(NL).append(indent()).append("
.size(").append(brc.getBatchSize()).append(")");
}
if (brc.getBatchTimeout() != null) {
- sb.append(NL).append(indent()).append("
.timeout(").append(brc.getBatchTimeout()).append(")");
+ // timeout(long): a duration (1s) as millis
+ String millis = wholeNumber(brc.getBatchTimeout());
+ sb.append(NL).append(indent()).append(" .timeout(")
+ .append(millis != null ? millis :
brc.getBatchTimeout()).append(")");
}
}
@@ -920,6 +1354,16 @@ public abstract class JavaDslModelWriterSupport {
first = false;
sb.append(classLiteral(ex));
}
+ } else if (failover.getExceptionTypes() != null &&
!failover.getExceptionTypes().isEmpty()) {
+ // built in Java: failover(IOException.class) keeps the classes
+ boolean first = true;
+ for (Class<?> ex : failover.getExceptionTypes()) {
+ if (!first) {
+ sb.append(", ");
+ }
+ first = false;
+ sb.append(typeName(ex)).append(".class");
+ }
}
sb.append(")");
handledAttributes.add("exception");
@@ -933,6 +1377,19 @@ public abstract class JavaDslModelWriterSupport {
sb.append(")");
handledAttributes.add("correlationExpression");
handledAttributes.add("expression");
+ } else if (lb instanceof CustomLoadBalancerDefinition custom &&
custom.getRef() != null) {
+ sb.append(".custom(").append(quote(custom.getRef())).append(")");
+ handledAttributes.add("ref");
+ } else if (lb instanceof WeightedLoadBalancerDefinition w &&
w.getDistributionRatio() != null) {
+
sb.append(".weighted(").append(booleanLiteralOrFalse(w.getRoundRobin())).append(",
")
+ .append(quote(w.getDistributionRatio()));
+ if (w.getDistributionRatioDelimiter() != null &&
!",".equals(w.getDistributionRatioDelimiter())) {
+ sb.append(",
").append(quote(w.getDistributionRatioDelimiter()));
+ }
+ sb.append(")");
+ handledAttributes.add("roundRobin");
+ handledAttributes.add("distributionRatio");
+ handledAttributes.add("distributionRatioDelimiter");
} else {
// Derive method name: strip "LoadBalancer" suffix, lowercase
first char
String className = lb.getClass().getSimpleName();
@@ -946,6 +1403,12 @@ public abstract class JavaDslModelWriterSupport {
if (expr == null) {
return "";
}
+ // a route built in Java keeps setProperty("p").constant("v") or
header("x") as a Java object wrapped in an
+ // ExpressionDefinition: the language inside it is written (the model
is not changed)
+ ExpressionDefinition language = languageOf(expr);
+ if (language != expr) {
+ return expressionDsl(language);
+ }
String value = expr.getExpression();
if (value == null) {
value = "";
@@ -965,6 +1428,26 @@ public abstract class JavaDslModelWriterSupport {
return compactExpressionDsl(expr, value);
}
+ /** The language inside a wrapped expression clause or value builder; the
expression itself when there is none. */
+ private static ExpressionDefinition languageOf(ExpressionDefinition expr) {
+ if (expr.getClass() != ExpressionDefinition.class) {
+ return expr;
+ }
+ Object v = expr.getExpressionValue() != null ?
expr.getExpressionValue() : expr.getPredicate();
+ for (int i = 0; i < 5 && v != null; i++) {
+ if (v instanceof ExpressionDefinition d) {
+ return d;
+ } else if (v instanceof ExpressionClause<?> clause) {
+ v = clause.getExpressionType() instanceof ExpressionDefinition
d ? d : clause.getExpressionValue();
+ } else if (v instanceof ValueBuilder vb) {
+ v = vb.getExpression();
+ } else {
+ break;
+ }
+ }
+ return expr;
+ }
+
private String compactExpressionDsl(ExpressionDefinition expr, String
value) {
String quotedValue = quote(value);
@@ -995,8 +1478,22 @@ public abstract class JavaDslModelWriterSupport {
if (expr instanceof DatasonnetExpression) {
return "datasonnet(" + quotedValue + ")";
}
- if (expr instanceof TokenizerExpression) {
- return "tokenize(" + quotedValue + ")";
+ if (expr instanceof TokenizerExpression t) {
+ // the token is an option, not the expression text: the language
builder keeps them all
+ StringBuilder b = new StringBuilder("expression().tokenize()");
+ appendOption(b, "token", t.getToken());
+ appendOption(b, "endToken", t.getEndToken());
+ appendOption(b, "inheritNamespaceTagName",
t.getInheritNamespaceTagName());
+ appendOption(b, "regex", t.getRegex());
+ appendOption(b, "xml", t.getXml());
+ appendOption(b, "includeTokens", t.getIncludeTokens());
+ appendOption(b, "group", t.getGroup());
+ appendOption(b, "groupDelimiter", t.getGroupDelimiter());
+ appendOption(b, "skipFirst", t.getSkipFirst());
+ if (t.getSource() != null) {
+ appendOption(b, "source", t.getSource());
+ }
+ return b.append(".end()").toString();
}
if (expr instanceof XMLTokenizerExpression) {
return "xtokenize(" + quotedValue + ")";
diff --git
a/core/camel-java-io/src/test/java/org/apache/camel/java/LwModelToJavaDumperTest.java
b/core/camel-java-io/src/test/java/org/apache/camel/java/LwModelToJavaDumperTest.java
index f040d2bd772a..6e77e7bb614a 100644
---
a/core/camel-java-io/src/test/java/org/apache/camel/java/LwModelToJavaDumperTest.java
+++
b/core/camel-java-io/src/test/java/org/apache/camel/java/LwModelToJavaDumperTest.java
@@ -16,12 +16,15 @@
*/
package org.apache.camel.java;
+import java.io.IOException;
+
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.builder.RouteConfigurationBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.model.Model;
import org.apache.camel.model.RouteConfigurationDefinition;
import org.apache.camel.model.RouteTemplateDefinition;
+import org.apache.camel.model.ThrowExceptionDefinition;
import org.apache.camel.model.rest.RestDefinition;
import org.junit.jupiter.api.Test;
@@ -73,4 +76,34 @@ public class LwModelToJavaDumperTest {
assertThat(java).contains("\"Hello\\n ${body}\"");
}
}
+
+ /**
+ * A route built in Java keeps expression clauses, classes and arrays the
XML DSL does not have: they are written as
+ * Java DSL, without changing the model (CAMEL-25157).
+ */
+ @Test
+ public void testDumpRouteBuiltInJava() throws Exception {
+ try (DefaultCamelContext context = new DefaultCamelContext()) {
+ context.addRoutes(new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:start").routeId("javaBuilt")
+ .setProperty("p").constant("v")
+ .throwException(IllegalArgumentException.class,
"Forced")
+
.loadBalance().failover(IOException.class).to("mock:x").end()
+ .removeHeaders("*", "Keep*")
+ .to("mock:result");
+ }
+ });
+ String java = new LwModelToJavaDumper().dumpModelAsJava(context,
context.getRouteDefinition("javaBuilt"));
+ assertThat(java).contains(
+ ".setProperty(\"p\", constant(\"v\"))",
+ ".throwException(IllegalArgumentException.class,
\"Forced\")",
+ ".failover(java.io.IOException.class)",
+ ".removeHeaders(\"*\", \"Keep*\")");
+ // the model was not changed
+ assertThat(((ThrowExceptionDefinition)
context.getRouteDefinition("javaBuilt").getOutputs().get(1))
+ .getExceptionType()).isNull();
+ }
+ }
}
diff --git
a/core/camel-java-io/src/test/java/org/apache/camel/java/in/RoundTripTest.java
b/core/camel-java-io/src/test/java/org/apache/camel/java/in/RoundTripTest.java
index 3d997cfe3455..e05dbad37745 100644
---
a/core/camel-java-io/src/test/java/org/apache/camel/java/in/RoundTripTest.java
+++
b/core/camel-java-io/src/test/java/org/apache/camel/java/in/RoundTripTest.java
@@ -67,12 +67,7 @@ class RoundTripTest {
* the list only shrinks.
*/
private static final Map<String, String> KNOWN = Map.of(
- "resequencerBatch.xml", "the DSL stores timeout(2000) as 2s0ms,
which the dumper writes unquoted",
- "resequencerStream.xml", "the DSL stores timeout(2000) as 2s0ms,
which the dumper writes unquoted",
- "routeWithCircuitBreaker.xml", "the dumper writes steps after
onFallback() without end(): the DSL nests them",
- "circuitBreakerResilience4j.xml", "the dumper writes steps after
onFallback() without end(): the DSL nests them",
- "routeWithSetHeaders.xml", "the dumper writes setHeaders() as
nested setHeader calls, not varargs",
- "routeWithSetVariables.xml", "the dumper writes setVariables() as
nested setVariable calls, not varargs");
+ "circuitBreakerResilience4j.xml", "failureRateThreshold(float)
keeps 30 as 30.0: the same value, written apart");
static String dump(RouteDefinition route) {
try (DefaultCamelContext context = new DefaultCamelContext()) {
@@ -239,9 +234,10 @@ class RoundTripTest {
}
String report = String.format("%d of %d routes read back (%d the
dumper could not write)%n%s%n%n%s", same, routes,
dumpFailed, reasons, String.join("\n\n", examples));
- System.out.println(report);
+ Files.writeString(Path.of("target/spring-xml-corpus-report.txt"),
report);
assertThat(routes).isGreaterThan(500);
- // most of the rest is Java the dumper writes that is not Java DSL
(CAMEL-25157); raise the floor as it improves
- assertThat(same).as(report).isGreaterThanOrEqualTo(674);
+ // the rest has no Java DSL form (throwException with a ref, options
of marshal and unmarshal, a logger ref)
+ // or is written apart from what XML holds; raise the floor as it
improves
+ assertThat(same).as(report).isGreaterThanOrEqualTo(815);
}
}
diff --git
a/core/camel-java-io/src/test/resources/stepArgumentsAndTypedOptions.xml
b/core/camel-java-io/src/test/resources/stepArgumentsAndTypedOptions.xml
new file mode 100644
index 000000000000..3957973da0d3
--- /dev/null
+++ b/core/camel-java-io/src/test/resources/stepArgumentsAndTypedOptions.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ 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.
+
+-->
+<!-- Options the Java DSL takes as arguments of the step, or in another form
than name("value") (CAMEL-25157) -->
+<routes xmlns="http://camel.apache.org/schema/xml-io">
+ <route id="options" startupOrder="5" errorHandlerRef="myErrorHandler">
+ <from uri="direct:options"/>
+ <inputType urn="json:Order"/>
+ <convertBodyTo type="java.lang.String" charset="UTF-8"/>
+ <convertBodyTo type="java.lang.Integer" mandatory="false"/>
+ <convertHeaderTo name="a" toName="b" type="java.lang.String"/>
+ <removeHeaders pattern="Beer*" excludePattern="BeerKeep"/>
+ <removeProperties pattern="f*" excludePattern="fiu"/>
+ <setHeaders>
+ <setHeader name="h1"><simple>${body}</simple></setHeader>
+ <setHeader name="h2"><constant>two</constant></setHeader>
+ </setHeaders>
+ <setVariables>
+ <setVariable name="v1"><constant>one</constant></setVariable>
+ </setVariables>
+ <to uri="direct:send" variableSend="v1"/>
+ <toD uri="mock:${header.foo}" ignoreInvalidEndpoint="true"/>
+ <log message="hi" logName="my.log" loggingLevel="WARN"/>
+ <sample messageFrequency="10"/>
+ <recipientList stopOnException="true"
ignoreInvalidEndpoints="true"><header>to</header></recipientList>
+ <to uri="mock:end"/>
+ </route>
+ <route id="blocks">
+ <from uri="direct:blocks"/>
+ <onCompletion mode="BeforeConsumer">
+ <to uri="mock:done"/>
+ </onCompletion>
+ <loop doWhile="true">
+ <simple>${body} != 'done'</simple>
+ <to uri="mock:loop"/>
+ </loop>
+ <aggregate aggregationStrategy="myStrategy">
+ <correlationExpression><header>id</header></correlationExpression>
+
<completionSizeExpression><header>size</header></completionSizeExpression>
+ <to uri="mock:aggregated"/>
+ </aggregate>
+ <enrich
aggregationStrategy="myStrategy"><constant>direct:resource</constant></enrich>
+ <split>
+ <tokenize token=","/>
+ <to uri="mock:part"/>
+ </split>
+ <loadBalance>
+ <weightedLoadBalancer distributionRatio="4,2,1"/>
+ <to uri="mock:x"/>
+ <to uri="mock:y"/>
+ <to uri="mock:z"/>
+ </loadBalance>
+ <policy ref="myPolicy">
+ <to uri="mock:policy"/>
+ </policy>
+ <to uri="mock:after"/>
+ </route>
+ <route id="rollback">
+ <from uri="direct:rollback"/>
+ <rollback markRollbackOnly="true"/>
+ </route>
+</routes>
diff --git
a/tooling/maven/camel-package-maven-plugin/src/main/resources/velocity/model-java-dsl-writer.vm
b/tooling/maven/camel-package-maven-plugin/src/main/resources/velocity/model-java-dsl-writer.vm
index 8d389c26aabb..12dc6184d1c6 100644
---
a/tooling/maven/camel-package-maven-plugin/src/main/resources/velocity/model-java-dsl-writer.vm
+++
b/tooling/maven/camel-package-maven-plugin/src/main/resources/velocity/model-java-dsl-writer.vm
@@ -308,6 +308,7 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
case "${t}" -> {
${t} _d = (${t}) v;
handledAttributes.clear();
+ beginInlineStep(sb, _d);
sb.append("\n").append(indent()).append(".${n}(");
boolean _first = true;
#foreach( $arg in $primaryArgs )