This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch CAMEL-13870 in repository https://gitbox.apache.org/repos/asf/camel.git
commit fd3d33b6c864599e44086724b3d53dd96bec5fc0 Author: Claus Ibsen <[email protected]> AuthorDate: Tue Aug 20 12:47:57 2019 +0200 CAMEL-13870: Fast property configuration of Camel endpoints. Work in progress. --- .../org/apache/camel/component/file/FileEndpoint.java | 4 ++-- .../camel/component/file/GenericFileEndpoint.java | 8 ++++++++ .../org/apache/camel/component/mock/MockEndpoint.java | 18 +++++++++++++++++- .../apache/camel/component/timer/TimerEndpoint.java | 16 ++++++++++------ .../org/apache/camel/support/DefaultComponent.java | 5 +++++ .../apache/camel/support/PropertyBindingSupport.java | 18 +++++++++++++++--- .../camel/tools/apt/EndpointAnnotationProcessor.java | 13 ++++++++----- .../tools/apt/EndpointPropertyConfigurerGenerator.java | 18 ++++-------------- 8 files changed, 69 insertions(+), 31 deletions(-) diff --git a/components/camel-file/src/main/java/org/apache/camel/component/file/FileEndpoint.java b/components/camel-file/src/main/java/org/apache/camel/component/file/FileEndpoint.java index e1a8ef2..29fe0a1 100644 --- a/components/camel-file/src/main/java/org/apache/camel/component/file/FileEndpoint.java +++ b/components/camel-file/src/main/java/org/apache/camel/component/file/FileEndpoint.java @@ -411,7 +411,7 @@ public class FileEndpoint extends GenericFileEndpoint<File> { * Specify the file permissions which is sent by the producer, the chmod value must be between 000 and 777; * If there is a leading digit like in 0755 we will ignore it. */ - public void setChmod(String chmod) throws Exception { + public void setChmod(String chmod) { if (ObjectHelper.isNotEmpty(chmod) && chmodPermissionsAreValid(chmod)) { this.chmod = chmod.trim(); } else { @@ -472,7 +472,7 @@ public class FileEndpoint extends GenericFileEndpoint<File> { * Specify the directory permissions used when the producer creates missing directories, the chmod value must be between 000 and 777; * If there is a leading digit like in 0755 we will ignore it. */ - public void setChmodDirectory(String chmodDirectory) throws Exception { + public void setChmodDirectory(String chmodDirectory) { if (ObjectHelper.isNotEmpty(chmodDirectory) && chmodPermissionsAreValid(chmodDirectory)) { this.chmodDirectory = chmodDirectory.trim(); } else { diff --git a/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java b/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java index 58aa43cf..09ef430 100644 --- a/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java +++ b/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java @@ -661,6 +661,10 @@ public abstract class GenericFileEndpoint<T> extends ScheduledPollEndpoint imple return idempotent != null; } + public Boolean getIdempotent() { + return idempotent; + } + /** * Option to use the Idempotent Consumer EIP pattern to let Camel skip already processed files. * Will by default use a memory based LRUCache that holds 1000 entries. If noop=true then idempotent will be enabled @@ -1003,6 +1007,10 @@ public abstract class GenericFileEndpoint<T> extends ScheduledPollEndpoint imple this.readLockRemoveOnCommit = readLockRemoveOnCommit; } + public int getReadLockIdempotentReleaseDelay() { + return readLockIdempotentReleaseDelay; + } + /** * Whether to delay the release task for a period of millis. * <p/> diff --git a/components/camel-mock/src/main/java/org/apache/camel/component/mock/MockEndpoint.java b/components/camel-mock/src/main/java/org/apache/camel/component/mock/MockEndpoint.java index 21dcad5..485b431 100644 --- a/components/camel-mock/src/main/java/org/apache/camel/component/mock/MockEndpoint.java +++ b/components/camel-mock/src/main/java/org/apache/camel/component/mock/MockEndpoint.java @@ -499,6 +499,10 @@ public class MockEndpoint extends DefaultEndpoint implements BrowsableEndpoint, setExpectedMessageCount(expectedCount); } + public long getAssertPeriod() { + return assertPeriod; + } + /** * Sets a grace period after which the mock endpoint will re-assert * to ensure the preliminary assertion is still valid. @@ -1293,6 +1297,10 @@ public class MockEndpoint extends DefaultEndpoint implements BrowsableEndpoint, this.resultWaitTime = resultWaitTime; } + public long getResultMinimumWaitTime() { + return resultMinimumWaitTime; + } + /** * Sets the minimum expected amount of time (in millis) the {@link #assertIsSatisfied()} will * wait on a latch until it is satisfied @@ -1363,6 +1371,10 @@ public class MockEndpoint extends DefaultEndpoint implements BrowsableEndpoint, this.reporter = reporter; } + public int getRetainFirst() { + return retainFirst; + } + /** * Specifies to only retain the first n'th number of received {@link Exchange}s. * <p/> @@ -1391,6 +1403,10 @@ public class MockEndpoint extends DefaultEndpoint implements BrowsableEndpoint, this.retainFirst = retainFirst; } + public int getRetainLast() { + return retainLast; + } + /** * Specifies to only retain the last n'th number of received {@link Exchange}s. * <p/> @@ -1419,7 +1435,7 @@ public class MockEndpoint extends DefaultEndpoint implements BrowsableEndpoint, this.retainLast = retainLast; } - public int isReportGroup() { + public int getReportGroup() { return reportGroup; } diff --git a/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerEndpoint.java b/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerEndpoint.java index 236dbb9..8cc57f8 100644 --- a/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerEndpoint.java +++ b/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerEndpoint.java @@ -225,12 +225,8 @@ public class TimerEndpoint extends DefaultEndpoint implements MultipleConsumersS this.pattern = pattern; } - public Timer getTimer(TimerConsumer consumer) { - if (timer != null) { - // use custom timer - return timer; - } - return getComponent().getTimer(consumer); + public Timer getTimer() { + return timer; } /** @@ -240,6 +236,14 @@ public class TimerEndpoint extends DefaultEndpoint implements MultipleConsumersS this.timer = timer; } + public Timer getTimer(TimerConsumer consumer) { + if (timer != null) { + // use custom timer + return timer; + } + return getComponent().getTimer(consumer); + } + public void removeTimer(TimerConsumer consumer) { if (timer == null) { // only remove timer if we are not using a custom timer diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java index 866f9a6..1b15a29 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java @@ -43,6 +43,7 @@ import org.apache.camel.spi.PropertyConfigurer; import org.apache.camel.spi.PropertyConfigurerAware; import org.apache.camel.support.service.ServiceSupport; import org.apache.camel.util.ObjectHelper; +import org.apache.camel.util.StringHelper; import org.apache.camel.util.URISupport; import org.apache.camel.util.UnsafeUriCharactersEncoder; import org.apache.camel.util.function.Suppliers; @@ -333,6 +334,10 @@ public abstract class DefaultComponent extends ServiceSupport implements Compone org.apache.camel.spi.annotations.Component ann = ObjectHelper.getAnnotation(this, org.apache.camel.spi.annotations.Component.class); if (ann != null) { String name = ann.value(); + // just grab first scheme name if the component has scheme alias (eg http,https) + if (name.contains(",")) { + name = StringHelper.before(name, ","); + } try { Optional<Class<?>> clazz = getCamelContext().getExtension(ExtendedCamelContext.class).getFactoryFinder(RESOURCE_PATH) .findOptionalClass(name + "-endpoint", null); diff --git a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java index 11ffbcc..4a43e24 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java @@ -33,6 +33,7 @@ import org.apache.camel.PropertyBindingException; import org.apache.camel.spi.PropertyConfigurer; import org.apache.camel.util.StringHelper; +import static org.apache.camel.support.EndpointHelper.isReferenceParameter; import static org.apache.camel.support.IntrospectionSupport.findSetterMethods; import static org.apache.camel.util.ObjectHelper.isNotEmpty; @@ -466,12 +467,23 @@ public final class PropertyBindingSupport { Object value = entry.getValue(); if (writeProperties.containsKey(key)) { - // TODO: reference - // TODO: o + // support reference parameters + if (value instanceof String) { + String text = (String) value; + if (isReferenceParameter(text)) { + if (text.startsWith("#bean:")) { + text = text.substring(6); + } else { + text = text.substring(1); + } + value = CamelContextHelper.mandatoryLookup(camelContext, text); + } + } + // TODO: that thing with boolean and from string value true|false writeProperties.get(key).accept(value); if (removeParameter) { - properties.remove(key); + iter.remove(); rc = true; } } diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java index 361bcef..ba3c1ff 100644 --- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java +++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java @@ -116,14 +116,14 @@ public class EndpointAnnotationProcessor extends AbstractCamelAnnotationProcesso String packageName = name.substring(0, name.lastIndexOf(".")); String fileName = alias + ".json"; processFile(processingEnv, packageName, fileName, - writer -> writeJSonSchemeDocumentation(writer, roundEnv, classElement, uriEndpoint, aliasTitle, alias, extendsAlias, label, schemes)); + writer -> writeJSonSchemeAndPropertyConfigurer(writer, roundEnv, classElement, uriEndpoint, aliasTitle, alias, extendsAlias, label, schemes)); } } } } - protected void writeJSonSchemeDocumentation(PrintWriter writer, RoundEnvironment roundEnv, TypeElement classElement, UriEndpoint uriEndpoint, - String title, String scheme, String extendsScheme, String label, String[] schemes) { + protected void writeJSonSchemeAndPropertyConfigurer(PrintWriter writer, RoundEnvironment roundEnv, TypeElement classElement, UriEndpoint uriEndpoint, + String title, String scheme, String extendsScheme, String label, String[] schemes) { // gather component information ComponentModel componentModel = findComponentProperties(roundEnv, uriEndpoint, classElement, title, scheme, extendsScheme, label); @@ -180,8 +180,11 @@ public class EndpointAnnotationProcessor extends AbstractCamelAnnotationProcesso String cn = en + "Configurer"; String fqn = pn + "." + cn; - EndpointPropertyConfigurerGenerator.generatePropertyConfigurer(processingEnv, parent, pn, cn, fqn, en, fqen, endpointPaths, endpointOptions); - EndpointPropertyConfigurerGenerator.generateMetaInfConfigurer(processingEnv, componentModel.getScheme() + "-endpoint", fqn); + // only generate this once for the first scheme + if (schemes == null || schemes[0].equals(scheme)) { + EndpointPropertyConfigurerGenerator.generatePropertyConfigurer(processingEnv, parent, pn, cn, fqn, en, fqen, endpointOptions); + EndpointPropertyConfigurerGenerator.generateMetaInfConfigurer(processingEnv, componentModel.getScheme() + "-endpoint", fqn); + } } public String createParameterJsonSchema(ComponentModel componentModel, Set<ComponentOption> componentOptions, diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointPropertyConfigurerGenerator.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointPropertyConfigurerGenerator.java index 6e4e236..620e5c0 100644 --- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointPropertyConfigurerGenerator.java +++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointPropertyConfigurerGenerator.java @@ -20,35 +20,34 @@ import java.io.IOException; import java.io.Writer; import java.util.Set; import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic; import javax.tools.FileObject; import javax.tools.JavaFileObject; import javax.tools.StandardLocation; -import org.apache.camel.spi.annotations.SubServiceFactory; import org.apache.camel.tools.apt.helper.IOHelper; import org.apache.camel.tools.apt.model.EndpointOption; -import org.apache.camel.tools.apt.model.EndpointPath; import static org.apache.camel.tools.apt.AnnotationProcessorHelper.dumpExceptionToErrorFile; public final class EndpointPropertyConfigurerGenerator { + // TODO: We can omit the read properties as we only use the writes + private EndpointPropertyConfigurerGenerator() { } public static void generatePropertyConfigurer(ProcessingEnvironment processingEnv, TypeElement parent, String pn, String cn, String fqn, String en, String fqen, - Set<EndpointPath> paths, Set<EndpointOption> options) { + Set<EndpointOption> options) { Writer w = null; try { JavaFileObject src = processingEnv.getFiler().createSourceFile(fqn, parent); w = src.openWriter(); - int size = paths.size() + options.size(); + int size = options.size(); w.write("/* Generated by org.apache.camel:apt */\n"); w.write("package " + pn + ";\n"); @@ -76,15 +75,6 @@ public final class EndpointPropertyConfigurerGenerator { w.write(" " + en + " endpoint = (" + en + ") object;\n"); w.write("\n"); - // only include string types as they are the only ones we can use for property placeholders - for (EndpointPath option : paths) { - String getOrSet = option.getName(); - getOrSet = Character.toUpperCase(getOrSet.charAt(0)) + getOrSet.substring(1); - String getterLambda = getterLambda(getOrSet, option.getName(), option.getType()); - String setterLambda = setterLambda(getOrSet, option.getName(), option.getType()); - w.write(" readPlaceholders.put(\"" + option.getName() + "\", " + getterLambda + ");\n"); - w.write(" writePlaceholders.put(\"" + option.getName() + "\", " + setterLambda + ");\n"); - } for (EndpointOption option : options) { String getOrSet = option.getName(); getOrSet = Character.toUpperCase(getOrSet.charAt(0)) + getOrSet.substring(1);
