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 37acd0d360dc CAMEL-25721: camel-xml-io, camel-yaml-io, camel-java-io -
route dumps keep options set to their default value (#28029)
37acd0d360dc is described below
commit 37acd0d360dc560b50469329f3db70390e529779
Author: allthingssecurity <[email protected]>
AuthorDate: Mon Oct 19 00:35:16 2026 +0530
CAMEL-25721: camel-xml-io, camel-yaml-io, camel-java-io - route dumps keep
options set to their default value (#28029)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---
core/camel-java-io/pom.xml | 11 ++
.../apache/camel/java/out/JavaDslModelWriter.java | 138 +++++++-------
.../java/JavaDumpExplicitDefaultValuesTest.java | 161 ++++++++++++++++
.../apache/camel/java/LwModelToJavaDumperTest.java | 27 +++
.../java/org/apache/camel/xml/out/ModelWriter.java | 138 +++++++-------
.../org/apache/camel/yaml/out/YamlModelWriter.java | 138 +++++++-------
.../ROOT/pages/camel-4x-upgrade-guide-4_24.adoc | 10 +
.../xml/io/XmlDumpExplicitDefaultValuesTest.java | 181 ++++++++++++++++++
.../yaml/YamlDumpExplicitDefaultValuesTest.java | 209 +++++++++++++++++++++
.../maven/packaging/ModelWriterGeneratorMojo.java | 48 +++++
10 files changed, 854 insertions(+), 207 deletions(-)
diff --git a/core/camel-java-io/pom.xml b/core/camel-java-io/pom.xml
index e3d6475c5593..cca24faebf14 100644
--- a/core/camel-java-io/pom.xml
+++ b/core/camel-java-io/pom.xml
@@ -49,6 +49,17 @@
<artifactId>camel-xml-io</artifactId>
<scope>test</scope>
</dependency>
+ <!-- to run a route dump once compiled and loaded again -->
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-core-languages</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-direct</artifactId>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
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 1df84eea2a3b..8ad31bfe061b 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
@@ -1958,15 +1958,15 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
protected void
doWriteFaultToleranceConfigurationCommonAttributes(StringBuilder sb,
FaultToleranceConfigurationCommon def) {
doWriteIdentifiedTypeAttributes(sb, def);
doWriteAttribute(sb, "typedGuard", def.getTypedGuard(), null);
- doWriteAttribute(sb, "delay", def.getDelay(), "5000");
- doWriteAttribute(sb, "successThreshold", def.getSuccessThreshold(),
"1");
- doWriteAttribute(sb, "requestVolumeThreshold",
def.getRequestVolumeThreshold(), "20");
- doWriteAttribute(sb, "failureRatio", def.getFailureRatio(), "50");
- doWriteAttribute(sb, "timeoutEnabled", def.getTimeoutEnabled(),
"false");
- doWriteAttribute(sb, "timeoutDuration", def.getTimeoutDuration(),
"1000");
- doWriteAttribute(sb, "bulkheadEnabled", def.getBulkheadEnabled(),
"false");
- doWriteAttribute(sb, "bulkheadMaxConcurrentCalls",
def.getBulkheadMaxConcurrentCalls(), "10");
- doWriteAttribute(sb, "bulkheadWaitingTaskQueue",
def.getBulkheadWaitingTaskQueue(), "10");
+ doWriteAttribute(sb, "delay", def.getDelay(), null);
+ doWriteAttribute(sb, "successThreshold", def.getSuccessThreshold(),
null);
+ doWriteAttribute(sb, "requestVolumeThreshold",
def.getRequestVolumeThreshold(), null);
+ doWriteAttribute(sb, "failureRatio", def.getFailureRatio(), null);
+ doWriteAttribute(sb, "timeoutEnabled", def.getTimeoutEnabled(), null);
+ doWriteAttribute(sb, "timeoutDuration", def.getTimeoutDuration(),
null);
+ doWriteAttribute(sb, "bulkheadEnabled", def.getBulkheadEnabled(),
null);
+ doWriteAttribute(sb, "bulkheadMaxConcurrentCalls",
def.getBulkheadMaxConcurrentCalls(), null);
+ doWriteAttribute(sb, "bulkheadWaitingTaskQueue",
def.getBulkheadWaitingTaskQueue(), null);
doWriteAttribute(sb, "threadOffloadExecutorService",
def.getThreadOffloadExecutorService(), null);
}
protected void doWriteFaultToleranceConfigurationCommon(StringBuilder sb,
FaultToleranceConfigurationCommon def) {
@@ -2307,28 +2307,28 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
protected void doWriteRedeliveryPolicyDefinition(StringBuilder sb,
RedeliveryPolicyDefinition def) {
doWriteIdentifiedTypeAttributes(sb, def);
doWriteAttribute(sb, "maximumRedeliveries",
def.getMaximumRedeliveries(), null);
- doWriteAttribute(sb, "redeliveryDelay", def.getRedeliveryDelay(),
"1000");
+ doWriteAttribute(sb, "redeliveryDelay", def.getRedeliveryDelay(),
null);
doWriteAttribute(sb, "asyncDelayedRedelivery",
def.getAsyncDelayedRedelivery(), null);
- doWriteAttribute(sb, "backOffMultiplier", def.getBackOffMultiplier(),
"2.0");
+ doWriteAttribute(sb, "backOffMultiplier", def.getBackOffMultiplier(),
null);
doWriteAttribute(sb, "useExponentialBackOff",
def.getUseExponentialBackOff(), null);
- doWriteAttribute(sb, "collisionAvoidanceFactor",
def.getCollisionAvoidanceFactor(), "0.15");
+ doWriteAttribute(sb, "collisionAvoidanceFactor",
def.getCollisionAvoidanceFactor(), null);
doWriteAttribute(sb, "useCollisionAvoidance",
def.getUseCollisionAvoidance(), null);
- doWriteAttribute(sb, "maximumRedeliveryDelay",
def.getMaximumRedeliveryDelay(), "60000");
- doWriteAttribute(sb, "retriesExhaustedLogLevel",
def.getRetriesExhaustedLogLevel(), "ERROR");
- doWriteAttribute(sb, "retryAttemptedLogLevel",
def.getRetryAttemptedLogLevel(), "DEBUG");
- doWriteAttribute(sb, "retryAttemptedLogInterval",
def.getRetryAttemptedLogInterval(), "1");
- doWriteAttribute(sb, "logRetryAttempted", def.getLogRetryAttempted(),
"true");
- doWriteAttribute(sb, "logStackTrace", def.getLogStackTrace(), "true");
+ doWriteAttribute(sb, "maximumRedeliveryDelay",
def.getMaximumRedeliveryDelay(), null);
+ doWriteAttribute(sb, "retriesExhaustedLogLevel",
def.getRetriesExhaustedLogLevel(), null);
+ doWriteAttribute(sb, "retryAttemptedLogLevel",
def.getRetryAttemptedLogLevel(), null);
+ doWriteAttribute(sb, "retryAttemptedLogInterval",
def.getRetryAttemptedLogInterval(), null);
+ doWriteAttribute(sb, "logRetryAttempted", def.getLogRetryAttempted(),
null);
+ doWriteAttribute(sb, "logStackTrace", def.getLogStackTrace(), null);
doWriteAttribute(sb, "logRetryStackTrace",
def.getLogRetryStackTrace(), null);
doWriteAttribute(sb, "logHandled", def.getLogHandled(), null);
- doWriteAttribute(sb, "logNewException", def.getLogNewException(),
"true");
+ doWriteAttribute(sb, "logNewException", def.getLogNewException(),
null);
doWriteAttribute(sb, "logContinued", def.getLogContinued(), null);
- doWriteAttribute(sb, "logExhausted", def.getLogExhausted(), "true");
+ doWriteAttribute(sb, "logExhausted", def.getLogExhausted(), null);
doWriteAttribute(sb, "logExhaustedMessageHistory",
def.getLogExhaustedMessageHistory(), null);
doWriteAttribute(sb, "logExhaustedMessageBody",
def.getLogExhaustedMessageBody(), null);
doWriteAttribute(sb, "disableRedelivery", def.getDisableRedelivery(),
null);
doWriteAttribute(sb, "delayPattern", def.getDelayPattern(), null);
- doWriteAttribute(sb, "allowRedeliveryWhileStopping",
def.getAllowRedeliveryWhileStopping(), "true");
+ doWriteAttribute(sb, "allowRedeliveryWhileStopping",
def.getAllowRedeliveryWhileStopping(), null);
doWriteAttribute(sb, "exchangeFormatterRef",
def.getExchangeFormatterRef(), null);
}
protected void doWriteRemoveHeaderDefinition(StringBuilder sb,
RemoveHeaderDefinition def) {
@@ -2368,29 +2368,29 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
doWriteIdentifiedTypeAttributes(sb, def);
doWriteAttribute(sb, "circuitBreaker", def.getCircuitBreaker(), null);
doWriteAttribute(sb, "config", def.getConfig(), null);
- doWriteAttribute(sb, "failureRateThreshold",
def.getFailureRateThreshold(), "50");
- doWriteAttribute(sb, "permittedNumberOfCallsInHalfOpenState",
def.getPermittedNumberOfCallsInHalfOpenState(), "10");
- doWriteAttribute(sb, "throwExceptionWhenHalfOpenOrOpenState",
def.getThrowExceptionWhenHalfOpenOrOpenState(), "false");
- doWriteAttribute(sb, "slidingWindowSize", def.getSlidingWindowSize(),
"100");
- doWriteAttribute(sb, "slidingWindowType", def.getSlidingWindowType(),
"COUNT_BASED");
- doWriteAttribute(sb, "slidingWindowSynchronizationStrategy",
def.getSlidingWindowSynchronizationStrategy(), "SYNCHRONIZED");
- doWriteAttribute(sb, "minimumNumberOfCalls",
def.getMinimumNumberOfCalls(), "100");
- doWriteAttribute(sb, "writableStackTraceEnabled",
def.getWritableStackTraceEnabled(), "true");
- doWriteAttribute(sb, "waitDurationInOpenState",
def.getWaitDurationInOpenState(), "60000");
- doWriteAttribute(sb, "automaticTransitionFromOpenToHalfOpenEnabled",
def.getAutomaticTransitionFromOpenToHalfOpenEnabled(), "false");
- doWriteAttribute(sb, "maxWaitDurationInHalfOpenState",
def.getMaxWaitDurationInHalfOpenState(), "0");
- doWriteAttribute(sb, "slowCallRateThreshold",
def.getSlowCallRateThreshold(), "100");
- doWriteAttribute(sb, "slowCallDurationThreshold",
def.getSlowCallDurationThreshold(), "60000");
- doWriteAttribute(sb, "bulkheadEnabled", def.getBulkheadEnabled(),
"false");
- doWriteAttribute(sb, "bulkheadMaxConcurrentCalls",
def.getBulkheadMaxConcurrentCalls(), "25");
- doWriteAttribute(sb, "bulkheadMaxWaitDuration",
def.getBulkheadMaxWaitDuration(), "0");
- doWriteAttribute(sb, "bulkheadFairCallHandlingEnabled",
def.getBulkheadFairCallHandlingEnabled(), "true");
- doWriteAttribute(sb, "asynchronous", def.getAsynchronous(), "false");
- doWriteAttribute(sb, "timeoutEnabled", def.getTimeoutEnabled(),
"false");
+ doWriteAttribute(sb, "failureRateThreshold",
def.getFailureRateThreshold(), null);
+ doWriteAttribute(sb, "permittedNumberOfCallsInHalfOpenState",
def.getPermittedNumberOfCallsInHalfOpenState(), null);
+ doWriteAttribute(sb, "throwExceptionWhenHalfOpenOrOpenState",
def.getThrowExceptionWhenHalfOpenOrOpenState(), null);
+ doWriteAttribute(sb, "slidingWindowSize", def.getSlidingWindowSize(),
null);
+ doWriteAttribute(sb, "slidingWindowType", def.getSlidingWindowType(),
null);
+ doWriteAttribute(sb, "slidingWindowSynchronizationStrategy",
def.getSlidingWindowSynchronizationStrategy(), null);
+ doWriteAttribute(sb, "minimumNumberOfCalls",
def.getMinimumNumberOfCalls(), null);
+ doWriteAttribute(sb, "writableStackTraceEnabled",
def.getWritableStackTraceEnabled(), null);
+ doWriteAttribute(sb, "waitDurationInOpenState",
def.getWaitDurationInOpenState(), null);
+ doWriteAttribute(sb, "automaticTransitionFromOpenToHalfOpenEnabled",
def.getAutomaticTransitionFromOpenToHalfOpenEnabled(), null);
+ doWriteAttribute(sb, "maxWaitDurationInHalfOpenState",
def.getMaxWaitDurationInHalfOpenState(), null);
+ doWriteAttribute(sb, "slowCallRateThreshold",
def.getSlowCallRateThreshold(), null);
+ doWriteAttribute(sb, "slowCallDurationThreshold",
def.getSlowCallDurationThreshold(), null);
+ doWriteAttribute(sb, "bulkheadEnabled", def.getBulkheadEnabled(),
null);
+ doWriteAttribute(sb, "bulkheadMaxConcurrentCalls",
def.getBulkheadMaxConcurrentCalls(), null);
+ doWriteAttribute(sb, "bulkheadMaxWaitDuration",
def.getBulkheadMaxWaitDuration(), null);
+ doWriteAttribute(sb, "bulkheadFairCallHandlingEnabled",
def.getBulkheadFairCallHandlingEnabled(), null);
+ doWriteAttribute(sb, "asynchronous", def.getAsynchronous(), null);
+ doWriteAttribute(sb, "timeoutEnabled", def.getTimeoutEnabled(), null);
doWriteAttribute(sb, "timeoutExecutorService",
def.getTimeoutExecutorService(), null);
- doWriteAttribute(sb, "timeoutDuration", def.getTimeoutDuration(),
"1000");
- doWriteAttribute(sb, "timeoutCancelRunningFuture",
def.getTimeoutCancelRunningFuture(), "true");
- doWriteAttribute(sb, "micrometerEnabled", def.getMicrometerEnabled(),
"false");
+ doWriteAttribute(sb, "timeoutDuration", def.getTimeoutDuration(),
null);
+ doWriteAttribute(sb, "timeoutCancelRunningFuture",
def.getTimeoutCancelRunningFuture(), null);
+ doWriteAttribute(sb, "micrometerEnabled", def.getMicrometerEnabled(),
null);
}
protected void
doWriteResilience4jConfigurationCommonElements(StringBuilder sb,
Resilience4jConfigurationCommon def) {
doWriteStringList(sb, null, "ignoreException",
def.getIgnoreExceptions());
@@ -2457,8 +2457,8 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
doWriteAttribute(sb, "delayer", def.getDelayer(), null);
doWriteAttribute(sb, "errorHandlerRef", def.getErrorHandlerRef(),
null);
doWriteAttribute(sb, "routePolicyRef", def.getRoutePolicyRef(), null);
- doWriteAttribute(sb, "shutdownRoute", def.getShutdownRoute(),
"Default");
- doWriteAttribute(sb, "shutdownRunningTask",
def.getShutdownRunningTask(), "CompleteCurrentTaskOnly");
+ doWriteAttribute(sb, "shutdownRoute", def.getShutdownRoute(), null);
+ doWriteAttribute(sb, "shutdownRunningTask",
def.getShutdownRunningTask(), null);
doWriteAttribute(sb, "precondition", def.getPrecondition(), null);
doWriteChildList(sb, "routeProperty", def.getRouteProperties(),
this::doWritePropertyDefinition);
doWriteChildElement(sb, "errorHandler", def.getErrorHandler(),
this::doWriteErrorHandlerDefinition);
@@ -3825,14 +3825,14 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
doWriteOptionalIdentifiedDefinitionAttributes(sb, def);
doWriteAttribute(sb, "consumes", def.getConsumes(), null);
doWriteAttribute(sb, "produces", def.getProduces(), null);
- doWriteAttribute(sb, "bindingMode", def.getBindingMode(), "off");
+ doWriteAttribute(sb, "bindingMode", def.getBindingMode(), null);
doWriteAttribute(sb, "type", def.getType(), null);
doWriteAttribute(sb, "outType", def.getOutType(), null);
- doWriteAttribute(sb, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), "false");
- doWriteAttribute(sb, "clientRequestValidation",
def.getClientRequestValidation(), "false");
- doWriteAttribute(sb, "clientResponseValidation",
def.getClientResponseValidation(), "false");
- doWriteAttribute(sb, "enableCORS", def.getEnableCORS(), "false");
- doWriteAttribute(sb, "enableNoContentResponse",
def.getEnableNoContentResponse(), "false");
+ doWriteAttribute(sb, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), null);
+ doWriteAttribute(sb, "clientRequestValidation",
def.getClientRequestValidation(), null);
+ doWriteAttribute(sb, "clientResponseValidation",
def.getClientResponseValidation(), null);
+ doWriteAttribute(sb, "enableCORS", def.getEnableCORS(), null);
+ doWriteAttribute(sb, "enableNoContentResponse",
def.getEnableNoContentResponse(), null);
doWriteAttribute(sb, "component", def.getComponent(), null);
}
protected void doWriteRestConfigurationDefinition(StringBuilder sb,
RestConfigurationDefinition def) {
@@ -3850,13 +3850,13 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
doWriteAttribute(sb, "apiContextRouteId", def.getApiContextRouteId(),
null);
doWriteAttribute(sb, "apiVendorExtension",
def.getApiVendorExtension(), "false");
doWriteAttribute(sb, "hostNameResolver",
toString(def.getHostNameResolver()), "allLocalIp");
- doWriteAttribute(sb, "bindingMode", toString(def.getBindingMode()),
"off");
+ doWriteAttribute(sb, "bindingMode", toString(def.getBindingMode()),
null);
doWriteAttribute(sb, "bindingPackageScan",
def.getBindingPackageScan(), null);
- doWriteAttribute(sb, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), "false");
- doWriteAttribute(sb, "clientRequestValidation",
def.getClientRequestValidation(), "false");
- doWriteAttribute(sb, "clientResponseValidation",
def.getClientResponseValidation(), "false");
- doWriteAttribute(sb, "enableCORS", def.getEnableCORS(), "false");
- doWriteAttribute(sb, "enableNoContentResponse",
def.getEnableNoContentResponse(), "false");
+ doWriteAttribute(sb, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), null);
+ doWriteAttribute(sb, "clientRequestValidation",
def.getClientRequestValidation(), null);
+ doWriteAttribute(sb, "clientResponseValidation",
def.getClientResponseValidation(), null);
+ doWriteAttribute(sb, "enableCORS", def.getEnableCORS(), null);
+ doWriteAttribute(sb, "enableNoContentResponse",
def.getEnableNoContentResponse(), null);
doWriteAttribute(sb, "inlineRoutes", def.getInlineRoutes(), "true");
doWriteAttribute(sb, "jsonDataFormat", def.getJsonDataFormat(),
"jackson");
doWriteAttribute(sb, "xmlDataFormat", def.getXmlDataFormat(), "jaxb");
@@ -3874,12 +3874,12 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
doWriteAttribute(sb, "path", def.getPath(), null);
doWriteAttribute(sb, "consumes", def.getConsumes(), null);
doWriteAttribute(sb, "produces", def.getProduces(), null);
- doWriteAttribute(sb, "bindingMode", def.getBindingMode(), "off");
- doWriteAttribute(sb, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), "false");
- doWriteAttribute(sb, "clientRequestValidation",
def.getClientRequestValidation(), "false");
- doWriteAttribute(sb, "clientResponseValidation",
def.getClientResponseValidation(), "false");
- doWriteAttribute(sb, "enableCORS", def.getEnableCORS(), "false");
- doWriteAttribute(sb, "enableNoContentResponse",
def.getEnableNoContentResponse(), "false");
+ doWriteAttribute(sb, "bindingMode", def.getBindingMode(), null);
+ doWriteAttribute(sb, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), null);
+ doWriteAttribute(sb, "clientRequestValidation",
def.getClientRequestValidation(), null);
+ doWriteAttribute(sb, "clientResponseValidation",
def.getClientResponseValidation(), null);
+ doWriteAttribute(sb, "enableCORS", def.getEnableCORS(), null);
+ doWriteAttribute(sb, "enableNoContentResponse",
def.getEnableNoContentResponse(), null);
doWriteAttribute(sb, "apiDocs", def.getApiDocs(), "true");
doWriteAttribute(sb, "tag", def.getTag(), null);
doWriteChildList(sb, "verbs", def.getVerbs(),
this::doWriteVerbDefinitionRef);
@@ -3922,19 +3922,19 @@ public class JavaDslModelWriter extends
JavaDslModelWriterSupport {
}
protected void doWriteVerbDefinitionAttributes(StringBuilder sb,
VerbDefinition def) {
doWriteOptionalIdentifiedDefinitionAttributes(sb, def);
- doWriteAttribute(sb, "enableCORS", def.getEnableCORS(), "false");
+ doWriteAttribute(sb, "enableCORS", def.getEnableCORS(), null);
doWriteAttribute(sb, "deprecated", def.getDeprecated(), "false");
doWriteAttribute(sb, "streamCache", def.getStreamCache(), null);
doWriteAttribute(sb, "type", def.getType(), null);
doWriteAttribute(sb, "outType", def.getOutType(), null);
- doWriteAttribute(sb, "clientResponseValidation",
def.getClientResponseValidation(), "false");
+ doWriteAttribute(sb, "clientResponseValidation",
def.getClientResponseValidation(), null);
doWriteAttribute(sb, "path", def.getPath(), null);
doWriteAttribute(sb, "routeId", def.getRouteId(), null);
- doWriteAttribute(sb, "bindingMode", def.getBindingMode(), "off");
+ doWriteAttribute(sb, "bindingMode", def.getBindingMode(), null);
doWriteAttribute(sb, "apiDocs", def.getApiDocs(), "true");
- doWriteAttribute(sb, "enableNoContentResponse",
def.getEnableNoContentResponse(), "false");
- doWriteAttribute(sb, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), "false");
- doWriteAttribute(sb, "clientRequestValidation",
def.getClientRequestValidation(), "false");
+ doWriteAttribute(sb, "enableNoContentResponse",
def.getEnableNoContentResponse(), null);
+ doWriteAttribute(sb, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), null);
+ doWriteAttribute(sb, "clientRequestValidation",
def.getClientRequestValidation(), null);
doWriteAttribute(sb, "produces", def.getProduces(), null);
doWriteAttribute(sb, "disabled", def.getDisabled(), null);
doWriteAttribute(sb, "consumes", def.getConsumes(), null);
diff --git
a/core/camel-java-io/src/test/java/org/apache/camel/java/JavaDumpExplicitDefaultValuesTest.java
b/core/camel-java-io/src/test/java/org/apache/camel/java/JavaDumpExplicitDefaultValuesTest.java
new file mode 100644
index 000000000000..63bd7ccecf44
--- /dev/null
+++
b/core/camel-java-io/src/test/java/org/apache/camel/java/JavaDumpExplicitDefaultValuesTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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.java;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import javax.tools.DiagnosticCollector;
+import javax.tools.FileObject;
+import javax.tools.ForwardingJavaFileManager;
+import javax.tools.JavaCompiler;
+import javax.tools.JavaFileManager;
+import javax.tools.JavaFileObject;
+import javax.tools.SimpleJavaFileObject;
+import javax.tools.ToolProvider;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * A route that sets an option to its documented default value, where "not
set" means "the value of a parent level",
+ * runs the same once its Java dump is compiled and loaded again.
+ */
+public class JavaDumpExplicitDefaultValuesTest {
+
+ private static final String CLASS_NAME = "test.generated.DumpedRoutes";
+
+ @Test
+ public void onExceptionRedeliveryDelayUnderErrorHandler() throws Exception
{
+ // the onException redelivers after 1000 ms (the documented default),
the error handler after 30 s: an option of
+ // the onException that is not set takes the value of the error handler
+ RouteBuilder routes = new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:start").routeId("redelivery")
+
.onException(IllegalStateException.class).maximumRedeliveries(1).redeliveryDelay(1000)
+ .handled(true).setBody(constant("handled")).end()
+ .throwException(IllegalStateException.class, "Forced");
+ }
+ };
+
+ assertThat(run(routes)).isEqualTo("handled");
+
+ String dumped;
+ try (DefaultCamelContext context = createContext()) {
+ context.addRoutes(routes);
+ dumped = new LwModelToJavaDumper().dumpModelAsJava(context,
context.getRouteDefinition("redelivery"));
+ }
+ assertThat(run(load(dumped))).as(dumped).isEqualTo("handled");
+ }
+
+ private static DefaultCamelContext createContext() {
+ DefaultCamelContext context = new DefaultCamelContext();
+ context.getCamelContextExtension().setErrorHandlerFactory(
+ new
DefaultErrorHandlerDefinition().maximumRedeliveries(3).redeliveryDelay(30000));
+ context.getShutdownStrategy().setTimeout(1);
+ return context;
+ }
+
+ private static String run(RoutesBuilder routes) throws Exception {
+ try (DefaultCamelContext context = createContext()) {
+ context.addRoutes(routes);
+ context.start();
+ return call(context);
+ }
+ }
+
+ private static String call(CamelContext context) {
+ try {
+ return
context.createProducerTemplate().asyncRequestBody("direct:start", "x",
String.class)
+ .get(10, TimeUnit.SECONDS);
+ } catch (TimeoutException e) {
+ return "not redelivered within 10 seconds";
+ } catch (Exception e) {
+ return e.toString();
+ }
+ }
+
+ /** Compiles the dump in a RouteBuilder and creates an instance of it. */
+ private static RoutesBuilder load(String dump) throws Exception {
+ String source = "package test.generated;\n\n"
+ + "import org.apache.camel.ExchangePattern;\n"
+ + "import org.apache.camel.LoggingLevel;\n"
+ + "import org.apache.camel.Predicate;\n"
+ + "import org.apache.camel.builder.RouteBuilder;\n\n"
+ + "public class DumpedRoutes extends RouteBuilder {\n"
+ + " @Override\n"
+ + " public void configure() throws Exception {\n"
+ + dump + "\n"
+ + " }\n"
+ + "}\n";
+
+ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+ assertThat(compiler).as("a JDK is needed to compile the
dump").isNotNull();
+ DiagnosticCollector<JavaFileObject> diagnostics = new
DiagnosticCollector<>();
+ Map<String, ByteArrayOutputStream> classes = new HashMap<>();
+ JavaFileManager fileManager
+ = new
ForwardingJavaFileManager<>(compiler.getStandardFileManager(diagnostics, null,
null)) {
+ @Override
+ public JavaFileObject getJavaFileForOutput(
+ Location location, String name,
JavaFileObject.Kind kind, FileObject sibling) {
+ return new SimpleJavaFileObject(URI.create("mem:///" +
name.replace('.', '/') + kind.extension), kind) {
+ @Override
+ public OutputStream openOutputStream() {
+ return classes.computeIfAbsent(name, n -> new
ByteArrayOutputStream());
+ }
+ };
+ }
+ };
+ JavaFileObject file = new SimpleJavaFileObject(
+ URI.create("string:///" + CLASS_NAME.replace('.', '/') +
JavaFileObject.Kind.SOURCE.extension),
+ JavaFileObject.Kind.SOURCE) {
+ @Override
+ public CharSequence getCharContent(boolean ignoreEncodingErrors) {
+ return source;
+ }
+ };
+ boolean compiled = compiler.getTask(null, fileManager, diagnostics,
+ List.of("-proc:none", "-classpath",
System.getProperty("java.class.path")), null, List.of(file)).call();
+ assertThat(compiled).as(diagnostics.getDiagnostics() + "\n" +
source).isTrue();
+
+ ClassLoader loader = new
ClassLoader(JavaDumpExplicitDefaultValuesTest.class.getClassLoader()) {
+ @Override
+ protected Class<?> findClass(String name) throws
ClassNotFoundException {
+ ByteArrayOutputStream bytes = classes.get(name);
+ if (bytes == null) {
+ throw new ClassNotFoundException(name);
+ }
+ byte[] b = bytes.toByteArray();
+ return defineClass(name, b, 0, b.length);
+ }
+ };
+ return (RoutesBuilder)
loader.loadClass(CLASS_NAME).getDeclaredConstructor().newInstance();
+ }
+}
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 6e77e7bb614a..ae4d9a667fa2 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
@@ -25,6 +25,7 @@ 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.RestBindingMode;
import org.apache.camel.model.rest.RestDefinition;
import org.junit.jupiter.api.Test;
@@ -106,4 +107,30 @@ public class LwModelToJavaDumperTest {
.getExceptionType()).isNull();
}
}
+
+ /**
+ * An option set to its documented default value is written: when it is
not set, the option takes the value of a
+ * parent level (the rest configuration for a verb, the error handler for
the redelivery of an onException).
+ */
+ @Test
+ public void testDumpOptionsSetToTheirDefaultValue() throws Exception {
+ try (DefaultCamelContext context = new DefaultCamelContext()) {
+ context.addRoutes(new RouteBuilder() {
+ @Override
+ public void configure() {
+
rest("/api").get("/raw").bindingMode(RestBindingMode.off).to("direct:raw");
+
+ from("direct:start").routeId("redelivery")
+
.onException(IllegalStateException.class).maximumRedeliveries(1).redeliveryDelay(1000).end()
+ .to("mock:result");
+ }
+ });
+ Model model =
context.getCamelContextExtension().getContextPlugin(Model.class);
+ LwModelToJavaDumper dumper = new LwModelToJavaDumper();
+
+ assertThat(dumper.dumpModelAsJava(context,
model.getRestDefinitions().get(0))).contains(".bindingMode(\"off\")");
+ assertThat(dumper.dumpModelAsJava(context,
context.getRouteDefinition("redelivery")))
+ .contains(".redeliveryDelay(\"1000\")");
+ }
+ }
}
diff --git
a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
index 824c2a597808..d53218b156d7 100644
---
a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
+++
b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
@@ -1035,15 +1035,15 @@ public class ModelWriter extends BaseWriter {
protected void
doWriteFaultToleranceConfigurationCommonAttributes(FaultToleranceConfigurationCommon
def) throws IOException {
doWriteIdentifiedTypeAttributes(def);
doWriteAttribute("typedGuard", def.getTypedGuard(), null);
- doWriteAttribute("delay", def.getDelay(), "5000");
- doWriteAttribute("successThreshold", def.getSuccessThreshold(), "1");
- doWriteAttribute("requestVolumeThreshold",
def.getRequestVolumeThreshold(), "20");
- doWriteAttribute("failureRatio", def.getFailureRatio(), "50");
- doWriteAttribute("timeoutEnabled", def.getTimeoutEnabled(), "false");
- doWriteAttribute("timeoutDuration", def.getTimeoutDuration(), "1000");
- doWriteAttribute("bulkheadEnabled", def.getBulkheadEnabled(), "false");
- doWriteAttribute("bulkheadMaxConcurrentCalls",
def.getBulkheadMaxConcurrentCalls(), "10");
- doWriteAttribute("bulkheadWaitingTaskQueue",
def.getBulkheadWaitingTaskQueue(), "10");
+ doWriteAttribute("delay", def.getDelay(), null);
+ doWriteAttribute("successThreshold", def.getSuccessThreshold(), null);
+ doWriteAttribute("requestVolumeThreshold",
def.getRequestVolumeThreshold(), null);
+ doWriteAttribute("failureRatio", def.getFailureRatio(), null);
+ doWriteAttribute("timeoutEnabled", def.getTimeoutEnabled(), null);
+ doWriteAttribute("timeoutDuration", def.getTimeoutDuration(), null);
+ doWriteAttribute("bulkheadEnabled", def.getBulkheadEnabled(), null);
+ doWriteAttribute("bulkheadMaxConcurrentCalls",
def.getBulkheadMaxConcurrentCalls(), null);
+ doWriteAttribute("bulkheadWaitingTaskQueue",
def.getBulkheadWaitingTaskQueue(), null);
doWriteAttribute("threadOffloadExecutorService",
def.getThreadOffloadExecutorService(), null);
}
protected void doWriteFaultToleranceConfigurationCommon(String name,
FaultToleranceConfigurationCommon def) throws IOException {
@@ -1467,28 +1467,28 @@ public class ModelWriter extends BaseWriter {
startElement(name);
doWriteIdentifiedTypeAttributes(def);
doWriteAttribute("maximumRedeliveries", def.getMaximumRedeliveries(),
null);
- doWriteAttribute("redeliveryDelay", def.getRedeliveryDelay(), "1000");
+ doWriteAttribute("redeliveryDelay", def.getRedeliveryDelay(), null);
doWriteAttribute("asyncDelayedRedelivery",
def.getAsyncDelayedRedelivery(), null);
- doWriteAttribute("backOffMultiplier", def.getBackOffMultiplier(),
"2.0");
+ doWriteAttribute("backOffMultiplier", def.getBackOffMultiplier(),
null);
doWriteAttribute("useExponentialBackOff",
def.getUseExponentialBackOff(), null);
- doWriteAttribute("collisionAvoidanceFactor",
def.getCollisionAvoidanceFactor(), "0.15");
+ doWriteAttribute("collisionAvoidanceFactor",
def.getCollisionAvoidanceFactor(), null);
doWriteAttribute("useCollisionAvoidance",
def.getUseCollisionAvoidance(), null);
- doWriteAttribute("maximumRedeliveryDelay",
def.getMaximumRedeliveryDelay(), "60000");
- doWriteAttribute("retriesExhaustedLogLevel",
def.getRetriesExhaustedLogLevel(), "ERROR");
- doWriteAttribute("retryAttemptedLogLevel",
def.getRetryAttemptedLogLevel(), "DEBUG");
- doWriteAttribute("retryAttemptedLogInterval",
def.getRetryAttemptedLogInterval(), "1");
- doWriteAttribute("logRetryAttempted", def.getLogRetryAttempted(),
"true");
- doWriteAttribute("logStackTrace", def.getLogStackTrace(), "true");
+ doWriteAttribute("maximumRedeliveryDelay",
def.getMaximumRedeliveryDelay(), null);
+ doWriteAttribute("retriesExhaustedLogLevel",
def.getRetriesExhaustedLogLevel(), null);
+ doWriteAttribute("retryAttemptedLogLevel",
def.getRetryAttemptedLogLevel(), null);
+ doWriteAttribute("retryAttemptedLogInterval",
def.getRetryAttemptedLogInterval(), null);
+ doWriteAttribute("logRetryAttempted", def.getLogRetryAttempted(),
null);
+ doWriteAttribute("logStackTrace", def.getLogStackTrace(), null);
doWriteAttribute("logRetryStackTrace", def.getLogRetryStackTrace(),
null);
doWriteAttribute("logHandled", def.getLogHandled(), null);
- doWriteAttribute("logNewException", def.getLogNewException(), "true");
+ doWriteAttribute("logNewException", def.getLogNewException(), null);
doWriteAttribute("logContinued", def.getLogContinued(), null);
- doWriteAttribute("logExhausted", def.getLogExhausted(), "true");
+ doWriteAttribute("logExhausted", def.getLogExhausted(), null);
doWriteAttribute("logExhaustedMessageHistory",
def.getLogExhaustedMessageHistory(), null);
doWriteAttribute("logExhaustedMessageBody",
def.getLogExhaustedMessageBody(), null);
doWriteAttribute("disableRedelivery", def.getDisableRedelivery(),
null);
doWriteAttribute("delayPattern", def.getDelayPattern(), null);
- doWriteAttribute("allowRedeliveryWhileStopping",
def.getAllowRedeliveryWhileStopping(), "true");
+ doWriteAttribute("allowRedeliveryWhileStopping",
def.getAllowRedeliveryWhileStopping(), null);
doWriteAttribute("exchangeFormatterRef",
def.getExchangeFormatterRef(), null);
endElement(name);
}
@@ -1541,29 +1541,29 @@ public class ModelWriter extends BaseWriter {
doWriteIdentifiedTypeAttributes(def);
doWriteAttribute("circuitBreaker", def.getCircuitBreaker(), null);
doWriteAttribute("config", def.getConfig(), null);
- doWriteAttribute("failureRateThreshold",
def.getFailureRateThreshold(), "50");
- doWriteAttribute("permittedNumberOfCallsInHalfOpenState",
def.getPermittedNumberOfCallsInHalfOpenState(), "10");
- doWriteAttribute("throwExceptionWhenHalfOpenOrOpenState",
def.getThrowExceptionWhenHalfOpenOrOpenState(), "false");
- doWriteAttribute("slidingWindowSize", def.getSlidingWindowSize(),
"100");
- doWriteAttribute("slidingWindowType", def.getSlidingWindowType(),
"COUNT_BASED");
- doWriteAttribute("slidingWindowSynchronizationStrategy",
def.getSlidingWindowSynchronizationStrategy(), "SYNCHRONIZED");
- doWriteAttribute("minimumNumberOfCalls",
def.getMinimumNumberOfCalls(), "100");
- doWriteAttribute("writableStackTraceEnabled",
def.getWritableStackTraceEnabled(), "true");
- doWriteAttribute("waitDurationInOpenState",
def.getWaitDurationInOpenState(), "60000");
- doWriteAttribute("automaticTransitionFromOpenToHalfOpenEnabled",
def.getAutomaticTransitionFromOpenToHalfOpenEnabled(), "false");
- doWriteAttribute("maxWaitDurationInHalfOpenState",
def.getMaxWaitDurationInHalfOpenState(), "0");
- doWriteAttribute("slowCallRateThreshold",
def.getSlowCallRateThreshold(), "100");
- doWriteAttribute("slowCallDurationThreshold",
def.getSlowCallDurationThreshold(), "60000");
- doWriteAttribute("bulkheadEnabled", def.getBulkheadEnabled(), "false");
- doWriteAttribute("bulkheadMaxConcurrentCalls",
def.getBulkheadMaxConcurrentCalls(), "25");
- doWriteAttribute("bulkheadMaxWaitDuration",
def.getBulkheadMaxWaitDuration(), "0");
- doWriteAttribute("bulkheadFairCallHandlingEnabled",
def.getBulkheadFairCallHandlingEnabled(), "true");
- doWriteAttribute("asynchronous", def.getAsynchronous(), "false");
- doWriteAttribute("timeoutEnabled", def.getTimeoutEnabled(), "false");
+ doWriteAttribute("failureRateThreshold",
def.getFailureRateThreshold(), null);
+ doWriteAttribute("permittedNumberOfCallsInHalfOpenState",
def.getPermittedNumberOfCallsInHalfOpenState(), null);
+ doWriteAttribute("throwExceptionWhenHalfOpenOrOpenState",
def.getThrowExceptionWhenHalfOpenOrOpenState(), null);
+ doWriteAttribute("slidingWindowSize", def.getSlidingWindowSize(),
null);
+ doWriteAttribute("slidingWindowType", def.getSlidingWindowType(),
null);
+ doWriteAttribute("slidingWindowSynchronizationStrategy",
def.getSlidingWindowSynchronizationStrategy(), null);
+ doWriteAttribute("minimumNumberOfCalls",
def.getMinimumNumberOfCalls(), null);
+ doWriteAttribute("writableStackTraceEnabled",
def.getWritableStackTraceEnabled(), null);
+ doWriteAttribute("waitDurationInOpenState",
def.getWaitDurationInOpenState(), null);
+ doWriteAttribute("automaticTransitionFromOpenToHalfOpenEnabled",
def.getAutomaticTransitionFromOpenToHalfOpenEnabled(), null);
+ doWriteAttribute("maxWaitDurationInHalfOpenState",
def.getMaxWaitDurationInHalfOpenState(), null);
+ doWriteAttribute("slowCallRateThreshold",
def.getSlowCallRateThreshold(), null);
+ doWriteAttribute("slowCallDurationThreshold",
def.getSlowCallDurationThreshold(), null);
+ doWriteAttribute("bulkheadEnabled", def.getBulkheadEnabled(), null);
+ doWriteAttribute("bulkheadMaxConcurrentCalls",
def.getBulkheadMaxConcurrentCalls(), null);
+ doWriteAttribute("bulkheadMaxWaitDuration",
def.getBulkheadMaxWaitDuration(), null);
+ doWriteAttribute("bulkheadFairCallHandlingEnabled",
def.getBulkheadFairCallHandlingEnabled(), null);
+ doWriteAttribute("asynchronous", def.getAsynchronous(), null);
+ doWriteAttribute("timeoutEnabled", def.getTimeoutEnabled(), null);
doWriteAttribute("timeoutExecutorService",
def.getTimeoutExecutorService(), null);
- doWriteAttribute("timeoutDuration", def.getTimeoutDuration(), "1000");
- doWriteAttribute("timeoutCancelRunningFuture",
def.getTimeoutCancelRunningFuture(), "true");
- doWriteAttribute("micrometerEnabled", def.getMicrometerEnabled(),
"false");
+ doWriteAttribute("timeoutDuration", def.getTimeoutDuration(), null);
+ doWriteAttribute("timeoutCancelRunningFuture",
def.getTimeoutCancelRunningFuture(), null);
+ doWriteAttribute("micrometerEnabled", def.getMicrometerEnabled(),
null);
}
protected void
doWriteResilience4jConfigurationCommonElements(Resilience4jConfigurationCommon
def) throws IOException {
doWriteList(null, "ignoreException", def.getIgnoreExceptions(),
this::doWriteString);
@@ -1651,8 +1651,8 @@ public class ModelWriter extends BaseWriter {
doWriteAttribute("delayer", def.getDelayer(), null);
doWriteAttribute("errorHandlerRef", def.getErrorHandlerRef(), null);
doWriteAttribute("routePolicyRef", def.getRoutePolicyRef(), null);
- doWriteAttribute("shutdownRoute", def.getShutdownRoute(), "Default");
- doWriteAttribute("shutdownRunningTask", def.getShutdownRunningTask(),
"CompleteCurrentTaskOnly");
+ doWriteAttribute("shutdownRoute", def.getShutdownRoute(), null);
+ doWriteAttribute("shutdownRunningTask", def.getShutdownRunningTask(),
null);
doWriteAttribute("precondition", def.getPrecondition(), null);
doWriteList(null, "routeProperty", def.getRouteProperties(),
this::doWritePropertyDefinition);
doWriteElement("errorHandler", def.getErrorHandler(),
this::doWriteErrorHandlerDefinition);
@@ -3357,14 +3357,14 @@ public class ModelWriter extends BaseWriter {
doWriteOptionalIdentifiedDefinitionAttributes(def);
doWriteAttribute("consumes", def.getConsumes(), null);
doWriteAttribute("produces", def.getProduces(), null);
- doWriteAttribute("bindingMode", def.getBindingMode(), "off");
+ doWriteAttribute("bindingMode", def.getBindingMode(), null);
doWriteAttribute("type", def.getType(), null);
doWriteAttribute("outType", def.getOutType(), null);
- doWriteAttribute("skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), "false");
- doWriteAttribute("clientRequestValidation",
def.getClientRequestValidation(), "false");
- doWriteAttribute("clientResponseValidation",
def.getClientResponseValidation(), "false");
- doWriteAttribute("enableCORS", def.getEnableCORS(), "false");
- doWriteAttribute("enableNoContentResponse",
def.getEnableNoContentResponse(), "false");
+ doWriteAttribute("skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), null);
+ doWriteAttribute("clientRequestValidation",
def.getClientRequestValidation(), null);
+ doWriteAttribute("clientResponseValidation",
def.getClientResponseValidation(), null);
+ doWriteAttribute("enableCORS", def.getEnableCORS(), null);
+ doWriteAttribute("enableNoContentResponse",
def.getEnableNoContentResponse(), null);
doWriteAttribute("component", def.getComponent(), null);
endElement(name);
}
@@ -3384,13 +3384,13 @@ public class ModelWriter extends BaseWriter {
doWriteAttribute("apiContextRouteId", def.getApiContextRouteId(),
null);
doWriteAttribute("apiVendorExtension", def.getApiVendorExtension(),
"false");
doWriteAttribute("hostNameResolver",
toString(def.getHostNameResolver()), "allLocalIp");
- doWriteAttribute("bindingMode", toString(def.getBindingMode()), "off");
+ doWriteAttribute("bindingMode", toString(def.getBindingMode()), null);
doWriteAttribute("bindingPackageScan", def.getBindingPackageScan(),
null);
- doWriteAttribute("skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), "false");
- doWriteAttribute("clientRequestValidation",
def.getClientRequestValidation(), "false");
- doWriteAttribute("clientResponseValidation",
def.getClientResponseValidation(), "false");
- doWriteAttribute("enableCORS", def.getEnableCORS(), "false");
- doWriteAttribute("enableNoContentResponse",
def.getEnableNoContentResponse(), "false");
+ doWriteAttribute("skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), null);
+ doWriteAttribute("clientRequestValidation",
def.getClientRequestValidation(), null);
+ doWriteAttribute("clientResponseValidation",
def.getClientResponseValidation(), null);
+ doWriteAttribute("enableCORS", def.getEnableCORS(), null);
+ doWriteAttribute("enableNoContentResponse",
def.getEnableNoContentResponse(), null);
doWriteAttribute("inlineRoutes", def.getInlineRoutes(), "true");
doWriteAttribute("jsonDataFormat", def.getJsonDataFormat(), "jackson");
doWriteAttribute("xmlDataFormat", def.getXmlDataFormat(), "jaxb");
@@ -3410,12 +3410,12 @@ public class ModelWriter extends BaseWriter {
doWriteAttribute("path", def.getPath(), null);
doWriteAttribute("consumes", def.getConsumes(), null);
doWriteAttribute("produces", def.getProduces(), null);
- doWriteAttribute("bindingMode", def.getBindingMode(), "off");
- doWriteAttribute("skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), "false");
- doWriteAttribute("clientRequestValidation",
def.getClientRequestValidation(), "false");
- doWriteAttribute("clientResponseValidation",
def.getClientResponseValidation(), "false");
- doWriteAttribute("enableCORS", def.getEnableCORS(), "false");
- doWriteAttribute("enableNoContentResponse",
def.getEnableNoContentResponse(), "false");
+ doWriteAttribute("bindingMode", def.getBindingMode(), null);
+ doWriteAttribute("skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), null);
+ doWriteAttribute("clientRequestValidation",
def.getClientRequestValidation(), null);
+ doWriteAttribute("clientResponseValidation",
def.getClientResponseValidation(), null);
+ doWriteAttribute("enableCORS", def.getEnableCORS(), null);
+ doWriteAttribute("enableNoContentResponse",
def.getEnableNoContentResponse(), null);
doWriteAttribute("apiDocs", def.getApiDocs(), "true");
doWriteAttribute("tag", def.getTag(), null);
doWriteList(null, null, def.getVerbs(),
this::doWriteVerbDefinitionRef);
@@ -3467,19 +3467,19 @@ public class ModelWriter extends BaseWriter {
}
protected void doWriteVerbDefinitionAttributes(VerbDefinition def) throws
IOException {
doWriteOptionalIdentifiedDefinitionAttributes(def);
- doWriteAttribute("enableCORS", def.getEnableCORS(), "false");
+ doWriteAttribute("enableCORS", def.getEnableCORS(), null);
doWriteAttribute("deprecated", def.getDeprecated(), "false");
doWriteAttribute("streamCache", def.getStreamCache(), null);
doWriteAttribute("type", def.getType(), null);
doWriteAttribute("outType", def.getOutType(), null);
- doWriteAttribute("clientResponseValidation",
def.getClientResponseValidation(), "false");
+ doWriteAttribute("clientResponseValidation",
def.getClientResponseValidation(), null);
doWriteAttribute("path", def.getPath(), null);
doWriteAttribute("routeId", def.getRouteId(), null);
- doWriteAttribute("bindingMode", def.getBindingMode(), "off");
+ doWriteAttribute("bindingMode", def.getBindingMode(), null);
doWriteAttribute("apiDocs", def.getApiDocs(), "true");
- doWriteAttribute("enableNoContentResponse",
def.getEnableNoContentResponse(), "false");
- doWriteAttribute("skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), "false");
- doWriteAttribute("clientRequestValidation",
def.getClientRequestValidation(), "false");
+ doWriteAttribute("enableNoContentResponse",
def.getEnableNoContentResponse(), null);
+ doWriteAttribute("skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), null);
+ doWriteAttribute("clientRequestValidation",
def.getClientRequestValidation(), null);
doWriteAttribute("produces", def.getProduces(), null);
doWriteAttribute("disabled", def.getDisabled(), null);
doWriteAttribute("consumes", def.getConsumes(), null);
diff --git
a/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/YamlModelWriter.java
b/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/YamlModelWriter.java
index 7a1096e27a80..0f0e930a66c5 100644
---
a/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/YamlModelWriter.java
+++
b/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/YamlModelWriter.java
@@ -1029,15 +1029,15 @@ public class YamlModelWriter extends
YamlModelWriterSupport {
protected void
doWriteFaultToleranceConfigurationCommonAttributes(JsonObject jo,
FaultToleranceConfigurationCommon def) {
doWriteIdentifiedTypeAttributes(jo, def);
doWriteAttribute(jo, "typedGuard", def.getTypedGuard(), null);
- doWriteAttribute(jo, "delay", def.getDelay(), "5000");
- doWriteAttribute(jo, "successThreshold", def.getSuccessThreshold(),
"1");
- doWriteAttribute(jo, "requestVolumeThreshold",
def.getRequestVolumeThreshold(), "20");
- doWriteAttribute(jo, "failureRatio", def.getFailureRatio(), "50");
- doWriteAttribute(jo, "timeoutEnabled", def.getTimeoutEnabled(),
"false");
- doWriteAttribute(jo, "timeoutDuration", def.getTimeoutDuration(),
"1000");
- doWriteAttribute(jo, "bulkheadEnabled", def.getBulkheadEnabled(),
"false");
- doWriteAttribute(jo, "bulkheadMaxConcurrentCalls",
def.getBulkheadMaxConcurrentCalls(), "10");
- doWriteAttribute(jo, "bulkheadWaitingTaskQueue",
def.getBulkheadWaitingTaskQueue(), "10");
+ doWriteAttribute(jo, "delay", def.getDelay(), null);
+ doWriteAttribute(jo, "successThreshold", def.getSuccessThreshold(),
null);
+ doWriteAttribute(jo, "requestVolumeThreshold",
def.getRequestVolumeThreshold(), null);
+ doWriteAttribute(jo, "failureRatio", def.getFailureRatio(), null);
+ doWriteAttribute(jo, "timeoutEnabled", def.getTimeoutEnabled(), null);
+ doWriteAttribute(jo, "timeoutDuration", def.getTimeoutDuration(),
null);
+ doWriteAttribute(jo, "bulkheadEnabled", def.getBulkheadEnabled(),
null);
+ doWriteAttribute(jo, "bulkheadMaxConcurrentCalls",
def.getBulkheadMaxConcurrentCalls(), null);
+ doWriteAttribute(jo, "bulkheadWaitingTaskQueue",
def.getBulkheadWaitingTaskQueue(), null);
doWriteAttribute(jo, "threadOffloadExecutorService",
def.getThreadOffloadExecutorService(), null);
}
protected JsonObject
doWriteFaultToleranceConfigurationCommon(FaultToleranceConfigurationCommon def)
{
@@ -1461,28 +1461,28 @@ public class YamlModelWriter extends
YamlModelWriterSupport {
JsonObject jo = new JsonObject();
doWriteIdentifiedTypeAttributes(jo, def);
doWriteAttribute(jo, "maximumRedeliveries",
def.getMaximumRedeliveries(), null);
- doWriteAttribute(jo, "redeliveryDelay", def.getRedeliveryDelay(),
"1000");
+ doWriteAttribute(jo, "redeliveryDelay", def.getRedeliveryDelay(),
null);
doWriteAttribute(jo, "asyncDelayedRedelivery",
def.getAsyncDelayedRedelivery(), null);
- doWriteAttribute(jo, "backOffMultiplier", def.getBackOffMultiplier(),
"2.0");
+ doWriteAttribute(jo, "backOffMultiplier", def.getBackOffMultiplier(),
null);
doWriteAttribute(jo, "useExponentialBackOff",
def.getUseExponentialBackOff(), null);
- doWriteAttribute(jo, "collisionAvoidanceFactor",
def.getCollisionAvoidanceFactor(), "0.15");
+ doWriteAttribute(jo, "collisionAvoidanceFactor",
def.getCollisionAvoidanceFactor(), null);
doWriteAttribute(jo, "useCollisionAvoidance",
def.getUseCollisionAvoidance(), null);
- doWriteAttribute(jo, "maximumRedeliveryDelay",
def.getMaximumRedeliveryDelay(), "60000");
- doWriteAttribute(jo, "retriesExhaustedLogLevel",
def.getRetriesExhaustedLogLevel(), "ERROR");
- doWriteAttribute(jo, "retryAttemptedLogLevel",
def.getRetryAttemptedLogLevel(), "DEBUG");
- doWriteAttribute(jo, "retryAttemptedLogInterval",
def.getRetryAttemptedLogInterval(), "1");
- doWriteAttribute(jo, "logRetryAttempted", def.getLogRetryAttempted(),
"true");
- doWriteAttribute(jo, "logStackTrace", def.getLogStackTrace(), "true");
+ doWriteAttribute(jo, "maximumRedeliveryDelay",
def.getMaximumRedeliveryDelay(), null);
+ doWriteAttribute(jo, "retriesExhaustedLogLevel",
def.getRetriesExhaustedLogLevel(), null);
+ doWriteAttribute(jo, "retryAttemptedLogLevel",
def.getRetryAttemptedLogLevel(), null);
+ doWriteAttribute(jo, "retryAttemptedLogInterval",
def.getRetryAttemptedLogInterval(), null);
+ doWriteAttribute(jo, "logRetryAttempted", def.getLogRetryAttempted(),
null);
+ doWriteAttribute(jo, "logStackTrace", def.getLogStackTrace(), null);
doWriteAttribute(jo, "logRetryStackTrace",
def.getLogRetryStackTrace(), null);
doWriteAttribute(jo, "logHandled", def.getLogHandled(), null);
- doWriteAttribute(jo, "logNewException", def.getLogNewException(),
"true");
+ doWriteAttribute(jo, "logNewException", def.getLogNewException(),
null);
doWriteAttribute(jo, "logContinued", def.getLogContinued(), null);
- doWriteAttribute(jo, "logExhausted", def.getLogExhausted(), "true");
+ doWriteAttribute(jo, "logExhausted", def.getLogExhausted(), null);
doWriteAttribute(jo, "logExhaustedMessageHistory",
def.getLogExhaustedMessageHistory(), null);
doWriteAttribute(jo, "logExhaustedMessageBody",
def.getLogExhaustedMessageBody(), null);
doWriteAttribute(jo, "disableRedelivery", def.getDisableRedelivery(),
null);
doWriteAttribute(jo, "delayPattern", def.getDelayPattern(), null);
- doWriteAttribute(jo, "allowRedeliveryWhileStopping",
def.getAllowRedeliveryWhileStopping(), "true");
+ doWriteAttribute(jo, "allowRedeliveryWhileStopping",
def.getAllowRedeliveryWhileStopping(), null);
doWriteAttribute(jo, "exchangeFormatterRef",
def.getExchangeFormatterRef(), null);
return jo;
}
@@ -1535,29 +1535,29 @@ public class YamlModelWriter extends
YamlModelWriterSupport {
doWriteIdentifiedTypeAttributes(jo, def);
doWriteAttribute(jo, "circuitBreaker", def.getCircuitBreaker(), null);
doWriteAttribute(jo, "config", def.getConfig(), null);
- doWriteAttribute(jo, "failureRateThreshold",
def.getFailureRateThreshold(), "50");
- doWriteAttribute(jo, "permittedNumberOfCallsInHalfOpenState",
def.getPermittedNumberOfCallsInHalfOpenState(), "10");
- doWriteAttribute(jo, "throwExceptionWhenHalfOpenOrOpenState",
def.getThrowExceptionWhenHalfOpenOrOpenState(), "false");
- doWriteAttribute(jo, "slidingWindowSize", def.getSlidingWindowSize(),
"100");
- doWriteAttribute(jo, "slidingWindowType", def.getSlidingWindowType(),
"COUNT_BASED");
- doWriteAttribute(jo, "slidingWindowSynchronizationStrategy",
def.getSlidingWindowSynchronizationStrategy(), "SYNCHRONIZED");
- doWriteAttribute(jo, "minimumNumberOfCalls",
def.getMinimumNumberOfCalls(), "100");
- doWriteAttribute(jo, "writableStackTraceEnabled",
def.getWritableStackTraceEnabled(), "true");
- doWriteAttribute(jo, "waitDurationInOpenState",
def.getWaitDurationInOpenState(), "60000");
- doWriteAttribute(jo, "automaticTransitionFromOpenToHalfOpenEnabled",
def.getAutomaticTransitionFromOpenToHalfOpenEnabled(), "false");
- doWriteAttribute(jo, "maxWaitDurationInHalfOpenState",
def.getMaxWaitDurationInHalfOpenState(), "0");
- doWriteAttribute(jo, "slowCallRateThreshold",
def.getSlowCallRateThreshold(), "100");
- doWriteAttribute(jo, "slowCallDurationThreshold",
def.getSlowCallDurationThreshold(), "60000");
- doWriteAttribute(jo, "bulkheadEnabled", def.getBulkheadEnabled(),
"false");
- doWriteAttribute(jo, "bulkheadMaxConcurrentCalls",
def.getBulkheadMaxConcurrentCalls(), "25");
- doWriteAttribute(jo, "bulkheadMaxWaitDuration",
def.getBulkheadMaxWaitDuration(), "0");
- doWriteAttribute(jo, "bulkheadFairCallHandlingEnabled",
def.getBulkheadFairCallHandlingEnabled(), "true");
- doWriteAttribute(jo, "asynchronous", def.getAsynchronous(), "false");
- doWriteAttribute(jo, "timeoutEnabled", def.getTimeoutEnabled(),
"false");
+ doWriteAttribute(jo, "failureRateThreshold",
def.getFailureRateThreshold(), null);
+ doWriteAttribute(jo, "permittedNumberOfCallsInHalfOpenState",
def.getPermittedNumberOfCallsInHalfOpenState(), null);
+ doWriteAttribute(jo, "throwExceptionWhenHalfOpenOrOpenState",
def.getThrowExceptionWhenHalfOpenOrOpenState(), null);
+ doWriteAttribute(jo, "slidingWindowSize", def.getSlidingWindowSize(),
null);
+ doWriteAttribute(jo, "slidingWindowType", def.getSlidingWindowType(),
null);
+ doWriteAttribute(jo, "slidingWindowSynchronizationStrategy",
def.getSlidingWindowSynchronizationStrategy(), null);
+ doWriteAttribute(jo, "minimumNumberOfCalls",
def.getMinimumNumberOfCalls(), null);
+ doWriteAttribute(jo, "writableStackTraceEnabled",
def.getWritableStackTraceEnabled(), null);
+ doWriteAttribute(jo, "waitDurationInOpenState",
def.getWaitDurationInOpenState(), null);
+ doWriteAttribute(jo, "automaticTransitionFromOpenToHalfOpenEnabled",
def.getAutomaticTransitionFromOpenToHalfOpenEnabled(), null);
+ doWriteAttribute(jo, "maxWaitDurationInHalfOpenState",
def.getMaxWaitDurationInHalfOpenState(), null);
+ doWriteAttribute(jo, "slowCallRateThreshold",
def.getSlowCallRateThreshold(), null);
+ doWriteAttribute(jo, "slowCallDurationThreshold",
def.getSlowCallDurationThreshold(), null);
+ doWriteAttribute(jo, "bulkheadEnabled", def.getBulkheadEnabled(),
null);
+ doWriteAttribute(jo, "bulkheadMaxConcurrentCalls",
def.getBulkheadMaxConcurrentCalls(), null);
+ doWriteAttribute(jo, "bulkheadMaxWaitDuration",
def.getBulkheadMaxWaitDuration(), null);
+ doWriteAttribute(jo, "bulkheadFairCallHandlingEnabled",
def.getBulkheadFairCallHandlingEnabled(), null);
+ doWriteAttribute(jo, "asynchronous", def.getAsynchronous(), null);
+ doWriteAttribute(jo, "timeoutEnabled", def.getTimeoutEnabled(), null);
doWriteAttribute(jo, "timeoutExecutorService",
def.getTimeoutExecutorService(), null);
- doWriteAttribute(jo, "timeoutDuration", def.getTimeoutDuration(),
"1000");
- doWriteAttribute(jo, "timeoutCancelRunningFuture",
def.getTimeoutCancelRunningFuture(), "true");
- doWriteAttribute(jo, "micrometerEnabled", def.getMicrometerEnabled(),
"false");
+ doWriteAttribute(jo, "timeoutDuration", def.getTimeoutDuration(),
null);
+ doWriteAttribute(jo, "timeoutCancelRunningFuture",
def.getTimeoutCancelRunningFuture(), null);
+ doWriteAttribute(jo, "micrometerEnabled", def.getMicrometerEnabled(),
null);
}
protected void doWriteResilience4jConfigurationCommonElements(JsonObject
jo, Resilience4jConfigurationCommon def) {
doWriteStringList(jo, null, "ignoreException",
def.getIgnoreExceptions());
@@ -1645,8 +1645,8 @@ public class YamlModelWriter extends
YamlModelWriterSupport {
doWriteAttribute(jo, "delayer", def.getDelayer(), null);
doWriteAttribute(jo, "errorHandlerRef", def.getErrorHandlerRef(),
null);
doWriteAttribute(jo, "routePolicyRef", def.getRoutePolicyRef(), null);
- doWriteAttribute(jo, "shutdownRoute", def.getShutdownRoute(),
"Default");
- doWriteAttribute(jo, "shutdownRunningTask",
def.getShutdownRunningTask(), "CompleteCurrentTaskOnly");
+ doWriteAttribute(jo, "shutdownRoute", def.getShutdownRoute(), null);
+ doWriteAttribute(jo, "shutdownRunningTask",
def.getShutdownRunningTask(), null);
doWriteAttribute(jo, "precondition", def.getPrecondition(), null);
doWriteChildList(jo, null, "routeProperty", def.getRouteProperties(),
this::doWritePropertyDefinition);
doWriteChildElement(jo, "errorHandler", def.getErrorHandler(),
this::doWriteErrorHandlerDefinition);
@@ -3358,14 +3358,14 @@ public class YamlModelWriter extends
YamlModelWriterSupport {
doWriteOptionalIdentifiedDefinitionAttributes(jo, def);
doWriteAttribute(jo, "consumes", def.getConsumes(), null);
doWriteAttribute(jo, "produces", def.getProduces(), null);
- doWriteAttribute(jo, "bindingMode", def.getBindingMode(), "off");
+ doWriteAttribute(jo, "bindingMode", def.getBindingMode(), null);
doWriteAttribute(jo, "type", def.getType(), null);
doWriteAttribute(jo, "outType", def.getOutType(), null);
- doWriteAttribute(jo, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), "false");
- doWriteAttribute(jo, "clientRequestValidation",
def.getClientRequestValidation(), "false");
- doWriteAttribute(jo, "clientResponseValidation",
def.getClientResponseValidation(), "false");
- doWriteAttribute(jo, "enableCORS", def.getEnableCORS(), "false");
- doWriteAttribute(jo, "enableNoContentResponse",
def.getEnableNoContentResponse(), "false");
+ doWriteAttribute(jo, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), null);
+ doWriteAttribute(jo, "clientRequestValidation",
def.getClientRequestValidation(), null);
+ doWriteAttribute(jo, "clientResponseValidation",
def.getClientResponseValidation(), null);
+ doWriteAttribute(jo, "enableCORS", def.getEnableCORS(), null);
+ doWriteAttribute(jo, "enableNoContentResponse",
def.getEnableNoContentResponse(), null);
doWriteAttribute(jo, "component", def.getComponent(), null);
return jo;
}
@@ -3385,13 +3385,13 @@ public class YamlModelWriter extends
YamlModelWriterSupport {
doWriteAttribute(jo, "apiContextRouteId", def.getApiContextRouteId(),
null);
doWriteAttribute(jo, "apiVendorExtension",
def.getApiVendorExtension(), "false");
doWriteAttribute(jo, "hostNameResolver",
toString(def.getHostNameResolver()), "allLocalIp");
- doWriteAttribute(jo, "bindingMode", toString(def.getBindingMode()),
"off");
+ doWriteAttribute(jo, "bindingMode", toString(def.getBindingMode()),
null);
doWriteAttribute(jo, "bindingPackageScan",
def.getBindingPackageScan(), null);
- doWriteAttribute(jo, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), "false");
- doWriteAttribute(jo, "clientRequestValidation",
def.getClientRequestValidation(), "false");
- doWriteAttribute(jo, "clientResponseValidation",
def.getClientResponseValidation(), "false");
- doWriteAttribute(jo, "enableCORS", def.getEnableCORS(), "false");
- doWriteAttribute(jo, "enableNoContentResponse",
def.getEnableNoContentResponse(), "false");
+ doWriteAttribute(jo, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), null);
+ doWriteAttribute(jo, "clientRequestValidation",
def.getClientRequestValidation(), null);
+ doWriteAttribute(jo, "clientResponseValidation",
def.getClientResponseValidation(), null);
+ doWriteAttribute(jo, "enableCORS", def.getEnableCORS(), null);
+ doWriteAttribute(jo, "enableNoContentResponse",
def.getEnableNoContentResponse(), null);
doWriteAttribute(jo, "inlineRoutes", def.getInlineRoutes(), "true");
doWriteAttribute(jo, "jsonDataFormat", def.getJsonDataFormat(),
"jackson");
doWriteAttribute(jo, "xmlDataFormat", def.getXmlDataFormat(), "jaxb");
@@ -3411,12 +3411,12 @@ public class YamlModelWriter extends
YamlModelWriterSupport {
doWriteAttribute(jo, "path", def.getPath(), null);
doWriteAttribute(jo, "consumes", def.getConsumes(), null);
doWriteAttribute(jo, "produces", def.getProduces(), null);
- doWriteAttribute(jo, "bindingMode", def.getBindingMode(), "off");
- doWriteAttribute(jo, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), "false");
- doWriteAttribute(jo, "clientRequestValidation",
def.getClientRequestValidation(), "false");
- doWriteAttribute(jo, "clientResponseValidation",
def.getClientResponseValidation(), "false");
- doWriteAttribute(jo, "enableCORS", def.getEnableCORS(), "false");
- doWriteAttribute(jo, "enableNoContentResponse",
def.getEnableNoContentResponse(), "false");
+ doWriteAttribute(jo, "bindingMode", def.getBindingMode(), null);
+ doWriteAttribute(jo, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), null);
+ doWriteAttribute(jo, "clientRequestValidation",
def.getClientRequestValidation(), null);
+ doWriteAttribute(jo, "clientResponseValidation",
def.getClientResponseValidation(), null);
+ doWriteAttribute(jo, "enableCORS", def.getEnableCORS(), null);
+ doWriteAttribute(jo, "enableNoContentResponse",
def.getEnableNoContentResponse(), null);
doWriteAttribute(jo, "apiDocs", def.getApiDocs(), "true");
doWriteAttribute(jo, "tag", def.getTag(), null);
doWriteVerbs(jo, def.getVerbs(), this::doWriteVerbDefinition);
@@ -3470,19 +3470,19 @@ public class YamlModelWriter extends
YamlModelWriterSupport {
}
protected void doWriteVerbDefinitionAttributes(JsonObject jo,
VerbDefinition def) {
doWriteOptionalIdentifiedDefinitionAttributes(jo, def);
- doWriteAttribute(jo, "enableCORS", def.getEnableCORS(), "false");
+ doWriteAttribute(jo, "enableCORS", def.getEnableCORS(), null);
doWriteAttribute(jo, "deprecated", def.getDeprecated(), "false");
doWriteAttribute(jo, "streamCache", def.getStreamCache(), null);
doWriteAttribute(jo, "type", def.getType(), null);
doWriteAttribute(jo, "outType", def.getOutType(), null);
- doWriteAttribute(jo, "clientResponseValidation",
def.getClientResponseValidation(), "false");
+ doWriteAttribute(jo, "clientResponseValidation",
def.getClientResponseValidation(), null);
doWriteAttribute(jo, "path", def.getPath(), null);
doWriteAttribute(jo, "routeId", def.getRouteId(), null);
- doWriteAttribute(jo, "bindingMode", def.getBindingMode(), "off");
+ doWriteAttribute(jo, "bindingMode", def.getBindingMode(), null);
doWriteAttribute(jo, "apiDocs", def.getApiDocs(), "true");
- doWriteAttribute(jo, "enableNoContentResponse",
def.getEnableNoContentResponse(), "false");
- doWriteAttribute(jo, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), "false");
- doWriteAttribute(jo, "clientRequestValidation",
def.getClientRequestValidation(), "false");
+ doWriteAttribute(jo, "enableNoContentResponse",
def.getEnableNoContentResponse(), null);
+ doWriteAttribute(jo, "skipBindingOnErrorCode",
def.getSkipBindingOnErrorCode(), null);
+ doWriteAttribute(jo, "clientRequestValidation",
def.getClientRequestValidation(), null);
doWriteAttribute(jo, "produces", def.getProduces(), null);
doWriteAttribute(jo, "disabled", def.getDisabled(), null);
doWriteAttribute(jo, "consumes", def.getConsumes(), null);
diff --git
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
index 53e6a5cdea2d..2c4a315cdf28 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
@@ -564,6 +564,16 @@ provider is detected as before.
nothing), and a route that cannot be read, such as invalid YAML, exits with
`1` and the error of the parser (it failed
with an internal error, `70`, and a stack trace).
+=== camel-xml-io, camel-yaml-io, camel-java-io - route dumps keep options set
to their default value
+
+The XML, YAML and Java route dumps (`camel transform route`, `camel validate
normalize`, `camel.main.dumpRoutes`, the
+developer console) now write these options whenever they are set, also with
their documented default value: the
+binding options of the rest configuration, a rest and its verbs (such as
`bindingMode="off"`), the options of a
+redelivery policy, of a `resilience4jConfiguration` and of a
`faultToleranceConfiguration`, and `shutdownRoute` /
+`shutdownRunningTask` of a route. Left out, such an option took the value of
the parent level when the dump was loaded
+(the rest configuration, the error handler, the global circuit breaker
configuration, the CamelContext), so the route
+behaved differently.
+
=== camel-jbang - camel get bean, get route-controller and top source
* `camel get bean --dsl` shows the configuration of each property next to that
property: it paired them by position,
diff --git
a/dsl/camel-xml-io-dsl/src/test/java/org/apache/camel/dsl/xml/io/XmlDumpExplicitDefaultValuesTest.java
b/dsl/camel-xml-io-dsl/src/test/java/org/apache/camel/dsl/xml/io/XmlDumpExplicitDefaultValuesTest.java
new file mode 100644
index 000000000000..7e051ac91d8f
--- /dev/null
+++
b/dsl/camel-xml-io-dsl/src/test/java/org/apache/camel/dsl/xml/io/XmlDumpExplicitDefaultValuesTest.java
@@ -0,0 +1,181 @@
+/*
+ * 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.dsl.xml.io;
+
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.component.seda.SedaEndpoint;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.model.ModelCamelContext;
+import org.apache.camel.model.RoutesDefinition;
+import org.apache.camel.model.rest.RestsDefinition;
+import org.apache.camel.spi.RestConfiguration;
+import org.apache.camel.spi.RestConsumerFactory;
+import org.apache.camel.support.PluginHelper;
+import org.apache.camel.support.ResourceHelper;
+import org.apache.camel.xml.LwModelToXMLDumper;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * A route that is dumped as XML and loaded again must behave as the route it
was dumped from, also when an option is
+ * set to its documented default value, as an option that is not set takes the
value of a parent level instead.
+ */
+class XmlDumpExplicitDefaultValuesTest {
+
+ /** A rest consumer that receives from seda:verb-path, so the test can
call a rest verb without an HTTP server. */
+ public static class SedaRestConsumerFactory implements RestConsumerFactory
{
+ @Override
+ public org.apache.camel.Consumer createConsumer(
+ CamelContext camelContext, Processor processor, String verb,
String basePath, String uriTemplate,
+ String consumes, String produces, RestConfiguration
configuration, Map<String, Object> parameters)
+ throws Exception {
+ String path = basePath + (uriTemplate != null ? uriTemplate : "");
+ SedaEndpoint seda = camelContext.getEndpoint("seda:" + verb +
path.replace('/', '-'), SedaEndpoint.class);
+ return seda.createConsumer(processor);
+ }
+ }
+
+ @Test
+ void verbClientRequestValidationOffUnderRestConfiguration() throws
Exception {
+ String xml = """
+ <camel>
+ <rest path="/api">
+ <post path="/notes" consumes="application/json"
clientRequestValidation="false">
+ <to uri="direct:notes"/>
+ </post>
+ </rest>
+ <route>
+ <from uri="direct:notes"/>
+ <setBody>
+ <constant>stored</constant>
+ </setBody>
+ </route>
+ </camel>
+ """;
+ Consumer<CamelContext> setup = context -> {
+ context.getRegistry().bind("seda-rest", new
SedaRestConsumerFactory());
+ context.getRestConfiguration().setComponent("seda-rest");
+ context.getRestConfiguration().setInlineRoutes(false);
+ // validation for all the rest services, the verb turns it off
+ context.getRestConfiguration().setClientRequestValidation(true);
+ };
+ Function<CamelContext, String> call = context -> {
+ Exchange reply =
context.createProducerTemplate().request("seda:post-api-notes", e -> {
+ e.getMessage().setHeader(Exchange.CONTENT_TYPE, "text/plain");
+ e.getMessage().setBody("a note");
+ });
+ return reply.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE,
"200", String.class) + " "
+ + reply.getMessage().getBody(String.class);
+ };
+
+ assertEquals("200 stored", run(xml, setup, call));
+ String dumped = dump(xml, setup);
+ assertEquals("200 stored", run(dumped, setup, call), dumped);
+ assertTrue(dumped.contains("clientRequestValidation=\"false\""),
dumped);
+ }
+
+ @Test
+ void onExceptionRedeliveryDelayUnderErrorHandler() throws Exception {
+ // the onException redelivers after 1000 ms (the documented default),
the error handler after 30 s: an option
+ // of the onException that is not set takes the value of the error
handler
+ String xml = """
+ <camel>
+ <route>
+ <errorHandler>
+ <defaultErrorHandler>
+ <redeliveryPolicy maximumRedeliveries="3"
redeliveryDelay="30000"/>
+ </defaultErrorHandler>
+ </errorHandler>
+ <from uri="direct:start"/>
+ <onException>
+
<exception>java.lang.IllegalStateException</exception>
+ <redeliveryPolicy maximumRedeliveries="1"
redeliveryDelay="1000"/>
+ <handled>
+ <constant>true</constant>
+ </handled>
+ <setBody>
+ <constant>handled</constant>
+ </setBody>
+ </onException>
+ <throwException
exceptionType="java.lang.IllegalStateException" message="Forced"/>
+ </route>
+ </camel>
+ """;
+ Consumer<CamelContext> setup = context ->
context.getShutdownStrategy().setTimeout(1);
+ Function<CamelContext, String> call = context -> {
+ try {
+ return
context.createProducerTemplate().asyncRequestBody("direct:start", "x",
String.class)
+ .get(10, TimeUnit.SECONDS);
+ } catch (TimeoutException e) {
+ return "not redelivered within 10 seconds";
+ } catch (Exception e) {
+ return e.toString();
+ }
+ };
+
+ assertEquals("handled", run(xml, setup, call));
+ String dumped = dump(xml, setup);
+ assertEquals("handled", run(dumped, setup, call), dumped);
+ }
+
+ private static String run(String xml, Consumer<CamelContext> setup,
Function<CamelContext, String> call)
+ throws Exception {
+ try (DefaultCamelContext context = new DefaultCamelContext()) {
+ setup.accept(context);
+
PluginHelper.getRoutesLoader(context).loadRoutes(ResourceHelper.fromString("routes.xml",
xml));
+ context.start();
+ return call.apply(context);
+ }
+ }
+
+ /** Loads the routes and rests, and dumps them back as one XML document. */
+ private static String dump(String xml, Consumer<CamelContext> setup)
throws Exception {
+ try (DefaultCamelContext context = new DefaultCamelContext()) {
+ setup.accept(context);
+
PluginHelper.getRoutesLoader(context).loadRoutes(ResourceHelper.fromString("routes.xml",
xml));
+ ModelCamelContext model = (ModelCamelContext) context;
+ StringBuilder sb = new StringBuilder("<camel>");
+ if (!model.getRestDefinitions().isEmpty()) {
+ RestsDefinition rests = new RestsDefinition();
+ rests.getRests().addAll(model.getRestDefinitions());
+ sb.append(body(new
LwModelToXMLDumper().dumpModelAsXml(context, rests), "rests"));
+ }
+ RoutesDefinition routes = new RoutesDefinition();
+ model.getRouteDefinitions().stream().filter(r ->
!Boolean.TRUE.equals(r.isRest()))
+ .forEach(routes.getRoutes()::add);
+ sb.append(body(new LwModelToXMLDumper().dumpModelAsXml(context,
routes), "routes"));
+ return sb.append("</camel>").toString();
+ }
+ }
+
+ /** The children of the root element of a dump. */
+ private static String body(String dump, String root) {
+ int start = dump.indexOf('>', dump.indexOf("<" + root)) + 1;
+ int end = dump.lastIndexOf("</" + root + ">");
+ return dump.substring(start, end);
+ }
+}
diff --git
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/java/org/apache/camel/dsl/yaml/YamlDumpExplicitDefaultValuesTest.java
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/java/org/apache/camel/dsl/yaml/YamlDumpExplicitDefaultValuesTest.java
new file mode 100644
index 000000000000..54fb5f12244d
--- /dev/null
+++
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/java/org/apache/camel/dsl/yaml/YamlDumpExplicitDefaultValuesTest.java
@@ -0,0 +1,209 @@
+/*
+ * 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.dsl.yaml;
+
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.component.seda.SedaEndpoint;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.model.ModelCamelContext;
+import org.apache.camel.model.RoutesDefinition;
+import org.apache.camel.model.rest.RestsDefinition;
+import org.apache.camel.spi.RestConfiguration;
+import org.apache.camel.spi.RestConsumerFactory;
+import org.apache.camel.support.PluginHelper;
+import org.apache.camel.support.ResourceHelper;
+import org.apache.camel.yaml.LwModelToYAMLDumper;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * A route that is dumped as YAML (camel validate normalize, camel transform
route, the route dump) and loaded again
+ * must behave as the route it was dumped from, also when an option is set to
its documented default value, as an option
+ * that is not set takes the value of a parent level instead.
+ */
+class YamlDumpExplicitDefaultValuesTest {
+
+ /** A rest consumer that receives from seda:verb-path, so the test can
call a rest verb without an HTTP server. */
+ public static class SedaRestConsumerFactory implements RestConsumerFactory
{
+ @Override
+ public org.apache.camel.Consumer createConsumer(
+ CamelContext camelContext, Processor processor, String verb,
String basePath, String uriTemplate,
+ String consumes, String produces, RestConfiguration
configuration, Map<String, Object> parameters)
+ throws Exception {
+ String path = basePath + (uriTemplate != null ? uriTemplate : "");
+ SedaEndpoint seda = camelContext.getEndpoint("seda:" + verb +
path.replace('/', '-'), SedaEndpoint.class);
+ return seda.createConsumer(processor);
+ }
+ }
+
+ private static final Consumer<CamelContext> JSON_BINDING = context -> {
+ context.getRegistry().bind("seda-rest", new SedaRestConsumerFactory());
+ context.getRestConfiguration().setComponent("seda-rest");
+ context.getRestConfiguration().setInlineRoutes(false);
+ context.getRestConfiguration().setBindingMode("json");
+ };
+
+ @Test
+ void verbBindingModeOffUnderJsonRestConfiguration() throws Exception {
+ // the rest configuration binds json, this one verb turns binding off:
its reply is not marshalled to json
+ String yaml = """
+ - rest:
+ path: /api
+ get:
+ - path: /raw
+ bindingMode: "off"
+ to: direct:raw
+ - route:
+ from:
+ uri: direct:raw
+ steps:
+ - setBody:
+ expression:
+ simple:
+ expression:
"${bean:type:java.util.Map.of('format', 'raw')}"
+ """;
+ Function<CamelContext, String> call
+ = context ->
context.createProducerTemplate().requestBody("seda:get-api-raw", "",
String.class);
+
+ assertThat(run(yaml, JSON_BINDING, call)).isEqualTo("{format=raw}");
+ String dumped = dump(yaml, JSON_BINDING);
+ assertThat(run(dumped, JSON_BINDING,
call)).as(dumped).isEqualTo("{format=raw}");
+ assertThat(dumped).contains("bindingMode: \"off\"");
+ }
+
+ @Test
+ void verbSkipBindingOnErrorCodeOff() throws Exception {
+ // skipBindingOnErrorCode is true when not set, though documented as
false: the verb asks for its error
+ // replies to be bound to json as well
+ String yaml = """
+ - rest:
+ path: /api
+ get:
+ - path: /err
+ skipBindingOnErrorCode: false
+ to: direct:err
+ - route:
+ from:
+ uri: direct:err
+ steps:
+ - setHeader:
+ name: CamelHttpResponseCode
+ expression:
+ constant:
+ expression: "400"
+ - setBody:
+ expression:
+ simple:
+ expression:
"${bean:type:java.util.Map.of('error', 'bad request')}"
+ """;
+ Function<CamelContext, String> call = context -> {
+ Exchange reply =
context.createProducerTemplate().request("seda:get-api-err", e ->
e.getMessage().setBody(""));
+ return reply.getMessage().getBody(String.class);
+ };
+
+ assertThat(run(yaml, JSON_BINDING, call)).isEqualTo("{\"error\":\"bad
request\"}");
+ String dumped = dump(yaml, JSON_BINDING);
+ assertThat(run(dumped, JSON_BINDING,
call)).as(dumped).isEqualTo("{\"error\":\"bad request\"}");
+ }
+
+ @Test
+ void onExceptionRedeliveryDelayUnderErrorHandler() throws Exception {
+ // the onException redelivers after 1000 ms (the documented default),
the error handler after 30 s: an option
+ // of the onException that is not set takes the value of the error
handler
+ String yaml = """
+ - onException:
+ exception:
+ - java.lang.IllegalStateException
+ redeliveryPolicy:
+ maximumRedeliveries: 1
+ redeliveryDelay: 1000
+ handled:
+ constant:
+ expression: "true"
+ steps:
+ - setBody:
+ expression:
+ constant:
+ expression: handled
+ - route:
+ errorHandler:
+ defaultErrorHandler:
+ redeliveryPolicy:
+ maximumRedeliveries: 3
+ redeliveryDelay: 30000
+ from:
+ uri: direct:start
+ steps:
+ - throwException:
+ exceptionType: java.lang.IllegalStateException
+ message: Forced
+ """;
+ Consumer<CamelContext> setup = context ->
context.getShutdownStrategy().setTimeout(1);
+ Function<CamelContext, String> call = context -> {
+ try {
+ return
context.createProducerTemplate().asyncRequestBody("direct:start", "x",
String.class)
+ .get(10, TimeUnit.SECONDS);
+ } catch (TimeoutException e) {
+ return "not redelivered within 10 seconds";
+ } catch (Exception e) {
+ return e.toString();
+ }
+ };
+
+ assertThat(run(yaml, setup, call)).isEqualTo("handled");
+ String dumped = dump(yaml, setup);
+ assertThat(run(dumped, setup, call)).as(dumped).isEqualTo("handled");
+ }
+
+ private static String run(String yaml, Consumer<CamelContext> setup,
Function<CamelContext, String> call)
+ throws Exception {
+ try (DefaultCamelContext context = new DefaultCamelContext()) {
+ setup.accept(context);
+
PluginHelper.getRoutesLoader(context).loadRoutes(ResourceHelper.fromString("routes.yaml",
yaml));
+ context.start();
+ return call.apply(context);
+ }
+ }
+
+ /** Loads the routes and rests, and dumps them back as YAML, as the route
dump does. */
+ private static String dump(String yaml, Consumer<CamelContext> setup)
throws Exception {
+ try (DefaultCamelContext context = new DefaultCamelContext()) {
+ setup.accept(context);
+
PluginHelper.getRoutesLoader(context).loadRoutes(ResourceHelper.fromString("routes.yaml",
yaml));
+ ModelCamelContext model = (ModelCamelContext) context;
+ StringBuilder sb = new StringBuilder();
+ if (!model.getRestDefinitions().isEmpty()) {
+ RestsDefinition rests = new RestsDefinition();
+ rests.getRests().addAll(model.getRestDefinitions());
+ sb.append(new LwModelToYAMLDumper().dumpModelAsYaml(context,
rests)).append('\n');
+ }
+ RoutesDefinition routes = new RoutesDefinition();
+ model.getRouteDefinitions().stream().filter(r ->
!Boolean.TRUE.equals(r.isRest()))
+ .forEach(routes.getRoutes()::add);
+ return sb.append(new
LwModelToYAMLDumper().dumpModelAsYaml(context, routes)).toString();
+ }
+ }
+}
diff --git
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelWriterGeneratorMojo.java
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelWriterGeneratorMojo.java
index f375993b12de..c772156f0289 100644
---
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelWriterGeneratorMojo.java
+++
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelWriterGeneratorMojo.java
@@ -39,6 +39,7 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
+import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
@@ -493,6 +494,33 @@ public abstract class ModelWriterGeneratorMojo extends
AbstractGeneratorMojo {
}
public static class Property {
+
+ /**
+ * The model classes of which every option is written whenever it is
set, even to its documented default value:
+ * an onException copies the error handler's redelivery policy and
overrides only the options that are set, and
+ * a circuit breaker configuration is layered over the global one, so
"not set" means "the value of the parent
+ * level", not "the default value", and a dump that leaves such an
option out runs differently once loaded.
+ */
+ private static final Set<String> INHERITED_OPTION_CLASSES = Set.of(
+ "org.apache.camel.model.RedeliveryPolicyDefinition",
+ "org.apache.camel.model.Resilience4jConfigurationCommon",
+ "org.apache.camel.model.FaultToleranceConfigurationCommon");
+
+ /**
+ * The options (declaring class and attribute name) that are written
whenever they are set, for the same reason:
+ * the rest binding options of a verb take the value of its rest, then
of the rest configuration, which in turn
+ * falls back to the RestConfiguration of the CamelContext; the
shutdown options of a route take the value of
+ * the CamelContext.
+ */
+ private static final Set<String> INHERITED_OPTIONS = Stream.concat(
+ Stream.of("RestDefinition", "VerbDefinition",
"RestBindingDefinition", "RestConfigurationDefinition")
+ .flatMap(c -> Stream.of("bindingMode",
"skipBindingOnErrorCode", "clientRequestValidation",
+ "clientResponseValidation", "enableCORS",
"enableNoContentResponse")
+ .map(o -> "org.apache.camel.model.rest." + c +
"#" + o)),
+
Stream.of("org.apache.camel.model.RouteDefinition#shutdownRoute",
+
"org.apache.camel.model.RouteDefinition#shutdownRunningTask"))
+ .collect(Collectors.toUnmodifiableSet());
+
private final Member field;
private final Member getter;
private final Member setter;
@@ -618,7 +646,27 @@ public abstract class ModelWriterGeneratorMojo extends
AbstractGeneratorMojo {
return an;
}
+ /**
+ * Whether "not set" means "the value of a parent level" for this
option, see {@link #INHERITED_OPTIONS}.
+ */
+ public boolean isInheritedOption() {
+ Member declaring = field != null ? field :
members().findFirst().orElse(null);
+ if (declaring == null) {
+ return false;
+ }
+ String className = declaring.getDeclaringClass().getName();
+ return INHERITED_OPTION_CLASSES.contains(className) ||
INHERITED_OPTIONS.contains(className + "#" + getName());
+ }
+
+ /**
+ * The default value as a Java literal, which the writers leave out,
or the literal {@code null} when the option
+ * is always written when set (no default value, or an inherited
option).
+ */
public String getDefaultValue() {
+ if (isInheritedOption()) {
+ // written whenever it is set, as "not set" means "the value
of a parent level"
+ return "null";
+ }
String answer = null;
Metadata m = getAnnotation(Metadata.class);
if (m != null) {