This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch once in repository https://gitbox.apache.org/repos/asf/camel.git
commit eed3b8da4a9327584d106700513ce95c3969ccb5 Author: Claus Ibsen <[email protected]> AuthorDate: Thu Dec 18 11:07:11 2025 +0100 CAMEL-22431: camel-once - A component for development to trigger only once --- .../component/once/OnceEndpointConfigurer.java | 4 +-- .../org/apache/camel/component/once/once.json | 4 +-- .../apache/camel/component/once/OnceComponent.java | 30 ++++++++++++++++++++-- .../apache/camel/component/once/OnceEndpoint.java | 12 ++++----- .../camel-yaml-dsl/src/main/docs/yaml-dsl.adoc | 8 +++--- 5 files changed, 42 insertions(+), 16 deletions(-) diff --git a/components/camel-once/src/generated/java/org/apache/camel/component/once/OnceEndpointConfigurer.java b/components/camel-once/src/generated/java/org/apache/camel/component/once/OnceEndpointConfigurer.java index ab494fa200b2..429f04d53e20 100644 --- a/components/camel-once/src/generated/java/org/apache/camel/component/once/OnceEndpointConfigurer.java +++ b/components/camel-once/src/generated/java/org/apache/camel/component/once/OnceEndpointConfigurer.java @@ -75,8 +75,8 @@ public class OnceEndpointConfigurer extends PropertyConfigurerSupport implements @Override public Object getCollectionValueType(Object target, String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { - case "headers": return java.lang.Object.class; - case "variables": return java.lang.Object.class; + case "headers": return java.lang.String.class; + case "variables": return java.lang.String.class; default: return null; } } diff --git a/components/camel-once/src/generated/resources/META-INF/org/apache/camel/component/once/once.json b/components/camel-once/src/generated/resources/META-INF/org/apache/camel/component/once/once.json index 881706bc8d62..ad5cb5270114 100644 --- a/components/camel-once/src/generated/resources/META-INF/org/apache/camel/component/once/once.json +++ b/components/camel-once/src/generated/resources/META-INF/org/apache/camel/component/once/once.json @@ -32,11 +32,11 @@ "properties": { "name": { "index": 0, "kind": "path", "displayName": "Name", "group": "consumer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The logical name" }, "body": { "index": 1, "kind": "parameter", "displayName": "Body", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "supportFileReference": true, "description": "The data to use as message body. You can externalize the data by using file: or classpath: as prefix and specify the location of the file." }, - "headers": { "index": 2, "kind": "parameter", "displayName": "Headers", "group": "consumer", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "header.", "multiValue": true, "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "supportFileReference": true, "description": "The data to use as message headers as key=value pairs. You can externalize the data by using file: or classpath: [...] + "headers": { "index": 2, "kind": "parameter", "displayName": "Headers", "group": "consumer", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.String>", "prefix": "header.", "multiValue": true, "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "supportFileReference": true, "description": "The data to use as message headers as key=value pairs. You can externalize the data by using file: or classpath: [...] "bridgeErrorHandler": { "index": 3, "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming [...] "exceptionHandler": { "index": 4, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By def [...] "exchangePattern": { "index": 5, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." }, "delay": { "index": 6, "kind": "parameter", "displayName": "Delay", "group": "advanced", "label": "advanced", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, "description": "The number of milliseconds to wait before triggering. The default value is 1000." }, - "variables": { "index": 7, "kind": "parameter", "displayName": "Variables", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "variable.", "multiValue": true, "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "supportFileReference": true, "description": "The data to use as exchange variables as key=value pairs. You can externalize the data by using fi [...] + "variables": { "index": 7, "kind": "parameter", "displayName": "Variables", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.String>", "prefix": "variable.", "multiValue": true, "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "supportFileReference": true, "description": "The data to use as exchange variables as key=value pairs. You can externalize the data by using fi [...] } } diff --git a/components/camel-once/src/main/java/org/apache/camel/component/once/OnceComponent.java b/components/camel-once/src/main/java/org/apache/camel/component/once/OnceComponent.java index 8b2849f07c3e..fd4a9f2df334 100644 --- a/components/camel-once/src/main/java/org/apache/camel/component/once/OnceComponent.java +++ b/components/camel-once/src/main/java/org/apache/camel/component/once/OnceComponent.java @@ -16,6 +16,7 @@ */ package org.apache.camel.component.once; +import java.util.LinkedHashMap; import java.util.Map; import org.apache.camel.Endpoint; @@ -37,8 +38,33 @@ public class OnceComponent extends DefaultComponent { protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception { OnceEndpoint answer = new OnceEndpoint(uri, this, remaining); answer.setDelay(delay); - answer.setHeaders(PropertiesHelper.extractProperties(parameters, "header.")); - answer.setVariables(PropertiesHelper.extractProperties(parameters, "variable.")); + + Map<String, String> headers = getAndRemoveOrResolveReferenceParameter(parameters, "headers", Map.class); + Map<String, Object> map = PropertiesHelper.extractProperties(parameters, "header."); + if (map != null && !map.isEmpty()) { + if (headers == null) { + headers = new LinkedHashMap<>(); + } + for (Map.Entry<String, Object> me : map.entrySet()) { + headers.put(me.getKey(), me.getValue().toString()); + } + } + if (headers != null && !headers.isEmpty()) { + answer.setHeaders(headers); + } + Map<String, String> variables = getAndRemoveOrResolveReferenceParameter(parameters, "variables", Map.class); + map = PropertiesHelper.extractProperties(parameters, "variable."); + if (map != null && !map.isEmpty()) { + if (variables == null) { + variables = new LinkedHashMap<>(); + } + for (Map.Entry<String, Object> me : map.entrySet()) { + variables.put(me.getKey(), me.getValue().toString()); + } + } + if (variables != null && !variables.isEmpty()) { + answer.setVariables(variables); + } setProperties(answer, parameters); return answer; } diff --git a/components/camel-once/src/main/java/org/apache/camel/component/once/OnceEndpoint.java b/components/camel-once/src/main/java/org/apache/camel/component/once/OnceEndpoint.java index 997a22ef5a40..0960eb47b74b 100644 --- a/components/camel-once/src/main/java/org/apache/camel/component/once/OnceEndpoint.java +++ b/components/camel-once/src/main/java/org/apache/camel/component/once/OnceEndpoint.java @@ -44,10 +44,10 @@ public class OnceEndpoint extends DefaultEndpoint { private String body; @UriParam(multiValue = true, prefix = "header.") @Metadata(supportFileReference = true) - private Map<String, Object> headers; + private Map<String, String> headers; @UriParam(label = "advanced", multiValue = true, prefix = "variable.") @Metadata(supportFileReference = true) - private Map<String, Object> variables; + private Map<String, String> variables; public OnceEndpoint() { } @@ -119,15 +119,15 @@ public class OnceEndpoint extends DefaultEndpoint { * The data to use as message headers as key=value pairs. You can externalize the data by using file: or classpath: * as prefix and specify the location of the file. */ - public Map<String, Object> getHeaders() { + public Map<String, String> getHeaders() { return headers; } - public void setHeaders(Map<String, Object> headers) { + public void setHeaders(Map<String, String> headers) { this.headers = headers; } - public Map<String, Object> getVariables() { + public Map<String, String> getVariables() { return variables; } @@ -135,7 +135,7 @@ public class OnceEndpoint extends DefaultEndpoint { * The data to use as exchange variables as key=value pairs. You can externalize the data by using file: or * classpath: as prefix and specify the location of the file. */ - public void setVariables(Map<String, Object> variables) { + public void setVariables(Map<String, String> variables) { this.variables = variables; } } diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/docs/yaml-dsl.adoc b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/docs/yaml-dsl.adoc index 39613b850240..ce35c681d64c 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/docs/yaml-dsl.adoc +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/docs/yaml-dsl.adoc @@ -139,18 +139,18 @@ To define an endpoint with the YAML dsl you have two options: *Available as of Camel 4.15* It is now possible to inline Maps in the `parameters` section. However Camel components rarely have options -that are Map based, but when they do this makes it easier to use. For example the plc4j component allow to +that are Map based, but when they do this makes it easier to use. For example the plc4x component allow to configure _tags_ as a Map: [source,yaml] ---- - from: - uri: "timer://tick" + uri: "timer:tick" parameters: - period: "1s" + period: "1000" steps: - to: - uri: "plc4j" + uri: "plc4x" parameters: driver: "some driver url here" tags:
