From 0933fdc1664b60215c286e65967f8a3df3ef6bf8 Mon Sep 17 00:00:00 2001 From: Maria Arias de Reyna Date: Tue, 18 Jul 2023 12:36:55 +0200 Subject: [PATCH] feature: Bean EIP as in https://camel.apache.org/components/latest/eips/bean-eip.html Fixes #757 --- .../kaoto/backend/camel/KamelPopulator.java | 4 + .../deployment/kamelet/step/BeanFlowStep.java | 76 +++++++ .../deployment/kamelet/step/BeanStep.java | 190 ++++++++++++++++++ .../kamelet/step/FlowStepDeserializer.java | 1 + .../generator/kamelet/KameletRepresenter.java | 2 + .../step/kamelet/KameletParseCatalogTest.java | 2 +- .../kamelet/KameletStepParserServiceTest.java | 3 +- .../kafka-manual-commit-action.kamelet.yaml | 27 +++ 8 files changed, 303 insertions(+), 2 deletions(-) create mode 100644 camel-support/src/main/java/io/kaoto/backend/camel/model/deployment/kamelet/step/BeanFlowStep.java create mode 100644 camel-support/src/main/java/io/kaoto/backend/camel/model/deployment/kamelet/step/BeanStep.java create mode 100644 camel-support/src/test/resources/io/kaoto/backend/camel/service/step/parser/kamelet/kafka-manual-commit-action.kamelet.yaml diff --git a/camel-support/src/main/java/io/kaoto/backend/camel/KamelPopulator.java b/camel-support/src/main/java/io/kaoto/backend/camel/KamelPopulator.java index b4c765b25..7405e68ca 100644 --- a/camel-support/src/main/java/io/kaoto/backend/camel/KamelPopulator.java +++ b/camel-support/src/main/java/io/kaoto/backend/camel/KamelPopulator.java @@ -28,6 +28,7 @@ import io.kaoto.backend.camel.model.deployment.kamelet.expression.Script; import io.kaoto.backend.camel.model.deployment.kamelet.expression.ScriptExpression; import io.kaoto.backend.camel.model.deployment.kamelet.step.AggregateFlowStep; +import io.kaoto.backend.camel.model.deployment.kamelet.step.BeanFlowStep; import io.kaoto.backend.camel.model.deployment.kamelet.step.ChoiceFlowStep; import io.kaoto.backend.camel.model.deployment.kamelet.step.CircuitBreakerFlowStep; import io.kaoto.backend.camel.model.deployment.kamelet.step.ClaimCheckFlowStep; @@ -519,6 +520,9 @@ private FlowStep processStep(final Step step, final boolean to) { case "aggregate": flowStep = new AggregateFlowStep(step); break; + case "bean": + flowStep = new BeanFlowStep(step); + break; case "claim-check": flowStep = new ClaimCheckFlowStep(step); break; diff --git a/camel-support/src/main/java/io/kaoto/backend/camel/model/deployment/kamelet/step/BeanFlowStep.java b/camel-support/src/main/java/io/kaoto/backend/camel/model/deployment/kamelet/step/BeanFlowStep.java new file mode 100644 index 000000000..7becf5229 --- /dev/null +++ b/camel-support/src/main/java/io/kaoto/backend/camel/model/deployment/kamelet/step/BeanFlowStep.java @@ -0,0 +1,76 @@ +package io.kaoto.backend.camel.model.deployment.kamelet.step; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import io.kaoto.backend.api.metadata.catalog.StepCatalog; +import io.kaoto.backend.camel.model.deployment.kamelet.FlowStep; +import io.kaoto.backend.camel.service.step.parser.kamelet.KameletStepParserService; +import io.kaoto.backend.model.step.Step; + +import java.io.Serial; +import java.util.HashMap; +import java.util.Map; + + +@JsonDeserialize(using = JsonDeserializer.None.class) +@JsonIgnoreProperties(ignoreUnknown = true) +public class BeanFlowStep implements FlowStep { + public static final String BEAN_LABEL = "bean"; + @Serial + private static final long serialVersionUID = 5848053149715309142L; + @JsonProperty(BEAN_LABEL) + private BeanStep bean; + + public BeanFlowStep() { + //Needed for serialization + } + + @JsonCreator + public BeanFlowStep(final @JsonProperty(value = BEAN_LABEL, required = true) Object bean) { + super(); + if (bean instanceof BeanStep beanStep) { + this.setBean(beanStep); + } else if (bean instanceof Map map) { + this.setBean(new BeanStep(map)); + } else if (bean != null) { + this.setBean(new BeanStep()); + this.getBean().setBeanType(String.valueOf(bean)); + } + } + + public BeanFlowStep(Step step) { + setBean(new BeanStep(step)); + } + + @Override + public Map getRepresenterProperties() { + Map res = new HashMap<>(); + final var representerProperties = getBean().getRepresenterProperties(); + if (representerProperties.size() == 1 + && (representerProperties.containsKey(BeanStep.REF_LABEL) + || representerProperties.containsKey(BeanStep.BEAN_TYPE_LABEL) + || representerProperties.containsKey(BeanStep.BEAN_TYPE_LABEL2))) { + res.put(BEAN_LABEL, representerProperties.entrySet().iterator().next().getValue()); + } else { + res.put(BEAN_LABEL, representerProperties); + } + return res; + } + + @Override + public Step getStep(final StepCatalog catalog, final KameletStepParserService kameletStepParserService, + final Boolean start, final Boolean end) { + return getBean().getStep(catalog, BEAN_LABEL, kameletStepParserService); + } + + public BeanStep getBean() { + return bean; + } + + public void setBean(BeanStep bean) { + this.bean = bean; + } +} diff --git a/camel-support/src/main/java/io/kaoto/backend/camel/model/deployment/kamelet/step/BeanStep.java b/camel-support/src/main/java/io/kaoto/backend/camel/model/deployment/kamelet/step/BeanStep.java new file mode 100644 index 000000000..5180fc97a --- /dev/null +++ b/camel-support/src/main/java/io/kaoto/backend/camel/model/deployment/kamelet/step/BeanStep.java @@ -0,0 +1,190 @@ +package io.kaoto.backend.camel.model.deployment.kamelet.step; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.kaoto.backend.model.parameter.Parameter; +import io.kaoto.backend.model.step.Step; + +import java.util.Map; + + +public class BeanStep extends EIPStep { + public static final String REF_LABEL = "ref"; + public static final String METHOD_LABEL = "method"; + public static final String BEAN_TYPE_LABEL = "beanType"; + public static final String BEAN_TYPE_LABEL2 = "bean-type"; + public static final String SCOPE_LABEL = "scope"; + public static final String DESCRIPTION_LABEL = "description"; + public static final String ID_LABEL = "id"; + + private String ref; + + private String method; + + private String beanType; + private String scope; + private String description; + + public BeanStep() { + } + + @JsonCreator + public BeanStep(final @JsonProperty(REF_LABEL) String ref, + final @JsonProperty(METHOD_LABEL) String method, + final @JsonProperty(BEAN_TYPE_LABEL) String beanType, + final @JsonProperty(BEAN_TYPE_LABEL2) String beanType2, + final @JsonProperty(SCOPE_LABEL) String scope, + final @JsonProperty(DESCRIPTION_LABEL) String description, + final @JsonProperty(ID_LABEL) String id) { + setRef(ref); + setMethod(method); + setDescription(description); + setBeanType(beanType != null ? beanType : beanType2); + setScope(scope); + setId(id); + } + + public BeanStep(Step step) { + super(step); + } + + public BeanStep(Map map) { + super(map); + if (map.containsKey(REF_LABEL)) { + this.setRef(String.valueOf(map.get(REF_LABEL))); + } + if (map.containsKey(METHOD_LABEL)) { + this.setMethod(String.valueOf(map.get(METHOD_LABEL))); + } + if (map.containsKey(SCOPE_LABEL)) { + this.setScope(String.valueOf(map.get(SCOPE_LABEL))); + } + if (map.containsKey(DESCRIPTION_LABEL)) { + this.setDescription(String.valueOf(map.get(DESCRIPTION_LABEL))); + } + if (map.containsKey(ID_LABEL)) { + this.setId(String.valueOf(map.get(ID_LABEL))); + } + + if (map.containsKey(BEAN_TYPE_LABEL)) { + this.setBeanType(String.valueOf(map.get(BEAN_TYPE_LABEL))); + } else if (map.containsKey(BEAN_TYPE_LABEL2)) { + this.setBeanType(String.valueOf(map.get(BEAN_TYPE_LABEL2))); + } + } + + @Override + public Map getRepresenterProperties() { + Map properties = super.getDefaultRepresenterProperties(); + if (this.getRef() != null) { + properties.put(REF_LABEL, this.getRef()); + } + if (this.getMethod() != null) { + properties.put(METHOD_LABEL, this.getMethod()); + } + if (this.getScope() != null) { + properties.put(SCOPE_LABEL, this.getScope()); + } + if (this.getBeanType() != null) { + properties.put(BEAN_TYPE_LABEL, this.getBeanType()); + } + if (this.getDescription() != null) { + properties.put(DESCRIPTION_LABEL, this.getDescription()); + } + return properties; + } + + + @Override + protected void assignAttribute(final Parameter parameter) { + switch (parameter.getId()) { + case REF_LABEL: + this.setRef(parameter.getValue().toString()); + break; + case METHOD_LABEL: + this.setMethod(parameter.getValue().toString()); + break; + case SCOPE_LABEL: + this.setScope(parameter.getValue().toString()); + break; + case BEAN_TYPE_LABEL: + case BEAN_TYPE_LABEL2: + this.setBeanType(parameter.getValue().toString()); + break; + case DESCRIPTION_LABEL: + this.setDescription(parameter.getValue().toString()); + break; + case ID_LABEL: + this.setId(parameter.getValue().toString()); + break; + default: + break; + } + } + + @Override + protected void assignProperty(final Parameter parameter) { + switch (parameter.getId()) { + case REF_LABEL: + parameter.setValue(this.getRef()); + break; + case METHOD_LABEL: + parameter.setValue(this.getMethod()); + break; + case SCOPE_LABEL: + parameter.setValue(this.getScope()); + break; + case BEAN_TYPE_LABEL: + parameter.setValue(this.getBeanType()); + break; + case ID_LABEL: + parameter.setValue(this.getId()); + break; + case DESCRIPTION_LABEL: + parameter.setValue(this.getDescription()); + break; + default: + break; + } + } + + public String getRef() { + return ref; + } + + public void setRef(String ref) { + this.ref = ref; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getBeanType() { + return beanType; + } + + public void setBeanType(String beanType) { + this.beanType = beanType; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/camel-support/src/main/java/io/kaoto/backend/camel/model/deployment/kamelet/step/FlowStepDeserializer.java b/camel-support/src/main/java/io/kaoto/backend/camel/model/deployment/kamelet/step/FlowStepDeserializer.java index 8bbad6deb..05d01fb62 100644 --- a/camel-support/src/main/java/io/kaoto/backend/camel/model/deployment/kamelet/step/FlowStepDeserializer.java +++ b/camel-support/src/main/java/io/kaoto/backend/camel/model/deployment/kamelet/step/FlowStepDeserializer.java @@ -43,6 +43,7 @@ private Map getFlowSteps() { Map steps = new HashMap<>(); steps.put("aggregate", AggregateFlowStep.class); + steps.put("bean", BeanFlowStep.class); steps.put("claim-check", ClaimCheckFlowStep.class); steps.put("claimCheck", ClaimCheckFlowStep.class); steps.put("circuitBreaker", CircuitBreakerFlowStep.class); diff --git a/camel-support/src/main/java/io/kaoto/backend/camel/service/deployment/generator/kamelet/KameletRepresenter.java b/camel-support/src/main/java/io/kaoto/backend/camel/service/deployment/generator/kamelet/KameletRepresenter.java index 59b445e80..5d25e4fcf 100644 --- a/camel-support/src/main/java/io/kaoto/backend/camel/service/deployment/generator/kamelet/KameletRepresenter.java +++ b/camel-support/src/main/java/io/kaoto/backend/camel/service/deployment/generator/kamelet/KameletRepresenter.java @@ -13,6 +13,7 @@ import io.kaoto.backend.camel.model.deployment.kamelet.expression.Script; import io.kaoto.backend.camel.model.deployment.kamelet.expression.ScriptExpression; import io.kaoto.backend.camel.model.deployment.kamelet.step.AggregateFlowStep; +import io.kaoto.backend.camel.model.deployment.kamelet.step.BeanFlowStep; import io.kaoto.backend.camel.model.deployment.kamelet.step.ChoiceFlowStep; import io.kaoto.backend.camel.model.deployment.kamelet.step.CircuitBreakerFlowStep; import io.kaoto.backend.camel.model.deployment.kamelet.step.ClaimCheckFlowStep; @@ -253,6 +254,7 @@ private void addEIP() { // and making a mess? var eips = new Class[] { AggregateFlowStep.class, + BeanFlowStep.class, ClaimCheckFlowStep.class, CircuitBreakerFlowStep.class, ChoiceFlowStep.class, diff --git a/camel-support/src/test/java/io/kaoto/backend/camel/metadata/parser/step/kamelet/KameletParseCatalogTest.java b/camel-support/src/test/java/io/kaoto/backend/camel/metadata/parser/step/kamelet/KameletParseCatalogTest.java index ee3bdd8fd..fa25ee44b 100644 --- a/camel-support/src/test/java/io/kaoto/backend/camel/metadata/parser/step/kamelet/KameletParseCatalogTest.java +++ b/camel-support/src/test/java/io/kaoto/backend/camel/metadata/parser/step/kamelet/KameletParseCatalogTest.java @@ -159,7 +159,7 @@ void localFolder() throws URISyntaxException { ParseCatalog kameletParser = parseCatalog.getLocalFolder(Path.of(url.toURI())); List steps = kameletParser.parse().join().stream().filter(Objects::nonNull).toList(); - assertEquals(8, steps.size()); + assertEquals(9, steps.size()); } @Test diff --git a/camel-support/src/test/java/io/kaoto/backend/camel/service/step/parser/kamelet/KameletStepParserServiceTest.java b/camel-support/src/test/java/io/kaoto/backend/camel/service/step/parser/kamelet/KameletStepParserServiceTest.java index 296ef1596..a6d31d231 100644 --- a/camel-support/src/test/java/io/kaoto/backend/camel/service/step/parser/kamelet/KameletStepParserServiceTest.java +++ b/camel-support/src/test/java/io/kaoto/backend/camel/service/step/parser/kamelet/KameletStepParserServiceTest.java @@ -236,7 +236,8 @@ void appliesToInvalid(String resourcePath) throws IOException { } @ParameterizedTest - @ValueSource(strings = {"eip.kamelet.yaml", "jq.kamelet.yaml", "name.kamelet.yaml"}) + @ValueSource(strings = {"eip.kamelet.yaml", "jq.kamelet.yaml", "name.kamelet.yaml", + "kafka-manual-commit-action.kamelet.yaml"}) void checkRoundTrip(String resource) throws Exception { String kamelet = new String(Objects.requireNonNull(this.getClass().getResourceAsStream(resource)) .readAllBytes(), StandardCharsets.UTF_8); diff --git a/camel-support/src/test/resources/io/kaoto/backend/camel/service/step/parser/kamelet/kafka-manual-commit-action.kamelet.yaml b/camel-support/src/test/resources/io/kaoto/backend/camel/service/step/parser/kamelet/kafka-manual-commit-action.kamelet.yaml new file mode 100644 index 000000000..a85367840 --- /dev/null +++ b/camel-support/src/test/resources/io/kaoto/backend/camel/service/step/parser/kamelet/kafka-manual-commit-action.kamelet.yaml @@ -0,0 +1,27 @@ +apiVersion: camel.apache.org/v1alpha1 +kind: Kamelet +metadata: + annotations: + camel.apache.org/kamelet.support.level: Stable + camel.apache.org/catalog.version: 3.20.6 + camel.apache.org/kamelet.icon: data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmlld0JveD0iMCAtMjU2IDE3OTIgMTc5MiIKICAgaWQ9InN2ZzMwMjUiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40OC4zLjEgcjk4ODYiCiAgIHdpZHRoPSIxMDAlIgogICBoZWlnaHQ9IjEwMCUiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImNvZ19mb250X2F3ZXNvbWUuc3ZnIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGEzMDM1Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzMzAzMyIgLz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjY0MCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI0ODAiCiAgICAgaWQ9Im5hbWVkdmlldzMwMzEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuMTMxNjk2NDMiCiAgICAgaW5rc2NhcGU6Y3g9Ijg5NiIKICAgICBpbmtzY2FwZTpjeT0iODk2IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNSIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzMwMjUiIC8+CiAgPGcKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwtMSwxMjEuNDkxNTMsMTI4NS40MjM3KSIKICAgICBpZD0iZzMwMjciPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTAyNCw2NDAgcSAwLDEwNiAtNzUsMTgxIC03NSw3NSAtMTgxLDc1IC0xMDYsMCAtMTgxLC03NSAtNzUsLTc1IC03NSwtMTgxIDAsLTEwNiA3NSwtMTgxIDc1LC03NSAxODEsLTc1IDEwNiwwIDE4MSw3NSA3NSw3NSA3NSwxODEgeiBtIDUxMiwxMDkgViA1MjcgcSAwLC0xMiAtOCwtMjMgLTgsLTExIC0yMCwtMTMgbCAtMTg1LC0yOCBxIC0xOSwtNTQgLTM5LC05MSAzNSwtNTAgMTA3LC0xMzggMTAsLTEyIDEwLC0yNSAwLC0xMyAtOSwtMjMgLTI3LC0zNyAtOTksLTEwOCAtNzIsLTcxIC05NCwtNzEgLTEyLDAgLTI2LDkgbCAtMTM4LDEwOCBxIC00NCwtMjMgLTkxLC0zOCAtMTYsLTEzNiAtMjksLTE4NiAtNywtMjggLTM2LC0yOCBIIDY1NyBxIC0xNCwwIC0yNC41LDguNSBRIDYyMiwtMTExIDYyMSwtOTggTCA1OTMsODYgcSAtNDksMTYgLTkwLDM3IEwgMzYyLDE2IFEgMzUyLDcgMzM3LDcgMzIzLDcgMzEyLDE4IDE4NiwxMzIgMTQ3LDE4NiBxIC03LDEwIC03LDIzIDAsMTIgOCwyMyAxNSwyMSA1MSw2Ni41IDM2LDQ1LjUgNTQsNzAuNSAtMjcsNTAgLTQxLDk5IEwgMjksNDk1IFEgMTYsNDk3IDgsNTA3LjUgMCw1MTggMCw1MzEgdiAyMjIgcSAwLDEyIDgsMjMgOCwxMSAxOSwxMyBsIDE4NiwyOCBxIDE0LDQ2IDM5LDkyIC00MCw1NyAtMTA3LDEzOCAtMTAsMTIgLTEwLDI0IDAsMTAgOSwyMyAyNiwzNiA5OC41LDEwNy41IDcyLjUsNzEuNSA5NC41LDcxLjUgMTMsMCAyNiwtMTAgbCAxMzgsLTEwNyBxIDQ0LDIzIDkxLDM4IDE2LDEzNiAyOSwxODYgNywyOCAzNiwyOCBoIDIyMiBxIDE0LDAgMjQuNSwtOC41IFEgOTE0LDEzOTEgOTE1LDEzNzggbCAyOCwtMTg0IHEgNDksLTE2IDkwLC0zNyBsIDE0MiwxMDcgcSA5LDkgMjQsOSAxMywwIDI1LC0xMCAxMjksLTExOSAxNjUsLTE3MCA3LC04IDcsLTIyIDAsLTEyIC04LC0yMyAtMTUsLTIxIC01MSwtNjYuNSAtMzYsLTQ1LjUgLTU0LC03MC41IDI2LC01MCA0MSwtOTggbCAxODMsLTI4IHEgMTMsLTIgMjEsLTEyLjUgOCwtMTAuNSA4LC0yMy41IHoiCiAgICAgICBpZD0icGF0aDMwMjkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc3R5bGU9ImZpbGw6Y3VycmVudENvbG9yIiAvPgogIDwvZz4KPC9zdmc+Cg== + camel.apache.org/provider: Apache Software Foundation + camel.apache.org/kamelet.group: Actions + camel.apache.org/kamelet.namespace: Kafka + labels: + camel.apache.org/kamelet.type: action + name: kafka-manual-commit-action +spec: + definition: + properties: {} + title: Kafka Manual Commit Action + type: object + dependencies: + - mvn:org.apache.camel.kamelets:camel-kamelets-utils:3.20.6 + - camel:kamelet + - camel:core + template: + from: + uri: kamelet:source + steps: + - bean: org.apache.camel.kamelets.utils.transform.kafka.ManualCommit