From 4285bb33727763875be6bc89ef6c609a0057fc74 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 14 Mar 2024 15:23:17 +0100 Subject: [PATCH 01/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../UseLatestAggregationStrategy.java | 9 +- .../packaging/GenerateComponentMojo.java | 2 + .../camel/maven/packaging/GenerateMojo.java | 2 + .../maven/packaging/GeneratePojoBeanMojo.java | 221 ++++++++++++++++++ 4 files changed, 232 insertions(+), 2 deletions(-) create mode 100644 tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java index d43a6a7fa76e0..eb48f844d8192 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java @@ -19,12 +19,17 @@ import org.apache.camel.AggregationStrategy; import org.apache.camel.Exchange; import org.apache.camel.ExchangePropertyKey; +import org.apache.camel.spi.Metadata; /** * An {@link AggregationStrategy} which just uses the latest exchange which is useful for status messages where old * status messages have no real value. Another example is things like market data prices, where old stock prices are not * that relevant, only the current price is. */ +@Metadata(label = "bean", + description = "An AggregationStrategy which just uses the latest exchange which is useful for status messages where old" + + " status messages have no real value. Another example is things like market data prices, where old stock prices are not" + + " that relevant, only the current price is.") public class UseLatestAggregationStrategy implements AggregationStrategy { @Override @@ -72,8 +77,8 @@ protected Exchange propagateFailure(Exchange oldExchange, Exchange newExchange) // propagate exception from old exchange if there isn't already an exception if (oldExchange.isFailed() || oldExchange.isRollbackOnly() || oldExchange.isRollbackOnlyLast() - || oldExchange.getExchangeExtension().isErrorHandlerHandledSet() - && oldExchange.getExchangeExtension().isErrorHandlerHandled()) { + || oldExchange.getExchangeExtension().isErrorHandlerHandledSet() + && oldExchange.getExchangeExtension().isErrorHandlerHandled()) { // propagate failure by using old exchange as the answer return oldExchange; } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateComponentMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateComponentMojo.java index 54e8563c891e3..d20cd9aaa7cfb 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateComponentMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateComponentMojo.java @@ -50,6 +50,8 @@ protected void doExecute() throws MojoFailureException, MojoExecutionException { invoke(GenerateInvokeOnHeaderMojo.class); // generate data-type-transformer invoke(GenerateDataTypeTransformerMojo.class); + // generate pojo-beans + invoke(GeneratePojoBeanMojo.class); // generate dev-console invoke(GenerateDevConsoleMojo.class); // prepare-components diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateMojo.java index 982f872be2001..84b7d2752d28d 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateMojo.java @@ -52,6 +52,8 @@ protected void doExecute() throws MojoFailureException, MojoExecutionException { invoke(GenerateInvokeOnHeaderMojo.class); // generate data-type-transformer invoke(GenerateDataTypeTransformerMojo.class); + // generate pojo-beans + invoke(GeneratePojoBeanMojo.class); // generate dev-console invoke(GenerateDevConsoleMojo.class); // prepare-components diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java new file mode 100644 index 0000000000000..31fc4fc4ca334 --- /dev/null +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java @@ -0,0 +1,221 @@ +/* + * 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.maven.packaging; + +import java.io.File; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.StringJoiner; + +import org.apache.camel.maven.packaging.generics.PackagePluginUtils; +import org.apache.camel.tooling.util.PackageHelper; +import org.apache.camel.tooling.util.Strings; +import org.apache.camel.util.json.JsonObject; +import org.apache.camel.util.json.Jsoner; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.annotations.ResolutionScope; +import org.jboss.jandex.AnnotationInstance; +import org.jboss.jandex.DotName; +import org.jboss.jandex.Index; + +import static org.apache.camel.maven.packaging.MojoHelper.annotationValue; + +/** + * Factory for generating code for Camel pojo beans that are intended for end user to use with Camel EIPs and + * components. + */ +@Mojo(name = "generate-pojo-bean", threadSafe = true, defaultPhase = LifecyclePhase.PROCESS_CLASSES, + requiresDependencyCollection = ResolutionScope.COMPILE, + requiresDependencyResolution = ResolutionScope.COMPILE) +public class GeneratePojoBeanMojo extends AbstractGeneratorMojo { + + public static final DotName METADATA = DotName.createSimple("org.apache.camel.spi.Metadata"); + + /** + * The project build directory + */ + @Parameter(defaultValue = "${project.build.directory}") + protected File buildDir; + + @Parameter(defaultValue = "${project.basedir}/src/generated/resources") + protected File resourcesOutputDir; + + private static class BeanPojoModel { + private String name; + private String className; + private String interfaceName; + private String description; + private boolean deprecated; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public String getInterfaceName() { + return interfaceName; + } + + public void setInterfaceName(String interfaceName) { + this.interfaceName = interfaceName; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public boolean isDeprecated() { + return deprecated; + } + + public void setDeprecated(boolean deprecated) { + this.deprecated = deprecated; + } + } + + public GeneratePojoBeanMojo() { + } + + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + if ("pom".equals(project.getPackaging())) { + return; + } + + buildDir = new File(project.getBuild().getDirectory()); + + if (resourcesOutputDir == null) { + resourcesOutputDir = new File(project.getBasedir(), "src/generated/resources"); + } + + Index index = PackagePluginUtils.readJandexIndexIgnoreMissing(project, getLog()); + if (index == null) { + return; + } + + List models = new ArrayList<>(); + List annotations = index.getAnnotations(METADATA); + annotations.forEach(a -> { + // only @Metadata(label="bean") is selected + String label = annotationValue(a, "label"); + if ("bean".equals(label)) { + BeanPojoModel model = new BeanPojoModel(); + String currentClass = a.target().asClass().name().toString(); + boolean deprecated = a.target().asClass().hasAnnotation(Deprecated.class); + model.setName(a.target().asClass().simpleName()); + model.setClassName(currentClass); + model.setDeprecated(deprecated); + model.setDescription(annotationValue(a, "description")); + for (DotName dn : a.target().asClass().interfaceNames()) { + if (dn.packagePrefix().startsWith("org.apache.camel")) { + model.setInterfaceName(dn.toString()); + break; + } + } + // TODO: getter/setter for options ala EIP/components + models.add(model); + } + }); + models.sort(Comparator.comparing(BeanPojoModel::getClassName)); + + if (!models.isEmpty()) { + try { + StringJoiner names = new StringJoiner(" "); + for (var model : models) { + names.add(model.getClassName()); + JsonObject jo = asJsonObject(model); + String json = jo.toJson(); + json = Jsoner.prettyPrint(json, 2); + String fn = sanitizeFileName(model.getName()) + PackageHelper.JSON_SUFIX; + boolean updated = updateResource(resourcesOutputDir.toPath(), + "META-INF/services/org/apache/camel/bean/" + fn, + json + NL); + if (updated) { + getLog().info("Updated bean json: " + model.getName()); + } + } + + // generate marker file + File camelMetaDir = new File(resourcesOutputDir, "META-INF/services/org/apache/camel/"); + int count = models.size(); + String properties = createProperties(project, "beans", names.toString()); + updateResource(camelMetaDir.toPath(), "beans.properties", properties); + getLog().info("Generated beans.properties containing " + count + " Camel " + + (count > 1 ? "beans: " : "bean: ") + names); + } catch (Exception e) { + throw new MojoExecutionException(e); + } + } + } + + private JsonObject asJsonObject(BeanPojoModel model) { + JsonObject jo = new JsonObject(); + // we need to know the maven GAV also + jo.put("kind", "bean"); + jo.put("name", model.getName()); + jo.put("javaType", model.getClassName()); + if (model.getInterfaceName() != null) { + jo.put("interfaceType", model.getInterfaceName()); + } + jo.put("title", asTitle(model.getClassName())); + if (model.getDescription() != null) { + jo.put("description", model.getDescription()); + } + jo.put("deprecated", model.isDeprecated()); + jo.put("groupId", project.getGroupId()); + jo.put("artifactId", project.getArtifactId()); + jo.put("version", project.getVersion()); + JsonObject root = new JsonObject(); + root.put("bean", jo); + return root; + } + + private String sanitizeFileName(String fileName) { + return fileName.replaceAll("[^A-Za-z0-9+-/]", "-"); + } + + private String asTitle(String name) { + name = Strings.camelDashToTitle(name); + String part = Strings.after(name, ":"); + if (part != null) { + part = Strings.capitalize(part); + name = Strings.before(name, ":") + " (" + part + ")"; + } + return name; + } + +} From 774d19ad93c358bcef358943a35f3e2135b9a260 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 14 Mar 2024 15:37:05 +0100 Subject: [PATCH 02/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../bean/UseLatestAggregationStrategy.json | 15 ++++++++++ .../org/apache/camel/beans.properties | 7 +++++ .../UseLatestAggregationStrategy.java | 12 ++++---- .../maven/packaging/GeneratePojoBeanMojo.java | 30 ++++++++++++------- 4 files changed, 47 insertions(+), 17 deletions(-) create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/UseLatestAggregationStrategy.json create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/beans.properties diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/UseLatestAggregationStrategy.json b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/UseLatestAggregationStrategy.json new file mode 100644 index 0000000000000..5d73c66d7910e --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/UseLatestAggregationStrategy.json @@ -0,0 +1,15 @@ +{ + "bean": { + "kind": "bean", + "name": "UseLatestAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.UseLatestAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Use Latest Aggregation Strategy", + "description": "An AggregationStrategy which just uses the latest exchange which is useful for status messages where old status messages have no real value. Another example is things like market data prices, where old stock prices are not that relevant, only the current price is.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-core-processor", + "version": "4.5.0-SNAPSHOT" + } +} + diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/beans.properties b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/beans.properties new file mode 100644 index 0000000000000..a4277ba5e6623 --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/beans.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +beans=org.apache.camel.processor.aggregate.UseLatestAggregationStrategy +groupId=org.apache.camel +artifactId=camel-core-processor +version=4.5.0-SNAPSHOT +projectName=Camel :: Core Processor +projectDescription=Camel core processors diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java index eb48f844d8192..0b94b2b7441df 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java @@ -26,10 +26,10 @@ * status messages have no real value. Another example is things like market data prices, where old stock prices are not * that relevant, only the current price is. */ -@Metadata(label = "bean", - description = "An AggregationStrategy which just uses the latest exchange which is useful for status messages where old" - + " status messages have no real value. Another example is things like market data prices, where old stock prices are not" - + " that relevant, only the current price is.") +@Metadata(label = "bean", title = "Use Latest", + description = "An AggregationStrategy which just uses the latest exchange which is useful for status messages where old" + + " status messages have no real value. Another example is things like market data prices, where old stock prices are not" + + " that relevant, only the current price is.") public class UseLatestAggregationStrategy implements AggregationStrategy { @Override @@ -77,8 +77,8 @@ protected Exchange propagateFailure(Exchange oldExchange, Exchange newExchange) // propagate exception from old exchange if there isn't already an exception if (oldExchange.isFailed() || oldExchange.isRollbackOnly() || oldExchange.isRollbackOnlyLast() - || oldExchange.getExchangeExtension().isErrorHandlerHandledSet() - && oldExchange.getExchangeExtension().isErrorHandlerHandled()) { + || oldExchange.getExchangeExtension().isErrorHandlerHandledSet() + && oldExchange.getExchangeExtension().isErrorHandlerHandled()) { // propagate failure by using old exchange as the answer return oldExchange; } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java index 31fc4fc4ca334..879fe0df8a7b2 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java @@ -61,6 +61,7 @@ public class GeneratePojoBeanMojo extends AbstractGeneratorMojo { private static class BeanPojoModel { private String name; + private String title; private String className; private String interfaceName; private String description; @@ -74,6 +75,14 @@ public void setName(String name) { this.name = name; } + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + public String getClassName() { return className; } @@ -134,10 +143,15 @@ public void execute() throws MojoExecutionException, MojoFailureException { String label = annotationValue(a, "label"); if ("bean".equals(label)) { BeanPojoModel model = new BeanPojoModel(); - String currentClass = a.target().asClass().name().toString(); - boolean deprecated = a.target().asClass().hasAnnotation(Deprecated.class); model.setName(a.target().asClass().simpleName()); - model.setClassName(currentClass); + boolean deprecated = a.target().asClass().hasAnnotation(Deprecated.class); + String title = annotationValue(a, "title"); + if (title == null) { + title = Strings.camelCaseToDash(model.getName()); + title = Strings.camelDashToTitle(title); + } + model.setTitle(title); + model.setClassName(a.target().asClass().name().toString()); model.setDeprecated(deprecated); model.setDescription(annotationValue(a, "description")); for (DotName dn : a.target().asClass().interfaceNames()) { @@ -191,7 +205,7 @@ private JsonObject asJsonObject(BeanPojoModel model) { if (model.getInterfaceName() != null) { jo.put("interfaceType", model.getInterfaceName()); } - jo.put("title", asTitle(model.getClassName())); + jo.put("title", asTitle(model.getName())); if (model.getDescription() != null) { jo.put("description", model.getDescription()); } @@ -209,13 +223,7 @@ private String sanitizeFileName(String fileName) { } private String asTitle(String name) { - name = Strings.camelDashToTitle(name); - String part = Strings.after(name, ":"); - if (part != null) { - part = Strings.capitalize(part); - name = Strings.before(name, ":") + " (" + part + ")"; - } - return name; + return Strings.asTitle(name); } } From 90ef1f4f1d685e0ab51db752a8d4ad8b4ee6731a Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 14 Mar 2024 15:42:43 +0100 Subject: [PATCH 03/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../services/org/apache/camel/bean.properties | 7 +++++++ .../bean/UseOriginalAggregationStrategy.json | 15 +++++++++++++++ .../services/org/apache/camel/beans.properties | 2 +- .../aggregate/UseLatestAggregationStrategy.java | 2 +- .../aggregate/UseOriginalAggregationStrategy.java | 5 +++++ .../maven/packaging/GeneratePojoBeanMojo.java | 11 ++++++----- 6 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/UseOriginalAggregationStrategy.json diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..348c3b28c96ff --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=UseLatestAggregationStrategy UseOriginalAggregationStrategy +groupId=org.apache.camel +artifactId=camel-core-processor +version=4.5.0-SNAPSHOT +projectName=Camel :: Core Processor +projectDescription=Camel core processors diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/UseOriginalAggregationStrategy.json b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/UseOriginalAggregationStrategy.json new file mode 100644 index 0000000000000..7ab066f5d7953 --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/UseOriginalAggregationStrategy.json @@ -0,0 +1,15 @@ +{ + "bean": { + "kind": "bean", + "name": "UseOriginalAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.UseOriginalAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Use Original Aggregation Strategy", + "description": "An AggregationStrategy which just uses the original exchange which can be needed when you want to preserve the original Exchange. For example when splitting an Exchange and then you may want to keep routing using the original Exchange.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-core-processor", + "version": "4.5.0-SNAPSHOT" + } +} + diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/beans.properties b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/beans.properties index a4277ba5e6623..c8e1f79c50394 100644 --- a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/beans.properties +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/beans.properties @@ -1,5 +1,5 @@ # Generated by camel build tools - do NOT edit this file! -beans=org.apache.camel.processor.aggregate.UseLatestAggregationStrategy +beans=UseLatestAggregationStrategy UseOriginalAggregationStrategy groupId=org.apache.camel artifactId=camel-core-processor version=4.5.0-SNAPSHOT diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java index 0b94b2b7441df..d4ba479d3a7d3 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java @@ -26,7 +26,7 @@ * status messages have no real value. Another example is things like market data prices, where old stock prices are not * that relevant, only the current price is. */ -@Metadata(label = "bean", title = "Use Latest", +@Metadata(label = "bean", description = "An AggregationStrategy which just uses the latest exchange which is useful for status messages where old" + " status messages have no real value. Another example is things like market data prices, where old stock prices are not" + " that relevant, only the current price is.") diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategy.java index 4fa8dc75f579f..40689d482ab88 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategy.java @@ -18,6 +18,7 @@ import org.apache.camel.AggregationStrategy; import org.apache.camel.Exchange; +import org.apache.camel.spi.Metadata; /** * An {@link AggregationStrategy} which just uses the original exchange which can be needed when you want to preserve @@ -26,6 +27,10 @@ * * @see org.apache.camel.processor.Splitter */ +@Metadata(label = "bean", + description = "An AggregationStrategy which just uses the original exchange which can be needed when you want to preserve" + + " the original Exchange. For example when splitting an Exchange and then you may want to keep routing using the" + + " original Exchange.") public class UseOriginalAggregationStrategy implements AggregationStrategy { private final Exchange original; diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java index 879fe0df8a7b2..438b0de974499 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java @@ -160,17 +160,18 @@ public void execute() throws MojoExecutionException, MojoFailureException { break; } } + // TODO: getter/setter for options ala EIP/components models.add(model); } }); - models.sort(Comparator.comparing(BeanPojoModel::getClassName)); + models.sort(Comparator.comparing(BeanPojoModel::getName)); if (!models.isEmpty()) { try { StringJoiner names = new StringJoiner(" "); for (var model : models) { - names.add(model.getClassName()); + names.add(model.getName()); JsonObject jo = asJsonObject(model); String json = jo.toJson(); json = Jsoner.prettyPrint(json, 2); @@ -186,9 +187,9 @@ public void execute() throws MojoExecutionException, MojoFailureException { // generate marker file File camelMetaDir = new File(resourcesOutputDir, "META-INF/services/org/apache/camel/"); int count = models.size(); - String properties = createProperties(project, "beans", names.toString()); - updateResource(camelMetaDir.toPath(), "beans.properties", properties); - getLog().info("Generated beans.properties containing " + count + " Camel " + String properties = createProperties(project, "bean", names.toString()); + updateResource(camelMetaDir.toPath(), "bean.properties", properties); + getLog().info("Generated bean.properties containing " + count + " Camel " + (count > 1 ? "beans: " : "bean: ") + names); } catch (Exception e) { throw new MojoExecutionException(e); From 217c887ee4fb11ce031402dd5adb1c0747d4d532 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 14 Mar 2024 16:27:10 +0100 Subject: [PATCH 04/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../services/org/apache/camel/bean.properties | 2 +- .../GroupedMessageAggregationStrategy.json | 15 ++++ .../camel/bean/StringAggregationStrategy.json | 16 ++++ .../GroupedMessageAggregationStrategy.java | 5 ++ .../aggregate/StringAggregationStrategy.java | 21 +++++ .../EndpointSchemaGeneratorMojo.java | 82 +----------------- .../maven/packaging/GeneratePojoBeanMojo.java | 85 ++++++++++++++++--- .../camel/maven/packaging/MojoHelper.java | 76 +++++++++++++++++ 8 files changed, 210 insertions(+), 92 deletions(-) create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/GroupedMessageAggregationStrategy.json create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties index 348c3b28c96ff..88fd1692084e9 100644 --- a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -1,5 +1,5 @@ # Generated by camel build tools - do NOT edit this file! -bean=UseLatestAggregationStrategy UseOriginalAggregationStrategy +bean=GroupedMessageAggregationStrategy StringAggregationStrategy UseLatestAggregationStrategy UseOriginalAggregationStrategy groupId=org.apache.camel artifactId=camel-core-processor version=4.5.0-SNAPSHOT diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/GroupedMessageAggregationStrategy.json b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/GroupedMessageAggregationStrategy.json new file mode 100644 index 0000000000000..a03cad939d9e8 --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/GroupedMessageAggregationStrategy.json @@ -0,0 +1,15 @@ +{ + "bean": { + "kind": "bean", + "name": "GroupedMessageAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.GroupedMessageAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Grouped Message Aggregation Strategy", + "description": "Aggregate all Message into a single combined Exchange holding all the aggregated messages in a List of Message as the message body. This aggregation strategy can be used in combination with Splitter to batch messages.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-core-processor", + "version": "4.5.0-SNAPSHOT" + } +} + diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json new file mode 100644 index 0000000000000..1702da816d72f --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "StringAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.StringAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "String Aggregation Strategy", + "description": "Aggregate result of pick expression into a single combined Exchange holding all the aggregated bodies in a String as the message body. This aggregation strategy can used in combination with Splitter to batch messages", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-core-processor", + "version": "4.5.0-SNAPSHOT", + "options": { "delimiter": { "index": 0, "kind": "property", "displayName": "Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Delimiter used for joining strings together." } } + } +} + diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategy.java index ef47d5d0a022c..aca104407c384 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategy.java @@ -20,6 +20,7 @@ import org.apache.camel.Exchange; import org.apache.camel.Message; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.DefaultExchange; /** @@ -29,6 +30,10 @@ * This aggregation strategy can be used in combination with {@link org.apache.camel.processor.Splitter} to batch * messages */ +@Metadata(label = "bean", + description = "Aggregate all Message into a single combined Exchange holding all the aggregated messages in a List" + + " of Message as the message body. This aggregation strategy can be used in combination with" + + " Splitter to batch messages.") public class GroupedMessageAggregationStrategy extends AbstractListAggregationStrategy { @Override diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java index ed08e6a0a8b73..5e8694fd923a9 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java @@ -20,6 +20,7 @@ import org.apache.camel.Exchange; import org.apache.camel.ExchangePropertyKey; import org.apache.camel.Expression; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.builder.ExpressionBuilder; /** @@ -28,11 +29,31 @@ * * This aggregation strategy can used in combination with {@link org.apache.camel.processor.Splitter} to batch messages */ +@Metadata(label = "bean", + description = "Aggregate result of pick expression into a single combined Exchange holding all the aggregated bodies in a" + + " String as the message body. This aggregation strategy can used in combination with Splitter to batch messages") public class StringAggregationStrategy implements AggregationStrategy { + @Metadata(description = "Delimiter used for joining strings together.") private String delimiter = ""; private Expression pickExpression = ExpressionBuilder.bodyExpression(); + public String getDelimiter() { + return delimiter; + } + + public void setDelimiter(String delimiter) { + this.delimiter = delimiter; + } + + public Expression getPickExpression() { + return pickExpression; + } + + public void setPickExpression(Expression pickExpression) { + this.pickExpression = pickExpression; + } + /** * Set delimiter used for joining aggregated String * diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java index 6f5328c0929aa..a3a47d330b3c0 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointSchemaGeneratorMojo.java @@ -27,8 +27,6 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Type; -import java.net.URI; -import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -36,7 +34,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -1077,7 +1074,7 @@ protected void findComponentClassProperties( option.setKind("property"); option.setName(name); option.setDisplayName(displayName); - option.setType(getType(fieldTypeName, false, isDuration)); + option.setType(MojoHelper.getType(fieldTypeName, false, isDuration)); option.setJavaType(fieldTypeName); option.setRequired(required); option.setDefaultValue(defaultValue); @@ -1364,7 +1361,7 @@ private void collectNonNestedField( } option.setName(name); option.setDisplayName(displayName); - option.setType(getType(fieldTypeName, false, isDuration)); + option.setType(MojoHelper.getType(fieldTypeName, false, isDuration)); option.setJavaType(fieldTypeName); option.setRequired(required); option.setDefaultValue(defaultValue); @@ -1553,7 +1550,7 @@ private boolean collectUriPathProperties( option.setName(name); option.setKind("path"); option.setDisplayName(displayName); - option.setType(getType(fieldTypeName, false, isDuration)); + option.setType(MojoHelper.getType(fieldTypeName, false, isDuration)); option.setJavaType(fieldTypeName); option.setRequired(required); option.setDefaultValue(defaultValue); @@ -1875,79 +1872,6 @@ private static String getTypeName(Type fieldType) { return fieldTypeName; } - /** - * Gets the JSON schema type. - * - * @param type the java type - * @return the json schema type, is never null, but returns object as the generic type - */ - public static String getType(String type, boolean enumType, boolean isDuration) { - if (enumType) { - return "enum"; - } else if (isDuration) { - return "duration"; - } else if (type == null) { - // return generic type for unknown type - return "object"; - } else if (type.equals(URI.class.getName()) || type.equals(URL.class.getName())) { - return "string"; - } else if (type.equals(File.class.getName())) { - return "string"; - } else if (type.equals(Date.class.getName())) { - return "string"; - } else if (type.startsWith("java.lang.Class")) { - return "string"; - } else if (type.startsWith("java.util.List") || type.startsWith("java.util.Collection")) { - return "array"; - } - - String primitive = getPrimitiveType(type); - if (primitive != null) { - return primitive; - } - - return "object"; - } - - /** - * Gets the JSON schema primitive type. - * - * @param name the java type - * @return the json schema primitive type, or null if not a primitive - */ - public static String getPrimitiveType(String name) { - // special for byte[] or Object[] as its common to use - if ("java.lang.byte[]".equals(name) || "byte[]".equals(name)) { - return "string"; - } else if ("java.lang.Byte[]".equals(name) || "Byte[]".equals(name)) { - return "array"; - } else if ("java.lang.Object[]".equals(name) || "Object[]".equals(name)) { - return "array"; - } else if ("java.lang.String[]".equals(name) || "String[]".equals(name)) { - return "array"; - } else if ("java.lang.Character".equals(name) || "Character".equals(name) || "char".equals(name)) { - return "string"; - } else if ("java.lang.String".equals(name) || "String".equals(name)) { - return "string"; - } else if ("java.lang.Boolean".equals(name) || "Boolean".equals(name) || "boolean".equals(name)) { - return "boolean"; - } else if ("java.lang.Integer".equals(name) || "Integer".equals(name) || "int".equals(name)) { - return "integer"; - } else if ("java.lang.Long".equals(name) || "Long".equals(name) || "long".equals(name)) { - return "integer"; - } else if ("java.lang.Short".equals(name) || "Short".equals(name) || "short".equals(name)) { - return "integer"; - } else if ("java.lang.Byte".equals(name) || "Byte".equals(name) || "byte".equals(name)) { - return "integer"; - } else if ("java.lang.Float".equals(name) || "Float".equals(name) || "float".equals(name)) { - return "number"; - } else if ("java.lang.Double".equals(name) || "Double".equals(name) || "double".equals(name)) { - return "number"; - } - - return null; - } - /** * Gets the default value accordingly to its type * diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java index 438b0de974499..4787b30784131 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java @@ -21,12 +21,14 @@ import java.util.Comparator; import java.util.List; import java.util.StringJoiner; +import java.util.stream.Stream; import org.apache.camel.maven.packaging.generics.PackagePluginUtils; +import org.apache.camel.tooling.model.BaseOptionModel; +import org.apache.camel.tooling.model.JsonMapper; import org.apache.camel.tooling.util.PackageHelper; import org.apache.camel.tooling.util.Strings; import org.apache.camel.util.json.JsonObject; -import org.apache.camel.util.json.Jsoner; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; @@ -34,10 +36,13 @@ import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.jboss.jandex.AnnotationInstance; +import org.jboss.jandex.ClassInfo; import org.jboss.jandex.DotName; +import org.jboss.jandex.FieldInfo; import org.jboss.jandex.Index; import static org.apache.camel.maven.packaging.MojoHelper.annotationValue; +import static org.apache.camel.maven.packaging.MojoHelper.getType; /** * Factory for generating code for Camel pojo beans that are intended for end user to use with Camel EIPs and @@ -66,6 +71,7 @@ private static class BeanPojoModel { private String interfaceName; private String description; private boolean deprecated; + private final List options = new ArrayList<>(); public String getName() { return name; @@ -114,6 +120,18 @@ public boolean isDeprecated() { public void setDeprecated(boolean deprecated) { this.deprecated = deprecated; } + + public void addOption(BeanPojoOptionModel option) { + this.options.add(option); + } + + public List getOptions() { + return options; + } + } + + private static class BeanPojoOptionModel extends BaseOptionModel { + } public GeneratePojoBeanMojo() { @@ -143,25 +161,47 @@ public void execute() throws MojoExecutionException, MojoFailureException { String label = annotationValue(a, "label"); if ("bean".equals(label)) { BeanPojoModel model = new BeanPojoModel(); - model.setName(a.target().asClass().simpleName()); - boolean deprecated = a.target().asClass().hasAnnotation(Deprecated.class); + ClassInfo ci = a.target().asClass(); + model.setName(ci.simpleName()); + boolean deprecated = ci.hasAnnotation(Deprecated.class); String title = annotationValue(a, "title"); if (title == null) { title = Strings.camelCaseToDash(model.getName()); title = Strings.camelDashToTitle(title); } model.setTitle(title); - model.setClassName(a.target().asClass().name().toString()); + model.setClassName(ci.name().toString()); model.setDeprecated(deprecated); model.setDescription(annotationValue(a, "description")); - for (DotName dn : a.target().asClass().interfaceNames()) { - if (dn.packagePrefix().startsWith("org.apache.camel")) { - model.setInterfaceName(dn.toString()); - break; + model.setInterfaceName(interfaceName(index, ci)); + + // find all fields with @Metadata as options + for (FieldInfo fi : ci.fields()) { + AnnotationInstance ai = fi.annotation(METADATA); + if (ai != null) { + BeanPojoOptionModel o = new BeanPojoOptionModel(); + o.setKind("property"); + o.setName(fi.name()); + o.setLabel(annotationValue(ai, "label")); + o.setDefaultValue(annotationValue(ai, "defaultValue")); + o.setRequired("true".equals(annotationValue(ai, "required"))); + String displayName = annotationValue(ai, "title"); + if (displayName == null) { + displayName = Strings.asTitle(o.getName()); + } + o.setDisplayName(displayName); + o.setDeprecated(fi.hasAnnotation(Deprecated.class)); + o.setJavaType(fi.type().name().toString()); + o.setType(getType(o.getJavaType(), false, false)); + o.setDescription(annotationValue(ai, "description")); + String enums = annotationValue(ai, "enums"); + if (enums != null) { + String[] values = enums.split(","); + o.setEnums(Stream.of(values).map(String::trim).toList()); + } + model.addOption(o); } } - - // TODO: getter/setter for options ala EIP/components models.add(model); } }); @@ -173,8 +213,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { for (var model : models) { names.add(model.getName()); JsonObject jo = asJsonObject(model); - String json = jo.toJson(); - json = Jsoner.prettyPrint(json, 2); + String json = JsonMapper.serialize(jo); String fn = sanitizeFileName(model.getName()) + PackageHelper.JSON_SUFIX; boolean updated = updateResource(resourcesOutputDir.toPath(), "META-INF/services/org/apache/camel/bean/" + fn, @@ -197,6 +236,22 @@ public void execute() throws MojoExecutionException, MojoFailureException { } } + private static String interfaceName(Index index, ClassInfo target) { + for (DotName dn : target.interfaceNames()) { + if (dn.packagePrefix().startsWith("org.apache.camel")) { + return dn.toString(); + } + } + if (target.superName() != null) { + DotName dn = target.superName(); + ClassInfo ci = index.getClassByName(dn); + if (ci != null) { + return interfaceName(index, ci); + } + } + return null; + } + private JsonObject asJsonObject(BeanPojoModel model) { JsonObject jo = new JsonObject(); // we need to know the maven GAV also @@ -214,6 +269,12 @@ private JsonObject asJsonObject(BeanPojoModel model) { jo.put("groupId", project.getGroupId()); jo.put("artifactId", project.getArtifactId()); jo.put("version", project.getVersion()); + + if (!model.getOptions().isEmpty()) { + JsonObject options = JsonMapper.asJsonObject(model.getOptions()); + jo.put("options", options); + } + JsonObject root = new JsonObject(); root.put("bean", jo); return root; diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java index 350579b5fc6a4..95f5a1de142d3 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java @@ -16,9 +16,13 @@ */ package org.apache.camel.maven.packaging; +import java.io.File; +import java.net.URI; +import java.net.URL; import java.nio.file.Path; import java.util.Arrays; import java.util.Collections; +import java.util.Date; import java.util.List; import org.jboss.jandex.AnnotationInstance; @@ -132,4 +136,76 @@ public static String annotationValue(AnnotationInstance ann, String key) { return s == null || s.isBlank() ? null : s; } + /** + * Gets the JSON schema type. + * + * @param type the java type + * @return the json schema type, is never null, but returns object as the generic type + */ + public static String getType(String type, boolean enumType, boolean isDuration) { + if (enumType) { + return "enum"; + } else if (isDuration) { + return "duration"; + } else if (type == null) { + // return generic type for unknown type + return "object"; + } else if (type.equals(URI.class.getName()) || type.equals(URL.class.getName())) { + return "string"; + } else if (type.equals(File.class.getName())) { + return "string"; + } else if (type.equals(Date.class.getName())) { + return "string"; + } else if (type.startsWith("java.lang.Class")) { + return "string"; + } else if (type.startsWith("java.util.List") || type.startsWith("java.util.Collection")) { + return "array"; + } + + String primitive = getPrimitiveType(type); + if (primitive != null) { + return primitive; + } + + return "object"; + } + + /** + * Gets the JSON schema primitive type. + * + * @param name the java type + * @return the json schema primitive type, or null if not a primitive + */ + public static String getPrimitiveType(String name) { + // special for byte[] or Object[] as its common to use + if ("java.lang.byte[]".equals(name) || "byte[]".equals(name)) { + return "string"; + } else if ("java.lang.Byte[]".equals(name) || "Byte[]".equals(name)) { + return "array"; + } else if ("java.lang.Object[]".equals(name) || "Object[]".equals(name)) { + return "array"; + } else if ("java.lang.String[]".equals(name) || "String[]".equals(name)) { + return "array"; + } else if ("java.lang.Character".equals(name) || "Character".equals(name) || "char".equals(name)) { + return "string"; + } else if ("java.lang.String".equals(name) || "String".equals(name)) { + return "string"; + } else if ("java.lang.Boolean".equals(name) || "Boolean".equals(name) || "boolean".equals(name)) { + return "boolean"; + } else if ("java.lang.Integer".equals(name) || "Integer".equals(name) || "int".equals(name)) { + return "integer"; + } else if ("java.lang.Long".equals(name) || "Long".equals(name) || "long".equals(name)) { + return "integer"; + } else if ("java.lang.Short".equals(name) || "Short".equals(name) || "short".equals(name)) { + return "integer"; + } else if ("java.lang.Byte".equals(name) || "Byte".equals(name) || "byte".equals(name)) { + return "integer"; + } else if ("java.lang.Float".equals(name) || "Float".equals(name) || "float".equals(name)) { + return "number"; + } else if ("java.lang.Double".equals(name) || "Double".equals(name) || "double".equals(name)) { + return "number"; + } + + return null; + } } From a7c356612b1a0068e856cdf798fcc95c8ea181f0 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 14 Mar 2024 16:31:23 +0100 Subject: [PATCH 05/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../services/org/apache/camel/bean.properties | 2 +- .../bean/GroupedBodyAggregationStrategy.json | 15 +++++++++++++++ .../bean/GroupedExchangeAggregationStrategy.json | 15 +++++++++++++++ .../aggregate/GroupedBodyAggregationStrategy.java | 5 +++++ .../GroupedExchangeAggregationStrategy.java | 5 +++++ 5 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/GroupedBodyAggregationStrategy.json create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/GroupedExchangeAggregationStrategy.json diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties index 88fd1692084e9..80e93133b3c5f 100644 --- a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -1,5 +1,5 @@ # Generated by camel build tools - do NOT edit this file! -bean=GroupedMessageAggregationStrategy StringAggregationStrategy UseLatestAggregationStrategy UseOriginalAggregationStrategy +bean=GroupedBodyAggregationStrategy GroupedExchangeAggregationStrategy GroupedMessageAggregationStrategy StringAggregationStrategy UseLatestAggregationStrategy UseOriginalAggregationStrategy groupId=org.apache.camel artifactId=camel-core-processor version=4.5.0-SNAPSHOT diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/GroupedBodyAggregationStrategy.json b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/GroupedBodyAggregationStrategy.json new file mode 100644 index 0000000000000..10edccd31e12d --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/GroupedBodyAggregationStrategy.json @@ -0,0 +1,15 @@ +{ + "bean": { + "kind": "bean", + "name": "GroupedBodyAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Grouped Body Aggregation Strategy", + "description": "Aggregate body of input Message into a single combined Exchange holding all the aggregated bodies in a List of type Object as the message body. This aggregation strategy can be used in combination with Splitter to batch messages.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-core-processor", + "version": "4.5.0-SNAPSHOT" + } +} + diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/GroupedExchangeAggregationStrategy.json b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/GroupedExchangeAggregationStrategy.json new file mode 100644 index 0000000000000..7ba11aca0c4c7 --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/GroupedExchangeAggregationStrategy.json @@ -0,0 +1,15 @@ +{ + "bean": { + "kind": "bean", + "name": "GroupedExchangeAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Grouped Exchange Aggregation Strategy", + "description": "Aggregate all Exchanges into a single combined Exchange holding all the aggregated exchanges in a List of Exchange as the message body. This aggregation strategy can be used in combination with Splitter to batch messages.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-core-processor", + "version": "4.5.0-SNAPSHOT" + } +} + diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategy.java index ac5175ed2377c..d93e8f9bb0441 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategy.java @@ -20,6 +20,7 @@ import org.apache.camel.Exchange; import org.apache.camel.Message; +import org.apache.camel.spi.Metadata; /** * Aggregate body of input {@link Message} into a single combined Exchange holding all the aggregated bodies in a @@ -27,6 +28,10 @@ * * This aggregation strategy can used in combination with {@link org.apache.camel.processor.Splitter} to batch messages */ +@Metadata(label = "bean", + description = "Aggregate body of input Message into a single combined Exchange holding all the aggregated bodies in a List" + + " of type Object as the message body. This aggregation strategy can be used in combination with" + + " Splitter to batch messages.") public class GroupedBodyAggregationStrategy extends AbstractListAggregationStrategy { @Override diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategy.java index aa1f2b17392f9..7a3c0c97f3a7d 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategy.java @@ -19,6 +19,7 @@ import java.util.List; import org.apache.camel.Exchange; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.DefaultExchange; /** @@ -28,6 +29,10 @@ * Important: This strategy is not to be used with the * Content Enricher EIP which is enrich or pollEnrich. */ +@Metadata(label = "bean", + description = "Aggregate all Exchanges into a single combined Exchange holding all the aggregated exchanges in a List" + + " of Exchange as the message body. This aggregation strategy can be used in combination with" + + " Splitter to batch messages.") public class GroupedExchangeAggregationStrategy extends AbstractListAggregationStrategy { @Override From 61128a17fa15d89095d5200f191a33e0fe84f1bd Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 14 Mar 2024 17:24:54 +0100 Subject: [PATCH 06/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../services/org/apache/camel/bean.properties | 2 +- .../camel/bean/MemoryAggregationRepository.json | 16 ++++++++++++++++ .../aggregate/MemoryAggregationRepository.java | 15 ++++++++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties index 80e93133b3c5f..08e572c6577e3 100644 --- a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -1,5 +1,5 @@ # Generated by camel build tools - do NOT edit this file! -bean=GroupedBodyAggregationStrategy GroupedExchangeAggregationStrategy GroupedMessageAggregationStrategy StringAggregationStrategy UseLatestAggregationStrategy UseOriginalAggregationStrategy +bean=GroupedBodyAggregationStrategy GroupedExchangeAggregationStrategy GroupedMessageAggregationStrategy MemoryAggregationRepository StringAggregationStrategy UseLatestAggregationStrategy UseOriginalAggregationStrategy groupId=org.apache.camel artifactId=camel-core-processor version=4.5.0-SNAPSHOT diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json new file mode 100644 index 0000000000000..4e2092ec9fced --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "MemoryAggregationRepository", + "javaType": "org.apache.camel.processor.aggregate.MemoryAggregationRepository", + "interfaceType": "org.apache.camel.spi.OptimisticLockingAggregationRepository", + "title": "Memory Aggregation Repository", + "description": "A memory based AggregationRepository which stores Exchange in memory only.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-core-processor", + "version": "4.5.0-SNAPSHOT", + "options": { "optimisticLocking": { "index": 0, "kind": "property", "displayName": "Optimistic Locking", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" } } + } +} + diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java index f2c594486ba35..3e49428fd0a77 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java @@ -23,6 +23,7 @@ import org.apache.camel.CamelContext; import org.apache.camel.Exchange; +import org.apache.camel.spi.Metadata; import org.apache.camel.spi.OptimisticLockingAggregationRepository; import org.apache.camel.support.service.ServiceSupport; @@ -31,9 +32,13 @@ * * Supports both optimistic locking and non-optimistic locking modes. Defaults to non-optimistic locking mode. */ +@Metadata(label = "bean", + description = "A memory based AggregationRepository which stores Exchange in memory only.") public class MemoryAggregationRepository extends ServiceSupport implements OptimisticLockingAggregationRepository { private final ConcurrentMap cache = new ConcurrentHashMap<>(); - private final boolean optimisticLocking; + + @Metadata(description = "Whether to use optimistic locking") + private boolean optimisticLocking; public MemoryAggregationRepository() { this(false); @@ -43,6 +48,14 @@ public MemoryAggregationRepository(boolean optimisticLocking) { this.optimisticLocking = optimisticLocking; } + public boolean isOptimisticLocking() { + return optimisticLocking; + } + + public void setOptimisticLocking(boolean optimisticLocking) { + this.optimisticLocking = optimisticLocking; + } + @Override public Exchange add(CamelContext camelContext, String key, Exchange oldExchange, Exchange newExchange) { if (!optimisticLocking) { From 8f3e3a24b647ba0341a337238c509ca4d710f970 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 14 Mar 2024 17:38:29 +0100 Subject: [PATCH 07/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../services/org/apache/camel/bean.properties | 7 +++++++ .../camel/bean/FileIdempotentRepository.json | 16 ++++++++++++++++ .../camel/bean/MemoryIdempotentRepository.json | 16 ++++++++++++++++ .../idempotent/FileIdempotentRepository.java | 10 ++++++++-- .../idempotent/MemoryIdempotentRepository.java | 5 +++++ 5 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json create mode 100644 core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..5a5da2cace5e0 --- /dev/null +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=FileIdempotentRepository MemoryIdempotentRepository +groupId=org.apache.camel +artifactId=camel-support +version=4.5.0-SNAPSHOT +projectName=Camel :: Support +projectDescription=The Camel Support diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json new file mode 100644 index 0000000000000..48cdb0868abd3 --- /dev/null +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "FileIdempotentRepository", + "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "File Idempotent Repository", + "description": "A file based IdempotentRepository.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-support", + "version": "4.5.0-SNAPSHOT", + "options": { "dropOldestFileStore": { "index": 0, "kind": "property", "displayName": "Drop Oldest File Store", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk space to allow room for new entries." }, "fileStore": { "index": 1, "kind": "property", "displayName": "File Store", "required": true, "type": "string", "javaType": "java.io.File", "deprecated": false, "autowired": false, "secret": false, "description": "File name of the repository (incl directory)" }, "maxFileStoreSize": { "index": 2, "kind": "property", "displayName": "Max File Store Size", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "32768000", "description": "The maximum file size for the file store in bytes. The default value is 32mb" } } + } +} + diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json new file mode 100644 index 0000000000000..84aac9a7c6661 --- /dev/null +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "MemoryIdempotentRepository", + "javaType": "org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Memory Idempotent Repository", + "description": "A memory based IdempotentRepository.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-support", + "version": "4.5.0-SNAPSHOT", + "options": { "cacheSize": { "index": 0, "kind": "property", "displayName": "Cache Size", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Maximum elements that can be stored in-memory" } } + } +} + diff --git a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java index 085b4da115be4..c1f4b296ee702 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java @@ -29,6 +29,7 @@ import org.apache.camel.api.management.ManagedOperation; import org.apache.camel.api.management.ManagedResource; import org.apache.camel.spi.IdempotentRepository; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.LRUCache; import org.apache.camel.support.LRUCacheFactory; import org.apache.camel.support.service.ServiceSupport; @@ -50,18 +51,23 @@ * {@link #getDropOldestFileStore()} (is default 1000) number of entries from the file store is dropped to reduce the * file store and make room for newer entries. */ +@Metadata(label = "bean", + description = "A file based IdempotentRepository.") @ManagedResource(description = "File based idempotent repository") public class FileIdempotentRepository extends ServiceSupport implements IdempotentRepository { private static final Logger LOG = LoggerFactory.getLogger(FileIdempotentRepository.class); - private static final String STORE_DELIMITER = "\n"; private final AtomicBoolean init = new AtomicBoolean(); - private Map cache; + + @Metadata(description = "File name of the repository (incl directory)", required = true) private File fileStore; + @Metadata(description = "The maximum file size for the file store in bytes. The default value is 32mb", defaultValue = "" + 32 * 1024 * 1000L) private long maxFileStoreSize = 32 * 1024 * 1000L; // 32mb store file + @Metadata(description = "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk" + + " space to allow room for new entries.", defaultValue = "1000") private long dropOldestFileStore = 1000; public FileIdempotentRepository() { diff --git a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java index 5a8cf516f4074..22a0d14506ea4 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java @@ -22,6 +22,7 @@ import org.apache.camel.api.management.ManagedOperation; import org.apache.camel.api.management.ManagedResource; import org.apache.camel.spi.IdempotentRepository; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.LRUCache; import org.apache.camel.support.LRUCacheFactory; import org.apache.camel.support.service.ServiceSupport; @@ -31,9 +32,13 @@ *

* Care should be taken to use a suitable underlying {@link Map} to avoid this class being a memory leak. */ +@Metadata(label = "bean", + description = "A memory based IdempotentRepository.") @ManagedResource(description = "Memory based idempotent repository") public class MemoryIdempotentRepository extends ServiceSupport implements IdempotentRepository { private Map cache; + + @Metadata(description = "Maximum elements that can be stored in-memory", defaultValue = "1000") private int cacheSize; public MemoryIdempotentRepository() { From d54d481bcce9503c2d6caddb5ac5e36ef5a51242 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 14 Mar 2024 18:11:54 +0100 Subject: [PATCH 08/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../services/org/apache/camel/bean.properties | 2 +- .../bean/DefaultHeaderFilterStrategy.json | 16 ++++++++ .../camel/bean/FileIdempotentRepository.json | 2 +- .../bean/MemoryIdempotentRepository.json | 2 +- .../support/DefaultHeaderFilterStrategy.java | 41 +++++++++++++++++-- .../idempotent/FileIdempotentRepository.java | 8 ++-- .../MemoryIdempotentRepository.java | 2 +- .../maven/packaging/GeneratePojoBeanMojo.java | 8 +++- 8 files changed, 68 insertions(+), 13 deletions(-) create mode 100644 core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean.properties index 5a5da2cace5e0..25ce5d4b2f9b8 100644 --- a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean.properties +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -1,5 +1,5 @@ # Generated by camel build tools - do NOT edit this file! -bean=FileIdempotentRepository MemoryIdempotentRepository +bean=DefaultHeaderFilterStrategy FileIdempotentRepository MemoryIdempotentRepository groupId=org.apache.camel artifactId=camel-support version=4.5.0-SNAPSHOT diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json new file mode 100644 index 0000000000000..8d359b034cd44 --- /dev/null +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "DefaultHeaderFilterStrategy", + "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", + "interfaceType": "org.apache.camel.spi.HeaderFilterStrategy", + "title": "Default Header Filter Strategy", + "description": "The default header filtering strategy. Users can configure which headers is allowed or denied.", + "deprecated": true, + "groupId": "org.apache.camel", + "artifactId": "camel-support", + "version": "4.5.0-SNAPSHOT", + "options": { "allowNullValues": { "index": 0, "kind": "property", "displayName": "Allow Null Values", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether to allow null values. By default a header is skipped if its value is null. Setting this to true will preserve the header." }, "caseInsensitive": { "index": 1, "kind": "property", "displayName": "Case Insensitive", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Sets the caseInsensitive property which is a boolean to determine whether header names should be case insensitive when checking it with the filter set. It does not affect filtering using regular expression pattern." }, "filterOnMatch": { "index": 2, "kind": "property", "displayName": "Filter On Match", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Sets what to do when a pattern or filter set is matched. When set to true, a match will filter out the header. This is the default value for backwards compatibility. When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be filtered (skipped)." }, "inFilter": { "index": 3, "kind": "property", "displayName": "In Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the in direction filter set. The in direction is referred to copying headers from an external message to a Camel message. Multiple patterns can be separated by comma" }, "lowerCase": { "index": 4, "kind": "property", "displayName": "Lower Case", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether header names should be converted to lower case before checking it with the filter Set. It does not affect filtering using regular expression pattern." }, "outFilter": { "index": 5, "kind": "property", "displayName": "Out Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the out direction filter set. The out direction is referred to copying headers from a Camel message to an external message. Multiple patterns can be separated by comma" } } + } +} + diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json index 48cdb0868abd3..e40fb4b2beeeb 100644 --- a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-support", "version": "4.5.0-SNAPSHOT", - "options": { "dropOldestFileStore": { "index": 0, "kind": "property", "displayName": "Drop Oldest File Store", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk space to allow room for new entries." }, "fileStore": { "index": 1, "kind": "property", "displayName": "File Store", "required": true, "type": "string", "javaType": "java.io.File", "deprecated": false, "autowired": false, "secret": false, "description": "File name of the repository (incl directory)" }, "maxFileStoreSize": { "index": 2, "kind": "property", "displayName": "Max File Store Size", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "32768000", "description": "The maximum file size for the file store in bytes. The default value is 32mb" } } + "options": { "dropOldestFileStore": { "index": 0, "kind": "property", "displayName": "Drop Oldest File Store", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk space to allow room for new entries." }, "fileStore": { "index": 1, "kind": "property", "displayName": "File Store", "required": true, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "File name of the repository (incl directory)" }, "maxFileStoreSize": { "index": 2, "kind": "property", "displayName": "Max File Store Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "32768000", "description": "The maximum file size for the file store in bytes. The default value is 32mb" } } } } diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json index 84aac9a7c6661..4c152136b5164 100644 --- a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-support", "version": "4.5.0-SNAPSHOT", - "options": { "cacheSize": { "index": 0, "kind": "property", "displayName": "Cache Size", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Maximum elements that can be stored in-memory" } } + "options": { "cacheSize": { "index": 0, "kind": "property", "displayName": "Cache Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Maximum elements that can be stored in-memory" } } } } diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java index 7a99e29ab160f..901af91262f39 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java @@ -23,17 +23,20 @@ import org.apache.camel.Exchange; import org.apache.camel.spi.HeaderFilterStrategy; +import org.apache.camel.spi.Metadata; /** * The default header filtering strategy. Users can configure filter by setting filter set and/or setting a regular * expression. Subclass can add extended filter logic in * {@link #extendedFilter(org.apache.camel.spi.HeaderFilterStrategy.Direction, String, Object, org.apache.camel.Exchange)} - * + *

* Filters are associated with directions (in or out). "In" direction is referred to propagating headers "to" Camel * message. The "out" direction is opposite which is referred to propagating headers from Camel message to a native * message like JMS and CXF message. You can see example of DefaultHeaderFilterStrategy are being extended and invoked * in camel-jms and camel-cxf components. */ +@Metadata(label = "bean", + description = "The default header filtering strategy. Users can configure which headers is allowed or denied.") public class DefaultHeaderFilterStrategy implements HeaderFilterStrategy { /** @@ -49,17 +52,35 @@ public class DefaultHeaderFilterStrategy implements HeaderFilterStrategy { */ public static final String[] CAMEL_FILTER_STARTS_WITH = new String[] { "Camel", "camel", "org.apache.camel." }; + @Metadata(javaType = "java.lang.String", + description = "Sets the in direction filter set. The in direction is referred to copying headers from an external message to a Camel message." + + " Multiple patterns can be separated by comma") private Set inFilter; private Pattern inFilterPattern; private String[] inFilterStartsWith; + @Metadata(javaType = "java.lang.String", + description = "Sets the out direction filter set. The out direction is referred to copying headers from a Camel message to an external message." + + " Multiple patterns can be separated by comma") private Set outFilter; private Pattern outFilterPattern; private String[] outFilterStartsWith; + @Metadata(label = "advanced", defaultValue = "false", + description = "Whether header names should be converted to lower case before checking it with the filter Set." + + " It does not affect filtering using regular expression pattern.") private boolean lowerCase; + @Metadata(label = "advanced", defaultValue = "false", + description = "Whether to allow null values. By default a header is skipped if its value is null. Setting this to true will preserve the header.") private boolean allowNullValues; + @Metadata(label = "advanced", defaultValue = "false", + description = "Sets the caseInsensitive property which is a boolean to determine whether header names should be case insensitive" + + " when checking it with the filter set. It does not affect filtering using regular expression pattern.") private boolean caseInsensitive; + @Metadata(label = "advanced", defaultValue = "true", + description = "Sets what to do when a pattern or filter set is matched." + + " When set to true, a match will filter out the header. This is the default value for backwards compatibility." + + " When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be filtered (skipped).") private boolean filterOnMatch = true; // defaults to the previous behaviour @Override @@ -96,6 +117,12 @@ public void setOutFilter(Set value) { outFilter = value; } + public void setOutFilter(String value) { + if (value != null) { + this.outFilter = Set.of(value.split(",")); + } + } + /** * Sets the "out" direction filter by starts with pattern. The "out" direction is referred to copying headers from a * Camel message to an external message. @@ -166,6 +193,12 @@ public void setInFilter(Set value) { inFilter = value; } + public void setInFilter(String value) { + if (value != null) { + this.inFilter = Set.of(value.split(",")); + } + } + /** * Sets the "in" direction filter by starts with pattern. The "in" direction is referred to copying headers from an * external message to a Camel message. @@ -255,7 +288,7 @@ public boolean isAllowNullValues() { /** * Whether to allow null values. - * + *

* By default a header is skipped if its value is null. Setting this to true will preserve the header. */ public void setAllowNullValues(boolean value) { @@ -269,9 +302,9 @@ public boolean isFilterOnMatch() { /** * Sets the filterOnMatch property which is a boolean to determine what to do when a pattern or filter set is * matched. - * + *

* When set to true, a match will filter out the header. This is the default value for backwards compatibility. - * + *

* When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be * filtered (skipped). * diff --git a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java index c1f4b296ee702..7770ba84ba9f4 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java @@ -52,7 +52,7 @@ * file store and make room for newer entries. */ @Metadata(label = "bean", - description = "A file based IdempotentRepository.") + description = "A file based IdempotentRepository.") @ManagedResource(description = "File based idempotent repository") public class FileIdempotentRepository extends ServiceSupport implements IdempotentRepository { @@ -64,10 +64,12 @@ public class FileIdempotentRepository extends ServiceSupport implements Idempote @Metadata(description = "File name of the repository (incl directory)", required = true) private File fileStore; - @Metadata(description = "The maximum file size for the file store in bytes. The default value is 32mb", defaultValue = "" + 32 * 1024 * 1000L) + @Metadata(description = "The maximum file size for the file store in bytes. The default value is 32mb", + defaultValue = "" + 32 * 1024 * 1000L) private long maxFileStoreSize = 32 * 1024 * 1000L; // 32mb store file @Metadata(description = "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk" - + " space to allow room for new entries.", defaultValue = "1000") + + " space to allow room for new entries.", + defaultValue = "1000") private long dropOldestFileStore = 1000; public FileIdempotentRepository() { diff --git a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java index 22a0d14506ea4..898489d9bde29 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java @@ -33,7 +33,7 @@ * Care should be taken to use a suitable underlying {@link Map} to avoid this class being a memory leak. */ @Metadata(label = "bean", - description = "A memory based IdempotentRepository.") + description = "A memory based IdempotentRepository.") @ManagedResource(description = "Memory based idempotent repository") public class MemoryIdempotentRepository extends ServiceSupport implements IdempotentRepository { private Map cache; diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java index 4787b30784131..f9d3e0f640097 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java @@ -191,8 +191,12 @@ public void execute() throws MojoExecutionException, MojoFailureException { } o.setDisplayName(displayName); o.setDeprecated(fi.hasAnnotation(Deprecated.class)); - o.setJavaType(fi.type().name().toString()); - o.setType(getType(o.getJavaType(), false, false)); + String javaType = annotationValue(ai, "javaType"); + if (javaType == null) { + javaType = ci.name().toString(); + } + o.setJavaType(javaType); + o.setType(getType(javaType, false, false)); o.setDescription(annotationValue(ai, "description")); String enums = annotationValue(ai, "enums"); if (enums != null) { From 245ea4b9a245d9abe9183d1ec24787a6bc99a1cb Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 14 Mar 2024 18:48:09 +0100 Subject: [PATCH 09/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../org/apache/camel/catalog/beans.properties | 10 +++ .../beans/DefaultHeaderFilterStrategy.json | 16 +++++ .../beans/FileIdempotentRepository.json | 16 +++++ .../beans/GroupedBodyAggregationStrategy.json | 15 ++++ .../GroupedExchangeAggregationStrategy.json | 15 ++++ .../GroupedMessageAggregationStrategy.json | 15 ++++ .../beans/MemoryAggregationRepository.json | 16 +++++ .../beans/MemoryIdempotentRepository.json | 16 +++++ .../beans/StringAggregationStrategy.json | 16 +++++ .../beans/UseLatestAggregationStrategy.json | 15 ++++ .../beans/UseOriginalAggregationStrategy.json | 15 ++++ .../bean/DefaultHeaderFilterStrategy.json | 2 +- .../camel/bean/FileIdempotentRepository.json | 2 +- .../bean/MemoryIdempotentRepository.json | 2 +- .../camel/tooling/model/JsonMapper.java | 38 ++++++++++ .../camel/tooling/model/PojoBeanModel.java | 46 +++++++++++++ .../maven/packaging/GeneratePojoBeanMojo.java | 2 +- .../maven/packaging/PrepareCatalogMojo.java | 69 ++++++++++++++++++- 18 files changed, 321 insertions(+), 5 deletions(-) create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/DefaultHeaderFilterStrategy.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/FileIdempotentRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/GroupedBodyAggregationStrategy.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/GroupedExchangeAggregationStrategy.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/GroupedMessageAggregationStrategy.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryAggregationRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryIdempotentRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/StringAggregationStrategy.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/UseLatestAggregationStrategy.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/UseOriginalAggregationStrategy.json create mode 100644 tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/PojoBeanModel.java diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties new file mode 100644 index 0000000000000..682e217224dfc --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties @@ -0,0 +1,10 @@ +DefaultHeaderFilterStrategy +FileIdempotentRepository +GroupedBodyAggregationStrategy +GroupedExchangeAggregationStrategy +GroupedMessageAggregationStrategy +MemoryAggregationRepository +MemoryIdempotentRepository +StringAggregationStrategy +UseLatestAggregationStrategy +UseOriginalAggregationStrategy diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/DefaultHeaderFilterStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/DefaultHeaderFilterStrategy.json new file mode 100644 index 0000000000000..bfe3e06376ad1 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/DefaultHeaderFilterStrategy.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "DefaultHeaderFilterStrategy", + "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", + "interfaceType": "org.apache.camel.spi.HeaderFilterStrategy", + "title": "Default Header Filter Strategy", + "description": "The default header filtering strategy. Users can configure which headers is allowed or denied.", + "deprecated": true, + "groupId": "org.apache.camel", + "artifactId": "camel-support", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowNullValues": { "index": 0, "kind": "property", "displayName": "Allow Null Values", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether to allow null values. By default a header is skipped if its value is null. Setting this to true will preserve the header." }, "caseInsensitive": { "index": 1, "kind": "property", "displayName": "Case Insensitive", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Sets the caseInsensitive property which is a boolean to determine whether header names should be case insensitive when checking it with the filter set. It does not affect filtering using regular expression pattern." }, "filterOnMatch": { "index": 2, "kind": "property", "displayName": "Filter On Match", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Sets what to do when a pattern or filter set is matched. When set to true, a match will filter out the header. This is the default value for backwards compatibility. When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be filtered (skipped)." }, "inFilter": { "index": 3, "kind": "property", "displayName": "In Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the in direction filter set. The in direction is referred to copying headers from an external message to a Camel message. Multiple patterns can be separated by comma" }, "lowerCase": { "index": 4, "kind": "property", "displayName": "Lower Case", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether header names should be converted to lower case before checking it with the filter Set. It does not affect filtering using regular expression pattern." }, "outFilter": { "index": 5, "kind": "property", "displayName": "Out Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the out direction filter set. The out direction is referred to copying headers from a Camel message to an external message. Multiple patterns can be separated by comma" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/FileIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/FileIdempotentRepository.json new file mode 100644 index 0000000000000..ca6dbee7ea321 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/FileIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "FileIdempotentRepository", + "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "File Idempotent Repository", + "description": "A file based IdempotentRepository.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-support", + "version": "4.5.0-SNAPSHOT", + "properties": { "dropOldestFileStore": { "index": 0, "kind": "property", "displayName": "Drop Oldest File Store", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk space to allow room for new entries." }, "fileStore": { "index": 1, "kind": "property", "displayName": "File Store", "required": true, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "File name of the repository (incl directory)" }, "maxFileStoreSize": { "index": 2, "kind": "property", "displayName": "Max File Store Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "32768000", "description": "The maximum file size for the file store in bytes. The default value is 32mb" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/GroupedBodyAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/GroupedBodyAggregationStrategy.json new file mode 100644 index 0000000000000..10edccd31e12d --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/GroupedBodyAggregationStrategy.json @@ -0,0 +1,15 @@ +{ + "bean": { + "kind": "bean", + "name": "GroupedBodyAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Grouped Body Aggregation Strategy", + "description": "Aggregate body of input Message into a single combined Exchange holding all the aggregated bodies in a List of type Object as the message body. This aggregation strategy can be used in combination with Splitter to batch messages.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-core-processor", + "version": "4.5.0-SNAPSHOT" + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/GroupedExchangeAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/GroupedExchangeAggregationStrategy.json new file mode 100644 index 0000000000000..7ba11aca0c4c7 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/GroupedExchangeAggregationStrategy.json @@ -0,0 +1,15 @@ +{ + "bean": { + "kind": "bean", + "name": "GroupedExchangeAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Grouped Exchange Aggregation Strategy", + "description": "Aggregate all Exchanges into a single combined Exchange holding all the aggregated exchanges in a List of Exchange as the message body. This aggregation strategy can be used in combination with Splitter to batch messages.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-core-processor", + "version": "4.5.0-SNAPSHOT" + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/GroupedMessageAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/GroupedMessageAggregationStrategy.json new file mode 100644 index 0000000000000..a03cad939d9e8 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/GroupedMessageAggregationStrategy.json @@ -0,0 +1,15 @@ +{ + "bean": { + "kind": "bean", + "name": "GroupedMessageAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.GroupedMessageAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Grouped Message Aggregation Strategy", + "description": "Aggregate all Message into a single combined Exchange holding all the aggregated messages in a List of Message as the message body. This aggregation strategy can be used in combination with Splitter to batch messages.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-core-processor", + "version": "4.5.0-SNAPSHOT" + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryAggregationRepository.json new file mode 100644 index 0000000000000..4e2092ec9fced --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "MemoryAggregationRepository", + "javaType": "org.apache.camel.processor.aggregate.MemoryAggregationRepository", + "interfaceType": "org.apache.camel.spi.OptimisticLockingAggregationRepository", + "title": "Memory Aggregation Repository", + "description": "A memory based AggregationRepository which stores Exchange in memory only.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-core-processor", + "version": "4.5.0-SNAPSHOT", + "options": { "optimisticLocking": { "index": 0, "kind": "property", "displayName": "Optimistic Locking", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryIdempotentRepository.json new file mode 100644 index 0000000000000..a70bbdcdf2e97 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "MemoryIdempotentRepository", + "javaType": "org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Memory Idempotent Repository", + "description": "A memory based IdempotentRepository.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-support", + "version": "4.5.0-SNAPSHOT", + "properties": { "cacheSize": { "index": 0, "kind": "property", "displayName": "Cache Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Maximum elements that can be stored in-memory" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/StringAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/StringAggregationStrategy.json new file mode 100644 index 0000000000000..1702da816d72f --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/StringAggregationStrategy.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "StringAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.StringAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "String Aggregation Strategy", + "description": "Aggregate result of pick expression into a single combined Exchange holding all the aggregated bodies in a String as the message body. This aggregation strategy can used in combination with Splitter to batch messages", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-core-processor", + "version": "4.5.0-SNAPSHOT", + "options": { "delimiter": { "index": 0, "kind": "property", "displayName": "Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Delimiter used for joining strings together." } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/UseLatestAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/UseLatestAggregationStrategy.json new file mode 100644 index 0000000000000..5d73c66d7910e --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/UseLatestAggregationStrategy.json @@ -0,0 +1,15 @@ +{ + "bean": { + "kind": "bean", + "name": "UseLatestAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.UseLatestAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Use Latest Aggregation Strategy", + "description": "An AggregationStrategy which just uses the latest exchange which is useful for status messages where old status messages have no real value. Another example is things like market data prices, where old stock prices are not that relevant, only the current price is.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-core-processor", + "version": "4.5.0-SNAPSHOT" + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/UseOriginalAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/UseOriginalAggregationStrategy.json new file mode 100644 index 0000000000000..7ab066f5d7953 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/UseOriginalAggregationStrategy.json @@ -0,0 +1,15 @@ +{ + "bean": { + "kind": "bean", + "name": "UseOriginalAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.UseOriginalAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Use Original Aggregation Strategy", + "description": "An AggregationStrategy which just uses the original exchange which can be needed when you want to preserve the original Exchange. For example when splitting an Exchange and then you may want to keep routing using the original Exchange.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-core-processor", + "version": "4.5.0-SNAPSHOT" + } +} + diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json index 8d359b034cd44..bfe3e06376ad1 100644 --- a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-support", "version": "4.5.0-SNAPSHOT", - "options": { "allowNullValues": { "index": 0, "kind": "property", "displayName": "Allow Null Values", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether to allow null values. By default a header is skipped if its value is null. Setting this to true will preserve the header." }, "caseInsensitive": { "index": 1, "kind": "property", "displayName": "Case Insensitive", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Sets the caseInsensitive property which is a boolean to determine whether header names should be case insensitive when checking it with the filter set. It does not affect filtering using regular expression pattern." }, "filterOnMatch": { "index": 2, "kind": "property", "displayName": "Filter On Match", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Sets what to do when a pattern or filter set is matched. When set to true, a match will filter out the header. This is the default value for backwards compatibility. When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be filtered (skipped)." }, "inFilter": { "index": 3, "kind": "property", "displayName": "In Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the in direction filter set. The in direction is referred to copying headers from an external message to a Camel message. Multiple patterns can be separated by comma" }, "lowerCase": { "index": 4, "kind": "property", "displayName": "Lower Case", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether header names should be converted to lower case before checking it with the filter Set. It does not affect filtering using regular expression pattern." }, "outFilter": { "index": 5, "kind": "property", "displayName": "Out Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the out direction filter set. The out direction is referred to copying headers from a Camel message to an external message. Multiple patterns can be separated by comma" } } + "properties": { "allowNullValues": { "index": 0, "kind": "property", "displayName": "Allow Null Values", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether to allow null values. By default a header is skipped if its value is null. Setting this to true will preserve the header." }, "caseInsensitive": { "index": 1, "kind": "property", "displayName": "Case Insensitive", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Sets the caseInsensitive property which is a boolean to determine whether header names should be case insensitive when checking it with the filter set. It does not affect filtering using regular expression pattern." }, "filterOnMatch": { "index": 2, "kind": "property", "displayName": "Filter On Match", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Sets what to do when a pattern or filter set is matched. When set to true, a match will filter out the header. This is the default value for backwards compatibility. When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be filtered (skipped)." }, "inFilter": { "index": 3, "kind": "property", "displayName": "In Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the in direction filter set. The in direction is referred to copying headers from an external message to a Camel message. Multiple patterns can be separated by comma" }, "lowerCase": { "index": 4, "kind": "property", "displayName": "Lower Case", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether header names should be converted to lower case before checking it with the filter Set. It does not affect filtering using regular expression pattern." }, "outFilter": { "index": 5, "kind": "property", "displayName": "Out Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the out direction filter set. The out direction is referred to copying headers from a Camel message to an external message. Multiple patterns can be separated by comma" } } } } diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json index e40fb4b2beeeb..ca6dbee7ea321 100644 --- a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-support", "version": "4.5.0-SNAPSHOT", - "options": { "dropOldestFileStore": { "index": 0, "kind": "property", "displayName": "Drop Oldest File Store", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk space to allow room for new entries." }, "fileStore": { "index": 1, "kind": "property", "displayName": "File Store", "required": true, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "File name of the repository (incl directory)" }, "maxFileStoreSize": { "index": 2, "kind": "property", "displayName": "Max File Store Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "32768000", "description": "The maximum file size for the file store in bytes. The default value is 32mb" } } + "properties": { "dropOldestFileStore": { "index": 0, "kind": "property", "displayName": "Drop Oldest File Store", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk space to allow room for new entries." }, "fileStore": { "index": 1, "kind": "property", "displayName": "File Store", "required": true, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "File name of the repository (incl directory)" }, "maxFileStoreSize": { "index": 2, "kind": "property", "displayName": "Max File Store Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "32768000", "description": "The maximum file size for the file store in bytes. The default value is 32mb" } } } } diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json index 4c152136b5164..a70bbdcdf2e97 100644 --- a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-support", "version": "4.5.0-SNAPSHOT", - "options": { "cacheSize": { "index": 0, "kind": "property", "displayName": "Cache Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Maximum elements that can be stored in-memory" } } + "properties": { "cacheSize": { "index": 0, "kind": "property", "displayName": "Cache Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Maximum elements that can be stored in-memory" } } } } diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java index 2cda577d49115..8b5302d501160 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java @@ -71,6 +71,8 @@ public static BaseModel generateModel(JsonObject obj) { return generateOtherModel(obj); } else if (obj.containsKey("model")) { return generateEipModel(obj); + } else if (obj.containsKey("bean")) { + return generatePojoBeanModel(obj); } else { return null; } @@ -315,6 +317,27 @@ public static EipModel generateEipModel(JsonObject obj) { return model; } + public static PojoBeanModel generatePojoBeanModel(String json) { + JsonObject obj = deserialize(json); + return generatePojoBeanModel(obj); + } + + public static PojoBeanModel generatePojoBeanModel(JsonObject obj) { + JsonObject mobj = (JsonObject) obj.get("bean"); + PojoBeanModel model = new PojoBeanModel(); + parseModel(mobj, model); + JsonObject mprp = (JsonObject) obj.get("properties"); + if (mprp != null) { + for (Map.Entry entry : mprp.entrySet()) { + JsonObject mp = (JsonObject) entry.getValue(); + PojoBeanModel.PojoBeanOptionModel option = new PojoBeanModel.PojoBeanOptionModel(); + parseOption(mp, option, entry.getKey()); + model.addOption(option); + } + } + return model; + } + public static String createParameterJsonSchema(EipModel model) { JsonObject wrapper = asJsonObject(model); return serialize(wrapper); @@ -336,6 +359,21 @@ public static JsonObject asJsonObject(EipModel model) { return wrapper; } + public static String createParameterJsonSchema(PojoBeanModel model) { + JsonObject wrapper = asJsonObject(model); + return serialize(wrapper); + } + + public static JsonObject asJsonObject(PojoBeanModel model) { + JsonObject obj = new JsonObject(); + baseToJson(model, obj); + obj.entrySet().removeIf(e -> e.getValue() == null); + JsonObject wrapper = new JsonObject(); + wrapper.put("model", obj); + wrapper.put("properties", asJsonObject(model.getOptions())); + return wrapper; + } + public static LanguageModel generateLanguageModel(String json) { JsonObject obj = deserialize(json); return generateLanguageModel(obj); diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/PojoBeanModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/PojoBeanModel.java new file mode 100644 index 0000000000000..fccb953d2f87a --- /dev/null +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/PojoBeanModel.java @@ -0,0 +1,46 @@ +/* + * 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.tooling.model; + +import java.util.ArrayList; +import java.util.List; + +public class PojoBeanModel extends BaseModel { + + protected final List options = new ArrayList<>(); + + public PojoBeanModel() { + } + + public void addOption(PojoBeanModel.PojoBeanOptionModel option) { + options.add(option); + } + + @Override + public List getOptions() { + return options; + } + + @Override + public String getKind() { + return "bean"; + } + + public static class PojoBeanOptionModel extends BaseOptionModel { + + } +} diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java index f9d3e0f640097..a19a72ac9df78 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java @@ -276,7 +276,7 @@ private JsonObject asJsonObject(BeanPojoModel model) { if (!model.getOptions().isEmpty()) { JsonObject options = JsonMapper.asJsonObject(model.getOptions()); - jo.put("options", options); + jo.put("properties", options); } JsonObject root = new JsonObject(); diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java index 6809cafa0c9dc..3a1561a74d099 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java @@ -49,6 +49,7 @@ import org.apache.camel.tooling.model.JsonMapper; import org.apache.camel.tooling.model.LanguageModel; import org.apache.camel.tooling.model.OtherModel; +import org.apache.camel.tooling.model.PojoBeanModel; import org.apache.camel.tooling.model.TransformerModel; import org.apache.camel.tooling.util.FileUtil; import org.apache.camel.tooling.util.PackageHelper; @@ -119,6 +120,12 @@ public class PrepareCatalogMojo extends AbstractMojo { @Parameter(defaultValue = "${project.basedir}/src/generated/resources/org/apache/camel/catalog/transformers") protected File transformersOutDir; + /** + * The output directory for pojo beans catalog + */ + @Parameter(defaultValue = "${project.basedir}/src/generated/resources/org/apache/camel/catalog/beans") + protected File beansOutDir; + /** * The output directory for dev-consoles catalog */ @@ -329,7 +336,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { allJsonFiles.add(p); } else if (f.equals("component.properties") || f.equals("dataformat.properties") || f.equals("language.properties") || f.equals("other.properties") - || f.equals("transformer.properties")) { + || f.equals("transformer.properties") || f.equals("bean.properties")) { allPropertiesFiles.add(p); } }); @@ -381,6 +388,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { Set dataformats = executeDataFormats(); Set languages = executeLanguages(); Set transformers = executeTransformers(); + Set beans = executeBeans(); Set consoles = executeDevConsoles(); Set others = executeOthers(); executeDocuments(components, dataformats, languages, others); @@ -771,6 +779,48 @@ protected Set executeTransformers() throws Exception { return transformerNames; } + protected Set executeBeans() throws Exception { + Path beansOutDir = this.beansOutDir.toPath(); + + getLog().info("Copying all Camel pojo bean json descriptors"); + + // lets use sorted set/maps + Set jsonFiles; + Set duplicateJsonFiles; + Set beanFiles; + + // find all beans from the components directory + beanFiles = allPropertiesFiles.stream().filter(p -> p.endsWith("bean.properties")) + .collect(Collectors.toCollection(TreeSet::new)); + jsonFiles = allJsonFiles.stream().filter(p -> allModels.get(p) instanceof PojoBeanModel) + .collect(Collectors.toCollection(TreeSet::new)); + + getLog().info("Found " + beanFiles.size() + " bean.properties files"); + getLog().info("Found " + jsonFiles.size() + " bean json files"); + + // make sure to create out dir + Files.createDirectories(beansOutDir); + + // Check duplicates + duplicateJsonFiles = getDuplicates(jsonFiles); + + // Copy all descriptors + Map newJsons = map(jsonFiles, p -> p, p -> beansOutDir.resolve(p.getFileName())); + try (Stream stream = list(beansOutDir).filter(p -> !newJsons.containsValue(p))) { + stream.forEach(this::delete); + } + newJsons.forEach(this::copy); + + Path all = beansOutDir.resolve("../beans.properties"); + Set beanNames + = jsonFiles.stream().map(PrepareCatalogMojo::asComponentName).collect(Collectors.toCollection(TreeSet::new)); + FileUtil.updateFile(all, String.join("\n", beanNames) + "\n"); + + printBeansReport(jsonFiles, duplicateJsonFiles); + + return beanNames; + } + protected Set executeDevConsoles() throws Exception { Path consolesOutDir = this.consolesOutDir.toPath(); @@ -1273,6 +1323,23 @@ private void printTransformersReport( getLog().info(SEPARATOR); } + private void printBeansReport( + Set json, Set duplicate) { + getLog().info(SEPARATOR); + getLog().info(""); + getLog().info("Camel pojo beans catalog report"); + getLog().info(""); + getLog().info("\tPojo beans found: " + json.size()); + printComponentDebug(json); + if (!duplicate.isEmpty()) { + getLog().info(""); + getLog().warn("\tDuplicate pojo beans detected: " + duplicate.size()); + printComponentWarning(duplicate); + } + getLog().info(""); + getLog().info(SEPARATOR); + } + private void printConsolesReport( Set json, Set duplicate) { getLog().info(SEPARATOR); From 7420691218d04ca1597e866bf4e9f80513d9c44d Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 14 Mar 2024 19:47:37 +0100 Subject: [PATCH 10/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../org/apache/camel/catalog/beans.properties | 1 + .../catalog/beans/ZipAggregationStrategy.json | 16 +++++++++++ .../services/org/apache/camel/bean.properties | 7 +++++ .../camel/bean/ZipAggregationStrategy.json | 16 +++++++++++ .../zipfile/ZipAggregationStrategy.java | 28 +++++++++++++++++++ 5 files changed, 68 insertions(+) create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/ZipAggregationStrategy.json create mode 100644 components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/bean/ZipAggregationStrategy.json diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties index 682e217224dfc..d3d0542f64e7e 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties @@ -8,3 +8,4 @@ MemoryIdempotentRepository StringAggregationStrategy UseLatestAggregationStrategy UseOriginalAggregationStrategy +ZipAggregationStrategy diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/ZipAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/ZipAggregationStrategy.json new file mode 100644 index 0000000000000..edd5aa7271d64 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/ZipAggregationStrategy.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "ZipAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Zip Aggregation Strategy", + "description": "AggregationStrategy to zip together incoming messages into a zip file. Please note that this aggregation strategy requires eager completion check to work properly.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-zipfile", + "version": "4.5.0-SNAPSHOT", + "properties": { "filePrefix": { "index": 0, "kind": "property", "displayName": "File Prefix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the prefix that will be used when creating the ZIP filename." }, "fileSuffix": { "index": 1, "kind": "property", "displayName": "File Suffix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "zip", "description": "Sets the suffix that will be used when creating the ZIP filename." }, "parentDir": { "index": 2, "kind": "property", "displayName": "Parent Dir", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the parent directory to use for writing temporary files" }, "preserveFolderStructure": { "index": 3, "kind": "property", "displayName": "Preserve Folder Structure", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "If the incoming message is from a file, then the folder structure of said file can be preserved" }, "useFilenameHeader": { "index": 4, "kind": "property", "displayName": "Use Filename Header", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use CamelFileName header for the filename instead of using unique message id" }, "useTempFile": { "index": 5, "kind": "property", "displayName": "Use Temp File", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use temporary files for zip manipulations instead of memory." } } + } +} + diff --git a/components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..625e97348461f --- /dev/null +++ b/components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=ZipAggregationStrategy +groupId=org.apache.camel +artifactId=camel-zipfile +version=4.5.0-SNAPSHOT +projectName=Camel :: Zip File +projectDescription=Camel Zip file support diff --git a/components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/bean/ZipAggregationStrategy.json b/components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/bean/ZipAggregationStrategy.json new file mode 100644 index 0000000000000..edd5aa7271d64 --- /dev/null +++ b/components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/bean/ZipAggregationStrategy.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "ZipAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Zip Aggregation Strategy", + "description": "AggregationStrategy to zip together incoming messages into a zip file. Please note that this aggregation strategy requires eager completion check to work properly.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-zipfile", + "version": "4.5.0-SNAPSHOT", + "properties": { "filePrefix": { "index": 0, "kind": "property", "displayName": "File Prefix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the prefix that will be used when creating the ZIP filename." }, "fileSuffix": { "index": 1, "kind": "property", "displayName": "File Suffix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "zip", "description": "Sets the suffix that will be used when creating the ZIP filename." }, "parentDir": { "index": 2, "kind": "property", "displayName": "Parent Dir", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the parent directory to use for writing temporary files" }, "preserveFolderStructure": { "index": 3, "kind": "property", "displayName": "Preserve Folder Structure", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "If the incoming message is from a file, then the folder structure of said file can be preserved" }, "useFilenameHeader": { "index": 4, "kind": "property", "displayName": "Use Filename Header", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use CamelFileName header for the filename instead of using unique message id" }, "useTempFile": { "index": 5, "kind": "property", "displayName": "Use Temp File", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use temporary files for zip manipulations instead of memory." } } + } +} + diff --git a/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java b/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java index 5b59f2eee7bbe..8e8467fe71e1a 100644 --- a/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java +++ b/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java @@ -36,6 +36,7 @@ import org.apache.camel.component.file.GenericFile; import org.apache.camel.component.file.GenericFileMessage; import org.apache.camel.component.file.GenericFileOperationFailedException; +import org.apache.camel.spi.Metadata; import org.apache.camel.spi.Synchronization; import org.apache.camel.support.ExchangeHelper; import org.apache.camel.util.FileUtil; @@ -51,13 +52,24 @@ * Note: Please note that this aggregation strategy requires eager completion check to work properly. *

*/ +@Metadata(label = "bean", + description = "AggregationStrategy to zip together incoming messages into a zip file." + + " Please note that this aggregation strategy requires eager completion check to work properly.") public class ZipAggregationStrategy implements AggregationStrategy { + @Metadata(description = "Sets the prefix that will be used when creating the ZIP filename.") private String filePrefix; + @Metadata(description = "Sets the suffix that will be used when creating the ZIP filename.", defaultValue = "zip") private String fileSuffix = ".zip"; + @Metadata(label = "advanced", + description = "If the incoming message is from a file, then the folder structure of said file can be preserved") private boolean preserveFolderStructure; + @Metadata(label = "advanced", + description = "Whether to use CamelFileName header for the filename instead of using unique message id") private boolean useFilenameHeader; + @Metadata(label = "advanced", description = "Whether to use temporary files for zip manipulations instead of memory.") private boolean useTempFile; + @Metadata(label = "advanced", description = "Sets the parent directory to use for writing temporary files") private File parentDir = new File(System.getProperty("java.io.tmpdir")); public ZipAggregationStrategy() { @@ -150,6 +162,22 @@ public void setParentDir(String parentDir) { this.parentDir = new File(parentDir); } + public boolean isPreserveFolderStructure() { + return preserveFolderStructure; + } + + public void setPreserveFolderStructure(boolean preserveFolderStructure) { + this.preserveFolderStructure = preserveFolderStructure; + } + + public boolean isUseTempFile() { + return useTempFile; + } + + public void setUseTempFile(boolean useTempFile) { + this.useTempFile = useTempFile; + } + @Override public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { File zipFile; From 9c7256d7f18ff63ad312487d054e12534eb9d6a7 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 14 Mar 2024 22:01:39 +0100 Subject: [PATCH 11/47] Regen --- .../apache/camel/catalog/beans/MemoryAggregationRepository.json | 2 +- .../apache/camel/catalog/beans/StringAggregationStrategy.json | 2 +- .../org/apache/camel/bean/MemoryAggregationRepository.json | 2 +- .../org/apache/camel/bean/StringAggregationStrategy.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryAggregationRepository.json index 4e2092ec9fced..dc43b4d1eedda 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-core-processor", "version": "4.5.0-SNAPSHOT", - "options": { "optimisticLocking": { "index": 0, "kind": "property", "displayName": "Optimistic Locking", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" } } + "properties": { "optimisticLocking": { "index": 0, "kind": "property", "displayName": "Optimistic Locking", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.MemoryAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/StringAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/StringAggregationStrategy.json index 1702da816d72f..b1b1279d2b31e 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/StringAggregationStrategy.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/StringAggregationStrategy.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-core-processor", "version": "4.5.0-SNAPSHOT", - "options": { "delimiter": { "index": 0, "kind": "property", "displayName": "Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Delimiter used for joining strings together." } } + "properties": { "delimiter": { "index": 0, "kind": "property", "displayName": "Delimiter", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.StringAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Delimiter used for joining strings together." } } } } diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json index 4e2092ec9fced..dc43b4d1eedda 100644 --- a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-core-processor", "version": "4.5.0-SNAPSHOT", - "options": { "optimisticLocking": { "index": 0, "kind": "property", "displayName": "Optimistic Locking", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" } } + "properties": { "optimisticLocking": { "index": 0, "kind": "property", "displayName": "Optimistic Locking", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.MemoryAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" } } } } diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json index 1702da816d72f..b1b1279d2b31e 100644 --- a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-core-processor", "version": "4.5.0-SNAPSHOT", - "options": { "delimiter": { "index": 0, "kind": "property", "displayName": "Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Delimiter used for joining strings together." } } + "properties": { "delimiter": { "index": 0, "kind": "property", "displayName": "Delimiter", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.StringAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Delimiter used for joining strings together." } } } } From af70d21d92ededefa8a07b529b95e5f38ce2a620 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Thu, 14 Mar 2024 22:48:02 +0100 Subject: [PATCH 12/47] Regen --- .../camel/builder/component/ComponentsBuilderFactory.java | 2 +- .../dsl/LangchainEmbeddingsComponentBuilderFactory.java | 4 ++-- dsl/camel-componentdsl/src/generated/resources/metadata.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java index 9cdc27b4aab0a..167b16cdc17df 100644 --- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java +++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java @@ -2781,7 +2781,7 @@ static org.apache.camel.builder.component.dsl.LangchainChatComponentBuilderFacto } /** * Langchain4j Embeddings (camel-langchain-embeddings) - * Langchain4j Embeddings + * Perform operations on the Qdrant Vector Database. * * Category: ai * Since: 4.5 diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/LangchainEmbeddingsComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/LangchainEmbeddingsComponentBuilderFactory.java index 9ac552400b810..7e9152c082217 100644 --- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/LangchainEmbeddingsComponentBuilderFactory.java +++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/LangchainEmbeddingsComponentBuilderFactory.java @@ -23,7 +23,7 @@ import org.apache.camel.component.langchain.embeddings.LangchainEmbeddingsComponent; /** - * Langchain4j Embeddings + * Perform operations on the Qdrant Vector Database. * * Generated by camel-package-maven-plugin - do not edit this file! */ @@ -32,7 +32,7 @@ public interface LangchainEmbeddingsComponentBuilderFactory { /** * Langchain4j Embeddings (camel-langchain-embeddings) - * Langchain4j Embeddings + * Perform operations on the Qdrant Vector Database. * * Category: ai * Since: 4.5 diff --git a/dsl/camel-componentdsl/src/generated/resources/metadata.json b/dsl/camel-componentdsl/src/generated/resources/metadata.json index 07ad40f8e0a1b..9a632937ed252 100644 --- a/dsl/camel-componentdsl/src/generated/resources/metadata.json +++ b/dsl/camel-componentdsl/src/generated/resources/metadata.json @@ -4780,7 +4780,7 @@ "kind": "component", "name": "langchain-embeddings", "title": "Langchain4j Embeddings", - "description": "Langchain4j Embeddings", + "description": "Perform operations on the Qdrant Vector Database.", "deprecated": false, "firstVersion": "4.5.0", "label": "ai", @@ -4788,7 +4788,7 @@ "supportLevel": "Preview", "groupId": "org.apache.camel", "artifactId": "camel-langchain-embeddings", - "version": "4.5.0-SNAPSHOT", + "version": "4.4.0-SNAPSHOT", "scheme": "langchain-embeddings", "extendsScheme": "", "syntax": "langchain-embeddings:embeddingId", From ec61fc80ddcf99af888e4f798539cc8ef877a69a Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Mon, 18 Mar 2024 13:43:22 +0100 Subject: [PATCH 13/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../java/org/apache/camel/spi/Configurer.java | 5 ++ ...MemoryAggregationRepositoryConfigurer.java | 49 ++++++++++++ .../StringAggregationStrategyConfigurer.java | 49 ++++++++++++ .../bean/MemoryAggregationRepository.json | 3 +- .../camel/bean/StringAggregationStrategy.json | 3 +- ...ssor.aggregate.MemoryAggregationRepository | 2 + ...cessor.aggregate.StringAggregationStrategy | 2 + .../MemoryAggregationRepository.java | 4 +- .../aggregate/StringAggregationStrategy.java | 4 +- ...DefaultHeaderFilterStrategyConfigurer.java | 79 +++++++++++++++++++ .../FileIdempotentRepositoryConfigurer.java | 61 ++++++++++++++ .../MemoryIdempotentRepositoryConfigurer.java | 49 ++++++++++++ .../bean/DefaultHeaderFilterStrategy.json | 3 +- .../camel/bean/FileIdempotentRepository.json | 3 +- .../bean/MemoryIdempotentRepository.json | 3 +- ....camel.support.DefaultHeaderFilterStrategy | 2 + ...cessor.idempotent.FileIdempotentRepository | 2 + ...ssor.idempotent.MemoryIdempotentRepository | 2 + .../support/DefaultHeaderFilterStrategy.java | 38 ++++----- .../idempotent/FileIdempotentRepository.java | 14 ++-- .../MemoryIdempotentRepository.java | 4 +- .../AbstractGenerateConfigurerMojo.java | 42 ++++++---- 22 files changed, 372 insertions(+), 51 deletions(-) create mode 100644 core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/MemoryAggregationRepositoryConfigurer.java create mode 100644 core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/StringAggregationStrategyConfigurer.java create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.MemoryAggregationRepository create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.StringAggregationStrategy create mode 100644 core/camel-support/src/generated/java/org/apache/camel/support/DefaultHeaderFilterStrategyConfigurer.java create mode 100644 core/camel-support/src/generated/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepositoryConfigurer.java create mode 100644 core/camel-support/src/generated/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepositoryConfigurer.java create mode 100644 core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.support.DefaultHeaderFilterStrategy create mode 100644 core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.support.processor.idempotent.FileIdempotentRepository create mode 100644 core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/Configurer.java b/core/camel-api/src/main/java/org/apache/camel/spi/Configurer.java index 0d78ec0d7045e..85da1c03b2c02 100644 --- a/core/camel-api/src/main/java/org/apache/camel/spi/Configurer.java +++ b/core/camel-api/src/main/java/org/apache/camel/spi/Configurer.java @@ -47,4 +47,9 @@ */ boolean bootstrap() default false; + /** + * Whether to only include fields that are have @Metadata annotations. + */ + boolean metadataOnly() default false; + } diff --git a/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/MemoryAggregationRepositoryConfigurer.java b/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/MemoryAggregationRepositoryConfigurer.java new file mode 100644 index 0000000000000..26a814696b5b0 --- /dev/null +++ b/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/MemoryAggregationRepositoryConfigurer.java @@ -0,0 +1,49 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.aggregate; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.aggregate.MemoryAggregationRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class MemoryAggregationRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.processor.aggregate.MemoryAggregationRepository target = (org.apache.camel.processor.aggregate.MemoryAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "optimisticlocking": + case "OptimisticLocking": target.setOptimisticLocking(property(camelContext, boolean.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "optimisticlocking": + case "OptimisticLocking": return boolean.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.processor.aggregate.MemoryAggregationRepository target = (org.apache.camel.processor.aggregate.MemoryAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "optimisticlocking": + case "OptimisticLocking": return target.isOptimisticLocking(); + default: return null; + } + } +} + diff --git a/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/StringAggregationStrategyConfigurer.java b/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/StringAggregationStrategyConfigurer.java new file mode 100644 index 0000000000000..cf6de06c0f98f --- /dev/null +++ b/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/StringAggregationStrategyConfigurer.java @@ -0,0 +1,49 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.aggregate; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.aggregate.StringAggregationStrategy; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class StringAggregationStrategyConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.processor.aggregate.StringAggregationStrategy target = (org.apache.camel.processor.aggregate.StringAggregationStrategy) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "delimiter": + case "Delimiter": target.setDelimiter(property(camelContext, java.lang.String.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "delimiter": + case "Delimiter": return java.lang.String.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.processor.aggregate.StringAggregationStrategy target = (org.apache.camel.processor.aggregate.StringAggregationStrategy) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "delimiter": + case "Delimiter": return target.getDelimiter(); + default: return null; + } + } +} + diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json index dc43b4d1eedda..343665300484e 100644 --- a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json @@ -9,8 +9,7 @@ "deprecated": false, "groupId": "org.apache.camel", "artifactId": "camel-core-processor", - "version": "4.5.0-SNAPSHOT", - "properties": { "optimisticLocking": { "index": 0, "kind": "property", "displayName": "Optimistic Locking", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.MemoryAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" } } + "version": "4.5.0-SNAPSHOT" } } diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json index b1b1279d2b31e..f569c8dc0d314 100644 --- a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json @@ -9,8 +9,7 @@ "deprecated": false, "groupId": "org.apache.camel", "artifactId": "camel-core-processor", - "version": "4.5.0-SNAPSHOT", - "properties": { "delimiter": { "index": 0, "kind": "property", "displayName": "Delimiter", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.StringAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Delimiter used for joining strings together." } } + "version": "4.5.0-SNAPSHOT" } } diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.MemoryAggregationRepository b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.MemoryAggregationRepository new file mode 100644 index 0000000000000..68b903464bb16 --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.MemoryAggregationRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.aggregate.MemoryAggregationRepositoryConfigurer diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.StringAggregationStrategy b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.StringAggregationStrategy new file mode 100644 index 0000000000000..73a3ae530d9ef --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.StringAggregationStrategy @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.aggregate.StringAggregationStrategyConfigurer diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java index 3e49428fd0a77..21c936d5d6297 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java @@ -23,6 +23,7 @@ import org.apache.camel.CamelContext; import org.apache.camel.Exchange; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.OptimisticLockingAggregationRepository; import org.apache.camel.support.service.ServiceSupport; @@ -34,10 +35,10 @@ */ @Metadata(label = "bean", description = "A memory based AggregationRepository which stores Exchange in memory only.") +@Configurer(metadataOnly = true) public class MemoryAggregationRepository extends ServiceSupport implements OptimisticLockingAggregationRepository { private final ConcurrentMap cache = new ConcurrentHashMap<>(); - @Metadata(description = "Whether to use optimistic locking") private boolean optimisticLocking; public MemoryAggregationRepository() { @@ -52,6 +53,7 @@ public boolean isOptimisticLocking() { return optimisticLocking; } + @Metadata(description = "Whether to use optimistic locking") public void setOptimisticLocking(boolean optimisticLocking) { this.optimisticLocking = optimisticLocking; } diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java index 5e8694fd923a9..20cf418aba420 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java @@ -20,6 +20,7 @@ import org.apache.camel.Exchange; import org.apache.camel.ExchangePropertyKey; import org.apache.camel.Expression; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.Metadata; import org.apache.camel.support.builder.ExpressionBuilder; @@ -32,9 +33,9 @@ @Metadata(label = "bean", description = "Aggregate result of pick expression into a single combined Exchange holding all the aggregated bodies in a" + " String as the message body. This aggregation strategy can used in combination with Splitter to batch messages") +@Configurer(metadataOnly = true) public class StringAggregationStrategy implements AggregationStrategy { - @Metadata(description = "Delimiter used for joining strings together.") private String delimiter = ""; private Expression pickExpression = ExpressionBuilder.bodyExpression(); @@ -42,6 +43,7 @@ public String getDelimiter() { return delimiter; } + @Metadata(description = "Delimiter used for joining strings together.") public void setDelimiter(String delimiter) { this.delimiter = delimiter; } diff --git a/core/camel-support/src/generated/java/org/apache/camel/support/DefaultHeaderFilterStrategyConfigurer.java b/core/camel-support/src/generated/java/org/apache/camel/support/DefaultHeaderFilterStrategyConfigurer.java new file mode 100644 index 0000000000000..25c930bad21ac --- /dev/null +++ b/core/camel-support/src/generated/java/org/apache/camel/support/DefaultHeaderFilterStrategyConfigurer.java @@ -0,0 +1,79 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.support; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.support.DefaultHeaderFilterStrategy; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class DefaultHeaderFilterStrategyConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.support.DefaultHeaderFilterStrategy target = (org.apache.camel.support.DefaultHeaderFilterStrategy) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allownullvalues": + case "AllowNullValues": target.setAllowNullValues(property(camelContext, boolean.class, value)); return true; + case "caseinsensitive": + case "CaseInsensitive": target.setCaseInsensitive(property(camelContext, boolean.class, value)); return true; + case "filteronmatch": + case "FilterOnMatch": target.setFilterOnMatch(property(camelContext, boolean.class, value)); return true; + case "infilter": + case "InFilter": target.setInFilter(property(camelContext, java.lang.String.class, value)); return true; + case "lowercase": + case "LowerCase": target.setLowerCase(property(camelContext, boolean.class, value)); return true; + case "outfilter": + case "OutFilter": target.setOutFilter(property(camelContext, java.lang.String.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "allownullvalues": + case "AllowNullValues": return boolean.class; + case "caseinsensitive": + case "CaseInsensitive": return boolean.class; + case "filteronmatch": + case "FilterOnMatch": return boolean.class; + case "infilter": + case "InFilter": return java.lang.String.class; + case "lowercase": + case "LowerCase": return boolean.class; + case "outfilter": + case "OutFilter": return java.lang.String.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.support.DefaultHeaderFilterStrategy target = (org.apache.camel.support.DefaultHeaderFilterStrategy) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allownullvalues": + case "AllowNullValues": return target.isAllowNullValues(); + case "caseinsensitive": + case "CaseInsensitive": return target.isCaseInsensitive(); + case "filteronmatch": + case "FilterOnMatch": return target.isFilterOnMatch(); + case "infilter": + case "InFilter": return target.getInFilter(); + case "lowercase": + case "LowerCase": return target.isLowerCase(); + case "outfilter": + case "OutFilter": return target.getOutFilter(); + default: return null; + } + } +} + diff --git a/core/camel-support/src/generated/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepositoryConfigurer.java b/core/camel-support/src/generated/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepositoryConfigurer.java new file mode 100644 index 0000000000000..9fd51cb58f60d --- /dev/null +++ b/core/camel-support/src/generated/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepositoryConfigurer.java @@ -0,0 +1,61 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.support.processor.idempotent; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.support.processor.idempotent.FileIdempotentRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class FileIdempotentRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.support.processor.idempotent.FileIdempotentRepository target = (org.apache.camel.support.processor.idempotent.FileIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "dropoldestfilestore": + case "DropOldestFileStore": target.setDropOldestFileStore(property(camelContext, long.class, value)); return true; + case "filestore": + case "FileStore": target.setFileStore(property(camelContext, java.io.File.class, value)); return true; + case "maxfilestoresize": + case "MaxFileStoreSize": target.setMaxFileStoreSize(property(camelContext, long.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "dropoldestfilestore": + case "DropOldestFileStore": return long.class; + case "filestore": + case "FileStore": return java.io.File.class; + case "maxfilestoresize": + case "MaxFileStoreSize": return long.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.support.processor.idempotent.FileIdempotentRepository target = (org.apache.camel.support.processor.idempotent.FileIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "dropoldestfilestore": + case "DropOldestFileStore": return target.getDropOldestFileStore(); + case "filestore": + case "FileStore": return target.getFileStore(); + case "maxfilestoresize": + case "MaxFileStoreSize": return target.getMaxFileStoreSize(); + default: return null; + } + } +} + diff --git a/core/camel-support/src/generated/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepositoryConfigurer.java b/core/camel-support/src/generated/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepositoryConfigurer.java new file mode 100644 index 0000000000000..bafc4b82526d8 --- /dev/null +++ b/core/camel-support/src/generated/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepositoryConfigurer.java @@ -0,0 +1,49 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.support.processor.idempotent; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class MemoryIdempotentRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository target = (org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachesize": + case "CacheSize": target.setCacheSize(property(camelContext, int.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachesize": + case "CacheSize": return int.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository target = (org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachesize": + case "CacheSize": return target.getCacheSize(); + default: return null; + } + } +} + diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json index bfe3e06376ad1..84e25059c5202 100644 --- a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json @@ -9,8 +9,7 @@ "deprecated": true, "groupId": "org.apache.camel", "artifactId": "camel-support", - "version": "4.5.0-SNAPSHOT", - "properties": { "allowNullValues": { "index": 0, "kind": "property", "displayName": "Allow Null Values", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether to allow null values. By default a header is skipped if its value is null. Setting this to true will preserve the header." }, "caseInsensitive": { "index": 1, "kind": "property", "displayName": "Case Insensitive", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Sets the caseInsensitive property which is a boolean to determine whether header names should be case insensitive when checking it with the filter set. It does not affect filtering using regular expression pattern." }, "filterOnMatch": { "index": 2, "kind": "property", "displayName": "Filter On Match", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Sets what to do when a pattern or filter set is matched. When set to true, a match will filter out the header. This is the default value for backwards compatibility. When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be filtered (skipped)." }, "inFilter": { "index": 3, "kind": "property", "displayName": "In Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the in direction filter set. The in direction is referred to copying headers from an external message to a Camel message. Multiple patterns can be separated by comma" }, "lowerCase": { "index": 4, "kind": "property", "displayName": "Lower Case", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether header names should be converted to lower case before checking it with the filter Set. It does not affect filtering using regular expression pattern." }, "outFilter": { "index": 5, "kind": "property", "displayName": "Out Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the out direction filter set. The out direction is referred to copying headers from a Camel message to an external message. Multiple patterns can be separated by comma" } } + "version": "4.5.0-SNAPSHOT" } } diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json index ca6dbee7ea321..1247d32aee909 100644 --- a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json @@ -9,8 +9,7 @@ "deprecated": false, "groupId": "org.apache.camel", "artifactId": "camel-support", - "version": "4.5.0-SNAPSHOT", - "properties": { "dropOldestFileStore": { "index": 0, "kind": "property", "displayName": "Drop Oldest File Store", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk space to allow room for new entries." }, "fileStore": { "index": 1, "kind": "property", "displayName": "File Store", "required": true, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "File name of the repository (incl directory)" }, "maxFileStoreSize": { "index": 2, "kind": "property", "displayName": "Max File Store Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "32768000", "description": "The maximum file size for the file store in bytes. The default value is 32mb" } } + "version": "4.5.0-SNAPSHOT" } } diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json index a70bbdcdf2e97..683fab5751173 100644 --- a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json @@ -9,8 +9,7 @@ "deprecated": false, "groupId": "org.apache.camel", "artifactId": "camel-support", - "version": "4.5.0-SNAPSHOT", - "properties": { "cacheSize": { "index": 0, "kind": "property", "displayName": "Cache Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Maximum elements that can be stored in-memory" } } + "version": "4.5.0-SNAPSHOT" } } diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.support.DefaultHeaderFilterStrategy b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.support.DefaultHeaderFilterStrategy new file mode 100644 index 0000000000000..fb11827af4ce4 --- /dev/null +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.support.DefaultHeaderFilterStrategy @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.support.DefaultHeaderFilterStrategyConfigurer diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.support.processor.idempotent.FileIdempotentRepository b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.support.processor.idempotent.FileIdempotentRepository new file mode 100644 index 0000000000000..c78a2e790d6d4 --- /dev/null +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.support.processor.idempotent.FileIdempotentRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.support.processor.idempotent.FileIdempotentRepositoryConfigurer diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository new file mode 100644 index 0000000000000..0cc3f68c3e1e9 --- /dev/null +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.support.processor.idempotent.MemoryIdempotentRepositoryConfigurer diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java index 901af91262f39..b3509985308ee 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java @@ -22,6 +22,7 @@ import java.util.regex.Pattern; import org.apache.camel.Exchange; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.HeaderFilterStrategy; import org.apache.camel.spi.Metadata; @@ -37,6 +38,7 @@ */ @Metadata(label = "bean", description = "The default header filtering strategy. Users can configure which headers is allowed or denied.") +@Configurer(metadataOnly = true) public class DefaultHeaderFilterStrategy implements HeaderFilterStrategy { /** @@ -52,35 +54,17 @@ public class DefaultHeaderFilterStrategy implements HeaderFilterStrategy { */ public static final String[] CAMEL_FILTER_STARTS_WITH = new String[] { "Camel", "camel", "org.apache.camel." }; - @Metadata(javaType = "java.lang.String", - description = "Sets the in direction filter set. The in direction is referred to copying headers from an external message to a Camel message." - + " Multiple patterns can be separated by comma") private Set inFilter; private Pattern inFilterPattern; private String[] inFilterStartsWith; - @Metadata(javaType = "java.lang.String", - description = "Sets the out direction filter set. The out direction is referred to copying headers from a Camel message to an external message." - + " Multiple patterns can be separated by comma") private Set outFilter; private Pattern outFilterPattern; private String[] outFilterStartsWith; - @Metadata(label = "advanced", defaultValue = "false", - description = "Whether header names should be converted to lower case before checking it with the filter Set." - + " It does not affect filtering using regular expression pattern.") private boolean lowerCase; - @Metadata(label = "advanced", defaultValue = "false", - description = "Whether to allow null values. By default a header is skipped if its value is null. Setting this to true will preserve the header.") private boolean allowNullValues; - @Metadata(label = "advanced", defaultValue = "false", - description = "Sets the caseInsensitive property which is a boolean to determine whether header names should be case insensitive" - + " when checking it with the filter set. It does not affect filtering using regular expression pattern.") private boolean caseInsensitive; - @Metadata(label = "advanced", defaultValue = "true", - description = "Sets what to do when a pattern or filter set is matched." - + " When set to true, a match will filter out the header. This is the default value for backwards compatibility." - + " When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be filtered (skipped).") private boolean filterOnMatch = true; // defaults to the previous behaviour @Override @@ -117,6 +101,9 @@ public void setOutFilter(Set value) { outFilter = value; } + @Metadata(javaType = "java.lang.String", + description = "Sets the out direction filter set. The out direction is referred to copying headers from a Camel message to an external message." + + " Multiple patterns can be separated by comma") public void setOutFilter(String value) { if (value != null) { this.outFilter = Set.of(value.split(",")); @@ -193,6 +180,9 @@ public void setInFilter(Set value) { inFilter = value; } + @Metadata(javaType = "java.lang.String", + description = "Sets the in direction filter set. The in direction is referred to copying headers from an external message to a Camel message." + + " Multiple patterns can be separated by comma") public void setInFilter(String value) { if (value != null) { this.inFilter = Set.of(value.split(",")); @@ -258,6 +248,9 @@ public boolean isLowerCase() { * Sets the isLowercase property which is a boolean to determine whether header names should be converted to lower * case before checking it with the filter Set. It does not affect filtering using regular expression pattern. */ + @Metadata(label = "advanced", defaultValue = "false", + description = "Whether header names should be converted to lower case before checking it with the filter Set." + + " It does not affect filtering using regular expression pattern.") public void setLowerCase(boolean value) { lowerCase = value; } @@ -278,6 +271,9 @@ public boolean isCaseInsensitive() { * * @param caseInsensitive true if header names is case insensitive. */ + @Metadata(label = "advanced", defaultValue = "false", + description = "Sets the caseInsensitive property which is a boolean to determine whether header names should be case insensitive" + + " when checking it with the filter set. It does not affect filtering using regular expression pattern.") public void setCaseInsensitive(boolean caseInsensitive) { this.caseInsensitive = caseInsensitive; } @@ -291,6 +287,8 @@ public boolean isAllowNullValues() { *

* By default a header is skipped if its value is null. Setting this to true will preserve the header. */ + @Metadata(label = "advanced", defaultValue = "false", + description = "Whether to allow null values. By default a header is skipped if its value is null. Setting this to true will preserve the header.") public void setAllowNullValues(boolean value) { allowNullValues = value; } @@ -310,6 +308,10 @@ public boolean isFilterOnMatch() { * * @param filterOnMatch true if a match filters (skips) the header. */ + @Metadata(label = "advanced", defaultValue = "true", + description = "Sets what to do when a pattern or filter set is matched." + + " When set to true, a match will filter out the header. This is the default value for backwards compatibility." + + " When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be filtered (skipped).") public void setFilterOnMatch(boolean filterOnMatch) { this.filterOnMatch = filterOnMatch; } diff --git a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java index 7770ba84ba9f4..cf87addaad162 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java @@ -28,6 +28,7 @@ import org.apache.camel.api.management.ManagedAttribute; import org.apache.camel.api.management.ManagedOperation; import org.apache.camel.api.management.ManagedResource; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.IdempotentRepository; import org.apache.camel.spi.Metadata; import org.apache.camel.support.LRUCache; @@ -53,6 +54,7 @@ */ @Metadata(label = "bean", description = "A file based IdempotentRepository.") +@Configurer(metadataOnly = true) @ManagedResource(description = "File based idempotent repository") public class FileIdempotentRepository extends ServiceSupport implements IdempotentRepository { @@ -62,14 +64,8 @@ public class FileIdempotentRepository extends ServiceSupport implements Idempote private final AtomicBoolean init = new AtomicBoolean(); private Map cache; - @Metadata(description = "File name of the repository (incl directory)", required = true) private File fileStore; - @Metadata(description = "The maximum file size for the file store in bytes. The default value is 32mb", - defaultValue = "" + 32 * 1024 * 1000L) private long maxFileStoreSize = 32 * 1024 * 1000L; // 32mb store file - @Metadata(description = "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk" - + " space to allow room for new entries.", - defaultValue = "1000") private long dropOldestFileStore = 1000; public FileIdempotentRepository() { @@ -201,6 +197,7 @@ public File getFileStore() { return fileStore; } + @Metadata(description = "File name of the repository (incl directory)", required = true) public void setFileStore(File fileStore) { this.fileStore = fileStore; } @@ -229,6 +226,8 @@ public long getMaxFileStoreSize() { *

* The default is 32mb. */ + @Metadata(description = "The maximum file size for the file store in bytes. The default value is 32mb", + defaultValue = "" + 32 * 1024 * 1000L) @ManagedAttribute(description = "The maximum file size for the file store in bytes") public void setMaxFileStoreSize(long maxFileStoreSize) { this.maxFileStoreSize = maxFileStoreSize; @@ -244,6 +243,9 @@ public long getDropOldestFileStore() { *

* The default is 1000. */ + @Metadata(description = "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk" + + " space to allow room for new entries.", + defaultValue = "1000") @ManagedAttribute(description = "Number of oldest elements to drop from file store if maximum file size reached") public void setDropOldestFileStore(long dropOldestFileStore) { this.dropOldestFileStore = dropOldestFileStore; diff --git a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java index 898489d9bde29..10e20b317271a 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java @@ -21,6 +21,7 @@ import org.apache.camel.api.management.ManagedAttribute; import org.apache.camel.api.management.ManagedOperation; import org.apache.camel.api.management.ManagedResource; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.IdempotentRepository; import org.apache.camel.spi.Metadata; import org.apache.camel.support.LRUCache; @@ -34,11 +35,11 @@ */ @Metadata(label = "bean", description = "A memory based IdempotentRepository.") +@Configurer @ManagedResource(description = "Memory based idempotent repository") public class MemoryIdempotentRepository extends ServiceSupport implements IdempotentRepository { private Map cache; - @Metadata(description = "Maximum elements that can be stored in-memory", defaultValue = "1000") private int cacheSize; public MemoryIdempotentRepository() { @@ -128,6 +129,7 @@ public int getCacheSize() { return cache.size(); } + @Metadata(description = "Maximum elements that can be stored in-memory", defaultValue = "1000") public void setCacheSize(int cacheSize) { this.cacheSize = cacheSize; } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGenerateConfigurerMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGenerateConfigurerMojo.java index 5e6eb68deda59..2b0f7f9ee1714 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGenerateConfigurerMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGenerateConfigurerMojo.java @@ -145,9 +145,8 @@ protected void doExecute(File sourcesOutputDir, File resourcesOutputDir, List bootstrapSet = new LinkedHashSet<>(); Set bootstrapAndExtendedSet = new LinkedHashSet<>(); + Index index = PackagePluginUtils.readJandexIndexIgnoreMissing(project, getLog()); if (discoverClasses) { - Index index = PackagePluginUtils.readJandexIndexIgnoreMissing(project, getLog()); - if (index != null) { // discover all classes annotated with @Configurer List annotations = index.getAnnotations(CONFIGURER); @@ -164,7 +163,9 @@ protected void doExecute(File sourcesOutputDir, File resourcesOutputDir, List options = processClass(fqn); + List options = processClass(index, fqn); generateConfigurer(fqn, targetFqn, options, sourcesOutputDir, extended, bootstrap); generateMetaInfConfigurer(fqn, targetFqn, resourcesOutputDir); } catch (Exception e) { @@ -335,18 +337,24 @@ private Collection getAllDependencies() throws MojoExecutionException return artifacts; } - private List processClass(String fqn) throws ClassNotFoundException { + private List processClass(Index index, String fqn) throws ClassNotFoundException { List answer = new ArrayList<>(); // filter out duplicates by using a names set that has already added Set names = new HashSet<>(); Class clazz = projectClassLoader.loadClass(fqn); + ClassInfo ci = index != null ? index.getClassByName(DotName.createSimple(clazz)) : null; + boolean metadataOnly = ci != null && asBooleanDefaultFalse(ci.annotation(CONFIGURER), "metadataOnly"); + // find all public setters doWithMethods(clazz, m -> { boolean deprecated = m.isAnnotationPresent(Deprecated.class); if (skipDeprecated && deprecated) { return; } + if (metadataOnly && !m.isAnnotationPresent(Metadata.class)) { + return; + } boolean setter = m.getName().length() >= 4 && m.getName().startsWith("set") && Character.isUpperCase(m.getName().charAt(3)); @@ -474,13 +482,19 @@ private void generateMetaInfConfigurer(String fqn, String targetFqn, File resour } private static boolean asBooleanDefaultTrue(AnnotationInstance ai, String name) { - AnnotationValue av = ai.value(name); - return av == null || av.asBoolean(); + if (ai != null) { + AnnotationValue av = ai.value(name); + return av == null || av.asBoolean(); + } + return true; } private static boolean asBooleanDefaultFalse(AnnotationInstance ai, String name) { - AnnotationValue av = ai.value(name); - return av != null && av.asBoolean(); + if (ai != null) { + AnnotationValue av = ai.value(name); + return av != null && av.asBoolean(); + } + return false; } } From 31c7cd4eb3d107d2c209025499f6c9ca27286d98 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Mon, 18 Mar 2024 13:49:04 +0100 Subject: [PATCH 14/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../ZipAggregationStrategyConfigurer.java | 79 +++++++++++++++++++ ...r.aggregate.zipfile.ZipAggregationStrategy | 2 + .../zipfile/ZipAggregationStrategy.java | 10 +++ .../AbstractGenerateConfigurerMojo.java | 11 ++- 4 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 components/camel-zipfile/src/generated/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategyConfigurer.java create mode 100644 components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy diff --git a/components/camel-zipfile/src/generated/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategyConfigurer.java b/components/camel-zipfile/src/generated/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategyConfigurer.java new file mode 100644 index 0000000000000..da107a156e9b3 --- /dev/null +++ b/components/camel-zipfile/src/generated/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategyConfigurer.java @@ -0,0 +1,79 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.aggregate.zipfile; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class ZipAggregationStrategyConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy target = (org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "fileprefix": + case "FilePrefix": target.setFilePrefix(property(camelContext, java.lang.String.class, value)); return true; + case "filesuffix": + case "FileSuffix": target.setFileSuffix(property(camelContext, java.lang.String.class, value)); return true; + case "parentdir": + case "ParentDir": target.setParentDir(property(camelContext, java.io.File.class, value)); return true; + case "preservefolderstructure": + case "PreserveFolderStructure": target.setPreserveFolderStructure(property(camelContext, boolean.class, value)); return true; + case "usefilenameheader": + case "UseFilenameHeader": target.setUseFilenameHeader(property(camelContext, boolean.class, value)); return true; + case "usetempfile": + case "UseTempFile": target.setUseTempFile(property(camelContext, boolean.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "fileprefix": + case "FilePrefix": return java.lang.String.class; + case "filesuffix": + case "FileSuffix": return java.lang.String.class; + case "parentdir": + case "ParentDir": return java.io.File.class; + case "preservefolderstructure": + case "PreserveFolderStructure": return boolean.class; + case "usefilenameheader": + case "UseFilenameHeader": return boolean.class; + case "usetempfile": + case "UseTempFile": return boolean.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy target = (org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "fileprefix": + case "FilePrefix": return target.getFilePrefix(); + case "filesuffix": + case "FileSuffix": return target.getFileSuffix(); + case "parentdir": + case "ParentDir": return target.getParentDir(); + case "preservefolderstructure": + case "PreserveFolderStructure": return target.isPreserveFolderStructure(); + case "usefilenameheader": + case "UseFilenameHeader": return target.isUseFilenameHeader(); + case "usetempfile": + case "UseTempFile": return target.isUseTempFile(); + default: return null; + } + } +} + diff --git a/components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy b/components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy new file mode 100644 index 0000000000000..94eabce9fd5c2 --- /dev/null +++ b/components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategyConfigurer diff --git a/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java b/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java index 8e8467fe71e1a..cc8970e356842 100644 --- a/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java +++ b/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java @@ -36,6 +36,7 @@ import org.apache.camel.component.file.GenericFile; import org.apache.camel.component.file.GenericFileMessage; import org.apache.camel.component.file.GenericFileOperationFailedException; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.Synchronization; import org.apache.camel.support.ExchangeHelper; @@ -55,6 +56,7 @@ @Metadata(label = "bean", description = "AggregationStrategy to zip together incoming messages into a zip file." + " Please note that this aggregation strategy requires eager completion check to work properly.") +@Configurer(metadataOnly = true) public class ZipAggregationStrategy implements AggregationStrategy { @Metadata(description = "Sets the prefix that will be used when creating the ZIP filename.") @@ -178,6 +180,14 @@ public void setUseTempFile(boolean useTempFile) { this.useTempFile = useTempFile; } + public boolean isUseFilenameHeader() { + return useFilenameHeader; + } + + public void setUseFilenameHeader(boolean useFilenameHeader) { + this.useFilenameHeader = useFilenameHeader; + } + @Override public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { File zipFile; diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGenerateConfigurerMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGenerateConfigurerMojo.java index 2b0f7f9ee1714..e8421dcdddd91 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGenerateConfigurerMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGenerateConfigurerMojo.java @@ -352,9 +352,6 @@ private List processClass(Index index, String fqn) throws Clas if (skipDeprecated && deprecated) { return; } - if (metadataOnly && !m.isAnnotationPresent(Metadata.class)) { - return; - } boolean setter = m.getName().length() >= 4 && m.getName().startsWith("set") && Character.isUpperCase(m.getName().charAt(3)); @@ -383,13 +380,19 @@ private List processClass(Index index, String fqn) throws Clas String t = builder ? Character.toUpperCase(m.getName().charAt(4)) + m.getName().substring(4 + 1) : Character.toUpperCase(m.getName().charAt(3)) + m.getName().substring(3 + 1); + Field field = ReflectionHelper.findField(clazz, Character.toLowerCase(t.charAt(0)) + t.substring(1)); + // check via the field whether to be included or not if we should only include fields marked up with @Metadata + if (metadataOnly && field != null) { + if (!field.isAnnotationPresent(Metadata.class)) { + return; + } + } if (names.add(t)) { option = new ConfigurerOption(t, type, getter, builder); answer.add(option); } else { boolean replace = false; // try to find out what the real type is of the correspondent field so we chose among the clash - Field field = ReflectionHelper.findField(clazz, Character.toLowerCase(t.charAt(0)) + t.substring(1)); if (field != null && field.getType().equals(type)) { // this is the correct type for the new option replace = true; From 654239c3cd733992e49491424c067ae2c84783c3 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Mon, 18 Mar 2024 13:52:13 +0100 Subject: [PATCH 15/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../bean/MemoryAggregationRepository.json | 3 +- .../camel/bean/StringAggregationStrategy.json | 3 +- .../MemoryAggregationRepository.java | 2 +- .../aggregate/StringAggregationStrategy.java | 2 +- ...DefaultHeaderFilterStrategyConfigurer.java | 19 +++++++--- .../FileIdempotentRepositoryConfigurer.java | 6 ++++ .../bean/DefaultHeaderFilterStrategy.json | 3 +- .../camel/bean/FileIdempotentRepository.json | 3 +- .../bean/MemoryIdempotentRepository.json | 3 +- .../support/DefaultHeaderFilterStrategy.java | 36 +++++++++---------- .../idempotent/FileIdempotentRepository.java | 12 +++---- .../MemoryIdempotentRepository.java | 2 +- 12 files changed, 58 insertions(+), 36 deletions(-) diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json index 343665300484e..dc43b4d1eedda 100644 --- a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json @@ -9,7 +9,8 @@ "deprecated": false, "groupId": "org.apache.camel", "artifactId": "camel-core-processor", - "version": "4.5.0-SNAPSHOT" + "version": "4.5.0-SNAPSHOT", + "properties": { "optimisticLocking": { "index": 0, "kind": "property", "displayName": "Optimistic Locking", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.MemoryAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" } } } } diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json index f569c8dc0d314..b1b1279d2b31e 100644 --- a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/StringAggregationStrategy.json @@ -9,7 +9,8 @@ "deprecated": false, "groupId": "org.apache.camel", "artifactId": "camel-core-processor", - "version": "4.5.0-SNAPSHOT" + "version": "4.5.0-SNAPSHOT", + "properties": { "delimiter": { "index": 0, "kind": "property", "displayName": "Delimiter", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.StringAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Delimiter used for joining strings together." } } } } diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java index 21c936d5d6297..8f98d681e17d7 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java @@ -39,6 +39,7 @@ public class MemoryAggregationRepository extends ServiceSupport implements OptimisticLockingAggregationRepository { private final ConcurrentMap cache = new ConcurrentHashMap<>(); + @Metadata(description = "Whether to use optimistic locking") private boolean optimisticLocking; public MemoryAggregationRepository() { @@ -53,7 +54,6 @@ public boolean isOptimisticLocking() { return optimisticLocking; } - @Metadata(description = "Whether to use optimistic locking") public void setOptimisticLocking(boolean optimisticLocking) { this.optimisticLocking = optimisticLocking; } diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java index 20cf418aba420..ab167d63a0ea0 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java @@ -36,6 +36,7 @@ @Configurer(metadataOnly = true) public class StringAggregationStrategy implements AggregationStrategy { + @Metadata(description = "Delimiter used for joining strings together.") private String delimiter = ""; private Expression pickExpression = ExpressionBuilder.bodyExpression(); @@ -43,7 +44,6 @@ public String getDelimiter() { return delimiter; } - @Metadata(description = "Delimiter used for joining strings together.") public void setDelimiter(String delimiter) { this.delimiter = delimiter; } diff --git a/core/camel-support/src/generated/java/org/apache/camel/support/DefaultHeaderFilterStrategyConfigurer.java b/core/camel-support/src/generated/java/org/apache/camel/support/DefaultHeaderFilterStrategyConfigurer.java index 25c930bad21ac..7577bc42fc1d2 100644 --- a/core/camel-support/src/generated/java/org/apache/camel/support/DefaultHeaderFilterStrategyConfigurer.java +++ b/core/camel-support/src/generated/java/org/apache/camel/support/DefaultHeaderFilterStrategyConfigurer.java @@ -28,11 +28,11 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj case "filteronmatch": case "FilterOnMatch": target.setFilterOnMatch(property(camelContext, boolean.class, value)); return true; case "infilter": - case "InFilter": target.setInFilter(property(camelContext, java.lang.String.class, value)); return true; + case "InFilter": target.setInFilter(property(camelContext, java.util.Set.class, value)); return true; case "lowercase": case "LowerCase": target.setLowerCase(property(camelContext, boolean.class, value)); return true; case "outfilter": - case "OutFilter": target.setOutFilter(property(camelContext, java.lang.String.class, value)); return true; + case "OutFilter": target.setOutFilter(property(camelContext, java.util.Set.class, value)); return true; default: return false; } } @@ -47,11 +47,11 @@ public Class getOptionType(String name, boolean ignoreCase) { case "filteronmatch": case "FilterOnMatch": return boolean.class; case "infilter": - case "InFilter": return java.lang.String.class; + case "InFilter": return java.util.Set.class; case "lowercase": case "LowerCase": return boolean.class; case "outfilter": - case "OutFilter": return java.lang.String.class; + case "OutFilter": return java.util.Set.class; default: return null; } } @@ -75,5 +75,16 @@ public Object getOptionValue(Object obj, String name, boolean ignoreCase) { default: return null; } } + + @Override + public Object getCollectionValueType(Object target, String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "infilter": + case "InFilter": return java.lang.String.class; + case "outfilter": + case "OutFilter": return java.lang.String.class; + default: return null; + } + } } diff --git a/core/camel-support/src/generated/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepositoryConfigurer.java b/core/camel-support/src/generated/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepositoryConfigurer.java index 9fd51cb58f60d..2f828cd9aee34 100644 --- a/core/camel-support/src/generated/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepositoryConfigurer.java +++ b/core/camel-support/src/generated/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepositoryConfigurer.java @@ -21,6 +21,8 @@ public class FileIdempotentRepositoryConfigurer extends org.apache.camel.support public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { org.apache.camel.support.processor.idempotent.FileIdempotentRepository target = (org.apache.camel.support.processor.idempotent.FileIdempotentRepository) obj; switch (ignoreCase ? name.toLowerCase() : name) { + case "cachesize": + case "CacheSize": target.setCacheSize(property(camelContext, int.class, value)); return true; case "dropoldestfilestore": case "DropOldestFileStore": target.setDropOldestFileStore(property(camelContext, long.class, value)); return true; case "filestore": @@ -34,6 +36,8 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj @Override public Class getOptionType(String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { + case "cachesize": + case "CacheSize": return int.class; case "dropoldestfilestore": case "DropOldestFileStore": return long.class; case "filestore": @@ -48,6 +52,8 @@ public Class getOptionType(String name, boolean ignoreCase) { public Object getOptionValue(Object obj, String name, boolean ignoreCase) { org.apache.camel.support.processor.idempotent.FileIdempotentRepository target = (org.apache.camel.support.processor.idempotent.FileIdempotentRepository) obj; switch (ignoreCase ? name.toLowerCase() : name) { + case "cachesize": + case "CacheSize": return target.getCacheSize(); case "dropoldestfilestore": case "DropOldestFileStore": return target.getDropOldestFileStore(); case "filestore": diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json index 84e25059c5202..bfe3e06376ad1 100644 --- a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json @@ -9,7 +9,8 @@ "deprecated": true, "groupId": "org.apache.camel", "artifactId": "camel-support", - "version": "4.5.0-SNAPSHOT" + "version": "4.5.0-SNAPSHOT", + "properties": { "allowNullValues": { "index": 0, "kind": "property", "displayName": "Allow Null Values", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether to allow null values. By default a header is skipped if its value is null. Setting this to true will preserve the header." }, "caseInsensitive": { "index": 1, "kind": "property", "displayName": "Case Insensitive", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Sets the caseInsensitive property which is a boolean to determine whether header names should be case insensitive when checking it with the filter set. It does not affect filtering using regular expression pattern." }, "filterOnMatch": { "index": 2, "kind": "property", "displayName": "Filter On Match", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Sets what to do when a pattern or filter set is matched. When set to true, a match will filter out the header. This is the default value for backwards compatibility. When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be filtered (skipped)." }, "inFilter": { "index": 3, "kind": "property", "displayName": "In Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the in direction filter set. The in direction is referred to copying headers from an external message to a Camel message. Multiple patterns can be separated by comma" }, "lowerCase": { "index": 4, "kind": "property", "displayName": "Lower Case", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether header names should be converted to lower case before checking it with the filter Set. It does not affect filtering using regular expression pattern." }, "outFilter": { "index": 5, "kind": "property", "displayName": "Out Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the out direction filter set. The out direction is referred to copying headers from a Camel message to an external message. Multiple patterns can be separated by comma" } } } } diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json index 1247d32aee909..ca6dbee7ea321 100644 --- a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json @@ -9,7 +9,8 @@ "deprecated": false, "groupId": "org.apache.camel", "artifactId": "camel-support", - "version": "4.5.0-SNAPSHOT" + "version": "4.5.0-SNAPSHOT", + "properties": { "dropOldestFileStore": { "index": 0, "kind": "property", "displayName": "Drop Oldest File Store", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk space to allow room for new entries." }, "fileStore": { "index": 1, "kind": "property", "displayName": "File Store", "required": true, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "File name of the repository (incl directory)" }, "maxFileStoreSize": { "index": 2, "kind": "property", "displayName": "Max File Store Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "32768000", "description": "The maximum file size for the file store in bytes. The default value is 32mb" } } } } diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json index 683fab5751173..a70bbdcdf2e97 100644 --- a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryIdempotentRepository.json @@ -9,7 +9,8 @@ "deprecated": false, "groupId": "org.apache.camel", "artifactId": "camel-support", - "version": "4.5.0-SNAPSHOT" + "version": "4.5.0-SNAPSHOT", + "properties": { "cacheSize": { "index": 0, "kind": "property", "displayName": "Cache Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Maximum elements that can be stored in-memory" } } } } diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java index b3509985308ee..eb16286c56098 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java @@ -54,17 +54,35 @@ public class DefaultHeaderFilterStrategy implements HeaderFilterStrategy { */ public static final String[] CAMEL_FILTER_STARTS_WITH = new String[] { "Camel", "camel", "org.apache.camel." }; + @Metadata(javaType = "java.lang.String", + description = "Sets the in direction filter set. The in direction is referred to copying headers from an external message to a Camel message." + + " Multiple patterns can be separated by comma") private Set inFilter; private Pattern inFilterPattern; private String[] inFilterStartsWith; + @Metadata(javaType = "java.lang.String", + description = "Sets the out direction filter set. The out direction is referred to copying headers from a Camel message to an external message." + + " Multiple patterns can be separated by comma") private Set outFilter; private Pattern outFilterPattern; private String[] outFilterStartsWith; + @Metadata(label = "advanced", defaultValue = "false", + description = "Whether header names should be converted to lower case before checking it with the filter Set." + + " It does not affect filtering using regular expression pattern.") private boolean lowerCase; + @Metadata(label = "advanced", defaultValue = "false", + description = "Whether to allow null values. By default a header is skipped if its value is null. Setting this to true will preserve the header.") private boolean allowNullValues; + @Metadata(label = "advanced", defaultValue = "false", + description = "Sets the caseInsensitive property which is a boolean to determine whether header names should be case insensitive" + + " when checking it with the filter set. It does not affect filtering using regular expression pattern.") private boolean caseInsensitive; + @Metadata(label = "advanced", defaultValue = "true", + description = "Sets what to do when a pattern or filter set is matched." + + " When set to true, a match will filter out the header. This is the default value for backwards compatibility." + + " When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be filtered (skipped).") private boolean filterOnMatch = true; // defaults to the previous behaviour @Override @@ -101,9 +119,6 @@ public void setOutFilter(Set value) { outFilter = value; } - @Metadata(javaType = "java.lang.String", - description = "Sets the out direction filter set. The out direction is referred to copying headers from a Camel message to an external message." - + " Multiple patterns can be separated by comma") public void setOutFilter(String value) { if (value != null) { this.outFilter = Set.of(value.split(",")); @@ -180,9 +195,6 @@ public void setInFilter(Set value) { inFilter = value; } - @Metadata(javaType = "java.lang.String", - description = "Sets the in direction filter set. The in direction is referred to copying headers from an external message to a Camel message." - + " Multiple patterns can be separated by comma") public void setInFilter(String value) { if (value != null) { this.inFilter = Set.of(value.split(",")); @@ -248,9 +260,6 @@ public boolean isLowerCase() { * Sets the isLowercase property which is a boolean to determine whether header names should be converted to lower * case before checking it with the filter Set. It does not affect filtering using regular expression pattern. */ - @Metadata(label = "advanced", defaultValue = "false", - description = "Whether header names should be converted to lower case before checking it with the filter Set." - + " It does not affect filtering using regular expression pattern.") public void setLowerCase(boolean value) { lowerCase = value; } @@ -271,9 +280,6 @@ public boolean isCaseInsensitive() { * * @param caseInsensitive true if header names is case insensitive. */ - @Metadata(label = "advanced", defaultValue = "false", - description = "Sets the caseInsensitive property which is a boolean to determine whether header names should be case insensitive" - + " when checking it with the filter set. It does not affect filtering using regular expression pattern.") public void setCaseInsensitive(boolean caseInsensitive) { this.caseInsensitive = caseInsensitive; } @@ -287,8 +293,6 @@ public boolean isAllowNullValues() { *

* By default a header is skipped if its value is null. Setting this to true will preserve the header. */ - @Metadata(label = "advanced", defaultValue = "false", - description = "Whether to allow null values. By default a header is skipped if its value is null. Setting this to true will preserve the header.") public void setAllowNullValues(boolean value) { allowNullValues = value; } @@ -308,10 +312,6 @@ public boolean isFilterOnMatch() { * * @param filterOnMatch true if a match filters (skips) the header. */ - @Metadata(label = "advanced", defaultValue = "true", - description = "Sets what to do when a pattern or filter set is matched." - + " When set to true, a match will filter out the header. This is the default value for backwards compatibility." - + " When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be filtered (skipped).") public void setFilterOnMatch(boolean filterOnMatch) { this.filterOnMatch = filterOnMatch; } diff --git a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java index cf87addaad162..daf564e464738 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java @@ -64,8 +64,14 @@ public class FileIdempotentRepository extends ServiceSupport implements Idempote private final AtomicBoolean init = new AtomicBoolean(); private Map cache; + @Metadata(description = "File name of the repository (incl directory)", required = true) private File fileStore; + @Metadata(description = "The maximum file size for the file store in bytes. The default value is 32mb", + defaultValue = "" + 32 * 1024 * 1000L) private long maxFileStoreSize = 32 * 1024 * 1000L; // 32mb store file + @Metadata(description = "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk" + + " space to allow room for new entries.", + defaultValue = "1000") private long dropOldestFileStore = 1000; public FileIdempotentRepository() { @@ -197,7 +203,6 @@ public File getFileStore() { return fileStore; } - @Metadata(description = "File name of the repository (incl directory)", required = true) public void setFileStore(File fileStore) { this.fileStore = fileStore; } @@ -226,8 +231,6 @@ public long getMaxFileStoreSize() { *

* The default is 32mb. */ - @Metadata(description = "The maximum file size for the file store in bytes. The default value is 32mb", - defaultValue = "" + 32 * 1024 * 1000L) @ManagedAttribute(description = "The maximum file size for the file store in bytes") public void setMaxFileStoreSize(long maxFileStoreSize) { this.maxFileStoreSize = maxFileStoreSize; @@ -243,9 +246,6 @@ public long getDropOldestFileStore() { *

* The default is 1000. */ - @Metadata(description = "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk" - + " space to allow room for new entries.", - defaultValue = "1000") @ManagedAttribute(description = "Number of oldest elements to drop from file store if maximum file size reached") public void setDropOldestFileStore(long dropOldestFileStore) { this.dropOldestFileStore = dropOldestFileStore; diff --git a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java index 10e20b317271a..65e7603d9c5e9 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java @@ -40,6 +40,7 @@ public class MemoryIdempotentRepository extends ServiceSupport implements IdempotentRepository { private Map cache; + @Metadata(description = "Maximum elements that can be stored in-memory", defaultValue = "1000") private int cacheSize; public MemoryIdempotentRepository() { @@ -129,7 +130,6 @@ public int getCacheSize() { return cache.size(); } - @Metadata(description = "Maximum elements that can be stored in-memory", defaultValue = "1000") public void setCacheSize(int cacheSize) { this.cacheSize = cacheSize; } From dab9192d84f5455e933abbfd002cfe1ddd75693d Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Mon, 18 Mar 2024 14:02:35 +0100 Subject: [PATCH 16/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- ...ileIdempotentRepositoryConfigurerTest.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 core/camel-main/src/test/java/org/apache/camel/main/FileIdempotentRepositoryConfigurerTest.java diff --git a/core/camel-main/src/test/java/org/apache/camel/main/FileIdempotentRepositoryConfigurerTest.java b/core/camel-main/src/test/java/org/apache/camel/main/FileIdempotentRepositoryConfigurerTest.java new file mode 100644 index 0000000000000..459b5157e1b00 --- /dev/null +++ b/core/camel-main/src/test/java/org/apache/camel/main/FileIdempotentRepositoryConfigurerTest.java @@ -0,0 +1,63 @@ +/* + * 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.main; + +import org.apache.camel.CamelContext; +import org.apache.camel.impl.DefaultCamelContext; +import org.apache.camel.spi.BeanIntrospection; +import org.apache.camel.support.PluginHelper; +import org.apache.camel.support.PropertyBindingSupport; +import org.apache.camel.support.processor.idempotent.FileIdempotentRepository; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class FileIdempotentRepositoryConfigurerTest { + + @Test + public void testReflectionFree() throws Exception { + CamelContext context = new DefaultCamelContext(); + + BeanIntrospection bi = PluginHelper.getBeanIntrospection(context); + bi.setExtendedStatistics(true); + + context.start(); + + FileIdempotentRepository target = new FileIdempotentRepository(); + + boolean hit = PropertyBindingSupport.build() + .withCamelContext(context) + .withTarget(target) + .withReflection(false) + .withIgnoreCase(true) + .withProperty("dropOldestFileStore", "123") + .withProperty("maxFileStoreSize", "2000") + .withRemoveParameters(true).bind(); + + assertTrue(hit); + + assertEquals(123, target.getDropOldestFileStore()); + assertEquals(2000, target.getMaxFileStoreSize()); + + // will auto detect generated configurer so no reflection in use + assertEquals(0, bi.getInvokedCounter()); + + context.stop(); + } + +} From 75e56579dba8131ccd801f094716b2c2f0b58b1f Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Mon, 18 Mar 2024 15:20:47 +0100 Subject: [PATCH 17/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../org/apache/camel/catalog/CamelCatalog.java | 14 ++++++++++++++ .../camel/catalog/DefaultCamelCatalog.java | 14 ++++++++++++++ .../camel/catalog/DefaultRuntimeProvider.java | 10 ++++++++++ .../apache/camel/catalog/RuntimeProvider.java | 5 +++++ .../catalog/impl/AbstractCamelCatalog.java | 6 ++++++ .../DependencyDownloaderClassResolver.java | 18 ++++++++++++++++++ .../apache/camel/tooling/model/JsonMapper.java | 1 + .../org/apache/camel/tooling/model/Kind.java | 3 ++- .../camel/tooling/model/PojoBeanModel.java | 2 +- 9 files changed, 71 insertions(+), 2 deletions(-) diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java index 1932fb506a5d3..6406ba99f0cea 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java @@ -34,6 +34,7 @@ import org.apache.camel.tooling.model.LanguageModel; import org.apache.camel.tooling.model.MainModel; import org.apache.camel.tooling.model.OtherModel; +import org.apache.camel.tooling.model.PojoBeanModel; import org.apache.camel.tooling.model.ReleaseModel; import org.apache.camel.tooling.model.TransformerModel; @@ -217,6 +218,11 @@ public interface CamelCatalog { */ List findOtherNames(); + /** + * Find all the pojo beans names from the Camel catalog + */ + List findBeansNames(); + /** * Find all the capability names from the Camel catalog */ @@ -242,6 +248,8 @@ default List findNames(Kind kind) { return findOtherNames(); case eip: return findModelNames(); + case bean: + return findBeansNames(); default: throw new IllegalArgumentException("Unexpected kind " + kind); } @@ -586,6 +594,12 @@ EndpointValidationResult validateEndpointProperties( */ EipModel eipModel(String name); + /** + * @param name the FQN class name to look up + * @return the requested Bean model or {@code null} in case it is not available in this {@link CamelCatalog} + */ + PojoBeanModel pojoBeanModel(String name); + /** * @return the requested main model or {@code null} in case it is not available in this {@link CamelCatalog} */ diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java index 0d4e0b1a4a412..646a0725d6009 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java @@ -47,6 +47,7 @@ import org.apache.camel.tooling.model.LanguageModel; import org.apache.camel.tooling.model.MainModel; import org.apache.camel.tooling.model.OtherModel; +import org.apache.camel.tooling.model.PojoBeanModel; import org.apache.camel.tooling.model.ReleaseModel; import org.apache.camel.tooling.model.TransformerModel; import org.apache.camel.util.json.JsonArray; @@ -89,6 +90,9 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa public static final String FIND_OTHER_LABELS = "findOtherLabels"; public static final String LIST_OTHERS_AS_JSON = "listOthersAsJson"; + public static final String FIND_BEAN_NAMES = "findBeanNames"; + public static final String LIST_BEANS_AS_JSON = "listBeansAsJson"; + public static final String SUMMARY_AS_JSON = "summaryAsJson"; private final VersionHelper version = new VersionHelper(); @@ -276,6 +280,11 @@ public List findOtherNames() { return cache(FIND_OTHER_NAMES, runtimeProvider::findOtherNames); } + @Override + public List findBeansNames() { + return cache(FIND_BEAN_NAMES, runtimeProvider::findBeansNames); + } + @Override public List findModelNames(String filter) { // should not cache when filter parameter can by any kind of value @@ -345,6 +354,11 @@ public EipModel eipModel(String name) { return cache("eip-model-" + name, name, super::eipModel); } + @Override + public PojoBeanModel pojoBeanModel(String name) { + return cache("pojo-bean-model-" + name, name, super::pojoBeanModel); + } + @Override public String componentJSonSchema(String name) { return cache("component-" + name, name, super::componentJSonSchema); diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java index 9abb9e93ff07e..7dc9f70652704 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java @@ -41,6 +41,7 @@ public class DefaultRuntimeProvider implements RuntimeProvider { private static final String CONSOLE_CATALOG = "org/apache/camel/catalog/dev-consoles.properties"; private static final String OTHER_CATALOG = "org/apache/camel/catalog/others.properties"; private static final String CAPABILITIES_CATALOG = "org/apache/camel/catalog/capabilities.properties"; + private static final String BEANS_CATALOG = "org/apache/camel/catalog/beans.properties"; private CamelCatalog camelCatalog; @@ -134,6 +135,10 @@ protected String getCapabilitiesCatalog() { return CAPABILITIES_CATALOG; } + protected String getBeansCatalog() { + return BEANS_CATALOG; + } + @Override public List findComponentNames() { return find(getComponentsCatalog()); @@ -164,6 +169,11 @@ public List findOtherNames() { return find(getOtherCatalog()); } + @Override + public List findBeansNames() { + return find(getBeansCatalog()); + } + @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Map findCapabilities() { diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java index ef3841f856ce3..13beca90277b1 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java @@ -111,6 +111,11 @@ public interface RuntimeProvider { */ List findOtherNames(); + /** + * Find all the pojo beans names from the Camel catalog supported by the provider + */ + List findBeansNames(); + /** * Find all the capabilities from the Camel catalog supported by the provider */ diff --git a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java index 534ea288a177a..3f1fe2bc82ebe 100644 --- a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java +++ b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java @@ -54,6 +54,7 @@ import org.apache.camel.tooling.model.LanguageModel; import org.apache.camel.tooling.model.MainModel; import org.apache.camel.tooling.model.OtherModel; +import org.apache.camel.tooling.model.PojoBeanModel; import org.apache.camel.tooling.model.TransformerModel; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.ReflectionHelper; @@ -123,6 +124,11 @@ public TransformerModel transformerModel(String name) { return json != null ? JsonMapper.generateTransformerModel(json) : null; } + public PojoBeanModel pojoBeanModel(String name) { + String json = modelJSonSchema(name); + return json != null ? JsonMapper.generatePojoBeanModel(json) : null; + } + public String devConsoleJSonSchema(String name) { return getJSonSchemaResolver().getDevConsoleJSonSchema(name); } diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderClassResolver.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderClassResolver.java index 330728cf27c25..3092c0cf430e5 100644 --- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderClassResolver.java +++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderClassResolver.java @@ -21,12 +21,16 @@ import java.util.List; import org.apache.camel.CamelContext; +import org.apache.camel.catalog.CamelCatalog; +import org.apache.camel.catalog.DefaultCamelCatalog; import org.apache.camel.impl.engine.DefaultClassResolver; import org.apache.camel.tooling.maven.MavenGav; +import org.apache.camel.tooling.model.PojoBeanModel; import org.apache.camel.util.ObjectHelper; public final class DependencyDownloaderClassResolver extends DefaultClassResolver { + private final CamelCatalog catalog = new DefaultCamelCatalog(); private final List resourceResolverListeners = new ArrayList<>(); private final KnownDependenciesResolver knownDependenciesResolver; private final DependencyDownloader downloader; @@ -56,6 +60,13 @@ public InputStream loadResourceAsStream(String uri) { if (answer == null) { // okay maybe the class is from a known GAV that we can download first and then load the class MavenGav gav = knownDependenciesResolver.mavenGavForClass(uri); + if (gav == null) { + // okay maybe its a known pojo-bean from the catalog + PojoBeanModel model = catalog.pojoBeanModel(uri); + if (model != null) { + gav = MavenGav.fromCoordinates(model.getGroupId(), model.getArtifactId(), model.getVersion(), null, null); + } + } if (gav != null) { if (!downloader.alreadyOnClasspath(gav.getGroupId(), gav.getArtifactId(), gav.getVersion())) { @@ -85,6 +96,13 @@ protected Class loadClass(String name, ClassLoader loader) { if (answer == null) { // okay maybe the class is from a known GAV that we can download first and then load the class MavenGav gav = knownDependenciesResolver.mavenGavForClass(name); + if (gav == null) { + // okay maybe its a known pojo-bean from the catalog + PojoBeanModel model = catalog.pojoBeanModel(name); + if (model != null) { + gav = MavenGav.fromCoordinates(model.getGroupId(), model.getArtifactId(), model.getVersion(), null, null); + } + } if (gav != null) { if (!downloader.alreadyOnClasspath(gav.getGroupId(), gav.getArtifactId(), gav.getVersion())) { diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java index 8b5302d501160..860b7042740e3 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java @@ -367,6 +367,7 @@ public static String createParameterJsonSchema(PojoBeanModel model) { public static JsonObject asJsonObject(PojoBeanModel model) { JsonObject obj = new JsonObject(); baseToJson(model, obj); + artifactToJson(model, obj); obj.entrySet().removeIf(e -> e.getValue() == null); JsonObject wrapper = new JsonObject(); wrapper.put("model", obj); diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Kind.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Kind.java index 371c1060310b8..14c53d8451fc3 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Kind.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Kind.java @@ -26,5 +26,6 @@ public enum Kind { transformer, console, other, - eip + eip, + bean } diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/PojoBeanModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/PojoBeanModel.java index fccb953d2f87a..d99aae9bc1a37 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/PojoBeanModel.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/PojoBeanModel.java @@ -19,7 +19,7 @@ import java.util.ArrayList; import java.util.List; -public class PojoBeanModel extends BaseModel { +public class PojoBeanModel extends ArtifactModel { protected final List options = new ArrayList<>(); From 8a6ffd7641cfebb74710343b4b6c5f321cba1e12 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Mon, 18 Mar 2024 15:40:41 +0100 Subject: [PATCH 18/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../CamelCatalogJSonSchemaResolver.java | 7 +++++++ .../camel/catalog/DefaultRuntimeProvider.java | 6 ++++++ .../apache/camel/catalog/RuntimeProvider.java | 5 +++++ .../camel/catalog/CamelCatalogTest.java | 21 +++++++++++++++++++ .../org/apache/camel/CatalogCamelContext.java | 8 +++++++ .../camel/catalog/JSonSchemaResolver.java | 8 +++++++ .../impl/engine/AbstractCamelContext.java | 11 ++++++++++ .../catalog/impl/AbstractCamelCatalog.java | 6 +++++- .../impl/CamelContextJSonSchemaResolver.java | 10 +++++++++ .../yaml/io/ModelJSonSchemaResolver.java | 5 +++++ .../DependencyDownloaderClassResolver.java | 13 ++++++++---- .../camel/tooling/model/JsonMapper.java | 2 +- 12 files changed, 96 insertions(+), 6 deletions(-) diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalogJSonSchemaResolver.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalogJSonSchemaResolver.java index c5251125a2c50..fb01ee504688b 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalogJSonSchemaResolver.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalogJSonSchemaResolver.java @@ -138,6 +138,13 @@ public String getOtherJSonSchema(String name) { return loadResourceFromVersionManager(file); } + @Override + public String getPojoBeanJSonSchema(String name) { + name = sanitizeFileName(name); + final String file = camelCatalog.getRuntimeProvider().getPojoBeanJSonSchemaDirectory() + "/" + name + EXTENSION; + return loadResourceFromVersionManager(file); + } + String loadFromClasspath(final String className, final String fileName) { if (className != null) { String packageName = className.substring(0, className.lastIndexOf('.')); diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java index 7dc9f70652704..f80763ce3b212 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultRuntimeProvider.java @@ -34,6 +34,7 @@ public class DefaultRuntimeProvider implements RuntimeProvider { private static final String TRANSFORMER_DIR = "org/apache/camel/catalog/transformers"; private static final String CONSOLE_DIR = "org/apache/camel/catalog/dev-consoles"; private static final String OTHER_DIR = "org/apache/camel/catalog/others"; + private static final String BEANS_DIR = "org/apache/camel/catalog/beans"; private static final String COMPONENTS_CATALOG = "org/apache/camel/catalog/components.properties"; private static final String DATA_FORMATS_CATALOG = "org/apache/camel/catalog/dataformats.properties"; private static final String LANGUAGE_CATALOG = "org/apache/camel/catalog/languages.properties"; @@ -107,6 +108,11 @@ public String getOtherJSonSchemaDirectory() { return OTHER_DIR; } + @Override + public String getPojoBeanJSonSchemaDirectory() { + return BEANS_DIR; + } + protected String getComponentsCatalog() { return COMPONENTS_CATALOG; } diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java index 13beca90277b1..5d65d45207cd9 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/RuntimeProvider.java @@ -81,6 +81,11 @@ public interface RuntimeProvider { */ String getOtherJSonSchemaDirectory(); + /** + * Gets the directory where the pojo bean json files are stored in the catalog JAR file + */ + String getPojoBeanJSonSchemaDirectory(); + /** * Find all the component names from the Camel catalog supported by the provider */ diff --git a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java index 997851ebd9883..05740bbacb78b 100644 --- a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java +++ b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java @@ -34,6 +34,7 @@ import org.apache.camel.tooling.model.EntityRef; import org.apache.camel.tooling.model.Kind; import org.apache.camel.tooling.model.LanguageModel; +import org.apache.camel.tooling.model.PojoBeanModel; import org.apache.camel.tooling.model.ReleaseModel; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; @@ -1632,4 +1633,24 @@ public void capabilities() { Optional ref2 = catalog.findCapabilityRef("not-implemented"); Assertions.assertFalse(ref2.isPresent()); } + + @Test + public void testFindPojoBeanNames() { + List names = catalog.findBeansNames(); + + assertTrue(names.contains("GroupedBodyAggregationStrategy")); + assertTrue(names.contains("ZipAggregationStrategy")); + } + + @Test + public void testPojoBeanModel() { + PojoBeanModel model = catalog.pojoBeanModel("ZipAggregationStrategy"); + assertNotNull(model); + + assertEquals("bean", model.getKind()); + assertEquals("ZipAggregationStrategy", model.getName()); + assertEquals("org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", model.getJavaType()); + assertEquals(6, model.getOptions().size()); + } + } diff --git a/core/camel-api/src/main/java/org/apache/camel/CatalogCamelContext.java b/core/camel-api/src/main/java/org/apache/camel/CatalogCamelContext.java index c2f8c1b3b40c6..7295b820c4928 100644 --- a/core/camel-api/src/main/java/org/apache/camel/CatalogCamelContext.java +++ b/core/camel-api/src/main/java/org/apache/camel/CatalogCamelContext.java @@ -70,4 +70,12 @@ public interface CatalogCamelContext extends CamelContext { */ String getEipParameterJsonSchema(String eipName) throws IOException; + /** + * Returns the JSON schema representation of the pojo bean parameters for the + * given bean name. + * + * @return the json or null if the pojo bean does not exist + */ + String getPojoBeanParameterJsonSchema(String name) throws IOException; + } diff --git a/core/camel-api/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java b/core/camel-api/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java index 7d04305e0f26c..0027f93d1df42 100644 --- a/core/camel-api/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java +++ b/core/camel-api/src/main/java/org/apache/camel/catalog/JSonSchemaResolver.java @@ -89,4 +89,12 @@ public interface JSonSchemaResolver { */ String getMainJsonSchema(); + /** + * Returns the pojo bean information as JSON format. + * + * @param name the pojo bean name + * @return model details in JSon + */ + String getPojoBeanJSonSchema(String name); + } diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java index 0bd5970c3011d..07f9e92d11bfa 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java @@ -1491,6 +1491,17 @@ public String getDevConsoleParameterJsonSchema(String devConsoleName) throws IOE return null; } + @Override + public String getPojoBeanParameterJsonSchema(String beanName) throws IOException { + String name = sanitizeFileName(beanName) + ".json"; + String path = "META-INF/services/org/apache/camel/bean/" + name; + String inputStream = doLoadResource(beanName, path, "bean"); + if (inputStream != null) { + return inputStream; + } + return null; + } + // Helper methods // ----------------------------------------------------------------------- diff --git a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java index 3f1fe2bc82ebe..748bf0ef4e4fb 100644 --- a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java +++ b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java @@ -125,10 +125,14 @@ public TransformerModel transformerModel(String name) { } public PojoBeanModel pojoBeanModel(String name) { - String json = modelJSonSchema(name); + String json = pojoBeanJSonSchema(name); return json != null ? JsonMapper.generatePojoBeanModel(json) : null; } + public String pojoBeanJSonSchema(String name) { + return getJSonSchemaResolver().getPojoBeanJSonSchema(name); + } + public String devConsoleJSonSchema(String name) { return getJSonSchemaResolver().getDevConsoleJSonSchema(name); } diff --git a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/CamelContextJSonSchemaResolver.java b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/CamelContextJSonSchemaResolver.java index 8d32943cb444b..a737401dd8f08 100644 --- a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/CamelContextJSonSchemaResolver.java +++ b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/CamelContextJSonSchemaResolver.java @@ -98,6 +98,16 @@ public String getOtherJSonSchema(String name) { return null; } + @Override + public String getPojoBeanJSonSchema(String name) { + try { + return camelContext.getPojoBeanParameterJsonSchema(name); + } catch (IOException e) { + // ignore + } + return null; + } + @Override public String getModelJSonSchema(String name) { try { diff --git a/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/ModelJSonSchemaResolver.java b/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/ModelJSonSchemaResolver.java index f9496c19c95ff..3f6bd6eb97416 100644 --- a/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/ModelJSonSchemaResolver.java +++ b/core/camel-yaml-io/src/main/java/org/apache/camel/yaml/io/ModelJSonSchemaResolver.java @@ -64,6 +64,11 @@ public String getOtherJSonSchema(String name) { throw new UnsupportedOperationException("Only getModelJSonSchema is in use"); } + @Override + public String getPojoBeanJSonSchema(String name) { + throw new UnsupportedOperationException("Only getModelJSonSchema is in use"); + } + @Override public String getModelJSonSchema(String name) { try { diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderClassResolver.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderClassResolver.java index 3092c0cf430e5..3a560dd558b42 100644 --- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderClassResolver.java +++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderClassResolver.java @@ -27,6 +27,7 @@ import org.apache.camel.tooling.maven.MavenGav; import org.apache.camel.tooling.model.PojoBeanModel; import org.apache.camel.util.ObjectHelper; +import org.apache.camel.util.StringHelper; public final class DependencyDownloaderClassResolver extends DefaultClassResolver { @@ -62,8 +63,10 @@ public InputStream loadResourceAsStream(String uri) { MavenGav gav = knownDependenciesResolver.mavenGavForClass(uri); if (gav == null) { // okay maybe its a known pojo-bean from the catalog - PojoBeanModel model = catalog.pojoBeanModel(uri); - if (model != null) { + // lookup via class name without package + String last = StringHelper.afterLast(uri, ".", uri); + PojoBeanModel model = catalog.pojoBeanModel(last); + if (model != null && uri.equals(model.getJavaType())) { gav = MavenGav.fromCoordinates(model.getGroupId(), model.getArtifactId(), model.getVersion(), null, null); } } @@ -98,8 +101,10 @@ protected Class loadClass(String name, ClassLoader loader) { MavenGav gav = knownDependenciesResolver.mavenGavForClass(name); if (gav == null) { // okay maybe its a known pojo-bean from the catalog - PojoBeanModel model = catalog.pojoBeanModel(name); - if (model != null) { + // lookup via class name without package + String last = StringHelper.afterLast(name, ".", name); + PojoBeanModel model = catalog.pojoBeanModel(last); + if (model != null && name.equals(model.getJavaType())) { gav = MavenGav.fromCoordinates(model.getGroupId(), model.getArtifactId(), model.getVersion(), null, null); } } diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java index 860b7042740e3..352d25e82d16b 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java @@ -326,7 +326,7 @@ public static PojoBeanModel generatePojoBeanModel(JsonObject obj) { JsonObject mobj = (JsonObject) obj.get("bean"); PojoBeanModel model = new PojoBeanModel(); parseModel(mobj, model); - JsonObject mprp = (JsonObject) obj.get("properties"); + JsonObject mprp = (JsonObject) mobj.get("properties"); if (mprp != null) { for (Map.Entry entry : mprp.entrySet()) { JsonObject mp = (JsonObject) entry.getValue(); From 55ebf97c40e0f540a12994a83fdcc36a713be6d5 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Mon, 18 Mar 2024 16:39:07 +0100 Subject: [PATCH 19/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../TarAggregationStrategyConfigurer.java | 61 +++++++++++++++++ .../services/org/apache/camel/bean.properties | 7 ++ .../camel/bean/TarAggregationStrategy.json | 16 +++++ ...r.aggregate.tarfile.TarAggregationStrategy | 2 + .../tarfile/TarAggregationStrategy.java | 13 ++++ ...sltSaxonAggregationStrategyConfigurer.java | 67 +++++++++++++++++++ .../services/org/apache/camel/bean.properties | 7 ++ .../bean/XsltSaxonAggregationStrategy.json | 16 +++++ ...nt.xslt.saxon.XsltSaxonAggregationStrategy | 2 + .../saxon/XsltSaxonAggregationStrategy.java | 25 +++++++ .../XsltAggregationStrategyConfigurer.java | 67 +++++++++++++++++++ .../services/org/apache/camel/bean.properties | 7 ++ .../camel/bean/XsltAggregationStrategy.json | 16 +++++ ...mel.component.xslt.XsltAggregationStrategy | 2 + .../xslt/XsltAggregationStrategy.java | 32 ++++++++- .../maven/packaging/GeneratePojoBeanMojo.java | 7 ++ .../camel/maven/packaging/MojoHelper.java | 21 ++++++ 17 files changed, 367 insertions(+), 1 deletion(-) create mode 100644 components/camel-tarfile/src/generated/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategyConfigurer.java create mode 100644 components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/bean/TarAggregationStrategy.json create mode 100644 components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy create mode 100644 components/camel-xslt-saxon/src/generated/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategyConfigurer.java create mode 100644 components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltSaxonAggregationStrategy.json create mode 100644 components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy create mode 100644 components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltAggregationStrategyConfigurer.java create mode 100644 components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltAggregationStrategy.json create mode 100644 components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.xslt.XsltAggregationStrategy diff --git a/components/camel-tarfile/src/generated/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategyConfigurer.java b/components/camel-tarfile/src/generated/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategyConfigurer.java new file mode 100644 index 0000000000000..3a3a6f0be5d8b --- /dev/null +++ b/components/camel-tarfile/src/generated/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategyConfigurer.java @@ -0,0 +1,61 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.aggregate.tarfile; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class TarAggregationStrategyConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy target = (org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "fileprefix": + case "FilePrefix": target.setFilePrefix(property(camelContext, java.lang.String.class, value)); return true; + case "filesuffix": + case "FileSuffix": target.setFileSuffix(property(camelContext, java.lang.String.class, value)); return true; + case "parentdir": + case "ParentDir": target.setParentDir(property(camelContext, java.io.File.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "fileprefix": + case "FilePrefix": return java.lang.String.class; + case "filesuffix": + case "FileSuffix": return java.lang.String.class; + case "parentdir": + case "ParentDir": return java.io.File.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy target = (org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "fileprefix": + case "FilePrefix": return target.getFilePrefix(); + case "filesuffix": + case "FileSuffix": return target.getFileSuffix(); + case "parentdir": + case "ParentDir": return target.getParentDir(); + default: return null; + } + } +} + diff --git a/components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..ca831f80dbb73 --- /dev/null +++ b/components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=TarAggregationStrategy +groupId=org.apache.camel +artifactId=camel-tarfile +version=4.5.0-SNAPSHOT +projectName=Camel :: Tar File +projectDescription=Camel Tar file support diff --git a/components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/bean/TarAggregationStrategy.json b/components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/bean/TarAggregationStrategy.json new file mode 100644 index 0000000000000..87c8ffedc1f1f --- /dev/null +++ b/components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/bean/TarAggregationStrategy.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "TarAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Tar Aggregation Strategy", + "description": "AggregationStrategy to combine together incoming messages into a tar file. Please note that this aggregation strategy requires eager completion check to work properly.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-tarfile", + "version": "4.5.0-SNAPSHOT", + "properties": { "filePrefix": { "index": 0, "kind": "property", "displayName": "File Prefix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the prefix that will be used when creating the TAR filename." }, "fileSuffix": { "index": 1, "kind": "property", "displayName": "File Suffix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "tar", "description": "Sets the suffix that will be used when creating the TAR filename." }, "parentDir": { "index": 2, "kind": "property", "displayName": "Parent Dir", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the parent directory to use for writing temporary files" }, "preserveFolderStructure": { "index": 3, "kind": "property", "displayName": "Preserve Folder Structure", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "If the incoming message is from a file, then the folder structure of said file can be preserved" }, "useFilenameHeader": { "index": 4, "kind": "property", "displayName": "Use Filename Header", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use CamelFileName header for the filename instead of using unique message id" } } + } +} + diff --git a/components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy b/components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy new file mode 100644 index 0000000000000..6b9545ef2ba3b --- /dev/null +++ b/components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategyConfigurer diff --git a/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java b/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java index 512f7911966ad..2d5d5121e4e4c 100644 --- a/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java +++ b/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java @@ -31,6 +31,8 @@ import org.apache.camel.component.file.GenericFile; import org.apache.camel.component.file.GenericFileMessage; import org.apache.camel.component.file.GenericFileOperationFailedException; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; import org.apache.camel.spi.Synchronization; import org.apache.camel.util.FileUtil; import org.apache.commons.compress.archivers.ArchiveException; @@ -59,14 +61,25 @@ * tar file. *

*/ +@Metadata(label = "bean", + description = "AggregationStrategy to combine together incoming messages into a tar file." + + " Please note that this aggregation strategy requires eager completion check to work properly.") +@Configurer(metadataOnly = true) public class TarAggregationStrategy implements AggregationStrategy { private static final Logger LOG = LoggerFactory.getLogger(TarAggregationStrategy.class); + @Metadata(description = "Sets the prefix that will be used when creating the TAR filename.") private String filePrefix; + @Metadata(description = "Sets the suffix that will be used when creating the TAR filename.", defaultValue = "tar") private String fileSuffix = ".tar"; + @Metadata(label = "advanced", + description = "If the incoming message is from a file, then the folder structure of said file can be preserved") private boolean preserveFolderStructure; + @Metadata(label = "advanced", + description = "Whether to use CamelFileName header for the filename instead of using unique message id") private boolean useFilenameHeader; + @Metadata(label = "advanced", description = "Sets the parent directory to use for writing temporary files") private File parentDir = new File(System.getProperty("java.io.tmpdir")); public TarAggregationStrategy() { diff --git a/components/camel-xslt-saxon/src/generated/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategyConfigurer.java b/components/camel-xslt-saxon/src/generated/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategyConfigurer.java new file mode 100644 index 0000000000000..630598e4199f2 --- /dev/null +++ b/components/camel-xslt-saxon/src/generated/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategyConfigurer.java @@ -0,0 +1,67 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.xslt.saxon; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class XsltSaxonAggregationStrategyConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy target = (org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "output": + case "Output": target.setOutput(property(camelContext, org.apache.camel.component.xslt.XsltOutput.class, value)); return true; + case "propertyname": + case "PropertyName": target.setPropertyName(property(camelContext, java.lang.String.class, value)); return true; + case "transformerfactoryclass": + case "TransformerFactoryClass": target.setTransformerFactoryClass(property(camelContext, java.lang.String.class, value)); return true; + case "xslfile": + case "XslFile": target.setXslFile(property(camelContext, java.lang.String.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "output": + case "Output": return org.apache.camel.component.xslt.XsltOutput.class; + case "propertyname": + case "PropertyName": return java.lang.String.class; + case "transformerfactoryclass": + case "TransformerFactoryClass": return java.lang.String.class; + case "xslfile": + case "XslFile": return java.lang.String.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy target = (org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "output": + case "Output": return target.getOutput(); + case "propertyname": + case "PropertyName": return target.getPropertyName(); + case "transformerfactoryclass": + case "TransformerFactoryClass": return target.getTransformerFactoryClass(); + case "xslfile": + case "XslFile": return target.getXslFile(); + default: return null; + } + } +} + diff --git a/components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..1052be3f7b971 --- /dev/null +++ b/components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=XsltSaxonAggregationStrategy +groupId=org.apache.camel +artifactId=camel-xslt-saxon +version=4.5.0-SNAPSHOT +projectName=Camel :: XSLT Saxon +projectDescription=Camel XSLT Saxon component diff --git a/components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltSaxonAggregationStrategy.json b/components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltSaxonAggregationStrategy.json new file mode 100644 index 0000000000000..37ce9cd74513b --- /dev/null +++ b/components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltSaxonAggregationStrategy.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "XsltSaxonAggregationStrategy", + "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Xslt Saxon Aggregation Strategy", + "description": "The XSLT Aggregation Strategy enables you to use XSL stylesheets to aggregate messages (uses Saxon).", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-xslt-saxon", + "version": "4.5.0-SNAPSHOT", + "properties": { "output": { "index": 0, "kind": "property", "displayName": "Output", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "enum": [ "string", "bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "string", "description": "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime." }, "propertyName": { "index": 1, "kind": "property", "displayName": "Property Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "new-exchange", "description": "The exchange property name that contains the XML payloads as an input" }, "transformerFactoryClass": { "index": 2, "kind": "property", "displayName": "Transformer Factory Class", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom XSLT transformer factory, specified as a FQN class name" }, "xslFile": { "index": 3, "kind": "property", "displayName": "Xsl File", "required": true, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the XSL transformation file to use" } } + } +} + diff --git a/components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy b/components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy new file mode 100644 index 0000000000000..be8712de70ace --- /dev/null +++ b/components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategyConfigurer diff --git a/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategy.java b/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategy.java index 6ceccea2a28a5..e926fdff3ddf1 100644 --- a/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategy.java +++ b/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategy.java @@ -19,9 +19,34 @@ import net.sf.saxon.TransformerFactoryImpl; import org.apache.camel.component.xslt.XsltAggregationStrategy; import org.apache.camel.component.xslt.XsltBuilder; +import org.apache.camel.component.xslt.XsltOutput; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; +import javax.xml.transform.TransformerFactory; + +@Metadata(label = "bean", + description = "The XSLT Aggregation Strategy enables you to use XSL stylesheets to aggregate messages (uses Saxon).", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) +@Configurer(metadataOnly = true) public class XsltSaxonAggregationStrategy extends XsltAggregationStrategy { + // need to duplicate fields for code generation purpose + + @Metadata(description = "The name of the XSL transformation file to use", required = true) + private String xslFile; + @Metadata(description = "The exchange property name that contains the XML payloads as an input", defaultValue = "new-exchange") + private String propertyName; + private TransformerFactory transformerFactory; + @Metadata(label = "advanced", description = "To use a custom XSLT transformer factory, specified as a FQN class name") + private String transformerFactoryClass; + @Metadata(defaultValue = "string", enums = "string,bytes,DOM,file", + description = "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three" + + " options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify" + + " the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any" + + " paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime.") + private XsltOutput output = XsltOutput.string; + public XsltSaxonAggregationStrategy(String xslFileLocation) { super(xslFileLocation); setTransformerFactory(new TransformerFactoryImpl()); diff --git a/components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltAggregationStrategyConfigurer.java b/components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltAggregationStrategyConfigurer.java new file mode 100644 index 0000000000000..6d7bece605419 --- /dev/null +++ b/components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltAggregationStrategyConfigurer.java @@ -0,0 +1,67 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.xslt; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.xslt.XsltAggregationStrategy; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class XsltAggregationStrategyConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.xslt.XsltAggregationStrategy target = (org.apache.camel.component.xslt.XsltAggregationStrategy) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "output": + case "Output": target.setOutput(property(camelContext, org.apache.camel.component.xslt.XsltOutput.class, value)); return true; + case "propertyname": + case "PropertyName": target.setPropertyName(property(camelContext, java.lang.String.class, value)); return true; + case "transformerfactoryclass": + case "TransformerFactoryClass": target.setTransformerFactoryClass(property(camelContext, java.lang.String.class, value)); return true; + case "xslfile": + case "XslFile": target.setXslFile(property(camelContext, java.lang.String.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "output": + case "Output": return org.apache.camel.component.xslt.XsltOutput.class; + case "propertyname": + case "PropertyName": return java.lang.String.class; + case "transformerfactoryclass": + case "TransformerFactoryClass": return java.lang.String.class; + case "xslfile": + case "XslFile": return java.lang.String.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.xslt.XsltAggregationStrategy target = (org.apache.camel.component.xslt.XsltAggregationStrategy) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "output": + case "Output": return target.getOutput(); + case "propertyname": + case "PropertyName": return target.getPropertyName(); + case "transformerfactoryclass": + case "TransformerFactoryClass": return target.getTransformerFactoryClass(); + case "xslfile": + case "XslFile": return target.getXslFile(); + default: return null; + } + } +} + diff --git a/components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..80d1359893bfe --- /dev/null +++ b/components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=XsltAggregationStrategy +groupId=org.apache.camel +artifactId=camel-xslt +version=4.5.0-SNAPSHOT +projectName=Camel :: XSLT +projectDescription=Camel XSLT component diff --git a/components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltAggregationStrategy.json b/components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltAggregationStrategy.json new file mode 100644 index 0000000000000..d9b3686ed7071 --- /dev/null +++ b/components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltAggregationStrategy.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "XsltAggregationStrategy", + "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Xslt Aggregation Strategy", + "description": "The XSLT Aggregation Strategy enables you to use XSL stylesheets to aggregate messages.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-xslt", + "version": "4.5.0-SNAPSHOT", + "properties": { "output": { "index": 0, "kind": "property", "displayName": "Output", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "enum": [ "string", "bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "string", "description": "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime." }, "propertyName": { "index": 1, "kind": "property", "displayName": "Property Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "new-exchange", "description": "The exchange property name that contains the XML payloads as an input" }, "transformerFactoryClass": { "index": 2, "kind": "property", "displayName": "Transformer Factory Class", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom XSLT transformer factory, specified as a FQN class name" }, "xslFile": { "index": 3, "kind": "property", "displayName": "Xsl File", "required": true, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the XSL transformation file to use" } } + } +} + diff --git a/components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.xslt.XsltAggregationStrategy b/components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.xslt.XsltAggregationStrategy new file mode 100644 index 0000000000000..8bc4b41575ebe --- /dev/null +++ b/components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.xslt.XsltAggregationStrategy @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.xslt.XsltAggregationStrategyConfigurer diff --git a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltAggregationStrategy.java b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltAggregationStrategy.java index b22ac54b724ba..7e3c865ae152f 100644 --- a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltAggregationStrategy.java +++ b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltAggregationStrategy.java @@ -30,6 +30,8 @@ import org.apache.camel.CamelContext; import org.apache.camel.CamelContextAware; import org.apache.camel.Exchange; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.ResourceHelper; import org.apache.camel.support.service.ServiceSupport; import org.apache.camel.util.ObjectHelper; @@ -60,6 +62,9 @@ *

* Some code bits have been copied from the {@link org.apache.camel.component.xslt.XsltEndpoint}. */ +@Metadata(label = "bean", + description = "The XSLT Aggregation Strategy enables you to use XSL stylesheets to aggregate messages.") +@Configurer(metadataOnly = true) public class XsltAggregationStrategy extends ServiceSupport implements AggregationStrategy, CamelContextAware { private static final Logger LOG = LoggerFactory.getLogger(XsltAggregationStrategy.class); @@ -69,10 +74,19 @@ public class XsltAggregationStrategy extends ServiceSupport implements Aggregati private volatile URIResolver uriResolver; private CamelContext camelContext; + @Metadata(description = "The name of the XSL transformation file to use", required = true) + private String xslFile; + @Metadata(description = "The exchange property name that contains the XML payloads as an input", + defaultValue = "" + DEFAULT_PROPERTY_NAME) private String propertyName; - private final String xslFile; private TransformerFactory transformerFactory; + @Metadata(label = "advanced", description = "To use a custom XSLT transformer factory, specified as a FQN class name") private String transformerFactoryClass; + @Metadata(defaultValue = "string", enums = "string,bytes,DOM,file", + description = "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three" + + " options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify" + + " the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any" + + " paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime.") private XsltOutput output = XsltOutput.string; /** @@ -84,6 +98,14 @@ public XsltAggregationStrategy(String xslFileLocation) { this.xslFile = xslFileLocation; } + public String getXslFile() { + return xslFile; + } + + public void setXslFile(String xslFile) { + this.xslFile = xslFile; + } + @Override public CamelContext getCamelContext() { return camelContext; @@ -122,6 +144,10 @@ public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { return oldExchange; } + public XsltOutput getOutput() { + return output; + } + public void setOutput(XsltOutput output) { this.output = output; } @@ -134,6 +160,10 @@ public void setUriResolver(URIResolver uriResolver) { this.uriResolver = uriResolver; } + public String getTransformerFactoryClass() { + return transformerFactoryClass; + } + public void setTransformerFactoryClass(String transformerFactoryClass) { this.transformerFactoryClass = transformerFactoryClass; } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java index a19a72ac9df78..ee78f512036ed 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java @@ -174,6 +174,13 @@ public void execute() throws MojoExecutionException, MojoFailureException { model.setDeprecated(deprecated); model.setDescription(annotationValue(a, "description")); model.setInterfaceName(interfaceName(index, ci)); + if (model.getInterfaceName() == null) { + String av = annotationValue(a, "annotations", 0); + if (av != null) { + av = Strings.after(av, "interfaceName="); + } + model.setInterfaceName(av); + } // find all fields with @Metadata as options for (FieldInfo fi : ci.fields()) { diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java index 95f5a1de142d3..590f62690a795 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java @@ -26,6 +26,7 @@ import java.util.List; import org.jboss.jandex.AnnotationInstance; +import org.jboss.jandex.AnnotationValue; public final class MojoHelper { @@ -136,6 +137,26 @@ public static String annotationValue(AnnotationInstance ann, String key) { return s == null || s.isBlank() ? null : s; } + public static String annotationValue(AnnotationInstance ann, String key, int index) { + if (ann == null) { + return null; + } + var v = ann.value(key); + if (v == null) { + return null; + } + var o = v.value(); + if (o == null) { + return null; + } + AnnotationValue[] arr = (AnnotationValue[]) o; + if (arr.length == 0) { + return null; + } + var s = arr[index].value().toString(); + return s == null || s.isBlank() ? null : s; + } + /** * Gets the JSON schema type. * From 8f06311bf8a08bb940ecdce44ff24ab0abf3404f Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Mon, 18 Mar 2024 16:45:30 +0100 Subject: [PATCH 20/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- ...kRequestAggregationStrategyConfigurer.java | 35 +++++++++++++++++++ .../services/org/apache/camel/bean.properties | 7 ++++ ...hsearchBulkRequestAggregationStrategy.json | 15 ++++++++ ...astichsearchBulkRequestAggregationStrategy | 2 ++ ...searchBulkRequestAggregationStrategy.java} | 10 +++--- ...kRequestAggregationStrategyConfigurer.java | 35 +++++++++++++++++++ .../services/org/apache/camel/bean.properties | 7 ++++ ...nsearchBulkRequestAggregationStrategy.json | 15 ++++++++ ...n.OpensearchBulkRequestAggregationStrategy | 2 ++ ...searchBulkRequestAggregationStrategy.java} | 7 +++- .../pages/camel-4x-upgrade-guide-4_5.adoc | 5 +++ 11 files changed, 135 insertions(+), 5 deletions(-) create mode 100644 components/camel-elasticsearch/src/generated/java/org/apache/camel/component/es/aggregation/ElastichsearchBulkRequestAggregationStrategyConfigurer.java create mode 100644 components/camel-elasticsearch/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-elasticsearch/src/generated/resources/META-INF/services/org/apache/camel/bean/ElastichsearchBulkRequestAggregationStrategy.json create mode 100644 components/camel-elasticsearch/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.es.aggregation.ElastichsearchBulkRequestAggregationStrategy rename components/camel-elasticsearch/src/main/java/org/apache/camel/component/es/aggregation/{BulkRequestAggregationStrategy.java => ElastichsearchBulkRequestAggregationStrategy.java} (86%) create mode 100644 components/camel-opensearch/src/generated/java/org/apache/camel/component/opensearch/aggregation/OpensearchBulkRequestAggregationStrategyConfigurer.java create mode 100644 components/camel-opensearch/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-opensearch/src/generated/resources/META-INF/services/org/apache/camel/bean/OpensearchBulkRequestAggregationStrategy.json create mode 100644 components/camel-opensearch/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.opensearch.aggregation.OpensearchBulkRequestAggregationStrategy rename components/camel-opensearch/src/main/java/org/apache/camel/component/opensearch/aggregation/{BulkRequestAggregationStrategy.java => OpensearchBulkRequestAggregationStrategy.java} (86%) diff --git a/components/camel-elasticsearch/src/generated/java/org/apache/camel/component/es/aggregation/ElastichsearchBulkRequestAggregationStrategyConfigurer.java b/components/camel-elasticsearch/src/generated/java/org/apache/camel/component/es/aggregation/ElastichsearchBulkRequestAggregationStrategyConfigurer.java new file mode 100644 index 0000000000000..36ec2b10107dc --- /dev/null +++ b/components/camel-elasticsearch/src/generated/java/org/apache/camel/component/es/aggregation/ElastichsearchBulkRequestAggregationStrategyConfigurer.java @@ -0,0 +1,35 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.es.aggregation; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.es.aggregation.ElastichsearchBulkRequestAggregationStrategy; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class ElastichsearchBulkRequestAggregationStrategyConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + return false; + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + return null; + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + return null; + } +} + diff --git a/components/camel-elasticsearch/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-elasticsearch/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..dc45b3b8367c9 --- /dev/null +++ b/components/camel-elasticsearch/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=ElastichsearchBulkRequestAggregationStrategy +groupId=org.apache.camel +artifactId=camel-elasticsearch +version=4.5.0-SNAPSHOT +projectName=Camel :: ElasticSearch Java API Client +projectDescription=Camel ElasticSearch Java API Client support diff --git a/components/camel-elasticsearch/src/generated/resources/META-INF/services/org/apache/camel/bean/ElastichsearchBulkRequestAggregationStrategy.json b/components/camel-elasticsearch/src/generated/resources/META-INF/services/org/apache/camel/bean/ElastichsearchBulkRequestAggregationStrategy.json new file mode 100644 index 0000000000000..19e93a9e8dfc4 --- /dev/null +++ b/components/camel-elasticsearch/src/generated/resources/META-INF/services/org/apache/camel/bean/ElastichsearchBulkRequestAggregationStrategy.json @@ -0,0 +1,15 @@ +{ + "bean": { + "kind": "bean", + "name": "ElastichsearchBulkRequestAggregationStrategy", + "javaType": "org.apache.camel.component.es.aggregation.ElastichsearchBulkRequestAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Elastichsearch Bulk Request Aggregation Strategy", + "description": "Aggregates two ElasticSearch BulkOperation into a single BulkRequest", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-elasticsearch", + "version": "4.5.0-SNAPSHOT" + } +} + diff --git a/components/camel-elasticsearch/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.es.aggregation.ElastichsearchBulkRequestAggregationStrategy b/components/camel-elasticsearch/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.es.aggregation.ElastichsearchBulkRequestAggregationStrategy new file mode 100644 index 0000000000000..c73733d464a33 --- /dev/null +++ b/components/camel-elasticsearch/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.es.aggregation.ElastichsearchBulkRequestAggregationStrategy @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.es.aggregation.ElastichsearchBulkRequestAggregationStrategyConfigurer diff --git a/components/camel-elasticsearch/src/main/java/org/apache/camel/component/es/aggregation/BulkRequestAggregationStrategy.java b/components/camel-elasticsearch/src/main/java/org/apache/camel/component/es/aggregation/ElastichsearchBulkRequestAggregationStrategy.java similarity index 86% rename from components/camel-elasticsearch/src/main/java/org/apache/camel/component/es/aggregation/BulkRequestAggregationStrategy.java rename to components/camel-elasticsearch/src/main/java/org/apache/camel/component/es/aggregation/ElastichsearchBulkRequestAggregationStrategy.java index bed13f675efc5..bb80105b480e6 100644 --- a/components/camel-elasticsearch/src/main/java/org/apache/camel/component/es/aggregation/BulkRequestAggregationStrategy.java +++ b/components/camel-elasticsearch/src/main/java/org/apache/camel/component/es/aggregation/ElastichsearchBulkRequestAggregationStrategy.java @@ -23,11 +23,13 @@ import org.apache.camel.AggregationStrategy; import org.apache.camel.Exchange; import org.apache.camel.InvalidPayloadRuntimeException; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; -/** - * Aggregates two {@link BulkOperation}s into a single {@link BulkRequest}. - */ -public class BulkRequestAggregationStrategy implements AggregationStrategy { +@Metadata(label = "bean", + description = "Aggregates two ElasticSearch BulkOperation into a single BulkRequest") +@Configurer(metadataOnly = true) +public class ElastichsearchBulkRequestAggregationStrategy implements AggregationStrategy { @Override public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { diff --git a/components/camel-opensearch/src/generated/java/org/apache/camel/component/opensearch/aggregation/OpensearchBulkRequestAggregationStrategyConfigurer.java b/components/camel-opensearch/src/generated/java/org/apache/camel/component/opensearch/aggregation/OpensearchBulkRequestAggregationStrategyConfigurer.java new file mode 100644 index 0000000000000..da60f6d19dd54 --- /dev/null +++ b/components/camel-opensearch/src/generated/java/org/apache/camel/component/opensearch/aggregation/OpensearchBulkRequestAggregationStrategyConfigurer.java @@ -0,0 +1,35 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.opensearch.aggregation; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.opensearch.aggregation.OpensearchBulkRequestAggregationStrategy; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class OpensearchBulkRequestAggregationStrategyConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + return false; + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + return null; + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + return null; + } +} + diff --git a/components/camel-opensearch/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-opensearch/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..7fe4a21c327bf --- /dev/null +++ b/components/camel-opensearch/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=OpensearchBulkRequestAggregationStrategy +groupId=org.apache.camel +artifactId=camel-opensearch +version=4.5.0-SNAPSHOT +projectName=Camel :: OpenSearch Java API Client +projectDescription=Camel OpenSearch Java API Client support diff --git a/components/camel-opensearch/src/generated/resources/META-INF/services/org/apache/camel/bean/OpensearchBulkRequestAggregationStrategy.json b/components/camel-opensearch/src/generated/resources/META-INF/services/org/apache/camel/bean/OpensearchBulkRequestAggregationStrategy.json new file mode 100644 index 0000000000000..482106ac0754a --- /dev/null +++ b/components/camel-opensearch/src/generated/resources/META-INF/services/org/apache/camel/bean/OpensearchBulkRequestAggregationStrategy.json @@ -0,0 +1,15 @@ +{ + "bean": { + "kind": "bean", + "name": "OpensearchBulkRequestAggregationStrategy", + "javaType": "org.apache.camel.component.opensearch.aggregation.OpensearchBulkRequestAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Opensearch Bulk Request Aggregation Strategy", + "description": "Aggregates two OpenSearch BulkOperation into a single BulkRequest", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-opensearch", + "version": "4.5.0-SNAPSHOT" + } +} + diff --git a/components/camel-opensearch/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.opensearch.aggregation.OpensearchBulkRequestAggregationStrategy b/components/camel-opensearch/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.opensearch.aggregation.OpensearchBulkRequestAggregationStrategy new file mode 100644 index 0000000000000..8f96f0680500e --- /dev/null +++ b/components/camel-opensearch/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.opensearch.aggregation.OpensearchBulkRequestAggregationStrategy @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.opensearch.aggregation.OpensearchBulkRequestAggregationStrategyConfigurer diff --git a/components/camel-opensearch/src/main/java/org/apache/camel/component/opensearch/aggregation/BulkRequestAggregationStrategy.java b/components/camel-opensearch/src/main/java/org/apache/camel/component/opensearch/aggregation/OpensearchBulkRequestAggregationStrategy.java similarity index 86% rename from components/camel-opensearch/src/main/java/org/apache/camel/component/opensearch/aggregation/BulkRequestAggregationStrategy.java rename to components/camel-opensearch/src/main/java/org/apache/camel/component/opensearch/aggregation/OpensearchBulkRequestAggregationStrategy.java index 40e109e8631c6..a6fd99d24d72e 100644 --- a/components/camel-opensearch/src/main/java/org/apache/camel/component/opensearch/aggregation/BulkRequestAggregationStrategy.java +++ b/components/camel-opensearch/src/main/java/org/apache/camel/component/opensearch/aggregation/OpensearchBulkRequestAggregationStrategy.java @@ -21,13 +21,18 @@ import org.apache.camel.AggregationStrategy; import org.apache.camel.Exchange; import org.apache.camel.InvalidPayloadRuntimeException; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; import org.opensearch.client.opensearch.core.BulkRequest; import org.opensearch.client.opensearch.core.bulk.BulkOperation; /** * Aggregates two {@link BulkOperation}s into a single {@link BulkRequest}. */ -public class BulkRequestAggregationStrategy implements AggregationStrategy { +@Metadata(label = "bean", + description = "Aggregates two OpenSearch BulkOperation into a single BulkRequest") +@Configurer(metadataOnly = true) +public class OpensearchBulkRequestAggregationStrategy implements AggregationStrategy { @Override public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { diff --git a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_5.adoc b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_5.adoc index 09e9b72483447..b781462f3162e 100644 --- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_5.adoc +++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_5.adoc @@ -256,3 +256,8 @@ Upgraded Apache Shiro from 1.13 to 2.0. Upgraded to Twilio 10.1.0 which removed `call-feedback` and `call-feedback-summary` from the available APIs, to use from Camel. + +=== camel-elasticsearch / camel-opensearch + +The `BulkRequestAggregationStrategy` has been renamed to `OpensearchBulkRequestAggregationStrategy` and +`ElasticsearchBulkRequestAggregationStrategy` respectively. \ No newline at end of file From 34c3e7851521c25728eeaf96898685048d4e4620 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Mon, 18 Mar 2024 16:50:49 +0100 Subject: [PATCH 21/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../org/apache/camel/catalog/beans.properties | 5 +++++ ...tichsearchBulkRequestAggregationStrategy.json | 15 +++++++++++++++ ...OpensearchBulkRequestAggregationStrategy.json | 15 +++++++++++++++ .../catalog/beans/TarAggregationStrategy.json | 16 ++++++++++++++++ .../catalog/beans/XsltAggregationStrategy.json | 16 ++++++++++++++++ .../beans/XsltSaxonAggregationStrategy.json | 16 ++++++++++++++++ 6 files changed, 83 insertions(+) create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/ElastichsearchBulkRequestAggregationStrategy.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/OpensearchBulkRequestAggregationStrategy.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/TarAggregationStrategy.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltAggregationStrategy.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltSaxonAggregationStrategy.json diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties index d3d0542f64e7e..8fe1934976a06 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties @@ -1,11 +1,16 @@ DefaultHeaderFilterStrategy +ElastichsearchBulkRequestAggregationStrategy FileIdempotentRepository GroupedBodyAggregationStrategy GroupedExchangeAggregationStrategy GroupedMessageAggregationStrategy MemoryAggregationRepository MemoryIdempotentRepository +OpensearchBulkRequestAggregationStrategy StringAggregationStrategy +TarAggregationStrategy UseLatestAggregationStrategy UseOriginalAggregationStrategy +XsltAggregationStrategy +XsltSaxonAggregationStrategy ZipAggregationStrategy diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/ElastichsearchBulkRequestAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/ElastichsearchBulkRequestAggregationStrategy.json new file mode 100644 index 0000000000000..19e93a9e8dfc4 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/ElastichsearchBulkRequestAggregationStrategy.json @@ -0,0 +1,15 @@ +{ + "bean": { + "kind": "bean", + "name": "ElastichsearchBulkRequestAggregationStrategy", + "javaType": "org.apache.camel.component.es.aggregation.ElastichsearchBulkRequestAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Elastichsearch Bulk Request Aggregation Strategy", + "description": "Aggregates two ElasticSearch BulkOperation into a single BulkRequest", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-elasticsearch", + "version": "4.5.0-SNAPSHOT" + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/OpensearchBulkRequestAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/OpensearchBulkRequestAggregationStrategy.json new file mode 100644 index 0000000000000..482106ac0754a --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/OpensearchBulkRequestAggregationStrategy.json @@ -0,0 +1,15 @@ +{ + "bean": { + "kind": "bean", + "name": "OpensearchBulkRequestAggregationStrategy", + "javaType": "org.apache.camel.component.opensearch.aggregation.OpensearchBulkRequestAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Opensearch Bulk Request Aggregation Strategy", + "description": "Aggregates two OpenSearch BulkOperation into a single BulkRequest", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-opensearch", + "version": "4.5.0-SNAPSHOT" + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/TarAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/TarAggregationStrategy.json new file mode 100644 index 0000000000000..87c8ffedc1f1f --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/TarAggregationStrategy.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "TarAggregationStrategy", + "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Tar Aggregation Strategy", + "description": "AggregationStrategy to combine together incoming messages into a tar file. Please note that this aggregation strategy requires eager completion check to work properly.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-tarfile", + "version": "4.5.0-SNAPSHOT", + "properties": { "filePrefix": { "index": 0, "kind": "property", "displayName": "File Prefix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the prefix that will be used when creating the TAR filename." }, "fileSuffix": { "index": 1, "kind": "property", "displayName": "File Suffix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "tar", "description": "Sets the suffix that will be used when creating the TAR filename." }, "parentDir": { "index": 2, "kind": "property", "displayName": "Parent Dir", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the parent directory to use for writing temporary files" }, "preserveFolderStructure": { "index": 3, "kind": "property", "displayName": "Preserve Folder Structure", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "If the incoming message is from a file, then the folder structure of said file can be preserved" }, "useFilenameHeader": { "index": 4, "kind": "property", "displayName": "Use Filename Header", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use CamelFileName header for the filename instead of using unique message id" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltAggregationStrategy.json new file mode 100644 index 0000000000000..d9b3686ed7071 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltAggregationStrategy.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "XsltAggregationStrategy", + "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Xslt Aggregation Strategy", + "description": "The XSLT Aggregation Strategy enables you to use XSL stylesheets to aggregate messages.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-xslt", + "version": "4.5.0-SNAPSHOT", + "properties": { "output": { "index": 0, "kind": "property", "displayName": "Output", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "enum": [ "string", "bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "string", "description": "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime." }, "propertyName": { "index": 1, "kind": "property", "displayName": "Property Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "new-exchange", "description": "The exchange property name that contains the XML payloads as an input" }, "transformerFactoryClass": { "index": 2, "kind": "property", "displayName": "Transformer Factory Class", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom XSLT transformer factory, specified as a FQN class name" }, "xslFile": { "index": 3, "kind": "property", "displayName": "Xsl File", "required": true, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the XSL transformation file to use" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltSaxonAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltSaxonAggregationStrategy.json new file mode 100644 index 0000000000000..37ce9cd74513b --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltSaxonAggregationStrategy.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "XsltSaxonAggregationStrategy", + "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Xslt Saxon Aggregation Strategy", + "description": "The XSLT Aggregation Strategy enables you to use XSL stylesheets to aggregate messages (uses Saxon).", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-xslt-saxon", + "version": "4.5.0-SNAPSHOT", + "properties": { "output": { "index": 0, "kind": "property", "displayName": "Output", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "enum": [ "string", "bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "string", "description": "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime." }, "propertyName": { "index": 1, "kind": "property", "displayName": "Property Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "new-exchange", "description": "The exchange property name that contains the XML payloads as an input" }, "transformerFactoryClass": { "index": 2, "kind": "property", "displayName": "Transformer Factory Class", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom XSLT transformer factory, specified as a FQN class name" }, "xslFile": { "index": 3, "kind": "property", "displayName": "Xsl File", "required": true, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the XSL transformation file to use" } } + } +} + From 8cdd76e14f12e4d67372b9479a89499ce69836de Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Mon, 18 Mar 2024 16:55:04 +0100 Subject: [PATCH 22/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../camel/maven/packaging/GeneratePojoBeanMojo.java | 7 ++----- .../apache/camel/maven/packaging/MojoHelper.java | 13 ++++++++++--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java index ee78f512036ed..2710773fe448c 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java @@ -175,11 +175,8 @@ public void execute() throws MojoExecutionException, MojoFailureException { model.setDescription(annotationValue(a, "description")); model.setInterfaceName(interfaceName(index, ci)); if (model.getInterfaceName() == null) { - String av = annotationValue(a, "annotations", 0); - if (av != null) { - av = Strings.after(av, "interfaceName="); - } - model.setInterfaceName(av); + // fallback to use hardcoded from @Metadata/annotations + model.setInterfaceName(annotationValue(a, "annotations", "interfaceName")); } // find all fields with @Metadata as options diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java index 590f62690a795..000c606e708b0 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java @@ -25,6 +25,7 @@ import java.util.Date; import java.util.List; +import org.apache.camel.tooling.util.Strings; import org.jboss.jandex.AnnotationInstance; import org.jboss.jandex.AnnotationValue; @@ -137,7 +138,7 @@ public static String annotationValue(AnnotationInstance ann, String key) { return s == null || s.isBlank() ? null : s; } - public static String annotationValue(AnnotationInstance ann, String key, int index) { + public static String annotationValue(AnnotationInstance ann, String key, String subKey) { if (ann == null) { return null; } @@ -153,8 +154,14 @@ public static String annotationValue(AnnotationInstance ann, String key, int ind if (arr.length == 0) { return null; } - var s = arr[index].value().toString(); - return s == null || s.isBlank() ? null : s; + for (AnnotationValue av : arr) { + String s = av.value().toString(); + String before = Strings.before(s, "="); + if (subKey.equals(before)) { + return Strings.after(s, "="); + } + } + return null; } /** From d3c1aadc65a650ed7bc93db9e06506701048618e Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Mon, 18 Mar 2024 17:10:31 +0100 Subject: [PATCH 23/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- ...ssandraIdempotentRepositoryConfigurer.java | 85 +++++++++++++++++++ .../services/org/apache/camel/bean.properties | 7 ++ .../bean/CassandraIdempotentRepository.json | 16 ++++ ...nt.cassandra.CassandraIdempotentRepository | 2 + .../CassandraIdempotentRepository.java | 38 +++++++-- 5 files changed, 142 insertions(+), 6 deletions(-) create mode 100644 components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java create mode 100644 components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraIdempotentRepository.json create mode 100644 components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository diff --git a/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java b/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java new file mode 100644 index 0000000000000..96bc8b2f7602f --- /dev/null +++ b/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java @@ -0,0 +1,85 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.idempotent.cassandra; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class CassandraIdempotentRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository target = (org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "pkcolumns": + case "PKColumns": target.setPKColumns(property(camelContext, java.lang.String[].class, value)); return true; + case "prefixpkvalues": + case "PrefixPKValues": target.setPrefixPKValues(property(camelContext, java.lang.String[].class, value)); return true; + case "readconsistencylevel": + case "ReadConsistencyLevel": target.setReadConsistencyLevel(property(camelContext, com.datastax.oss.driver.api.core.ConsistencyLevel.class, value)); return true; + case "session": + case "Session": target.setSession(property(camelContext, com.datastax.oss.driver.api.core.CqlSession.class, value)); return true; + case "table": + case "Table": target.setTable(property(camelContext, java.lang.String.class, value)); return true; + case "ttl": + case "Ttl": target.setTtl(property(camelContext, java.lang.Integer.class, value)); return true; + case "writeconsistencylevel": + case "WriteConsistencyLevel": target.setWriteConsistencyLevel(property(camelContext, com.datastax.oss.driver.api.core.ConsistencyLevel.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "pkcolumns": + case "PKColumns": return java.lang.String[].class; + case "prefixpkvalues": + case "PrefixPKValues": return java.lang.String[].class; + case "readconsistencylevel": + case "ReadConsistencyLevel": return com.datastax.oss.driver.api.core.ConsistencyLevel.class; + case "session": + case "Session": return com.datastax.oss.driver.api.core.CqlSession.class; + case "table": + case "Table": return java.lang.String.class; + case "ttl": + case "Ttl": return java.lang.Integer.class; + case "writeconsistencylevel": + case "WriteConsistencyLevel": return com.datastax.oss.driver.api.core.ConsistencyLevel.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository target = (org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "pkcolumns": + case "PKColumns": return target.getPKColumns(); + case "prefixpkvalues": + case "PrefixPKValues": return target.getPrefixPKValues(); + case "readconsistencylevel": + case "ReadConsistencyLevel": return target.getReadConsistencyLevel(); + case "session": + case "Session": return target.getSession(); + case "table": + case "Table": return target.getTable(); + case "ttl": + case "Ttl": return target.getTtl(); + case "writeconsistencylevel": + case "WriteConsistencyLevel": return target.getWriteConsistencyLevel(); + default: return null; + } + } +} + diff --git a/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..17ccc237c6737 --- /dev/null +++ b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=CassandraIdempotentRepository +groupId=org.apache.camel +artifactId=camel-cassandraql +version=4.5.0-SNAPSHOT +projectName=Camel :: Cassandra CQL +projectDescription=Cassandra CQL3 support diff --git a/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraIdempotentRepository.json b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraIdempotentRepository.json new file mode 100644 index 0000000000000..54da9b77f0320 --- /dev/null +++ b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "CassandraIdempotentRepository", + "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Cassandra Idempotent Repository", + "description": "Idempotent repository that uses Cassandra table to store message ids.Advice: use LeveledCompaction for this table and tune read\/write consistency levels.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-cassandraql", + "version": "4.5.0-SNAPSHOT", + "properties": { "pkColumns": { "index": 0, "kind": "property", "displayName": "Pk Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "prefixPKValues": { "index": 1, "kind": "property", "displayName": "Prefix PKValues", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "readConsistencyLevel": { "index": 2, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" }, "session": { "index": 3, "kind": "property", "displayName": "Session", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 4, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_IDEMPOTENT", "description": "The table name for storing the data" }, "ttl": { "index": 5, "kind": "property", "displayName": "Ttl", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "writeConsistencyLevel": { "index": 6, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" } } + } +} + diff --git a/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository new file mode 100644 index 0000000000000..535763930034a --- /dev/null +++ b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepositoryConfigurer diff --git a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java index 6561414cff962..1e3c0abcb0fda 100644 --- a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java +++ b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java @@ -26,8 +26,11 @@ import com.datastax.oss.driver.api.querybuilder.insert.Insert; import com.datastax.oss.driver.api.querybuilder.select.Select; import com.datastax.oss.driver.api.querybuilder.truncate.Truncate; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.IdempotentRepository; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.service.ServiceSupport; +import org.apache.camel.util.ObjectHelper; import org.apache.camel.utils.cassandra.CassandraSessionHolder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,6 +47,10 @@ * LeveledCompaction for this table and tune read/write consistency levels. Warning: Cassandra is not the best tool for * queuing use cases See http://www.datastax.com/dev/blog/cassandra-anti-patterns-queues-and-queue-like-datasets */ +@Metadata(label = "bean", + description = "Idempotent repository that uses Cassandra table to store message ids." + + "Advice: use LeveledCompaction for this table and tune read/write consistency levels.") +@Configurer(metadataOnly = true) public class CassandraIdempotentRepository extends ServiceSupport implements IdempotentRepository { /** * Logger @@ -52,30 +59,38 @@ public class CassandraIdempotentRepository extends ServiceSupport implements Ide /** * Session holder */ - private CassandraSessionHolder sessionHolder; + @Metadata(description = "Cassandra session", required = true) + private CassandraSessionHolder session; + /** * Table name */ + @Metadata(description = "The table name for storing the data", defaultValue = "CAMEL_IDEMPOTENT") private String table = "CAMEL_IDEMPOTENT"; /** * Values used as primary key prefix */ + @Metadata(description = "Values used as primary key prefix. Multiple values can be separated by comma.", javaType = "java.lang.String") private String[] prefixPKValues = new String[0]; /** * Primary key columns */ + @Metadata(description = "Primary key columns. Multiple values can be separated by comma.", javaType = "java.lang.String", defaultValue = "KEY") private String[] pkColumns = { "KEY" }; /** * Time to live in seconds used for inserts */ + @Metadata(description = "Time to live in seconds used for inserts") private Integer ttl; /** * Write consistency level */ + @Metadata(description = "Write consistency level", enums = "ANY,ONE,TWO,THREE,QUORUM,ALL,LOCAL_ONE,LOCAL_QUORUM,EACH_QUORUM,SERIAL,LOCAL_SERIAL") private ConsistencyLevel writeConsistencyLevel; /** * Read consistency level */ + @Metadata(description = "Read consistency level", enums = "ANY,ONE,TWO,THREE,QUORUM,ALL,LOCAL_ONE,LOCAL_QUORUM,EACH_QUORUM,SERIAL,LOCAL_SERIAL") private ConsistencyLevel readConsistencyLevel; private PreparedStatement insertStatement; private PreparedStatement selectStatement; @@ -86,7 +101,7 @@ public CassandraIdempotentRepository() { } public CassandraIdempotentRepository(CqlSession session) { - this.sessionHolder = new CassandraSessionHolder(session); + this.session = new CassandraSessionHolder(session); } private boolean isKey(ResultSet resultSet) { @@ -113,7 +128,8 @@ protected Object[] getPKValues(String key) { @Override protected void doStart() throws Exception { - sessionHolder.start(); + ObjectHelper.notNull(session, "session", this); + session.start(); initInsertStatement(); initSelectStatement(); initDeleteStatement(); @@ -122,7 +138,9 @@ protected void doStart() throws Exception { @Override protected void doStop() throws Exception { - sessionHolder.stop(); + if (session != null) { + session.stop(); + } } // ------------------------------------------------------------------------- // Add key to repository @@ -200,11 +218,11 @@ public void clear() { // Getters & Setters public CqlSession getSession() { - return sessionHolder.getSession(); + return session.getSession(); } public void setSession(CqlSession session) { - this.sessionHolder = new CassandraSessionHolder(session); + this.session = new CassandraSessionHolder(session); } public String getTable() { @@ -223,6 +241,10 @@ public void setPKColumns(String... pkColumns) { this.pkColumns = pkColumns; } + public void setPKColumns(String value) { + this.pkColumns = value.split(","); + } + public Integer getTtl() { return ttl; } @@ -255,4 +277,8 @@ public void setPrefixPKValues(String[] prefixPKValues) { this.prefixPKValues = prefixPKValues; } + public void setPrefixPKValues(String values) { + this.prefixPKValues = values.split(","); + } + } From abe2ea17445f313307f63d00b6d22eaaa2d8b3a9 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 19 Mar 2024 06:43:05 +0100 Subject: [PATCH 24/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../org/apache/camel/catalog/beans.properties | 1 + .../beans/CassandraIdempotentRepository.json | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraIdempotentRepository.json diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties index 8fe1934976a06..23dbb29eb3664 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties @@ -1,3 +1,4 @@ +CassandraIdempotentRepository DefaultHeaderFilterStrategy ElastichsearchBulkRequestAggregationStrategy FileIdempotentRepository diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraIdempotentRepository.json new file mode 100644 index 0000000000000..54da9b77f0320 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "CassandraIdempotentRepository", + "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Cassandra Idempotent Repository", + "description": "Idempotent repository that uses Cassandra table to store message ids.Advice: use LeveledCompaction for this table and tune read\/write consistency levels.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-cassandraql", + "version": "4.5.0-SNAPSHOT", + "properties": { "pkColumns": { "index": 0, "kind": "property", "displayName": "Pk Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "prefixPKValues": { "index": 1, "kind": "property", "displayName": "Prefix PKValues", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "readConsistencyLevel": { "index": 2, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" }, "session": { "index": 3, "kind": "property", "displayName": "Session", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 4, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_IDEMPOTENT", "description": "The table name for storing the data" }, "ttl": { "index": 5, "kind": "property", "displayName": "Ttl", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "writeConsistencyLevel": { "index": 6, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" } } + } +} + From 36f91fd1c577a520e591f13c8f6ca9038f3fd147 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 19 Mar 2024 06:53:51 +0100 Subject: [PATCH 25/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../beans/CassandraIdempotentRepository.json | 4 +- ...ssandraIdempotentRepositoryConfigurer.java | 4 +- .../bean/CassandraIdempotentRepository.json | 4 +- .../CassandraIdempotentRepository.java | 38 +++++-------------- .../maven/packaging/GeneratePojoBeanMojo.java | 2 +- 5 files changed, 16 insertions(+), 36 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraIdempotentRepository.json index 54da9b77f0320..0c3722d07806a 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraIdempotentRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraIdempotentRepository.json @@ -5,12 +5,12 @@ "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "interfaceType": "org.apache.camel.spi.IdempotentRepository", "title": "Cassandra Idempotent Repository", - "description": "Idempotent repository that uses Cassandra table to store message ids.Advice: use LeveledCompaction for this table and tune read\/write consistency levels.", + "description": "Idempotent repository that uses Cassandra table to store message ids. Advice: use LeveledCompaction for this table and tune read\/write consistency levels.", "deprecated": false, "groupId": "org.apache.camel", "artifactId": "camel-cassandraql", "version": "4.5.0-SNAPSHOT", - "properties": { "pkColumns": { "index": 0, "kind": "property", "displayName": "Pk Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "prefixPKValues": { "index": 1, "kind": "property", "displayName": "Prefix PKValues", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "readConsistencyLevel": { "index": 2, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" }, "session": { "index": 3, "kind": "property", "displayName": "Session", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 4, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_IDEMPOTENT", "description": "The table name for storing the data" }, "ttl": { "index": 5, "kind": "property", "displayName": "Ttl", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "writeConsistencyLevel": { "index": 6, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" } } + "properties": { "pkColumns": { "index": 0, "kind": "property", "displayName": "Primary Key Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "prefixPKValues": { "index": 1, "kind": "property", "displayName": "Prefix Primary Key Values", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "readConsistencyLevel": { "index": 2, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" }, "session": { "index": 3, "kind": "property", "displayName": "Session", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 4, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_IDEMPOTENT", "description": "The table name for storing the data" }, "ttl": { "index": 5, "kind": "property", "displayName": "Time to Live", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "writeConsistencyLevel": { "index": 6, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" } } } } diff --git a/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java b/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java index 96bc8b2f7602f..a775cce13b56c 100644 --- a/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java +++ b/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java @@ -22,7 +22,7 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository target = (org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository) obj; switch (ignoreCase ? name.toLowerCase() : name) { case "pkcolumns": - case "PKColumns": target.setPKColumns(property(camelContext, java.lang.String[].class, value)); return true; + case "PKColumns": target.setPKColumns(property(camelContext, java.lang.String.class, value)); return true; case "prefixpkvalues": case "PrefixPKValues": target.setPrefixPKValues(property(camelContext, java.lang.String[].class, value)); return true; case "readconsistencylevel": @@ -43,7 +43,7 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj public Class getOptionType(String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { case "pkcolumns": - case "PKColumns": return java.lang.String[].class; + case "PKColumns": return java.lang.String.class; case "prefixpkvalues": case "PrefixPKValues": return java.lang.String[].class; case "readconsistencylevel": diff --git a/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraIdempotentRepository.json b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraIdempotentRepository.json index 54da9b77f0320..0c3722d07806a 100644 --- a/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraIdempotentRepository.json +++ b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraIdempotentRepository.json @@ -5,12 +5,12 @@ "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "interfaceType": "org.apache.camel.spi.IdempotentRepository", "title": "Cassandra Idempotent Repository", - "description": "Idempotent repository that uses Cassandra table to store message ids.Advice: use LeveledCompaction for this table and tune read\/write consistency levels.", + "description": "Idempotent repository that uses Cassandra table to store message ids. Advice: use LeveledCompaction for this table and tune read\/write consistency levels.", "deprecated": false, "groupId": "org.apache.camel", "artifactId": "camel-cassandraql", "version": "4.5.0-SNAPSHOT", - "properties": { "pkColumns": { "index": 0, "kind": "property", "displayName": "Pk Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "prefixPKValues": { "index": 1, "kind": "property", "displayName": "Prefix PKValues", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "readConsistencyLevel": { "index": 2, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" }, "session": { "index": 3, "kind": "property", "displayName": "Session", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 4, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_IDEMPOTENT", "description": "The table name for storing the data" }, "ttl": { "index": 5, "kind": "property", "displayName": "Ttl", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "writeConsistencyLevel": { "index": 6, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" } } + "properties": { "pkColumns": { "index": 0, "kind": "property", "displayName": "Primary Key Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "prefixPKValues": { "index": 1, "kind": "property", "displayName": "Prefix Primary Key Values", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "readConsistencyLevel": { "index": 2, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" }, "session": { "index": 3, "kind": "property", "displayName": "Session", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 4, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_IDEMPOTENT", "description": "The table name for storing the data" }, "ttl": { "index": 5, "kind": "property", "displayName": "Time to Live", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "writeConsistencyLevel": { "index": 6, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" } } } } diff --git a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java index 1e3c0abcb0fda..fa494ca3a8f8a 100644 --- a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java +++ b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java @@ -49,49 +49,29 @@ */ @Metadata(label = "bean", description = "Idempotent repository that uses Cassandra table to store message ids." - + "Advice: use LeveledCompaction for this table and tune read/write consistency levels.") + + " Advice: use LeveledCompaction for this table and tune read/write consistency levels.") @Configurer(metadataOnly = true) public class CassandraIdempotentRepository extends ServiceSupport implements IdempotentRepository { - /** - * Logger - */ + private static final Logger LOGGER = LoggerFactory.getLogger(CassandraIdempotentRepository.class); - /** - * Session holder - */ + @Metadata(description = "Cassandra session", required = true) private CassandraSessionHolder session; - - /** - * Table name - */ @Metadata(description = "The table name for storing the data", defaultValue = "CAMEL_IDEMPOTENT") private String table = "CAMEL_IDEMPOTENT"; - /** - * Values used as primary key prefix - */ - @Metadata(description = "Values used as primary key prefix. Multiple values can be separated by comma.", javaType = "java.lang.String") + @Metadata(description = "Values used as primary key prefix. Multiple values can be separated by comma.", displayName = + "Prefix Primary Key Values", javaType = "java.lang.String") private String[] prefixPKValues = new String[0]; - /** - * Primary key columns - */ - @Metadata(description = "Primary key columns. Multiple values can be separated by comma.", javaType = "java.lang.String", defaultValue = "KEY") + @Metadata(description = "Primary key columns. Multiple values can be separated by comma.", displayName = "Primary Key Columns", + javaType = "java.lang.String", defaultValue = "KEY") private String[] pkColumns = { "KEY" }; - /** - * Time to live in seconds used for inserts - */ - @Metadata(description = "Time to live in seconds used for inserts") + @Metadata(description = "Time to live in seconds used for inserts", displayName = "Time to Live") private Integer ttl; - /** - * Write consistency level - */ @Metadata(description = "Write consistency level", enums = "ANY,ONE,TWO,THREE,QUORUM,ALL,LOCAL_ONE,LOCAL_QUORUM,EACH_QUORUM,SERIAL,LOCAL_SERIAL") private ConsistencyLevel writeConsistencyLevel; - /** - * Read consistency level - */ @Metadata(description = "Read consistency level", enums = "ANY,ONE,TWO,THREE,QUORUM,ALL,LOCAL_ONE,LOCAL_QUORUM,EACH_QUORUM,SERIAL,LOCAL_SERIAL") private ConsistencyLevel readConsistencyLevel; + private PreparedStatement insertStatement; private PreparedStatement selectStatement; private PreparedStatement deleteStatement; diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java index 2710773fe448c..abda88763a99c 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java @@ -189,7 +189,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { o.setLabel(annotationValue(ai, "label")); o.setDefaultValue(annotationValue(ai, "defaultValue")); o.setRequired("true".equals(annotationValue(ai, "required"))); - String displayName = annotationValue(ai, "title"); + String displayName = annotationValue(ai, "displayName"); if (displayName == null) { displayName = Strings.asTitle(o.getName()); } From 7d263116eaae06e8e2aeaa935608d7ced2f24f1f Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 19 Mar 2024 07:44:55 +0100 Subject: [PATCH 26/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- ...ffeineAggregationRepositoryConfigurer.java | 79 +++++++++++ ...affeineIdempotentRepositoryConfigurer.java | 49 +++++++ .../services/org/apache/camel/bean.properties | 7 + .../bean/CaffeineAggregationRepository.json | 16 +++ .../bean/CaffeineIdempotentRepository.json | 16 +++ ...or.aggregate.CaffeineAggregationRepository | 2 + ...or.idempotent.CaffeineIdempotentRepository | 2 + .../CaffeineAggregationRepository.java | 22 ++- .../CaffeineIdempotentRepository.java | 22 ++- ...sandraAggregationRepositoryConfigurer.java | 127 ++++++++++++++++++ ...ssandraIdempotentRepositoryConfigurer.java | 4 +- .../services/org/apache/camel/bean.properties | 2 +- .../bean/CassandraAggregationRepository.json | 16 +++ ...e.cassandra.CassandraAggregationRepository | 2 + .../CassandraAggregationRepository.java | 95 ++++++------- ...hcacheAggregationRepositoryConfigurer.java | 85 ++++++++++++ ...EhcacheIdempotentRepositoryConfigurer.java | 49 +++++++ .../services/org/apache/camel/bean.properties | 7 + .../bean/EhcacheAggregationRepository.json | 16 +++ .../bean/EhcacheIdempotentRepository.json | 16 +++ ...sor.aggregate.EhcacheAggregationRepository | 2 + ...sor.idempotent.EhcacheIdempotentRepository | 2 + .../EhcacheAggregationRepository.java | 18 ++- .../EhcacheIdempotentRepository.java | 12 +- .../spi/RecoverableAggregationRepository.java | 15 ++- .../aggregate/AggregateProcessor.java | 2 +- 26 files changed, 612 insertions(+), 73 deletions(-) create mode 100644 components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepositoryConfigurer.java create mode 100644 components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepositoryConfigurer.java create mode 100644 components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json create mode 100644 components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineIdempotentRepository.json create mode 100644 components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository create mode 100644 components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepository create mode 100644 components/camel-cassandraql/src/generated/java/org/apache/camel/processor/aggregate/cassandra/CassandraAggregationRepositoryConfigurer.java create mode 100644 components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraAggregationRepository.json create mode 100644 components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository create mode 100644 components/camel-ehcache/src/generated/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepositoryConfigurer.java create mode 100644 components/camel-ehcache/src/generated/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepositoryConfigurer.java create mode 100644 components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json create mode 100644 components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheIdempotentRepository.json create mode 100644 components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository create mode 100644 components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepository diff --git a/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepositoryConfigurer.java b/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepositoryConfigurer.java new file mode 100644 index 0000000000000..2fff0ace02c19 --- /dev/null +++ b/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepositoryConfigurer.java @@ -0,0 +1,79 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.caffeine.processor.aggregate; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class CaffeineAggregationRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository target = (org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": target.setAllowSerializedHeaders(property(camelContext, boolean.class, value)); return true; + case "deadletterchannel": + case "DeadLetterChannel": target.setDeadLetterChannel(property(camelContext, java.lang.String.class, value)); return true; + case "deadletteruri": + case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true; + case "maximumredeliveries": + case "MaximumRedeliveries": target.setMaximumRedeliveries(property(camelContext, int.class, value)); return true; + case "recoveryinterval": + case "RecoveryInterval": target.setRecoveryInterval(property(camelContext, long.class, value)); return true; + case "userecovery": + case "UseRecovery": target.setUseRecovery(property(camelContext, boolean.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return boolean.class; + case "deadletterchannel": + case "DeadLetterChannel": return java.lang.String.class; + case "deadletteruri": + case "DeadLetterUri": return java.lang.String.class; + case "maximumredeliveries": + case "MaximumRedeliveries": return int.class; + case "recoveryinterval": + case "RecoveryInterval": return long.class; + case "userecovery": + case "UseRecovery": return boolean.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository target = (org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return target.isAllowSerializedHeaders(); + case "deadletterchannel": + case "DeadLetterChannel": return target.getDeadLetterChannel(); + case "deadletteruri": + case "DeadLetterUri": return target.getDeadLetterUri(); + case "maximumredeliveries": + case "MaximumRedeliveries": return target.getMaximumRedeliveries(); + case "recoveryinterval": + case "RecoveryInterval": return target.getRecoveryInterval(); + case "userecovery": + case "UseRecovery": return target.isUseRecovery(); + default: return null; + } + } +} + diff --git a/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepositoryConfigurer.java b/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepositoryConfigurer.java new file mode 100644 index 0000000000000..fe44c3d1e8ec5 --- /dev/null +++ b/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepositoryConfigurer.java @@ -0,0 +1,49 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.caffeine.processor.idempotent; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class CaffeineIdempotentRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepository target = (org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachename": + case "CacheName": target.setCacheName(property(camelContext, java.lang.String.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachename": + case "CacheName": return java.lang.String.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepository target = (org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachename": + case "CacheName": return target.getCacheName(); + default: return null; + } + } +} + diff --git a/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..a892ad7ec3f52 --- /dev/null +++ b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=CaffeineAggregationRepository CaffeineIdempotentRepository +groupId=org.apache.camel +artifactId=camel-caffeine +version=4.5.0-SNAPSHOT +projectName=Camel :: Caffeine +projectDescription=Camel Caffeine support diff --git a/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json new file mode 100644 index 0000000000000..f7dd7e102f330 --- /dev/null +++ b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "CaffeineAggregationRepository", + "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", + "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "title": "Caffeine Aggregation Repository", + "description": "Aggregation repository that uses Caffeine Cache to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-caffeine", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterChannel": { "index": 1, "kind": "property", "displayName": "Dead Letter Channel", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 2, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 3, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 4, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + diff --git a/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineIdempotentRepository.json b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineIdempotentRepository.json new file mode 100644 index 0000000000000..dfc7548e40084 --- /dev/null +++ b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "CaffeineIdempotentRepository", + "javaType": "org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Caffeine Idempotent Repository", + "description": "Idempotent repository that uses Caffiene cache to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-caffeine", + "version": "4.5.0-SNAPSHOT", + "properties": { "cacheName": { "index": 0, "kind": "property", "displayName": "Cache Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CaffeineIdempotentRepository", "description": "Name of cache" } } + } +} + diff --git a/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository new file mode 100644 index 0000000000000..31b85d9553110 --- /dev/null +++ b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepositoryConfigurer diff --git a/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepository b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepository new file mode 100644 index 0000000000000..030456f2470f2 --- /dev/null +++ b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepositoryConfigurer diff --git a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java index 23cca1b55ac97..f96f0a04ad2ca 100644 --- a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java +++ b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java @@ -24,6 +24,9 @@ import com.github.benmanes.caffeine.cache.Caffeine; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; +import org.apache.camel.api.management.ManagedResource; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; import org.apache.camel.spi.RecoverableAggregationRepository; import org.apache.camel.support.DefaultExchange; import org.apache.camel.support.DefaultExchangeHolder; @@ -31,17 +34,28 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Metadata(label = "bean", + description = "Aggregation repository that uses Caffeine Cache to store exchanges.", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) +@Configurer(metadataOnly = true) +@ManagedResource(description = "Caffeine based aggregation repository") public class CaffeineAggregationRepository extends ServiceSupport implements RecoverableAggregationRepository { private static final Logger LOG = LoggerFactory.getLogger(CaffeineAggregationRepository.class); private CamelContext camelContext; private Cache cache; - private boolean allowSerializedHeaders; + @Metadata(label = "advanced", description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") + private boolean allowSerializedHeaders; + @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; + @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") private String deadLetterChannel; + @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; + @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." + + " When this limit is hit, then the Exchange is moved to the dead letter channel.", defaultValue = "3") private int maximumRedeliveries = 3; public CamelContext getCamelContext() { @@ -100,11 +114,6 @@ public long getRecoveryInterval() { return recoveryInterval; } - @Override - public long getRecoveryIntervalInMillis() { - return recoveryInterval; - } - @Override public void setRecoveryInterval(long recoveryInterval) { this.recoveryInterval = recoveryInterval; @@ -192,6 +201,7 @@ protected void doStart() throws Exception { @Override protected void doStop() throws Exception { + // noop } public static Exchange unmarshallExchange(CamelContext camelContext, DefaultExchangeHolder holder) { diff --git a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java index 0b21eaa698bdc..b98e1751ad7ee 100644 --- a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java +++ b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java @@ -21,15 +21,22 @@ import org.apache.camel.api.management.ManagedAttribute; import org.apache.camel.api.management.ManagedOperation; import org.apache.camel.api.management.ManagedResource; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.IdempotentRepository; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.service.ServiceSupport; +@Metadata(label = "bean", + description = "Idempotent repository that uses Caffiene cache to store message ids.") +@Configurer(metadataOnly = true) @ManagedResource(description = "Caffeine based message id repository") public class CaffeineIdempotentRepository extends ServiceSupport implements IdempotentRepository { - private String cacheName; private Cache cache; + @Metadata(description = "Name of cache", defaultValue = "CaffeineIdempotentRepository") + private String cacheName; + public CaffeineIdempotentRepository() { this(CaffeineIdempotentRepository.class.getSimpleName()); } @@ -38,6 +45,10 @@ public CaffeineIdempotentRepository(String repositoryName) { this.cacheName = repositoryName; } + public void setCacheName(String cacheName) { + this.cacheName = cacheName; + } + @ManagedAttribute(description = "The processor name") public String getCacheName() { return cacheName; @@ -86,11 +97,12 @@ protected void doStart() throws Exception { } } - protected Cache getCache() { - return this.cache; - } - @Override protected void doStop() throws Exception { + // noop + } + + protected Cache getCache() { + return this.cache; } } diff --git a/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/aggregate/cassandra/CassandraAggregationRepositoryConfigurer.java b/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/aggregate/cassandra/CassandraAggregationRepositoryConfigurer.java new file mode 100644 index 0000000000000..ffe91b8bb7617 --- /dev/null +++ b/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/aggregate/cassandra/CassandraAggregationRepositoryConfigurer.java @@ -0,0 +1,127 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.aggregate.cassandra; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class CassandraAggregationRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository target = (org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": target.setAllowSerializedHeaders(property(camelContext, boolean.class, value)); return true; + case "deadletteruri": + case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true; + case "exchangecolumn": + case "ExchangeColumn": target.setExchangeColumn(property(camelContext, java.lang.String.class, value)); return true; + case "exchangeidcolumn": + case "ExchangeIdColumn": target.setExchangeIdColumn(property(camelContext, java.lang.String.class, value)); return true; + case "maximumredeliveries": + case "MaximumRedeliveries": target.setMaximumRedeliveries(property(camelContext, int.class, value)); return true; + case "pkcolumns": + case "PKColumns": target.setPKColumns(property(camelContext, java.lang.String[].class, value)); return true; + case "prefixpkvalues": + case "PrefixPKValues": target.setPrefixPKValues(property(camelContext, java.lang.Object[].class, value)); return true; + case "readconsistencylevel": + case "ReadConsistencyLevel": target.setReadConsistencyLevel(property(camelContext, com.datastax.oss.driver.api.core.ConsistencyLevel.class, value)); return true; + case "recoveryinterval": + case "RecoveryInterval": target.setRecoveryInterval(property(camelContext, long.class, value)); return true; + case "session": + case "Session": target.setSession(property(camelContext, com.datastax.oss.driver.api.core.CqlSession.class, value)); return true; + case "table": + case "Table": target.setTable(property(camelContext, java.lang.String.class, value)); return true; + case "ttl": + case "Ttl": target.setTtl(property(camelContext, java.lang.Integer.class, value)); return true; + case "userecovery": + case "UseRecovery": target.setUseRecovery(property(camelContext, boolean.class, value)); return true; + case "writeconsistencylevel": + case "WriteConsistencyLevel": target.setWriteConsistencyLevel(property(camelContext, com.datastax.oss.driver.api.core.ConsistencyLevel.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return boolean.class; + case "deadletteruri": + case "DeadLetterUri": return java.lang.String.class; + case "exchangecolumn": + case "ExchangeColumn": return java.lang.String.class; + case "exchangeidcolumn": + case "ExchangeIdColumn": return java.lang.String.class; + case "maximumredeliveries": + case "MaximumRedeliveries": return int.class; + case "pkcolumns": + case "PKColumns": return java.lang.String[].class; + case "prefixpkvalues": + case "PrefixPKValues": return java.lang.Object[].class; + case "readconsistencylevel": + case "ReadConsistencyLevel": return com.datastax.oss.driver.api.core.ConsistencyLevel.class; + case "recoveryinterval": + case "RecoveryInterval": return long.class; + case "session": + case "Session": return com.datastax.oss.driver.api.core.CqlSession.class; + case "table": + case "Table": return java.lang.String.class; + case "ttl": + case "Ttl": return java.lang.Integer.class; + case "userecovery": + case "UseRecovery": return boolean.class; + case "writeconsistencylevel": + case "WriteConsistencyLevel": return com.datastax.oss.driver.api.core.ConsistencyLevel.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository target = (org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return target.isAllowSerializedHeaders(); + case "deadletteruri": + case "DeadLetterUri": return target.getDeadLetterUri(); + case "exchangecolumn": + case "ExchangeColumn": return target.getExchangeColumn(); + case "exchangeidcolumn": + case "ExchangeIdColumn": return target.getExchangeIdColumn(); + case "maximumredeliveries": + case "MaximumRedeliveries": return target.getMaximumRedeliveries(); + case "pkcolumns": + case "PKColumns": return target.getPKColumns(); + case "prefixpkvalues": + case "PrefixPKValues": return target.getPrefixPKValues(); + case "readconsistencylevel": + case "ReadConsistencyLevel": return target.getReadConsistencyLevel(); + case "recoveryinterval": + case "RecoveryInterval": return target.getRecoveryInterval(); + case "session": + case "Session": return target.getSession(); + case "table": + case "Table": return target.getTable(); + case "ttl": + case "Ttl": return target.getTtl(); + case "userecovery": + case "UseRecovery": return target.isUseRecovery(); + case "writeconsistencylevel": + case "WriteConsistencyLevel": return target.getWriteConsistencyLevel(); + default: return null; + } + } +} + diff --git a/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java b/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java index a775cce13b56c..96bc8b2f7602f 100644 --- a/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java +++ b/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java @@ -22,7 +22,7 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository target = (org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository) obj; switch (ignoreCase ? name.toLowerCase() : name) { case "pkcolumns": - case "PKColumns": target.setPKColumns(property(camelContext, java.lang.String.class, value)); return true; + case "PKColumns": target.setPKColumns(property(camelContext, java.lang.String[].class, value)); return true; case "prefixpkvalues": case "PrefixPKValues": target.setPrefixPKValues(property(camelContext, java.lang.String[].class, value)); return true; case "readconsistencylevel": @@ -43,7 +43,7 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj public Class getOptionType(String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { case "pkcolumns": - case "PKColumns": return java.lang.String.class; + case "PKColumns": return java.lang.String[].class; case "prefixpkvalues": case "PrefixPKValues": return java.lang.String[].class; case "readconsistencylevel": diff --git a/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties index 17ccc237c6737..da91b64f53b72 100644 --- a/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties +++ b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -1,5 +1,5 @@ # Generated by camel build tools - do NOT edit this file! -bean=CassandraIdempotentRepository +bean=CassandraAggregationRepository CassandraIdempotentRepository groupId=org.apache.camel artifactId=camel-cassandraql version=4.5.0-SNAPSHOT diff --git a/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraAggregationRepository.json b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraAggregationRepository.json new file mode 100644 index 0000000000000..bd9516e9eb5ed --- /dev/null +++ b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "CassandraAggregationRepository", + "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", + "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "title": "Cassandra Aggregation Repository", + "description": "Aggregation repository that uses Cassandra table to store exchanges. Advice: use LeveledCompaction for this table and tune read\/write consistency levels.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-cassandraql", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "exchangeColumn": { "index": 2, "kind": "property", "displayName": "Exchange Column", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "EXCHANGE", "description": "Column name for Exchange" }, "exchangeIdColumn": { "index": 3, "kind": "property", "displayName": "Exchange Id Column", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "EXCHANGE_ID", "description": "Column name for Exchange ID" }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "pkColumns": { "index": 5, "kind": "property", "displayName": "Primary Key Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "prefixPKValues": { "index": 6, "kind": "property", "displayName": "Prefix Primary Key Values", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "readConsistencyLevel": { "index": 7, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" }, "recoveryInterval": { "index": 8, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "sessionHolder": { "index": 9, "kind": "property", "displayName": "Session Holder", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 10, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_AGGREGATION", "description": "The table name for storing the data" }, "ttl": { "index": 11, "kind": "property", "displayName": "Time to Live", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "useRecovery": { "index": 12, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "writeConsistencyLevel": { "index": 13, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" } } + } +} + diff --git a/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository new file mode 100644 index 0000000000000..c136547de654b --- /dev/null +++ b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepositoryConfigurer diff --git a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/CassandraAggregationRepository.java b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/CassandraAggregationRepository.java index b64653a96f1f7..5ba5f34bd2c94 100644 --- a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/CassandraAggregationRepository.java +++ b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/CassandraAggregationRepository.java @@ -34,6 +34,8 @@ import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.spi.AggregationRepository; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; import org.apache.camel.spi.RecoverableAggregationRepository; import org.apache.camel.support.service.ServiceSupport; import org.apache.camel.utils.cassandra.CassandraSessionHolder; @@ -53,50 +55,36 @@ * LeveledCompaction for this table and tune read/write consistency levels. Warning: Cassandra is not the best tool for * queuing use cases See: http://www.datastax.com/dev/blog/cassandra-anti-patterns-queues-and-queue-like-datasets */ +@Metadata(label = "bean", + description = "Aggregation repository that uses Cassandra table to store exchanges." + + " Advice: use LeveledCompaction for this table and tune read/write consistency levels.", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) +@Configurer(metadataOnly = true) public class CassandraAggregationRepository extends ServiceSupport implements RecoverableAggregationRepository { - /** - * Logger - */ + private static final Logger LOGGER = LoggerFactory.getLogger(CassandraAggregationRepository.class); - /** - * Session holder - */ + + private final CassandraCamelCodec exchangeCodec = new CassandraCamelCodec(); + + @Metadata(description = "Cassandra session", required = true) private CassandraSessionHolder sessionHolder; - /** - * Table name - */ + @Metadata(description = "The table name for storing the data", defaultValue = "CAMEL_AGGREGATION") private String table = "CAMEL_AGGREGATION"; - /** - * Exchange Id column name - */ + @Metadata(description = "Column name for Exchange ID", defaultValue = "EXCHANGE_ID") private String exchangeIdColumn = "EXCHANGE_ID"; - /** - * Exchange column name - */ + @Metadata(description = "Column name for Exchange", defaultValue = "EXCHANGE") private String exchangeColumn = "EXCHANGE"; - /** - * Values used as primary key prefix - */ + @Metadata(description = "Values used as primary key prefix. Multiple values can be separated by comma.", displayName = + "Prefix Primary Key Values", javaType = "java.lang.String") private Object[] prefixPKValues = new Object[0]; - /** - * Primary key columns - */ - private String[] pkColumns = { "KEY" }; - /** - * Exchange marshaller/unmarshaller - */ - private final CassandraCamelCodec exchangeCodec = new CassandraCamelCodec(); - /** - * Time to live in seconds used for inserts - */ + @Metadata(description = "Primary key columns. Multiple values can be separated by comma.", displayName = "Primary Key Columns", + javaType = "java.lang.String", defaultValue = "KEY") + private String[] pkColumns = {"KEY"}; + @Metadata(description = "Time to live in seconds used for inserts", displayName = "Time to Live") private Integer ttl; - /** - * Writeconsistency level - */ + @Metadata(description = "Write consistency level", enums = "ANY,ONE,TWO,THREE,QUORUM,ALL,LOCAL_ONE,LOCAL_QUORUM,EACH_QUORUM,SERIAL,LOCAL_SERIAL") private ConsistencyLevel writeConsistencyLevel; - /** - * Read consistency level - */ + @Metadata(description = "Read consistency level", enums = "ANY,ONE,TWO,THREE,QUORUM,ALL,LOCAL_ONE,LOCAL_QUORUM,EACH_QUORUM,SERIAL,LOCAL_SERIAL") private ConsistencyLevel readConsistencyLevel; private PreparedStatement insertStatement; @@ -111,14 +99,16 @@ public class CassandraAggregationRepository extends ServiceSupport implements Re */ private PreparedStatement deleteIfIdStatement; - private long recoveryIntervalInMillis = 5000; - + @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") + private long recoveryInterval = 5000; + @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; - + @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") private String deadLetterUri; - + @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." + + " When this limit is hit, then the Exchange is moved to the dead letter channel.") private int maximumRedeliveries; - + @Metadata(label = "advanced", description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") private boolean allowSerializedHeaders; /** @@ -190,7 +180,7 @@ public Exchange add(CamelContext camelContext, String key, Exchange exchange) { LOGGER.debug("Inserting key {} exchange {}", idValues, exchange); try { ByteBuffer marshalledExchange = exchangeCodec.marshallExchange(exchange, allowSerializedHeaders); - Object[] cqlParams = concat(idValues, new Object[] { exchange.getExchangeId(), marshalledExchange }); + Object[] cqlParams = concat(idValues, new Object[]{exchange.getExchangeId(), marshalledExchange}); getSession().execute(insertStatement.bind(cqlParams)); return exchange; } catch (IOException iOException) { @@ -280,15 +270,15 @@ public void remove(CamelContext camelContext, String key, Exchange exchange) { // ------------------------------------------------------------------------- private void initSelectKeyIdStatement() { - Select select = generateSelect(table, new String[] { getKeyColumn(), exchangeIdColumn }, // Key + Select select = generateSelect(table, new String[]{getKeyColumn(), exchangeIdColumn}, // Key // + // Exchange // Id // columns pkColumns, pkColumns.length - 1); // Where - // fixed - // PK - // columns + // fixed + // PK + // columns SimpleStatement statement = applyConsistencyLevel(select.build(), readConsistencyLevel); LOGGER.debug("Generated Select keys {}", statement); selectKeyIdStatement = getSession().prepare(statement); @@ -421,23 +411,18 @@ public void setTtl(Integer ttl) { this.ttl = ttl; } - @Override - public long getRecoveryIntervalInMillis() { - return recoveryIntervalInMillis; - } - - public void setRecoveryIntervalInMillis(long recoveryIntervalInMillis) { - this.recoveryIntervalInMillis = recoveryIntervalInMillis; + public long getRecoveryInterval() { + return recoveryInterval; } @Override public void setRecoveryInterval(long interval, TimeUnit timeUnit) { - this.recoveryIntervalInMillis = timeUnit.toMillis(interval); + this.recoveryInterval = timeUnit.toMillis(interval); } @Override - public void setRecoveryInterval(long recoveryIntervalInMillis) { - this.recoveryIntervalInMillis = recoveryIntervalInMillis; + public void setRecoveryInterval(long recoveryInterval) { + this.recoveryInterval = recoveryInterval; } @Override diff --git a/components/camel-ehcache/src/generated/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepositoryConfigurer.java b/components/camel-ehcache/src/generated/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepositoryConfigurer.java new file mode 100644 index 0000000000000..014bafed98309 --- /dev/null +++ b/components/camel-ehcache/src/generated/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepositoryConfigurer.java @@ -0,0 +1,85 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.ehcache.processor.aggregate; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class EhcacheAggregationRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository target = (org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": target.setAllowSerializedHeaders(property(camelContext, boolean.class, value)); return true; + case "cachename": + case "CacheName": target.setCacheName(property(camelContext, java.lang.String.class, value)); return true; + case "deadletterchannel": + case "DeadLetterChannel": target.setDeadLetterChannel(property(camelContext, java.lang.String.class, value)); return true; + case "deadletteruri": + case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true; + case "maximumredeliveries": + case "MaximumRedeliveries": target.setMaximumRedeliveries(property(camelContext, int.class, value)); return true; + case "recoveryinterval": + case "RecoveryInterval": target.setRecoveryInterval(property(camelContext, long.class, value)); return true; + case "userecovery": + case "UseRecovery": target.setUseRecovery(property(camelContext, boolean.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return boolean.class; + case "cachename": + case "CacheName": return java.lang.String.class; + case "deadletterchannel": + case "DeadLetterChannel": return java.lang.String.class; + case "deadletteruri": + case "DeadLetterUri": return java.lang.String.class; + case "maximumredeliveries": + case "MaximumRedeliveries": return int.class; + case "recoveryinterval": + case "RecoveryInterval": return long.class; + case "userecovery": + case "UseRecovery": return boolean.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository target = (org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return target.isAllowSerializedHeaders(); + case "cachename": + case "CacheName": return target.getCacheName(); + case "deadletterchannel": + case "DeadLetterChannel": return target.getDeadLetterChannel(); + case "deadletteruri": + case "DeadLetterUri": return target.getDeadLetterUri(); + case "maximumredeliveries": + case "MaximumRedeliveries": return target.getMaximumRedeliveries(); + case "recoveryinterval": + case "RecoveryInterval": return target.getRecoveryInterval(); + case "userecovery": + case "UseRecovery": return target.isUseRecovery(); + default: return null; + } + } +} + diff --git a/components/camel-ehcache/src/generated/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepositoryConfigurer.java b/components/camel-ehcache/src/generated/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepositoryConfigurer.java new file mode 100644 index 0000000000000..62d363285a229 --- /dev/null +++ b/components/camel-ehcache/src/generated/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepositoryConfigurer.java @@ -0,0 +1,49 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.ehcache.processor.idempotent; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class EhcacheIdempotentRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepository target = (org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachename": + case "CacheName": target.setCacheName(property(camelContext, java.lang.String.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachename": + case "CacheName": return java.lang.String.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepository target = (org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachename": + case "CacheName": return target.getCacheName(); + default: return null; + } + } +} + diff --git a/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..52e8fc1c7caf7 --- /dev/null +++ b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=EhcacheAggregationRepository EhcacheIdempotentRepository +groupId=org.apache.camel +artifactId=camel-ehcache +version=4.5.0-SNAPSHOT +projectName=Camel :: Ehcache +projectDescription=Camel Ehcache support diff --git a/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json new file mode 100644 index 0000000000000..aae8ce1f6e2ee --- /dev/null +++ b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "EhcacheAggregationRepository", + "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", + "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "title": "Ehcache Aggregation Repository", + "description": "Aggregation repository that uses Caffeine Cache to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-ehcache", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "deadLetterChannel": { "index": 2, "kind": "property", "displayName": "Dead Letter Channel", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 3, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 5, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + diff --git a/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheIdempotentRepository.json b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheIdempotentRepository.json new file mode 100644 index 0000000000000..8cc0d72975663 --- /dev/null +++ b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "EhcacheIdempotentRepository", + "javaType": "org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Ehcache Idempotent Repository", + "description": "Idempotent repository that uses EHCache cache to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-ehcache", + "version": "4.5.0-SNAPSHOT", + "properties": { "cacheName": { "index": 0, "kind": "property", "displayName": "Cache Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "EhcacheIdempotentRepository", "description": "Name of cache" } } + } +} + diff --git a/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository new file mode 100644 index 0000000000000..6adb8bb4e53bd --- /dev/null +++ b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepositoryConfigurer diff --git a/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepository b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepository new file mode 100644 index 0000000000000..b4f6f23adf807 --- /dev/null +++ b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepositoryConfigurer diff --git a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepository.java b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepository.java index 81e9a47cdeceb..ffe7e2ae0def4 100644 --- a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepository.java +++ b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepository.java @@ -23,6 +23,9 @@ import org.apache.camel.CamelContext; import org.apache.camel.Exchange; +import org.apache.camel.api.management.ManagedResource; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; import org.apache.camel.spi.RecoverableAggregationRepository; import org.apache.camel.support.DefaultExchange; import org.apache.camel.support.DefaultExchangeHolder; @@ -33,19 +36,31 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Metadata(label = "bean", + description = "Aggregation repository that uses Caffeine Cache to store exchanges.", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) +@Configurer(metadataOnly = true) +@ManagedResource(description = "EHCache based aggregation repository") public class EhcacheAggregationRepository extends ServiceSupport implements RecoverableAggregationRepository { private static final Logger LOG = LoggerFactory.getLogger(EhcacheAggregationRepository.class); private CamelContext camelContext; private CacheManager cacheManager; + @Metadata(description = "Name of cache", required = true) private String cacheName; private Cache cache; - private boolean allowSerializedHeaders; + @Metadata(label = "advanced", description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") + private boolean allowSerializedHeaders; + @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; + @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") private String deadLetterChannel; + @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; + @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." + + " When this limit is hit, then the Exchange is moved to the dead letter channel.", defaultValue = "3") private int maximumRedeliveries = 3; public CamelContext getCamelContext() { @@ -213,6 +228,7 @@ protected void doStart() throws Exception { @Override protected void doStop() throws Exception { + // noop } public static Exchange unmarshallExchange(CamelContext camelContext, DefaultExchangeHolder holder) { diff --git a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java index 2606374905a3e..af36fb9676d61 100644 --- a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java +++ b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java @@ -20,14 +20,20 @@ import org.apache.camel.api.management.ManagedOperation; import org.apache.camel.api.management.ManagedResource; import org.apache.camel.component.ehcache.EhcacheManager; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.IdempotentRepository; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.service.ServiceSupport; import org.ehcache.Cache; import org.ehcache.CacheManager; -@ManagedResource(description = "Ehcache based message id repository") +@Metadata(label = "bean", + description = "Idempotent repository that uses EHCache cache to store message ids.") +@Configurer(metadataOnly = true) +@ManagedResource(description = "EHCache based message id repository") public class EhcacheIdempotentRepository extends ServiceSupport implements IdempotentRepository { + @Metadata(description = "Name of cache", defaultValue = "EhcacheIdempotentRepository") private String cacheName; private Cache cache; private EhcacheManager cacheManager; @@ -41,6 +47,10 @@ public EhcacheIdempotentRepository(CacheManager cacheManager, String repositoryN this.cacheManager = new EhcacheManager(cacheManager, false, null); } + public void setCacheName(String cacheName) { + this.cacheName = cacheName; + } + @ManagedAttribute(description = "The processor name") public String getCacheName() { return cacheName; diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/RecoverableAggregationRepository.java b/core/camel-api/src/main/java/org/apache/camel/spi/RecoverableAggregationRepository.java index a16093fde6cc4..bf62a801fb018 100644 --- a/core/camel-api/src/main/java/org/apache/camel/spi/RecoverableAggregationRepository.java +++ b/core/camel-api/src/main/java/org/apache/camel/spi/RecoverableAggregationRepository.java @@ -50,7 +50,9 @@ public interface RecoverableAggregationRepository extends AggregationRepository * * @param interval the interval * @param timeUnit the time unit + * @deprecated use setRecoveryInterval */ + @Deprecated void setRecoveryInterval(long interval, TimeUnit timeUnit); /** @@ -65,7 +67,18 @@ public interface RecoverableAggregationRepository extends AggregationRepository * * @return the interval in millis */ - long getRecoveryIntervalInMillis(); + long getRecoveryInterval(); + + /** + * Gets the interval between recovery scans in millis. + * + * @return the interval in millis + * @deprecated use getRecoveryInterval + */ + @Deprecated + default long getRecoveryIntervalInMillis() { + return getRecoveryInterval(); + } /** * Sets whether or not recovery is enabled diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java index a460afa27b81d..30a9ea84112a1 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java @@ -1554,7 +1554,7 @@ && getCompletionSizeExpression() == null) { if (isRecoverableRepository()) { RecoverableAggregationRepository recoverable = (RecoverableAggregationRepository) aggregationRepository; if (recoverable.isUseRecovery()) { - long interval = recoverable.getRecoveryIntervalInMillis(); + long interval = recoverable.getRecoveryInterval(); if (interval <= 0) { throw new IllegalArgumentException( "AggregationRepository has recovery enabled and the RecoveryInterval option must be a positive number, was: " From e65f4e622a79c0b8b9f3103f762046a0f96feb4f Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 19 Mar 2024 09:12:03 +0100 Subject: [PATCH 27/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../Etcd3AggregationRepositoryConfigurer.java | 91 +++++++++++++++++++ .../services/org/apache/camel/bean.properties | 7 ++ .../bean/Etcd3AggregationRepository.json | 16 ++++ ...essor.aggregate.Etcd3AggregationRepository | 2 + .../aggregate/Etcd3AggregationRepository.java | 32 +++++-- ...elcastAggregationRepositoryConfigurer.java | 79 ++++++++++++++++ ...zelcastIdempotentRepositoryConfigurer.java | 35 +++++++ .../services/org/apache/camel/bean.properties | 7 ++ .../bean/HazelcastAggregationRepository.json | 16 ++++ .../bean/HazelcastIdempotentRepository.json | 16 ++++ ...e.hazelcast.HazelcastAggregationRepository | 2 + ...nt.hazelcast.HazelcastIdempotentRepository | 2 + .../HazelcastAggregationRepository.java | 80 ++++++++++------ ...licatedHazelcastAggregationRepository.java | 16 ++-- .../HazelcastIdempotentRepository.java | 31 ++++++- ...AggregationRepositoryConstructorsTest.java | 9 -- 16 files changed, 386 insertions(+), 55 deletions(-) create mode 100644 components/camel-etcd3/src/generated/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepositoryConfigurer.java create mode 100644 components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json create mode 100644 components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository create mode 100644 components/camel-hazelcast/src/generated/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepositoryConfigurer.java create mode 100644 components/camel-hazelcast/src/generated/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepositoryConfigurer.java create mode 100644 components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json create mode 100644 components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastIdempotentRepository.json create mode 100644 components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository create mode 100644 components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository diff --git a/components/camel-etcd3/src/generated/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepositoryConfigurer.java b/components/camel-etcd3/src/generated/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepositoryConfigurer.java new file mode 100644 index 0000000000000..121293342aa89 --- /dev/null +++ b/components/camel-etcd3/src/generated/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepositoryConfigurer.java @@ -0,0 +1,91 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.etcd3.processor.aggregate; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class Etcd3AggregationRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository target = (org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": target.setAllowSerializedHeaders(property(camelContext, boolean.class, value)); return true; + case "deadletteruri": + case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true; + case "endpoint": + case "Endpoint": target.setEndpoint(property(camelContext, java.lang.String.class, value)); return true; + case "maximumredeliveries": + case "MaximumRedeliveries": target.setMaximumRedeliveries(property(camelContext, int.class, value)); return true; + case "optimistic": + case "Optimistic": target.setOptimistic(property(camelContext, boolean.class, value)); return true; + case "prefixname": + case "PrefixName": target.setPrefixName(property(camelContext, java.lang.String.class, value)); return true; + case "recoveryinterval": + case "RecoveryInterval": target.setRecoveryInterval(property(camelContext, long.class, value)); return true; + case "userecovery": + case "UseRecovery": target.setUseRecovery(property(camelContext, boolean.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return boolean.class; + case "deadletteruri": + case "DeadLetterUri": return java.lang.String.class; + case "endpoint": + case "Endpoint": return java.lang.String.class; + case "maximumredeliveries": + case "MaximumRedeliveries": return int.class; + case "optimistic": + case "Optimistic": return boolean.class; + case "prefixname": + case "PrefixName": return java.lang.String.class; + case "recoveryinterval": + case "RecoveryInterval": return long.class; + case "userecovery": + case "UseRecovery": return boolean.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository target = (org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return target.isAllowSerializedHeaders(); + case "deadletteruri": + case "DeadLetterUri": return target.getDeadLetterUri(); + case "endpoint": + case "Endpoint": return target.getEndpoint(); + case "maximumredeliveries": + case "MaximumRedeliveries": return target.getMaximumRedeliveries(); + case "optimistic": + case "Optimistic": return target.isOptimistic(); + case "prefixname": + case "PrefixName": return target.getPrefixName(); + case "recoveryinterval": + case "RecoveryInterval": return target.getRecoveryInterval(); + case "userecovery": + case "UseRecovery": return target.isUseRecovery(); + default: return null; + } + } +} + diff --git a/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..546b01b42d29a --- /dev/null +++ b/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=Etcd3AggregationRepository +groupId=org.apache.camel +artifactId=camel-etcd3 +version=4.5.0-SNAPSHOT +projectName=Camel :: Etcd3 +projectDescription=Camel EtcD v3 component based on jetcd diff --git a/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json b/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json new file mode 100644 index 0000000000000..c5bb9368b5b77 --- /dev/null +++ b/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "Etcd3AggregationRepository", + "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", + "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "title": "Etcd3 Aggregation Repository", + "description": "Aggregation repository that uses Etcd3 to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-etcd3", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterChannel": { "index": 1, "kind": "property", "displayName": "Dead Letter Channel", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "endpoint": { "index": 2, "kind": "property", "displayName": "Endpoint", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "URL to Etcd3 service" }, "maximumRedeliveries": { "index": 3, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "optimistic": { "index": 4, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether or not to use optimistic locking" }, "persistencePrefixName": { "index": 5, "kind": "property", "displayName": "Persistence Prefix Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key for completed exchanges" }, "prefixName": { "index": 6, "kind": "property", "displayName": "Prefix Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key" }, "recoveryInterval": { "index": 7, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 8, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + diff --git a/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository b/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository new file mode 100644 index 0000000000000..e56a8e3dd2b01 --- /dev/null +++ b/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepositoryConfigurer diff --git a/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java b/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java index 83a3e661fd8cf..d163c730b1951 100644 --- a/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java +++ b/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java @@ -47,6 +47,8 @@ import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.RuntimeCamelException; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; import org.apache.camel.spi.OptimisticLockingAggregationRepository; import org.apache.camel.spi.RecoverableAggregationRepository; import org.apache.camel.support.DefaultExchange; @@ -56,22 +58,36 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Metadata(label = "bean", + description = "Aggregation repository that uses Etcd3 to store exchanges.", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) +@Configurer(metadataOnly = true) public class Etcd3AggregationRepository extends ServiceSupport implements RecoverableAggregationRepository, OptimisticLockingAggregationRepository { private static final Logger LOG = LoggerFactory.getLogger(Etcd3AggregationRepository.class); private static final String COMPLETED_SUFFIX = "-completed"; - private boolean optimistic; - private boolean useRecovery = true; + @Metadata(description = "URL to Etcd3 service", required = true) private String endpoint; private Client client; private boolean shutdownClient; private KV kvClient; + @Metadata(description = "Prefix to use as primary key", required = true) private String prefixName; + @Metadata(label = "advanced", description = "Prefix to use as primary key for completed exchanges") private String persistencePrefixName; + @Metadata(description = "Whether or not to use optimistic locking") + private boolean optimistic; + @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") + private boolean useRecovery = true; + @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") private String deadLetterChannel; + @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; + @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." + + " When this limit is hit, then the Exchange is moved to the dead letter channel.", defaultValue = "3") private int maximumRedeliveries = 3; + @Metadata(label = "advanced", description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") private boolean allowSerializedHeaders; public Etcd3AggregationRepository() { @@ -254,13 +270,13 @@ public void setRecoveryInterval(long interval, TimeUnit timeUnit) { } @Override - public void setRecoveryInterval(long interval) { - this.recoveryInterval = interval; + public long getRecoveryInterval() { + return recoveryInterval; } @Override - public long getRecoveryIntervalInMillis() { - return recoveryInterval; + public void setRecoveryInterval(long interval) { + this.recoveryInterval = interval; } @Override @@ -516,7 +532,9 @@ protected void doInit() throws Exception { if (recoveryInterval < 0) { throw new IllegalArgumentException("Recovery interval must be zero or a positive integer."); } - + if (persistencePrefixName == null && prefixName != null) { + this.persistencePrefixName = String.format("%s%s", prefixName, COMPLETED_SUFFIX); + } } @Override diff --git a/components/camel-hazelcast/src/generated/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepositoryConfigurer.java b/components/camel-hazelcast/src/generated/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepositoryConfigurer.java new file mode 100644 index 0000000000000..e4c7678f4a916 --- /dev/null +++ b/components/camel-hazelcast/src/generated/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepositoryConfigurer.java @@ -0,0 +1,79 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.aggregate.hazelcast; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class HazelcastAggregationRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository target = (org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": target.setAllowSerializedHeaders(property(camelContext, boolean.class, value)); return true; + case "deadletteruri": + case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true; + case "hazelcastinstance": + case "HazelcastInstance": target.setHazelcastInstance(property(camelContext, com.hazelcast.core.HazelcastInstance.class, value)); return true; + case "maximumredeliveries": + case "MaximumRedeliveries": target.setMaximumRedeliveries(property(camelContext, int.class, value)); return true; + case "recoveryinterval": + case "RecoveryInterval": target.setRecoveryInterval(property(camelContext, long.class, value)); return true; + case "userecovery": + case "UseRecovery": target.setUseRecovery(property(camelContext, boolean.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return boolean.class; + case "deadletteruri": + case "DeadLetterUri": return java.lang.String.class; + case "hazelcastinstance": + case "HazelcastInstance": return com.hazelcast.core.HazelcastInstance.class; + case "maximumredeliveries": + case "MaximumRedeliveries": return int.class; + case "recoveryinterval": + case "RecoveryInterval": return long.class; + case "userecovery": + case "UseRecovery": return boolean.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository target = (org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return target.isAllowSerializedHeaders(); + case "deadletteruri": + case "DeadLetterUri": return target.getDeadLetterUri(); + case "hazelcastinstance": + case "HazelcastInstance": return target.getHazelcastInstance(); + case "maximumredeliveries": + case "MaximumRedeliveries": return target.getMaximumRedeliveries(); + case "recoveryinterval": + case "RecoveryInterval": return target.getRecoveryInterval(); + case "userecovery": + case "UseRecovery": return target.isUseRecovery(); + default: return null; + } + } +} + diff --git a/components/camel-hazelcast/src/generated/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepositoryConfigurer.java b/components/camel-hazelcast/src/generated/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepositoryConfigurer.java new file mode 100644 index 0000000000000..1e8a95cd297d1 --- /dev/null +++ b/components/camel-hazelcast/src/generated/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepositoryConfigurer.java @@ -0,0 +1,35 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.idempotent.hazelcast; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class HazelcastIdempotentRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + return false; + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + return null; + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + return null; + } +} + diff --git a/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..15b552fe87b6d --- /dev/null +++ b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=HazelcastAggregationRepository HazelcastIdempotentRepository +groupId=org.apache.camel +artifactId=camel-hazelcast +version=4.5.0-SNAPSHOT +projectName=Camel :: HazelCast +projectDescription=Camel HazelCast based work queue implementation diff --git a/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json new file mode 100644 index 0000000000000..272e472166cca --- /dev/null +++ b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "HazelcastAggregationRepository", + "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", + "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "title": "Hazelcast Aggregation Repository", + "description": "Aggregation repository that uses Hazelcast Cache to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-hazelcast", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterChannel": { "index": 1, "kind": "property", "displayName": "Dead Letter Channel", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "hazelcastInstance": { "index": 2, "kind": "property", "displayName": "Hazelcast Instance", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use an existing Hazelcast instance instead of local" }, "mapName": { "index": 3, "kind": "property", "displayName": "Map Name", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use" }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "optimistic": { "index": 5, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" }, "persistenceMapName": { "index": 6, "kind": "property", "displayName": "Persistence Map Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use for completed exchanges" }, "recoveryInterval": { "index": 7, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 8, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + diff --git a/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastIdempotentRepository.json b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastIdempotentRepository.json new file mode 100644 index 0000000000000..3e412d87deb25 --- /dev/null +++ b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "HazelcastIdempotentRepository", + "javaType": "org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Hazelcast Idempotent Repository", + "description": "Idempotent repository that uses Hazelcast cache to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-hazelcast", + "version": "4.5.0-SNAPSHOT", + "properties": { "hazelcastInstance": { "index": 0, "kind": "property", "displayName": "Hazelcast Instance", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use an existing Hazelcast instance instead of local" }, "repositoryName": { "index": 1, "kind": "property", "displayName": "Repository Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "HazelcastIdempotentRepository", "description": "Name of cache to use" } } + } +} + diff --git a/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository new file mode 100644 index 0000000000000..d3a244f68c00c --- /dev/null +++ b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepositoryConfigurer diff --git a/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository new file mode 100644 index 0000000000000..6ab2f65a5a94d --- /dev/null +++ b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepositoryConfigurer diff --git a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepository.java b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepository.java index db4325b3561eb..40a67354ba076 100644 --- a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepository.java +++ b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepository.java @@ -32,6 +32,8 @@ import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.RuntimeCamelException; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; import org.apache.camel.spi.OptimisticLockingAggregationRepository; import org.apache.camel.spi.RecoverableAggregationRepository; import org.apache.camel.support.DefaultExchange; @@ -51,8 +53,11 @@ * are gained this way. If the {@link HazelcastAggregationRepository} uses it's own local {@link HazelcastInstance} it * will DESTROY this instance on {@link #doStop()}. You should control {@link HazelcastInstance} lifecycle yourself * whenever you instantiate {@link HazelcastAggregationRepository} passing a reference to the instance. - * */ +@Metadata(label = "bean", + description = "Aggregation repository that uses Hazelcast Cache to store exchanges.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) +@Configurer(metadataOnly = true) public class HazelcastAggregationRepository extends ServiceSupport implements RecoverableAggregationRepository, OptimisticLockingAggregationRepository { @@ -61,19 +66,34 @@ public class HazelcastAggregationRepository extends ServiceSupport private static final Logger LOG = LoggerFactory.getLogger(HazelcastAggregationRepository.class.getName()); - protected boolean optimistic; protected boolean useLocalHzInstance; - protected boolean useRecovery = true; protected IMap cache; protected IMap persistedCache; - protected HazelcastInstance hzInstance; + @Metadata(description = "To use an existing Hazelcast instance instead of local") + protected HazelcastInstance hazelcastInstance; + @Metadata(description = "Name of cache to use", required = true) protected String mapName; + @Metadata(label = "advanced", description = "Name of cache to use for completed exchanges") protected String persistenceMapName; + @Metadata(description = "Whether to use optimistic locking") + protected boolean optimistic; + @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") + protected boolean useRecovery = true; + @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") protected String deadLetterChannel; + @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") protected long recoveryInterval = 5000; + @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." + + " When this limit is hit, then the Exchange is moved to the dead letter channel.", + defaultValue = "3") protected int maximumRedeliveries = 3; + @Metadata(label = "advanced", + description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") protected boolean allowSerializedHeaders; + public HazelcastAggregationRepository() { + } + /** * Creates new {@link HazelcastAggregationRepository} that defaults to non-optimistic locking with recoverable * behavior and a local Hazelcast instance. Recoverable repository name defaults to {@code repositoryName} + @@ -84,8 +104,6 @@ public class HazelcastAggregationRepository extends ServiceSupport public HazelcastAggregationRepository(final String repositoryName) { mapName = repositoryName; persistenceMapName = String.format("%s%s", mapName, COMPLETED_SUFFIX); - optimistic = false; - useLocalHzInstance = true; } /** @@ -98,8 +116,6 @@ public HazelcastAggregationRepository(final String repositoryName) { public HazelcastAggregationRepository(final String repositoryName, final String persistentRepositoryName) { mapName = repositoryName; persistenceMapName = persistentRepositoryName; - optimistic = false; - useLocalHzInstance = true; } /** @@ -112,7 +128,6 @@ public HazelcastAggregationRepository(final String repositoryName, final String public HazelcastAggregationRepository(final String repositoryName, boolean optimistic) { this(repositoryName); this.optimistic = optimistic; - useLocalHzInstance = true; } /** @@ -126,7 +141,6 @@ public HazelcastAggregationRepository(final String repositoryName, final String boolean optimistic) { this(repositoryName, persistentRepositoryName); this.optimistic = optimistic; - useLocalHzInstance = true; } /** @@ -138,8 +152,7 @@ public HazelcastAggregationRepository(final String repositoryName, final String */ public HazelcastAggregationRepository(final String repositoryName, HazelcastInstance hzInstanse) { this(repositoryName, false); - this.hzInstance = hzInstanse; - useLocalHzInstance = false; + this.hazelcastInstance = hzInstanse; } /** @@ -153,8 +166,7 @@ public HazelcastAggregationRepository(final String repositoryName, HazelcastInst public HazelcastAggregationRepository(final String repositoryName, final String persistentRepositoryName, HazelcastInstance hzInstanse) { this(repositoryName, persistentRepositoryName, false); - this.hzInstance = hzInstanse; - useLocalHzInstance = false; + this.hazelcastInstance = hzInstanse; } /** @@ -167,8 +179,7 @@ public HazelcastAggregationRepository(final String repositoryName, final String */ public HazelcastAggregationRepository(final String repositoryName, boolean optimistic, HazelcastInstance hzInstance) { this(repositoryName, optimistic); - this.hzInstance = hzInstance; - useLocalHzInstance = false; + this.hazelcastInstance = hzInstance; } /** @@ -182,8 +193,7 @@ public HazelcastAggregationRepository(final String repositoryName, boolean optim public HazelcastAggregationRepository(final String repositoryName, final String persistentRepositoryName, boolean optimistic, HazelcastInstance hzInstance) { this(repositoryName, persistentRepositoryName, optimistic); - this.hzInstance = hzInstance; - useLocalHzInstance = false; + this.hazelcastInstance = hzInstance; } @Override @@ -223,7 +233,7 @@ public Exchange add(CamelContext camelContext, String key, Exchange exchange) { throw new UnsupportedOperationException(); } LOG.trace("Adding an Exchange with ID {} for key {} in a thread-safe manner.", exchange.getExchangeId(), key); - Lock l = hzInstance.getCPSubsystem().getLock(mapName); + Lock l = hazelcastInstance.getCPSubsystem().getLock(mapName); try { l.lock(); DefaultExchangeHolder newHolder = DefaultExchangeHolder.marshal(exchange, true, allowSerializedHeaders); @@ -267,7 +277,7 @@ public void setRecoveryInterval(long interval) { } @Override - public long getRecoveryIntervalInMillis() { + public long getRecoveryInterval() { return recoveryInterval; } @@ -327,6 +337,14 @@ public void setAllowSerializedHeaders(boolean allowSerializedHeaders) { this.allowSerializedHeaders = allowSerializedHeaders; } + public HazelcastInstance getHazelcastInstance() { + return hazelcastInstance; + } + + public void setHazelcastInstance(HazelcastInstance hazelcastInstance) { + this.hazelcastInstance = hazelcastInstance; + } + /** * This method performs transactional operation on removing the {@code exchange} from the operational storage and * moving it into the persistent one if the {@link HazelcastAggregationRepository} runs in recoverable mode and @@ -364,7 +382,7 @@ public void remove(CamelContext camelContext, String key, Exchange exchange) { TransactionOptions tOpts = new TransactionOptions(); tOpts.setTransactionType(TransactionOptions.TransactionType.ONE_PHASE); - TransactionContext tCtx = hzInstance.newTransactionContext(tOpts); + TransactionContext tCtx = hazelcastInstance.newTransactionContext(tOpts); try { tCtx.beginTransaction(); @@ -419,31 +437,35 @@ public String getPersistentRepositoryName() { @Override protected void doStart() throws Exception { + StringHelper.notEmpty(mapName, "repositoryName"); if (maximumRedeliveries < 0) { throw new IllegalArgumentException("Maximum redelivery retries must be zero or a positive integer."); } if (recoveryInterval < 0) { throw new IllegalArgumentException("Recovery interval must be zero or a positive integer."); } - StringHelper.notEmpty(mapName, "repositoryName"); - if (useLocalHzInstance) { + if (persistenceMapName == null) { + persistenceMapName = String.format("%s%s", mapName, COMPLETED_SUFFIX); + } + if (hazelcastInstance == null) { + useLocalHzInstance = true; Config cfg = new XmlConfigBuilder().build(); cfg.setProperty("hazelcast.version.check.enabled", "false"); - hzInstance = Hazelcast.newHazelcastInstance(cfg); + hazelcastInstance = Hazelcast.newHazelcastInstance(cfg); } else { - ObjectHelper.notNull(hzInstance, "hzInstanse"); + ObjectHelper.notNull(hazelcastInstance, "hazelcastInstance"); } - cache = hzInstance.getMap(mapName); + cache = hazelcastInstance.getMap(mapName); if (useRecovery) { - persistedCache = hzInstance.getMap(persistenceMapName); + persistedCache = hazelcastInstance.getMap(persistenceMapName); } } @Override protected void doStop() throws Exception { - //noop if (useLocalHzInstance) { - hzInstance.getLifecycleService().shutdown(); + hazelcastInstance.getLifecycleService().shutdown(); + hazelcastInstance = null; } } diff --git a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/ReplicatedHazelcastAggregationRepository.java b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/ReplicatedHazelcastAggregationRepository.java index 84ca8ca45d254..443ff91fddeec 100644 --- a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/ReplicatedHazelcastAggregationRepository.java +++ b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/ReplicatedHazelcastAggregationRepository.java @@ -50,7 +50,6 @@ * {@link HazelcastInstance} it will DESTROY this instance on {@link #doStop()}. You should control * {@link HazelcastInstance} lifecycle yourself whenever you instantiate * {@link ReplicatedHazelcastAggregationRepository} passing a reference to the instance. - * */ public class ReplicatedHazelcastAggregationRepository extends HazelcastAggregationRepository { private static final Logger LOG = LoggerFactory.getLogger(ReplicatedHazelcastAggregationRepository.class.getName()); @@ -190,7 +189,7 @@ public Exchange add(CamelContext camelContext, String key, Exchange exchange) { throw new UnsupportedOperationException(); } LOG.trace("Adding an Exchange with ID {} for key {} in a thread-safe manner.", exchange.getExchangeId(), key); - Lock l = hzInstance.getCPSubsystem().getLock(mapName); + Lock l = hazelcastInstance.getCPSubsystem().getLock(mapName); try { l.lock(); DefaultExchangeHolder newHolder = DefaultExchangeHolder.marshal(exchange, true, allowSerializedHeaders); @@ -279,7 +278,7 @@ public void remove(CamelContext camelContext, String key, Exchange exchange) { TransactionOptions tOpts = new TransactionOptions(); tOpts.setTransactionType(TransactionOptions.TransactionType.ONE_PHASE); - TransactionContext tCtx = hzInstance.newTransactionContext(tOpts); + TransactionContext tCtx = hazelcastInstance.newTransactionContext(tOpts); try { tCtx.beginTransaction(); @@ -334,16 +333,17 @@ protected void doStart() throws Exception { throw new IllegalArgumentException("Recovery interval must be zero or a positive integer."); } StringHelper.notEmpty(mapName, "repositoryName"); - if (useLocalHzInstance) { + if (hazelcastInstance == null) { + useLocalHzInstance = true; Config cfg = new XmlConfigBuilder().build(); cfg.setProperty("hazelcast.version.check.enabled", "false"); - hzInstance = Hazelcast.newHazelcastInstance(cfg); + hazelcastInstance = Hazelcast.newHazelcastInstance(cfg); } else { - ObjectHelper.notNull(hzInstance, "hzInstanse"); + ObjectHelper.notNull(hazelcastInstance, "hazelcastInstance"); } - replicatedCache = hzInstance.getReplicatedMap(mapName); + replicatedCache = hazelcastInstance.getReplicatedMap(mapName); if (useRecovery) { - replicatedPersistedCache = hzInstance.getReplicatedMap(persistenceMapName); + replicatedPersistedCache = hazelcastInstance.getReplicatedMap(persistenceMapName); } } diff --git a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepository.java b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepository.java index 528270046843a..29356bf8ac56b 100644 --- a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepository.java +++ b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepository.java @@ -16,34 +16,61 @@ */ package org.apache.camel.processor.idempotent.hazelcast; +import com.hazelcast.config.Config; +import com.hazelcast.config.XmlConfigBuilder; +import com.hazelcast.core.Hazelcast; import com.hazelcast.core.HazelcastInstance; import com.hazelcast.map.IMap; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.IdempotentRepository; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.service.ServiceSupport; +import org.apache.camel.util.ObjectHelper; +@Metadata(label = "bean", + description = "Idempotent repository that uses Hazelcast cache to store message ids.") +@Configurer(metadataOnly = true) public class HazelcastIdempotentRepository extends ServiceSupport implements IdempotentRepository { + protected boolean useLocalHzInstance; + + @Metadata(description = "Name of cache to use", defaultValue = "HazelcastIdempotentRepository") private String repositoryName; private IMap repo; + @Metadata(description = "To use an existing Hazelcast instance instead of local") private HazelcastInstance hazelcastInstance; + public HazelcastIdempotentRepository() { + this(null); + } + public HazelcastIdempotentRepository(HazelcastInstance hazelcastInstance) { this(hazelcastInstance, HazelcastIdempotentRepository.class.getSimpleName()); } public HazelcastIdempotentRepository(HazelcastInstance hazelcastInstance, String repositoryName) { - this.repositoryName = repositoryName; this.hazelcastInstance = hazelcastInstance; + this.repositoryName = repositoryName; } @Override protected void doStart() throws Exception { + if (hazelcastInstance == null) { + Config cfg = new XmlConfigBuilder().build(); + cfg.setProperty("hazelcast.version.check.enabled", "false"); + hazelcastInstance = Hazelcast.newHazelcastInstance(cfg); + useLocalHzInstance = true; + } else { + ObjectHelper.notNull(hazelcastInstance, "hazelcastInstance"); + } repo = hazelcastInstance.getMap(repositoryName); } @Override protected void doStop() throws Exception { - // noop + if (useLocalHzInstance) { + hazelcastInstance.getLifecycleService().shutdown(); + } } @Override diff --git a/components/camel-hazelcast/src/test/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepositoryConstructorsTest.java b/components/camel-hazelcast/src/test/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepositoryConstructorsTest.java index 67e86821febf1..86f1404ec9446 100644 --- a/components/camel-hazelcast/src/test/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepositoryConstructorsTest.java +++ b/components/camel-hazelcast/src/test/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepositoryConstructorsTest.java @@ -16,7 +16,6 @@ */ package org.apache.camel.processor.aggregate.hazelcast; -import com.hazelcast.core.HazelcastInstance; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.support.DefaultExchange; @@ -64,14 +63,6 @@ public void optimisticRepoFailsForNonOptimisticAdd() throws Exception { } } - @Test - public void uninitializedHazelcastInstanceThrows() throws Exception { - final String repoName = "hzRepoMap"; - HazelcastAggregationRepository repo = new HazelcastAggregationRepository(repoName, (HazelcastInstance) null); - assertThrows(IllegalArgumentException.class, - () -> repo.doStart()); - } - @Test public void locallyInitializedHazelcastInstanceAdd() { assertDoesNotThrow(() -> runLocallyInitializedHazelcastInstanceAdd()); From d80dfe7c95d1909d2f17498228ede82c186239f7 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 19 Mar 2024 09:13:48 +0100 Subject: [PATCH 28/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../aggregate/CaffeineAggregationRepository.java | 10 ++++++---- .../idempotent/CaffeineIdempotentRepository.java | 2 +- .../aggregate/EhcacheAggregationRepository.java | 10 ++++++---- .../idempotent/EhcacheIdempotentRepository.java | 2 +- .../aggregate/Etcd3AggregationRepository.java | 10 ++++++---- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java index f96f0a04ad2ca..9a1866cc071ea 100644 --- a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java +++ b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java @@ -35,8 +35,8 @@ import org.slf4j.LoggerFactory; @Metadata(label = "bean", - description = "Aggregation repository that uses Caffeine Cache to store exchanges.", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "Aggregation repository that uses Caffeine Cache to store exchanges.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) @ManagedResource(description = "Caffeine based aggregation repository") public class CaffeineAggregationRepository extends ServiceSupport implements RecoverableAggregationRepository { @@ -46,7 +46,8 @@ public class CaffeineAggregationRepository extends ServiceSupport implements Rec private CamelContext camelContext; private Cache cache; - @Metadata(label = "advanced", description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") + @Metadata(label = "advanced", + description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") private boolean allowSerializedHeaders; @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; @@ -55,7 +56,8 @@ public class CaffeineAggregationRepository extends ServiceSupport implements Rec @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." - + " When this limit is hit, then the Exchange is moved to the dead letter channel.", defaultValue = "3") + + " When this limit is hit, then the Exchange is moved to the dead letter channel.", + defaultValue = "3") private int maximumRedeliveries = 3; public CamelContext getCamelContext() { diff --git a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java index b98e1751ad7ee..96f66471cdc1d 100644 --- a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java +++ b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java @@ -27,7 +27,7 @@ import org.apache.camel.support.service.ServiceSupport; @Metadata(label = "bean", - description = "Idempotent repository that uses Caffiene cache to store message ids.") + description = "Idempotent repository that uses Caffiene cache to store message ids.") @Configurer(metadataOnly = true) @ManagedResource(description = "Caffeine based message id repository") public class CaffeineIdempotentRepository extends ServiceSupport implements IdempotentRepository { diff --git a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepository.java b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepository.java index ffe7e2ae0def4..3786c39612d40 100644 --- a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepository.java +++ b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepository.java @@ -37,8 +37,8 @@ import org.slf4j.LoggerFactory; @Metadata(label = "bean", - description = "Aggregation repository that uses Caffeine Cache to store exchanges.", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "Aggregation repository that uses Caffeine Cache to store exchanges.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) @ManagedResource(description = "EHCache based aggregation repository") public class EhcacheAggregationRepository extends ServiceSupport implements RecoverableAggregationRepository { @@ -51,7 +51,8 @@ public class EhcacheAggregationRepository extends ServiceSupport implements Reco private String cacheName; private Cache cache; - @Metadata(label = "advanced", description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") + @Metadata(label = "advanced", + description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") private boolean allowSerializedHeaders; @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; @@ -60,7 +61,8 @@ public class EhcacheAggregationRepository extends ServiceSupport implements Reco @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." - + " When this limit is hit, then the Exchange is moved to the dead letter channel.", defaultValue = "3") + + " When this limit is hit, then the Exchange is moved to the dead letter channel.", + defaultValue = "3") private int maximumRedeliveries = 3; public CamelContext getCamelContext() { diff --git a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java index af36fb9676d61..1230d930a6d00 100644 --- a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java +++ b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java @@ -28,7 +28,7 @@ import org.ehcache.CacheManager; @Metadata(label = "bean", - description = "Idempotent repository that uses EHCache cache to store message ids.") + description = "Idempotent repository that uses EHCache cache to store message ids.") @Configurer(metadataOnly = true) @ManagedResource(description = "EHCache based message id repository") public class EhcacheIdempotentRepository extends ServiceSupport implements IdempotentRepository { diff --git a/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java b/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java index d163c730b1951..c6fcd6819bf1e 100644 --- a/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java +++ b/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java @@ -59,8 +59,8 @@ import org.slf4j.LoggerFactory; @Metadata(label = "bean", - description = "Aggregation repository that uses Etcd3 to store exchanges.", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "Aggregation repository that uses Etcd3 to store exchanges.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) public class Etcd3AggregationRepository extends ServiceSupport implements RecoverableAggregationRepository, OptimisticLockingAggregationRepository { @@ -85,9 +85,11 @@ public class Etcd3AggregationRepository extends ServiceSupport @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." - + " When this limit is hit, then the Exchange is moved to the dead letter channel.", defaultValue = "3") + + " When this limit is hit, then the Exchange is moved to the dead letter channel.", + defaultValue = "3") private int maximumRedeliveries = 3; - @Metadata(label = "advanced", description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") + @Metadata(label = "advanced", + description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") private boolean allowSerializedHeaders; public Etcd3AggregationRepository() { From 2ef9c9ecddcb364f0ef47770572372ab9eb710e3 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 19 Mar 2024 09:23:00 +0100 Subject: [PATCH 29/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../InfinispanAggregationRepository.java | 19 ++++++++++++++----- ...finispanEmbeddedAggregationRepository.java | 10 +++++----- ...InfinispanRemoteAggregationRepository.java | 16 +++++++++------- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanAggregationRepository.java b/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanAggregationRepository.java index 3543a5dd63cd9..f12251a325ac0 100644 --- a/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanAggregationRepository.java +++ b/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanAggregationRepository.java @@ -27,6 +27,7 @@ import org.apache.camel.support.DefaultExchange; import org.apache.camel.support.DefaultExchangeHolder; import org.apache.camel.support.service.ServiceSupport; +import org.apache.camel.util.ObjectHelper; import org.infinispan.commons.api.BasicCache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,7 +38,7 @@ public abstract class InfinispanAggregationRepository private static final Logger LOG = LoggerFactory.getLogger(InfinispanAggregationRepository.class); - private final String cacheName; + private String cacheName; private CamelContext camelContext; private boolean useRecovery = true; @@ -46,6 +47,9 @@ public abstract class InfinispanAggregationRepository private int maximumRedeliveries = 3; private boolean allowSerializedHeaders; + public InfinispanAggregationRepository() { + } + /** * Creates new {@link InfinispanAggregationRepository} that defaults to non-optimistic locking with recoverable * behavior and a local Infinispan cache. @@ -110,19 +114,23 @@ public Exchange recover(CamelContext camelContext, String exchangeId) { return useRecovery ? unmarshallExchange(camelContext, getCache().get(exchangeId)) : null; } + public void setCacheName(String cacheName) { + this.cacheName = cacheName; + } + @Override public void setRecoveryInterval(long interval, TimeUnit timeUnit) { this.recoveryInterval = timeUnit.toMillis(interval); } @Override - public void setRecoveryInterval(long interval) { - this.recoveryInterval = interval; + public long getRecoveryInterval() { + return recoveryInterval; } @Override - public long getRecoveryIntervalInMillis() { - return recoveryInterval; + public void setRecoveryInterval(long interval) { + this.recoveryInterval = interval; } @Override @@ -157,6 +165,7 @@ public void setMaximumRedeliveries(int maximumRedeliveries) { @Override protected void doStart() throws Exception { + ObjectHelper.notNull(cacheName, "cacheName", this); if (maximumRedeliveries < 0) { throw new IllegalArgumentException("Maximum redelivery retries must be zero or a positive integer."); } diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java b/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java index 36b084040c917..6fbd2332daa91 100644 --- a/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java +++ b/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java @@ -26,11 +26,14 @@ import org.infinispan.commons.api.BasicCache; public class InfinispanEmbeddedAggregationRepository extends InfinispanAggregationRepository { - private final Supplier> cache; + private Supplier> cache; private InfinispanEmbeddedConfiguration configuration; private InfinispanEmbeddedManager manager; + public InfinispanEmbeddedAggregationRepository() { + } + /** * Creates new {@link InfinispanEmbeddedAggregationRepository} that defaults to non-optimistic locking with * recoverable behavior and a local Infinispan cache. @@ -39,8 +42,6 @@ public class InfinispanEmbeddedAggregationRepository extends InfinispanAggregati */ public InfinispanEmbeddedAggregationRepository(String cacheName) { super(cacheName); - - this.cache = Suppliers.memorize(() -> manager.getCache(getCacheName())); } @Override @@ -53,8 +54,8 @@ protected void doStart() throws Exception { if (ObjectHelper.isEmpty(manager)) { manager = new InfinispanEmbeddedManager(configuration); } - manager.setCamelContext(getCamelContext()); + this.cache = Suppliers.memorize(() -> manager.getCache(getCacheName())); ServiceHelper.startService(manager); } @@ -62,7 +63,6 @@ protected void doStart() throws Exception { @Override protected void doStop() throws Exception { super.doStop(); - ServiceHelper.stopService(manager); } diff --git a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java index 73cdb91ea63cc..05c786ec3512d 100644 --- a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java +++ b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java @@ -29,11 +29,14 @@ import org.infinispan.commons.configuration.Combine; public class InfinispanRemoteAggregationRepository extends InfinispanAggregationRepository { - private final Supplier> cache; + private Supplier> cache; private InfinispanRemoteConfiguration configuration; private InfinispanRemoteManager manager; + public InfinispanRemoteAggregationRepository() { + } + /** * Creates new {@link InfinispanRemoteAggregationRepository} that defaults to non-optimistic locking with * recoverable behavior and a local Infinispan cache. @@ -42,11 +45,6 @@ public class InfinispanRemoteAggregationRepository extends InfinispanAggregation */ public InfinispanRemoteAggregationRepository(String cacheName) { super(cacheName); - - this.cache = Suppliers.memorize( - // for optimization reason, a remote cache does not return the previous value for operation - // such as Map::put and need to be explicitly forced - () -> InfinispanRemoteUtil.getCacheWithFlags(manager, getCacheName(), Flag.FORCE_RETURN_VALUE)); } @Override @@ -71,13 +69,17 @@ protected void doStart() throws Exception { manager = new InfinispanRemoteManager(conf); manager.setCamelContext(getCamelContext()); + this.cache = Suppliers.memorize( + // for optimization reason, a remote cache does not return the previous value for operation + // such as Map::put and need to be explicitly forced + () -> InfinispanRemoteUtil.getCacheWithFlags(manager, getCacheName(), Flag.FORCE_RETURN_VALUE)); + ServiceHelper.startService(manager); } @Override protected void doStop() throws Exception { super.doStop(); - ServiceHelper.stopService(manager); } From cbf1b9023e67d8e64301bbd5ffae47c876379923 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 19 Mar 2024 09:42:22 +0100 Subject: [PATCH 30/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../InfinispanAggregationRepository.java | 14 ++- ...beddedAggregationRepositoryConfigurer.java | 91 +++++++++++++++++++ ...mbeddedIdempotentRepositoryConfigurer.java | 61 +++++++++++++ .../services/org/apache/camel/bean.properties | 7 ++ ...finispanEmbeddedAggregationRepository.json | 16 ++++ ...nfinispanEmbeddedIdempotentRepository.json | 16 ++++ ...ed.InfinispanEmbeddedAggregationRepository | 2 + ...ded.InfinispanEmbeddedIdempotentRepository | 2 + ...finispanEmbeddedAggregationRepository.java | 27 +++++- ...nfinispanEmbeddedIdempotentRepository.java | 31 +++++-- ...RemoteAggregationRepositoryConfigurer.java | 91 +++++++++++++++++++ ...nRemoteIdempotentRepositoryConfigurer.java | 55 +++++++++++ .../services/org/apache/camel/bean.properties | 7 ++ ...InfinispanRemoteAggregationRepository.json | 16 ++++ .../InfinispanRemoteIdempotentRepository.json | 16 ++++ ...mote.InfinispanRemoteAggregationRepository | 2 + ...emote.InfinispanRemoteIdempotentRepository | 2 + ...InfinispanRemoteAggregationRepository.java | 26 +++++- .../InfinispanRemoteIdempotentRepository.java | 28 ++++-- .../maven/packaging/GeneratePojoBeanMojo.java | 68 ++++++++------ 20 files changed, 532 insertions(+), 46 deletions(-) create mode 100644 components/camel-infinispan/camel-infinispan-embedded/src/generated/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepositoryConfigurer.java create mode 100644 components/camel-infinispan/camel-infinispan-embedded/src/generated/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedIdempotentRepositoryConfigurer.java create mode 100644 components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedAggregationRepository.json create mode 100644 components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedIdempotentRepository.json create mode 100644 components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository create mode 100644 components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository create mode 100644 components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepositoryConfigurer.java create mode 100644 components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteIdempotentRepositoryConfigurer.java create mode 100644 components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteAggregationRepository.json create mode 100644 components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteIdempotentRepository.json create mode 100644 components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository create mode 100644 components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository diff --git a/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanAggregationRepository.java b/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanAggregationRepository.java index f12251a325ac0..989309fe58736 100644 --- a/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanAggregationRepository.java +++ b/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanAggregationRepository.java @@ -23,6 +23,7 @@ import org.apache.camel.CamelContext; import org.apache.camel.CamelContextAware; import org.apache.camel.Exchange; +import org.apache.camel.spi.Metadata; import org.apache.camel.spi.RecoverableAggregationRepository; import org.apache.camel.support.DefaultExchange; import org.apache.camel.support.DefaultExchangeHolder; @@ -38,13 +39,22 @@ public abstract class InfinispanAggregationRepository private static final Logger LOG = LoggerFactory.getLogger(InfinispanAggregationRepository.class); - private String cacheName; - private CamelContext camelContext; + + @Metadata(description = "Name of cache", required = true) + private String cacheName; + @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; + @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") private String deadLetterChannel; + @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; + @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." + + " When this limit is hit, then the Exchange is moved to the dead letter channel.", + defaultValue = "3") private int maximumRedeliveries = 3; + @Metadata(label = "advanced", + description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") private boolean allowSerializedHeaders; public InfinispanAggregationRepository() { diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/generated/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepositoryConfigurer.java b/components/camel-infinispan/camel-infinispan-embedded/src/generated/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepositoryConfigurer.java new file mode 100644 index 0000000000000..77ce9f8ad8baf --- /dev/null +++ b/components/camel-infinispan/camel-infinispan-embedded/src/generated/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepositoryConfigurer.java @@ -0,0 +1,91 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.infinispan.embedded; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class InfinispanEmbeddedAggregationRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository target = (org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": target.setAllowSerializedHeaders(property(camelContext, boolean.class, value)); return true; + case "cachename": + case "CacheName": target.setCacheName(property(camelContext, java.lang.String.class, value)); return true; + case "configuration": + case "Configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedConfiguration.class, value)); return true; + case "deadletterchannel": + case "DeadLetterChannel": target.setDeadLetterChannel(property(camelContext, java.lang.String.class, value)); return true; + case "deadletteruri": + case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true; + case "maximumredeliveries": + case "MaximumRedeliveries": target.setMaximumRedeliveries(property(camelContext, int.class, value)); return true; + case "recoveryinterval": + case "RecoveryInterval": target.setRecoveryInterval(property(camelContext, long.class, value)); return true; + case "userecovery": + case "UseRecovery": target.setUseRecovery(property(camelContext, boolean.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return boolean.class; + case "cachename": + case "CacheName": return java.lang.String.class; + case "configuration": + case "Configuration": return org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedConfiguration.class; + case "deadletterchannel": + case "DeadLetterChannel": return java.lang.String.class; + case "deadletteruri": + case "DeadLetterUri": return java.lang.String.class; + case "maximumredeliveries": + case "MaximumRedeliveries": return int.class; + case "recoveryinterval": + case "RecoveryInterval": return long.class; + case "userecovery": + case "UseRecovery": return boolean.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository target = (org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return target.isAllowSerializedHeaders(); + case "cachename": + case "CacheName": return target.getCacheName(); + case "configuration": + case "Configuration": return target.getConfiguration(); + case "deadletterchannel": + case "DeadLetterChannel": return target.getDeadLetterChannel(); + case "deadletteruri": + case "DeadLetterUri": return target.getDeadLetterUri(); + case "maximumredeliveries": + case "MaximumRedeliveries": return target.getMaximumRedeliveries(); + case "recoveryinterval": + case "RecoveryInterval": return target.getRecoveryInterval(); + case "userecovery": + case "UseRecovery": return target.isUseRecovery(); + default: return null; + } + } +} + diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/generated/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedIdempotentRepositoryConfigurer.java b/components/camel-infinispan/camel-infinispan-embedded/src/generated/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedIdempotentRepositoryConfigurer.java new file mode 100644 index 0000000000000..81e8f25166ed8 --- /dev/null +++ b/components/camel-infinispan/camel-infinispan-embedded/src/generated/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedIdempotentRepositoryConfigurer.java @@ -0,0 +1,61 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.infinispan.embedded; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class InfinispanEmbeddedIdempotentRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository target = (org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachecontainer": + case "CacheContainer": target.setCacheContainer(property(camelContext, org.infinispan.manager.EmbeddedCacheManager.class, value)); return true; + case "cachename": + case "CacheName": target.setCacheName(property(camelContext, java.lang.String.class, value)); return true; + case "configuration": + case "Configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedConfiguration.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachecontainer": + case "CacheContainer": return org.infinispan.manager.EmbeddedCacheManager.class; + case "cachename": + case "CacheName": return java.lang.String.class; + case "configuration": + case "Configuration": return org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedConfiguration.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository target = (org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachecontainer": + case "CacheContainer": return target.getCacheContainer(); + case "cachename": + case "CacheName": return target.getCacheName(); + case "configuration": + case "Configuration": return target.getConfiguration(); + default: return null; + } + } +} + diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..6f8a817188437 --- /dev/null +++ b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=InfinispanEmbeddedAggregationRepository InfinispanEmbeddedIdempotentRepository +groupId=org.apache.camel +artifactId=camel-infinispan-embedded +version=4.5.0-SNAPSHOT +projectName=Camel :: Infinispan :: Embedded +projectDescription=Camel Infinispan Embedded support diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedAggregationRepository.json b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedAggregationRepository.json new file mode 100644 index 0000000000000..de3d04beb5f9d --- /dev/null +++ b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "InfinispanEmbeddedAggregationRepository", + "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Infinispan Embedded Aggregation Repository", + "description": "Aggregation repository that uses embedded Infinispan to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-infinispan-embedded", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 2, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for embedded Infinispan" }, "deadLetterChannel": { "index": 3, "kind": "property", "displayName": "Dead Letter Channel", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 6, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedIdempotentRepository.json b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedIdempotentRepository.json new file mode 100644 index 0000000000000..2704dc07f791f --- /dev/null +++ b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "InfinispanEmbeddedIdempotentRepository", + "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Infinispan Embedded Idempotent Repository", + "description": "Idempotent repository that uses embedded Infinispan to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-infinispan-embedded", + "version": "4.5.0-SNAPSHOT", + "properties": { "cacheName": { "index": 0, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 1, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for embedded Infinispan" } } + } +} + diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository new file mode 100644 index 0000000000000..ea7bc300247e4 --- /dev/null +++ b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepositoryConfigurer diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository new file mode 100644 index 0000000000000..6f247c58e11c3 --- /dev/null +++ b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepositoryConfigurer diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java b/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java index 6fbd2332daa91..975a67a0401a2 100644 --- a/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java +++ b/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java @@ -19,18 +19,43 @@ import java.util.function.Supplier; import org.apache.camel.component.infinispan.InfinispanAggregationRepository; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.DefaultExchangeHolder; import org.apache.camel.support.service.ServiceHelper; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.function.Suppliers; import org.infinispan.commons.api.BasicCache; +@Metadata(label = "bean", + description = "Aggregation repository that uses embedded Infinispan to store exchanges.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) +@Configurer(metadataOnly = true) public class InfinispanEmbeddedAggregationRepository extends InfinispanAggregationRepository { private Supplier> cache; - private InfinispanEmbeddedConfiguration configuration; private InfinispanEmbeddedManager manager; + @Metadata(description = "Configuration for embedded Infinispan") + private InfinispanEmbeddedConfiguration configuration; + + // needed for metadata generation + @Metadata(description = "Name of cache", required = true) + private String cacheName; + @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") + private boolean useRecovery = true; + @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") + private String deadLetterChannel; + @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") + private long recoveryInterval = 5000; + @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." + + " When this limit is hit, then the Exchange is moved to the dead letter channel.", + defaultValue = "3") + private int maximumRedeliveries = 3; + @Metadata(label = "advanced", + description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") + private boolean allowSerializedHeaders; + public InfinispanEmbeddedAggregationRepository() { } diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedIdempotentRepository.java b/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedIdempotentRepository.java index b4abfc3e59754..28daab8a23e09 100644 --- a/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedIdempotentRepository.java +++ b/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedIdempotentRepository.java @@ -20,26 +20,40 @@ import org.apache.camel.api.management.ManagedResource; import org.apache.camel.component.infinispan.InfinispanIdempotentRepository; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; +import org.apache.camel.support.service.ServiceHelper; +import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.function.Suppliers; import org.infinispan.commons.api.BasicCache; import org.infinispan.manager.EmbeddedCacheManager; +@Metadata(label = "bean", + description = "Idempotent repository that uses embedded Infinispan to store message ids.", + annotations = { "interfaceName=org.apache.camel.spi.IdempotentRepository" }) +@Configurer(metadataOnly = true) @ManagedResource(description = "Infinispan Embedded message id repository") public class InfinispanEmbeddedIdempotentRepository extends InfinispanIdempotentRepository { - private final String cacheName; - private final Supplier> cache; - private InfinispanEmbeddedConfiguration configuration; + private Supplier> cache; private InfinispanEmbeddedManager manager; + @Metadata(description = "Name of cache", required = true) + private String cacheName; + @Metadata(description = "Configuration for embedded Infinispan") + private InfinispanEmbeddedConfiguration configuration; + + public InfinispanEmbeddedIdempotentRepository() { + } + public InfinispanEmbeddedIdempotentRepository(String cacheName) { this.cacheName = cacheName; - this.cache = Suppliers.memorize(() -> manager.getCache(getCacheName())); } @Override protected void doStart() throws Exception { super.doStart(); + ObjectHelper.notNull(cacheName, "cacheName", this); if (this.configuration == null) { this.configuration = new InfinispanEmbeddedConfiguration(); @@ -47,12 +61,13 @@ protected void doStart() throws Exception { this.manager = new InfinispanEmbeddedManager(configuration); this.manager.setCamelContext(getCamelContext()); - this.manager.start(); + this.cache = Suppliers.memorize(() -> manager.getCache(getCacheName())); + ServiceHelper.startService(manager); } @Override protected void doShutdown() throws Exception { - this.manager.shutdown(); + ServiceHelper.stopAndShutdownService(manager); super.doShutdown(); } @@ -61,6 +76,10 @@ protected BasicCache getCache() { return cache.get(); } + public void setCacheName(String cacheName) { + this.cacheName = cacheName; + } + @Override public String getCacheName() { return this.cacheName; diff --git a/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepositoryConfigurer.java b/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepositoryConfigurer.java new file mode 100644 index 0000000000000..aee15208c8313 --- /dev/null +++ b/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepositoryConfigurer.java @@ -0,0 +1,91 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.infinispan.remote; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class InfinispanRemoteAggregationRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository target = (org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": target.setAllowSerializedHeaders(property(camelContext, boolean.class, value)); return true; + case "cachename": + case "CacheName": target.setCacheName(property(camelContext, java.lang.String.class, value)); return true; + case "configuration": + case "Configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration.class, value)); return true; + case "deadletterchannel": + case "DeadLetterChannel": target.setDeadLetterChannel(property(camelContext, java.lang.String.class, value)); return true; + case "deadletteruri": + case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true; + case "maximumredeliveries": + case "MaximumRedeliveries": target.setMaximumRedeliveries(property(camelContext, int.class, value)); return true; + case "recoveryinterval": + case "RecoveryInterval": target.setRecoveryInterval(property(camelContext, long.class, value)); return true; + case "userecovery": + case "UseRecovery": target.setUseRecovery(property(camelContext, boolean.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return boolean.class; + case "cachename": + case "CacheName": return java.lang.String.class; + case "configuration": + case "Configuration": return org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration.class; + case "deadletterchannel": + case "DeadLetterChannel": return java.lang.String.class; + case "deadletteruri": + case "DeadLetterUri": return java.lang.String.class; + case "maximumredeliveries": + case "MaximumRedeliveries": return int.class; + case "recoveryinterval": + case "RecoveryInterval": return long.class; + case "userecovery": + case "UseRecovery": return boolean.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository target = (org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return target.isAllowSerializedHeaders(); + case "cachename": + case "CacheName": return target.getCacheName(); + case "configuration": + case "Configuration": return target.getConfiguration(); + case "deadletterchannel": + case "DeadLetterChannel": return target.getDeadLetterChannel(); + case "deadletteruri": + case "DeadLetterUri": return target.getDeadLetterUri(); + case "maximumredeliveries": + case "MaximumRedeliveries": return target.getMaximumRedeliveries(); + case "recoveryinterval": + case "RecoveryInterval": return target.getRecoveryInterval(); + case "userecovery": + case "UseRecovery": return target.isUseRecovery(); + default: return null; + } + } +} + diff --git a/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteIdempotentRepositoryConfigurer.java b/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteIdempotentRepositoryConfigurer.java new file mode 100644 index 0000000000000..83ad461789ce1 --- /dev/null +++ b/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteIdempotentRepositoryConfigurer.java @@ -0,0 +1,55 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.infinispan.remote; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class InfinispanRemoteIdempotentRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository target = (org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachecontainer": + case "CacheContainer": target.setCacheContainer(property(camelContext, org.infinispan.client.hotrod.RemoteCacheManager.class, value)); return true; + case "configuration": + case "Configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachecontainer": + case "CacheContainer": return org.infinispan.client.hotrod.RemoteCacheManager.class; + case "configuration": + case "Configuration": return org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository target = (org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachecontainer": + case "CacheContainer": return target.getCacheContainer(); + case "configuration": + case "Configuration": return target.getConfiguration(); + default: return null; + } + } +} + diff --git a/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..5312b3771e0e3 --- /dev/null +++ b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=InfinispanRemoteAggregationRepository InfinispanRemoteIdempotentRepository +groupId=org.apache.camel +artifactId=camel-infinispan +version=4.5.0-SNAPSHOT +projectName=Camel :: Infinispan :: Remote +projectDescription=Camel Infinispan Remote support diff --git a/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteAggregationRepository.json b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteAggregationRepository.json new file mode 100644 index 0000000000000..44a8c587fdc6a --- /dev/null +++ b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "InfinispanRemoteAggregationRepository", + "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Infinispan Remote Aggregation Repository", + "description": "Aggregation repository that uses remote Infinispan to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-infinispan", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 2, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for remote Infinispan" }, "deadLetterChannel": { "index": 3, "kind": "property", "displayName": "Dead Letter Channel", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 6, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + diff --git a/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteIdempotentRepository.json b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteIdempotentRepository.json new file mode 100644 index 0000000000000..b4d7349e455fd --- /dev/null +++ b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "InfinispanRemoteIdempotentRepository", + "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Infinispan Remote Idempotent Repository", + "description": "Idempotent repository that uses remote Infinispan to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-infinispan", + "version": "4.5.0-SNAPSHOT", + "properties": { "cacheName": { "index": 0, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 1, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for remote Infinispan" } } + } +} + diff --git a/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository new file mode 100644 index 0000000000000..dfaf44316bb79 --- /dev/null +++ b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepositoryConfigurer diff --git a/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository new file mode 100644 index 0000000000000..65f11c2cd16a5 --- /dev/null +++ b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepositoryConfigurer diff --git a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java index 05c786ec3512d..3a30026d735d7 100644 --- a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java +++ b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java @@ -20,6 +20,8 @@ import org.apache.camel.component.infinispan.InfinispanAggregationRepository; import org.apache.camel.component.infinispan.remote.protostream.DefaultExchangeHolderContextInitializer; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.DefaultExchangeHolder; import org.apache.camel.support.service.ServiceHelper; import org.apache.camel.util.function.Suppliers; @@ -28,12 +30,34 @@ import org.infinispan.commons.api.BasicCache; import org.infinispan.commons.configuration.Combine; +@Metadata(label = "bean", + description = "Aggregation repository that uses remote Infinispan to store exchanges.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) +@Configurer(metadataOnly = true) public class InfinispanRemoteAggregationRepository extends InfinispanAggregationRepository { private Supplier> cache; - private InfinispanRemoteConfiguration configuration; private InfinispanRemoteManager manager; + @Metadata(description = "Configuration for remote Infinispan") + private InfinispanRemoteConfiguration configuration; + // needed for metadata generation + @Metadata(description = "Name of cache", required = true) + private String cacheName; + @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") + private boolean useRecovery = true; + @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") + private String deadLetterChannel; + @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") + private long recoveryInterval = 5000; + @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." + + " When this limit is hit, then the Exchange is moved to the dead letter channel.", + defaultValue = "3") + private int maximumRedeliveries = 3; + @Metadata(label = "advanced", + description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") + private boolean allowSerializedHeaders; + public InfinispanRemoteAggregationRepository() { } diff --git a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteIdempotentRepository.java b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteIdempotentRepository.java index 7832f53155093..168ac4ee529f8 100644 --- a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteIdempotentRepository.java +++ b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteIdempotentRepository.java @@ -20,6 +20,10 @@ import org.apache.camel.api.management.ManagedResource; import org.apache.camel.component.infinispan.InfinispanIdempotentRepository; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; +import org.apache.camel.support.service.ServiceHelper; +import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.function.Suppliers; import org.infinispan.client.hotrod.Flag; import org.infinispan.client.hotrod.RemoteCache; @@ -28,22 +32,32 @@ import static org.apache.camel.component.infinispan.remote.InfinispanRemoteUtil.getCacheWithFlags; +@Metadata(label = "bean", + description = "Idempotent repository that uses remote Infinispan to store message ids.", + annotations = { "interfaceName=org.apache.camel.spi.IdempotentRepository" }) +@Configurer(metadataOnly = true) @ManagedResource(description = "Infinispan Remote message id repository") public class InfinispanRemoteIdempotentRepository extends InfinispanIdempotentRepository { - private final String cacheName; - private final Supplier> cache; - private InfinispanRemoteConfiguration configuration; + private Supplier> cache; private InfinispanRemoteManager manager; + @Metadata(description = "Name of cache", required = true) + private String cacheName; + @Metadata(description = "Configuration for remote Infinispan") + private InfinispanRemoteConfiguration configuration; + + public InfinispanRemoteIdempotentRepository() { + } + public InfinispanRemoteIdempotentRepository(String cacheName) { this.cacheName = cacheName; - this.cache = Suppliers.memorize(() -> getCacheWithFlags(manager, cacheName, Flag.FORCE_RETURN_VALUE)); } @Override protected void doStart() throws Exception { super.doStart(); + ObjectHelper.notNull(cacheName, "cacheName", this); if (this.configuration == null) { this.configuration = new InfinispanRemoteConfiguration(); @@ -51,12 +65,13 @@ protected void doStart() throws Exception { this.manager = new InfinispanRemoteManager(configuration); this.manager.setCamelContext(getCamelContext()); - this.manager.start(); + this.cache = Suppliers.memorize(() -> getCacheWithFlags(manager, cacheName, Flag.FORCE_RETURN_VALUE)); + ServiceHelper.startService(manager); } @Override protected void doShutdown() throws Exception { - this.manager.shutdown(); + ServiceHelper.stopAndShutdownService(manager); super.doShutdown(); } @@ -94,7 +109,6 @@ public void setCacheContainer(RemoteCacheManager cacheContainer) { if (this.configuration == null) { this.configuration = new InfinispanRemoteConfiguration(); } - this.configuration.setCacheContainer(cacheContainer); } } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java index abda88763a99c..a34679ebfefe2 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java @@ -179,35 +179,12 @@ public void execute() throws MojoExecutionException, MojoFailureException { model.setInterfaceName(annotationValue(a, "annotations", "interfaceName")); } - // find all fields with @Metadata as options - for (FieldInfo fi : ci.fields()) { - AnnotationInstance ai = fi.annotation(METADATA); - if (ai != null) { - BeanPojoOptionModel o = new BeanPojoOptionModel(); - o.setKind("property"); - o.setName(fi.name()); - o.setLabel(annotationValue(ai, "label")); - o.setDefaultValue(annotationValue(ai, "defaultValue")); - o.setRequired("true".equals(annotationValue(ai, "required"))); - String displayName = annotationValue(ai, "displayName"); - if (displayName == null) { - displayName = Strings.asTitle(o.getName()); - } - o.setDisplayName(displayName); - o.setDeprecated(fi.hasAnnotation(Deprecated.class)); - String javaType = annotationValue(ai, "javaType"); - if (javaType == null) { - javaType = ci.name().toString(); - } - o.setJavaType(javaType); - o.setType(getType(javaType, false, false)); - o.setDescription(annotationValue(ai, "description")); - String enums = annotationValue(ai, "enums"); - if (enums != null) { - String[] values = enums.split(","); - o.setEnums(Stream.of(values).map(String::trim).toList()); - } - model.addOption(o); + // find all fields with @Metadata as options (also from super class) + while (ci != null) { + extractFields(ci, model); + DotName dn = ci.superName(); + if (dn != null) { + ci = index.getClassByName(dn); } } models.add(model); @@ -244,6 +221,39 @@ public void execute() throws MojoExecutionException, MojoFailureException { } } + private static void extractFields(ClassInfo ci, BeanPojoModel model) { + for (FieldInfo fi : ci.fields()) { + AnnotationInstance ai = fi.annotation(METADATA); + if (ai != null) { + BeanPojoOptionModel o = new BeanPojoOptionModel(); + o.setKind("property"); + o.setName(fi.name()); + o.setLabel(annotationValue(ai, "label")); + o.setDefaultValue(annotationValue(ai, "defaultValue")); + o.setRequired("true".equals(annotationValue(ai, "required"))); + String displayName = annotationValue(ai, "displayName"); + if (displayName == null) { + displayName = Strings.asTitle(o.getName()); + } + o.setDisplayName(displayName); + o.setDeprecated(fi.hasAnnotation(Deprecated.class)); + String javaType = annotationValue(ai, "javaType"); + if (javaType == null) { + javaType = ci.name().toString(); + } + o.setJavaType(javaType); + o.setType(getType(javaType, false, false)); + o.setDescription(annotationValue(ai, "description")); + String enums = annotationValue(ai, "enums"); + if (enums != null) { + String[] values = enums.split(","); + o.setEnums(Stream.of(values).map(String::trim).toList()); + } + model.addOption(o); + } + } + } + private static String interfaceName(Index index, ClassInfo target) { for (DotName dn : target.interfaceNames()) { if (dn.packagePrefix().startsWith("org.apache.camel")) { From 930cab6ff9ccafcac2d187db45576ad5c68506ae Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 19 Mar 2024 09:45:08 +0100 Subject: [PATCH 31/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../remote/InfinispanRemoteIdempotentRepository.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteIdempotentRepository.java b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteIdempotentRepository.java index 168ac4ee529f8..fef382e6e4f36 100644 --- a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteIdempotentRepository.java +++ b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteIdempotentRepository.java @@ -33,8 +33,8 @@ import static org.apache.camel.component.infinispan.remote.InfinispanRemoteUtil.getCacheWithFlags; @Metadata(label = "bean", - description = "Idempotent repository that uses remote Infinispan to store message ids.", - annotations = { "interfaceName=org.apache.camel.spi.IdempotentRepository" }) + description = "Idempotent repository that uses remote Infinispan to store message ids.", + annotations = { "interfaceName=org.apache.camel.spi.IdempotentRepository" }) @Configurer(metadataOnly = true) @ManagedResource(description = "Infinispan Remote message id repository") public class InfinispanRemoteIdempotentRepository extends InfinispanIdempotentRepository { From 5bf2c03f3248d822e2d7b7a9cf62c76deb5246c4 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 19 Mar 2024 10:40:31 +0100 Subject: [PATCH 32/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../org/apache/camel/catalog/beans.properties | 13 +++ .../beans/CaffeineAggregationRepository.json | 16 +++ .../beans/CaffeineIdempotentRepository.json | 16 +++ .../beans/CassandraAggregationRepository.json | 16 +++ .../beans/EhcacheAggregationRepository.json | 16 +++ .../beans/EhcacheIdempotentRepository.json | 16 +++ .../beans/Etcd3AggregationRepository.json | 16 +++ .../beans/HazelcastAggregationRepository.json | 16 +++ .../beans/HazelcastIdempotentRepository.json | 16 +++ ...finispanEmbeddedAggregationRepository.json | 16 +++ ...nfinispanEmbeddedIdempotentRepository.json | 16 +++ ...InfinispanRemoteAggregationRepository.json | 16 +++ .../InfinispanRemoteIdempotentRepository.json | 16 +++ .../beans/LevelDBAggregationRepository.json | 16 +++ ...ffeineAggregationRepositoryConfigurer.java | 6 - .../bean/CaffeineAggregationRepository.json | 2 +- .../CaffeineAggregationRepository.java | 14 +-- ...hcacheAggregationRepositoryConfigurer.java | 6 - .../bean/EhcacheAggregationRepository.json | 2 +- .../EhcacheAggregationRepository.java | 20 +--- .../bean/Etcd3AggregationRepository.json | 2 +- .../aggregate/Etcd3AggregationRepository.java | 6 +- .../bean/HazelcastAggregationRepository.json | 2 +- .../HazelcastAggregationRepository.java | 6 +- ...licatedHazelcastAggregationRepository.java | 3 + .../InfinispanAggregationRepository.java | 20 +--- ...beddedAggregationRepositoryConfigurer.java | 6 - ...finispanEmbeddedAggregationRepository.json | 2 +- ...finispanEmbeddedAggregationRepository.java | 2 +- ...RemoteAggregationRepositoryConfigurer.java | 6 - ...InfinispanRemoteAggregationRepository.json | 2 +- ...InfinispanRemoteAggregationRepository.java | 2 +- ...evelDBAggregationRepositoryConfigurer.java | 103 ++++++++++++++++++ .../services/org/apache/camel/bean.properties | 7 ++ .../bean/LevelDBAggregationRepository.json | 16 +++ ...onent.leveldb.LevelDBAggregationRepository | 2 + .../leveldb/LevelDBAggregationRepository.java | 33 +++++- .../aggregate/RedisAggregationRepository.java | 40 +++++-- .../jdbc/JdbcAggregationRepository.java | 9 +- 39 files changed, 440 insertions(+), 100 deletions(-) create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineAggregationRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineIdempotentRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraAggregationRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheAggregationRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheIdempotentRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/Etcd3AggregationRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastAggregationRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastIdempotentRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanEmbeddedAggregationRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanEmbeddedIdempotentRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanRemoteAggregationRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanRemoteIdempotentRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/LevelDBAggregationRepository.json create mode 100644 components/camel-leveldb/src/generated/java/org/apache/camel/component/leveldb/LevelDBAggregationRepositoryConfigurer.java create mode 100644 components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean/LevelDBAggregationRepository.json create mode 100644 components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.leveldb.LevelDBAggregationRepository diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties index 23dbb29eb3664..58c811613d162 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties @@ -1,10 +1,23 @@ +CaffeineAggregationRepository +CaffeineIdempotentRepository +CassandraAggregationRepository CassandraIdempotentRepository DefaultHeaderFilterStrategy +EhcacheAggregationRepository +EhcacheIdempotentRepository ElastichsearchBulkRequestAggregationStrategy +Etcd3AggregationRepository FileIdempotentRepository GroupedBodyAggregationStrategy GroupedExchangeAggregationStrategy GroupedMessageAggregationStrategy +HazelcastAggregationRepository +HazelcastIdempotentRepository +InfinispanEmbeddedAggregationRepository +InfinispanEmbeddedIdempotentRepository +InfinispanRemoteAggregationRepository +InfinispanRemoteIdempotentRepository +LevelDBAggregationRepository MemoryAggregationRepository MemoryIdempotentRepository OpensearchBulkRequestAggregationStrategy diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineAggregationRepository.json new file mode 100644 index 0000000000000..0d363487986ed --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "CaffeineAggregationRepository", + "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", + "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "title": "Caffeine Aggregation Repository", + "description": "Aggregation repository that uses Caffeine Cache to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-caffeine", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 2, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 3, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 4, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineIdempotentRepository.json new file mode 100644 index 0000000000000..dfc7548e40084 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "CaffeineIdempotentRepository", + "javaType": "org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Caffeine Idempotent Repository", + "description": "Idempotent repository that uses Caffiene cache to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-caffeine", + "version": "4.5.0-SNAPSHOT", + "properties": { "cacheName": { "index": 0, "kind": "property", "displayName": "Cache Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.idempotent.CaffeineIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CaffeineIdempotentRepository", "description": "Name of cache" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraAggregationRepository.json new file mode 100644 index 0000000000000..bd9516e9eb5ed --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "CassandraAggregationRepository", + "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", + "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "title": "Cassandra Aggregation Repository", + "description": "Aggregation repository that uses Cassandra table to store exchanges. Advice: use LeveledCompaction for this table and tune read\/write consistency levels.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-cassandraql", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "exchangeColumn": { "index": 2, "kind": "property", "displayName": "Exchange Column", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "EXCHANGE", "description": "Column name for Exchange" }, "exchangeIdColumn": { "index": 3, "kind": "property", "displayName": "Exchange Id Column", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "EXCHANGE_ID", "description": "Column name for Exchange ID" }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "pkColumns": { "index": 5, "kind": "property", "displayName": "Primary Key Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "prefixPKValues": { "index": 6, "kind": "property", "displayName": "Prefix Primary Key Values", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "readConsistencyLevel": { "index": 7, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" }, "recoveryInterval": { "index": 8, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "sessionHolder": { "index": 9, "kind": "property", "displayName": "Session Holder", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 10, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_AGGREGATION", "description": "The table name for storing the data" }, "ttl": { "index": 11, "kind": "property", "displayName": "Time to Live", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "useRecovery": { "index": 12, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "writeConsistencyLevel": { "index": 13, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheAggregationRepository.json new file mode 100644 index 0000000000000..3421a8d2be0af --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "EhcacheAggregationRepository", + "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", + "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "title": "Ehcache Aggregation Repository", + "description": "Aggregation repository that uses Caffeine Cache to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-ehcache", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "deadLetterUri": { "index": 2, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 3, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 5, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheIdempotentRepository.json new file mode 100644 index 0000000000000..8cc0d72975663 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "EhcacheIdempotentRepository", + "javaType": "org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Ehcache Idempotent Repository", + "description": "Idempotent repository that uses EHCache cache to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-ehcache", + "version": "4.5.0-SNAPSHOT", + "properties": { "cacheName": { "index": 0, "kind": "property", "displayName": "Cache Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.idempotent.EhcacheIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "EhcacheIdempotentRepository", "description": "Name of cache" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/Etcd3AggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/Etcd3AggregationRepository.json new file mode 100644 index 0000000000000..2b075657c4378 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/Etcd3AggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "Etcd3AggregationRepository", + "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", + "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "title": "Etcd3 Aggregation Repository", + "description": "Aggregation repository that uses Etcd3 to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-etcd3", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "endpoint": { "index": 2, "kind": "property", "displayName": "Endpoint", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "URL to Etcd3 service" }, "maximumRedeliveries": { "index": 3, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "optimistic": { "index": 4, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether or not to use optimistic locking" }, "persistencePrefixName": { "index": 5, "kind": "property", "displayName": "Persistence Prefix Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key for completed exchanges" }, "prefixName": { "index": 6, "kind": "property", "displayName": "Prefix Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key" }, "recoveryInterval": { "index": 7, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 8, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastAggregationRepository.json new file mode 100644 index 0000000000000..5588f59f62960 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "HazelcastAggregationRepository", + "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", + "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "title": "Hazelcast Aggregation Repository", + "description": "Aggregation repository that uses Hazelcast Cache to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-hazelcast", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "hazelcastInstance": { "index": 2, "kind": "property", "displayName": "Hazelcast Instance", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use an existing Hazelcast instance instead of local" }, "mapName": { "index": 3, "kind": "property", "displayName": "Map Name", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use" }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "optimistic": { "index": 5, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" }, "persistenceMapName": { "index": 6, "kind": "property", "displayName": "Persistence Map Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use for completed exchanges" }, "recoveryInterval": { "index": 7, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 8, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastIdempotentRepository.json new file mode 100644 index 0000000000000..3e412d87deb25 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "HazelcastIdempotentRepository", + "javaType": "org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Hazelcast Idempotent Repository", + "description": "Idempotent repository that uses Hazelcast cache to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-hazelcast", + "version": "4.5.0-SNAPSHOT", + "properties": { "hazelcastInstance": { "index": 0, "kind": "property", "displayName": "Hazelcast Instance", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use an existing Hazelcast instance instead of local" }, "repositoryName": { "index": 1, "kind": "property", "displayName": "Repository Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "HazelcastIdempotentRepository", "description": "Name of cache to use" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanEmbeddedAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanEmbeddedAggregationRepository.json new file mode 100644 index 0000000000000..2c671a2eb2be0 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanEmbeddedAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "InfinispanEmbeddedAggregationRepository", + "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Infinispan Embedded Aggregation Repository", + "description": "Aggregation repository that uses embedded Infinispan to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-infinispan-embedded", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 2, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for embedded Infinispan" }, "deadLetterUri": { "index": 3, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 6, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanEmbeddedIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanEmbeddedIdempotentRepository.json new file mode 100644 index 0000000000000..2704dc07f791f --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanEmbeddedIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "InfinispanEmbeddedIdempotentRepository", + "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Infinispan Embedded Idempotent Repository", + "description": "Idempotent repository that uses embedded Infinispan to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-infinispan-embedded", + "version": "4.5.0-SNAPSHOT", + "properties": { "cacheName": { "index": 0, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 1, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for embedded Infinispan" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanRemoteAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanRemoteAggregationRepository.json new file mode 100644 index 0000000000000..66962dcd82493 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanRemoteAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "InfinispanRemoteAggregationRepository", + "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", + "title": "Infinispan Remote Aggregation Repository", + "description": "Aggregation repository that uses remote Infinispan to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-infinispan", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 2, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for remote Infinispan" }, "deadLetterUri": { "index": 3, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 6, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanRemoteIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanRemoteIdempotentRepository.json new file mode 100644 index 0000000000000..b4d7349e455fd --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanRemoteIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "InfinispanRemoteIdempotentRepository", + "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Infinispan Remote Idempotent Repository", + "description": "Idempotent repository that uses remote Infinispan to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-infinispan", + "version": "4.5.0-SNAPSHOT", + "properties": { "cacheName": { "index": 0, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 1, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for remote Infinispan" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/LevelDBAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/LevelDBAggregationRepository.json new file mode 100644 index 0000000000000..59893b87d1d30 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/LevelDBAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "LevelDBAggregationRepository", + "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", + "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "title": "Level DBAggregation Repository", + "description": "Aggregation repository that uses LevelDB to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-leveldb", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 2, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "persistentFileName": { "index": 3, "kind": "property", "displayName": "Persistent File Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of file to use for storing data" }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "repositoryName": { "index": 5, "kind": "property", "displayName": "Repository Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of repository" }, "returnOldExchange": { "index": 6, "kind": "property", "displayName": "Return Old Exchange", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to return the old exchange when adding new exchanges to the repository" }, "serializer": { "index": 7, "kind": "property", "displayName": "Serializer", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom serializer for LevelDB" }, "sync": { "index": 8, "kind": "property", "displayName": "Sync", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether LevelDB should sync writes" }, "useRecovery": { "index": 9, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + diff --git a/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepositoryConfigurer.java b/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepositoryConfigurer.java index 2fff0ace02c19..70defcf6cc430 100644 --- a/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepositoryConfigurer.java +++ b/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepositoryConfigurer.java @@ -23,8 +23,6 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj switch (ignoreCase ? name.toLowerCase() : name) { case "allowserializedheaders": case "AllowSerializedHeaders": target.setAllowSerializedHeaders(property(camelContext, boolean.class, value)); return true; - case "deadletterchannel": - case "DeadLetterChannel": target.setDeadLetterChannel(property(camelContext, java.lang.String.class, value)); return true; case "deadletteruri": case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true; case "maximumredeliveries": @@ -42,8 +40,6 @@ public Class getOptionType(String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { case "allowserializedheaders": case "AllowSerializedHeaders": return boolean.class; - case "deadletterchannel": - case "DeadLetterChannel": return java.lang.String.class; case "deadletteruri": case "DeadLetterUri": return java.lang.String.class; case "maximumredeliveries": @@ -62,8 +58,6 @@ public Object getOptionValue(Object obj, String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { case "allowserializedheaders": case "AllowSerializedHeaders": return target.isAllowSerializedHeaders(); - case "deadletterchannel": - case "DeadLetterChannel": return target.getDeadLetterChannel(); case "deadletteruri": case "DeadLetterUri": return target.getDeadLetterUri(); case "maximumredeliveries": diff --git a/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json index f7dd7e102f330..0d363487986ed 100644 --- a/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json +++ b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-caffeine", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterChannel": { "index": 1, "kind": "property", "displayName": "Dead Letter Channel", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 2, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 3, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 4, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 2, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 3, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 4, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } } } diff --git a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java index 9a1866cc071ea..60388e1b32a32 100644 --- a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java +++ b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java @@ -52,7 +52,7 @@ public class CaffeineAggregationRepository extends ServiceSupport implements Rec @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") - private String deadLetterChannel; + private String deadLetterUri; @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." @@ -86,12 +86,12 @@ public void setAllowSerializedHeaders(boolean allowSerializedHeaders) { @Override public void setDeadLetterUri(String deadLetterUri) { - this.deadLetterChannel = deadLetterUri; + this.deadLetterUri = deadLetterUri; } @Override public String getDeadLetterUri() { - return deadLetterChannel; + return deadLetterUri; } @Override @@ -104,14 +104,6 @@ public void setUseRecovery(boolean useRecovery) { this.useRecovery = useRecovery; } - public String getDeadLetterChannel() { - return deadLetterChannel; - } - - public void setDeadLetterChannel(String deadLetterChannel) { - this.deadLetterChannel = deadLetterChannel; - } - public long getRecoveryInterval() { return recoveryInterval; } diff --git a/components/camel-ehcache/src/generated/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepositoryConfigurer.java b/components/camel-ehcache/src/generated/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepositoryConfigurer.java index 014bafed98309..34192f864aaab 100644 --- a/components/camel-ehcache/src/generated/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepositoryConfigurer.java +++ b/components/camel-ehcache/src/generated/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepositoryConfigurer.java @@ -25,8 +25,6 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj case "AllowSerializedHeaders": target.setAllowSerializedHeaders(property(camelContext, boolean.class, value)); return true; case "cachename": case "CacheName": target.setCacheName(property(camelContext, java.lang.String.class, value)); return true; - case "deadletterchannel": - case "DeadLetterChannel": target.setDeadLetterChannel(property(camelContext, java.lang.String.class, value)); return true; case "deadletteruri": case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true; case "maximumredeliveries": @@ -46,8 +44,6 @@ public Class getOptionType(String name, boolean ignoreCase) { case "AllowSerializedHeaders": return boolean.class; case "cachename": case "CacheName": return java.lang.String.class; - case "deadletterchannel": - case "DeadLetterChannel": return java.lang.String.class; case "deadletteruri": case "DeadLetterUri": return java.lang.String.class; case "maximumredeliveries": @@ -68,8 +64,6 @@ public Object getOptionValue(Object obj, String name, boolean ignoreCase) { case "AllowSerializedHeaders": return target.isAllowSerializedHeaders(); case "cachename": case "CacheName": return target.getCacheName(); - case "deadletterchannel": - case "DeadLetterChannel": return target.getDeadLetterChannel(); case "deadletteruri": case "DeadLetterUri": return target.getDeadLetterUri(); case "maximumredeliveries": diff --git a/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json index aae8ce1f6e2ee..3421a8d2be0af 100644 --- a/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json +++ b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-ehcache", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "deadLetterChannel": { "index": 2, "kind": "property", "displayName": "Dead Letter Channel", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 3, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 5, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "deadLetterUri": { "index": 2, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 3, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 5, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } } } diff --git a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepository.java b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepository.java index 3786c39612d40..8fb1a80c8193b 100644 --- a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepository.java +++ b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/aggregate/EhcacheAggregationRepository.java @@ -57,7 +57,7 @@ public class EhcacheAggregationRepository extends ServiceSupport implements Reco @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") - private String deadLetterChannel; + private String deadLetterUri; @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." @@ -105,16 +105,6 @@ public void setAllowSerializedHeaders(boolean allowSerializedHeaders) { this.allowSerializedHeaders = allowSerializedHeaders; } - @Override - public void setDeadLetterUri(String deadLetterUri) { - this.deadLetterChannel = deadLetterUri; - } - - @Override - public String getDeadLetterUri() { - return deadLetterChannel; - } - @Override public boolean isUseRecovery() { return useRecovery; @@ -125,12 +115,12 @@ public void setUseRecovery(boolean useRecovery) { this.useRecovery = useRecovery; } - public String getDeadLetterChannel() { - return deadLetterChannel; + public String getDeadLetterUri() { + return deadLetterUri; } - public void setDeadLetterChannel(String deadLetterChannel) { - this.deadLetterChannel = deadLetterChannel; + public void setDeadLetterUri(String deadLetterUri) { + this.deadLetterUri = deadLetterUri; } public long getRecoveryInterval() { diff --git a/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json b/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json index c5bb9368b5b77..2b075657c4378 100644 --- a/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json +++ b/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-etcd3", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterChannel": { "index": 1, "kind": "property", "displayName": "Dead Letter Channel", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "endpoint": { "index": 2, "kind": "property", "displayName": "Endpoint", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "URL to Etcd3 service" }, "maximumRedeliveries": { "index": 3, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "optimistic": { "index": 4, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether or not to use optimistic locking" }, "persistencePrefixName": { "index": 5, "kind": "property", "displayName": "Persistence Prefix Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key for completed exchanges" }, "prefixName": { "index": 6, "kind": "property", "displayName": "Prefix Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key" }, "recoveryInterval": { "index": 7, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 8, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "endpoint": { "index": 2, "kind": "property", "displayName": "Endpoint", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "URL to Etcd3 service" }, "maximumRedeliveries": { "index": 3, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "optimistic": { "index": 4, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether or not to use optimistic locking" }, "persistencePrefixName": { "index": 5, "kind": "property", "displayName": "Persistence Prefix Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key for completed exchanges" }, "prefixName": { "index": 6, "kind": "property", "displayName": "Prefix Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key" }, "recoveryInterval": { "index": 7, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 8, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } } } diff --git a/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java b/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java index c6fcd6819bf1e..2333e034f971a 100644 --- a/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java +++ b/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java @@ -81,7 +81,7 @@ public class Etcd3AggregationRepository extends ServiceSupport @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") - private String deadLetterChannel; + private String deadLetterUri; @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." @@ -293,12 +293,12 @@ public boolean isUseRecovery() { @Override public void setDeadLetterUri(String deadLetterUri) { - this.deadLetterChannel = deadLetterUri; + this.deadLetterUri = deadLetterUri; } @Override public String getDeadLetterUri() { - return deadLetterChannel; + return deadLetterUri; } @Override diff --git a/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json index 272e472166cca..5588f59f62960 100644 --- a/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json +++ b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-hazelcast", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterChannel": { "index": 1, "kind": "property", "displayName": "Dead Letter Channel", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "hazelcastInstance": { "index": 2, "kind": "property", "displayName": "Hazelcast Instance", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use an existing Hazelcast instance instead of local" }, "mapName": { "index": 3, "kind": "property", "displayName": "Map Name", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use" }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "optimistic": { "index": 5, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" }, "persistenceMapName": { "index": 6, "kind": "property", "displayName": "Persistence Map Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use for completed exchanges" }, "recoveryInterval": { "index": 7, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 8, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "hazelcastInstance": { "index": 2, "kind": "property", "displayName": "Hazelcast Instance", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use an existing Hazelcast instance instead of local" }, "mapName": { "index": 3, "kind": "property", "displayName": "Map Name", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use" }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "optimistic": { "index": 5, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" }, "persistenceMapName": { "index": 6, "kind": "property", "displayName": "Persistence Map Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use for completed exchanges" }, "recoveryInterval": { "index": 7, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 8, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } } } diff --git a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepository.java b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepository.java index 40a67354ba076..3347bd57003e4 100644 --- a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepository.java +++ b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepository.java @@ -80,7 +80,7 @@ public class HazelcastAggregationRepository extends ServiceSupport @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") protected boolean useRecovery = true; @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") - protected String deadLetterChannel; + protected String deadLetterUri; @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") protected long recoveryInterval = 5000; @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." @@ -293,12 +293,12 @@ public boolean isUseRecovery() { @Override public void setDeadLetterUri(String deadLetterUri) { - this.deadLetterChannel = deadLetterUri; + this.deadLetterUri = deadLetterUri; } @Override public String getDeadLetterUri() { - return deadLetterChannel; + return deadLetterUri; } @Override diff --git a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/ReplicatedHazelcastAggregationRepository.java b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/ReplicatedHazelcastAggregationRepository.java index 443ff91fddeec..fc83d30c9c9b7 100644 --- a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/ReplicatedHazelcastAggregationRepository.java +++ b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/ReplicatedHazelcastAggregationRepository.java @@ -56,6 +56,9 @@ public class ReplicatedHazelcastAggregationRepository extends HazelcastAggregati protected Map replicatedCache; protected Map replicatedPersistedCache; + public ReplicatedHazelcastAggregationRepository() { + } + /** * Creates new {@link ReplicatedHazelcastAggregationRepository} that defaults to non-optimistic locking with * recoverable behavior and a local Hazelcast instance. Recoverable repository name defaults to diff --git a/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanAggregationRepository.java b/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanAggregationRepository.java index 989309fe58736..5d6e783ec580d 100644 --- a/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanAggregationRepository.java +++ b/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanAggregationRepository.java @@ -46,7 +46,7 @@ public abstract class InfinispanAggregationRepository @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") - private String deadLetterChannel; + private String deadLetterUri; @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." @@ -153,16 +153,6 @@ public void setUseRecovery(boolean useRecovery) { this.useRecovery = useRecovery; } - @Override - public String getDeadLetterUri() { - return deadLetterChannel; - } - - @Override - public void setDeadLetterUri(String deadLetterUri) { - this.deadLetterChannel = deadLetterUri; - } - @Override public int getMaximumRedeliveries() { return maximumRedeliveries; @@ -197,12 +187,12 @@ public String getCacheName() { return cacheName; } - public String getDeadLetterChannel() { - return deadLetterChannel; + public String getDeadLetterUri() { + return deadLetterUri; } - public void setDeadLetterChannel(String deadLetterChannel) { - this.deadLetterChannel = deadLetterChannel; + public void setDeadLetterUri(String deadLetterUri) { + this.deadLetterUri = deadLetterUri; } public boolean isAllowSerializedHeaders() { diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/generated/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepositoryConfigurer.java b/components/camel-infinispan/camel-infinispan-embedded/src/generated/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepositoryConfigurer.java index 77ce9f8ad8baf..a16e2a9b2b7ca 100644 --- a/components/camel-infinispan/camel-infinispan-embedded/src/generated/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepositoryConfigurer.java +++ b/components/camel-infinispan/camel-infinispan-embedded/src/generated/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepositoryConfigurer.java @@ -27,8 +27,6 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj case "CacheName": target.setCacheName(property(camelContext, java.lang.String.class, value)); return true; case "configuration": case "Configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedConfiguration.class, value)); return true; - case "deadletterchannel": - case "DeadLetterChannel": target.setDeadLetterChannel(property(camelContext, java.lang.String.class, value)); return true; case "deadletteruri": case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true; case "maximumredeliveries": @@ -50,8 +48,6 @@ public Class getOptionType(String name, boolean ignoreCase) { case "CacheName": return java.lang.String.class; case "configuration": case "Configuration": return org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedConfiguration.class; - case "deadletterchannel": - case "DeadLetterChannel": return java.lang.String.class; case "deadletteruri": case "DeadLetterUri": return java.lang.String.class; case "maximumredeliveries": @@ -74,8 +70,6 @@ public Object getOptionValue(Object obj, String name, boolean ignoreCase) { case "CacheName": return target.getCacheName(); case "configuration": case "Configuration": return target.getConfiguration(); - case "deadletterchannel": - case "DeadLetterChannel": return target.getDeadLetterChannel(); case "deadletteruri": case "DeadLetterUri": return target.getDeadLetterUri(); case "maximumredeliveries": diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedAggregationRepository.json b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedAggregationRepository.json index de3d04beb5f9d..2c671a2eb2be0 100644 --- a/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedAggregationRepository.json +++ b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-infinispan-embedded", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 2, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for embedded Infinispan" }, "deadLetterChannel": { "index": 3, "kind": "property", "displayName": "Dead Letter Channel", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 6, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 2, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for embedded Infinispan" }, "deadLetterUri": { "index": 3, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 6, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } } } diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java b/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java index 975a67a0401a2..0308fd6886a87 100644 --- a/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java +++ b/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java @@ -45,7 +45,7 @@ public class InfinispanEmbeddedAggregationRepository extends InfinispanAggregati @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") - private String deadLetterChannel; + private String deadLetterUri; @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." diff --git a/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepositoryConfigurer.java b/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepositoryConfigurer.java index aee15208c8313..4f84c29643ab4 100644 --- a/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepositoryConfigurer.java +++ b/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepositoryConfigurer.java @@ -27,8 +27,6 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj case "CacheName": target.setCacheName(property(camelContext, java.lang.String.class, value)); return true; case "configuration": case "Configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration.class, value)); return true; - case "deadletterchannel": - case "DeadLetterChannel": target.setDeadLetterChannel(property(camelContext, java.lang.String.class, value)); return true; case "deadletteruri": case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true; case "maximumredeliveries": @@ -50,8 +48,6 @@ public Class getOptionType(String name, boolean ignoreCase) { case "CacheName": return java.lang.String.class; case "configuration": case "Configuration": return org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration.class; - case "deadletterchannel": - case "DeadLetterChannel": return java.lang.String.class; case "deadletteruri": case "DeadLetterUri": return java.lang.String.class; case "maximumredeliveries": @@ -74,8 +70,6 @@ public Object getOptionValue(Object obj, String name, boolean ignoreCase) { case "CacheName": return target.getCacheName(); case "configuration": case "Configuration": return target.getConfiguration(); - case "deadletterchannel": - case "DeadLetterChannel": return target.getDeadLetterChannel(); case "deadletteruri": case "DeadLetterUri": return target.getDeadLetterUri(); case "maximumredeliveries": diff --git a/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteAggregationRepository.json b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteAggregationRepository.json index 44a8c587fdc6a..66962dcd82493 100644 --- a/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteAggregationRepository.json +++ b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-infinispan", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 2, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for remote Infinispan" }, "deadLetterChannel": { "index": 3, "kind": "property", "displayName": "Dead Letter Channel", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 6, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 2, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for remote Infinispan" }, "deadLetterUri": { "index": 3, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 6, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } } } diff --git a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java index 3a30026d735d7..e9ca86c877698 100644 --- a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java +++ b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java @@ -47,7 +47,7 @@ public class InfinispanRemoteAggregationRepository extends InfinispanAggregation @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") - private String deadLetterChannel; + private String deadLetterUri; @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." diff --git a/components/camel-leveldb/src/generated/java/org/apache/camel/component/leveldb/LevelDBAggregationRepositoryConfigurer.java b/components/camel-leveldb/src/generated/java/org/apache/camel/component/leveldb/LevelDBAggregationRepositoryConfigurer.java new file mode 100644 index 0000000000000..4cabaaba87bdc --- /dev/null +++ b/components/camel-leveldb/src/generated/java/org/apache/camel/component/leveldb/LevelDBAggregationRepositoryConfigurer.java @@ -0,0 +1,103 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.leveldb; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.leveldb.LevelDBAggregationRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class LevelDBAggregationRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.leveldb.LevelDBAggregationRepository target = (org.apache.camel.component.leveldb.LevelDBAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": target.setAllowSerializedHeaders(property(camelContext, boolean.class, value)); return true; + case "deadletteruri": + case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true; + case "maximumredeliveries": + case "MaximumRedeliveries": target.setMaximumRedeliveries(property(camelContext, int.class, value)); return true; + case "persistentfilename": + case "PersistentFileName": target.setPersistentFileName(property(camelContext, java.lang.String.class, value)); return true; + case "recoveryinterval": + case "RecoveryInterval": target.setRecoveryInterval(property(camelContext, long.class, value)); return true; + case "repositoryname": + case "RepositoryName": target.setRepositoryName(property(camelContext, java.lang.String.class, value)); return true; + case "returnoldexchange": + case "ReturnOldExchange": target.setReturnOldExchange(property(camelContext, boolean.class, value)); return true; + case "serializer": + case "Serializer": target.setSerializer(property(camelContext, org.apache.camel.component.leveldb.LevelDBSerializer.class, value)); return true; + case "sync": + case "Sync": target.setSync(property(camelContext, boolean.class, value)); return true; + case "userecovery": + case "UseRecovery": target.setUseRecovery(property(camelContext, boolean.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return boolean.class; + case "deadletteruri": + case "DeadLetterUri": return java.lang.String.class; + case "maximumredeliveries": + case "MaximumRedeliveries": return int.class; + case "persistentfilename": + case "PersistentFileName": return java.lang.String.class; + case "recoveryinterval": + case "RecoveryInterval": return long.class; + case "repositoryname": + case "RepositoryName": return java.lang.String.class; + case "returnoldexchange": + case "ReturnOldExchange": return boolean.class; + case "serializer": + case "Serializer": return org.apache.camel.component.leveldb.LevelDBSerializer.class; + case "sync": + case "Sync": return boolean.class; + case "userecovery": + case "UseRecovery": return boolean.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.leveldb.LevelDBAggregationRepository target = (org.apache.camel.component.leveldb.LevelDBAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return target.isAllowSerializedHeaders(); + case "deadletteruri": + case "DeadLetterUri": return target.getDeadLetterUri(); + case "maximumredeliveries": + case "MaximumRedeliveries": return target.getMaximumRedeliveries(); + case "persistentfilename": + case "PersistentFileName": return target.getPersistentFileName(); + case "recoveryinterval": + case "RecoveryInterval": return target.getRecoveryInterval(); + case "repositoryname": + case "RepositoryName": return target.getRepositoryName(); + case "returnoldexchange": + case "ReturnOldExchange": return target.isReturnOldExchange(); + case "serializer": + case "Serializer": return target.getSerializer(); + case "sync": + case "Sync": return target.isSync(); + case "userecovery": + case "UseRecovery": return target.isUseRecovery(); + default: return null; + } + } +} + diff --git a/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..6937dba2de8f0 --- /dev/null +++ b/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=LevelDBAggregationRepository +groupId=org.apache.camel +artifactId=camel-leveldb +version=4.5.0-SNAPSHOT +projectName=Camel :: LevelDB +projectDescription=Using LevelDB as persistent EIP store diff --git a/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean/LevelDBAggregationRepository.json b/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean/LevelDBAggregationRepository.json new file mode 100644 index 0000000000000..59893b87d1d30 --- /dev/null +++ b/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean/LevelDBAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "LevelDBAggregationRepository", + "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", + "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "title": "Level DBAggregation Repository", + "description": "Aggregation repository that uses LevelDB to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-leveldb", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 2, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "persistentFileName": { "index": 3, "kind": "property", "displayName": "Persistent File Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of file to use for storing data" }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "repositoryName": { "index": 5, "kind": "property", "displayName": "Repository Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of repository" }, "returnOldExchange": { "index": 6, "kind": "property", "displayName": "Return Old Exchange", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to return the old exchange when adding new exchanges to the repository" }, "serializer": { "index": 7, "kind": "property", "displayName": "Serializer", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom serializer for LevelDB" }, "sync": { "index": 8, "kind": "property", "displayName": "Sync", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether LevelDB should sync writes" }, "useRecovery": { "index": 9, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + diff --git a/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.leveldb.LevelDBAggregationRepository b/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.leveldb.LevelDBAggregationRepository new file mode 100644 index 0000000000000..d1425716ce463 --- /dev/null +++ b/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.leveldb.LevelDBAggregationRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.leveldb.LevelDBAggregationRepositoryConfigurer diff --git a/components/camel-leveldb/src/main/java/org/apache/camel/component/leveldb/LevelDBAggregationRepository.java b/components/camel-leveldb/src/main/java/org/apache/camel/component/leveldb/LevelDBAggregationRepository.java index c4643b63d1d06..20bfb3e86f199 100644 --- a/components/camel-leveldb/src/main/java/org/apache/camel/component/leveldb/LevelDBAggregationRepository.java +++ b/components/camel-leveldb/src/main/java/org/apache/camel/component/leveldb/LevelDBAggregationRepository.java @@ -26,6 +26,8 @@ import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.RuntimeCamelException; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; import org.apache.camel.spi.RecoverableAggregationRepository; import org.apache.camel.support.service.ServiceHelper; import org.apache.camel.support.service.ServiceSupport; @@ -40,21 +42,40 @@ /** * An instance of {@link org.apache.camel.spi.AggregationRepository} which is backed by a {@link LevelDBFile}. */ +@Metadata(label = "bean", + description = "Aggregation repository that uses LevelDB to store exchanges.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) +@Configurer(metadataOnly = true) public class LevelDBAggregationRepository extends ServiceSupport implements RecoverableAggregationRepository { private static final Logger LOG = LoggerFactory.getLogger(LevelDBAggregationRepository.class); private LevelDBFile levelDBFile; + private LevelDBCamelCodec codec; + + @Metadata(description = "Name of file to use for storing data", required = true) private String persistentFileName; + @Metadata(description = "Name of repository", required = true) private String repositoryName; + @Metadata(description = "Whether LevelDB should sync writes") private boolean sync; + @Metadata(label = "advanced", + description = "Whether to return the old exchange when adding new exchanges to the repository") private boolean returnOldExchange; - private LevelDBCamelCodec codec; - private long recoveryInterval = 5000; + @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; + @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") + private long recoveryInterval = 5000; + @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." + + " When this limit is hit, then the Exchange is moved to the dead letter channel.") private int maximumRedeliveries; + @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") private String deadLetterUri; + @Metadata(label = "advanced", + description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") private boolean allowSerializedHeaders; + @Metadata(label = "advanced", + description = "To use a custom serializer for LevelDB") private LevelDBSerializer serializer; /** @@ -361,13 +382,13 @@ public void setRecoveryInterval(long interval, TimeUnit timeUnit) { } @Override - public void setRecoveryInterval(long interval) { - this.recoveryInterval = interval; + public long getRecoveryInterval() { + return recoveryInterval; } @Override - public long getRecoveryIntervalInMillis() { - return recoveryInterval; + public void setRecoveryInterval(long interval) { + this.recoveryInterval = interval; } @Override diff --git a/components/camel-redis/src/main/java/org/apache/camel/component/redis/processor/aggregate/RedisAggregationRepository.java b/components/camel-redis/src/main/java/org/apache/camel/component/redis/processor/aggregate/RedisAggregationRepository.java index c8e536c5846f1..8ebd1c0a23395 100644 --- a/components/camel-redis/src/main/java/org/apache/camel/component/redis/processor/aggregate/RedisAggregationRepository.java +++ b/components/camel-redis/src/main/java/org/apache/camel/component/redis/processor/aggregate/RedisAggregationRepository.java @@ -23,6 +23,7 @@ import org.apache.camel.CamelContext; import org.apache.camel.Exchange; +import org.apache.camel.spi.Metadata; import org.apache.camel.spi.OptimisticLockingAggregationRepository; import org.apache.camel.spi.RecoverableAggregationRepository; import org.apache.camel.support.DefaultExchange; @@ -47,18 +48,32 @@ public class RedisAggregationRepository extends ServiceSupport private static final Logger LOG = LoggerFactory.getLogger(RedisAggregationRepository.class); private static final String COMPLETED_SUFFIX = "-completed"; - private boolean optimistic; - private boolean useRecovery = true; private Map cache; private Map persistedCache; + private boolean shutdownRedisson; + + @Metadata(label = "advanced", description = "To use an existing Redis client to connect to Redis server") + private RedissonClient redisson; + @Metadata(description = "URL to remote Redis server", required = true) private String endpoint; + @Metadata(description = "Name of cache to use", required = true) private String mapName; + @Metadata(label = "advanced", description = "Name of cache to use for completed exchanges") private String persistenceMapName; - private RedissonClient redisson; - private boolean shutdownRedisson; - private String deadLetterChannel; + @Metadata(description = "Whether optimistic locking is in use") + private boolean optimistic; + @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") + private boolean useRecovery = true; + @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") + private String deadLetterUri; + @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; + @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." + + " When this limit is hit, then the Exchange is moved to the dead letter channel.", + defaultValue = "3") private int maximumRedeliveries = 3; + @Metadata(label = "advanced", + description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") private boolean allowSerializedHeaders; public RedisAggregationRepository() { @@ -206,13 +221,13 @@ public void setRecoveryInterval(long interval, TimeUnit timeUnit) { } @Override - public void setRecoveryInterval(long interval) { - this.recoveryInterval = interval; + public long getRecoveryInterval() { + return recoveryInterval; } @Override - public long getRecoveryIntervalInMillis() { - return recoveryInterval; + public void setRecoveryInterval(long interval) { + this.recoveryInterval = interval; } @Override @@ -227,12 +242,12 @@ public boolean isUseRecovery() { @Override public void setDeadLetterUri(String deadLetterUri) { - this.deadLetterChannel = deadLetterUri; + this.deadLetterUri = deadLetterUri; } @Override public String getDeadLetterUri() { - return deadLetterChannel; + return deadLetterUri; } @Override @@ -355,6 +370,9 @@ protected void doInit() throws Exception { @Override protected void doStart() throws Exception { + if (persistenceMapName == null) { + persistenceMapName = String.format("%s%s", mapName, COMPLETED_SUFFIX); + } if (redisson == null) { Config config = new Config(); config.useSingleServer().setAddress(String.format("redis://%s", endpoint)); diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java index e016df4537608..d44ce89408e91 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java +++ b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java @@ -465,14 +465,15 @@ public void setRecoveryInterval(long interval, TimeUnit timeUnit) { this.recoveryInterval = timeUnit.toMillis(interval); } + @Override - public void setRecoveryInterval(long interval) { - this.recoveryInterval = interval; + public long getRecoveryInterval() { + return recoveryInterval; } @Override - public long getRecoveryIntervalInMillis() { - return recoveryInterval; + public void setRecoveryInterval(long interval) { + this.recoveryInterval = interval; } @Override From a8529477c9466ff4ca4e007680d7ba689408d31a Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 19 Mar 2024 10:42:42 +0100 Subject: [PATCH 33/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../processor/aggregate/jdbc/JdbcAggregationRepository.java | 1 - 1 file changed, 1 deletion(-) diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java index d44ce89408e91..0d6653db46c0c 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java +++ b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java @@ -465,7 +465,6 @@ public void setRecoveryInterval(long interval, TimeUnit timeUnit) { this.recoveryInterval = timeUnit.toMillis(interval); } - @Override public long getRecoveryInterval() { return recoveryInterval; From 282a682695143cde0f0871437035d273115367c8 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 19 Mar 2024 10:51:30 +0100 Subject: [PATCH 34/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../org/apache/camel/catalog/beans.properties | 2 + .../beans/JCacheAggregationRepository.json | 16 +++++ .../beans/JCacheIdempotentRepository.json | 16 +++++ .../camel/catalog/components/jcache.json | 36 +++++----- ...JCacheAggregationRepositoryConfigurer.java | 67 +++++++++++++++++++ .../JCacheIdempotentRepositoryConfigurer.java | 55 +++++++++++++++ .../apache/camel/component/jcache/jcache.json | 36 +++++----- .../services/org/apache/camel/bean.properties | 7 ++ .../bean/JCacheAggregationRepository.json | 16 +++++ .../bean/JCacheIdempotentRepository.json | 16 +++++ ...ssor.aggregate.JCacheAggregationRepository | 2 + ...ssor.idempotent.JCacheIdempotentRepository | 2 + .../component/jcache/JCacheConfiguration.java | 21 +----- .../JCacheAggregationRepository.java | 15 ++++- .../JCacheIdempotentRepository.java | 14 +++- 15 files changed, 262 insertions(+), 59 deletions(-) create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheAggregationRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheIdempotentRepository.json create mode 100644 components/camel-jcache/src/generated/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryConfigurer.java create mode 100644 components/camel-jcache/src/generated/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepositoryConfigurer.java create mode 100644 components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheAggregationRepository.json create mode 100644 components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheIdempotentRepository.json create mode 100644 components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository create mode 100644 components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties index 58c811613d162..2d3b60eb577f9 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties @@ -17,6 +17,8 @@ InfinispanEmbeddedAggregationRepository InfinispanEmbeddedIdempotentRepository InfinispanRemoteAggregationRepository InfinispanRemoteIdempotentRepository +JCacheAggregationRepository +JCacheIdempotentRepository LevelDBAggregationRepository MemoryAggregationRepository MemoryIdempotentRepository diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheAggregationRepository.json new file mode 100644 index 0000000000000..5a5b2eddaaede --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "JCacheAggregationRepository", + "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", + "interfaceType": "org.apache.camel.CamelContextAware", + "title": "JCache Aggregation Repository", + "description": "Aggregation repository that uses JCache to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-jcache", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "configuration": { "index": 1, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for JCache" }, "optimistic": { "index": 2, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether optimistic locking is in use" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheIdempotentRepository.json new file mode 100644 index 0000000000000..8337b15a5aee7 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "JCacheIdempotentRepository", + "javaType": "org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository", + "interfaceType": "org.apache.camel.CamelContextAware", + "title": "JCache Idempotent Repository", + "description": "Idempotent repository that uses JCache to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-jcache", + "version": "4.5.0-SNAPSHOT", + "properties": { "configuration": { "index": 0, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for JCache" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jcache.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jcache.json index 6a82e6806d9e1..5e8f5ff9eb248 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jcache.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jcache.json @@ -44,24 +44,24 @@ }, "properties": { "cacheName": { "index": 0, "kind": "path", "displayName": "Cache Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the cache" }, - "cacheConfiguration": { "index": 1, "kind": "parameter", "displayName": "Cache Configuration", "group": "common", "label": "", "required": false, "type": "object", "javaType": "javax.cache.configuration.Configuration", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "A Configuration for the Cache" }, - "cacheConfigurationProperties": { "index": 2, "kind": "parameter", "displayName": "Cache Configuration Properties", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Properties", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The Properties for the javax.cache.spi.CachingProvider to create the CacheManager" }, - "cachingProvider": { "index": 3, "kind": "parameter", "displayName": "Caching Provider", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The fully qualified class name of the javax.cache.spi.CachingProvider" }, - "configurationUri": { "index": 4, "kind": "parameter", "displayName": "Configuration Uri", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "An implementation specific URI for the CacheManager" }, - "managementEnabled": { "index": 5, "kind": "parameter", "displayName": "Management Enabled", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "Whether management gathering is enabled" }, - "readThrough": { "index": 6, "kind": "parameter", "displayName": "Read Through", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "If read-through caching should be used" }, - "statisticsEnabled": { "index": 7, "kind": "parameter", "displayName": "Statistics Enabled", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "Whether statistics gathering is enabled" }, - "storeByValue": { "index": 8, "kind": "parameter", "displayName": "Store By Value", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "If cache should use store-by-value or store-by-reference semantics" }, - "writeThrough": { "index": 9, "kind": "parameter", "displayName": "Write Through", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "If write-through caching should be used" }, - "filteredEvents": { "index": 10, "kind": "parameter", "displayName": "Filtered Events", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "CREATED", "UPDATED", "REMOVED", "EXPIRED" ], "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "Events a consumer should filter (multiple events can be separated by comma). If using filteredEvents option, then eventFilters one will be ignored" }, - "oldValueRequired": { "index": 11, "kind": "parameter", "displayName": "Old Value Required", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "if the old value is required for events" }, - "synchronous": { "index": 12, "kind": "parameter", "displayName": "Synchronous", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "if the event listener should block the thread causing the event" }, - "bridgeErrorHandler": { "index": 13, "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 messages, or the likes, will now be processed as a message and handled by the routing Error Handler. Important: This is only possible if the 3rd party component allows Camel to be alerted if an exception was thrown. Some components handle this internally only, and therefore bridgeErrorHandler is not possible. In other situations we may improve the Camel component to hook into the 3rd party component and make this possible for future releases. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored." }, - "eventFilters": { "index": 14, "kind": "parameter", "displayName": "Event Filters", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The CacheEntryEventFilter. If using eventFilters option, then filteredEvents one will be ignored" }, - "exceptionHandler": { "index": 15, "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 default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored." }, - "exchangePattern": { "index": 16, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "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." }, - "action": { "index": 17, "kind": "parameter", "displayName": "Action", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "To configure using a cache operation by default. If an operation in the message header, then the operation from the header takes precedence." }, - "lazyStartProducer": { "index": 18, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing." }, + "cacheConfigurationProperties": { "index": 1, "kind": "parameter", "displayName": "Cache Configuration Properties", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Properties", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The Properties for the javax.cache.spi.CachingProvider to create the CacheManager" }, + "cachingProvider": { "index": 2, "kind": "parameter", "displayName": "Caching Provider", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The fully qualified class name of the javax.cache.spi.CachingProvider" }, + "configurationUri": { "index": 3, "kind": "parameter", "displayName": "Configuration Uri", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "An implementation specific URI for the CacheManager" }, + "managementEnabled": { "index": 4, "kind": "parameter", "displayName": "Management Enabled", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "Whether management gathering is enabled" }, + "readThrough": { "index": 5, "kind": "parameter", "displayName": "Read Through", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "If read-through caching should be used" }, + "statisticsEnabled": { "index": 6, "kind": "parameter", "displayName": "Statistics Enabled", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "Whether statistics gathering is enabled" }, + "storeByValue": { "index": 7, "kind": "parameter", "displayName": "Store By Value", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "If cache should use store-by-value or store-by-reference semantics" }, + "writeThrough": { "index": 8, "kind": "parameter", "displayName": "Write Through", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "If write-through caching should be used" }, + "filteredEvents": { "index": 9, "kind": "parameter", "displayName": "Filtered Events", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "CREATED", "UPDATED", "REMOVED", "EXPIRED" ], "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "Events a consumer should filter (multiple events can be separated by comma). If using filteredEvents option, then eventFilters one will be ignored" }, + "oldValueRequired": { "index": 10, "kind": "parameter", "displayName": "Old Value Required", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "if the old value is required for events" }, + "synchronous": { "index": 11, "kind": "parameter", "displayName": "Synchronous", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "if the event listener should block the thread causing the event" }, + "bridgeErrorHandler": { "index": 12, "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 messages, or the likes, will now be processed as a message and handled by the routing Error Handler. Important: This is only possible if the 3rd party component allows Camel to be alerted if an exception was thrown. Some components handle this internally only, and therefore bridgeErrorHandler is not possible. In other situations we may improve the Camel component to hook into the 3rd party component and make this possible for future releases. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored." }, + "eventFilters": { "index": 13, "kind": "parameter", "displayName": "Event Filters", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The CacheEntryEventFilter. If using eventFilters option, then filteredEvents one will be ignored" }, + "exceptionHandler": { "index": 14, "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 default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored." }, + "exchangePattern": { "index": 15, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "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." }, + "action": { "index": 16, "kind": "parameter", "displayName": "Action", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "To configure using a cache operation by default. If an operation in the message header, then the operation from the header takes precedence." }, + "lazyStartProducer": { "index": 17, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing." }, + "cacheConfiguration": { "index": 18, "kind": "parameter", "displayName": "Cache Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "javax.cache.configuration.Configuration", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "A Configuration for the Cache" }, "cacheLoaderFactory": { "index": 19, "kind": "parameter", "displayName": "Cache Loader Factory", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "javax.cache.configuration.Factory", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The CacheLoader factory" }, "cacheWriterFactory": { "index": 20, "kind": "parameter", "displayName": "Cache Writer Factory", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "javax.cache.configuration.Factory", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The CacheWriter factory" }, "createCacheIfNotExists": { "index": 21, "kind": "parameter", "displayName": "Create Cache If Not Exists", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "Configure if a cache need to be created if it does exist or can't be pre-configured." }, diff --git a/components/camel-jcache/src/generated/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryConfigurer.java b/components/camel-jcache/src/generated/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryConfigurer.java new file mode 100644 index 0000000000000..8cf4acbe24125 --- /dev/null +++ b/components/camel-jcache/src/generated/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryConfigurer.java @@ -0,0 +1,67 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.jcache.processor.aggregate; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class JCacheAggregationRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository target = (org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": target.setAllowSerializedHeaders(property(camelContext, boolean.class, value)); return true; + case "cachename": + case "CacheName": target.setCacheName(property(camelContext, java.lang.String.class, value)); return true; + case "configuration": + case "Configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.jcache.JCacheConfiguration.class, value)); return true; + case "optimistic": + case "Optimistic": target.setOptimistic(property(camelContext, boolean.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return boolean.class; + case "cachename": + case "CacheName": return java.lang.String.class; + case "configuration": + case "Configuration": return org.apache.camel.component.jcache.JCacheConfiguration.class; + case "optimistic": + case "Optimistic": return boolean.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository target = (org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return target.isAllowSerializedHeaders(); + case "cachename": + case "CacheName": return target.getCacheName(); + case "configuration": + case "Configuration": return target.getConfiguration(); + case "optimistic": + case "Optimistic": return target.isOptimistic(); + default: return null; + } + } +} + diff --git a/components/camel-jcache/src/generated/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepositoryConfigurer.java b/components/camel-jcache/src/generated/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepositoryConfigurer.java new file mode 100644 index 0000000000000..3a5ea2b0d2203 --- /dev/null +++ b/components/camel-jcache/src/generated/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepositoryConfigurer.java @@ -0,0 +1,55 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.jcache.processor.idempotent; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class JCacheIdempotentRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository target = (org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachename": + case "CacheName": target.setCacheName(property(camelContext, java.lang.String.class, value)); return true; + case "configuration": + case "Configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.jcache.JCacheConfiguration.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachename": + case "CacheName": return java.lang.String.class; + case "configuration": + case "Configuration": return org.apache.camel.component.jcache.JCacheConfiguration.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository target = (org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "cachename": + case "CacheName": return target.getCacheName(); + case "configuration": + case "Configuration": return target.getConfiguration(); + default: return null; + } + } +} + diff --git a/components/camel-jcache/src/generated/resources/META-INF/org/apache/camel/component/jcache/jcache.json b/components/camel-jcache/src/generated/resources/META-INF/org/apache/camel/component/jcache/jcache.json index 6a82e6806d9e1..5e8f5ff9eb248 100644 --- a/components/camel-jcache/src/generated/resources/META-INF/org/apache/camel/component/jcache/jcache.json +++ b/components/camel-jcache/src/generated/resources/META-INF/org/apache/camel/component/jcache/jcache.json @@ -44,24 +44,24 @@ }, "properties": { "cacheName": { "index": 0, "kind": "path", "displayName": "Cache Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the cache" }, - "cacheConfiguration": { "index": 1, "kind": "parameter", "displayName": "Cache Configuration", "group": "common", "label": "", "required": false, "type": "object", "javaType": "javax.cache.configuration.Configuration", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "A Configuration for the Cache" }, - "cacheConfigurationProperties": { "index": 2, "kind": "parameter", "displayName": "Cache Configuration Properties", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Properties", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The Properties for the javax.cache.spi.CachingProvider to create the CacheManager" }, - "cachingProvider": { "index": 3, "kind": "parameter", "displayName": "Caching Provider", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The fully qualified class name of the javax.cache.spi.CachingProvider" }, - "configurationUri": { "index": 4, "kind": "parameter", "displayName": "Configuration Uri", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "An implementation specific URI for the CacheManager" }, - "managementEnabled": { "index": 5, "kind": "parameter", "displayName": "Management Enabled", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "Whether management gathering is enabled" }, - "readThrough": { "index": 6, "kind": "parameter", "displayName": "Read Through", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "If read-through caching should be used" }, - "statisticsEnabled": { "index": 7, "kind": "parameter", "displayName": "Statistics Enabled", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "Whether statistics gathering is enabled" }, - "storeByValue": { "index": 8, "kind": "parameter", "displayName": "Store By Value", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "If cache should use store-by-value or store-by-reference semantics" }, - "writeThrough": { "index": 9, "kind": "parameter", "displayName": "Write Through", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "If write-through caching should be used" }, - "filteredEvents": { "index": 10, "kind": "parameter", "displayName": "Filtered Events", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "CREATED", "UPDATED", "REMOVED", "EXPIRED" ], "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "Events a consumer should filter (multiple events can be separated by comma). If using filteredEvents option, then eventFilters one will be ignored" }, - "oldValueRequired": { "index": 11, "kind": "parameter", "displayName": "Old Value Required", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "if the old value is required for events" }, - "synchronous": { "index": 12, "kind": "parameter", "displayName": "Synchronous", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "if the event listener should block the thread causing the event" }, - "bridgeErrorHandler": { "index": 13, "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 messages, or the likes, will now be processed as a message and handled by the routing Error Handler. Important: This is only possible if the 3rd party component allows Camel to be alerted if an exception was thrown. Some components handle this internally only, and therefore bridgeErrorHandler is not possible. In other situations we may improve the Camel component to hook into the 3rd party component and make this possible for future releases. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored." }, - "eventFilters": { "index": 14, "kind": "parameter", "displayName": "Event Filters", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The CacheEntryEventFilter. If using eventFilters option, then filteredEvents one will be ignored" }, - "exceptionHandler": { "index": 15, "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 default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored." }, - "exchangePattern": { "index": 16, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "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." }, - "action": { "index": 17, "kind": "parameter", "displayName": "Action", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "To configure using a cache operation by default. If an operation in the message header, then the operation from the header takes precedence." }, - "lazyStartProducer": { "index": 18, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing." }, + "cacheConfigurationProperties": { "index": 1, "kind": "parameter", "displayName": "Cache Configuration Properties", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Properties", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The Properties for the javax.cache.spi.CachingProvider to create the CacheManager" }, + "cachingProvider": { "index": 2, "kind": "parameter", "displayName": "Caching Provider", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The fully qualified class name of the javax.cache.spi.CachingProvider" }, + "configurationUri": { "index": 3, "kind": "parameter", "displayName": "Configuration Uri", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "An implementation specific URI for the CacheManager" }, + "managementEnabled": { "index": 4, "kind": "parameter", "displayName": "Management Enabled", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "Whether management gathering is enabled" }, + "readThrough": { "index": 5, "kind": "parameter", "displayName": "Read Through", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "If read-through caching should be used" }, + "statisticsEnabled": { "index": 6, "kind": "parameter", "displayName": "Statistics Enabled", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "Whether statistics gathering is enabled" }, + "storeByValue": { "index": 7, "kind": "parameter", "displayName": "Store By Value", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "If cache should use store-by-value or store-by-reference semantics" }, + "writeThrough": { "index": 8, "kind": "parameter", "displayName": "Write Through", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "If write-through caching should be used" }, + "filteredEvents": { "index": 9, "kind": "parameter", "displayName": "Filtered Events", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "CREATED", "UPDATED", "REMOVED", "EXPIRED" ], "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "Events a consumer should filter (multiple events can be separated by comma). If using filteredEvents option, then eventFilters one will be ignored" }, + "oldValueRequired": { "index": 10, "kind": "parameter", "displayName": "Old Value Required", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "if the old value is required for events" }, + "synchronous": { "index": 11, "kind": "parameter", "displayName": "Synchronous", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "if the event listener should block the thread causing the event" }, + "bridgeErrorHandler": { "index": 12, "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 messages, or the likes, will now be processed as a message and handled by the routing Error Handler. Important: This is only possible if the 3rd party component allows Camel to be alerted if an exception was thrown. Some components handle this internally only, and therefore bridgeErrorHandler is not possible. In other situations we may improve the Camel component to hook into the 3rd party component and make this possible for future releases. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored." }, + "eventFilters": { "index": 13, "kind": "parameter", "displayName": "Event Filters", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "array", "javaType": "java.util.List", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The CacheEntryEventFilter. If using eventFilters option, then filteredEvents one will be ignored" }, + "exceptionHandler": { "index": 14, "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 default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored." }, + "exchangePattern": { "index": 15, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "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." }, + "action": { "index": 16, "kind": "parameter", "displayName": "Action", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "To configure using a cache operation by default. If an operation in the message header, then the operation from the header takes precedence." }, + "lazyStartProducer": { "index": 17, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing." }, + "cacheConfiguration": { "index": 18, "kind": "parameter", "displayName": "Cache Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "javax.cache.configuration.Configuration", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "A Configuration for the Cache" }, "cacheLoaderFactory": { "index": 19, "kind": "parameter", "displayName": "Cache Loader Factory", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "javax.cache.configuration.Factory", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The CacheLoader factory" }, "cacheWriterFactory": { "index": 20, "kind": "parameter", "displayName": "Cache Writer Factory", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "javax.cache.configuration.Factory", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "The CacheWriter factory" }, "createCacheIfNotExists": { "index": 21, "kind": "parameter", "displayName": "Create Cache If Not Exists", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.jcache.JCacheConfiguration", "configurationField": "configuration", "description": "Configure if a cache need to be created if it does exist or can't be pre-configured." }, diff --git a/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..c022d29e9c1c9 --- /dev/null +++ b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=JCacheAggregationRepository JCacheIdempotentRepository +groupId=org.apache.camel +artifactId=camel-jcache +version=4.5.0-SNAPSHOT +projectName=Camel :: JCache +projectDescription=Camel JCache support diff --git a/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheAggregationRepository.json b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheAggregationRepository.json new file mode 100644 index 0000000000000..5a5b2eddaaede --- /dev/null +++ b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "JCacheAggregationRepository", + "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", + "interfaceType": "org.apache.camel.CamelContextAware", + "title": "JCache Aggregation Repository", + "description": "Aggregation repository that uses JCache to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-jcache", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "configuration": { "index": 1, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for JCache" }, "optimistic": { "index": 2, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether optimistic locking is in use" } } + } +} + diff --git a/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheIdempotentRepository.json b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheIdempotentRepository.json new file mode 100644 index 0000000000000..8337b15a5aee7 --- /dev/null +++ b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "JCacheIdempotentRepository", + "javaType": "org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository", + "interfaceType": "org.apache.camel.CamelContextAware", + "title": "JCache Idempotent Repository", + "description": "Idempotent repository that uses JCache to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-jcache", + "version": "4.5.0-SNAPSHOT", + "properties": { "configuration": { "index": 0, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for JCache" } } + } +} + diff --git a/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository new file mode 100644 index 0000000000000..7643a9336a8aa --- /dev/null +++ b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepositoryConfigurer diff --git a/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository new file mode 100644 index 0000000000000..dd8d797f6b2aa --- /dev/null +++ b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepositoryConfigurer diff --git a/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/JCacheConfiguration.java b/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/JCacheConfiguration.java index c8e93cbdc6f03..db2a8a630bc48 100644 --- a/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/JCacheConfiguration.java +++ b/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/JCacheConfiguration.java @@ -36,60 +36,43 @@ @UriParams public class JCacheConfiguration { + @UriParam(label = "common") private String cachingProvider; - - @UriParam + @UriParam(label = "advanced") private Configuration cacheConfiguration; - @UriParam private Properties cacheConfigurationProperties; - @UriParam private String configurationUri; - @UriParam(label = "advanced") private Factory cacheLoaderFactory; - @UriParam(label = "advanced") private Factory cacheWriterFactory; - @UriParam(label = "advanced") private Factory expiryPolicyFactory; - @UriParam private boolean readThrough; - @UriParam private boolean writeThrough; - @UriParam(defaultValue = "true") private boolean storeByValue = true; - @UriParam private boolean statisticsEnabled; - @UriParam private boolean managementEnabled; - @UriParam(label = "consumer", enums = "CREATED,UPDATED,REMOVED,EXPIRED") private String filteredEvents; - @UriParam(label = "consumer,advanced") private List eventFilters; - @UriParam(label = "consumer") private boolean oldValueRequired; - @UriParam(label = "consumer") private boolean synchronous; - @UriParam(label = "producer") private String action; - @UriParam(label = "advanced", defaultValue = "true") private boolean createCacheIfNotExists = true; - @UriParam(label = "advanced") private boolean lookupProviders; diff --git a/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepository.java b/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepository.java index 4bb33b18f1ca2..438c8866a4751 100644 --- a/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepository.java +++ b/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepository.java @@ -29,6 +29,8 @@ import org.apache.camel.component.jcache.JCacheConfiguration; import org.apache.camel.component.jcache.JCacheHelper; import org.apache.camel.component.jcache.JCacheManager; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; import org.apache.camel.spi.OptimisticLockingAggregationRepository; import org.apache.camel.support.DefaultExchange; import org.apache.camel.support.DefaultExchangeHolder; @@ -37,17 +39,26 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Metadata(label = "bean", + description = "Aggregation repository that uses JCache to store exchanges.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) +@Configurer(metadataOnly = true) public class JCacheAggregationRepository extends ServiceSupport implements CamelContextAware, OptimisticLockingAggregationRepository { private static final Logger LOG = LoggerFactory.getLogger(JCacheAggregationRepository.class); private CamelContext camelContext; - private JCacheConfiguration configuration; private Cache cache; + private JCacheManager cacheManager; + + @Metadata(description = "Configuration for JCache") + private JCacheConfiguration configuration; + @Metadata(description = "Whether optimistic locking is in use") private boolean optimistic; + @Metadata(label = "advanced", + description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") private boolean allowSerializedHeaders; - private JCacheManager cacheManager; public JCacheAggregationRepository() { this.configuration = new JCacheConfiguration(); diff --git a/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepository.java b/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepository.java index 8e9c8d5644030..6b0c277b231b4 100644 --- a/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepository.java +++ b/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepository.java @@ -26,17 +26,25 @@ import org.apache.camel.component.jcache.JCacheConfiguration; import org.apache.camel.component.jcache.JCacheHelper; import org.apache.camel.component.jcache.JCacheManager; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.IdempotentRepository; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.service.ServiceSupport; import org.apache.camel.util.ObjectHelper; +@Metadata(label = "bean", + description = "Idempotent repository that uses JCache to store message ids.") +@Configurer(metadataOnly = true) @ManagedResource(description = "JCache based message id repository") public class JCacheIdempotentRepository extends ServiceSupport implements CamelContextAware, IdempotentRepository { + private CamelContext camelContext; - private JCacheConfiguration configuration; private Cache cache; private JCacheManager cacheManager; + @Metadata(description = "Configuration for JCache") + private JCacheConfiguration configuration; + public JCacheIdempotentRepository() { this.configuration = new JCacheConfiguration(); } @@ -120,6 +128,8 @@ protected void doStart() throws Exception { @Override protected void doStop() throws Exception { - cacheManager.close(); + if (cacheManager != null) { + cacheManager.close(); + } } } From a4183f2ab7e56fa64cd1d14c7069eb36fa2740cd Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 19 Mar 2024 10:59:01 +0100 Subject: [PATCH 35/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../org/apache/camel/catalog/beans.properties | 1 + .../SpringRedisIdempotentRepository.json | 16 +++++ ...ngRedisIdempotentRepositoryConfigurer.java | 49 +++++++++++++++ .../services/org/apache/camel/bean.properties | 7 +++ .../bean/SpringRedisIdempotentRepository.json | 16 +++++ ...idempotent.SpringRedisIdempotentRepository | 2 + ...a => SpringRedisIdempotentRepository.java} | 60 ++++++++++++------- ...pringRedisStringIdempotentRepository.java} | 6 +- ...disStringIdempotentRepositoryManualIT.java | 4 +- .../RedisStringIdempotentRepositoryTest.java | 12 ++-- ... SpringRedisIdempotentRepositoryTest.java} | 8 +-- .../RedisComponentSpringTest-context.xml | 2 +- .../pages/camel-4x-upgrade-guide-4_5.adoc | 9 ++- 13 files changed, 152 insertions(+), 40 deletions(-) create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/SpringRedisIdempotentRepository.json create mode 100644 components/camel-spring-redis/src/generated/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepositoryConfigurer.java create mode 100644 components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/bean/SpringRedisIdempotentRepository.json create mode 100644 components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository rename components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/{RedisIdempotentRepository.java => SpringRedisIdempotentRepository.java} (63%) rename components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/{RedisStringIdempotentRepository.java => SpringRedisStringIdempotentRepository.java} (93%) rename components/camel-spring-redis/src/test/java/org/apache/camel/component/redis/processor/idempotent/{RedisIdempotentRepositoryTest.java => SpringRedisIdempotentRepositoryTest.java} (90%) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties index 2d3b60eb577f9..5980ce40fc071 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties @@ -23,6 +23,7 @@ LevelDBAggregationRepository MemoryAggregationRepository MemoryIdempotentRepository OpensearchBulkRequestAggregationStrategy +SpringRedisIdempotentRepository StringAggregationStrategy TarAggregationStrategy UseLatestAggregationStrategy diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/SpringRedisIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/SpringRedisIdempotentRepository.json new file mode 100644 index 0000000000000..b83b63d14441a --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/SpringRedisIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "SpringRedisIdempotentRepository", + "javaType": "org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Spring Redis Idempotent Repository", + "description": "Idempotent repository that uses Redis to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-spring-redis", + "version": "4.5.0-SNAPSHOT", + "properties": { "redisConfiguration": { "index": 0, "kind": "property", "displayName": "Redis Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Redis configuration" }, "repositoryName": { "index": 1, "kind": "property", "displayName": "Repository Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of repository" } } + } +} + diff --git a/components/camel-spring-redis/src/generated/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepositoryConfigurer.java b/components/camel-spring-redis/src/generated/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepositoryConfigurer.java new file mode 100644 index 0000000000000..4ef35e3ec9582 --- /dev/null +++ b/components/camel-spring-redis/src/generated/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepositoryConfigurer.java @@ -0,0 +1,49 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.redis.processor.idempotent; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class SpringRedisIdempotentRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository target = (org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "repositoryname": + case "RepositoryName": target.setRepositoryName(property(camelContext, java.lang.String.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "repositoryname": + case "RepositoryName": return java.lang.String.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository target = (org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "repositoryname": + case "RepositoryName": return target.getRepositoryName(); + default: return null; + } + } +} + diff --git a/components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..84b1b22f0688e --- /dev/null +++ b/components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=SpringRedisIdempotentRepository +groupId=org.apache.camel +artifactId=camel-spring-redis +version=4.5.0-SNAPSHOT +projectName=Camel :: Redis +projectDescription=Camel Spring Redis Component diff --git a/components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/bean/SpringRedisIdempotentRepository.json b/components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/bean/SpringRedisIdempotentRepository.json new file mode 100644 index 0000000000000..b83b63d14441a --- /dev/null +++ b/components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/bean/SpringRedisIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "SpringRedisIdempotentRepository", + "javaType": "org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Spring Redis Idempotent Repository", + "description": "Idempotent repository that uses Redis to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-spring-redis", + "version": "4.5.0-SNAPSHOT", + "properties": { "redisConfiguration": { "index": 0, "kind": "property", "displayName": "Redis Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Redis configuration" }, "repositoryName": { "index": 1, "kind": "property", "displayName": "Repository Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of repository" } } + } +} + diff --git a/components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository b/components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository new file mode 100644 index 0000000000000..b5f65f0157191 --- /dev/null +++ b/components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepositoryConfigurer diff --git a/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/RedisIdempotentRepository.java b/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepository.java similarity index 63% rename from components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/RedisIdempotentRepository.java rename to components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepository.java index 9f9f869150d4a..371f52a96815c 100644 --- a/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/RedisIdempotentRepository.java +++ b/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepository.java @@ -20,46 +20,53 @@ import org.apache.camel.api.management.ManagedOperation; import org.apache.camel.api.management.ManagedResource; import org.apache.camel.component.redis.RedisConfiguration; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.IdempotentRepository; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.service.ServiceSupport; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.SetOperations; +@Metadata(label = "bean", + description = "Idempotent repository that uses Redis to store message ids.") +@Configurer(metadataOnly = true) @ManagedResource(description = "Spring Redis based message id repository") -public class RedisIdempotentRepository extends ServiceSupport implements IdempotentRepository { - private final SetOperations setOperations; - private final String processorName; +public class SpringRedisIdempotentRepository extends ServiceSupport implements IdempotentRepository { + + private SetOperations setOperations; + @Metadata(description = "Name of repository", required = true) + private String repositoryName; + @Metadata(description = "Redis configuration") private RedisConfiguration redisConfiguration; private RedisTemplate redisTemplate; - public RedisIdempotentRepository(RedisTemplate redisTemplate, String processorName) { + public SpringRedisIdempotentRepository() { + } + + public SpringRedisIdempotentRepository(RedisTemplate redisTemplate, String repositoryName) { this.setOperations = redisTemplate.opsForSet(); - this.processorName = processorName; + this.repositoryName = repositoryName; this.redisTemplate = redisTemplate; } - public RedisIdempotentRepository(String processorName) { - redisConfiguration = new RedisConfiguration(); - this.redisTemplate = (RedisTemplate) redisConfiguration.getRedisTemplate(); - this.setOperations = redisTemplate.opsForSet(); - redisTemplate.getConnectionFactory().getConnection().flushDb(); - this.processorName = processorName; + public SpringRedisIdempotentRepository(String repositoryName) { + this.repositoryName = repositoryName; } - public static RedisIdempotentRepository redisIdempotentRepository(String processorName) { - return new RedisIdempotentRepository(processorName); + public static SpringRedisIdempotentRepository redisIdempotentRepository(String processorName) { + return new SpringRedisIdempotentRepository(processorName); } - public static RedisIdempotentRepository redisIdempotentRepository( + public static SpringRedisIdempotentRepository redisIdempotentRepository( RedisTemplate redisTemplate, String processorName) { - return new RedisIdempotentRepository(redisTemplate, processorName); + return new SpringRedisIdempotentRepository(redisTemplate, processorName); } @Override @ManagedOperation(description = "Adds the key to the store") public boolean add(String key) { if (!contains(key)) { - return setOperations.add(processorName, key) != null; + return setOperations.add(repositoryName, key) != null; } else { return false; } @@ -68,13 +75,13 @@ public boolean add(String key) { @Override @ManagedOperation(description = "Does the store contain the given key") public boolean contains(String key) { - return setOperations.isMember(processorName, key); + return setOperations.isMember(repositoryName, key); } @Override @ManagedOperation(description = "Remove the key from the store") public boolean remove(String key) { - return setOperations.remove(processorName, key) != null; + return setOperations.remove(repositoryName, key) != null; } @Override @@ -83,9 +90,13 @@ public void clear() { redisTemplate.getConnectionFactory().getConnection().flushDb(); } - @ManagedAttribute(description = "The processor name") - public String getProcessorName() { - return processorName; + public void setRepositoryName(String repositoryName) { + this.repositoryName = repositoryName; + } + + @ManagedAttribute(description = "The repository name") + public String getRepositoryName() { + return repositoryName; } @Override @@ -95,7 +106,12 @@ public boolean confirm(String key) { @Override protected void doStart() throws Exception { - // noop + if (redisConfiguration == null) { + redisConfiguration = new RedisConfiguration(); + } + this.redisTemplate = (RedisTemplate) redisConfiguration.getRedisTemplate(); + this.setOperations = redisTemplate.opsForSet(); + redisTemplate.getConnectionFactory().getConnection().flushDb(); } @Override diff --git a/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/RedisStringIdempotentRepository.java b/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisStringIdempotentRepository.java similarity index 93% rename from components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/RedisStringIdempotentRepository.java rename to components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisStringIdempotentRepository.java index 953fdcea42dcf..647d336588650 100644 --- a/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/RedisStringIdempotentRepository.java +++ b/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisStringIdempotentRepository.java @@ -31,13 +31,13 @@ import org.springframework.data.redis.core.ValueOperations; @ManagedResource(description = "Spring Redis based message id repository") -public class RedisStringIdempotentRepository extends RedisIdempotentRepository { +public class SpringRedisStringIdempotentRepository extends SpringRedisIdempotentRepository { private final ValueOperations valueOperations; private long expiry; - public RedisStringIdempotentRepository(RedisTemplate redisTemplate, String processorName) { + public SpringRedisStringIdempotentRepository(RedisTemplate redisTemplate, String processorName) { super(redisTemplate, processorName); this.valueOperations = redisTemplate.opsForValue(); } @@ -87,7 +87,7 @@ public List doInRedis(RedisConnection connection) throws DataAccessExcep } protected String createRedisKey(String key) { - return getProcessorName() + ":" + key; + return getRepositoryName() + ":" + key; } public long getExpiry() { diff --git a/components/camel-spring-redis/src/test/java/org/apache/camel/component/redis/processor/idempotent/RedisStringIdempotentRepositoryManualIT.java b/components/camel-spring-redis/src/test/java/org/apache/camel/component/redis/processor/idempotent/RedisStringIdempotentRepositoryManualIT.java index a8a9862a36b08..e007ba287f0d6 100644 --- a/components/camel-spring-redis/src/test/java/org/apache/camel/component/redis/processor/idempotent/RedisStringIdempotentRepositoryManualIT.java +++ b/components/camel-spring-redis/src/test/java/org/apache/camel/component/redis/processor/idempotent/RedisStringIdempotentRepositoryManualIT.java @@ -41,7 +41,7 @@ public class RedisStringIdempotentRepositoryManualIT extends CamelTestSupport { private static final JedisConnectionFactory CONNECTION_FACTORY = new JedisConnectionFactory(); - protected RedisStringIdempotentRepository idempotentRepository; + protected SpringRedisStringIdempotentRepository idempotentRepository; @Produce("direct:start") private ProducerTemplate producer; @@ -69,7 +69,7 @@ protected Registry createCamelRegistry() throws Exception { @Override protected RouteBuilder createRouteBuilder() throws Exception { - idempotentRepository = new RedisStringIdempotentRepository( + idempotentRepository = new SpringRedisStringIdempotentRepository( redisTemplate, "redis-idempotent-repository"); RouteBuilder rb = new RouteBuilder() { diff --git a/components/camel-spring-redis/src/test/java/org/apache/camel/component/redis/processor/idempotent/RedisStringIdempotentRepositoryTest.java b/components/camel-spring-redis/src/test/java/org/apache/camel/component/redis/processor/idempotent/RedisStringIdempotentRepositoryTest.java index 0655242ce7ab1..d70467aa1134d 100644 --- a/components/camel-spring-redis/src/test/java/org/apache/camel/component/redis/processor/idempotent/RedisStringIdempotentRepositoryTest.java +++ b/components/camel-spring-redis/src/test/java/org/apache/camel/component/redis/processor/idempotent/RedisStringIdempotentRepositoryTest.java @@ -50,15 +50,15 @@ public class RedisStringIdempotentRepositoryTest { @Mock private ValueOperations valueOperations; - private RedisStringIdempotentRepository idempotentRepository; - private RedisStringIdempotentRepository idempotentRepositoryNoExpiry; + private SpringRedisStringIdempotentRepository idempotentRepository; + private SpringRedisStringIdempotentRepository idempotentRepositoryNoExpiry; @BeforeEach public void setUp() throws Exception { when(redisTemplate.opsForValue()).thenReturn(valueOperations); - idempotentRepository = new RedisStringIdempotentRepository(redisTemplate, REPOSITORY); + idempotentRepository = new SpringRedisStringIdempotentRepository(redisTemplate, REPOSITORY); idempotentRepository.setExpiry(1000L); - idempotentRepositoryNoExpiry = new RedisStringIdempotentRepository(redisTemplate, REPOSITORY_NOEXPIRY); + idempotentRepositoryNoExpiry = new SpringRedisStringIdempotentRepository(redisTemplate, REPOSITORY_NOEXPIRY); } @Test @@ -79,9 +79,9 @@ public void shoulCheckForMembers() { @Test public void shouldReturnProcessorName() { - String processorName = idempotentRepository.getProcessorName(); + String processorName = idempotentRepository.getRepositoryName(); assertEquals(REPOSITORY, processorName); - String processorNameNoExpiry = idempotentRepositoryNoExpiry.getProcessorName(); + String processorNameNoExpiry = idempotentRepositoryNoExpiry.getRepositoryName(); assertEquals(REPOSITORY_NOEXPIRY, processorNameNoExpiry); } diff --git a/components/camel-spring-redis/src/test/java/org/apache/camel/component/redis/processor/idempotent/RedisIdempotentRepositoryTest.java b/components/camel-spring-redis/src/test/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepositoryTest.java similarity index 90% rename from components/camel-spring-redis/src/test/java/org/apache/camel/component/redis/processor/idempotent/RedisIdempotentRepositoryTest.java rename to components/camel-spring-redis/src/test/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepositoryTest.java index 92a77ae93e1f0..f2fe5aa2f3eb6 100644 --- a/components/camel-spring-redis/src/test/java/org/apache/camel/component/redis/processor/idempotent/RedisIdempotentRepositoryTest.java +++ b/components/camel-spring-redis/src/test/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepositoryTest.java @@ -31,7 +31,7 @@ import static org.mockito.Mockito.when; @MockitoSettings(strictness = Strictness.LENIENT) -public class RedisIdempotentRepositoryTest { +public class SpringRedisIdempotentRepositoryTest { private static final String REPOSITORY = "testRepository"; private static final String KEY = "KEY"; @@ -45,14 +45,14 @@ public class RedisIdempotentRepositoryTest { @Mock private SetOperations setOperations; - private RedisIdempotentRepository idempotentRepository; + private SpringRedisIdempotentRepository idempotentRepository; @BeforeEach public void setUp() throws Exception { when(redisTemplate.opsForSet()).thenReturn(setOperations); when(redisTemplate.getConnectionFactory()).thenReturn(redisConnectionFactory); when(redisTemplate.getConnectionFactory().getConnection()).thenReturn(redisConnection); - idempotentRepository = RedisIdempotentRepository.redisIdempotentRepository(redisTemplate, REPOSITORY); + idempotentRepository = SpringRedisIdempotentRepository.redisIdempotentRepository(redisTemplate, REPOSITORY); } @Test @@ -81,7 +81,7 @@ public void shouldClearRepository() { @Test public void shouldReturnProcessorName() { - String processorName = idempotentRepository.getProcessorName(); + String processorName = idempotentRepository.getRepositoryName(); assertEquals(REPOSITORY, processorName); } } diff --git a/components/camel-spring-redis/src/test/resources/RedisComponentSpringTest-context.xml b/components/camel-spring-redis/src/test/resources/RedisComponentSpringTest-context.xml index 16572ff49bd49..68466db0064eb 100644 --- a/components/camel-spring-redis/src/test/resources/RedisComponentSpringTest-context.xml +++ b/components/camel-spring-redis/src/test/resources/RedisComponentSpringTest-context.xml @@ -23,7 +23,7 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - + diff --git a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_5.adoc b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_5.adoc index b781462f3162e..afc5faf70c0f0 100644 --- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_5.adoc +++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_5.adoc @@ -259,5 +259,10 @@ to use from Camel. === camel-elasticsearch / camel-opensearch -The `BulkRequestAggregationStrategy` has been renamed to `OpensearchBulkRequestAggregationStrategy` and -`ElasticsearchBulkRequestAggregationStrategy` respectively. \ No newline at end of file +The class `BulkRequestAggregationStrategy` has been renamed to `OpensearchBulkRequestAggregationStrategy` +The class `BulkRequestAggregationStrategy` has been renamed to `ElasticsearchBulkRequestAggregationStrategy` + +=== camel-spring-redis + +The class `RedisIdempotentRepository` has been renamed to `SpringRedisIdempotentRepository` +The class `RedisStringIdempotentRepository` has been renamed to `SpringRedisStringIdempotentRepository` From 397333a6c1c9c7720de5b150cbc9697d47c2dfb6 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 19 Mar 2024 11:14:24 +0100 Subject: [PATCH 36/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../KafkaIdempotentRepositoryConfigurer.java | 67 +++++++++++++++ .../services/org/apache/camel/bean.properties | 7 ++ .../camel/bean/KafkaIdempotentRepository.json | 16 ++++ ...idempotent.kafka.KafkaIdempotentRepository | 2 + .../kafka/KafkaIdempotentRepository.java | 84 ++++++++++--------- ...MongoDbIdempotentRepositoryConfigurer.java | 61 ++++++++++++++ .../services/org/apache/camel/bean.properties | 7 ++ .../bean/MongoDbIdempotentRepository.json | 16 ++++ ...sor.idempotent.MongoDbIdempotentRepository | 2 + .../MongoDbIdempotentRepository.java | 17 +++- .../MongoDbIdempotentRepositoryIT.java | 1 + 11 files changed, 235 insertions(+), 45 deletions(-) create mode 100644 components/camel-kafka/src/generated/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepositoryConfigurer.java create mode 100644 components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/bean/KafkaIdempotentRepository.json create mode 100644 components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository create mode 100644 components/camel-mongodb/src/generated/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepositoryConfigurer.java create mode 100644 components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/bean/MongoDbIdempotentRepository.json create mode 100644 components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository diff --git a/components/camel-kafka/src/generated/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepositoryConfigurer.java b/components/camel-kafka/src/generated/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepositoryConfigurer.java new file mode 100644 index 0000000000000..f225adbc76c39 --- /dev/null +++ b/components/camel-kafka/src/generated/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepositoryConfigurer.java @@ -0,0 +1,67 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.idempotent.kafka; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class KafkaIdempotentRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository target = (org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "bootstrapservers": + case "BootstrapServers": target.setBootstrapServers(property(camelContext, java.lang.String.class, value)); return true; + case "maxcachesize": + case "MaxCacheSize": target.setMaxCacheSize(property(camelContext, int.class, value)); return true; + case "polldurationms": + case "PollDurationMs": target.setPollDurationMs(property(camelContext, int.class, value)); return true; + case "topic": + case "Topic": target.setTopic(property(camelContext, java.lang.String.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "bootstrapservers": + case "BootstrapServers": return java.lang.String.class; + case "maxcachesize": + case "MaxCacheSize": return int.class; + case "polldurationms": + case "PollDurationMs": return int.class; + case "topic": + case "Topic": return java.lang.String.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository target = (org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "bootstrapservers": + case "BootstrapServers": return target.getBootstrapServers(); + case "maxcachesize": + case "MaxCacheSize": return target.getMaxCacheSize(); + case "polldurationms": + case "PollDurationMs": return target.getPollDurationMs(); + case "topic": + case "Topic": return target.getTopic(); + default: return null; + } + } +} + diff --git a/components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..b41892c0c0774 --- /dev/null +++ b/components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=KafkaIdempotentRepository +groupId=org.apache.camel +artifactId=camel-kafka +version=4.5.0-SNAPSHOT +projectName=Camel :: Kafka +projectDescription=Camel Kafka support diff --git a/components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/bean/KafkaIdempotentRepository.json b/components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/bean/KafkaIdempotentRepository.json new file mode 100644 index 0000000000000..4787a36b9d6a4 --- /dev/null +++ b/components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/bean/KafkaIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "KafkaIdempotentRepository", + "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Kafka Idempotent Repository", + "description": "Idempotent repository that uses Kafka to store message ids. Uses a local cache of previously seen Message IDs. The topic used must be unique per logical repository (i.e. two routes de-duplicate using different repositories, and different topics) On startup, the instance consumes the full content of the topic, rebuilding the cache to the latest state.", + "deprecated": true, + "groupId": "org.apache.camel", + "artifactId": "camel-kafka", + "version": "4.5.0-SNAPSHOT", + "properties": { "bootstrapServers": { "index": 0, "kind": "property", "displayName": "Bootstrap Servers", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The URL for the kafka brokers to use" }, "maxCacheSize": { "index": 1, "kind": "property", "displayName": "Max Cache Size", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the maximum size of the local key cache." }, "pollDurationMs": { "index": 2, "kind": "property", "displayName": "Poll Duration Ms", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "100", "description": "Sets the poll duration of the Kafka consumer. The local caches are updated immediately; this value will affect how far behind other peers in the cluster are, which are updating their caches from the topic, relative to the idempotent consumer instance issued the cache action message. The default value of this is 100 If setting this value explicitly, be aware that there is a tradeoff between the remote cache liveness and the volume of network traffic between this repository's consumer and the Kafka brokers. The cache warmup process also depends on there being one poll that fetches nothing - this indicates that the stream has been consumed up to the current point. If the poll duration is excessively long for the rate at which messages are sent on the topic, there exists a possibility that the cache cannot be warmed up and will operate in an inconsistent state relative to its peers until it catches up." }, "topic": { "index": 3, "kind": "property", "displayName": "Topic", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the name of the Kafka topic used by this idempotent repository. Each functionally-separate repository should use a different topic." } } + } +} + diff --git a/components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository b/components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository new file mode 100644 index 0000000000000..ca18523d28642 --- /dev/null +++ b/components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepositoryConfigurer diff --git a/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java b/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java index fafcfed61bc7c..dc09b95366fa1 100644 --- a/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java +++ b/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java @@ -29,7 +29,9 @@ import org.apache.camel.RuntimeCamelException; import org.apache.camel.api.management.ManagedOperation; import org.apache.camel.api.management.ManagedResource; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.IdempotentRepository; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.LRUCacheFactory; import org.apache.camel.support.service.ServiceSupport; import org.apache.camel.util.IOHelper; @@ -64,40 +66,54 @@ * must be placed in the Camel registry, either manually or by registration as a bean in Spring/Blueprint, as it is * CamelContext aware. */ +@Metadata(label = "bean", + description = "Idempotent repository that uses Kafka to store message ids. Uses a local cache of previously seen Message IDs." + + " The topic used must be unique per logical repository (i.e. two routes de-duplicate using different repositories, and different topics)" + + " On startup, the instance consumes the full content of the topic, rebuilding the cache to the latest state.") +@Configurer(metadataOnly = true) @ManagedResource(description = "Kafka IdempotentRepository") public class KafkaIdempotentRepository extends ServiceSupport implements IdempotentRepository, CamelContextAware { + private static final Logger LOG = LoggerFactory.getLogger(KafkaIdempotentRepository.class); + private static final int DEFAULT_MAXIMUM_CACHE_SIZE = 1000; private static final int DEFAULT_POLL_DURATION_MS = 100; - private final Logger log = LoggerFactory.getLogger(this.getClass()); + private CamelContext camelContext; + // internal properties + private Map cache; + private Consumer consumer; + private Producer producer; + + private Properties producerConfig; + private Properties consumerConfig; + private String groupId; // not in use // configurable + @Metadata(description = "Sets the name of the Kafka topic used by this idempotent repository." + + " Each functionally-separate repository should use a different topic.", required = true) private String topic; + @Metadata(description = "The URL for the kafka brokers to use", required = true) private String bootstrapServers; - - private String groupId; - private Properties producerConfig; - private Properties consumerConfig; + @Metadata(description = "Sets the maximum size of the local key cache.", defaultValue = "" + DEFAULT_MAXIMUM_CACHE_SIZE) private int maxCacheSize = DEFAULT_MAXIMUM_CACHE_SIZE; + @Metadata(description = "Sets the poll duration of the Kafka consumer. The local caches are updated immediately; this value will affect" + + " how far behind other peers in the cluster are, which are updating their caches from the topic, relative to the" + + " idempotent consumer instance issued the cache action message. The default value of this is 100" + + " If setting this value explicitly, be aware that there is a tradeoff between" + + " the remote cache liveness and the volume of network traffic between this repository's consumer and the Kafka" + + " brokers. The cache warmup process also depends on there being one poll that fetches nothing - this indicates that" + + " the stream has been consumed up to the current point. If the poll duration is excessively long for the rate at" + + " which messages are sent on the topic, there exists a possibility that the cache cannot be warmed up and will" + + " operate in an inconsistent state relative to its peers until it catches up.", defaultValue = "" + DEFAULT_POLL_DURATION_MS) private int pollDurationMs = DEFAULT_POLL_DURATION_MS; - // internal properties - private Map cache; - private Consumer consumer; - private Producer producer; - - private CamelContext camelContext; - enum CacheAction { add, remove, clear } - /** - * No-op constructor for XML/property-based object initialisation. From Java, prefer one of the other constructors. - */ public KafkaIdempotentRepository() { } @@ -187,23 +203,9 @@ public String getBootstrapServers() { } /** - * Sets the - * - *

-     * bootstrap.servers
-     * 
- * - * property on the internal Kafka producer and consumer. Use this as shorthand if not setting + * Sets the bootstrap.servers property on the internal Kafka producer and consumer. Use this as shorthand if not setting * {@link #consumerConfig} and {@link #producerConfig}. If used, this component will apply sensible default * configurations for the producer and consumer. - * - * @param bootstrapServers The - * - *
-     *                         bootstrap.servers
-     *                         
- * - * value to use. */ public void setBootstrapServers(String bootstrapServers) { this.bootstrapServers = bootstrapServers; @@ -354,20 +356,20 @@ protected void doStart() throws Exception { } private void populateCache() { - log.debug("Getting partitions of topic {}", topic); + LOG.debug("Getting partitions of topic {}", topic); List partitionInfos = consumer.partitionsFor(topic); Collection partitions = partitionInfos.stream() .map(pi -> new TopicPartition(pi.topic(), pi.partition())) .collect(Collectors.toUnmodifiableList()); - log.debug("Assigning consumer to partitions {}", partitions); + LOG.debug("Assigning consumer to partitions {}", partitions); consumer.assign(partitions); - log.debug("Seeking consumer to beginning of partitions {}", partitions); + LOG.debug("Seeking consumer to beginning of partitions {}", partitions); consumer.seekToBeginning(partitions); Map endOffsets = consumer.endOffsets(partitions); - log.debug("Consuming records from partitions {} till end offsets {}", partitions, endOffsets); + LOG.debug("Consuming records from partitions {} till end offsets {}", partitions, endOffsets); while (!KafkaConsumerUtil.isReachedOffsets(consumer, endOffsets)) { ConsumerRecords consumerRecords = consumer.poll(Duration.ofMillis(pollDurationMs)); for (ConsumerRecord consumerRecord : consumerRecords) { @@ -382,17 +384,17 @@ private void addToCache(ConsumerRecord consumerRecord) { try { action = CacheAction.valueOf(consumerRecord.value()); } catch (IllegalArgumentException iax) { - log.error( + LOG.error( "Unexpected action value:\"{}\" received on [topic:{}, partition:{}, offset:{}]. Shutting down.", consumerRecord.key(), consumerRecord.topic(), consumerRecord.partition(), consumerRecord.offset()); } String messageId = consumerRecord.key(); if (action == CacheAction.add) { - log.debug("Adding to cache messageId:{}", messageId); + LOG.debug("Adding to cache messageId:{}", messageId); cache.put(messageId, messageId); } else if (action == CacheAction.remove) { - log.debug("Removing from cache messageId:{}", messageId); + LOG.debug("Removing from cache messageId:{}", messageId); cache.remove(messageId); } else if (action == CacheAction.clear) { cache.clear(); @@ -404,8 +406,8 @@ private void addToCache(ConsumerRecord consumerRecord) { @Override protected void doStop() { - IOHelper.close(consumer, "consumer", log); - IOHelper.close(producer, "producer", log); + IOHelper.close(consumer, "consumer", LOG); + IOHelper.close(producer, "producer", LOG); } @Override @@ -424,7 +426,7 @@ public boolean add(String key) { private void broadcastAction(String key, CacheAction action) { try { - log.debug("Broadcasting action:{} for key:{}", action, key); + LOG.debug("Broadcasting action:{} for key:{}", action, key); ObjectHelper.notNull(producer, "producer"); producer.send(new ProducerRecord<>(topic, key, action.toString())).get(); // sync send @@ -439,7 +441,7 @@ private void broadcastAction(String key, CacheAction action) { @Override @ManagedOperation(description = "Does the store contain the given key") public boolean contains(String key) { - log.debug("Checking cache for key:{}", key); + LOG.debug("Checking cache for key:{}", key); return cache.containsKey(key); } diff --git a/components/camel-mongodb/src/generated/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepositoryConfigurer.java b/components/camel-mongodb/src/generated/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepositoryConfigurer.java new file mode 100644 index 0000000000000..f4fb3f07d3485 --- /dev/null +++ b/components/camel-mongodb/src/generated/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepositoryConfigurer.java @@ -0,0 +1,61 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.mongodb.processor.idempotent; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class MongoDbIdempotentRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository target = (org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "collectionname": + case "CollectionName": target.setCollectionName(property(camelContext, java.lang.String.class, value)); return true; + case "dbname": + case "DbName": target.setDbName(property(camelContext, java.lang.String.class, value)); return true; + case "mongoclient": + case "MongoClient": target.setMongoClient(property(camelContext, com.mongodb.client.MongoClient.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "collectionname": + case "CollectionName": return java.lang.String.class; + case "dbname": + case "DbName": return java.lang.String.class; + case "mongoclient": + case "MongoClient": return com.mongodb.client.MongoClient.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository target = (org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "collectionname": + case "CollectionName": return target.getCollectionName(); + case "dbname": + case "DbName": return target.getDbName(); + case "mongoclient": + case "MongoClient": return target.getMongoClient(); + default: return null; + } + } +} + diff --git a/components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..ed153d6739c99 --- /dev/null +++ b/components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=MongoDbIdempotentRepository +groupId=org.apache.camel +artifactId=camel-mongodb +version=4.5.0-SNAPSHOT +projectName=Camel :: MongoDB +projectDescription=Camel MongoDB (Java Driver 3) component diff --git a/components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/bean/MongoDbIdempotentRepository.json b/components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/bean/MongoDbIdempotentRepository.json new file mode 100644 index 0000000000000..9f506e8166af6 --- /dev/null +++ b/components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/bean/MongoDbIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "MongoDbIdempotentRepository", + "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Mongo Db Idempotent Repository", + "description": "Idempotent repository that uses MongoDB to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-mongodb", + "version": "4.5.0-SNAPSHOT", + "properties": { "collectionName": { "index": 0, "kind": "property", "displayName": "Collection Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The collection name" }, "dbName": { "index": 1, "kind": "property", "displayName": "Db Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Database name" }, "mongoClient": { "index": 2, "kind": "property", "displayName": "Mongo Client", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The MongoClient to use for connecting to the MongoDB server" } } + } +} + diff --git a/components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository b/components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository new file mode 100644 index 0000000000000..c192d4e00dc5c --- /dev/null +++ b/components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepositoryConfigurer diff --git a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java index 9e450aae0f16e..18406cbb7067a 100644 --- a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java +++ b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java @@ -22,7 +22,9 @@ import com.mongodb.client.result.DeleteResult; import org.apache.camel.api.management.ManagedOperation; import org.apache.camel.api.management.ManagedResource; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.IdempotentRepository; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.service.ServiceSupport; import org.apache.camel.util.ObjectHelper; import org.bson.Document; @@ -31,11 +33,19 @@ import static com.mongodb.client.model.Filters.eq; import static org.apache.camel.component.mongodb.MongoDbConstants.MONGO_ID; -@ManagedResource(description = "Mongo db based message id repository") +@Metadata(label = "bean", + description = "Idempotent repository that uses MongoDB to store message ids.") +@Configurer(metadataOnly = true) +@ManagedResource(description = "MongoDB based message id repository") public class MongoDbIdempotentRepository extends ServiceSupport implements IdempotentRepository { + + @Metadata(description = "The MongoClient to use for connecting to the MongoDB server", required = true) private MongoClient mongoClient; - private String collectionName; + @Metadata(description = "The Database name", required = true) private String dbName; + @Metadata(description = "The collection name", required = true) + private String collectionName; + private MongoCollection collection; public MongoDbIdempotentRepository() { @@ -45,7 +55,6 @@ public MongoDbIdempotentRepository(MongoClient mongoClient, String collectionNam this.mongoClient = mongoClient; this.collectionName = collectionName; this.dbName = dbName; - this.collection = mongoClient.getDatabase(dbName).getCollection(collectionName); } @ManagedOperation(description = "Adds the key to the store") @@ -103,7 +112,7 @@ protected void doStart() throws Exception { @Override protected void doStop() throws Exception { - return; + // noop } public MongoClient getMongoClient() { diff --git a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/processor/idempotent/integration/MongoDbIdempotentRepositoryIT.java b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/processor/idempotent/integration/MongoDbIdempotentRepositoryIT.java index f10be3621e4a0..7bb11601ac9f0 100644 --- a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/processor/idempotent/integration/MongoDbIdempotentRepositoryIT.java +++ b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/processor/idempotent/integration/MongoDbIdempotentRepositoryIT.java @@ -42,6 +42,7 @@ public void clearDB() { @BeforeEach public void setupIdempotentRepository() { repo = new MongoDbIdempotentRepository(mongo, testCollectionName, dbName); + repo.start(); } @Test From daa3d8fd1d8f8cc2aae5e281b7bc6d54a3974f01 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Tue, 19 Mar 2024 12:49:07 +0100 Subject: [PATCH 37/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../org/apache/camel/catalog/beans.properties | 3 + .../beans/JdbcMessageIdRepository.json | 16 +++ .../beans/KafkaIdempotentRepository.json | 16 +++ .../beans/MongoDbIdempotentRepository.json | 16 +++ .../kafka/KafkaIdempotentRepository.java | 16 +-- .../JdbcMessageIdRepositoryConfigurer.java | 109 ++++++++++++++++++ .../services/org/apache/camel/bean.properties | 7 ++ .../camel/bean/JdbcMessageIdRepository.json | 16 +++ ...or.idempotent.jdbc.JdbcMessageIdRepository | 2 + .../jdbc/AbstractJdbcMessageIdRepository.java | 12 +- .../jdbc/JdbcMessageIdRepository.java | 14 +++ 11 files changed, 217 insertions(+), 10 deletions(-) create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcMessageIdRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/KafkaIdempotentRepository.json create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MongoDbIdempotentRepository.json create mode 100644 components/camel-sql/src/generated/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepositoryConfigurer.java create mode 100644 components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties create mode 100644 components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcMessageIdRepository.json create mode 100644 components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties index 5980ce40fc071..c5cd55ff179d1 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties @@ -19,9 +19,12 @@ InfinispanRemoteAggregationRepository InfinispanRemoteIdempotentRepository JCacheAggregationRepository JCacheIdempotentRepository +JdbcMessageIdRepository +KafkaIdempotentRepository LevelDBAggregationRepository MemoryAggregationRepository MemoryIdempotentRepository +MongoDbIdempotentRepository OpensearchBulkRequestAggregationStrategy SpringRedisIdempotentRepository StringAggregationStrategy diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcMessageIdRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcMessageIdRepository.json new file mode 100644 index 0000000000000..b8a16845f097c --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcMessageIdRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "JdbcMessageIdRepository", + "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Jdbc Message Id Repository", + "description": "Idempotent repository that uses a SQL database to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-sql", + "version": "4.5.0-SNAPSHOT", + "properties": { "clearString": { "index": 0, "kind": "property", "displayName": "Clear String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to delete all message ids from the table" }, "createString": { "index": 1, "kind": "property", "displayName": "Create String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for creating table" }, "createTableIfNotExists": { "index": 2, "kind": "property", "displayName": "Create Table If Not Exists", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether to create the table in the database if none exists on startup" }, "deleteString": { "index": 3, "kind": "property", "displayName": "Delete String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for deleting message id from the table" }, "insertString": { "index": 4, "kind": "property", "displayName": "Insert String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for inserting a new message id in the table" }, "queryString": { "index": 5, "kind": "property", "displayName": "Query String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for check if message id already exists" }, "tableExistsString": { "index": 6, "kind": "property", "displayName": "Table Exists String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for checking if table exists" }, "tableName": { "index": 7, "kind": "property", "displayName": "Table Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_MESSAGEPROCESSED", "description": "The name of the table to use in the database" }, "jdbcTemplate": { "index": 8, "kind": "property", "displayName": "Jdbc Template", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring JdbcTemplate to use for connecting to the database" }, "processorName": { "index": 9, "kind": "property", "displayName": "Processor Name", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the processor that are used for this repository. Use unique names to separate processors in the same database." }, "transactionTemplate": { "index": 10, "kind": "property", "displayName": "Transaction Template", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring TransactionTemplate to use for connecting to the database" } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/KafkaIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/KafkaIdempotentRepository.json new file mode 100644 index 0000000000000..4787a36b9d6a4 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/KafkaIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "KafkaIdempotentRepository", + "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Kafka Idempotent Repository", + "description": "Idempotent repository that uses Kafka to store message ids. Uses a local cache of previously seen Message IDs. The topic used must be unique per logical repository (i.e. two routes de-duplicate using different repositories, and different topics) On startup, the instance consumes the full content of the topic, rebuilding the cache to the latest state.", + "deprecated": true, + "groupId": "org.apache.camel", + "artifactId": "camel-kafka", + "version": "4.5.0-SNAPSHOT", + "properties": { "bootstrapServers": { "index": 0, "kind": "property", "displayName": "Bootstrap Servers", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The URL for the kafka brokers to use" }, "maxCacheSize": { "index": 1, "kind": "property", "displayName": "Max Cache Size", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the maximum size of the local key cache." }, "pollDurationMs": { "index": 2, "kind": "property", "displayName": "Poll Duration Ms", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "100", "description": "Sets the poll duration of the Kafka consumer. The local caches are updated immediately; this value will affect how far behind other peers in the cluster are, which are updating their caches from the topic, relative to the idempotent consumer instance issued the cache action message. The default value of this is 100 If setting this value explicitly, be aware that there is a tradeoff between the remote cache liveness and the volume of network traffic between this repository's consumer and the Kafka brokers. The cache warmup process also depends on there being one poll that fetches nothing - this indicates that the stream has been consumed up to the current point. If the poll duration is excessively long for the rate at which messages are sent on the topic, there exists a possibility that the cache cannot be warmed up and will operate in an inconsistent state relative to its peers until it catches up." }, "topic": { "index": 3, "kind": "property", "displayName": "Topic", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the name of the Kafka topic used by this idempotent repository. Each functionally-separate repository should use a different topic." } } + } +} + diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MongoDbIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MongoDbIdempotentRepository.json new file mode 100644 index 0000000000000..9f506e8166af6 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MongoDbIdempotentRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "MongoDbIdempotentRepository", + "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Mongo Db Idempotent Repository", + "description": "Idempotent repository that uses MongoDB to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-mongodb", + "version": "4.5.0-SNAPSHOT", + "properties": { "collectionName": { "index": 0, "kind": "property", "displayName": "Collection Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The collection name" }, "dbName": { "index": 1, "kind": "property", "displayName": "Db Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Database name" }, "mongoClient": { "index": 2, "kind": "property", "displayName": "Mongo Client", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The MongoClient to use for connecting to the MongoDB server" } } + } +} + diff --git a/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java b/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java index dc09b95366fa1..ffaf29f4f8d8b 100644 --- a/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java +++ b/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java @@ -67,9 +67,9 @@ * CamelContext aware. */ @Metadata(label = "bean", - description = "Idempotent repository that uses Kafka to store message ids. Uses a local cache of previously seen Message IDs." - + " The topic used must be unique per logical repository (i.e. two routes de-duplicate using different repositories, and different topics)" - + " On startup, the instance consumes the full content of the topic, rebuilding the cache to the latest state.") + description = "Idempotent repository that uses Kafka to store message ids. Uses a local cache of previously seen Message IDs." + + " The topic used must be unique per logical repository (i.e. two routes de-duplicate using different repositories, and different topics)" + + " On startup, the instance consumes the full content of the topic, rebuilding the cache to the latest state.") @Configurer(metadataOnly = true) @ManagedResource(description = "Kafka IdempotentRepository") public class KafkaIdempotentRepository extends ServiceSupport implements IdempotentRepository, CamelContextAware { @@ -91,7 +91,8 @@ public class KafkaIdempotentRepository extends ServiceSupport implements Idempot // configurable @Metadata(description = "Sets the name of the Kafka topic used by this idempotent repository." - + " Each functionally-separate repository should use a different topic.", required = true) + + " Each functionally-separate repository should use a different topic.", + required = true) private String topic; @Metadata(description = "The URL for the kafka brokers to use", required = true) private String bootstrapServers; @@ -105,7 +106,8 @@ public class KafkaIdempotentRepository extends ServiceSupport implements Idempot + " brokers. The cache warmup process also depends on there being one poll that fetches nothing - this indicates that" + " the stream has been consumed up to the current point. If the poll duration is excessively long for the rate at" + " which messages are sent on the topic, there exists a possibility that the cache cannot be warmed up and will" - + " operate in an inconsistent state relative to its peers until it catches up.", defaultValue = "" + DEFAULT_POLL_DURATION_MS) + + " operate in an inconsistent state relative to its peers until it catches up.", + defaultValue = "" + DEFAULT_POLL_DURATION_MS) private int pollDurationMs = DEFAULT_POLL_DURATION_MS; enum CacheAction { @@ -203,8 +205,8 @@ public String getBootstrapServers() { } /** - * Sets the bootstrap.servers property on the internal Kafka producer and consumer. Use this as shorthand if not setting - * {@link #consumerConfig} and {@link #producerConfig}. If used, this component will apply sensible default + * Sets the bootstrap.servers property on the internal Kafka producer and consumer. Use this as shorthand if not + * setting {@link #consumerConfig} and {@link #producerConfig}. If used, this component will apply sensible default * configurations for the producer and consumer. */ public void setBootstrapServers(String bootstrapServers) { diff --git a/components/camel-sql/src/generated/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepositoryConfigurer.java b/components/camel-sql/src/generated/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepositoryConfigurer.java new file mode 100644 index 0000000000000..b5ce0293f25fa --- /dev/null +++ b/components/camel-sql/src/generated/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepositoryConfigurer.java @@ -0,0 +1,109 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.idempotent.jdbc; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class JdbcMessageIdRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository target = (org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "clearstring": + case "ClearString": target.setClearString(property(camelContext, java.lang.String.class, value)); return true; + case "createstring": + case "CreateString": target.setCreateString(property(camelContext, java.lang.String.class, value)); return true; + case "createtableifnotexists": + case "CreateTableIfNotExists": target.setCreateTableIfNotExists(property(camelContext, boolean.class, value)); return true; + case "deletestring": + case "DeleteString": target.setDeleteString(property(camelContext, java.lang.String.class, value)); return true; + case "insertstring": + case "InsertString": target.setInsertString(property(camelContext, java.lang.String.class, value)); return true; + case "jdbctemplate": + case "JdbcTemplate": target.setJdbcTemplate(property(camelContext, org.springframework.jdbc.core.JdbcTemplate.class, value)); return true; + case "processorname": + case "ProcessorName": target.setProcessorName(property(camelContext, java.lang.String.class, value)); return true; + case "querystring": + case "QueryString": target.setQueryString(property(camelContext, java.lang.String.class, value)); return true; + case "tableexistsstring": + case "TableExistsString": target.setTableExistsString(property(camelContext, java.lang.String.class, value)); return true; + case "tablename": + case "TableName": target.setTableName(property(camelContext, java.lang.String.class, value)); return true; + case "transactiontemplate": + case "TransactionTemplate": target.setTransactionTemplate(property(camelContext, org.springframework.transaction.support.TransactionTemplate.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "clearstring": + case "ClearString": return java.lang.String.class; + case "createstring": + case "CreateString": return java.lang.String.class; + case "createtableifnotexists": + case "CreateTableIfNotExists": return boolean.class; + case "deletestring": + case "DeleteString": return java.lang.String.class; + case "insertstring": + case "InsertString": return java.lang.String.class; + case "jdbctemplate": + case "JdbcTemplate": return org.springframework.jdbc.core.JdbcTemplate.class; + case "processorname": + case "ProcessorName": return java.lang.String.class; + case "querystring": + case "QueryString": return java.lang.String.class; + case "tableexistsstring": + case "TableExistsString": return java.lang.String.class; + case "tablename": + case "TableName": return java.lang.String.class; + case "transactiontemplate": + case "TransactionTemplate": return org.springframework.transaction.support.TransactionTemplate.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository target = (org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "clearstring": + case "ClearString": return target.getClearString(); + case "createstring": + case "CreateString": return target.getCreateString(); + case "createtableifnotexists": + case "CreateTableIfNotExists": return target.isCreateTableIfNotExists(); + case "deletestring": + case "DeleteString": return target.getDeleteString(); + case "insertstring": + case "InsertString": return target.getInsertString(); + case "jdbctemplate": + case "JdbcTemplate": return target.getJdbcTemplate(); + case "processorname": + case "ProcessorName": return target.getProcessorName(); + case "querystring": + case "QueryString": return target.getQueryString(); + case "tableexistsstring": + case "TableExistsString": return target.getTableExistsString(); + case "tablename": + case "TableName": return target.getTableName(); + case "transactiontemplate": + case "TransactionTemplate": return target.getTransactionTemplate(); + default: return null; + } + } +} + diff --git a/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties new file mode 100644 index 0000000000000..6739caae45eef --- /dev/null +++ b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +bean=JdbcMessageIdRepository +groupId=org.apache.camel +artifactId=camel-sql +version=4.5.0-SNAPSHOT +projectName=Camel :: SQL +projectDescription=Camel SQL support diff --git a/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcMessageIdRepository.json b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcMessageIdRepository.json new file mode 100644 index 0000000000000..b8a16845f097c --- /dev/null +++ b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcMessageIdRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "JdbcMessageIdRepository", + "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", + "title": "Jdbc Message Id Repository", + "description": "Idempotent repository that uses a SQL database to store message ids.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-sql", + "version": "4.5.0-SNAPSHOT", + "properties": { "clearString": { "index": 0, "kind": "property", "displayName": "Clear String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to delete all message ids from the table" }, "createString": { "index": 1, "kind": "property", "displayName": "Create String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for creating table" }, "createTableIfNotExists": { "index": 2, "kind": "property", "displayName": "Create Table If Not Exists", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether to create the table in the database if none exists on startup" }, "deleteString": { "index": 3, "kind": "property", "displayName": "Delete String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for deleting message id from the table" }, "insertString": { "index": 4, "kind": "property", "displayName": "Insert String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for inserting a new message id in the table" }, "queryString": { "index": 5, "kind": "property", "displayName": "Query String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for check if message id already exists" }, "tableExistsString": { "index": 6, "kind": "property", "displayName": "Table Exists String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for checking if table exists" }, "tableName": { "index": 7, "kind": "property", "displayName": "Table Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_MESSAGEPROCESSED", "description": "The name of the table to use in the database" }, "jdbcTemplate": { "index": 8, "kind": "property", "displayName": "Jdbc Template", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring JdbcTemplate to use for connecting to the database" }, "processorName": { "index": 9, "kind": "property", "displayName": "Processor Name", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the processor that are used for this repository. Use unique names to separate processors in the same database." }, "transactionTemplate": { "index": 10, "kind": "property", "displayName": "Transaction Template", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring TransactionTemplate to use for connecting to the database" } } + } +} + diff --git a/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository new file mode 100644 index 0000000000000..7d7d29d170c6c --- /dev/null +++ b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepositoryConfigurer diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/AbstractJdbcMessageIdRepository.java b/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/AbstractJdbcMessageIdRepository.java index b68b2ef4e333b..17eadaadaafca 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/AbstractJdbcMessageIdRepository.java +++ b/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/AbstractJdbcMessageIdRepository.java @@ -21,6 +21,7 @@ import org.apache.camel.api.management.ManagedOperation; import org.apache.camel.api.management.ManagedResource; import org.apache.camel.spi.IdempotentRepository; +import org.apache.camel.spi.Metadata; import org.apache.camel.support.service.ServiceSupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,11 +52,16 @@ @ManagedResource(description = "JDBC IdempotentRepository") public abstract class AbstractJdbcMessageIdRepository extends ServiceSupport implements IdempotentRepository { - protected JdbcTemplate jdbcTemplate; + protected Logger log = LoggerFactory.getLogger(getClass()); + + @Metadata(description = "The name of the processor that are used for this repository. Use unique names to separate processors in the same database.", + required = true) protected String processorName; + @Metadata(description = "The Spring JdbcTemplate to use for connecting to the database", required = true) + protected JdbcTemplate jdbcTemplate; + @Metadata(description = "The Spring TransactionTemplate to use for connecting to the database", required = true) protected TransactionTemplate transactionTemplate; - protected DataSource dataSource; - protected Logger log = LoggerFactory.getLogger(getClass()); + protected DataSource dataSource; // not in use public AbstractJdbcMessageIdRepository() { } diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepository.java b/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepository.java index af70a6c5a1e52..2b4f55ef15b25 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepository.java +++ b/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepository.java @@ -20,6 +20,8 @@ import javax.sql.DataSource; +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.Metadata; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.TransactionStatus; @@ -29,6 +31,10 @@ /** * Default implementation of {@link AbstractJdbcMessageIdRepository} */ +@Metadata(label = "bean", + description = "Idempotent repository that uses a SQL database to store message ids.", + annotations = { "interfaceName=org.apache.camel.spi.IdempotentRepository" }) +@Configurer(metadataOnly = true) public class JdbcMessageIdRepository extends AbstractJdbcMessageIdRepository { protected static final String DEFAULT_TABLENAME = "CAMEL_MESSAGEPROCESSED"; @@ -44,14 +50,22 @@ public class JdbcMessageIdRepository extends AbstractJdbcMessageIdRepository { = "DELETE FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ? AND messageId = ?"; protected static final String DEFAULT_CLEAR_STRING = "DELETE FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ?"; + @Metadata(description = "Whether to create the table in the database if none exists on startup", defaultValue = "true") private boolean createTableIfNotExists = true; + @Metadata(description = "The name of the table to use in the database", defaultValue = "CAMEL_MESSAGEPROCESSED") private String tableName; + @Metadata(label = "advanced", description = "SQL query to use for checking if table exists") private String tableExistsString = DEFAULT_TABLE_EXISTS_STRING; + @Metadata(label = "advanced", description = "SQL query to use for creating table") private String createString = DEFAULT_CREATE_STRING; + @Metadata(label = "advanced", description = "SQL query to use for check if message id already exists") private String queryString = DEFAULT_QUERY_STRING; + @Metadata(label = "advanced", description = "SQL query to use for inserting a new message id in the table") private String insertString = DEFAULT_INSERT_STRING; + @Metadata(label = "advanced", description = "SQL query to use for deleting message id from the table") private String deleteString = DEFAULT_DELETE_STRING; + @Metadata(label = "advanced", description = "SQL query to delete all message ids from the table") private String clearString = DEFAULT_CLEAR_STRING; public JdbcMessageIdRepository() { From dc6042bf97f79b0f170cb2fb0419b83b495670b1 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Wed, 20 Mar 2024 06:23:45 +0100 Subject: [PATCH 38/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../jdbc/JdbcAggregationRepository.java | 3 + .../dsl/JCacheEndpointBuilderFactory.java | 204 +++++++++--------- .../camel/kotlin/components/JcacheUriDsl.kt | 14 +- 3 files changed, 112 insertions(+), 109 deletions(-) diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java index 0d6653db46c0c..d077ffa6ba77f 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java +++ b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java @@ -33,6 +33,7 @@ import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.RuntimeCamelException; +import org.apache.camel.spi.Metadata; import org.apache.camel.spi.OptimisticLockingAggregationRepository; import org.apache.camel.spi.RecoverableAggregationRepository; import org.apache.camel.support.service.ServiceSupport; @@ -86,6 +87,8 @@ public class JdbcAggregationRepository extends ServiceSupport private DataSource dataSource; private int propagationBehavior = TransactionDefinition.PROPAGATION_REQUIRED; private LobHandler lobHandler = new DefaultLobHandler(); + + @Metadata(description = "The name of the repository.") private String repositoryName; private boolean returnOldExchange; private long recoveryInterval = 5000; diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/JCacheEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/JCacheEndpointBuilderFactory.java index 278d80fb8b778..df0ccab3d9dbb 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/JCacheEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/JCacheEndpointBuilderFactory.java @@ -43,40 +43,6 @@ public interface JCacheEndpointConsumerBuilder default AdvancedJCacheEndpointConsumerBuilder advanced() { return (AdvancedJCacheEndpointConsumerBuilder) this; } - /** - * A Configuration for the Cache. - * - * The option is a: - * <code>javax.cache.configuration.Configuration</code> - * type. - * - * Group: common - * - * @param cacheConfiguration the value to set - * @return the dsl builder - */ - default JCacheEndpointConsumerBuilder cacheConfiguration( - javax.cache.configuration.Configuration cacheConfiguration) { - doSetProperty("cacheConfiguration", cacheConfiguration); - return this; - } - /** - * A Configuration for the Cache. - * - * The option will be converted to a - * <code>javax.cache.configuration.Configuration</code> - * type. - * - * Group: common - * - * @param cacheConfiguration the value to set - * @return the dsl builder - */ - default JCacheEndpointConsumerBuilder cacheConfiguration( - String cacheConfiguration) { - doSetProperty("cacheConfiguration", cacheConfiguration); - return this; - } /** * The Properties for the javax.cache.spi.CachingProvider to create the * CacheManager. @@ -551,6 +517,40 @@ default AdvancedJCacheEndpointConsumerBuilder exchangePattern( doSetProperty("exchangePattern", exchangePattern); return this; } + /** + * A Configuration for the Cache. + * + * The option is a: + * <code>javax.cache.configuration.Configuration</code> + * type. + * + * Group: advanced + * + * @param cacheConfiguration the value to set + * @return the dsl builder + */ + default AdvancedJCacheEndpointConsumerBuilder cacheConfiguration( + javax.cache.configuration.Configuration cacheConfiguration) { + doSetProperty("cacheConfiguration", cacheConfiguration); + return this; + } + /** + * A Configuration for the Cache. + * + * The option will be converted to a + * <code>javax.cache.configuration.Configuration</code> + * type. + * + * Group: advanced + * + * @param cacheConfiguration the value to set + * @return the dsl builder + */ + default AdvancedJCacheEndpointConsumerBuilder cacheConfiguration( + String cacheConfiguration) { + doSetProperty("cacheConfiguration", cacheConfiguration); + return this; + } /** * The CacheLoader factory. * @@ -728,40 +728,6 @@ public interface JCacheEndpointProducerBuilder default AdvancedJCacheEndpointProducerBuilder advanced() { return (AdvancedJCacheEndpointProducerBuilder) this; } - /** - * A Configuration for the Cache. - * - * The option is a: - * <code>javax.cache.configuration.Configuration</code> - * type. - * - * Group: common - * - * @param cacheConfiguration the value to set - * @return the dsl builder - */ - default JCacheEndpointProducerBuilder cacheConfiguration( - javax.cache.configuration.Configuration cacheConfiguration) { - doSetProperty("cacheConfiguration", cacheConfiguration); - return this; - } - /** - * A Configuration for the Cache. - * - * The option will be converted to a - * <code>javax.cache.configuration.Configuration</code> - * type. - * - * Group: common - * - * @param cacheConfiguration the value to set - * @return the dsl builder - */ - default JCacheEndpointProducerBuilder cacheConfiguration( - String cacheConfiguration) { - doSetProperty("cacheConfiguration", cacheConfiguration); - return this; - } /** * The Properties for the javax.cache.spi.CachingProvider to create the * CacheManager. @@ -1061,6 +1027,40 @@ default AdvancedJCacheEndpointProducerBuilder lazyStartProducer( doSetProperty("lazyStartProducer", lazyStartProducer); return this; } + /** + * A Configuration for the Cache. + * + * The option is a: + * <code>javax.cache.configuration.Configuration</code> + * type. + * + * Group: advanced + * + * @param cacheConfiguration the value to set + * @return the dsl builder + */ + default AdvancedJCacheEndpointProducerBuilder cacheConfiguration( + javax.cache.configuration.Configuration cacheConfiguration) { + doSetProperty("cacheConfiguration", cacheConfiguration); + return this; + } + /** + * A Configuration for the Cache. + * + * The option will be converted to a + * <code>javax.cache.configuration.Configuration</code> + * type. + * + * Group: advanced + * + * @param cacheConfiguration the value to set + * @return the dsl builder + */ + default AdvancedJCacheEndpointProducerBuilder cacheConfiguration( + String cacheConfiguration) { + doSetProperty("cacheConfiguration", cacheConfiguration); + return this; + } /** * The CacheLoader factory. * @@ -1239,40 +1239,6 @@ public interface JCacheEndpointBuilder default AdvancedJCacheEndpointBuilder advanced() { return (AdvancedJCacheEndpointBuilder) this; } - /** - * A Configuration for the Cache. - * - * The option is a: - * <code>javax.cache.configuration.Configuration</code> - * type. - * - * Group: common - * - * @param cacheConfiguration the value to set - * @return the dsl builder - */ - default JCacheEndpointBuilder cacheConfiguration( - javax.cache.configuration.Configuration cacheConfiguration) { - doSetProperty("cacheConfiguration", cacheConfiguration); - return this; - } - /** - * A Configuration for the Cache. - * - * The option will be converted to a - * <code>javax.cache.configuration.Configuration</code> - * type. - * - * Group: common - * - * @param cacheConfiguration the value to set - * @return the dsl builder - */ - default JCacheEndpointBuilder cacheConfiguration( - String cacheConfiguration) { - doSetProperty("cacheConfiguration", cacheConfiguration); - return this; - } /** * The Properties for the javax.cache.spi.CachingProvider to create the * CacheManager. @@ -1504,6 +1470,40 @@ public interface AdvancedJCacheEndpointBuilder default JCacheEndpointBuilder basic() { return (JCacheEndpointBuilder) this; } + /** + * A Configuration for the Cache. + * + * The option is a: + * <code>javax.cache.configuration.Configuration</code> + * type. + * + * Group: advanced + * + * @param cacheConfiguration the value to set + * @return the dsl builder + */ + default AdvancedJCacheEndpointBuilder cacheConfiguration( + javax.cache.configuration.Configuration cacheConfiguration) { + doSetProperty("cacheConfiguration", cacheConfiguration); + return this; + } + /** + * A Configuration for the Cache. + * + * The option will be converted to a + * <code>javax.cache.configuration.Configuration</code> + * type. + * + * Group: advanced + * + * @param cacheConfiguration the value to set + * @return the dsl builder + */ + default AdvancedJCacheEndpointBuilder cacheConfiguration( + String cacheConfiguration) { + doSetProperty("cacheConfiguration", cacheConfiguration); + return this; + } /** * The CacheLoader factory. * diff --git a/dsl/camel-kotlin-api/src/generated/kotlin/org/apache/camel/kotlin/components/JcacheUriDsl.kt b/dsl/camel-kotlin-api/src/generated/kotlin/org/apache/camel/kotlin/components/JcacheUriDsl.kt index 6f0f739a427d4..a9b4eb1cc2450 100644 --- a/dsl/camel-kotlin-api/src/generated/kotlin/org/apache/camel/kotlin/components/JcacheUriDsl.kt +++ b/dsl/camel-kotlin-api/src/generated/kotlin/org/apache/camel/kotlin/components/JcacheUriDsl.kt @@ -50,13 +50,6 @@ public class JcacheUriDsl( it.url("$cacheName") } - /** - * A Configuration for the Cache - */ - public fun cacheConfiguration(cacheConfiguration: String) { - it.property("cacheConfiguration", cacheConfiguration) - } - /** * The Properties for the javax.cache.spi.CachingProvider to create the CacheManager */ @@ -270,6 +263,13 @@ public class JcacheUriDsl( it.property("lazyStartProducer", lazyStartProducer.toString()) } + /** + * A Configuration for the Cache + */ + public fun cacheConfiguration(cacheConfiguration: String) { + it.property("cacheConfiguration", cacheConfiguration) + } + /** * The CacheLoader factory */ From d6120f5fddd992ef0e17122d52b654af16c80aeb Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Wed, 20 Mar 2024 07:05:26 +0100 Subject: [PATCH 39/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../JdbcAggregationRepositoryConfigurer.java | 136 ++++++++++++++++++ .../services/org/apache/camel/bean.properties | 2 +- .../camel/bean/JdbcAggregationRepository.json | 16 +++ ...r.aggregate.jdbc.JdbcAggregationRepository | 2 + .../ClusteredJdbcAggregationRepository.java | 2 +- ...lusteredPostgresAggregationRepository.java | 2 +- .../jdbc/JdbcAggregationRepository.java | 71 ++++++--- .../jdbc/PostgresAggregationRepository.java | 2 +- .../jdbc/JdbcAggregateStoreAsTextTest.java | 3 +- 9 files changed, 215 insertions(+), 21 deletions(-) create mode 100644 components/camel-sql/src/generated/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepositoryConfigurer.java create mode 100644 components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcAggregationRepository.json create mode 100644 components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository diff --git a/components/camel-sql/src/generated/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepositoryConfigurer.java b/components/camel-sql/src/generated/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepositoryConfigurer.java new file mode 100644 index 0000000000000..eb4b398aeda35 --- /dev/null +++ b/components/camel-sql/src/generated/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepositoryConfigurer.java @@ -0,0 +1,136 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.aggregate.jdbc; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class JdbcAggregationRepositoryConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository target = (org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": target.setAllowSerializedHeaders(property(camelContext, boolean.class, value)); return true; + case "datasource": + case "DataSource": target.setDataSource(property(camelContext, javax.sql.DataSource.class, value)); return true; + case "deadletteruri": + case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true; + case "deserializationfilter": + case "DeserializationFilter": target.setDeserializationFilter(property(camelContext, java.lang.String.class, value)); return true; + case "headerstostoreastext": + case "HeadersToStoreAsText": target.setHeadersToStoreAsText(property(camelContext, java.util.List.class, value)); return true; + case "jdbcoptimisticlockingexceptionmapper": + case "JdbcOptimisticLockingExceptionMapper": target.setJdbcOptimisticLockingExceptionMapper(property(camelContext, org.apache.camel.processor.aggregate.jdbc.JdbcOptimisticLockingExceptionMapper.class, value)); return true; + case "lobhandler": + case "LobHandler": target.setLobHandler(property(camelContext, org.springframework.jdbc.support.lob.LobHandler.class, value)); return true; + case "maximumredeliveries": + case "MaximumRedeliveries": target.setMaximumRedeliveries(property(camelContext, int.class, value)); return true; + case "propagationbehaviorname": + case "PropagationBehaviorName": target.setPropagationBehaviorName(property(camelContext, java.lang.String.class, value)); return true; + case "recoveryinterval": + case "RecoveryInterval": target.setRecoveryInterval(property(camelContext, long.class, value)); return true; + case "repositoryname": + case "RepositoryName": target.setRepositoryName(property(camelContext, java.lang.String.class, value)); return true; + case "storebodyastext": + case "StoreBodyAsText": target.setStoreBodyAsText(property(camelContext, boolean.class, value)); return true; + case "transactionmanager": + case "TransactionManager": target.setTransactionManager(property(camelContext, org.springframework.transaction.PlatformTransactionManager.class, value)); return true; + case "userecovery": + case "UseRecovery": target.setUseRecovery(property(camelContext, boolean.class, value)); return true; + default: return false; + } + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return boolean.class; + case "datasource": + case "DataSource": return javax.sql.DataSource.class; + case "deadletteruri": + case "DeadLetterUri": return java.lang.String.class; + case "deserializationfilter": + case "DeserializationFilter": return java.lang.String.class; + case "headerstostoreastext": + case "HeadersToStoreAsText": return java.util.List.class; + case "jdbcoptimisticlockingexceptionmapper": + case "JdbcOptimisticLockingExceptionMapper": return org.apache.camel.processor.aggregate.jdbc.JdbcOptimisticLockingExceptionMapper.class; + case "lobhandler": + case "LobHandler": return org.springframework.jdbc.support.lob.LobHandler.class; + case "maximumredeliveries": + case "MaximumRedeliveries": return int.class; + case "propagationbehaviorname": + case "PropagationBehaviorName": return java.lang.String.class; + case "recoveryinterval": + case "RecoveryInterval": return long.class; + case "repositoryname": + case "RepositoryName": return java.lang.String.class; + case "storebodyastext": + case "StoreBodyAsText": return boolean.class; + case "transactionmanager": + case "TransactionManager": return org.springframework.transaction.PlatformTransactionManager.class; + case "userecovery": + case "UseRecovery": return boolean.class; + default: return null; + } + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository target = (org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowserializedheaders": + case "AllowSerializedHeaders": return target.isAllowSerializedHeaders(); + case "datasource": + case "DataSource": return target.getDataSource(); + case "deadletteruri": + case "DeadLetterUri": return target.getDeadLetterUri(); + case "deserializationfilter": + case "DeserializationFilter": return target.getDeserializationFilter(); + case "headerstostoreastext": + case "HeadersToStoreAsText": return target.getHeadersToStoreAsText(); + case "jdbcoptimisticlockingexceptionmapper": + case "JdbcOptimisticLockingExceptionMapper": return target.getJdbcOptimisticLockingExceptionMapper(); + case "lobhandler": + case "LobHandler": return target.getLobHandler(); + case "maximumredeliveries": + case "MaximumRedeliveries": return target.getMaximumRedeliveries(); + case "propagationbehaviorname": + case "PropagationBehaviorName": return target.getPropagationBehaviorName(); + case "recoveryinterval": + case "RecoveryInterval": return target.getRecoveryInterval(); + case "repositoryname": + case "RepositoryName": return target.getRepositoryName(); + case "storebodyastext": + case "StoreBodyAsText": return target.isStoreBodyAsText(); + case "transactionmanager": + case "TransactionManager": return target.getTransactionManager(); + case "userecovery": + case "UseRecovery": return target.isUseRecovery(); + default: return null; + } + } + + @Override + public Object getCollectionValueType(Object target, String name, boolean ignoreCase) { + switch (ignoreCase ? name.toLowerCase() : name) { + case "headerstostoreastext": + case "HeadersToStoreAsText": return java.lang.String.class; + default: return null; + } + } +} + diff --git a/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties index 6739caae45eef..71dd5efccd923 100644 --- a/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties +++ b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean.properties @@ -1,5 +1,5 @@ # Generated by camel build tools - do NOT edit this file! -bean=JdbcMessageIdRepository +bean=JdbcAggregationRepository JdbcMessageIdRepository groupId=org.apache.camel artifactId=camel-sql version=4.5.0-SNAPSHOT diff --git a/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcAggregationRepository.json b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcAggregationRepository.json new file mode 100644 index 0000000000000..21943b5f47712 --- /dev/null +++ b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "JdbcAggregationRepository", + "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", + "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "title": "Jdbc Aggregation Repository", + "description": "Aggregation repository that uses SQL database to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-sql", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "dataSource": { "index": 1, "kind": "property", "displayName": "Data Source", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The DataSource to use for connecting to the database" }, "deadLetterUri": { "index": 2, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "deserializationFilter": { "index": 3, "kind": "property", "displayName": "Deserialization Filter", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "java.**;org.apache.camel.**;!*", "description": "Sets a deserialization filter while reading Object from Aggregation Repository. By default the filter will allow all java packages and subpackages and all org.apache.camel packages and subpackages, while the remaining will be blacklisted and not deserialized. This parameter should be customized if you're using classes you trust to be deserialized." }, "headersToStoreAsText": { "index": 4, "kind": "property", "displayName": "Headers To Store As Text", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to store headers as String which is human readable. By default this option is disabled, storing the headers in binary format. Multiple header names can be separated by comma." }, "jdbcOptimisticLockingExceptionMapper": { "index": 5, "kind": "property", "displayName": "Jdbc Optimistic Locking Exception Mapper", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Mapper allowing different JDBC vendors to be mapped with vendor specific error codes to an OptimisticLockingException" }, "lobHandler": { "index": 6, "kind": "property", "displayName": "Lob Handler", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom LobHandler" }, "maximumRedeliveries": { "index": 7, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 8, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "repositoryName": { "index": 9, "kind": "property", "displayName": "Repository Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the repository." }, "storeBodyAsText": { "index": 10, "kind": "property", "displayName": "Store Body As Text", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to store the message body as String which is human readable. By default this option is false storing the body in binary format." }, "transactionManager": { "index": 11, "kind": "property", "displayName": "Transaction Manager", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring TransactionManager to use for connecting to the database" }, "useRecovery": { "index": 12, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + diff --git a/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository new file mode 100644 index 0000000000000..c37a4ee368b88 --- /dev/null +++ b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepositoryConfigurer diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/ClusteredJdbcAggregationRepository.java b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/ClusteredJdbcAggregationRepository.java index 0c87afc0de365..04f3d7a957190 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/ClusteredJdbcAggregationRepository.java +++ b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/ClusteredJdbcAggregationRepository.java @@ -136,7 +136,7 @@ protected int insertHelper( final CamelContext camelContext, final String key, final Exchange exchange, final String sql, final Long version, final boolean completed) throws Exception { - final byte[] data = codec.marshallExchange(exchange, allowSerializedHeaders); + final byte[] data = jdbcCamelCodec.marshallExchange(exchange, isAllowSerializedHeaders()); Integer insertCount = super.jdbcTemplate.execute(sql, new AbstractLobCreatingPreparedStatementCallback(getLobHandler()) { @Override diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/ClusteredPostgresAggregationRepository.java b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/ClusteredPostgresAggregationRepository.java index fdb0b75215aba..dd46bce0e628c 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/ClusteredPostgresAggregationRepository.java +++ b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/ClusteredPostgresAggregationRepository.java @@ -25,7 +25,7 @@ /** * PostgreSQL specific {@link JdbcAggregationRepository} that deals with SQL Violation Exceptions using special - * {@code INSERT INTO .. ON CONFLICT DO NOTHING} claues. + * {@code INSERT INTO .. ON CONFLICT DO NOTHING} clause. */ public class ClusteredPostgresAggregationRepository extends ClusteredJdbcAggregationRepository { diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java index d077ffa6ba77f..7c54824b43b9e 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java +++ b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java @@ -33,6 +33,7 @@ import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.RuntimeCamelException; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.OptimisticLockingAggregationRepository; import org.apache.camel.spi.RecoverableAggregationRepository; @@ -61,6 +62,10 @@ * Serializable compatible data types. If a data type is not such a type its dropped and a WARN is logged. And it only * persists the Message body and the Message headers. The Exchange properties are not persisted. */ +@Metadata(label = "bean", + description = "Aggregation repository that uses SQL database to store exchanges.", + annotations = { "interfaceName=org.apache.camel.spi.AggregationRepository" }) +@Configurer(metadataOnly = true) public class JdbcAggregationRepository extends ServiceSupport implements RecoverableAggregationRepository, OptimisticLockingAggregationRepository { @@ -75,29 +80,46 @@ public class JdbcAggregationRepository extends ServiceSupport private static final Logger LOG = LoggerFactory.getLogger(JdbcAggregationRepository.class); private static final Constants PROPAGATION_CONSTANTS = new Constants(TransactionDefinition.class); - protected JdbcCamelCodec codec = new JdbcCamelCodec(); - protected JdbcTemplate jdbcTemplate; + protected JdbcCamelCodec jdbcCamelCodec = new JdbcCamelCodec(); protected TransactionTemplate transactionTemplate; protected TransactionTemplate transactionTemplateReadOnly; - protected boolean allowSerializedHeaders; + protected JdbcTemplate jdbcTemplate; + private boolean returnOldExchange; + private int propagationBehavior = TransactionDefinition.PROPAGATION_REQUIRED; - private JdbcOptimisticLockingExceptionMapper jdbcOptimisticLockingExceptionMapper - = new DefaultJdbcOptimisticLockingExceptionMapper(); + @Metadata(description = "The Spring TransactionManager to use for connecting to the database", required = true) private PlatformTransactionManager transactionManager; + @Metadata(description = "The DataSource to use for connecting to the database", required = true) private DataSource dataSource; - private int propagationBehavior = TransactionDefinition.PROPAGATION_REQUIRED; + @Metadata(label = "advanced", description = "To use a custom LobHandler") private LobHandler lobHandler = new DefaultLobHandler(); - @Metadata(description = "The name of the repository.") private String repositoryName; - private boolean returnOldExchange; + @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; + @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; + @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." + + " When this limit is hit, then the Exchange is moved to the dead letter channel.") private int maximumRedeliveries; + @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") private String deadLetterUri; + @Metadata(label = "advanced", + description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") + private boolean allowSerializedHeaders; + @Metadata(javaType = "java.lang.String", description = "Allows to store headers as String which is human readable. By default this option is disabled, storing the headers in binary format." + + " Multiple header names can be separated by comma.") private List headersToStoreAsText; + @Metadata(description = "Whether to store the message body as String which is human readable. By default this option is false storing the body in binary format.") private boolean storeBodyAsText; + @Metadata(label = "security", defaultValue = "java.**;org.apache.camel.**;!*", + description = "Sets a deserialization filter while reading Object from Aggregation Repository. By default the filter will allow" + + " all java packages and subpackages and all org.apache.camel packages and subpackages, while the remaining will be" + + " blacklisted and not deserialized. This parameter should be customized if you're using classes you trust to be deserialized.") private String deserializationFilter = "java.**;org.apache.camel.**;!*"; + @Metadata(label = "advanced", description = "Mapper allowing different JDBC vendors to be mapped with vendor specific error codes to an OptimisticLockingException") + private JdbcOptimisticLockingExceptionMapper jdbcOptimisticLockingExceptionMapper + = new DefaultJdbcOptimisticLockingExceptionMapper(); /** * Creates an aggregation repository @@ -122,17 +144,24 @@ public final void setRepositoryName(String repositoryName) { this.repositoryName = repositoryName; } + public PlatformTransactionManager getTransactionManager() { + return transactionManager; + } + public final void setTransactionManager(PlatformTransactionManager transactionManager) { this.transactionManager = transactionManager; } + public DataSource getDataSource() { + return dataSource; + } + /** * Sets the DataSource to use for accessing the database */ public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; - - jdbcTemplate = new JdbcTemplate(dataSource); + this.jdbcTemplate = new JdbcTemplate(dataSource); } @Override @@ -279,7 +308,7 @@ protected void insert( protected int insertHelper( final CamelContext camelContext, final String key, final Exchange exchange, String sql, final Long version) throws Exception { - final byte[] data = codec.marshallExchange(exchange, allowSerializedHeaders); + final byte[] data = jdbcCamelCodec.marshallExchange(exchange, allowSerializedHeaders); Integer insertCount = jdbcTemplate.execute(sql, new AbstractLobCreatingPreparedStatementCallback(getLobHandler()) { @Override @@ -305,7 +334,7 @@ protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQL protected int updateHelper( final CamelContext camelContext, final String key, final Exchange exchange, String sql, final Long version) throws Exception { - final byte[] data = codec.marshallExchange(exchange, allowSerializedHeaders); + final byte[] data = jdbcCamelCodec.marshallExchange(exchange, allowSerializedHeaders); Integer updateCount = jdbcTemplate.execute(sql, new AbstractLobCreatingPreparedStatementCallback(getLobHandler()) { @Override @@ -359,7 +388,7 @@ public Exchange doInTransaction(TransactionStatus status) { version = (long) versionObj; } - Exchange result = codec.unmarshallExchange(camelContext, marshalledExchange, deserializationFilter); + Exchange result = jdbcCamelCodec.unmarshallExchange(camelContext, marshalledExchange, deserializationFilter); result.setProperty(VERSION_PROPERTY, version); return result; @@ -529,8 +558,12 @@ public void setReturnOldExchange(boolean returnOldExchange) { this.returnOldExchange = returnOldExchange; } + public JdbcCamelCodec getJdbcCamelCodec() { + return jdbcCamelCodec; + } + public void setJdbcCamelCodec(JdbcCamelCodec codec) { - this.codec = codec; + this.jdbcCamelCodec = codec; } public boolean hasHeadersToStoreAsText() { @@ -551,6 +584,10 @@ public void setHeadersToStoreAsText(List headersToStoreAsText) { this.headersToStoreAsText = headersToStoreAsText; } + public void setHeadersToStoreAsText(String headers) { + this.headersToStoreAsText = List.of(headers.split(",")); + } + public boolean isStoreBodyAsText() { return storeBodyAsText; } @@ -583,12 +620,14 @@ public void setPropagationBehavior(int propagationBehavior) { this.propagationBehavior = propagationBehavior; } + public String getPropagationBehaviorName() { + return PROPAGATION_CONSTANTS.asString("" + propagationBehavior); + } + /** * Sets propagation behavior to use with spring transaction templates which are used for database access. The * default is TransactionDefinition.PROPAGATION_REQUIRED. This setter accepts names of the constants, like * "PROPAGATION_REQUIRED". - * - * @param propagationBehaviorName */ public void setPropagationBehaviorName(String propagationBehaviorName) { if (!propagationBehaviorName.startsWith(DefaultTransactionDefinition.PREFIX_PROPAGATION)) { diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/PostgresAggregationRepository.java b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/PostgresAggregationRepository.java index 585011782f2da..e906f6fc75c3b 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/PostgresAggregationRepository.java +++ b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/PostgresAggregationRepository.java @@ -25,7 +25,7 @@ /** * PostgreSQL specific {@link JdbcAggregationRepository} that deals with SQL Violation Exceptions using special - * {@code INSERT INTO .. ON CONFLICT DO NOTHING} claues. + * {@code INSERT INTO .. ON CONFLICT DO NOTHING} clause. */ public class PostgresAggregationRepository extends JdbcAggregationRepository { diff --git a/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregateStoreAsTextTest.java b/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregateStoreAsTextTest.java index 3d12b9571c18a..d2e6c71d63815 100644 --- a/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregateStoreAsTextTest.java +++ b/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregateStoreAsTextTest.java @@ -18,6 +18,7 @@ import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.sql.DataSource; @@ -103,7 +104,7 @@ public void testStoreBodyAsTextAndNoHeaders() throws Exception { mock.expectedBodiesReceived("ABCDE"); repo.setStoreBodyAsText(true); - repo.setHeadersToStoreAsText(null); + repo.setHeadersToStoreAsText((List) null); Map headers = new HashMap<>(); headers.put("id", 123); From f89e9f856378d12f1a83713fc6f38c5a139390dd Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Wed, 20 Mar 2024 07:06:16 +0100 Subject: [PATCH 40/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../jdbc/JdbcAggregationRepository.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java index 7c54824b43b9e..b5f424b821067 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java +++ b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java @@ -63,8 +63,8 @@ * persists the Message body and the Message headers. The Exchange properties are not persisted. */ @Metadata(label = "bean", - description = "Aggregation repository that uses SQL database to store exchanges.", - annotations = { "interfaceName=org.apache.camel.spi.AggregationRepository" }) + description = "Aggregation repository that uses SQL database to store exchanges.", + annotations = { "interfaceName=org.apache.camel.spi.AggregationRepository" }) @Configurer(metadataOnly = true) public class JdbcAggregationRepository extends ServiceSupport implements RecoverableAggregationRepository, OptimisticLockingAggregationRepository { @@ -105,19 +105,21 @@ public class JdbcAggregationRepository extends ServiceSupport @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") private String deadLetterUri; @Metadata(label = "advanced", - description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") + description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") private boolean allowSerializedHeaders; - @Metadata(javaType = "java.lang.String", description = "Allows to store headers as String which is human readable. By default this option is disabled, storing the headers in binary format." + @Metadata(javaType = "java.lang.String", + description = "Allows to store headers as String which is human readable. By default this option is disabled, storing the headers in binary format." + " Multiple header names can be separated by comma.") private List headersToStoreAsText; @Metadata(description = "Whether to store the message body as String which is human readable. By default this option is false storing the body in binary format.") private boolean storeBodyAsText; @Metadata(label = "security", defaultValue = "java.**;org.apache.camel.**;!*", - description = "Sets a deserialization filter while reading Object from Aggregation Repository. By default the filter will allow" - + " all java packages and subpackages and all org.apache.camel packages and subpackages, while the remaining will be" - + " blacklisted and not deserialized. This parameter should be customized if you're using classes you trust to be deserialized.") + description = "Sets a deserialization filter while reading Object from Aggregation Repository. By default the filter will allow" + + " all java packages and subpackages and all org.apache.camel packages and subpackages, while the remaining will be" + + " blacklisted and not deserialized. This parameter should be customized if you're using classes you trust to be deserialized.") private String deserializationFilter = "java.**;org.apache.camel.**;!*"; - @Metadata(label = "advanced", description = "Mapper allowing different JDBC vendors to be mapped with vendor specific error codes to an OptimisticLockingException") + @Metadata(label = "advanced", + description = "Mapper allowing different JDBC vendors to be mapped with vendor specific error codes to an OptimisticLockingException") private JdbcOptimisticLockingExceptionMapper jdbcOptimisticLockingExceptionMapper = new DefaultJdbcOptimisticLockingExceptionMapper(); @@ -388,7 +390,8 @@ public Exchange doInTransaction(TransactionStatus status) { version = (long) versionObj; } - Exchange result = jdbcCamelCodec.unmarshallExchange(camelContext, marshalledExchange, deserializationFilter); + Exchange result + = jdbcCamelCodec.unmarshallExchange(camelContext, marshalledExchange, deserializationFilter); result.setProperty(VERSION_PROPERTY, version); return result; From cbefa46263463f6deb1181b9c249845a1fb5f3d7 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Wed, 20 Mar 2024 07:12:42 +0100 Subject: [PATCH 41/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../org/apache/camel/catalog/beans.properties | 1 + .../catalog/beans/JdbcAggregationRepository.json | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcAggregationRepository.json diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties index c5cd55ff179d1..6482327ff3574 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties @@ -19,6 +19,7 @@ InfinispanRemoteAggregationRepository InfinispanRemoteIdempotentRepository JCacheAggregationRepository JCacheIdempotentRepository +JdbcAggregationRepository JdbcMessageIdRepository KafkaIdempotentRepository LevelDBAggregationRepository diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcAggregationRepository.json new file mode 100644 index 0000000000000..21943b5f47712 --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcAggregationRepository.json @@ -0,0 +1,16 @@ +{ + "bean": { + "kind": "bean", + "name": "JdbcAggregationRepository", + "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", + "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "title": "Jdbc Aggregation Repository", + "description": "Aggregation repository that uses SQL database to store exchanges.", + "deprecated": false, + "groupId": "org.apache.camel", + "artifactId": "camel-sql", + "version": "4.5.0-SNAPSHOT", + "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "dataSource": { "index": 1, "kind": "property", "displayName": "Data Source", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The DataSource to use for connecting to the database" }, "deadLetterUri": { "index": 2, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "deserializationFilter": { "index": 3, "kind": "property", "displayName": "Deserialization Filter", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "java.**;org.apache.camel.**;!*", "description": "Sets a deserialization filter while reading Object from Aggregation Repository. By default the filter will allow all java packages and subpackages and all org.apache.camel packages and subpackages, while the remaining will be blacklisted and not deserialized. This parameter should be customized if you're using classes you trust to be deserialized." }, "headersToStoreAsText": { "index": 4, "kind": "property", "displayName": "Headers To Store As Text", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to store headers as String which is human readable. By default this option is disabled, storing the headers in binary format. Multiple header names can be separated by comma." }, "jdbcOptimisticLockingExceptionMapper": { "index": 5, "kind": "property", "displayName": "Jdbc Optimistic Locking Exception Mapper", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Mapper allowing different JDBC vendors to be mapped with vendor specific error codes to an OptimisticLockingException" }, "lobHandler": { "index": 6, "kind": "property", "displayName": "Lob Handler", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom LobHandler" }, "maximumRedeliveries": { "index": 7, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 8, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "repositoryName": { "index": 9, "kind": "property", "displayName": "Repository Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the repository." }, "storeBodyAsText": { "index": 10, "kind": "property", "displayName": "Store Body As Text", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to store the message body as String which is human readable. By default this option is false storing the body in binary format." }, "transactionManager": { "index": 11, "kind": "property", "displayName": "Transaction Manager", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring TransactionManager to use for connecting to the database" }, "useRecovery": { "index": 12, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + } +} + From 7c09ade9e1438d0d03436fda066f745093d0e5b4 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Wed, 20 Mar 2024 07:36:44 +0100 Subject: [PATCH 42/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../beans/CaffeineAggregationRepository.json | 2 +- .../beans/CassandraAggregationRepository.json | 2 +- .../beans/EhcacheAggregationRepository.json | 2 +- .../beans/Etcd3AggregationRepository.json | 2 +- .../beans/HazelcastAggregationRepository.json | 2 +- .../beans/JCacheAggregationRepository.json | 2 +- .../beans/JCacheIdempotentRepository.json | 2 +- .../beans/JdbcAggregationRepository.json | 2 +- .../beans/LevelDBAggregationRepository.json | 2 +- .../beans/MemoryAggregationRepository.json | 2 +- .../bean/CaffeineAggregationRepository.json | 2 +- .../CaffeineIdempotentRepository.java | 3 +- .../bean/CassandraAggregationRepository.json | 2 +- .../NamedCassandraAggregationRepository.java | 1 + .../CassandraIdempotentRepository.java | 3 +- .../NamedCassandraIdempotentRepository.java | 1 + .../bean/EhcacheAggregationRepository.json | 2 +- .../EhcacheIdempotentRepository.java | 3 +- ...hsearchBulkRequestAggregationStrategy.java | 3 +- .../bean/Etcd3AggregationRepository.json | 2 +- .../bean/HazelcastAggregationRepository.json | 2 +- .../HazelcastIdempotentRepository.java | 3 +- .../bean/JCacheAggregationRepository.json | 2 +- .../bean/JCacheIdempotentRepository.json | 2 +- .../JCacheIdempotentRepository.java | 3 +- .../kafka/KafkaIdempotentRepository.java | 7 ++-- .../bean/LevelDBAggregationRepository.json | 2 +- .../MongoDbIdempotentRepository.java | 3 +- ...nsearchBulkRequestAggregationStrategy.java | 3 +- .../SpringRedisIdempotentRepository.java | 3 +- .../camel/bean/JdbcAggregationRepository.json | 2 +- .../tarfile/TarAggregationStrategy.java | 5 +-- .../xslt/XsltAggregationStrategy.java | 3 +- .../zipfile/ZipAggregationStrategy.java | 5 +-- ...upedBodyAggregationStrategyConfigurer.java | 35 +++++++++++++++++++ ...ExchangeAggregationStrategyConfigurer.java | 35 +++++++++++++++++++ ...dMessageAggregationStrategyConfigurer.java | 35 +++++++++++++++++++ ...seLatestAggregationStrategyConfigurer.java | 35 +++++++++++++++++++ ...OriginalAggregationStrategyConfigurer.java | 35 +++++++++++++++++++ .../bean/MemoryAggregationRepository.json | 2 +- ...r.aggregate.GroupedBodyAggregationStrategy | 2 ++ ...gregate.GroupedExchangeAggregationStrategy | 2 ++ ...ggregate.GroupedMessageAggregationStrategy | 2 ++ ...sor.aggregate.UseLatestAggregationStrategy | 2 ++ ...r.aggregate.UseOriginalAggregationStrategy | 2 ++ .../GroupedBodyAggregationStrategy.java | 9 +++-- .../GroupedExchangeAggregationStrategy.java | 9 +++-- .../GroupedMessageAggregationStrategy.java | 9 +++-- .../MemoryAggregationRepository.java | 3 +- .../aggregate/StringAggregationStrategy.java | 5 +-- .../UseLatestAggregationStrategy.java | 9 +++-- .../UseOriginalAggregationStrategy.java | 9 +++-- .../support/DefaultHeaderFilterStrategy.java | 3 +- .../idempotent/FileIdempotentRepository.java | 3 +- .../MemoryIdempotentRepository.java | 5 +-- .../maven/packaging/GeneratePojoBeanMojo.java | 6 ++-- 56 files changed, 282 insertions(+), 62 deletions(-) create mode 100644 core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategyConfigurer.java create mode 100644 core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategyConfigurer.java create mode 100644 core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategyConfigurer.java create mode 100644 core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategyConfigurer.java create mode 100644 core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategyConfigurer.java create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategy create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.GroupedMessageAggregationStrategy create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.UseLatestAggregationStrategy create mode 100644 core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.UseOriginalAggregationStrategy diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineAggregationRepository.json index 0d363487986ed..350606540cf4e 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "CaffeineAggregationRepository", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", - "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "Caffeine Aggregation Repository", "description": "Aggregation repository that uses Caffeine Cache to store exchanges.", "deprecated": false, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraAggregationRepository.json index bd9516e9eb5ed..98d5e72e4f7fc 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "CassandraAggregationRepository", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", - "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "Cassandra Aggregation Repository", "description": "Aggregation repository that uses Cassandra table to store exchanges. Advice: use LeveledCompaction for this table and tune read\/write consistency levels.", "deprecated": false, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheAggregationRepository.json index 3421a8d2be0af..c8fde386e07ee 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "EhcacheAggregationRepository", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", - "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "Ehcache Aggregation Repository", "description": "Aggregation repository that uses Caffeine Cache to store exchanges.", "deprecated": false, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/Etcd3AggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/Etcd3AggregationRepository.json index 2b075657c4378..7549f4c8a9d9e 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/Etcd3AggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/Etcd3AggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "Etcd3AggregationRepository", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", - "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "Etcd3 Aggregation Repository", "description": "Aggregation repository that uses Etcd3 to store exchanges.", "deprecated": false, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastAggregationRepository.json index 5588f59f62960..a07a7d2ab8705 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "HazelcastAggregationRepository", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", - "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "Hazelcast Aggregation Repository", "description": "Aggregation repository that uses Hazelcast Cache to store exchanges.", "deprecated": false, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheAggregationRepository.json index 5a5b2eddaaede..0aca13c8207e8 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "JCacheAggregationRepository", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", - "interfaceType": "org.apache.camel.CamelContextAware", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "JCache Aggregation Repository", "description": "Aggregation repository that uses JCache to store exchanges.", "deprecated": false, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheIdempotentRepository.json index 8337b15a5aee7..76e7c1861cb98 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheIdempotentRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheIdempotentRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "JCacheIdempotentRepository", "javaType": "org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository", - "interfaceType": "org.apache.camel.CamelContextAware", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", "title": "JCache Idempotent Repository", "description": "Idempotent repository that uses JCache to store message ids.", "deprecated": false, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcAggregationRepository.json index 21943b5f47712..cfb3773f0ecfc 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "JdbcAggregationRepository", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", - "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "interfaceType": "org.apache.camel.spi.AggregationRepository", "title": "Jdbc Aggregation Repository", "description": "Aggregation repository that uses SQL database to store exchanges.", "deprecated": false, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/LevelDBAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/LevelDBAggregationRepository.json index 59893b87d1d30..6377dcc1f7412 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/LevelDBAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/LevelDBAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "LevelDBAggregationRepository", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", - "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "Level DBAggregation Repository", "description": "Aggregation repository that uses LevelDB to store exchanges.", "deprecated": false, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryAggregationRepository.json index dc43b4d1eedda..89401b1e5fe15 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MemoryAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "MemoryAggregationRepository", "javaType": "org.apache.camel.processor.aggregate.MemoryAggregationRepository", - "interfaceType": "org.apache.camel.spi.OptimisticLockingAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "Memory Aggregation Repository", "description": "A memory based AggregationRepository which stores Exchange in memory only.", "deprecated": false, diff --git a/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json index 0d363487986ed..350606540cf4e 100644 --- a/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json +++ b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "CaffeineAggregationRepository", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", - "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "Caffeine Aggregation Repository", "description": "Aggregation repository that uses Caffeine Cache to store exchanges.", "deprecated": false, diff --git a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java index 96f66471cdc1d..b0ef74c69ee29 100644 --- a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java +++ b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java @@ -27,7 +27,8 @@ import org.apache.camel.support.service.ServiceSupport; @Metadata(label = "bean", - description = "Idempotent repository that uses Caffiene cache to store message ids.") + description = "Idempotent repository that uses Caffiene cache to store message ids.", + annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) @Configurer(metadataOnly = true) @ManagedResource(description = "Caffeine based message id repository") public class CaffeineIdempotentRepository extends ServiceSupport implements IdempotentRepository { diff --git a/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraAggregationRepository.json b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraAggregationRepository.json index bd9516e9eb5ed..98d5e72e4f7fc 100644 --- a/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraAggregationRepository.json +++ b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "CassandraAggregationRepository", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", - "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "Cassandra Aggregation Repository", "description": "Aggregation repository that uses Cassandra table to store exchanges. Advice: use LeveledCompaction for this table and tune read\/write consistency levels.", "deprecated": false, diff --git a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/NamedCassandraAggregationRepository.java b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/NamedCassandraAggregationRepository.java index f2861a2a5a12d..b44f20e61acff 100644 --- a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/NamedCassandraAggregationRepository.java +++ b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/NamedCassandraAggregationRepository.java @@ -23,6 +23,7 @@ * key) and key (clustering key). */ public class NamedCassandraAggregationRepository extends CassandraAggregationRepository { + public NamedCassandraAggregationRepository() { setPKColumns("NAME", "KEY"); setName("DEFAULT"); diff --git a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java index fa494ca3a8f8a..95424a23cc45f 100644 --- a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java +++ b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java @@ -49,7 +49,8 @@ */ @Metadata(label = "bean", description = "Idempotent repository that uses Cassandra table to store message ids." - + " Advice: use LeveledCompaction for this table and tune read/write consistency levels.") + + " Advice: use LeveledCompaction for this table and tune read/write consistency levels.", + annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) @Configurer(metadataOnly = true) public class CassandraIdempotentRepository extends ServiceSupport implements IdempotentRepository { diff --git a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/NamedCassandraIdempotentRepository.java b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/NamedCassandraIdempotentRepository.java index e58f3175e7cf7..451c1e348b5be 100644 --- a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/NamedCassandraIdempotentRepository.java +++ b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/NamedCassandraIdempotentRepository.java @@ -23,6 +23,7 @@ * and key (clustering key). */ public class NamedCassandraIdempotentRepository extends CassandraIdempotentRepository { + public NamedCassandraIdempotentRepository() { setPKColumns("NAME", "KEY"); setName("DEFAULT"); diff --git a/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json index 3421a8d2be0af..c8fde386e07ee 100644 --- a/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json +++ b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "EhcacheAggregationRepository", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", - "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "Ehcache Aggregation Repository", "description": "Aggregation repository that uses Caffeine Cache to store exchanges.", "deprecated": false, diff --git a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java index 1230d930a6d00..ee54857ebd622 100644 --- a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java +++ b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java @@ -28,7 +28,8 @@ import org.ehcache.CacheManager; @Metadata(label = "bean", - description = "Idempotent repository that uses EHCache cache to store message ids.") + description = "Idempotent repository that uses EHCache cache to store message ids.", + annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) @Configurer(metadataOnly = true) @ManagedResource(description = "EHCache based message id repository") public class EhcacheIdempotentRepository extends ServiceSupport implements IdempotentRepository { diff --git a/components/camel-elasticsearch/src/main/java/org/apache/camel/component/es/aggregation/ElastichsearchBulkRequestAggregationStrategy.java b/components/camel-elasticsearch/src/main/java/org/apache/camel/component/es/aggregation/ElastichsearchBulkRequestAggregationStrategy.java index bb80105b480e6..1b50d2e61d9d7 100644 --- a/components/camel-elasticsearch/src/main/java/org/apache/camel/component/es/aggregation/ElastichsearchBulkRequestAggregationStrategy.java +++ b/components/camel-elasticsearch/src/main/java/org/apache/camel/component/es/aggregation/ElastichsearchBulkRequestAggregationStrategy.java @@ -27,7 +27,8 @@ import org.apache.camel.spi.Metadata; @Metadata(label = "bean", - description = "Aggregates two ElasticSearch BulkOperation into a single BulkRequest") + description = "Aggregates two ElasticSearch BulkOperation into a single BulkRequest", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) @Configurer(metadataOnly = true) public class ElastichsearchBulkRequestAggregationStrategy implements AggregationStrategy { diff --git a/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json b/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json index 2b075657c4378..7549f4c8a9d9e 100644 --- a/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json +++ b/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "Etcd3AggregationRepository", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", - "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "Etcd3 Aggregation Repository", "description": "Aggregation repository that uses Etcd3 to store exchanges.", "deprecated": false, diff --git a/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json index 5588f59f62960..a07a7d2ab8705 100644 --- a/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json +++ b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "HazelcastAggregationRepository", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", - "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "Hazelcast Aggregation Repository", "description": "Aggregation repository that uses Hazelcast Cache to store exchanges.", "deprecated": false, diff --git a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepository.java b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepository.java index 29356bf8ac56b..4d73b1c85b127 100644 --- a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepository.java +++ b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepository.java @@ -28,7 +28,8 @@ import org.apache.camel.util.ObjectHelper; @Metadata(label = "bean", - description = "Idempotent repository that uses Hazelcast cache to store message ids.") + description = "Idempotent repository that uses Hazelcast cache to store message ids.", + annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) @Configurer(metadataOnly = true) public class HazelcastIdempotentRepository extends ServiceSupport implements IdempotentRepository { diff --git a/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheAggregationRepository.json b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheAggregationRepository.json index 5a5b2eddaaede..0aca13c8207e8 100644 --- a/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheAggregationRepository.json +++ b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "JCacheAggregationRepository", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", - "interfaceType": "org.apache.camel.CamelContextAware", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "JCache Aggregation Repository", "description": "Aggregation repository that uses JCache to store exchanges.", "deprecated": false, diff --git a/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheIdempotentRepository.json b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheIdempotentRepository.json index 8337b15a5aee7..76e7c1861cb98 100644 --- a/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheIdempotentRepository.json +++ b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheIdempotentRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "JCacheIdempotentRepository", "javaType": "org.apache.camel.component.jcache.processor.idempotent.JCacheIdempotentRepository", - "interfaceType": "org.apache.camel.CamelContextAware", + "interfaceType": "org.apache.camel.spi.IdempotentRepository", "title": "JCache Idempotent Repository", "description": "Idempotent repository that uses JCache to store message ids.", "deprecated": false, diff --git a/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepository.java b/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepository.java index 6b0c277b231b4..dda5823e50ccb 100644 --- a/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepository.java +++ b/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepository.java @@ -33,7 +33,8 @@ import org.apache.camel.util.ObjectHelper; @Metadata(label = "bean", - description = "Idempotent repository that uses JCache to store message ids.") + description = "Idempotent repository that uses JCache to store message ids.", + annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) @Configurer(metadataOnly = true) @ManagedResource(description = "JCache based message id repository") public class JCacheIdempotentRepository extends ServiceSupport implements CamelContextAware, IdempotentRepository { diff --git a/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java b/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java index ffaf29f4f8d8b..7d8581f144ebc 100644 --- a/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java +++ b/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java @@ -67,9 +67,10 @@ * CamelContext aware. */ @Metadata(label = "bean", - description = "Idempotent repository that uses Kafka to store message ids. Uses a local cache of previously seen Message IDs." - + " The topic used must be unique per logical repository (i.e. two routes de-duplicate using different repositories, and different topics)" - + " On startup, the instance consumes the full content of the topic, rebuilding the cache to the latest state.") + description = "Idempotent repository that uses Kafka to store message ids. Uses a local cache of previously seen Message IDs." + + " The topic used must be unique per logical repository (i.e. two routes de-duplicate using different repositories, and different topics)" + + " On startup, the instance consumes the full content of the topic, rebuilding the cache to the latest state.", + annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) @Configurer(metadataOnly = true) @ManagedResource(description = "Kafka IdempotentRepository") public class KafkaIdempotentRepository extends ServiceSupport implements IdempotentRepository, CamelContextAware { diff --git a/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean/LevelDBAggregationRepository.json b/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean/LevelDBAggregationRepository.json index 59893b87d1d30..6377dcc1f7412 100644 --- a/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean/LevelDBAggregationRepository.json +++ b/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean/LevelDBAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "LevelDBAggregationRepository", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", - "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "Level DBAggregation Repository", "description": "Aggregation repository that uses LevelDB to store exchanges.", "deprecated": false, diff --git a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java index 18406cbb7067a..9221ffd244f61 100644 --- a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java +++ b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java @@ -34,7 +34,8 @@ import static org.apache.camel.component.mongodb.MongoDbConstants.MONGO_ID; @Metadata(label = "bean", - description = "Idempotent repository that uses MongoDB to store message ids.") + description = "Idempotent repository that uses MongoDB to store message ids.", + annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) @Configurer(metadataOnly = true) @ManagedResource(description = "MongoDB based message id repository") public class MongoDbIdempotentRepository extends ServiceSupport implements IdempotentRepository { diff --git a/components/camel-opensearch/src/main/java/org/apache/camel/component/opensearch/aggregation/OpensearchBulkRequestAggregationStrategy.java b/components/camel-opensearch/src/main/java/org/apache/camel/component/opensearch/aggregation/OpensearchBulkRequestAggregationStrategy.java index a6fd99d24d72e..fc07ef99e24f3 100644 --- a/components/camel-opensearch/src/main/java/org/apache/camel/component/opensearch/aggregation/OpensearchBulkRequestAggregationStrategy.java +++ b/components/camel-opensearch/src/main/java/org/apache/camel/component/opensearch/aggregation/OpensearchBulkRequestAggregationStrategy.java @@ -30,7 +30,8 @@ * Aggregates two {@link BulkOperation}s into a single {@link BulkRequest}. */ @Metadata(label = "bean", - description = "Aggregates two OpenSearch BulkOperation into a single BulkRequest") + description = "Aggregates two OpenSearch BulkOperation into a single BulkRequest", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) @Configurer(metadataOnly = true) public class OpensearchBulkRequestAggregationStrategy implements AggregationStrategy { diff --git a/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepository.java b/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepository.java index 371f52a96815c..fd4dbb0c828a7 100644 --- a/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepository.java +++ b/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepository.java @@ -28,7 +28,8 @@ import org.springframework.data.redis.core.SetOperations; @Metadata(label = "bean", - description = "Idempotent repository that uses Redis to store message ids.") + description = "Idempotent repository that uses Redis to store message ids.", + annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) @Configurer(metadataOnly = true) @ManagedResource(description = "Spring Redis based message id repository") public class SpringRedisIdempotentRepository extends ServiceSupport implements IdempotentRepository { diff --git a/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcAggregationRepository.json b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcAggregationRepository.json index 21943b5f47712..cfb3773f0ecfc 100644 --- a/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcAggregationRepository.json +++ b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "JdbcAggregationRepository", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", - "interfaceType": "org.apache.camel.spi.RecoverableAggregationRepository", + "interfaceType": "org.apache.camel.spi.AggregationRepository", "title": "Jdbc Aggregation Repository", "description": "Aggregation repository that uses SQL database to store exchanges.", "deprecated": false, diff --git a/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java b/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java index 2d5d5121e4e4c..191219bc5ddee 100644 --- a/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java +++ b/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java @@ -62,8 +62,9 @@ *

*/ @Metadata(label = "bean", - description = "AggregationStrategy to combine together incoming messages into a tar file." - + " Please note that this aggregation strategy requires eager completion check to work properly.") + description = "AggregationStrategy to combine together incoming messages into a tar file." + + " Please note that this aggregation strategy requires eager completion check to work properly.", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) @Configurer(metadataOnly = true) public class TarAggregationStrategy implements AggregationStrategy { diff --git a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltAggregationStrategy.java b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltAggregationStrategy.java index 7e3c865ae152f..277c9352139f6 100644 --- a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltAggregationStrategy.java +++ b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltAggregationStrategy.java @@ -63,7 +63,8 @@ * Some code bits have been copied from the {@link org.apache.camel.component.xslt.XsltEndpoint}. */ @Metadata(label = "bean", - description = "The XSLT Aggregation Strategy enables you to use XSL stylesheets to aggregate messages.") + description = "The XSLT Aggregation Strategy enables you to use XSL stylesheets to aggregate messages.", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) @Configurer(metadataOnly = true) public class XsltAggregationStrategy extends ServiceSupport implements AggregationStrategy, CamelContextAware { diff --git a/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java b/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java index cc8970e356842..0efa7210c713c 100644 --- a/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java +++ b/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java @@ -54,8 +54,9 @@ *

*/ @Metadata(label = "bean", - description = "AggregationStrategy to zip together incoming messages into a zip file." - + " Please note that this aggregation strategy requires eager completion check to work properly.") + description = "AggregationStrategy to zip together incoming messages into a zip file." + + " Please note that this aggregation strategy requires eager completion check to work properly.", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) @Configurer(metadataOnly = true) public class ZipAggregationStrategy implements AggregationStrategy { diff --git a/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategyConfigurer.java b/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategyConfigurer.java new file mode 100644 index 0000000000000..132ef2a13e560 --- /dev/null +++ b/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategyConfigurer.java @@ -0,0 +1,35 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.aggregate; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class GroupedBodyAggregationStrategyConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + return false; + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + return null; + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + return null; + } +} + diff --git a/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategyConfigurer.java b/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategyConfigurer.java new file mode 100644 index 0000000000000..d59e0e119d1d7 --- /dev/null +++ b/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategyConfigurer.java @@ -0,0 +1,35 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.aggregate; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategy; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class GroupedExchangeAggregationStrategyConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + return false; + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + return null; + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + return null; + } +} + diff --git a/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategyConfigurer.java b/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategyConfigurer.java new file mode 100644 index 0000000000000..d70c00114921d --- /dev/null +++ b/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategyConfigurer.java @@ -0,0 +1,35 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.aggregate; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.aggregate.GroupedMessageAggregationStrategy; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class GroupedMessageAggregationStrategyConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + return false; + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + return null; + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + return null; + } +} + diff --git a/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategyConfigurer.java b/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategyConfigurer.java new file mode 100644 index 0000000000000..9d7e11fd71347 --- /dev/null +++ b/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategyConfigurer.java @@ -0,0 +1,35 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.aggregate; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.aggregate.UseLatestAggregationStrategy; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class UseLatestAggregationStrategyConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + return false; + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + return null; + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + return null; + } +} + diff --git a/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategyConfigurer.java b/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategyConfigurer.java new file mode 100644 index 0000000000000..3e0b4024d9f92 --- /dev/null +++ b/core/camel-core-processor/src/generated/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategyConfigurer.java @@ -0,0 +1,35 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.processor.aggregate; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.ExtendedPropertyConfigurerGetter; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.spi.ConfigurerStrategy; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.processor.aggregate.UseOriginalAggregationStrategy; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class UseOriginalAggregationStrategyConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { + + @Override + public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { + return false; + } + + @Override + public Class getOptionType(String name, boolean ignoreCase) { + return null; + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + return null; + } +} + diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json index dc43b4d1eedda..89401b1e5fe15 100644 --- a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/bean/MemoryAggregationRepository.json @@ -3,7 +3,7 @@ "kind": "bean", "name": "MemoryAggregationRepository", "javaType": "org.apache.camel.processor.aggregate.MemoryAggregationRepository", - "interfaceType": "org.apache.camel.spi.OptimisticLockingAggregationRepository", + "interfaceType": "org.apache.camel.AggregationStrategy", "title": "Memory Aggregation Repository", "description": "A memory based AggregationRepository which stores Exchange in memory only.", "deprecated": false, diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy new file mode 100644 index 0000000000000..c9e77f377c1ec --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategyConfigurer diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategy b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategy new file mode 100644 index 0000000000000..8750c6f524131 --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategy @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategyConfigurer diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.GroupedMessageAggregationStrategy b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.GroupedMessageAggregationStrategy new file mode 100644 index 0000000000000..ee8dc6c5a7975 --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.GroupedMessageAggregationStrategy @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.aggregate.GroupedMessageAggregationStrategyConfigurer diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.UseLatestAggregationStrategy b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.UseLatestAggregationStrategy new file mode 100644 index 0000000000000..0d55027146903 --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.UseLatestAggregationStrategy @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.aggregate.UseLatestAggregationStrategyConfigurer diff --git a/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.UseOriginalAggregationStrategy b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.UseOriginalAggregationStrategy new file mode 100644 index 0000000000000..56f1c06e47371 --- /dev/null +++ b/core/camel-core-processor/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.processor.aggregate.UseOriginalAggregationStrategy @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.processor.aggregate.UseOriginalAggregationStrategyConfigurer diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategy.java index d93e8f9bb0441..07fef2a03da6d 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategy.java @@ -20,6 +20,7 @@ import org.apache.camel.Exchange; import org.apache.camel.Message; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.Metadata; /** @@ -29,9 +30,11 @@ * This aggregation strategy can used in combination with {@link org.apache.camel.processor.Splitter} to batch messages */ @Metadata(label = "bean", - description = "Aggregate body of input Message into a single combined Exchange holding all the aggregated bodies in a List" - + " of type Object as the message body. This aggregation strategy can be used in combination with" - + " Splitter to batch messages.") + description = "Aggregate body of input Message into a single combined Exchange holding all the aggregated bodies in a List" + + " of type Object as the message body. This aggregation strategy can be used in combination with" + + " Splitter to batch messages.", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) +@Configurer(metadataOnly = true) public class GroupedBodyAggregationStrategy extends AbstractListAggregationStrategy { @Override diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategy.java index 7a3c0c97f3a7d..850529c394630 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategy.java @@ -19,6 +19,7 @@ import java.util.List; import org.apache.camel.Exchange; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.Metadata; import org.apache.camel.support.DefaultExchange; @@ -30,9 +31,11 @@ * Content Enricher EIP which is enrich or pollEnrich. */ @Metadata(label = "bean", - description = "Aggregate all Exchanges into a single combined Exchange holding all the aggregated exchanges in a List" - + " of Exchange as the message body. This aggregation strategy can be used in combination with" - + " Splitter to batch messages.") + description = "Aggregate all Exchanges into a single combined Exchange holding all the aggregated exchanges in a List" + + " of Exchange as the message body. This aggregation strategy can be used in combination with" + + " Splitter to batch messages.", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) +@Configurer(metadataOnly = true) public class GroupedExchangeAggregationStrategy extends AbstractListAggregationStrategy { @Override diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategy.java index aca104407c384..84cdac4d131c7 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategy.java @@ -20,6 +20,7 @@ import org.apache.camel.Exchange; import org.apache.camel.Message; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.Metadata; import org.apache.camel.support.DefaultExchange; @@ -31,9 +32,11 @@ * messages */ @Metadata(label = "bean", - description = "Aggregate all Message into a single combined Exchange holding all the aggregated messages in a List" - + " of Message as the message body. This aggregation strategy can be used in combination with" - + " Splitter to batch messages.") + description = "Aggregate all Message into a single combined Exchange holding all the aggregated messages in a List" + + " of Message as the message body. This aggregation strategy can be used in combination with" + + " Splitter to batch messages.", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) +@Configurer(metadataOnly = true) public class GroupedMessageAggregationStrategy extends AbstractListAggregationStrategy { @Override diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java index 8f98d681e17d7..793830cce023c 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java @@ -34,7 +34,8 @@ * Supports both optimistic locking and non-optimistic locking modes. Defaults to non-optimistic locking mode. */ @Metadata(label = "bean", - description = "A memory based AggregationRepository which stores Exchange in memory only.") + description = "A memory based AggregationRepository which stores Exchange in memory only.", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) @Configurer(metadataOnly = true) public class MemoryAggregationRepository extends ServiceSupport implements OptimisticLockingAggregationRepository { private final ConcurrentMap cache = new ConcurrentHashMap<>(); diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java index ab167d63a0ea0..df33f8698f363 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java @@ -31,8 +31,9 @@ * This aggregation strategy can used in combination with {@link org.apache.camel.processor.Splitter} to batch messages */ @Metadata(label = "bean", - description = "Aggregate result of pick expression into a single combined Exchange holding all the aggregated bodies in a" - + " String as the message body. This aggregation strategy can used in combination with Splitter to batch messages") + description = "Aggregate result of pick expression into a single combined Exchange holding all the aggregated bodies in a" + + " String as the message body. This aggregation strategy can used in combination with Splitter to batch messages", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) @Configurer(metadataOnly = true) public class StringAggregationStrategy implements AggregationStrategy { diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java index d4ba479d3a7d3..ad46310ca5bfd 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java @@ -19,6 +19,7 @@ import org.apache.camel.AggregationStrategy; import org.apache.camel.Exchange; import org.apache.camel.ExchangePropertyKey; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.Metadata; /** @@ -27,9 +28,11 @@ * that relevant, only the current price is. */ @Metadata(label = "bean", - description = "An AggregationStrategy which just uses the latest exchange which is useful for status messages where old" - + " status messages have no real value. Another example is things like market data prices, where old stock prices are not" - + " that relevant, only the current price is.") + description = "An AggregationStrategy which just uses the latest exchange which is useful for status messages where old" + + " status messages have no real value. Another example is things like market data prices, where old stock prices are not" + + " that relevant, only the current price is.", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) +@Configurer(metadataOnly = true) public class UseLatestAggregationStrategy implements AggregationStrategy { @Override diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategy.java index 40689d482ab88..d29e564d1c986 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategy.java @@ -18,6 +18,7 @@ import org.apache.camel.AggregationStrategy; import org.apache.camel.Exchange; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.Metadata; /** @@ -28,9 +29,11 @@ * @see org.apache.camel.processor.Splitter */ @Metadata(label = "bean", - description = "An AggregationStrategy which just uses the original exchange which can be needed when you want to preserve" - + " the original Exchange. For example when splitting an Exchange and then you may want to keep routing using the" - + " original Exchange.") + description = "An AggregationStrategy which just uses the original exchange which can be needed when you want to preserve" + + " the original Exchange. For example when splitting an Exchange and then you may want to keep routing using the" + + " original Exchange.", + annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) +@Configurer(metadataOnly = true) public class UseOriginalAggregationStrategy implements AggregationStrategy { private final Exchange original; diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java index eb16286c56098..4bf41c55e44fa 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java @@ -37,7 +37,8 @@ * in camel-jms and camel-cxf components. */ @Metadata(label = "bean", - description = "The default header filtering strategy. Users can configure which headers is allowed or denied.") + description = "The default header filtering strategy. Users can configure which headers is allowed or denied.", + annotations = {"interfaceName=org.apache.camel.spi.HeaderFilterStrategy"}) @Configurer(metadataOnly = true) public class DefaultHeaderFilterStrategy implements HeaderFilterStrategy { diff --git a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java index daf564e464738..a1e28d186f691 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java @@ -53,7 +53,8 @@ * file store and make room for newer entries. */ @Metadata(label = "bean", - description = "A file based IdempotentRepository.") + description = "A file based IdempotentRepository.", + annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) @Configurer(metadataOnly = true) @ManagedResource(description = "File based idempotent repository") public class FileIdempotentRepository extends ServiceSupport implements IdempotentRepository { diff --git a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java index 65e7603d9c5e9..f85fc4b3fe06e 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java @@ -34,8 +34,9 @@ * Care should be taken to use a suitable underlying {@link Map} to avoid this class being a memory leak. */ @Metadata(label = "bean", - description = "A memory based IdempotentRepository.") -@Configurer + description = "A memory based IdempotentRepository.", + annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) +@Configurer(metadataOnly = true) @ManagedResource(description = "Memory based idempotent repository") public class MemoryIdempotentRepository extends ServiceSupport implements IdempotentRepository { private Map cache; diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java index a34679ebfefe2..3339ceaef00ca 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java @@ -173,10 +173,10 @@ public void execute() throws MojoExecutionException, MojoFailureException { model.setClassName(ci.name().toString()); model.setDeprecated(deprecated); model.setDescription(annotationValue(a, "description")); - model.setInterfaceName(interfaceName(index, ci)); + model.setInterfaceName(annotationValue(a, "annotations", "interfaceName")); if (model.getInterfaceName() == null) { - // fallback to use hardcoded from @Metadata/annotations - model.setInterfaceName(annotationValue(a, "annotations", "interfaceName")); + // try to discover the interface + model.setInterfaceName(interfaceName(index, ci)); } // find all fields with @Metadata as options (also from super class) From 2e96443946b0b4998fb79fd182f3f2f9b63b14fc Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Wed, 20 Mar 2024 07:51:50 +0100 Subject: [PATCH 43/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../maven/packaging/GeneratePojoBeanMojo.java | 64 ++++++++++--------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java index 3339ceaef00ca..33d500bb1e690 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java @@ -17,6 +17,7 @@ package org.apache.camel.maven.packaging; import java.io.File; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Comparator; import java.util.List; @@ -24,6 +25,7 @@ import java.util.stream.Stream; import org.apache.camel.maven.packaging.generics.PackagePluginUtils; +import org.apache.camel.spi.Metadata; import org.apache.camel.tooling.model.BaseOptionModel; import org.apache.camel.tooling.model.JsonMapper; import org.apache.camel.tooling.util.PackageHelper; @@ -38,7 +40,6 @@ import org.jboss.jandex.AnnotationInstance; import org.jboss.jandex.ClassInfo; import org.jboss.jandex.DotName; -import org.jboss.jandex.FieldInfo; import org.jboss.jandex.Index; import static org.apache.camel.maven.packaging.MojoHelper.annotationValue; @@ -221,36 +222,39 @@ public void execute() throws MojoExecutionException, MojoFailureException { } } - private static void extractFields(ClassInfo ci, BeanPojoModel model) { - for (FieldInfo fi : ci.fields()) { - AnnotationInstance ai = fi.annotation(METADATA); - if (ai != null) { - BeanPojoOptionModel o = new BeanPojoOptionModel(); - o.setKind("property"); - o.setName(fi.name()); - o.setLabel(annotationValue(ai, "label")); - o.setDefaultValue(annotationValue(ai, "defaultValue")); - o.setRequired("true".equals(annotationValue(ai, "required"))); - String displayName = annotationValue(ai, "displayName"); - if (displayName == null) { - displayName = Strings.asTitle(o.getName()); - } - o.setDisplayName(displayName); - o.setDeprecated(fi.hasAnnotation(Deprecated.class)); - String javaType = annotationValue(ai, "javaType"); - if (javaType == null) { - javaType = ci.name().toString(); - } - o.setJavaType(javaType); - o.setType(getType(javaType, false, false)); - o.setDescription(annotationValue(ai, "description")); - String enums = annotationValue(ai, "enums"); - if (enums != null) { - String[] values = enums.split(","); - o.setEnums(Stream.of(values).map(String::trim).toList()); - } - model.addOption(o); + private void extractFields(ClassInfo ci, BeanPojoModel model) { + // need to load the class so we can get the field in the order they are declared in the source code + Class classElement = loadClass(ci.name().toString()); + List fields + = Stream.of(classElement.getDeclaredFields()).filter(f -> f.getAnnotation(Metadata.class) != null).toList(); + + for (Field fi : fields) { + BeanPojoOptionModel o = new BeanPojoOptionModel(); + Metadata ai = fi.getAnnotation(Metadata.class); + o.setKind("property"); + o.setName(fi.getName()); + o.setLabel(ai.label()); + o.setDefaultValue(ai.defaultValue()); + o.setRequired(ai.required()); + String displayName = ai.displayName(); + if (displayName.isEmpty()) { + displayName = Strings.asTitle(o.getName()); + } + o.setDisplayName(displayName); + o.setDeprecated(fi.getAnnotation(Deprecated.class) != null); + String javaType = ai.javaType(); + if (javaType.isEmpty()) { + javaType = ci.name().toString(); + } + o.setJavaType(javaType); + o.setType(getType(javaType, false, false)); + o.setDescription(ai.description()); + String enums = ai.enums(); + if (!enums.isEmpty()) { + String[] values = enums.split(","); + o.setEnums(Stream.of(values).map(String::trim).toList()); } + model.addOption(o); } } From 6378a475fbbe35983b5abae860def0f1b2ecd1e4 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Wed, 20 Mar 2024 09:27:43 +0100 Subject: [PATCH 44/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../beans/CaffeineAggregationRepository.json | 2 +- .../beans/CassandraAggregationRepository.json | 2 +- .../beans/CassandraIdempotentRepository.json | 2 +- .../beans/DefaultHeaderFilterStrategy.json | 2 +- .../beans/EhcacheAggregationRepository.json | 2 +- .../beans/Etcd3AggregationRepository.json | 2 +- .../beans/FileIdempotentRepository.json | 2 +- .../beans/HazelcastAggregationRepository.json | 2 +- .../beans/HazelcastIdempotentRepository.json | 2 +- ...finispanEmbeddedAggregationRepository.json | 2 +- ...InfinispanRemoteAggregationRepository.json | 2 +- .../beans/JCacheAggregationRepository.json | 2 +- .../beans/JdbcAggregationRepository.json | 2 +- .../beans/JdbcMessageIdRepository.json | 2 +- .../beans/KafkaIdempotentRepository.json | 2 +- .../beans/LevelDBAggregationRepository.json | 2 +- .../beans/MongoDbIdempotentRepository.json | 2 +- .../SpringRedisIdempotentRepository.json | 2 +- .../catalog/beans/TarAggregationStrategy.json | 2 +- .../beans/XsltAggregationStrategy.json | 2 +- .../beans/XsltSaxonAggregationStrategy.json | 2 +- .../catalog/beans/ZipAggregationStrategy.json | 2 +- .../bean/CaffeineAggregationRepository.json | 2 +- .../CaffeineAggregationRepository.java | 6 ++--- .../bean/CassandraAggregationRepository.json | 2 +- .../bean/CassandraIdempotentRepository.json | 2 +- .../bean/EhcacheAggregationRepository.json | 2 +- .../bean/Etcd3AggregationRepository.json | 2 +- .../aggregate/Etcd3AggregationRepository.java | 4 ++-- .../bean/HazelcastAggregationRepository.json | 2 +- .../bean/HazelcastIdempotentRepository.json | 2 +- .../HazelcastAggregationRepository.java | 8 +++---- ...finispanEmbeddedAggregationRepository.json | 2 +- ...finispanEmbeddedAggregationRepository.java | 5 ++-- ...InfinispanRemoteAggregationRepository.json | 2 +- ...InfinispanRemoteAggregationRepository.java | 4 ++-- .../bean/JCacheAggregationRepository.json | 2 +- .../camel/bean/KafkaIdempotentRepository.json | 2 +- .../bean/LevelDBAggregationRepository.json | 2 +- .../bean/MongoDbIdempotentRepository.json | 2 +- .../bean/SpringRedisIdempotentRepository.json | 2 +- .../camel/bean/JdbcAggregationRepository.json | 2 +- .../camel/bean/JdbcMessageIdRepository.json | 2 +- .../jdbc/JdbcAggregationRepository.java | 24 +++++++++---------- .../jdbc/JdbcMessageIdRepository.java | 4 ++-- .../camel/bean/TarAggregationStrategy.json | 2 +- .../bean/XsltSaxonAggregationStrategy.json | 2 +- .../saxon/XsltSaxonAggregationStrategy.java | 6 ++--- .../camel/bean/XsltAggregationStrategy.json | 2 +- .../camel/bean/ZipAggregationStrategy.json | 2 +- .../bean/DefaultHeaderFilterStrategy.json | 2 +- .../camel/bean/FileIdempotentRepository.json | 2 +- .../maven/packaging/GeneratePojoBeanMojo.java | 10 ++++++-- 53 files changed, 82 insertions(+), 77 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineAggregationRepository.json index 350606540cf4e..14de19f8f810c 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CaffeineAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-caffeine", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 2, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 3, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 4, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "useRecovery": { "index": 0, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "recoveryInterval": { "index": 2, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "maximumRedeliveries": { "index": 3, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "allowSerializedHeaders": { "index": 4, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraAggregationRepository.json index 98d5e72e4f7fc..c05e5b5616284 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-cassandraql", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "exchangeColumn": { "index": 2, "kind": "property", "displayName": "Exchange Column", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "EXCHANGE", "description": "Column name for Exchange" }, "exchangeIdColumn": { "index": 3, "kind": "property", "displayName": "Exchange Id Column", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "EXCHANGE_ID", "description": "Column name for Exchange ID" }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "pkColumns": { "index": 5, "kind": "property", "displayName": "Primary Key Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "prefixPKValues": { "index": 6, "kind": "property", "displayName": "Prefix Primary Key Values", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "readConsistencyLevel": { "index": 7, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" }, "recoveryInterval": { "index": 8, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "sessionHolder": { "index": 9, "kind": "property", "displayName": "Session Holder", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 10, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_AGGREGATION", "description": "The table name for storing the data" }, "ttl": { "index": 11, "kind": "property", "displayName": "Time to Live", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "useRecovery": { "index": 12, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "writeConsistencyLevel": { "index": 13, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" } } + "properties": { "sessionHolder": { "index": 0, "kind": "property", "displayName": "Session Holder", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 1, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_AGGREGATION", "description": "The table name for storing the data" }, "exchangeIdColumn": { "index": 2, "kind": "property", "displayName": "Exchange Id Column", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "EXCHANGE_ID", "description": "Column name for Exchange ID" }, "exchangeColumn": { "index": 3, "kind": "property", "displayName": "Exchange Column", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "EXCHANGE", "description": "Column name for Exchange" }, "prefixPKValues": { "index": 4, "kind": "property", "displayName": "Prefix Primary Key Values", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "pkColumns": { "index": 5, "kind": "property", "displayName": "Primary Key Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "ttl": { "index": 6, "kind": "property", "displayName": "Time to Live", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "writeConsistencyLevel": { "index": 7, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" }, "readConsistencyLevel": { "index": 8, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" }, "recoveryInterval": { "index": 9, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 10, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "deadLetterUri": { "index": 11, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 12, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "allowSerializedHeaders": { "index": 13, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraIdempotentRepository.json index 0c3722d07806a..78269b7e6494c 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraIdempotentRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/CassandraIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-cassandraql", "version": "4.5.0-SNAPSHOT", - "properties": { "pkColumns": { "index": 0, "kind": "property", "displayName": "Primary Key Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "prefixPKValues": { "index": 1, "kind": "property", "displayName": "Prefix Primary Key Values", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "readConsistencyLevel": { "index": 2, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" }, "session": { "index": 3, "kind": "property", "displayName": "Session", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 4, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_IDEMPOTENT", "description": "The table name for storing the data" }, "ttl": { "index": 5, "kind": "property", "displayName": "Time to Live", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "writeConsistencyLevel": { "index": 6, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" } } + "properties": { "session": { "index": 0, "kind": "property", "displayName": "Session", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 1, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_IDEMPOTENT", "description": "The table name for storing the data" }, "prefixPKValues": { "index": 2, "kind": "property", "displayName": "Prefix Primary Key Values", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "pkColumns": { "index": 3, "kind": "property", "displayName": "Primary Key Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "ttl": { "index": 4, "kind": "property", "displayName": "Time to Live", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "writeConsistencyLevel": { "index": 5, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" }, "readConsistencyLevel": { "index": 6, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/DefaultHeaderFilterStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/DefaultHeaderFilterStrategy.json index bfe3e06376ad1..db72da32c2e2d 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/DefaultHeaderFilterStrategy.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/DefaultHeaderFilterStrategy.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-support", "version": "4.5.0-SNAPSHOT", - "properties": { "allowNullValues": { "index": 0, "kind": "property", "displayName": "Allow Null Values", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether to allow null values. By default a header is skipped if its value is null. Setting this to true will preserve the header." }, "caseInsensitive": { "index": 1, "kind": "property", "displayName": "Case Insensitive", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Sets the caseInsensitive property which is a boolean to determine whether header names should be case insensitive when checking it with the filter set. It does not affect filtering using regular expression pattern." }, "filterOnMatch": { "index": 2, "kind": "property", "displayName": "Filter On Match", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Sets what to do when a pattern or filter set is matched. When set to true, a match will filter out the header. This is the default value for backwards compatibility. When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be filtered (skipped)." }, "inFilter": { "index": 3, "kind": "property", "displayName": "In Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the in direction filter set. The in direction is referred to copying headers from an external message to a Camel message. Multiple patterns can be separated by comma" }, "lowerCase": { "index": 4, "kind": "property", "displayName": "Lower Case", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether header names should be converted to lower case before checking it with the filter Set. It does not affect filtering using regular expression pattern." }, "outFilter": { "index": 5, "kind": "property", "displayName": "Out Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the out direction filter set. The out direction is referred to copying headers from a Camel message to an external message. Multiple patterns can be separated by comma" } } + "properties": { "inFilter": { "index": 0, "kind": "property", "displayName": "In Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the in direction filter set. The in direction is referred to copying headers from an external message to a Camel message. Multiple patterns can be separated by comma" }, "outFilter": { "index": 1, "kind": "property", "displayName": "Out Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the out direction filter set. The out direction is referred to copying headers from a Camel message to an external message. Multiple patterns can be separated by comma" }, "lowerCase": { "index": 2, "kind": "property", "displayName": "Lower Case", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether header names should be converted to lower case before checking it with the filter Set. It does not affect filtering using regular expression pattern." }, "allowNullValues": { "index": 3, "kind": "property", "displayName": "Allow Null Values", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether to allow null values. By default a header is skipped if its value is null. Setting this to true will preserve the header." }, "caseInsensitive": { "index": 4, "kind": "property", "displayName": "Case Insensitive", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Sets the caseInsensitive property which is a boolean to determine whether header names should be case insensitive when checking it with the filter set. It does not affect filtering using regular expression pattern." }, "filterOnMatch": { "index": 5, "kind": "property", "displayName": "Filter On Match", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Sets what to do when a pattern or filter set is matched. When set to true, a match will filter out the header. This is the default value for backwards compatibility. When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be filtered (skipped)." } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheAggregationRepository.json index c8fde386e07ee..eed304ee999ff 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/EhcacheAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-ehcache", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "deadLetterUri": { "index": 2, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 3, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 5, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "cacheName": { "index": 0, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "allowSerializedHeaders": { "index": 1, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "useRecovery": { "index": 2, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "deadLetterUri": { "index": 3, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "maximumRedeliveries": { "index": 5, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/Etcd3AggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/Etcd3AggregationRepository.json index 7549f4c8a9d9e..75a6d2e53a68e 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/Etcd3AggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/Etcd3AggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-etcd3", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "endpoint": { "index": 2, "kind": "property", "displayName": "Endpoint", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "URL to Etcd3 service" }, "maximumRedeliveries": { "index": 3, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "optimistic": { "index": 4, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether or not to use optimistic locking" }, "persistencePrefixName": { "index": 5, "kind": "property", "displayName": "Persistence Prefix Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key for completed exchanges" }, "prefixName": { "index": 6, "kind": "property", "displayName": "Prefix Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key" }, "recoveryInterval": { "index": 7, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 8, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "endpoint": { "index": 0, "kind": "property", "displayName": "Endpoint", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "URL to Etcd3 service" }, "prefixName": { "index": 1, "kind": "property", "displayName": "Prefix Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key" }, "persistencePrefixName": { "index": 2, "kind": "property", "displayName": "Persistence Prefix Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key for completed exchanges" }, "optimistic": { "index": 3, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether or not to use optimistic locking" }, "useRecovery": { "index": 4, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "deadLetterUri": { "index": 6, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 7, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "allowSerializedHeaders": { "index": 8, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/FileIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/FileIdempotentRepository.json index ca6dbee7ea321..b90fd10b9f59f 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/FileIdempotentRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/FileIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-support", "version": "4.5.0-SNAPSHOT", - "properties": { "dropOldestFileStore": { "index": 0, "kind": "property", "displayName": "Drop Oldest File Store", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk space to allow room for new entries." }, "fileStore": { "index": 1, "kind": "property", "displayName": "File Store", "required": true, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "File name of the repository (incl directory)" }, "maxFileStoreSize": { "index": 2, "kind": "property", "displayName": "Max File Store Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "32768000", "description": "The maximum file size for the file store in bytes. The default value is 32mb" } } + "properties": { "fileStore": { "index": 0, "kind": "property", "displayName": "File Store", "required": true, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "File name of the repository (incl directory)" }, "maxFileStoreSize": { "index": 1, "kind": "property", "displayName": "Max File Store Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "32768000", "description": "The maximum file size for the file store in bytes. The default value is 32mb" }, "dropOldestFileStore": { "index": 2, "kind": "property", "displayName": "Drop Oldest File Store", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk space to allow room for new entries." } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastAggregationRepository.json index a07a7d2ab8705..d21f0647b3f5d 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-hazelcast", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "hazelcastInstance": { "index": 2, "kind": "property", "displayName": "Hazelcast Instance", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use an existing Hazelcast instance instead of local" }, "mapName": { "index": 3, "kind": "property", "displayName": "Map Name", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use" }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "optimistic": { "index": 5, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" }, "persistenceMapName": { "index": 6, "kind": "property", "displayName": "Persistence Map Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use for completed exchanges" }, "recoveryInterval": { "index": 7, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 8, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "mapName": { "index": 0, "kind": "property", "displayName": "Map Name", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use" }, "hazelcastInstance": { "index": 1, "kind": "property", "displayName": "Hazelcast Instance", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use an existing Hazelcast instance instead of local" }, "persistenceMapName": { "index": 2, "kind": "property", "displayName": "Persistence Map Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use for completed exchanges" }, "optimistic": { "index": 3, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" }, "useRecovery": { "index": 4, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "deadLetterUri": { "index": 6, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 7, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "allowSerializedHeaders": { "index": 8, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastIdempotentRepository.json index 3e412d87deb25..87c881c225e0e 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastIdempotentRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/HazelcastIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-hazelcast", "version": "4.5.0-SNAPSHOT", - "properties": { "hazelcastInstance": { "index": 0, "kind": "property", "displayName": "Hazelcast Instance", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use an existing Hazelcast instance instead of local" }, "repositoryName": { "index": 1, "kind": "property", "displayName": "Repository Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "HazelcastIdempotentRepository", "description": "Name of cache to use" } } + "properties": { "repositoryName": { "index": 0, "kind": "property", "displayName": "Repository Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "HazelcastIdempotentRepository", "description": "Name of cache to use" }, "hazelcastInstance": { "index": 1, "kind": "property", "displayName": "Hazelcast Instance", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use an existing Hazelcast instance instead of local" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanEmbeddedAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanEmbeddedAggregationRepository.json index 2c671a2eb2be0..d15dd4d801847 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanEmbeddedAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanEmbeddedAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-infinispan-embedded", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 2, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for embedded Infinispan" }, "deadLetterUri": { "index": 3, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 6, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "cacheName": { "index": 0, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 1, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for embedded Infinispan" }, "useRecovery": { "index": 2, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "deadLetterUri": { "index": 3, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "maximumRedeliveries": { "index": 5, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "allowSerializedHeaders": { "index": 6, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanRemoteAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanRemoteAggregationRepository.json index 66962dcd82493..3a9fbe50d11ac 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanRemoteAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/InfinispanRemoteAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-infinispan", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 2, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for remote Infinispan" }, "deadLetterUri": { "index": 3, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 6, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "cacheName": { "index": 0, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 1, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for remote Infinispan" }, "useRecovery": { "index": 2, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "deadLetterUri": { "index": 3, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "maximumRedeliveries": { "index": 5, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "allowSerializedHeaders": { "index": 6, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheAggregationRepository.json index 0aca13c8207e8..5a5cf74786840 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JCacheAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-jcache", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "configuration": { "index": 1, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for JCache" }, "optimistic": { "index": 2, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether optimistic locking is in use" } } + "properties": { "configuration": { "index": 0, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for JCache" }, "optimistic": { "index": 1, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether optimistic locking is in use" }, "allowSerializedHeaders": { "index": 2, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcAggregationRepository.json index cfb3773f0ecfc..44957e05cba51 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-sql", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "dataSource": { "index": 1, "kind": "property", "displayName": "Data Source", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The DataSource to use for connecting to the database" }, "deadLetterUri": { "index": 2, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "deserializationFilter": { "index": 3, "kind": "property", "displayName": "Deserialization Filter", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "java.**;org.apache.camel.**;!*", "description": "Sets a deserialization filter while reading Object from Aggregation Repository. By default the filter will allow all java packages and subpackages and all org.apache.camel packages and subpackages, while the remaining will be blacklisted and not deserialized. This parameter should be customized if you're using classes you trust to be deserialized." }, "headersToStoreAsText": { "index": 4, "kind": "property", "displayName": "Headers To Store As Text", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to store headers as String which is human readable. By default this option is disabled, storing the headers in binary format. Multiple header names can be separated by comma." }, "jdbcOptimisticLockingExceptionMapper": { "index": 5, "kind": "property", "displayName": "Jdbc Optimistic Locking Exception Mapper", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Mapper allowing different JDBC vendors to be mapped with vendor specific error codes to an OptimisticLockingException" }, "lobHandler": { "index": 6, "kind": "property", "displayName": "Lob Handler", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom LobHandler" }, "maximumRedeliveries": { "index": 7, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 8, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "repositoryName": { "index": 9, "kind": "property", "displayName": "Repository Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the repository." }, "storeBodyAsText": { "index": 10, "kind": "property", "displayName": "Store Body As Text", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to store the message body as String which is human readable. By default this option is false storing the body in binary format." }, "transactionManager": { "index": 11, "kind": "property", "displayName": "Transaction Manager", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring TransactionManager to use for connecting to the database" }, "useRecovery": { "index": 12, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "dataSource": { "index": 0, "kind": "property", "displayName": "Data Source", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The DataSource to use for connecting to the database" }, "transactionManager": { "index": 1, "kind": "property", "displayName": "Transaction Manager", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring TransactionManager to use for connecting to the database" }, "repositoryName": { "index": 2, "kind": "property", "displayName": "Repository Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the repository." }, "headersToStoreAsText": { "index": 3, "kind": "property", "displayName": "Headers To Store As Text", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to store headers as String which is human readable. By default this option is disabled, storing the headers in binary format. Multiple header names can be separated by comma." }, "storeBodyAsText": { "index": 4, "kind": "property", "displayName": "Store Body As Text", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to store the message body as String which is human readable. By default this option is false storing the body in binary format." }, "useRecovery": { "index": 5, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "recoveryInterval": { "index": 6, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "maximumRedeliveries": { "index": 7, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "deadLetterUri": { "index": 8, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "allowSerializedHeaders": { "index": 9, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deserializationFilter": { "index": 10, "kind": "property", "displayName": "Deserialization Filter", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "java.**;org.apache.camel.**;!*", "description": "Sets a deserialization filter while reading Object from Aggregation Repository. By default the filter will allow all java packages and subpackages and all org.apache.camel packages and subpackages, while the remaining will be blacklisted and not deserialized. This parameter should be customized if you're using classes you trust to be deserialized." }, "jdbcOptimisticLockingExceptionMapper": { "index": 11, "kind": "property", "displayName": "Jdbc Optimistic Locking Exception Mapper", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Mapper allowing different JDBC vendors to be mapped with vendor specific error codes to an OptimisticLockingException" }, "lobHandler": { "index": 12, "kind": "property", "displayName": "Lob Handler", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom LobHandler" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcMessageIdRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcMessageIdRepository.json index b8a16845f097c..0c49743805b36 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcMessageIdRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/JdbcMessageIdRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-sql", "version": "4.5.0-SNAPSHOT", - "properties": { "clearString": { "index": 0, "kind": "property", "displayName": "Clear String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to delete all message ids from the table" }, "createString": { "index": 1, "kind": "property", "displayName": "Create String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for creating table" }, "createTableIfNotExists": { "index": 2, "kind": "property", "displayName": "Create Table If Not Exists", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether to create the table in the database if none exists on startup" }, "deleteString": { "index": 3, "kind": "property", "displayName": "Delete String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for deleting message id from the table" }, "insertString": { "index": 4, "kind": "property", "displayName": "Insert String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for inserting a new message id in the table" }, "queryString": { "index": 5, "kind": "property", "displayName": "Query String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for check if message id already exists" }, "tableExistsString": { "index": 6, "kind": "property", "displayName": "Table Exists String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for checking if table exists" }, "tableName": { "index": 7, "kind": "property", "displayName": "Table Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_MESSAGEPROCESSED", "description": "The name of the table to use in the database" }, "jdbcTemplate": { "index": 8, "kind": "property", "displayName": "Jdbc Template", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring JdbcTemplate to use for connecting to the database" }, "processorName": { "index": 9, "kind": "property", "displayName": "Processor Name", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the processor that are used for this repository. Use unique names to separate processors in the same database." }, "transactionTemplate": { "index": 10, "kind": "property", "displayName": "Transaction Template", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring TransactionTemplate to use for connecting to the database" } } + "properties": { "tableName": { "index": 0, "kind": "property", "displayName": "Table Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_MESSAGEPROCESSED", "description": "The name of the table to use in the database" }, "createTableIfNotExists": { "index": 1, "kind": "property", "displayName": "Create Table If Not Exists", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether to create the table in the database if none exists on startup" }, "tableExistsString": { "index": 2, "kind": "property", "displayName": "Table Exists String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for checking if table exists" }, "createString": { "index": 3, "kind": "property", "displayName": "Create String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for creating table" }, "queryString": { "index": 4, "kind": "property", "displayName": "Query String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for check if message id already exists" }, "insertString": { "index": 5, "kind": "property", "displayName": "Insert String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for inserting a new message id in the table" }, "deleteString": { "index": 6, "kind": "property", "displayName": "Delete String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for deleting message id from the table" }, "clearString": { "index": 7, "kind": "property", "displayName": "Clear String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to delete all message ids from the table" }, "processorName": { "index": 8, "kind": "property", "displayName": "Processor Name", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the processor that are used for this repository. Use unique names to separate processors in the same database." }, "jdbcTemplate": { "index": 9, "kind": "property", "displayName": "Jdbc Template", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring JdbcTemplate to use for connecting to the database" }, "transactionTemplate": { "index": 10, "kind": "property", "displayName": "Transaction Template", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring TransactionTemplate to use for connecting to the database" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/KafkaIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/KafkaIdempotentRepository.json index 4787a36b9d6a4..ef73b04be6cc5 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/KafkaIdempotentRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/KafkaIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-kafka", "version": "4.5.0-SNAPSHOT", - "properties": { "bootstrapServers": { "index": 0, "kind": "property", "displayName": "Bootstrap Servers", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The URL for the kafka brokers to use" }, "maxCacheSize": { "index": 1, "kind": "property", "displayName": "Max Cache Size", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the maximum size of the local key cache." }, "pollDurationMs": { "index": 2, "kind": "property", "displayName": "Poll Duration Ms", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "100", "description": "Sets the poll duration of the Kafka consumer. The local caches are updated immediately; this value will affect how far behind other peers in the cluster are, which are updating their caches from the topic, relative to the idempotent consumer instance issued the cache action message. The default value of this is 100 If setting this value explicitly, be aware that there is a tradeoff between the remote cache liveness and the volume of network traffic between this repository's consumer and the Kafka brokers. The cache warmup process also depends on there being one poll that fetches nothing - this indicates that the stream has been consumed up to the current point. If the poll duration is excessively long for the rate at which messages are sent on the topic, there exists a possibility that the cache cannot be warmed up and will operate in an inconsistent state relative to its peers until it catches up." }, "topic": { "index": 3, "kind": "property", "displayName": "Topic", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the name of the Kafka topic used by this idempotent repository. Each functionally-separate repository should use a different topic." } } + "properties": { "topic": { "index": 0, "kind": "property", "displayName": "Topic", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the name of the Kafka topic used by this idempotent repository. Each functionally-separate repository should use a different topic." }, "bootstrapServers": { "index": 1, "kind": "property", "displayName": "Bootstrap Servers", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The URL for the kafka brokers to use" }, "maxCacheSize": { "index": 2, "kind": "property", "displayName": "Max Cache Size", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the maximum size of the local key cache." }, "pollDurationMs": { "index": 3, "kind": "property", "displayName": "Poll Duration Ms", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "100", "description": "Sets the poll duration of the Kafka consumer. The local caches are updated immediately; this value will affect how far behind other peers in the cluster are, which are updating their caches from the topic, relative to the idempotent consumer instance issued the cache action message. The default value of this is 100 If setting this value explicitly, be aware that there is a tradeoff between the remote cache liveness and the volume of network traffic between this repository's consumer and the Kafka brokers. The cache warmup process also depends on there being one poll that fetches nothing - this indicates that the stream has been consumed up to the current point. If the poll duration is excessively long for the rate at which messages are sent on the topic, there exists a possibility that the cache cannot be warmed up and will operate in an inconsistent state relative to its peers until it catches up." } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/LevelDBAggregationRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/LevelDBAggregationRepository.json index 6377dcc1f7412..43bc883d6a5e9 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/LevelDBAggregationRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/LevelDBAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-leveldb", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 2, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "persistentFileName": { "index": 3, "kind": "property", "displayName": "Persistent File Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of file to use for storing data" }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "repositoryName": { "index": 5, "kind": "property", "displayName": "Repository Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of repository" }, "returnOldExchange": { "index": 6, "kind": "property", "displayName": "Return Old Exchange", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to return the old exchange when adding new exchanges to the repository" }, "serializer": { "index": 7, "kind": "property", "displayName": "Serializer", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom serializer for LevelDB" }, "sync": { "index": 8, "kind": "property", "displayName": "Sync", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether LevelDB should sync writes" }, "useRecovery": { "index": 9, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "persistentFileName": { "index": 0, "kind": "property", "displayName": "Persistent File Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of file to use for storing data" }, "repositoryName": { "index": 1, "kind": "property", "displayName": "Repository Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of repository" }, "sync": { "index": 2, "kind": "property", "displayName": "Sync", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether LevelDB should sync writes" }, "returnOldExchange": { "index": 3, "kind": "property", "displayName": "Return Old Exchange", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to return the old exchange when adding new exchanges to the repository" }, "useRecovery": { "index": 4, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "maximumRedeliveries": { "index": 6, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "deadLetterUri": { "index": 7, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "allowSerializedHeaders": { "index": 8, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "serializer": { "index": 9, "kind": "property", "displayName": "Serializer", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom serializer for LevelDB" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MongoDbIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MongoDbIdempotentRepository.json index 9f506e8166af6..749f99167b9f2 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MongoDbIdempotentRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/MongoDbIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-mongodb", "version": "4.5.0-SNAPSHOT", - "properties": { "collectionName": { "index": 0, "kind": "property", "displayName": "Collection Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The collection name" }, "dbName": { "index": 1, "kind": "property", "displayName": "Db Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Database name" }, "mongoClient": { "index": 2, "kind": "property", "displayName": "Mongo Client", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The MongoClient to use for connecting to the MongoDB server" } } + "properties": { "mongoClient": { "index": 0, "kind": "property", "displayName": "Mongo Client", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The MongoClient to use for connecting to the MongoDB server" }, "dbName": { "index": 1, "kind": "property", "displayName": "Db Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Database name" }, "collectionName": { "index": 2, "kind": "property", "displayName": "Collection Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The collection name" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/SpringRedisIdempotentRepository.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/SpringRedisIdempotentRepository.json index b83b63d14441a..a47bd531d8940 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/SpringRedisIdempotentRepository.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/SpringRedisIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-spring-redis", "version": "4.5.0-SNAPSHOT", - "properties": { "redisConfiguration": { "index": 0, "kind": "property", "displayName": "Redis Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Redis configuration" }, "repositoryName": { "index": 1, "kind": "property", "displayName": "Repository Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of repository" } } + "properties": { "repositoryName": { "index": 0, "kind": "property", "displayName": "Repository Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of repository" }, "redisConfiguration": { "index": 1, "kind": "property", "displayName": "Redis Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Redis configuration" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/TarAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/TarAggregationStrategy.json index 87c8ffedc1f1f..f089769724c30 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/TarAggregationStrategy.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/TarAggregationStrategy.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-tarfile", "version": "4.5.0-SNAPSHOT", - "properties": { "filePrefix": { "index": 0, "kind": "property", "displayName": "File Prefix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the prefix that will be used when creating the TAR filename." }, "fileSuffix": { "index": 1, "kind": "property", "displayName": "File Suffix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "tar", "description": "Sets the suffix that will be used when creating the TAR filename." }, "parentDir": { "index": 2, "kind": "property", "displayName": "Parent Dir", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the parent directory to use for writing temporary files" }, "preserveFolderStructure": { "index": 3, "kind": "property", "displayName": "Preserve Folder Structure", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "If the incoming message is from a file, then the folder structure of said file can be preserved" }, "useFilenameHeader": { "index": 4, "kind": "property", "displayName": "Use Filename Header", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use CamelFileName header for the filename instead of using unique message id" } } + "properties": { "filePrefix": { "index": 0, "kind": "property", "displayName": "File Prefix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the prefix that will be used when creating the TAR filename." }, "fileSuffix": { "index": 1, "kind": "property", "displayName": "File Suffix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "tar", "description": "Sets the suffix that will be used when creating the TAR filename." }, "preserveFolderStructure": { "index": 2, "kind": "property", "displayName": "Preserve Folder Structure", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "If the incoming message is from a file, then the folder structure of said file can be preserved" }, "useFilenameHeader": { "index": 3, "kind": "property", "displayName": "Use Filename Header", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use CamelFileName header for the filename instead of using unique message id" }, "parentDir": { "index": 4, "kind": "property", "displayName": "Parent Dir", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the parent directory to use for writing temporary files" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltAggregationStrategy.json index d9b3686ed7071..8728d9f2a376a 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltAggregationStrategy.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltAggregationStrategy.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-xslt", "version": "4.5.0-SNAPSHOT", - "properties": { "output": { "index": 0, "kind": "property", "displayName": "Output", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "enum": [ "string", "bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "string", "description": "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime." }, "propertyName": { "index": 1, "kind": "property", "displayName": "Property Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "new-exchange", "description": "The exchange property name that contains the XML payloads as an input" }, "transformerFactoryClass": { "index": 2, "kind": "property", "displayName": "Transformer Factory Class", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom XSLT transformer factory, specified as a FQN class name" }, "xslFile": { "index": 3, "kind": "property", "displayName": "Xsl File", "required": true, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the XSL transformation file to use" } } + "properties": { "xslFile": { "index": 0, "kind": "property", "displayName": "Xsl File", "required": true, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the XSL transformation file to use" }, "propertyName": { "index": 1, "kind": "property", "displayName": "Property Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "new-exchange", "description": "The exchange property name that contains the XML payloads as an input" }, "transformerFactoryClass": { "index": 2, "kind": "property", "displayName": "Transformer Factory Class", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom XSLT transformer factory, specified as a FQN class name" }, "output": { "index": 3, "kind": "property", "displayName": "Output", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "enum": [ "string", "bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "string", "description": "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime." } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltSaxonAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltSaxonAggregationStrategy.json index 37ce9cd74513b..81e5ceb406cec 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltSaxonAggregationStrategy.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/XsltSaxonAggregationStrategy.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-xslt-saxon", "version": "4.5.0-SNAPSHOT", - "properties": { "output": { "index": 0, "kind": "property", "displayName": "Output", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "enum": [ "string", "bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "string", "description": "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime." }, "propertyName": { "index": 1, "kind": "property", "displayName": "Property Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "new-exchange", "description": "The exchange property name that contains the XML payloads as an input" }, "transformerFactoryClass": { "index": 2, "kind": "property", "displayName": "Transformer Factory Class", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom XSLT transformer factory, specified as a FQN class name" }, "xslFile": { "index": 3, "kind": "property", "displayName": "Xsl File", "required": true, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the XSL transformation file to use" } } + "properties": { "xslFile": { "index": 0, "kind": "property", "displayName": "Xsl File", "required": true, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the XSL transformation file to use" }, "propertyName": { "index": 1, "kind": "property", "displayName": "Property Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "new-exchange", "description": "The exchange property name that contains the XML payloads as an input" }, "output": { "index": 2, "kind": "property", "displayName": "Output", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "enum": [ "string", "bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "string", "description": "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime." }, "transformerFactoryClass": { "index": 3, "kind": "property", "displayName": "Transformer Factory Class", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom XSLT transformer factory, specified as a FQN class name" } } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/ZipAggregationStrategy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/ZipAggregationStrategy.json index edd5aa7271d64..f7b20124fa49d 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/ZipAggregationStrategy.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/ZipAggregationStrategy.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-zipfile", "version": "4.5.0-SNAPSHOT", - "properties": { "filePrefix": { "index": 0, "kind": "property", "displayName": "File Prefix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the prefix that will be used when creating the ZIP filename." }, "fileSuffix": { "index": 1, "kind": "property", "displayName": "File Suffix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "zip", "description": "Sets the suffix that will be used when creating the ZIP filename." }, "parentDir": { "index": 2, "kind": "property", "displayName": "Parent Dir", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the parent directory to use for writing temporary files" }, "preserveFolderStructure": { "index": 3, "kind": "property", "displayName": "Preserve Folder Structure", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "If the incoming message is from a file, then the folder structure of said file can be preserved" }, "useFilenameHeader": { "index": 4, "kind": "property", "displayName": "Use Filename Header", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use CamelFileName header for the filename instead of using unique message id" }, "useTempFile": { "index": 5, "kind": "property", "displayName": "Use Temp File", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use temporary files for zip manipulations instead of memory." } } + "properties": { "filePrefix": { "index": 0, "kind": "property", "displayName": "File Prefix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the prefix that will be used when creating the ZIP filename." }, "fileSuffix": { "index": 1, "kind": "property", "displayName": "File Suffix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "zip", "description": "Sets the suffix that will be used when creating the ZIP filename." }, "preserveFolderStructure": { "index": 2, "kind": "property", "displayName": "Preserve Folder Structure", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "If the incoming message is from a file, then the folder structure of said file can be preserved" }, "useFilenameHeader": { "index": 3, "kind": "property", "displayName": "Use Filename Header", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use CamelFileName header for the filename instead of using unique message id" }, "useTempFile": { "index": 4, "kind": "property", "displayName": "Use Temp File", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use temporary files for zip manipulations instead of memory." }, "parentDir": { "index": 5, "kind": "property", "displayName": "Parent Dir", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the parent directory to use for writing temporary files" } } } } diff --git a/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json index 350606540cf4e..14de19f8f810c 100644 --- a/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json +++ b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/bean/CaffeineAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-caffeine", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 2, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 3, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 4, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "useRecovery": { "index": 0, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "recoveryInterval": { "index": 2, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "maximumRedeliveries": { "index": 3, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "allowSerializedHeaders": { "index": 4, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.caffeine.processor.aggregate.CaffeineAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" } } } } diff --git a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java index 60388e1b32a32..549334cdf530f 100644 --- a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java +++ b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java @@ -46,9 +46,6 @@ public class CaffeineAggregationRepository extends ServiceSupport implements Rec private CamelContext camelContext; private Cache cache; - @Metadata(label = "advanced", - description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") - private boolean allowSerializedHeaders; @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") @@ -59,6 +56,9 @@ public class CaffeineAggregationRepository extends ServiceSupport implements Rec + " When this limit is hit, then the Exchange is moved to the dead letter channel.", defaultValue = "3") private int maximumRedeliveries = 3; + @Metadata(label = "advanced", + description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") + private boolean allowSerializedHeaders; public CamelContext getCamelContext() { return camelContext; diff --git a/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraAggregationRepository.json b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraAggregationRepository.json index 98d5e72e4f7fc..c05e5b5616284 100644 --- a/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraAggregationRepository.json +++ b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-cassandraql", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "exchangeColumn": { "index": 2, "kind": "property", "displayName": "Exchange Column", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "EXCHANGE", "description": "Column name for Exchange" }, "exchangeIdColumn": { "index": 3, "kind": "property", "displayName": "Exchange Id Column", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "EXCHANGE_ID", "description": "Column name for Exchange ID" }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "pkColumns": { "index": 5, "kind": "property", "displayName": "Primary Key Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "prefixPKValues": { "index": 6, "kind": "property", "displayName": "Prefix Primary Key Values", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "readConsistencyLevel": { "index": 7, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" }, "recoveryInterval": { "index": 8, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "sessionHolder": { "index": 9, "kind": "property", "displayName": "Session Holder", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 10, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_AGGREGATION", "description": "The table name for storing the data" }, "ttl": { "index": 11, "kind": "property", "displayName": "Time to Live", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "useRecovery": { "index": 12, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "writeConsistencyLevel": { "index": 13, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" } } + "properties": { "sessionHolder": { "index": 0, "kind": "property", "displayName": "Session Holder", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 1, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_AGGREGATION", "description": "The table name for storing the data" }, "exchangeIdColumn": { "index": 2, "kind": "property", "displayName": "Exchange Id Column", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "EXCHANGE_ID", "description": "Column name for Exchange ID" }, "exchangeColumn": { "index": 3, "kind": "property", "displayName": "Exchange Column", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "EXCHANGE", "description": "Column name for Exchange" }, "prefixPKValues": { "index": 4, "kind": "property", "displayName": "Prefix Primary Key Values", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "pkColumns": { "index": 5, "kind": "property", "displayName": "Primary Key Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "ttl": { "index": 6, "kind": "property", "displayName": "Time to Live", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "writeConsistencyLevel": { "index": 7, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" }, "readConsistencyLevel": { "index": 8, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" }, "recoveryInterval": { "index": 9, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 10, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "deadLetterUri": { "index": 11, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 12, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "allowSerializedHeaders": { "index": 13, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.cassandra.CassandraAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" } } } } diff --git a/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraIdempotentRepository.json b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraIdempotentRepository.json index 0c3722d07806a..78269b7e6494c 100644 --- a/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraIdempotentRepository.json +++ b/components/camel-cassandraql/src/generated/resources/META-INF/services/org/apache/camel/bean/CassandraIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-cassandraql", "version": "4.5.0-SNAPSHOT", - "properties": { "pkColumns": { "index": 0, "kind": "property", "displayName": "Primary Key Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "prefixPKValues": { "index": 1, "kind": "property", "displayName": "Prefix Primary Key Values", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "readConsistencyLevel": { "index": 2, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" }, "session": { "index": 3, "kind": "property", "displayName": "Session", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 4, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_IDEMPOTENT", "description": "The table name for storing the data" }, "ttl": { "index": 5, "kind": "property", "displayName": "Time to Live", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "writeConsistencyLevel": { "index": 6, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" } } + "properties": { "session": { "index": 0, "kind": "property", "displayName": "Session", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Cassandra session" }, "table": { "index": 1, "kind": "property", "displayName": "Table", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_IDEMPOTENT", "description": "The table name for storing the data" }, "prefixPKValues": { "index": 2, "kind": "property", "displayName": "Prefix Primary Key Values", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Values used as primary key prefix. Multiple values can be separated by comma." }, "pkColumns": { "index": 3, "kind": "property", "displayName": "Primary Key Columns", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "KEY", "description": "Primary key columns. Multiple values can be separated by comma." }, "ttl": { "index": 4, "kind": "property", "displayName": "Time to Live", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Time to live in seconds used for inserts" }, "writeConsistencyLevel": { "index": 5, "kind": "property", "displayName": "Write Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Write consistency level" }, "readConsistencyLevel": { "index": 6, "kind": "property", "displayName": "Read Consistency Level", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository", "enum": [ "ANY", "ONE", "TWO", "THREE", "QUORUM", "ALL", "LOCAL_ONE", "LOCAL_QUORUM", "EACH_QUORUM", "SERIAL", "LOCAL_SERIAL" ], "deprecated": false, "autowired": false, "secret": false, "description": "Read consistency level" } } } } diff --git a/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json index c8fde386e07ee..eed304ee999ff 100644 --- a/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json +++ b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/bean/EhcacheAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-ehcache", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "deadLetterUri": { "index": 2, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 3, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 5, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "cacheName": { "index": 0, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "allowSerializedHeaders": { "index": 1, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "useRecovery": { "index": 2, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "deadLetterUri": { "index": 3, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "maximumRedeliveries": { "index": 5, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.ehcache.processor.aggregate.EhcacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." } } } } diff --git a/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json b/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json index 7549f4c8a9d9e..75a6d2e53a68e 100644 --- a/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json +++ b/components/camel-etcd3/src/generated/resources/META-INF/services/org/apache/camel/bean/Etcd3AggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-etcd3", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "endpoint": { "index": 2, "kind": "property", "displayName": "Endpoint", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "URL to Etcd3 service" }, "maximumRedeliveries": { "index": 3, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "optimistic": { "index": 4, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether or not to use optimistic locking" }, "persistencePrefixName": { "index": 5, "kind": "property", "displayName": "Persistence Prefix Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key for completed exchanges" }, "prefixName": { "index": 6, "kind": "property", "displayName": "Prefix Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key" }, "recoveryInterval": { "index": 7, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 8, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "endpoint": { "index": 0, "kind": "property", "displayName": "Endpoint", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "URL to Etcd3 service" }, "prefixName": { "index": 1, "kind": "property", "displayName": "Prefix Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key" }, "persistencePrefixName": { "index": 2, "kind": "property", "displayName": "Persistence Prefix Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Prefix to use as primary key for completed exchanges" }, "optimistic": { "index": 3, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether or not to use optimistic locking" }, "useRecovery": { "index": 4, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "deadLetterUri": { "index": 6, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 7, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "allowSerializedHeaders": { "index": 8, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd3.processor.aggregate.Etcd3AggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" } } } } diff --git a/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java b/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java index 2333e034f971a..03b10fb4d4b4a 100644 --- a/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java +++ b/components/camel-etcd3/src/main/java/org/apache/camel/component/etcd3/processor/aggregate/Etcd3AggregationRepository.java @@ -80,10 +80,10 @@ public class Etcd3AggregationRepository extends ServiceSupport private boolean optimistic; @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; - @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") - private String deadLetterUri; @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") private long recoveryInterval = 5000; + @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") + private String deadLetterUri; @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." + " When this limit is hit, then the Exchange is moved to the dead letter channel.", defaultValue = "3") diff --git a/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json index a07a7d2ab8705..d21f0647b3f5d 100644 --- a/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json +++ b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-hazelcast", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "hazelcastInstance": { "index": 2, "kind": "property", "displayName": "Hazelcast Instance", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use an existing Hazelcast instance instead of local" }, "mapName": { "index": 3, "kind": "property", "displayName": "Map Name", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use" }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "optimistic": { "index": 5, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" }, "persistenceMapName": { "index": 6, "kind": "property", "displayName": "Persistence Map Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use for completed exchanges" }, "recoveryInterval": { "index": 7, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 8, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "mapName": { "index": 0, "kind": "property", "displayName": "Map Name", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use" }, "hazelcastInstance": { "index": 1, "kind": "property", "displayName": "Hazelcast Instance", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use an existing Hazelcast instance instead of local" }, "persistenceMapName": { "index": 2, "kind": "property", "displayName": "Persistence Map Name", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache to use for completed exchanges" }, "optimistic": { "index": 3, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use optimistic locking" }, "useRecovery": { "index": 4, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "deadLetterUri": { "index": 6, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 7, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "allowSerializedHeaders": { "index": 8, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.hazelcast.HazelcastAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" } } } } diff --git a/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastIdempotentRepository.json b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastIdempotentRepository.json index 3e412d87deb25..87c881c225e0e 100644 --- a/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastIdempotentRepository.json +++ b/components/camel-hazelcast/src/generated/resources/META-INF/services/org/apache/camel/bean/HazelcastIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-hazelcast", "version": "4.5.0-SNAPSHOT", - "properties": { "hazelcastInstance": { "index": 0, "kind": "property", "displayName": "Hazelcast Instance", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use an existing Hazelcast instance instead of local" }, "repositoryName": { "index": 1, "kind": "property", "displayName": "Repository Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "HazelcastIdempotentRepository", "description": "Name of cache to use" } } + "properties": { "repositoryName": { "index": 0, "kind": "property", "displayName": "Repository Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "HazelcastIdempotentRepository", "description": "Name of cache to use" }, "hazelcastInstance": { "index": 1, "kind": "property", "displayName": "Hazelcast Instance", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.hazelcast.HazelcastIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use an existing Hazelcast instance instead of local" } } } } diff --git a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepository.java b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepository.java index 3347bd57003e4..0e474f233dcba 100644 --- a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepository.java +++ b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/aggregate/hazelcast/HazelcastAggregationRepository.java @@ -69,20 +69,20 @@ public class HazelcastAggregationRepository extends ServiceSupport protected boolean useLocalHzInstance; protected IMap cache; protected IMap persistedCache; - @Metadata(description = "To use an existing Hazelcast instance instead of local") - protected HazelcastInstance hazelcastInstance; @Metadata(description = "Name of cache to use", required = true) protected String mapName; + @Metadata(description = "To use an existing Hazelcast instance instead of local") + protected HazelcastInstance hazelcastInstance; @Metadata(label = "advanced", description = "Name of cache to use for completed exchanges") protected String persistenceMapName; @Metadata(description = "Whether to use optimistic locking") protected boolean optimistic; @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") protected boolean useRecovery = true; - @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") - protected String deadLetterUri; @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") protected long recoveryInterval = 5000; + @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") + protected String deadLetterUri; @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." + " When this limit is hit, then the Exchange is moved to the dead letter channel.", defaultValue = "3") diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedAggregationRepository.json b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedAggregationRepository.json index 2c671a2eb2be0..d15dd4d801847 100644 --- a/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedAggregationRepository.json +++ b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanEmbeddedAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-infinispan-embedded", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 2, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for embedded Infinispan" }, "deadLetterUri": { "index": 3, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 6, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "cacheName": { "index": 0, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 1, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for embedded Infinispan" }, "useRecovery": { "index": 2, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "deadLetterUri": { "index": 3, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "maximumRedeliveries": { "index": 5, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "allowSerializedHeaders": { "index": 6, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" } } } } diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java b/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java index 0308fd6886a87..3d329f297e7e5 100644 --- a/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java +++ b/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedAggregationRepository.java @@ -36,12 +36,11 @@ public class InfinispanEmbeddedAggregationRepository extends InfinispanAggregati private Supplier> cache; private InfinispanEmbeddedManager manager; - @Metadata(description = "Configuration for embedded Infinispan") - private InfinispanEmbeddedConfiguration configuration; - // needed for metadata generation @Metadata(description = "Name of cache", required = true) private String cacheName; + @Metadata(description = "Configuration for embedded Infinispan") + private InfinispanEmbeddedConfiguration configuration; @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") diff --git a/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteAggregationRepository.json b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteAggregationRepository.json index 66962dcd82493..3a9fbe50d11ac 100644 --- a/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteAggregationRepository.json +++ b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/bean/InfinispanRemoteAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-infinispan", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 2, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for remote Infinispan" }, "deadLetterUri": { "index": 3, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 4, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "useRecovery": { "index": 6, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "cacheName": { "index": 0, "kind": "property", "displayName": "Cache Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of cache" }, "configuration": { "index": 1, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for remote Infinispan" }, "useRecovery": { "index": 2, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "deadLetterUri": { "index": 3, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "maximumRedeliveries": { "index": 5, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3", "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "allowSerializedHeaders": { "index": 6, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" } } } } diff --git a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java index e9ca86c877698..40279e50707a9 100644 --- a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java +++ b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java @@ -39,11 +39,11 @@ public class InfinispanRemoteAggregationRepository extends InfinispanAggregation private Supplier> cache; private InfinispanRemoteManager manager; + @Metadata(description = "Name of cache", required = true) + private String cacheName; @Metadata(description = "Configuration for remote Infinispan") private InfinispanRemoteConfiguration configuration; // needed for metadata generation - @Metadata(description = "Name of cache", required = true) - private String cacheName; @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") diff --git a/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheAggregationRepository.json b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheAggregationRepository.json index 0aca13c8207e8..5a5cf74786840 100644 --- a/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheAggregationRepository.json +++ b/components/camel-jcache/src/generated/resources/META-INF/services/org/apache/camel/bean/JCacheAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-jcache", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "configuration": { "index": 1, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for JCache" }, "optimistic": { "index": 2, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether optimistic locking is in use" } } + "properties": { "configuration": { "index": 0, "kind": "property", "displayName": "Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Configuration for JCache" }, "optimistic": { "index": 1, "kind": "property", "displayName": "Optimistic", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether optimistic locking is in use" }, "allowSerializedHeaders": { "index": 2, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.jcache.processor.aggregate.JCacheAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" } } } } diff --git a/components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/bean/KafkaIdempotentRepository.json b/components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/bean/KafkaIdempotentRepository.json index 4787a36b9d6a4..ef73b04be6cc5 100644 --- a/components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/bean/KafkaIdempotentRepository.json +++ b/components/camel-kafka/src/generated/resources/META-INF/services/org/apache/camel/bean/KafkaIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-kafka", "version": "4.5.0-SNAPSHOT", - "properties": { "bootstrapServers": { "index": 0, "kind": "property", "displayName": "Bootstrap Servers", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The URL for the kafka brokers to use" }, "maxCacheSize": { "index": 1, "kind": "property", "displayName": "Max Cache Size", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the maximum size of the local key cache." }, "pollDurationMs": { "index": 2, "kind": "property", "displayName": "Poll Duration Ms", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "100", "description": "Sets the poll duration of the Kafka consumer. The local caches are updated immediately; this value will affect how far behind other peers in the cluster are, which are updating their caches from the topic, relative to the idempotent consumer instance issued the cache action message. The default value of this is 100 If setting this value explicitly, be aware that there is a tradeoff between the remote cache liveness and the volume of network traffic between this repository's consumer and the Kafka brokers. The cache warmup process also depends on there being one poll that fetches nothing - this indicates that the stream has been consumed up to the current point. If the poll duration is excessively long for the rate at which messages are sent on the topic, there exists a possibility that the cache cannot be warmed up and will operate in an inconsistent state relative to its peers until it catches up." }, "topic": { "index": 3, "kind": "property", "displayName": "Topic", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the name of the Kafka topic used by this idempotent repository. Each functionally-separate repository should use a different topic." } } + "properties": { "topic": { "index": 0, "kind": "property", "displayName": "Topic", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the name of the Kafka topic used by this idempotent repository. Each functionally-separate repository should use a different topic." }, "bootstrapServers": { "index": 1, "kind": "property", "displayName": "Bootstrap Servers", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The URL for the kafka brokers to use" }, "maxCacheSize": { "index": 2, "kind": "property", "displayName": "Max Cache Size", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the maximum size of the local key cache." }, "pollDurationMs": { "index": 3, "kind": "property", "displayName": "Poll Duration Ms", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.kafka.KafkaIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "100", "description": "Sets the poll duration of the Kafka consumer. The local caches are updated immediately; this value will affect how far behind other peers in the cluster are, which are updating their caches from the topic, relative to the idempotent consumer instance issued the cache action message. The default value of this is 100 If setting this value explicitly, be aware that there is a tradeoff between the remote cache liveness and the volume of network traffic between this repository's consumer and the Kafka brokers. The cache warmup process also depends on there being one poll that fetches nothing - this indicates that the stream has been consumed up to the current point. If the poll duration is excessively long for the rate at which messages are sent on the topic, there exists a possibility that the cache cannot be warmed up and will operate in an inconsistent state relative to its peers until it catches up." } } } } diff --git a/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean/LevelDBAggregationRepository.json b/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean/LevelDBAggregationRepository.json index 6377dcc1f7412..43bc883d6a5e9 100644 --- a/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean/LevelDBAggregationRepository.json +++ b/components/camel-leveldb/src/generated/resources/META-INF/services/org/apache/camel/bean/LevelDBAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-leveldb", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deadLetterUri": { "index": 1, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "maximumRedeliveries": { "index": 2, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "persistentFileName": { "index": 3, "kind": "property", "displayName": "Persistent File Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of file to use for storing data" }, "recoveryInterval": { "index": 4, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "repositoryName": { "index": 5, "kind": "property", "displayName": "Repository Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of repository" }, "returnOldExchange": { "index": 6, "kind": "property", "displayName": "Return Old Exchange", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to return the old exchange when adding new exchanges to the repository" }, "serializer": { "index": 7, "kind": "property", "displayName": "Serializer", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom serializer for LevelDB" }, "sync": { "index": 8, "kind": "property", "displayName": "Sync", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether LevelDB should sync writes" }, "useRecovery": { "index": 9, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "persistentFileName": { "index": 0, "kind": "property", "displayName": "Persistent File Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of file to use for storing data" }, "repositoryName": { "index": 1, "kind": "property", "displayName": "Repository Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of repository" }, "sync": { "index": 2, "kind": "property", "displayName": "Sync", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether LevelDB should sync writes" }, "returnOldExchange": { "index": 3, "kind": "property", "displayName": "Return Old Exchange", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to return the old exchange when adding new exchanges to the repository" }, "useRecovery": { "index": 4, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "recoveryInterval": { "index": 5, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "maximumRedeliveries": { "index": 6, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "deadLetterUri": { "index": 7, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "allowSerializedHeaders": { "index": 8, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "serializer": { "index": 9, "kind": "property", "displayName": "Serializer", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.leveldb.LevelDBAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom serializer for LevelDB" } } } } diff --git a/components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/bean/MongoDbIdempotentRepository.json b/components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/bean/MongoDbIdempotentRepository.json index 9f506e8166af6..749f99167b9f2 100644 --- a/components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/bean/MongoDbIdempotentRepository.json +++ b/components/camel-mongodb/src/generated/resources/META-INF/services/org/apache/camel/bean/MongoDbIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-mongodb", "version": "4.5.0-SNAPSHOT", - "properties": { "collectionName": { "index": 0, "kind": "property", "displayName": "Collection Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The collection name" }, "dbName": { "index": 1, "kind": "property", "displayName": "Db Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Database name" }, "mongoClient": { "index": 2, "kind": "property", "displayName": "Mongo Client", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The MongoClient to use for connecting to the MongoDB server" } } + "properties": { "mongoClient": { "index": 0, "kind": "property", "displayName": "Mongo Client", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The MongoClient to use for connecting to the MongoDB server" }, "dbName": { "index": 1, "kind": "property", "displayName": "Db Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Database name" }, "collectionName": { "index": 2, "kind": "property", "displayName": "Collection Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.mongodb.processor.idempotent.MongoDbIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The collection name" } } } } diff --git a/components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/bean/SpringRedisIdempotentRepository.json b/components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/bean/SpringRedisIdempotentRepository.json index b83b63d14441a..a47bd531d8940 100644 --- a/components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/bean/SpringRedisIdempotentRepository.json +++ b/components/camel-spring-redis/src/generated/resources/META-INF/services/org/apache/camel/bean/SpringRedisIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-spring-redis", "version": "4.5.0-SNAPSHOT", - "properties": { "redisConfiguration": { "index": 0, "kind": "property", "displayName": "Redis Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Redis configuration" }, "repositoryName": { "index": 1, "kind": "property", "displayName": "Repository Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of repository" } } + "properties": { "repositoryName": { "index": 0, "kind": "property", "displayName": "Repository Name", "required": true, "type": "object", "javaType": "org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Name of repository" }, "redisConfiguration": { "index": 1, "kind": "property", "displayName": "Redis Configuration", "required": false, "type": "object", "javaType": "org.apache.camel.component.redis.processor.idempotent.SpringRedisIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Redis configuration" } } } } diff --git a/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcAggregationRepository.json b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcAggregationRepository.json index cfb3773f0ecfc..44957e05cba51 100644 --- a/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcAggregationRepository.json +++ b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcAggregationRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-sql", "version": "4.5.0-SNAPSHOT", - "properties": { "allowSerializedHeaders": { "index": 0, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "dataSource": { "index": 1, "kind": "property", "displayName": "Data Source", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The DataSource to use for connecting to the database" }, "deadLetterUri": { "index": 2, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "deserializationFilter": { "index": 3, "kind": "property", "displayName": "Deserialization Filter", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "java.**;org.apache.camel.**;!*", "description": "Sets a deserialization filter while reading Object from Aggregation Repository. By default the filter will allow all java packages and subpackages and all org.apache.camel packages and subpackages, while the remaining will be blacklisted and not deserialized. This parameter should be customized if you're using classes you trust to be deserialized." }, "headersToStoreAsText": { "index": 4, "kind": "property", "displayName": "Headers To Store As Text", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to store headers as String which is human readable. By default this option is disabled, storing the headers in binary format. Multiple header names can be separated by comma." }, "jdbcOptimisticLockingExceptionMapper": { "index": 5, "kind": "property", "displayName": "Jdbc Optimistic Locking Exception Mapper", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Mapper allowing different JDBC vendors to be mapped with vendor specific error codes to an OptimisticLockingException" }, "lobHandler": { "index": 6, "kind": "property", "displayName": "Lob Handler", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom LobHandler" }, "maximumRedeliveries": { "index": 7, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "recoveryInterval": { "index": 8, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "repositoryName": { "index": 9, "kind": "property", "displayName": "Repository Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the repository." }, "storeBodyAsText": { "index": 10, "kind": "property", "displayName": "Store Body As Text", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to store the message body as String which is human readable. By default this option is false storing the body in binary format." }, "transactionManager": { "index": 11, "kind": "property", "displayName": "Transaction Manager", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring TransactionManager to use for connecting to the database" }, "useRecovery": { "index": 12, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" } } + "properties": { "dataSource": { "index": 0, "kind": "property", "displayName": "Data Source", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The DataSource to use for connecting to the database" }, "transactionManager": { "index": 1, "kind": "property", "displayName": "Transaction Manager", "required": true, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring TransactionManager to use for connecting to the database" }, "repositoryName": { "index": 2, "kind": "property", "displayName": "Repository Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the repository." }, "headersToStoreAsText": { "index": 3, "kind": "property", "displayName": "Headers To Store As Text", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to store headers as String which is human readable. By default this option is disabled, storing the headers in binary format. Multiple header names can be separated by comma." }, "storeBodyAsText": { "index": 4, "kind": "property", "displayName": "Store Body As Text", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to store the message body as String which is human readable. By default this option is false storing the body in binary format." }, "useRecovery": { "index": 5, "kind": "property", "displayName": "Use Recovery", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether or not recovery is enabled" }, "recoveryInterval": { "index": 6, "kind": "property", "displayName": "Recovery Interval", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Sets the interval between recovery scans" }, "maximumRedeliveries": { "index": 7, "kind": "property", "displayName": "Maximum Redeliveries", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted. When this limit is hit, then the Exchange is moved to the dead letter channel." }, "deadLetterUri": { "index": 8, "kind": "property", "displayName": "Dead Letter Uri", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Sets an optional dead letter channel which exhausted recovered Exchange should be send to." }, "allowSerializedHeaders": { "index": 9, "kind": "property", "displayName": "Allow Serialized Headers", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository" }, "deserializationFilter": { "index": 10, "kind": "property", "displayName": "Deserialization Filter", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "java.**;org.apache.camel.**;!*", "description": "Sets a deserialization filter while reading Object from Aggregation Repository. By default the filter will allow all java packages and subpackages and all org.apache.camel packages and subpackages, while the remaining will be blacklisted and not deserialized. This parameter should be customized if you're using classes you trust to be deserialized." }, "jdbcOptimisticLockingExceptionMapper": { "index": 11, "kind": "property", "displayName": "Jdbc Optimistic Locking Exception Mapper", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "Mapper allowing different JDBC vendors to be mapped with vendor specific error codes to an OptimisticLockingException" }, "lobHandler": { "index": 12, "kind": "property", "displayName": "Lob Handler", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom LobHandler" } } } } diff --git a/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcMessageIdRepository.json b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcMessageIdRepository.json index b8a16845f097c..0c49743805b36 100644 --- a/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcMessageIdRepository.json +++ b/components/camel-sql/src/generated/resources/META-INF/services/org/apache/camel/bean/JdbcMessageIdRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-sql", "version": "4.5.0-SNAPSHOT", - "properties": { "clearString": { "index": 0, "kind": "property", "displayName": "Clear String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to delete all message ids from the table" }, "createString": { "index": 1, "kind": "property", "displayName": "Create String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for creating table" }, "createTableIfNotExists": { "index": 2, "kind": "property", "displayName": "Create Table If Not Exists", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether to create the table in the database if none exists on startup" }, "deleteString": { "index": 3, "kind": "property", "displayName": "Delete String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for deleting message id from the table" }, "insertString": { "index": 4, "kind": "property", "displayName": "Insert String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for inserting a new message id in the table" }, "queryString": { "index": 5, "kind": "property", "displayName": "Query String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for check if message id already exists" }, "tableExistsString": { "index": 6, "kind": "property", "displayName": "Table Exists String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for checking if table exists" }, "tableName": { "index": 7, "kind": "property", "displayName": "Table Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_MESSAGEPROCESSED", "description": "The name of the table to use in the database" }, "jdbcTemplate": { "index": 8, "kind": "property", "displayName": "Jdbc Template", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring JdbcTemplate to use for connecting to the database" }, "processorName": { "index": 9, "kind": "property", "displayName": "Processor Name", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the processor that are used for this repository. Use unique names to separate processors in the same database." }, "transactionTemplate": { "index": 10, "kind": "property", "displayName": "Transaction Template", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring TransactionTemplate to use for connecting to the database" } } + "properties": { "tableName": { "index": 0, "kind": "property", "displayName": "Table Name", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CAMEL_MESSAGEPROCESSED", "description": "The name of the table to use in the database" }, "createTableIfNotExists": { "index": 1, "kind": "property", "displayName": "Create Table If Not Exists", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether to create the table in the database if none exists on startup" }, "tableExistsString": { "index": 2, "kind": "property", "displayName": "Table Exists String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for checking if table exists" }, "createString": { "index": 3, "kind": "property", "displayName": "Create String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for creating table" }, "queryString": { "index": 4, "kind": "property", "displayName": "Query String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for check if message id already exists" }, "insertString": { "index": 5, "kind": "property", "displayName": "Insert String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for inserting a new message id in the table" }, "deleteString": { "index": 6, "kind": "property", "displayName": "Delete String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to use for deleting message id from the table" }, "clearString": { "index": 7, "kind": "property", "displayName": "Clear String", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "SQL query to delete all message ids from the table" }, "processorName": { "index": 8, "kind": "property", "displayName": "Processor Name", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the processor that are used for this repository. Use unique names to separate processors in the same database." }, "jdbcTemplate": { "index": 9, "kind": "property", "displayName": "Jdbc Template", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring JdbcTemplate to use for connecting to the database" }, "transactionTemplate": { "index": 10, "kind": "property", "displayName": "Transaction Template", "required": true, "type": "object", "javaType": "org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository", "deprecated": false, "autowired": false, "secret": false, "description": "The Spring TransactionTemplate to use for connecting to the database" } } } } diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java index b5f424b821067..67f207119dbf2 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java +++ b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java @@ -87,18 +87,22 @@ public class JdbcAggregationRepository extends ServiceSupport private boolean returnOldExchange; private int propagationBehavior = TransactionDefinition.PROPAGATION_REQUIRED; - @Metadata(description = "The Spring TransactionManager to use for connecting to the database", required = true) - private PlatformTransactionManager transactionManager; @Metadata(description = "The DataSource to use for connecting to the database", required = true) private DataSource dataSource; - @Metadata(label = "advanced", description = "To use a custom LobHandler") - private LobHandler lobHandler = new DefaultLobHandler(); + @Metadata(description = "The Spring TransactionManager to use for connecting to the database", required = true) + private PlatformTransactionManager transactionManager; @Metadata(description = "The name of the repository.") private String repositoryName; - @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") - private long recoveryInterval = 5000; + @Metadata(javaType = "java.lang.String", + description = "Allows to store headers as String which is human readable. By default this option is disabled, storing the headers in binary format." + + " Multiple header names can be separated by comma.") + private List headersToStoreAsText; + @Metadata(description = "Whether to store the message body as String which is human readable. By default this option is false storing the body in binary format.") + private boolean storeBodyAsText; @Metadata(description = "Whether or not recovery is enabled", defaultValue = "true") private boolean useRecovery = true; + @Metadata(description = "Sets the interval between recovery scans", defaultValue = "5000") + private long recoveryInterval = 5000; @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." + " When this limit is hit, then the Exchange is moved to the dead letter channel.") private int maximumRedeliveries; @@ -107,12 +111,6 @@ public class JdbcAggregationRepository extends ServiceSupport @Metadata(label = "advanced", description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") private boolean allowSerializedHeaders; - @Metadata(javaType = "java.lang.String", - description = "Allows to store headers as String which is human readable. By default this option is disabled, storing the headers in binary format." - + " Multiple header names can be separated by comma.") - private List headersToStoreAsText; - @Metadata(description = "Whether to store the message body as String which is human readable. By default this option is false storing the body in binary format.") - private boolean storeBodyAsText; @Metadata(label = "security", defaultValue = "java.**;org.apache.camel.**;!*", description = "Sets a deserialization filter while reading Object from Aggregation Repository. By default the filter will allow" + " all java packages and subpackages and all org.apache.camel packages and subpackages, while the remaining will be" @@ -122,6 +120,8 @@ public class JdbcAggregationRepository extends ServiceSupport description = "Mapper allowing different JDBC vendors to be mapped with vendor specific error codes to an OptimisticLockingException") private JdbcOptimisticLockingExceptionMapper jdbcOptimisticLockingExceptionMapper = new DefaultJdbcOptimisticLockingExceptionMapper(); + @Metadata(label = "advanced", description = "To use a custom LobHandler") + private LobHandler lobHandler = new DefaultLobHandler(); /** * Creates an aggregation repository diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepository.java b/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepository.java index 2b4f55ef15b25..de90efbda9e5b 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepository.java +++ b/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepository.java @@ -50,10 +50,10 @@ public class JdbcMessageIdRepository extends AbstractJdbcMessageIdRepository { = "DELETE FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ? AND messageId = ?"; protected static final String DEFAULT_CLEAR_STRING = "DELETE FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ?"; - @Metadata(description = "Whether to create the table in the database if none exists on startup", defaultValue = "true") - private boolean createTableIfNotExists = true; @Metadata(description = "The name of the table to use in the database", defaultValue = "CAMEL_MESSAGEPROCESSED") private String tableName; + @Metadata(description = "Whether to create the table in the database if none exists on startup", defaultValue = "true") + private boolean createTableIfNotExists = true; @Metadata(label = "advanced", description = "SQL query to use for checking if table exists") private String tableExistsString = DEFAULT_TABLE_EXISTS_STRING; diff --git a/components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/bean/TarAggregationStrategy.json b/components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/bean/TarAggregationStrategy.json index 87c8ffedc1f1f..f089769724c30 100644 --- a/components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/bean/TarAggregationStrategy.json +++ b/components/camel-tarfile/src/generated/resources/META-INF/services/org/apache/camel/bean/TarAggregationStrategy.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-tarfile", "version": "4.5.0-SNAPSHOT", - "properties": { "filePrefix": { "index": 0, "kind": "property", "displayName": "File Prefix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the prefix that will be used when creating the TAR filename." }, "fileSuffix": { "index": 1, "kind": "property", "displayName": "File Suffix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "tar", "description": "Sets the suffix that will be used when creating the TAR filename." }, "parentDir": { "index": 2, "kind": "property", "displayName": "Parent Dir", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the parent directory to use for writing temporary files" }, "preserveFolderStructure": { "index": 3, "kind": "property", "displayName": "Preserve Folder Structure", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "If the incoming message is from a file, then the folder structure of said file can be preserved" }, "useFilenameHeader": { "index": 4, "kind": "property", "displayName": "Use Filename Header", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use CamelFileName header for the filename instead of using unique message id" } } + "properties": { "filePrefix": { "index": 0, "kind": "property", "displayName": "File Prefix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the prefix that will be used when creating the TAR filename." }, "fileSuffix": { "index": 1, "kind": "property", "displayName": "File Suffix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "tar", "description": "Sets the suffix that will be used when creating the TAR filename." }, "preserveFolderStructure": { "index": 2, "kind": "property", "displayName": "Preserve Folder Structure", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "If the incoming message is from a file, then the folder structure of said file can be preserved" }, "useFilenameHeader": { "index": 3, "kind": "property", "displayName": "Use Filename Header", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use CamelFileName header for the filename instead of using unique message id" }, "parentDir": { "index": 4, "kind": "property", "displayName": "Parent Dir", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.tarfile.TarAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the parent directory to use for writing temporary files" } } } } diff --git a/components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltSaxonAggregationStrategy.json b/components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltSaxonAggregationStrategy.json index 37ce9cd74513b..81e5ceb406cec 100644 --- a/components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltSaxonAggregationStrategy.json +++ b/components/camel-xslt-saxon/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltSaxonAggregationStrategy.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-xslt-saxon", "version": "4.5.0-SNAPSHOT", - "properties": { "output": { "index": 0, "kind": "property", "displayName": "Output", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "enum": [ "string", "bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "string", "description": "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime." }, "propertyName": { "index": 1, "kind": "property", "displayName": "Property Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "new-exchange", "description": "The exchange property name that contains the XML payloads as an input" }, "transformerFactoryClass": { "index": 2, "kind": "property", "displayName": "Transformer Factory Class", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom XSLT transformer factory, specified as a FQN class name" }, "xslFile": { "index": 3, "kind": "property", "displayName": "Xsl File", "required": true, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the XSL transformation file to use" } } + "properties": { "xslFile": { "index": 0, "kind": "property", "displayName": "Xsl File", "required": true, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the XSL transformation file to use" }, "propertyName": { "index": 1, "kind": "property", "displayName": "Property Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "new-exchange", "description": "The exchange property name that contains the XML payloads as an input" }, "output": { "index": 2, "kind": "property", "displayName": "Output", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "enum": [ "string", "bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "string", "description": "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime." }, "transformerFactoryClass": { "index": 3, "kind": "property", "displayName": "Transformer Factory Class", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom XSLT transformer factory, specified as a FQN class name" } } } } diff --git a/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategy.java b/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategy.java index e926fdff3ddf1..336881ce56b54 100644 --- a/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategy.java +++ b/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategy.java @@ -37,15 +37,15 @@ public class XsltSaxonAggregationStrategy extends XsltAggregationStrategy { private String xslFile; @Metadata(description = "The exchange property name that contains the XML payloads as an input", defaultValue = "new-exchange") private String propertyName; - private TransformerFactory transformerFactory; - @Metadata(label = "advanced", description = "To use a custom XSLT transformer factory, specified as a FQN class name") - private String transformerFactoryClass; @Metadata(defaultValue = "string", enums = "string,bytes,DOM,file", description = "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three" + " options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify" + " the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any" + " paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime.") private XsltOutput output = XsltOutput.string; + @Metadata(label = "advanced", description = "To use a custom XSLT transformer factory, specified as a FQN class name") + private String transformerFactoryClass; + private TransformerFactory transformerFactory; public XsltSaxonAggregationStrategy(String xslFileLocation) { super(xslFileLocation); diff --git a/components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltAggregationStrategy.json b/components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltAggregationStrategy.json index d9b3686ed7071..8728d9f2a376a 100644 --- a/components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltAggregationStrategy.json +++ b/components/camel-xslt/src/generated/resources/META-INF/services/org/apache/camel/bean/XsltAggregationStrategy.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-xslt", "version": "4.5.0-SNAPSHOT", - "properties": { "output": { "index": 0, "kind": "property", "displayName": "Output", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "enum": [ "string", "bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "string", "description": "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime." }, "propertyName": { "index": 1, "kind": "property", "displayName": "Property Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "new-exchange", "description": "The exchange property name that contains the XML payloads as an input" }, "transformerFactoryClass": { "index": 2, "kind": "property", "displayName": "Transformer Factory Class", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom XSLT transformer factory, specified as a FQN class name" }, "xslFile": { "index": 3, "kind": "property", "displayName": "Xsl File", "required": true, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the XSL transformation file to use" } } + "properties": { "xslFile": { "index": 0, "kind": "property", "displayName": "Xsl File", "required": true, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "The name of the XSL transformation file to use" }, "propertyName": { "index": 1, "kind": "property", "displayName": "Property Name", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "new-exchange", "description": "The exchange property name that contains the XML payloads as an input" }, "transformerFactoryClass": { "index": 2, "kind": "property", "displayName": "Transformer Factory Class", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom XSLT transformer factory, specified as a FQN class name" }, "output": { "index": 3, "kind": "property", "displayName": "Output", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltAggregationStrategy", "enum": [ "string", "bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "string", "description": "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime." } } } } diff --git a/components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/bean/ZipAggregationStrategy.json b/components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/bean/ZipAggregationStrategy.json index edd5aa7271d64..f7b20124fa49d 100644 --- a/components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/bean/ZipAggregationStrategy.json +++ b/components/camel-zipfile/src/generated/resources/META-INF/services/org/apache/camel/bean/ZipAggregationStrategy.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-zipfile", "version": "4.5.0-SNAPSHOT", - "properties": { "filePrefix": { "index": 0, "kind": "property", "displayName": "File Prefix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the prefix that will be used when creating the ZIP filename." }, "fileSuffix": { "index": 1, "kind": "property", "displayName": "File Suffix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "zip", "description": "Sets the suffix that will be used when creating the ZIP filename." }, "parentDir": { "index": 2, "kind": "property", "displayName": "Parent Dir", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the parent directory to use for writing temporary files" }, "preserveFolderStructure": { "index": 3, "kind": "property", "displayName": "Preserve Folder Structure", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "If the incoming message is from a file, then the folder structure of said file can be preserved" }, "useFilenameHeader": { "index": 4, "kind": "property", "displayName": "Use Filename Header", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use CamelFileName header for the filename instead of using unique message id" }, "useTempFile": { "index": 5, "kind": "property", "displayName": "Use Temp File", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use temporary files for zip manipulations instead of memory." } } + "properties": { "filePrefix": { "index": 0, "kind": "property", "displayName": "File Prefix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the prefix that will be used when creating the ZIP filename." }, "fileSuffix": { "index": 1, "kind": "property", "displayName": "File Suffix", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "zip", "description": "Sets the suffix that will be used when creating the ZIP filename." }, "preserveFolderStructure": { "index": 2, "kind": "property", "displayName": "Preserve Folder Structure", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "If the incoming message is from a file, then the folder structure of said file can be preserved" }, "useFilenameHeader": { "index": 3, "kind": "property", "displayName": "Use Filename Header", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use CamelFileName header for the filename instead of using unique message id" }, "useTempFile": { "index": 4, "kind": "property", "displayName": "Use Temp File", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Whether to use temporary files for zip manipulations instead of memory." }, "parentDir": { "index": 5, "kind": "property", "displayName": "Parent Dir", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the parent directory to use for writing temporary files" } } } } diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json index bfe3e06376ad1..db72da32c2e2d 100644 --- a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/DefaultHeaderFilterStrategy.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-support", "version": "4.5.0-SNAPSHOT", - "properties": { "allowNullValues": { "index": 0, "kind": "property", "displayName": "Allow Null Values", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether to allow null values. By default a header is skipped if its value is null. Setting this to true will preserve the header." }, "caseInsensitive": { "index": 1, "kind": "property", "displayName": "Case Insensitive", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Sets the caseInsensitive property which is a boolean to determine whether header names should be case insensitive when checking it with the filter set. It does not affect filtering using regular expression pattern." }, "filterOnMatch": { "index": 2, "kind": "property", "displayName": "Filter On Match", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Sets what to do when a pattern or filter set is matched. When set to true, a match will filter out the header. This is the default value for backwards compatibility. When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be filtered (skipped)." }, "inFilter": { "index": 3, "kind": "property", "displayName": "In Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the in direction filter set. The in direction is referred to copying headers from an external message to a Camel message. Multiple patterns can be separated by comma" }, "lowerCase": { "index": 4, "kind": "property", "displayName": "Lower Case", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether header names should be converted to lower case before checking it with the filter Set. It does not affect filtering using regular expression pattern." }, "outFilter": { "index": 5, "kind": "property", "displayName": "Out Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the out direction filter set. The out direction is referred to copying headers from a Camel message to an external message. Multiple patterns can be separated by comma" } } + "properties": { "inFilter": { "index": 0, "kind": "property", "displayName": "In Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the in direction filter set. The in direction is referred to copying headers from an external message to a Camel message. Multiple patterns can be separated by comma" }, "outFilter": { "index": 1, "kind": "property", "displayName": "Out Filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the out direction filter set. The out direction is referred to copying headers from a Camel message to an external message. Multiple patterns can be separated by comma" }, "lowerCase": { "index": 2, "kind": "property", "displayName": "Lower Case", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether header names should be converted to lower case before checking it with the filter Set. It does not affect filtering using regular expression pattern." }, "allowNullValues": { "index": 3, "kind": "property", "displayName": "Allow Null Values", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Whether to allow null values. By default a header is skipped if its value is null. Setting this to true will preserve the header." }, "caseInsensitive": { "index": 4, "kind": "property", "displayName": "Case Insensitive", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "false", "description": "Sets the caseInsensitive property which is a boolean to determine whether header names should be case insensitive when checking it with the filter set. It does not affect filtering using regular expression pattern." }, "filterOnMatch": { "index": 5, "kind": "property", "displayName": "Filter On Match", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.support.DefaultHeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Sets what to do when a pattern or filter set is matched. When set to true, a match will filter out the header. This is the default value for backwards compatibility. When set to false, the pattern or filter will indicate that the header must be kept; anything not matched will be filtered (skipped)." } } } } diff --git a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json index ca6dbee7ea321..b90fd10b9f59f 100644 --- a/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json +++ b/core/camel-support/src/generated/resources/META-INF/services/org/apache/camel/bean/FileIdempotentRepository.json @@ -10,7 +10,7 @@ "groupId": "org.apache.camel", "artifactId": "camel-support", "version": "4.5.0-SNAPSHOT", - "properties": { "dropOldestFileStore": { "index": 0, "kind": "property", "displayName": "Drop Oldest File Store", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk space to allow room for new entries." }, "fileStore": { "index": 1, "kind": "property", "displayName": "File Store", "required": true, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "File name of the repository (incl directory)" }, "maxFileStoreSize": { "index": 2, "kind": "property", "displayName": "Max File Store Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "32768000", "description": "The maximum file size for the file store in bytes. The default value is 32mb" } } + "properties": { "fileStore": { "index": 0, "kind": "property", "displayName": "File Store", "required": true, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "File name of the repository (incl directory)" }, "maxFileStoreSize": { "index": 1, "kind": "property", "displayName": "Max File Store Size", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "32768000", "description": "The maximum file size for the file store in bytes. The default value is 32mb" }, "dropOldestFileStore": { "index": 2, "kind": "property", "displayName": "Drop Oldest File Store", "required": false, "type": "object", "javaType": "org.apache.camel.support.processor.idempotent.FileIdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the number of oldest entries to drop from the file store when the maximum capacity is hit to reduce disk space to allow room for new entries." } } } } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java index 33d500bb1e690..fb5594cf7adb7 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GeneratePojoBeanMojo.java @@ -233,8 +233,12 @@ private void extractFields(ClassInfo ci, BeanPojoModel model) { Metadata ai = fi.getAnnotation(Metadata.class); o.setKind("property"); o.setName(fi.getName()); - o.setLabel(ai.label()); - o.setDefaultValue(ai.defaultValue()); + if (!ai.label().isEmpty()) { + o.setLabel(ai.label()); + } + if (!ai.defaultValue().isEmpty()) { + o.setDefaultValue(ai.defaultValue()); + } o.setRequired(ai.required()); String displayName = ai.displayName(); if (displayName.isEmpty()) { @@ -242,6 +246,8 @@ private void extractFields(ClassInfo ci, BeanPojoModel model) { } o.setDisplayName(displayName); o.setDeprecated(fi.getAnnotation(Deprecated.class) != null); + o.setAutowired(ai.autowired()); + o.setSecret(ai.secret()); String javaType = ai.javaType(); if (javaType.isEmpty()) { javaType = ci.name().toString(); From 8ceef02ba1fb255a76b316e44ae77794a111bdf1 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Wed, 20 Mar 2024 09:42:53 +0100 Subject: [PATCH 45/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../CaffeineAggregationRepository.java | 2 +- .../CaffeineIdempotentRepository.java | 4 +-- ...ssandraIdempotentRepositoryConfigurer.java | 4 +-- .../CassandraAggregationRepository.java | 32 +++++++++++-------- .../CassandraIdempotentRepository.java | 21 ++++++------ .../EhcacheIdempotentRepository.java | 4 +-- ...hsearchBulkRequestAggregationStrategy.java | 4 +-- .../HazelcastIdempotentRepository.java | 2 +- .../JCacheIdempotentRepository.java | 4 +-- .../kafka/KafkaIdempotentRepository.java | 8 ++--- .../MongoDbIdempotentRepository.java | 4 +-- ...nsearchBulkRequestAggregationStrategy.java | 4 +-- .../SpringRedisIdempotentRepository.java | 4 +-- .../jdbc/JdbcAggregationRepository.java | 4 +-- .../tarfile/TarAggregationStrategy.java | 6 ++-- .../saxon/XsltSaxonAggregationStrategy.java | 19 +++++------ .../xslt/XsltAggregationStrategy.java | 4 +-- .../zipfile/ZipAggregationStrategy.java | 6 ++-- .../org/apache/camel/CatalogCamelContext.java | 3 +- .../spi/RecoverableAggregationRepository.java | 8 ++--- .../GroupedBodyAggregationStrategy.java | 8 ++--- .../GroupedExchangeAggregationStrategy.java | 8 ++--- .../GroupedMessageAggregationStrategy.java | 8 ++--- .../MemoryAggregationRepository.java | 4 +-- .../aggregate/StringAggregationStrategy.java | 6 ++-- .../UseLatestAggregationStrategy.java | 8 ++--- .../UseOriginalAggregationStrategy.java | 8 ++--- .../support/DefaultHeaderFilterStrategy.java | 4 +-- .../idempotent/FileIdempotentRepository.java | 4 +-- .../MemoryIdempotentRepository.java | 2 +- 30 files changed, 107 insertions(+), 100 deletions(-) diff --git a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java index 549334cdf530f..3c256a53b1197 100644 --- a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java +++ b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/aggregate/CaffeineAggregationRepository.java @@ -57,7 +57,7 @@ public class CaffeineAggregationRepository extends ServiceSupport implements Rec defaultValue = "3") private int maximumRedeliveries = 3; @Metadata(label = "advanced", - description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") + description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") private boolean allowSerializedHeaders; public CamelContext getCamelContext() { diff --git a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java index b0ef74c69ee29..46fba2c3155fb 100644 --- a/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java +++ b/components/camel-caffeine/src/main/java/org/apache/camel/component/caffeine/processor/idempotent/CaffeineIdempotentRepository.java @@ -27,8 +27,8 @@ import org.apache.camel.support.service.ServiceSupport; @Metadata(label = "bean", - description = "Idempotent repository that uses Caffiene cache to store message ids.", - annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) + description = "Idempotent repository that uses Caffiene cache to store message ids.", + annotations = { "interfaceName=org.apache.camel.spi.IdempotentRepository" }) @Configurer(metadataOnly = true) @ManagedResource(description = "Caffeine based message id repository") public class CaffeineIdempotentRepository extends ServiceSupport implements IdempotentRepository { diff --git a/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java b/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java index 96bc8b2f7602f..a775cce13b56c 100644 --- a/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java +++ b/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java @@ -22,7 +22,7 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository target = (org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository) obj; switch (ignoreCase ? name.toLowerCase() : name) { case "pkcolumns": - case "PKColumns": target.setPKColumns(property(camelContext, java.lang.String[].class, value)); return true; + case "PKColumns": target.setPKColumns(property(camelContext, java.lang.String.class, value)); return true; case "prefixpkvalues": case "PrefixPKValues": target.setPrefixPKValues(property(camelContext, java.lang.String[].class, value)); return true; case "readconsistencylevel": @@ -43,7 +43,7 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj public Class getOptionType(String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { case "pkcolumns": - case "PKColumns": return java.lang.String[].class; + case "PKColumns": return java.lang.String.class; case "prefixpkvalues": case "PrefixPKValues": return java.lang.String[].class; case "readconsistencylevel": diff --git a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/CassandraAggregationRepository.java b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/CassandraAggregationRepository.java index 5ba5f34bd2c94..2c0febfac9545 100644 --- a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/CassandraAggregationRepository.java +++ b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/CassandraAggregationRepository.java @@ -56,9 +56,9 @@ * queuing use cases See: http://www.datastax.com/dev/blog/cassandra-anti-patterns-queues-and-queue-like-datasets */ @Metadata(label = "bean", - description = "Aggregation repository that uses Cassandra table to store exchanges." - + " Advice: use LeveledCompaction for this table and tune read/write consistency levels.", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "Aggregation repository that uses Cassandra table to store exchanges." + + " Advice: use LeveledCompaction for this table and tune read/write consistency levels.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) public class CassandraAggregationRepository extends ServiceSupport implements RecoverableAggregationRepository { @@ -74,17 +74,20 @@ public class CassandraAggregationRepository extends ServiceSupport implements Re private String exchangeIdColumn = "EXCHANGE_ID"; @Metadata(description = "Column name for Exchange", defaultValue = "EXCHANGE") private String exchangeColumn = "EXCHANGE"; - @Metadata(description = "Values used as primary key prefix. Multiple values can be separated by comma.", displayName = - "Prefix Primary Key Values", javaType = "java.lang.String") + @Metadata(description = "Values used as primary key prefix. Multiple values can be separated by comma.", + displayName = "Prefix Primary Key Values", javaType = "java.lang.String") private Object[] prefixPKValues = new Object[0]; - @Metadata(description = "Primary key columns. Multiple values can be separated by comma.", displayName = "Primary Key Columns", - javaType = "java.lang.String", defaultValue = "KEY") - private String[] pkColumns = {"KEY"}; + @Metadata(description = "Primary key columns. Multiple values can be separated by comma.", + displayName = "Primary Key Columns", + javaType = "java.lang.String", defaultValue = "KEY") + private String[] pkColumns = { "KEY" }; @Metadata(description = "Time to live in seconds used for inserts", displayName = "Time to Live") private Integer ttl; - @Metadata(description = "Write consistency level", enums = "ANY,ONE,TWO,THREE,QUORUM,ALL,LOCAL_ONE,LOCAL_QUORUM,EACH_QUORUM,SERIAL,LOCAL_SERIAL") + @Metadata(description = "Write consistency level", + enums = "ANY,ONE,TWO,THREE,QUORUM,ALL,LOCAL_ONE,LOCAL_QUORUM,EACH_QUORUM,SERIAL,LOCAL_SERIAL") private ConsistencyLevel writeConsistencyLevel; - @Metadata(description = "Read consistency level", enums = "ANY,ONE,TWO,THREE,QUORUM,ALL,LOCAL_ONE,LOCAL_QUORUM,EACH_QUORUM,SERIAL,LOCAL_SERIAL") + @Metadata(description = "Read consistency level", + enums = "ANY,ONE,TWO,THREE,QUORUM,ALL,LOCAL_ONE,LOCAL_QUORUM,EACH_QUORUM,SERIAL,LOCAL_SERIAL") private ConsistencyLevel readConsistencyLevel; private PreparedStatement insertStatement; @@ -106,9 +109,10 @@ public class CassandraAggregationRepository extends ServiceSupport implements Re @Metadata(description = "Sets an optional dead letter channel which exhausted recovered Exchange should be send to.") private String deadLetterUri; @Metadata(description = "Sets an optional limit of the number of redelivery attempt of recovered Exchange should be attempted, before its exhausted." - + " When this limit is hit, then the Exchange is moved to the dead letter channel.") + + " When this limit is hit, then the Exchange is moved to the dead letter channel.") private int maximumRedeliveries; - @Metadata(label = "advanced", description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") + @Metadata(label = "advanced", + description = "Whether headers on the Exchange that are Java objects and Serializable should be included and saved to the repository") private boolean allowSerializedHeaders; /** @@ -180,7 +184,7 @@ public Exchange add(CamelContext camelContext, String key, Exchange exchange) { LOGGER.debug("Inserting key {} exchange {}", idValues, exchange); try { ByteBuffer marshalledExchange = exchangeCodec.marshallExchange(exchange, allowSerializedHeaders); - Object[] cqlParams = concat(idValues, new Object[]{exchange.getExchangeId(), marshalledExchange}); + Object[] cqlParams = concat(idValues, new Object[] { exchange.getExchangeId(), marshalledExchange }); getSession().execute(insertStatement.bind(cqlParams)); return exchange; } catch (IOException iOException) { @@ -270,7 +274,7 @@ public void remove(CamelContext camelContext, String key, Exchange exchange) { // ------------------------------------------------------------------------- private void initSelectKeyIdStatement() { - Select select = generateSelect(table, new String[]{getKeyColumn(), exchangeIdColumn}, // Key + Select select = generateSelect(table, new String[] { getKeyColumn(), exchangeIdColumn }, // Key // + // Exchange // Id diff --git a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java index 95424a23cc45f..c66d4d7a8dd4f 100644 --- a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java +++ b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepository.java @@ -48,9 +48,9 @@ * queuing use cases See http://www.datastax.com/dev/blog/cassandra-anti-patterns-queues-and-queue-like-datasets */ @Metadata(label = "bean", - description = "Idempotent repository that uses Cassandra table to store message ids." - + " Advice: use LeveledCompaction for this table and tune read/write consistency levels.", - annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) + description = "Idempotent repository that uses Cassandra table to store message ids." + + " Advice: use LeveledCompaction for this table and tune read/write consistency levels.", + annotations = { "interfaceName=org.apache.camel.spi.IdempotentRepository" }) @Configurer(metadataOnly = true) public class CassandraIdempotentRepository extends ServiceSupport implements IdempotentRepository { @@ -60,17 +60,20 @@ public class CassandraIdempotentRepository extends ServiceSupport implements Ide private CassandraSessionHolder session; @Metadata(description = "The table name for storing the data", defaultValue = "CAMEL_IDEMPOTENT") private String table = "CAMEL_IDEMPOTENT"; - @Metadata(description = "Values used as primary key prefix. Multiple values can be separated by comma.", displayName = - "Prefix Primary Key Values", javaType = "java.lang.String") + @Metadata(description = "Values used as primary key prefix. Multiple values can be separated by comma.", + displayName = "Prefix Primary Key Values", javaType = "java.lang.String") private String[] prefixPKValues = new String[0]; - @Metadata(description = "Primary key columns. Multiple values can be separated by comma.", displayName = "Primary Key Columns", - javaType = "java.lang.String", defaultValue = "KEY") + @Metadata(description = "Primary key columns. Multiple values can be separated by comma.", + displayName = "Primary Key Columns", + javaType = "java.lang.String", defaultValue = "KEY") private String[] pkColumns = { "KEY" }; @Metadata(description = "Time to live in seconds used for inserts", displayName = "Time to Live") private Integer ttl; - @Metadata(description = "Write consistency level", enums = "ANY,ONE,TWO,THREE,QUORUM,ALL,LOCAL_ONE,LOCAL_QUORUM,EACH_QUORUM,SERIAL,LOCAL_SERIAL") + @Metadata(description = "Write consistency level", + enums = "ANY,ONE,TWO,THREE,QUORUM,ALL,LOCAL_ONE,LOCAL_QUORUM,EACH_QUORUM,SERIAL,LOCAL_SERIAL") private ConsistencyLevel writeConsistencyLevel; - @Metadata(description = "Read consistency level", enums = "ANY,ONE,TWO,THREE,QUORUM,ALL,LOCAL_ONE,LOCAL_QUORUM,EACH_QUORUM,SERIAL,LOCAL_SERIAL") + @Metadata(description = "Read consistency level", + enums = "ANY,ONE,TWO,THREE,QUORUM,ALL,LOCAL_ONE,LOCAL_QUORUM,EACH_QUORUM,SERIAL,LOCAL_SERIAL") private ConsistencyLevel readConsistencyLevel; private PreparedStatement insertStatement; diff --git a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java index ee54857ebd622..576e339a444a6 100644 --- a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java +++ b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/processor/idempotent/EhcacheIdempotentRepository.java @@ -28,8 +28,8 @@ import org.ehcache.CacheManager; @Metadata(label = "bean", - description = "Idempotent repository that uses EHCache cache to store message ids.", - annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) + description = "Idempotent repository that uses EHCache cache to store message ids.", + annotations = { "interfaceName=org.apache.camel.spi.IdempotentRepository" }) @Configurer(metadataOnly = true) @ManagedResource(description = "EHCache based message id repository") public class EhcacheIdempotentRepository extends ServiceSupport implements IdempotentRepository { diff --git a/components/camel-elasticsearch/src/main/java/org/apache/camel/component/es/aggregation/ElastichsearchBulkRequestAggregationStrategy.java b/components/camel-elasticsearch/src/main/java/org/apache/camel/component/es/aggregation/ElastichsearchBulkRequestAggregationStrategy.java index 1b50d2e61d9d7..9e2a3d8f462cd 100644 --- a/components/camel-elasticsearch/src/main/java/org/apache/camel/component/es/aggregation/ElastichsearchBulkRequestAggregationStrategy.java +++ b/components/camel-elasticsearch/src/main/java/org/apache/camel/component/es/aggregation/ElastichsearchBulkRequestAggregationStrategy.java @@ -27,8 +27,8 @@ import org.apache.camel.spi.Metadata; @Metadata(label = "bean", - description = "Aggregates two ElasticSearch BulkOperation into a single BulkRequest", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "Aggregates two ElasticSearch BulkOperation into a single BulkRequest", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) public class ElastichsearchBulkRequestAggregationStrategy implements AggregationStrategy { diff --git a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepository.java b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepository.java index 4d73b1c85b127..2a08d74219f66 100644 --- a/components/camel-hazelcast/src/main/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepository.java +++ b/components/camel-hazelcast/src/main/java/org/apache/camel/processor/idempotent/hazelcast/HazelcastIdempotentRepository.java @@ -29,7 +29,7 @@ @Metadata(label = "bean", description = "Idempotent repository that uses Hazelcast cache to store message ids.", - annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) + annotations = { "interfaceName=org.apache.camel.spi.IdempotentRepository" }) @Configurer(metadataOnly = true) public class HazelcastIdempotentRepository extends ServiceSupport implements IdempotentRepository { diff --git a/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepository.java b/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepository.java index dda5823e50ccb..aef0069230bf5 100644 --- a/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepository.java +++ b/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepository.java @@ -33,8 +33,8 @@ import org.apache.camel.util.ObjectHelper; @Metadata(label = "bean", - description = "Idempotent repository that uses JCache to store message ids.", - annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) + description = "Idempotent repository that uses JCache to store message ids.", + annotations = { "interfaceName=org.apache.camel.spi.IdempotentRepository" }) @Configurer(metadataOnly = true) @ManagedResource(description = "JCache based message id repository") public class JCacheIdempotentRepository extends ServiceSupport implements CamelContextAware, IdempotentRepository { diff --git a/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java b/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java index 7d8581f144ebc..b5ce20da23336 100644 --- a/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java +++ b/components/camel-kafka/src/main/java/org/apache/camel/processor/idempotent/kafka/KafkaIdempotentRepository.java @@ -67,10 +67,10 @@ * CamelContext aware. */ @Metadata(label = "bean", - description = "Idempotent repository that uses Kafka to store message ids. Uses a local cache of previously seen Message IDs." - + " The topic used must be unique per logical repository (i.e. two routes de-duplicate using different repositories, and different topics)" - + " On startup, the instance consumes the full content of the topic, rebuilding the cache to the latest state.", - annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) + description = "Idempotent repository that uses Kafka to store message ids. Uses a local cache of previously seen Message IDs." + + " The topic used must be unique per logical repository (i.e. two routes de-duplicate using different repositories, and different topics)" + + " On startup, the instance consumes the full content of the topic, rebuilding the cache to the latest state.", + annotations = { "interfaceName=org.apache.camel.spi.IdempotentRepository" }) @Configurer(metadataOnly = true) @ManagedResource(description = "Kafka IdempotentRepository") public class KafkaIdempotentRepository extends ServiceSupport implements IdempotentRepository, CamelContextAware { diff --git a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java index 9221ffd244f61..7056c9b2cc523 100644 --- a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java +++ b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/processor/idempotent/MongoDbIdempotentRepository.java @@ -34,8 +34,8 @@ import static org.apache.camel.component.mongodb.MongoDbConstants.MONGO_ID; @Metadata(label = "bean", - description = "Idempotent repository that uses MongoDB to store message ids.", - annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) + description = "Idempotent repository that uses MongoDB to store message ids.", + annotations = { "interfaceName=org.apache.camel.spi.IdempotentRepository" }) @Configurer(metadataOnly = true) @ManagedResource(description = "MongoDB based message id repository") public class MongoDbIdempotentRepository extends ServiceSupport implements IdempotentRepository { diff --git a/components/camel-opensearch/src/main/java/org/apache/camel/component/opensearch/aggregation/OpensearchBulkRequestAggregationStrategy.java b/components/camel-opensearch/src/main/java/org/apache/camel/component/opensearch/aggregation/OpensearchBulkRequestAggregationStrategy.java index fc07ef99e24f3..c475792dde5c3 100644 --- a/components/camel-opensearch/src/main/java/org/apache/camel/component/opensearch/aggregation/OpensearchBulkRequestAggregationStrategy.java +++ b/components/camel-opensearch/src/main/java/org/apache/camel/component/opensearch/aggregation/OpensearchBulkRequestAggregationStrategy.java @@ -30,8 +30,8 @@ * Aggregates two {@link BulkOperation}s into a single {@link BulkRequest}. */ @Metadata(label = "bean", - description = "Aggregates two OpenSearch BulkOperation into a single BulkRequest", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "Aggregates two OpenSearch BulkOperation into a single BulkRequest", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) public class OpensearchBulkRequestAggregationStrategy implements AggregationStrategy { diff --git a/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepository.java b/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepository.java index fd4dbb0c828a7..361e1b71943d7 100644 --- a/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepository.java +++ b/components/camel-spring-redis/src/main/java/org/apache/camel/component/redis/processor/idempotent/SpringRedisIdempotentRepository.java @@ -28,8 +28,8 @@ import org.springframework.data.redis.core.SetOperations; @Metadata(label = "bean", - description = "Idempotent repository that uses Redis to store message ids.", - annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) + description = "Idempotent repository that uses Redis to store message ids.", + annotations = { "interfaceName=org.apache.camel.spi.IdempotentRepository" }) @Configurer(metadataOnly = true) @ManagedResource(description = "Spring Redis based message id repository") public class SpringRedisIdempotentRepository extends ServiceSupport implements IdempotentRepository { diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java index 67f207119dbf2..3c6d2725c9fb5 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java +++ b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregationRepository.java @@ -94,8 +94,8 @@ public class JdbcAggregationRepository extends ServiceSupport @Metadata(description = "The name of the repository.") private String repositoryName; @Metadata(javaType = "java.lang.String", - description = "Allows to store headers as String which is human readable. By default this option is disabled, storing the headers in binary format." - + " Multiple header names can be separated by comma.") + description = "Allows to store headers as String which is human readable. By default this option is disabled, storing the headers in binary format." + + " Multiple header names can be separated by comma.") private List headersToStoreAsText; @Metadata(description = "Whether to store the message body as String which is human readable. By default this option is false storing the body in binary format.") private boolean storeBodyAsText; diff --git a/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java b/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java index 191219bc5ddee..2b671b04b69f4 100644 --- a/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java +++ b/components/camel-tarfile/src/main/java/org/apache/camel/processor/aggregate/tarfile/TarAggregationStrategy.java @@ -62,9 +62,9 @@ *

*/ @Metadata(label = "bean", - description = "AggregationStrategy to combine together incoming messages into a tar file." - + " Please note that this aggregation strategy requires eager completion check to work properly.", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "AggregationStrategy to combine together incoming messages into a tar file." + + " Please note that this aggregation strategy requires eager completion check to work properly.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) public class TarAggregationStrategy implements AggregationStrategy { diff --git a/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategy.java b/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategy.java index 336881ce56b54..cf86c3d4b0104 100644 --- a/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategy.java +++ b/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonAggregationStrategy.java @@ -16,6 +16,8 @@ */ package org.apache.camel.component.xslt.saxon; +import javax.xml.transform.TransformerFactory; + import net.sf.saxon.TransformerFactoryImpl; import org.apache.camel.component.xslt.XsltAggregationStrategy; import org.apache.camel.component.xslt.XsltBuilder; @@ -23,11 +25,9 @@ import org.apache.camel.spi.Configurer; import org.apache.camel.spi.Metadata; -import javax.xml.transform.TransformerFactory; - @Metadata(label = "bean", - description = "The XSLT Aggregation Strategy enables you to use XSL stylesheets to aggregate messages (uses Saxon).", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "The XSLT Aggregation Strategy enables you to use XSL stylesheets to aggregate messages (uses Saxon).", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) public class XsltSaxonAggregationStrategy extends XsltAggregationStrategy { @@ -35,13 +35,14 @@ public class XsltSaxonAggregationStrategy extends XsltAggregationStrategy { @Metadata(description = "The name of the XSL transformation file to use", required = true) private String xslFile; - @Metadata(description = "The exchange property name that contains the XML payloads as an input", defaultValue = "new-exchange") + @Metadata(description = "The exchange property name that contains the XML payloads as an input", + defaultValue = "new-exchange") private String propertyName; @Metadata(defaultValue = "string", enums = "string,bytes,DOM,file", - description = "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three" - + " options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify" - + " the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any" - + " paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime.") + description = "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three" + + " options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify" + + " the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any" + + " paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime.") private XsltOutput output = XsltOutput.string; @Metadata(label = "advanced", description = "To use a custom XSLT transformer factory, specified as a FQN class name") private String transformerFactoryClass; diff --git a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltAggregationStrategy.java b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltAggregationStrategy.java index 277c9352139f6..d6e89b8c49748 100644 --- a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltAggregationStrategy.java +++ b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltAggregationStrategy.java @@ -63,8 +63,8 @@ * Some code bits have been copied from the {@link org.apache.camel.component.xslt.XsltEndpoint}. */ @Metadata(label = "bean", - description = "The XSLT Aggregation Strategy enables you to use XSL stylesheets to aggregate messages.", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "The XSLT Aggregation Strategy enables you to use XSL stylesheets to aggregate messages.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) public class XsltAggregationStrategy extends ServiceSupport implements AggregationStrategy, CamelContextAware { diff --git a/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java b/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java index 0efa7210c713c..b7f05a312d3c3 100644 --- a/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java +++ b/components/camel-zipfile/src/main/java/org/apache/camel/processor/aggregate/zipfile/ZipAggregationStrategy.java @@ -54,9 +54,9 @@ *

*/ @Metadata(label = "bean", - description = "AggregationStrategy to zip together incoming messages into a zip file." - + " Please note that this aggregation strategy requires eager completion check to work properly.", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "AggregationStrategy to zip together incoming messages into a zip file." + + " Please note that this aggregation strategy requires eager completion check to work properly.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) public class ZipAggregationStrategy implements AggregationStrategy { diff --git a/core/camel-api/src/main/java/org/apache/camel/CatalogCamelContext.java b/core/camel-api/src/main/java/org/apache/camel/CatalogCamelContext.java index 7295b820c4928..84063e4c6afac 100644 --- a/core/camel-api/src/main/java/org/apache/camel/CatalogCamelContext.java +++ b/core/camel-api/src/main/java/org/apache/camel/CatalogCamelContext.java @@ -71,8 +71,7 @@ public interface CatalogCamelContext extends CamelContext { String getEipParameterJsonSchema(String eipName) throws IOException; /** - * Returns the JSON schema representation of the pojo bean parameters for the - * given bean name. + * Returns the JSON schema representation of the pojo bean parameters for the given bean name. * * @return the json or null if the pojo bean does not exist */ diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/RecoverableAggregationRepository.java b/core/camel-api/src/main/java/org/apache/camel/spi/RecoverableAggregationRepository.java index bf62a801fb018..44bbafa34563a 100644 --- a/core/camel-api/src/main/java/org/apache/camel/spi/RecoverableAggregationRepository.java +++ b/core/camel-api/src/main/java/org/apache/camel/spi/RecoverableAggregationRepository.java @@ -48,9 +48,9 @@ public interface RecoverableAggregationRepository extends AggregationRepository /** * Sets the interval between recovery scans * - * @param interval the interval - * @param timeUnit the time unit - * @deprecated use setRecoveryInterval + * @param interval the interval + * @param timeUnit the time unit + * @deprecated use setRecoveryInterval */ @Deprecated void setRecoveryInterval(long interval, TimeUnit timeUnit); @@ -72,7 +72,7 @@ public interface RecoverableAggregationRepository extends AggregationRepository /** * Gets the interval between recovery scans in millis. * - * @return the interval in millis + * @return the interval in millis * @deprecated use getRecoveryInterval */ @Deprecated diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategy.java index 07fef2a03da6d..4576a5e4da29b 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedBodyAggregationStrategy.java @@ -30,10 +30,10 @@ * This aggregation strategy can used in combination with {@link org.apache.camel.processor.Splitter} to batch messages */ @Metadata(label = "bean", - description = "Aggregate body of input Message into a single combined Exchange holding all the aggregated bodies in a List" - + " of type Object as the message body. This aggregation strategy can be used in combination with" - + " Splitter to batch messages.", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "Aggregate body of input Message into a single combined Exchange holding all the aggregated bodies in a List" + + " of type Object as the message body. This aggregation strategy can be used in combination with" + + " Splitter to batch messages.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) public class GroupedBodyAggregationStrategy extends AbstractListAggregationStrategy { diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategy.java index 850529c394630..8ba5c0c5b9cc6 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedExchangeAggregationStrategy.java @@ -31,10 +31,10 @@ * Content Enricher EIP which is enrich or pollEnrich. */ @Metadata(label = "bean", - description = "Aggregate all Exchanges into a single combined Exchange holding all the aggregated exchanges in a List" - + " of Exchange as the message body. This aggregation strategy can be used in combination with" - + " Splitter to batch messages.", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "Aggregate all Exchanges into a single combined Exchange holding all the aggregated exchanges in a List" + + " of Exchange as the message body. This aggregation strategy can be used in combination with" + + " Splitter to batch messages.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) public class GroupedExchangeAggregationStrategy extends AbstractListAggregationStrategy { diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategy.java index 84cdac4d131c7..338cc5bda7b7b 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/GroupedMessageAggregationStrategy.java @@ -32,10 +32,10 @@ * messages */ @Metadata(label = "bean", - description = "Aggregate all Message into a single combined Exchange holding all the aggregated messages in a List" - + " of Message as the message body. This aggregation strategy can be used in combination with" - + " Splitter to batch messages.", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "Aggregate all Message into a single combined Exchange holding all the aggregated messages in a List" + + " of Message as the message body. This aggregation strategy can be used in combination with" + + " Splitter to batch messages.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) public class GroupedMessageAggregationStrategy extends AbstractListAggregationStrategy { diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java index 793830cce023c..118724bf8b4e8 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/MemoryAggregationRepository.java @@ -34,8 +34,8 @@ * Supports both optimistic locking and non-optimistic locking modes. Defaults to non-optimistic locking mode. */ @Metadata(label = "bean", - description = "A memory based AggregationRepository which stores Exchange in memory only.", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "A memory based AggregationRepository which stores Exchange in memory only.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) public class MemoryAggregationRepository extends ServiceSupport implements OptimisticLockingAggregationRepository { private final ConcurrentMap cache = new ConcurrentHashMap<>(); diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java index df33f8698f363..83dd161bd909c 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/StringAggregationStrategy.java @@ -31,9 +31,9 @@ * This aggregation strategy can used in combination with {@link org.apache.camel.processor.Splitter} to batch messages */ @Metadata(label = "bean", - description = "Aggregate result of pick expression into a single combined Exchange holding all the aggregated bodies in a" - + " String as the message body. This aggregation strategy can used in combination with Splitter to batch messages", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "Aggregate result of pick expression into a single combined Exchange holding all the aggregated bodies in a" + + " String as the message body. This aggregation strategy can used in combination with Splitter to batch messages", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) public class StringAggregationStrategy implements AggregationStrategy { diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java index ad46310ca5bfd..be388dad6a68e 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseLatestAggregationStrategy.java @@ -28,10 +28,10 @@ * that relevant, only the current price is. */ @Metadata(label = "bean", - description = "An AggregationStrategy which just uses the latest exchange which is useful for status messages where old" - + " status messages have no real value. Another example is things like market data prices, where old stock prices are not" - + " that relevant, only the current price is.", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "An AggregationStrategy which just uses the latest exchange which is useful for status messages where old" + + " status messages have no real value. Another example is things like market data prices, where old stock prices are not" + + " that relevant, only the current price is.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) public class UseLatestAggregationStrategy implements AggregationStrategy { diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategy.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategy.java index d29e564d1c986..1abb39047ce46 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategy.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/UseOriginalAggregationStrategy.java @@ -29,10 +29,10 @@ * @see org.apache.camel.processor.Splitter */ @Metadata(label = "bean", - description = "An AggregationStrategy which just uses the original exchange which can be needed when you want to preserve" - + " the original Exchange. For example when splitting an Exchange and then you may want to keep routing using the" - + " original Exchange.", - annotations = {"interfaceName=org.apache.camel.AggregationStrategy"}) + description = "An AggregationStrategy which just uses the original exchange which can be needed when you want to preserve" + + " the original Exchange. For example when splitting an Exchange and then you may want to keep routing using the" + + " original Exchange.", + annotations = { "interfaceName=org.apache.camel.AggregationStrategy" }) @Configurer(metadataOnly = true) public class UseOriginalAggregationStrategy implements AggregationStrategy { diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java index 4bf41c55e44fa..5570e4953dbb8 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultHeaderFilterStrategy.java @@ -37,8 +37,8 @@ * in camel-jms and camel-cxf components. */ @Metadata(label = "bean", - description = "The default header filtering strategy. Users can configure which headers is allowed or denied.", - annotations = {"interfaceName=org.apache.camel.spi.HeaderFilterStrategy"}) + description = "The default header filtering strategy. Users can configure which headers is allowed or denied.", + annotations = { "interfaceName=org.apache.camel.spi.HeaderFilterStrategy" }) @Configurer(metadataOnly = true) public class DefaultHeaderFilterStrategy implements HeaderFilterStrategy { diff --git a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java index a1e28d186f691..1737d23440d60 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/FileIdempotentRepository.java @@ -53,8 +53,8 @@ * file store and make room for newer entries. */ @Metadata(label = "bean", - description = "A file based IdempotentRepository.", - annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) + description = "A file based IdempotentRepository.", + annotations = { "interfaceName=org.apache.camel.spi.IdempotentRepository" }) @Configurer(metadataOnly = true) @ManagedResource(description = "File based idempotent repository") public class FileIdempotentRepository extends ServiceSupport implements IdempotentRepository { diff --git a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java index f85fc4b3fe06e..64ad2f7d7a7c3 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/processor/idempotent/MemoryIdempotentRepository.java @@ -35,7 +35,7 @@ */ @Metadata(label = "bean", description = "A memory based IdempotentRepository.", - annotations = {"interfaceName=org.apache.camel.spi.IdempotentRepository"}) + annotations = { "interfaceName=org.apache.camel.spi.IdempotentRepository" }) @Configurer(metadataOnly = true) @ManagedResource(description = "Memory based idempotent repository") public class MemoryIdempotentRepository extends ServiceSupport implements IdempotentRepository { From 285cbc96f668a1ff632fa481cf978659b9e06b98 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Wed, 20 Mar 2024 10:01:34 +0100 Subject: [PATCH 46/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../java/org/apache/camel/tooling/model/PojoBeanModel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/PojoBeanModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/PojoBeanModel.java index d99aae9bc1a37..f5610f6d22fdb 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/PojoBeanModel.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/PojoBeanModel.java @@ -36,8 +36,8 @@ public List getOptions() { } @Override - public String getKind() { - return "bean"; + public Kind getKind() { + return Kind.bean; } public static class PojoBeanOptionModel extends BaseOptionModel { From 078308bb5f485609153cddd8a5f1e51c8b189f78 Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Wed, 20 Mar 2024 10:46:35 +0100 Subject: [PATCH 47/47] CAMEL-17641: Generate json metadata for pojo beans in camel-core that end users can use such as AggregationStrategy implementations. And have that information in camel-catalog for tooling assistance. --- .../cassandra/CassandraIdempotentRepositoryConfigurer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java b/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java index a775cce13b56c..96bc8b2f7602f 100644 --- a/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java +++ b/components/camel-cassandraql/src/generated/java/org/apache/camel/processor/idempotent/cassandra/CassandraIdempotentRepositoryConfigurer.java @@ -22,7 +22,7 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository target = (org.apache.camel.processor.idempotent.cassandra.CassandraIdempotentRepository) obj; switch (ignoreCase ? name.toLowerCase() : name) { case "pkcolumns": - case "PKColumns": target.setPKColumns(property(camelContext, java.lang.String.class, value)); return true; + case "PKColumns": target.setPKColumns(property(camelContext, java.lang.String[].class, value)); return true; case "prefixpkvalues": case "PrefixPKValues": target.setPrefixPKValues(property(camelContext, java.lang.String[].class, value)); return true; case "readconsistencylevel": @@ -43,7 +43,7 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj public Class getOptionType(String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { case "pkcolumns": - case "PKColumns": return java.lang.String.class; + case "PKColumns": return java.lang.String[].class; case "prefixpkvalues": case "PrefixPKValues": return java.lang.String[].class; case "readconsistencylevel":