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 b5ffeeafc2a9 CAMEL-23017: camel-core - WireTap EIP should not have
pattern option (#21494)
b5ffeeafc2a9 is described below
commit b5ffeeafc2a9ac264e70061d605c6b4c23e1f39b
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Feb 16 19:06:00 2026 +0100
CAMEL-23017: camel-core - WireTap EIP should not have pattern option
(#21494)
---
.../org/apache/camel/catalog/models/wireTap.json | 9 ++-
.../main/docs/modules/eips/pages/sample-eip.adoc | 69 +++++++++++++++++++++-
.../META-INF/org/apache/camel/model/wireTap.json | 9 ++-
.../apache/camel/model/ProcessorDefinition.java | 4 +-
.../org/apache/camel/model/WireTapDefinition.java | 5 +-
.../apache/camel/processor/WireTapProcessor.java | 8 +--
.../org/apache/camel/reifier/WireTapReifier.java | 8 +--
.../camel/processor/SamplingThrottlerTest.java | 3 +-
.../apache/camel/processor/WireTapPatternTest.java | 55 +++++++++++++++++
.../ROOT/pages/camel-4x-upgrade-guide-4_19.adoc | 19 ++++++
.../modules/ROOT/pages/camel-4x-upgrade-guide.adoc | 1 +
.../src/main/resources/templates/code-java.tmpl | 1 +
.../dsl/yaml/deserializers/ModelDeserializers.java | 6 --
.../dsl/yaml/GenerateYamlDeserializersMojo.java | 4 ++
.../maven/dsl/yaml/GenerateYamlSchemaMojo.java | 13 ++++
.../generated/resources/schema/camelYamlDsl.json | 6 --
.../camel/maven/packaging/SchemaGeneratorMojo.java | 14 ++++-
17 files changed, 192 insertions(+), 42 deletions(-)
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/wireTap.json
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/wireTap.json
index 882f6e29b69d..90d59b572270 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/wireTap.json
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/wireTap.json
@@ -23,11 +23,10 @@
"uri": { "index": 8, "kind": "attribute", "displayName": "Uri", "group":
"common", "required": true, "type": "string", "javaType": "java.lang.String",
"deprecated": false, "autowired": false, "secret": false, "description": "The
uri of the endpoint to send to. The uri can be dynamic computed using the
org.apache.camel.language.simple.SimpleLanguage expression." },
"variableSend": { "index": 9, "kind": "attribute", "displayName":
"Variable Send", "group": "common", "required": false, "type": "string",
"javaType": "java.lang.String", "deprecated": false, "autowired": false,
"secret": false, "description": "To use a variable as the source for the
message body to send. This makes it handy to use variables for user data and to
easily control what data to use for sending and receiving. Important: When
using send variable then the message body is tak [...]
"variableReceive": { "index": 10, "kind": "attribute", "displayName":
"Variable Receive", "group": "common", "required": false, "type": "string",
"javaType": "java.lang.String", "deprecated": false, "autowired": false,
"secret": false, "description": "To use a variable as the source for the
message body to send. This makes it handy to use variables for user data and to
easily control what data to use for sending and receiving. Important: When
using send variable then the message body [...]
- "pattern": { "index": 11, "kind": "attribute", "displayName": "Pattern",
"group": "advanced", "label": "advanced", "required": false, "type": "enum",
"javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ],
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
the optional ExchangePattern used to invoke this endpoint" },
- "cacheSize": { "index": 12, "kind": "attribute", "displayName": "Cache
Size", "group": "advanced", "label": "advanced", "required": false, "type":
"integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired":
false, "secret": false, "description": "Sets the maximum size used by the
org.apache.camel.spi.ProducerCache which is used to cache and reuse producers
when using this recipient list, when uris are reused. Beware that when using
dynamic endpoints then it affects [...]
- "ignoreInvalidEndpoint": { "index": 13, "kind": "attribute",
"displayName": "Ignore Invalid Endpoint", "group": "advanced", "label":
"advanced", "required": false, "type": "boolean", "javaType":
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether to ignore invalid endpoint URIs
and skip sending the message." },
- "allowOptimisedComponents": { "index": 14, "kind": "attribute",
"displayName": "Allow Optimised Components", "group": "advanced", "label":
"advanced", "required": false, "type": "boolean", "javaType":
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": true, "description": "Whether to allow components to optimise
toD if they are org.apache.camel.spi.SendDynamicAware ." },
- "autoStartComponents": { "index": 15, "kind": "attribute", "displayName":
"Auto Start Components", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether to auto startup components when toD is starting up." }
+ "cacheSize": { "index": 11, "kind": "attribute", "displayName": "Cache
Size", "group": "advanced", "label": "advanced", "required": false, "type":
"integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired":
false, "secret": false, "description": "Sets the maximum size used by the
org.apache.camel.spi.ProducerCache which is used to cache and reuse producers
when using this recipient list, when uris are reused. Beware that when using
dynamic endpoints then it affects [...]
+ "ignoreInvalidEndpoint": { "index": 12, "kind": "attribute",
"displayName": "Ignore Invalid Endpoint", "group": "advanced", "label":
"advanced", "required": false, "type": "boolean", "javaType":
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether to ignore invalid endpoint URIs
and skip sending the message." },
+ "allowOptimisedComponents": { "index": 13, "kind": "attribute",
"displayName": "Allow Optimised Components", "group": "advanced", "label":
"advanced", "required": false, "type": "boolean", "javaType":
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": true, "description": "Whether to allow components to optimise
toD if they are org.apache.camel.spi.SendDynamicAware ." },
+ "autoStartComponents": { "index": 14, "kind": "attribute", "displayName":
"Auto Start Components", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether to auto startup components when toD is starting up." }
},
"exchangeProperties": {
"CamelToEndpoint": { "index": 0, "kind": "exchangeProperty",
"displayName": "To Endpoint", "label": "producer", "required": false,
"javaType": "String", "deprecated": false, "autowired": false, "secret": false,
"description": "Endpoint URI where this Exchange is being sent to" }
diff --git
a/core/camel-core-engine/src/main/docs/modules/eips/pages/sample-eip.adoc
b/core/camel-core-engine/src/main/docs/modules/eips/pages/sample-eip.adoc
index cbe0fb955301..329b834983dc 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/pages/sample-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/sample-eip.adoc
@@ -50,6 +50,19 @@ XML::
<to uri="direct:sampled"/>
</route>
----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+ from:
+ uri: direct:sample
+ steps:
+ - sample: {}
+ - to:
+ uri: direct:sampled
+----
====
=== Sampling using time period
@@ -64,7 +77,7 @@ Java::
[source,java]
----
from("direct:sample")
- .sample(Duration.of(5, ChronoUnit.SECONDS))
+ .sample(Duration.ofSeconds(5))
.to("direct:sampled");
----
@@ -74,10 +87,24 @@ XML::
----
<route>
<from uri="direct:sample"/>
- <sample samplePeriod="5000"/>
+ <sample samplePeriod="5s"/>
<to uri="direct:sampled"/>
</route>
----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+ from:
+ uri: direct:sample
+ steps:
+ - sample:
+ samplePeriod: 5s
+ - to:
+ uri: direct:sampled
+----
====
=== Sampling using message frequency
@@ -107,6 +134,20 @@ XML::
<to uri="direct:sampled"/>
</route>
----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+ from:
+ uri: direct:sample
+ steps:
+ - sample:
+ messageFrequency: 10
+ - to:
+ uri: direct:sampled
+----
====
=== Sampling with wiretap
@@ -125,7 +166,7 @@ Java::
----
from("direct:start")
.wireTap("direct:sample")
- .to("direct:regularProcessing")
+ .to("direct:regularProcessing");
from("direct:sample")
.sample(10)
@@ -148,4 +189,26 @@ XML::
<to uri="direct:sampleProcessing"/>
</route>
----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+ from:
+ uri: direct:start
+ steps:
+ - wireTap:
+ uri: direct:sample
+ - to:
+ uri: direct:regularProcessing
+- route:
+ from:
+ uri: direct:sample
+ steps:
+ - sample:
+ messageFrequency: 10
+ - to:
+ uri: direct:sampleProcessing
+----
====
diff --git
a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/wireTap.json
b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/wireTap.json
index 882f6e29b69d..90d59b572270 100644
---
a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/wireTap.json
+++
b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/wireTap.json
@@ -23,11 +23,10 @@
"uri": { "index": 8, "kind": "attribute", "displayName": "Uri", "group":
"common", "required": true, "type": "string", "javaType": "java.lang.String",
"deprecated": false, "autowired": false, "secret": false, "description": "The
uri of the endpoint to send to. The uri can be dynamic computed using the
org.apache.camel.language.simple.SimpleLanguage expression." },
"variableSend": { "index": 9, "kind": "attribute", "displayName":
"Variable Send", "group": "common", "required": false, "type": "string",
"javaType": "java.lang.String", "deprecated": false, "autowired": false,
"secret": false, "description": "To use a variable as the source for the
message body to send. This makes it handy to use variables for user data and to
easily control what data to use for sending and receiving. Important: When
using send variable then the message body is tak [...]
"variableReceive": { "index": 10, "kind": "attribute", "displayName":
"Variable Receive", "group": "common", "required": false, "type": "string",
"javaType": "java.lang.String", "deprecated": false, "autowired": false,
"secret": false, "description": "To use a variable as the source for the
message body to send. This makes it handy to use variables for user data and to
easily control what data to use for sending and receiving. Important: When
using send variable then the message body [...]
- "pattern": { "index": 11, "kind": "attribute", "displayName": "Pattern",
"group": "advanced", "label": "advanced", "required": false, "type": "enum",
"javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ],
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
the optional ExchangePattern used to invoke this endpoint" },
- "cacheSize": { "index": 12, "kind": "attribute", "displayName": "Cache
Size", "group": "advanced", "label": "advanced", "required": false, "type":
"integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired":
false, "secret": false, "description": "Sets the maximum size used by the
org.apache.camel.spi.ProducerCache which is used to cache and reuse producers
when using this recipient list, when uris are reused. Beware that when using
dynamic endpoints then it affects [...]
- "ignoreInvalidEndpoint": { "index": 13, "kind": "attribute",
"displayName": "Ignore Invalid Endpoint", "group": "advanced", "label":
"advanced", "required": false, "type": "boolean", "javaType":
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether to ignore invalid endpoint URIs
and skip sending the message." },
- "allowOptimisedComponents": { "index": 14, "kind": "attribute",
"displayName": "Allow Optimised Components", "group": "advanced", "label":
"advanced", "required": false, "type": "boolean", "javaType":
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": true, "description": "Whether to allow components to optimise
toD if they are org.apache.camel.spi.SendDynamicAware ." },
- "autoStartComponents": { "index": 15, "kind": "attribute", "displayName":
"Auto Start Components", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether to auto startup components when toD is starting up." }
+ "cacheSize": { "index": 11, "kind": "attribute", "displayName": "Cache
Size", "group": "advanced", "label": "advanced", "required": false, "type":
"integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired":
false, "secret": false, "description": "Sets the maximum size used by the
org.apache.camel.spi.ProducerCache which is used to cache and reuse producers
when using this recipient list, when uris are reused. Beware that when using
dynamic endpoints then it affects [...]
+ "ignoreInvalidEndpoint": { "index": 12, "kind": "attribute",
"displayName": "Ignore Invalid Endpoint", "group": "advanced", "label":
"advanced", "required": false, "type": "boolean", "javaType":
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether to ignore invalid endpoint URIs
and skip sending the message." },
+ "allowOptimisedComponents": { "index": 13, "kind": "attribute",
"displayName": "Allow Optimised Components", "group": "advanced", "label":
"advanced", "required": false, "type": "boolean", "javaType":
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": true, "description": "Whether to allow components to optimise
toD if they are org.apache.camel.spi.SendDynamicAware ." },
+ "autoStartComponents": { "index": 14, "kind": "attribute", "displayName":
"Auto Start Components", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether to auto startup components when toD is starting up." }
},
"exchangeProperties": {
"CamelToEndpoint": { "index": 0, "kind": "exchangeProperty",
"displayName": "To Endpoint", "label": "producer", "required": false,
"javaType": "String", "deprecated": false, "autowired": false, "secret": false,
"description": "Endpoint URI where this Exchange is being sent to" }
diff --git
a/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java
b/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java
index 8cd6f8271c31..64a51fe942a5 100644
---
a/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java
+++
b/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java
@@ -1829,7 +1829,9 @@ public abstract class ProcessorDefinition<Type extends
ProcessorDefinition<Type>
* @return the builder
*/
public SamplingDefinition sample() {
- return sample(Duration.ofSeconds(1));
+ SamplingDefinition answer = new SamplingDefinition();
+ addOutput(answer);
+ return answer;
}
/**
diff --git
a/core/camel-core-model/src/main/java/org/apache/camel/model/WireTapDefinition.java
b/core/camel-core-model/src/main/java/org/apache/camel/model/WireTapDefinition.java
index f214b23fdf05..7a155184c508 100644
---
a/core/camel-core-model/src/main/java/org/apache/camel/model/WireTapDefinition.java
+++
b/core/camel-core-model/src/main/java/org/apache/camel/model/WireTapDefinition.java
@@ -24,7 +24,6 @@ import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlTransient;
-import org.apache.camel.ExchangePattern;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import org.apache.camel.spi.Metadata;
@@ -33,7 +32,7 @@ import org.apache.camel.spi.Metadata;
* Routes a copy of a message (or creates a new message) to a secondary
destination while continue routing the original
* message.
*/
-@Metadata(label = "eip,routing")
+@Metadata(label = "eip,routing", excludeProperties = "pattern")
@XmlRootElement(name = "wireTap")
@XmlAccessorType(XmlAccessType.FIELD)
public class WireTapDefinition<Type extends ProcessorDefinition<Type>> extends
ToDynamicDefinition
@@ -72,7 +71,7 @@ public class WireTapDefinition<Type extends
ProcessorDefinition<Type>> extends T
@Override
public String getPattern() {
- return ExchangePattern.InOnly.name();
+ return null; // not in use
}
@Override
diff --git
a/core/camel-core-processor/src/main/java/org/apache/camel/processor/WireTapProcessor.java
b/core/camel-core-processor/src/main/java/org/apache/camel/processor/WireTapProcessor.java
index a1a911228274..59a18a5976ae 100644
---
a/core/camel-core-processor/src/main/java/org/apache/camel/processor/WireTapProcessor.java
+++
b/core/camel-core-processor/src/main/java/org/apache/camel/processor/WireTapProcessor.java
@@ -60,7 +60,6 @@ public class WireTapProcessor extends BaseProcessorSupport
private final boolean dynamicUri;
private final Processor processor;
private final AsyncProcessor asyncProcessor;
- private final ExchangePattern exchangePattern;
private final boolean copy;
private final ExecutorService executorService;
private final boolean shutdownExecutorService;
@@ -70,13 +69,12 @@ public class WireTapProcessor extends BaseProcessorSupport
private Processor onPrepare;
public WireTapProcessor(SendDynamicProcessor dynamicSendProcessor,
Processor processor, String uri,
- ExchangePattern exchangePattern, boolean copy,
+ boolean copy,
ExecutorService executorService, boolean
shutdownExecutorService, boolean dynamicUri) {
this.dynamicSendProcessor = dynamicSendProcessor;
this.uri = uri;
this.processor = processor;
this.asyncProcessor = AsyncProcessorConverterHelper.convert(processor);
- this.exchangePattern = exchangePattern;
this.copy = copy;
ObjectHelper.notNull(executorService, "executorService");
this.executorService = executorService;
@@ -190,7 +188,7 @@ public class WireTapProcessor extends BaseProcessorSupport
// must configure the wire tap beforehand
Exchange target;
try {
- target = configureExchange(exchange, exchangePattern);
+ target = configureExchange(exchange);
} catch (Exception e) {
exchange.setException(e);
callback.done(true);
@@ -214,7 +212,7 @@ public class WireTapProcessor extends BaseProcessorSupport
return true;
}
- protected Exchange configureExchange(Exchange exchange, ExchangePattern
pattern) throws IOException {
+ protected Exchange configureExchange(Exchange exchange) throws IOException
{
Exchange answer;
if (copy) {
// use a copy of the original exchange
diff --git
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/WireTapReifier.java
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/WireTapReifier.java
index 5e4e2abf2d4a..57cd5604e1ff 100644
---
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/WireTapReifier.java
+++
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/WireTapReifier.java
@@ -50,9 +50,6 @@ public class WireTapReifier extends
ToDynamicReifier<WireTapDefinition<?>> {
throw new IllegalArgumentException("WireTap does not support
variableReceive");
}
- // must use InOnly for WireTap
- definition.setPattern(ExchangePattern.InOnly.name());
-
// executor service is mandatory for wire tap
boolean shutdownThreadPool = willCreateNewThreadPool(definition, true);
ExecutorService threadPool = getConfiguredExecutorService("WireTap",
definition, true);
@@ -79,6 +76,8 @@ public class WireTapReifier extends
ToDynamicReifier<WireTapDefinition<?>> {
if (dynamic && simple || invalid) {
// dynamic or ignore-invalid so we need the dynamic send processor
dynamicSendProcessor = (SendDynamicProcessor)
super.createProcessor();
+ // must use InOnly pattern
+ dynamicSendProcessor.setPattern(ExchangePattern.InOnly);
} else {
// static so we can use a plain send processor
Endpoint endpoint =
CamelContextHelper.resolveEndpoint(camelContext, uri, null);
@@ -100,8 +99,7 @@ public class WireTapReifier extends
ToDynamicReifier<WireTapDefinition<?>> {
boolean isCopy = parseBoolean(definition.getCopy(), true);
WireTapProcessor answer = new WireTapProcessor(
- dynamicSendProcessor, target, uri,
- parse(ExchangePattern.class, definition.getPattern()), isCopy,
+ dynamicSendProcessor, target, uri, isCopy,
threadPool, shutdownThreadPool, dynamic);
answer.setDisabled(isDisabled(camelContext, definition));
Processor prepare = definition.getOnPrepareProcessor();
diff --git
a/core/camel-core/src/test/java/org/apache/camel/processor/SamplingThrottlerTest.java
b/core/camel-core/src/test/java/org/apache/camel/processor/SamplingThrottlerTest.java
index f22eefe392a0..dc5a5193c735 100644
---
a/core/camel-core/src/test/java/org/apache/camel/processor/SamplingThrottlerTest.java
+++
b/core/camel-core/src/test/java/org/apache/camel/processor/SamplingThrottlerTest.java
@@ -17,7 +17,6 @@
package org.apache.camel.processor;
import java.time.Duration;
-import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -166,7 +165,7 @@ public class SamplingThrottlerTest extends
ContextTestSupport {
from("direct:sample-configured").sample("1000").to("mock:result");
- from("direct:sample-configured-via-dsl").sample(Duration.of(1,
ChronoUnit.SECONDS)).to("mock:result");
+
from("direct:sample-configured-via-dsl").sample(Duration.ofSeconds(1)).to("mock:result");
from("direct:sample-messageFrequency").sample(10).to("mock:result");
diff --git
a/core/camel-core/src/test/java/org/apache/camel/processor/WireTapPatternTest.java
b/core/camel-core/src/test/java/org/apache/camel/processor/WireTapPatternTest.java
new file mode 100644
index 000000000000..ccf0ed5282ca
--- /dev/null
+++
b/core/camel-core/src/test/java/org/apache/camel/processor/WireTapPatternTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class WireTapPatternTest extends ContextTestSupport {
+
+ @Test
+ public void testWireTapPattern() throws Exception {
+ getMockEndpoint("mock:result").expectedMessageCount(1);
+ getMockEndpoint("mock:tap").expectedMessageCount(1);
+
+ template.sendBody("direct:start", "Hello World");
+
+ assertMockEndpointsSatisfied();
+
+ Assertions.assertEquals(ExchangePattern.InOut,
+
getMockEndpoint("mock:result").getReceivedExchanges().get(0).getPattern());
+ Assertions.assertEquals(ExchangePattern.InOnly,
getMockEndpoint("mock:tap").getReceivedExchanges().get(0).getPattern());
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() {
+ return new RouteBuilder() {
+ public void configure() {
+ from("direct:start")
+ .setExchangePattern(ExchangePattern.InOut)
+ .wireTap("direct:tap")
+ .to("mock:result");
+
+ from("direct:tap")
+ .to("mock:tap");
+ }
+ };
+ }
+}
diff --git
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_19.adoc
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_19.adoc
new file mode 100644
index 000000000000..4f277bad8a04
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_19.adoc
@@ -0,0 +1,19 @@
+= Apache Camel 4.x Upgrade Guide
+
+This document is for helping you upgrade your Apache Camel application
+from Camel 4.x to 4.y. For example, if you are upgrading Camel 4.0 to 4.2,
then you should follow the guides
+from both 4.0 to 4.1 and 4.1 to 4.2.
+
+[NOTE]
+====
+https://github.com/apache/camel-upgrade-recipes/[The Camel Upgrade Recipes
project] provides automated assistance for some common migration tasks.
+Note that manual migration is still required.
+See the xref:camel-upgrade-recipes-tool.adoc[documentation] page for details.
+====
+
+== Upgrading Camel 4.18 to 4.19
+
+=== camel-core
+
+The WireTap EIP has removed the `pattern` option from its model (not in use)
as wiretap always
+uses `InOnly` pattern.
diff --git a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide.adoc
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide.adoc
index f30900ded3a6..2367b6b0acd7 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide.adoc
@@ -27,6 +27,7 @@ You can find the upgrade guide for each release in the
following pages:
- xref:camel-4x-upgrade-guide-4_16.adoc[Upgrade guide 4.15 -> 4.16]
- xref:camel-4x-upgrade-guide-4_17.adoc[Upgrade guide 4.16 -> 4.17]
- xref:camel-4x-upgrade-guide-4_18.adoc[Upgrade guide 4.17 -> 4.18]
+- xref:camel-4x-upgrade-guide-4_19.adoc[Upgrade guide 4.18 -> 4.19]
[NOTE]
====
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/code-java.tmpl
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/code-java.tmpl
index a2427fdcf288..cb8e1328fb28 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/code-java.tmpl
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/code-java.tmpl
@@ -1,3 +1,4 @@
+import java.time.*;
import java.util.*;
import java.util.concurrent.*;
diff --git
a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
index 36b706cf8aa7..98af5f3327b3 100644
---
a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
+++
b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
@@ -21595,7 +21595,6 @@ public final class ModelDeserializers extends
YamlDeserializerSupport {
@YamlProperty(name = "note", type = "string", description
= "Sets the note of this node", displayName = "Note"),
@YamlProperty(name = "onPrepare", type = "string",
description = "Uses the Processor when preparing the org.apache.camel.Exchange
to be sent. This can be used to deep-clone messages that should be sent, or any
custom logic needed before the exchange is sent.", displayName = "On Prepare"),
@YamlProperty(name = "parameters", type = "object"),
- @YamlProperty(name = "pattern", type =
"enum:InOnly,InOut", description = "Sets the optional ExchangePattern used to
invoke this endpoint", displayName = "Pattern"),
@YamlProperty(name = "uri", type = "string", required =
true, description = "The uri of the endpoint to send to. The uri can be dynamic
computed using the org.apache.camel.language.simple.SimpleLanguage
expression.", displayName = "Uri"),
@YamlProperty(name = "variableReceive", type = "string",
description = "To use a variable as the source for the message body to send.
This makes it handy to use variables for user data and to easily control what
data to use for sending and receiving. Important: When using send variable then
the message body is taken from this variable instead of the current Message ,
however the headers from the Message will still be used as well. In other
words, the variable is used [...]
@YamlProperty(name = "variableSend", type = "string",
description = "To use a variable as the source for the message body to send.
This makes it handy to use variables for user data and to easily control what
data to use for sending and receiving. Important: When using send variable then
the message body is taken from this variable instead of the current message,
however the headers from the message will still be used as well. In other
words, the variable is used inst [...]
@@ -21667,11 +21666,6 @@ public final class ModelDeserializers extends
YamlDeserializerSupport {
target.setOnPrepare(val);
break;
}
- case "pattern": {
- String val = asText(node);
- target.setPattern(val);
- break;
- }
case "uri": {
String val = asText(node);
target.setUri(val);
diff --git
a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java
b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java
index c7a82dc08979..3468f481895f 100644
---
a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java
+++
b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java
@@ -948,6 +948,10 @@ public class GenerateYamlDeserializersMojo extends
GenerateYamlSupportMojo {
// which should be skipped
return true;
}
+ // we want to skip pattern from wiretap
+ if ("pattern".equals(fieldName) && "wireTap".equals(modelName)) {
+ return true;
+ }
//
// Others
diff --git
a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlSchemaMojo.java
b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlSchemaMojo.java
index 46c3f031f91a..a1d6f9328926 100644
---
a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlSchemaMojo.java
+++
b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlSchemaMojo.java
@@ -296,6 +296,19 @@ public class GenerateYamlSchemaMojo extends
GenerateYamlSupportMojo {
}
}
}
+ // we want to skip pattern from wiretap
+ if (propertyName.equals("pattern")) {
+ Optional<AnnotationValue> av = annotationValue(info,
YAML_TYPE_ANNOTATION, "nodes");
+ if (av.isPresent()) {
+ String[] sn = av.get().asStringArray();
+ for (String n : sn) {
+ if ("wire-tap".equals(n) || "wireTap".equals(n)) {
+ skip = true;
+ break;
+ }
+ }
+ }
+ }
if (skip) {
continue;
}
diff --git
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
index 5a11dc7d76b7..229bac40f092 100644
---
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
+++
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
@@ -9274,12 +9274,6 @@
"parameters" : {
"type" : "object"
},
- "pattern" : {
- "type" : "string",
- "title" : "Pattern",
- "description" : "Sets the optional ExchangePattern used to invoke
this endpoint",
- "enum" : [ "InOnly", "InOut" ]
- },
"uri" : {
"type" : "string",
"title" : "Uri",
diff --git
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SchemaGeneratorMojo.java
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SchemaGeneratorMojo.java
index a2b33e87fe3d..2a889de984ae 100644
---
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SchemaGeneratorMojo.java
+++
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SchemaGeneratorMojo.java
@@ -27,6 +27,7 @@ import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
@@ -266,12 +267,23 @@ public class SchemaGeneratorMojo extends
AbstractGeneratorMojo {
Set<EipOptionModel> eipOptions = new TreeSet<>(new
EipOptionComparator(eipModel));
findClassProperties(eipOptions, classElement, classElement, "", name);
- eipOptions.forEach(eipModel::addOption);
+ // the EIP may exclude some options
+ String excludedProperties = "";
+ Metadata componentMetadata =
classElement.getAnnotation(Metadata.class);
+ if (componentMetadata != null) {
+ excludedProperties = componentMetadata.excludeProperties();
+ }
+ Set<String> excluded = new HashSet<>();
+ Collections.addAll(excluded, excludedProperties.split(","));
+
eipOptions.forEach(o -> {
// compute group based on label for each option
String group = EndpointHelper.labelAsGroupName(o.getLabel(),
false, false);
o.setGroup(group);
});
+ eipOptions.stream()
+ .filter(option -> !excluded.contains(option.getName()))
+ .forEach(eipModel::addOption);
// after we have found all the options then figure out if the model
// accepts input/output