This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 61afeca3c12d142a6a0de3093a222333614d5f96 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Wed Apr 8 14:31:33 2020 +0200 CAMEL-14864: Be able to generate configurer for any pojo. WIP --- core/camel-core-engine/pom.xml | 18 + .../camel/ExtendedCamelContextConfigurer.java | 375 +++++++++++++++++++++ .../apache/camel/configurer/ExtendedCamelContext | 2 + .../camel/tooling/model/BaseOptionModel.java | 18 + .../org/apache/camel/tooling/model/JsonMapper.java | 4 + .../maven/packaging/GenerateConfigurerMojo.java | 77 +++-- .../packaging/PropertyConfigurerGenerator.java | 12 +- 7 files changed, 482 insertions(+), 24 deletions(-) diff --git a/core/camel-core-engine/pom.xml b/core/camel-core-engine/pom.xml index 4a5d85d..54c2ee1 100644 --- a/core/camel-core-engine/pom.xml +++ b/core/camel-core-engine/pom.xml @@ -120,6 +120,24 @@ <plugins> <plugin> <groupId>org.apache.camel</groupId> + <artifactId>camel-package-maven-plugin</artifactId> + <executions> + <execution> + <id>generate-configurer</id> + <phase>process-classes</phase> + <goals> + <goal>generate-configurer</goal> + </goals> + <!-- we want to have configurer for ExtendedCamelContext in camel-core-engine --> + <configuration> + <discoverClasses>false</discoverClasses> + <classes>org.apache.camel.ExtendedCamelContext</classes> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.camel</groupId> <artifactId>camel-bundle-plugin</artifactId> <configuration> <instructions> diff --git a/core/camel-core-engine/src/generated/java/org/apache/camel/ExtendedCamelContextConfigurer.java b/core/camel-core-engine/src/generated/java/org/apache/camel/ExtendedCamelContextConfigurer.java new file mode 100644 index 0000000..6858b66 --- /dev/null +++ b/core/camel-core-engine/src/generated/java/org/apache/camel/ExtendedCamelContextConfigurer.java @@ -0,0 +1,375 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel; + +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.util.CaseInsensitiveMap; +import org.apache.camel.ExtendedCamelContext; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class ExtendedCamelContextConfigurer 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.ExtendedCamelContext target = (org.apache.camel.ExtendedCamelContext) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowuseoriginalmessage": + case "AllowUseOriginalMessage": target.setAllowUseOriginalMessage(property(camelContext, java.lang.Boolean.class, value)); return true; + case "applicationcontextclassloader": + case "ApplicationContextClassLoader": target.setApplicationContextClassLoader(property(camelContext, java.lang.ClassLoader.class, value)); return true; + case "asyncprocessorawaitmanager": + case "AsyncProcessorAwaitManager": target.setAsyncProcessorAwaitManager(property(camelContext, org.apache.camel.spi.AsyncProcessorAwaitManager.class, value)); return true; + case "autostartup": + case "AutoStartup": target.setAutoStartup(property(camelContext, java.lang.Boolean.class, value)); return true; + case "backlogtracing": + case "BacklogTracing": target.setBacklogTracing(property(camelContext, java.lang.Boolean.class, value)); return true; + case "beanintrospection": + case "BeanIntrospection": target.setBeanIntrospection(property(camelContext, org.apache.camel.spi.BeanIntrospection.class, value)); return true; + case "caseinsensitiveheaders": + case "CaseInsensitiveHeaders": target.setCaseInsensitiveHeaders(property(camelContext, java.lang.Boolean.class, value)); return true; + case "classresolver": + case "ClassResolver": target.setClassResolver(property(camelContext, org.apache.camel.spi.ClassResolver.class, value)); return true; + case "componentnameresolver": + case "ComponentNameResolver": target.setComponentNameResolver(property(camelContext, org.apache.camel.spi.ComponentNameResolver.class, value)); return true; + case "componentresolver": + case "ComponentResolver": target.setComponentResolver(property(camelContext, org.apache.camel.spi.ComponentResolver.class, value)); return true; + case "configurerresolver": + case "ConfigurerResolver": target.setConfigurerResolver(property(camelContext, org.apache.camel.spi.ConfigurerResolver.class, value)); return true; + case "dataformatresolver": + case "DataFormatResolver": target.setDataFormatResolver(property(camelContext, org.apache.camel.spi.DataFormatResolver.class, value)); return true; + case "debugger": + case "Debugger": target.setDebugger(property(camelContext, org.apache.camel.spi.Debugger.class, value)); return true; + case "debugging": + case "Debugging": target.setDebugging(property(camelContext, java.lang.Boolean.class, value)); return true; + case "delayer": + case "Delayer": target.setDelayer(property(camelContext, java.lang.Long.class, value)); return true; + case "errorhandlerfactory": + case "ErrorHandlerFactory": target.setErrorHandlerFactory(property(camelContext, org.apache.camel.ErrorHandlerFactory.class, value)); return true; + case "eventnotificationapplicable": + case "EventNotificationApplicable": target.setEventNotificationApplicable(property(camelContext, boolean.class, value)); return true; + case "executorservicemanager": + case "ExecutorServiceManager": target.setExecutorServiceManager(property(camelContext, org.apache.camel.spi.ExecutorServiceManager.class, value)); return true; + case "factoryfinderresolver": + case "FactoryFinderResolver": target.setFactoryFinderResolver(property(camelContext, org.apache.camel.spi.FactoryFinderResolver.class, value)); return true; + case "globaloptions": + case "GlobalOptions": target.setGlobalOptions(property(camelContext, java.util.Map.class, value)); return true; + case "headersmapfactory": + case "HeadersMapFactory": target.setHeadersMapFactory(property(camelContext, org.apache.camel.spi.HeadersMapFactory.class, value)); return true; + case "inflightrepository": + case "InflightRepository": target.setInflightRepository(property(camelContext, org.apache.camel.spi.InflightRepository.class, value)); return true; + case "injector": + case "Injector": target.setInjector(property(camelContext, org.apache.camel.spi.Injector.class, value)); return true; + case "languageresolver": + case "LanguageResolver": target.setLanguageResolver(property(camelContext, org.apache.camel.spi.LanguageResolver.class, value)); return true; + case "loadtypeconverters": + case "LoadTypeConverters": target.setLoadTypeConverters(property(camelContext, java.lang.Boolean.class, value)); return true; + case "logexhaustedmessagebody": + case "LogExhaustedMessageBody": target.setLogExhaustedMessageBody(property(camelContext, java.lang.Boolean.class, value)); return true; + case "logmask": + case "LogMask": target.setLogMask(property(camelContext, java.lang.Boolean.class, value)); return true; + case "mdcloggingkeyspattern": + case "MDCLoggingKeysPattern": target.setMDCLoggingKeysPattern(property(camelContext, java.lang.String.class, value)); return true; + case "managementname": + case "ManagementName": target.setManagementName(property(camelContext, java.lang.String.class, value)); return true; + case "managementnamestrategy": + case "ManagementNameStrategy": target.setManagementNameStrategy(property(camelContext, org.apache.camel.spi.ManagementNameStrategy.class, value)); return true; + case "managementstrategy": + case "ManagementStrategy": target.setManagementStrategy(property(camelContext, org.apache.camel.spi.ManagementStrategy.class, value)); return true; + case "messagehistory": + case "MessageHistory": target.setMessageHistory(property(camelContext, java.lang.Boolean.class, value)); return true; + case "messagehistoryfactory": + case "MessageHistoryFactory": target.setMessageHistoryFactory(property(camelContext, org.apache.camel.spi.MessageHistoryFactory.class, value)); return true; + case "modeljaxbcontextfactory": + case "ModelJAXBContextFactory": target.setModelJAXBContextFactory(property(camelContext, org.apache.camel.spi.ModelJAXBContextFactory.class, value)); return true; + case "modeltoxmldumper": + case "ModelToXMLDumper": target.setModelToXMLDumper(property(camelContext, org.apache.camel.spi.ModelToXMLDumper.class, value)); return true; + case "name": + case "Name": target.setName(property(camelContext, java.lang.String.class, value)); return true; + case "namestrategy": + case "NameStrategy": target.setNameStrategy(property(camelContext, org.apache.camel.spi.CamelContextNameStrategy.class, value)); return true; + case "nodeidfactory": + case "NodeIdFactory": target.setNodeIdFactory(property(camelContext, org.apache.camel.spi.NodeIdFactory.class, value)); return true; + case "packagescanclassresolver": + case "PackageScanClassResolver": target.setPackageScanClassResolver(property(camelContext, org.apache.camel.spi.PackageScanClassResolver.class, value)); return true; + case "packagescanresourceresolver": + case "PackageScanResourceResolver": target.setPackageScanResourceResolver(property(camelContext, org.apache.camel.spi.PackageScanResourceResolver.class, value)); return true; + case "processorfactory": + case "ProcessorFactory": target.setProcessorFactory(property(camelContext, org.apache.camel.spi.ProcessorFactory.class, value)); return true; + case "propertiescomponent": + case "PropertiesComponent": target.setPropertiesComponent(property(camelContext, org.apache.camel.spi.PropertiesComponent.class, value)); return true; + case "reactiveexecutor": + case "ReactiveExecutor": target.setReactiveExecutor(property(camelContext, org.apache.camel.spi.ReactiveExecutor.class, value)); return true; + case "registry": + case "Registry": target.setRegistry(property(camelContext, org.apache.camel.spi.Registry.class, value)); return true; + case "restbindingjaxbdataformatfactory": + case "RestBindingJaxbDataFormatFactory": target.setRestBindingJaxbDataFormatFactory(property(camelContext, org.apache.camel.spi.RestBindingJaxbDataFormatFactory.class, value)); return true; + case "restconfiguration": + case "RestConfiguration": target.setRestConfiguration(property(camelContext, org.apache.camel.spi.RestConfiguration.class, value)); return true; + case "restregistry": + case "RestRegistry": target.setRestRegistry(property(camelContext, org.apache.camel.spi.RestRegistry.class, value)); return true; + case "routecontroller": + case "RouteController": target.setRouteController(property(camelContext, org.apache.camel.spi.RouteController.class, value)); return true; + case "runtimecamelcatalog": + case "RuntimeCamelCatalog": target.setRuntimeCamelCatalog(property(camelContext, org.apache.camel.catalog.RuntimeCamelCatalog.class, value)); return true; + case "runtimeendpointregistry": + case "RuntimeEndpointRegistry": target.setRuntimeEndpointRegistry(property(camelContext, org.apache.camel.spi.RuntimeEndpointRegistry.class, value)); return true; + case "sslcontextparameters": + case "SSLContextParameters": target.setSSLContextParameters(property(camelContext, org.apache.camel.support.jsse.SSLContextParameters.class, value)); return true; + case "shutdownroute": + case "ShutdownRoute": target.setShutdownRoute(property(camelContext, org.apache.camel.ShutdownRoute.class, value)); return true; + case "shutdownrunningtask": + case "ShutdownRunningTask": target.setShutdownRunningTask(property(camelContext, org.apache.camel.ShutdownRunningTask.class, value)); return true; + case "shutdownstrategy": + case "ShutdownStrategy": target.setShutdownStrategy(property(camelContext, org.apache.camel.spi.ShutdownStrategy.class, value)); return true; + case "streamcaching": + case "StreamCaching": target.setStreamCaching(property(camelContext, java.lang.Boolean.class, value)); return true; + case "streamcachingstrategy": + case "StreamCachingStrategy": target.setStreamCachingStrategy(property(camelContext, org.apache.camel.spi.StreamCachingStrategy.class, value)); return true; + case "tracer": + case "Tracer": target.setTracer(property(camelContext, org.apache.camel.spi.Tracer.class, value)); return true; + case "tracing": + case "Tracing": target.setTracing(property(camelContext, java.lang.Boolean.class, value)); return true; + case "tracingpattern": + case "TracingPattern": target.setTracingPattern(property(camelContext, java.lang.String.class, value)); return true; + case "typeconverterregistry": + case "TypeConverterRegistry": target.setTypeConverterRegistry(property(camelContext, org.apache.camel.spi.TypeConverterRegistry.class, value)); return true; + case "typeconverterstatisticsenabled": + case "TypeConverterStatisticsEnabled": target.setTypeConverterStatisticsEnabled(property(camelContext, java.lang.Boolean.class, value)); return true; + case "unitofworkfactory": + case "UnitOfWorkFactory": target.setUnitOfWorkFactory(property(camelContext, org.apache.camel.spi.UnitOfWorkFactory.class, value)); return true; + case "usebreadcrumb": + case "UseBreadcrumb": target.setUseBreadcrumb(property(camelContext, java.lang.Boolean.class, value)); return true; + case "usedatatype": + case "UseDataType": target.setUseDataType(property(camelContext, java.lang.Boolean.class, value)); return true; + case "usemdclogging": + case "UseMDCLogging": target.setUseMDCLogging(property(camelContext, java.lang.Boolean.class, value)); return true; + case "uuidgenerator": + case "UuidGenerator": target.setUuidGenerator(property(camelContext, org.apache.camel.spi.UuidGenerator.class, value)); return true; + case "xmlroutesdefinitionloader": + case "XMLRoutesDefinitionLoader": target.setXMLRoutesDefinitionLoader(property(camelContext, org.apache.camel.spi.XMLRoutesDefinitionLoader.class, value)); return true; + default: return false; + } + } + + @Override + public Map<String, Object> getAllOptions(Object target) { + Map<String, Object> answer = new CaseInsensitiveMap(); + answer.put("AllowUseOriginalMessage", java.lang.Boolean.class); + answer.put("ApplicationContextClassLoader", java.lang.ClassLoader.class); + answer.put("AsyncProcessorAwaitManager", org.apache.camel.spi.AsyncProcessorAwaitManager.class); + answer.put("AutoStartup", java.lang.Boolean.class); + answer.put("BacklogTracing", java.lang.Boolean.class); + answer.put("BeanIntrospection", org.apache.camel.spi.BeanIntrospection.class); + answer.put("CaseInsensitiveHeaders", java.lang.Boolean.class); + answer.put("ClassResolver", org.apache.camel.spi.ClassResolver.class); + answer.put("ComponentNameResolver", org.apache.camel.spi.ComponentNameResolver.class); + answer.put("ComponentResolver", org.apache.camel.spi.ComponentResolver.class); + answer.put("ConfigurerResolver", org.apache.camel.spi.ConfigurerResolver.class); + answer.put("DataFormatResolver", org.apache.camel.spi.DataFormatResolver.class); + answer.put("Debugger", org.apache.camel.spi.Debugger.class); + answer.put("Debugging", java.lang.Boolean.class); + answer.put("Delayer", java.lang.Long.class); + answer.put("ErrorHandlerFactory", org.apache.camel.ErrorHandlerFactory.class); + answer.put("EventNotificationApplicable", boolean.class); + answer.put("ExecutorServiceManager", org.apache.camel.spi.ExecutorServiceManager.class); + answer.put("FactoryFinderResolver", org.apache.camel.spi.FactoryFinderResolver.class); + answer.put("GlobalOptions", java.util.Map.class); + answer.put("HeadersMapFactory", org.apache.camel.spi.HeadersMapFactory.class); + answer.put("InflightRepository", org.apache.camel.spi.InflightRepository.class); + answer.put("Injector", org.apache.camel.spi.Injector.class); + answer.put("LanguageResolver", org.apache.camel.spi.LanguageResolver.class); + answer.put("LoadTypeConverters", java.lang.Boolean.class); + answer.put("LogExhaustedMessageBody", java.lang.Boolean.class); + answer.put("LogMask", java.lang.Boolean.class); + answer.put("MDCLoggingKeysPattern", java.lang.String.class); + answer.put("ManagementName", java.lang.String.class); + answer.put("ManagementNameStrategy", org.apache.camel.spi.ManagementNameStrategy.class); + answer.put("ManagementStrategy", org.apache.camel.spi.ManagementStrategy.class); + answer.put("MessageHistory", java.lang.Boolean.class); + answer.put("MessageHistoryFactory", org.apache.camel.spi.MessageHistoryFactory.class); + answer.put("ModelJAXBContextFactory", org.apache.camel.spi.ModelJAXBContextFactory.class); + answer.put("ModelToXMLDumper", org.apache.camel.spi.ModelToXMLDumper.class); + answer.put("Name", java.lang.String.class); + answer.put("NameStrategy", org.apache.camel.spi.CamelContextNameStrategy.class); + answer.put("NodeIdFactory", org.apache.camel.spi.NodeIdFactory.class); + answer.put("PackageScanClassResolver", org.apache.camel.spi.PackageScanClassResolver.class); + answer.put("PackageScanResourceResolver", org.apache.camel.spi.PackageScanResourceResolver.class); + answer.put("ProcessorFactory", org.apache.camel.spi.ProcessorFactory.class); + answer.put("PropertiesComponent", org.apache.camel.spi.PropertiesComponent.class); + answer.put("ReactiveExecutor", org.apache.camel.spi.ReactiveExecutor.class); + answer.put("Registry", org.apache.camel.spi.Registry.class); + answer.put("RestBindingJaxbDataFormatFactory", org.apache.camel.spi.RestBindingJaxbDataFormatFactory.class); + answer.put("RestConfiguration", org.apache.camel.spi.RestConfiguration.class); + answer.put("RestRegistry", org.apache.camel.spi.RestRegistry.class); + answer.put("RouteController", org.apache.camel.spi.RouteController.class); + answer.put("RuntimeCamelCatalog", org.apache.camel.catalog.RuntimeCamelCatalog.class); + answer.put("RuntimeEndpointRegistry", org.apache.camel.spi.RuntimeEndpointRegistry.class); + answer.put("SSLContextParameters", org.apache.camel.support.jsse.SSLContextParameters.class); + answer.put("ShutdownRoute", org.apache.camel.ShutdownRoute.class); + answer.put("ShutdownRunningTask", org.apache.camel.ShutdownRunningTask.class); + answer.put("ShutdownStrategy", org.apache.camel.spi.ShutdownStrategy.class); + answer.put("StreamCaching", java.lang.Boolean.class); + answer.put("StreamCachingStrategy", org.apache.camel.spi.StreamCachingStrategy.class); + answer.put("Tracer", org.apache.camel.spi.Tracer.class); + answer.put("Tracing", java.lang.Boolean.class); + answer.put("TracingPattern", java.lang.String.class); + answer.put("TypeConverterRegistry", org.apache.camel.spi.TypeConverterRegistry.class); + answer.put("TypeConverterStatisticsEnabled", java.lang.Boolean.class); + answer.put("UnitOfWorkFactory", org.apache.camel.spi.UnitOfWorkFactory.class); + answer.put("UseBreadcrumb", java.lang.Boolean.class); + answer.put("UseDataType", java.lang.Boolean.class); + answer.put("UseMDCLogging", java.lang.Boolean.class); + answer.put("UuidGenerator", org.apache.camel.spi.UuidGenerator.class); + answer.put("XMLRoutesDefinitionLoader", org.apache.camel.spi.XMLRoutesDefinitionLoader.class); + return answer; + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.ExtendedCamelContext target = (org.apache.camel.ExtendedCamelContext) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "allowuseoriginalmessage": + case "AllowUseOriginalMessage": return target.isAllowUseOriginalMessage(); + case "applicationcontextclassloader": + case "ApplicationContextClassLoader": return target.getApplicationContextClassLoader(); + case "asyncprocessorawaitmanager": + case "AsyncProcessorAwaitManager": return target.getAsyncProcessorAwaitManager(); + case "autostartup": + case "AutoStartup": return target.isAutoStartup(); + case "backlogtracing": + case "BacklogTracing": return target.isBacklogTracing(); + case "beanintrospection": + case "BeanIntrospection": return target.getBeanIntrospection(); + case "caseinsensitiveheaders": + case "CaseInsensitiveHeaders": return target.isCaseInsensitiveHeaders(); + case "classresolver": + case "ClassResolver": return target.getClassResolver(); + case "componentnameresolver": + case "ComponentNameResolver": return target.getComponentNameResolver(); + case "componentresolver": + case "ComponentResolver": return target.getComponentResolver(); + case "configurerresolver": + case "ConfigurerResolver": return target.getConfigurerResolver(); + case "dataformatresolver": + case "DataFormatResolver": return target.getDataFormatResolver(); + case "debugger": + case "Debugger": return target.getDebugger(); + case "debugging": + case "Debugging": return target.isDebugging(); + case "delayer": + case "Delayer": return target.getDelayer(); + case "errorhandlerfactory": + case "ErrorHandlerFactory": return target.getErrorHandlerFactory(); + case "eventnotificationapplicable": + case "EventNotificationApplicable": return target.isEventNotificationApplicable(); + case "executorservicemanager": + case "ExecutorServiceManager": return target.getExecutorServiceManager(); + case "factoryfinderresolver": + case "FactoryFinderResolver": return target.getFactoryFinderResolver(); + case "globaloptions": + case "GlobalOptions": return target.getGlobalOptions(); + case "headersmapfactory": + case "HeadersMapFactory": return target.getHeadersMapFactory(); + case "inflightrepository": + case "InflightRepository": return target.getInflightRepository(); + case "injector": + case "Injector": return target.getInjector(); + case "languageresolver": + case "LanguageResolver": return target.getLanguageResolver(); + case "loadtypeconverters": + case "LoadTypeConverters": return target.isLoadTypeConverters(); + case "logexhaustedmessagebody": + case "LogExhaustedMessageBody": return target.isLogExhaustedMessageBody(); + case "logmask": + case "LogMask": return target.isLogMask(); + case "mdcloggingkeyspattern": + case "MDCLoggingKeysPattern": return target.getMDCLoggingKeysPattern(); + case "managementname": + case "ManagementName": return target.getManagementName(); + case "managementnamestrategy": + case "ManagementNameStrategy": return target.getManagementNameStrategy(); + case "managementstrategy": + case "ManagementStrategy": return target.getManagementStrategy(); + case "messagehistory": + case "MessageHistory": return target.isMessageHistory(); + case "messagehistoryfactory": + case "MessageHistoryFactory": return target.getMessageHistoryFactory(); + case "modeljaxbcontextfactory": + case "ModelJAXBContextFactory": return target.getModelJAXBContextFactory(); + case "modeltoxmldumper": + case "ModelToXMLDumper": return target.getModelToXMLDumper(); + case "name": + case "Name": return target.getName(); + case "namestrategy": + case "NameStrategy": return target.getNameStrategy(); + case "nodeidfactory": + case "NodeIdFactory": return target.getNodeIdFactory(); + case "packagescanclassresolver": + case "PackageScanClassResolver": return target.getPackageScanClassResolver(); + case "packagescanresourceresolver": + case "PackageScanResourceResolver": return target.getPackageScanResourceResolver(); + case "processorfactory": + case "ProcessorFactory": return target.getProcessorFactory(); + case "propertiescomponent": + case "PropertiesComponent": return target.getPropertiesComponent(); + case "reactiveexecutor": + case "ReactiveExecutor": return target.getReactiveExecutor(); + case "registry": + case "Registry": return target.getRegistry(); + case "restbindingjaxbdataformatfactory": + case "RestBindingJaxbDataFormatFactory": return target.getRestBindingJaxbDataFormatFactory(); + case "restconfiguration": + case "RestConfiguration": return target.getRestConfiguration(); + case "restregistry": + case "RestRegistry": return target.getRestRegistry(); + case "routecontroller": + case "RouteController": return target.getRouteController(); + case "runtimecamelcatalog": + case "RuntimeCamelCatalog": return target.getRuntimeCamelCatalog(); + case "runtimeendpointregistry": + case "RuntimeEndpointRegistry": return target.getRuntimeEndpointRegistry(); + case "sslcontextparameters": + case "SSLContextParameters": return target.getSSLContextParameters(); + case "shutdownroute": + case "ShutdownRoute": return target.getShutdownRoute(); + case "shutdownrunningtask": + case "ShutdownRunningTask": return target.getShutdownRunningTask(); + case "shutdownstrategy": + case "ShutdownStrategy": return target.getShutdownStrategy(); + case "streamcaching": + case "StreamCaching": return target.isStreamCaching(); + case "streamcachingstrategy": + case "StreamCachingStrategy": return target.getStreamCachingStrategy(); + case "tracer": + case "Tracer": return target.getTracer(); + case "tracing": + case "Tracing": return target.isTracing(); + case "tracingpattern": + case "TracingPattern": return target.getTracingPattern(); + case "typeconverterregistry": + case "TypeConverterRegistry": return target.getTypeConverterRegistry(); + case "typeconverterstatisticsenabled": + case "TypeConverterStatisticsEnabled": return target.isTypeConverterStatisticsEnabled(); + case "unitofworkfactory": + case "UnitOfWorkFactory": return target.getUnitOfWorkFactory(); + case "usebreadcrumb": + case "UseBreadcrumb": return target.isUseBreadcrumb(); + case "usedatatype": + case "UseDataType": return target.isUseDataType(); + case "usemdclogging": + case "UseMDCLogging": return target.isUseMDCLogging(); + case "uuidgenerator": + case "UuidGenerator": return target.getUuidGenerator(); + case "xmlroutesdefinitionloader": + case "XMLRoutesDefinitionLoader": return target.getXMLRoutesDefinitionLoader(); + default: return null; + } + } +} + diff --git a/core/camel-core-engine/src/generated/resources/META-INF/services/org/apache/camel/configurer/ExtendedCamelContext b/core/camel-core-engine/src/generated/resources/META-INF/services/org/apache/camel/configurer/ExtendedCamelContext new file mode 100644 index 0000000..4d22c93 --- /dev/null +++ b/core/camel-core-engine/src/generated/resources/META-INF/services/org/apache/camel/configurer/ExtendedCamelContext @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.ExtendedCamelContextConfigurer diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseOptionModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseOptionModel.java index 1aff346..30d8746 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseOptionModel.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseOptionModel.java @@ -41,6 +41,8 @@ public abstract class BaseOptionModel { protected Object defaultValue; protected String defaultValueNote; protected boolean asPredicate; + protected String setterMethod; // optional and currently only used by configurer + protected String getterMethod; // optional and currently only used by configurer protected String configurationClass; protected String configurationField; protected String description; @@ -200,6 +202,22 @@ public abstract class BaseOptionModel { this.asPredicate = asPredicate; } + public String getSetterMethod() { + return setterMethod; + } + + public void setSetterMethod(String setterMethod) { + this.setterMethod = setterMethod; + } + + public String getGetterMethod() { + return getterMethod; + } + + public void setGetterMethod(String getterMethod) { + this.getterMethod = getterMethod; + } + public String getConfigurationClass() { return configurationClass; } 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 493aa17..2375ff4 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 @@ -392,6 +392,8 @@ public final class JsonMapper { option.setConfigurationClass(mp.getString("configurationClass")); option.setConfigurationField(mp.getString("configurationField")); option.setDescription(mp.getString("description")); + option.setGetterMethod(mp.getString("getterMethod")); + option.setSetterMethod(mp.getString("setterMethod")); } private static void parseGroup(JsonObject mp, MainGroupModel option) { @@ -428,6 +430,8 @@ public final class JsonMapper { prop.put("configurationClass", option.getConfigurationClass()); prop.put("configurationField", option.getConfigurationField()); prop.put("description", option.getDescription()); + prop.put("getterMethod", option.getGetterMethod()); + prop.put("setterMethod", option.getSetterMethod()); prop.entrySet().removeIf(e -> e.getValue() == null); prop.remove("prefix", ""); prop.remove("optionalPrefix", ""); diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateConfigurerMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateConfigurerMojo.java index 74c574b..d5be300 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateConfigurerMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateConfigurerMojo.java @@ -27,6 +27,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Arrays; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -63,14 +64,27 @@ public class GenerateConfigurerMojo extends AbstractGeneratorMojo { @Parameter(defaultValue = "${project.basedir}/src/generated/resources") protected File resourcesOutputDir; + /** + * Whether to discover configurer classes from classpath by scanning for @Configurer annotations. + */ + @Parameter(defaultValue = "true") + protected boolean discoverClasses = true; + + /** + * To generate configurer for these classes. + */ + @Parameter + protected String[] classes; + private DynamicClassLoader projectClassLoader; private static class Option extends BaseOptionModel { - public Option(String name, Class type) { + public Option(String name, Class type, String getter) { // we just use name, type setName(name); setJavaType(type.getName()); + setGetterMethod(getter); } } @@ -99,28 +113,39 @@ public class GenerateConfigurerMojo extends AbstractGeneratorMojo { }); projectClassLoader = DynamicClassLoader.createDynamicClassLoader(cp); - Path output = Paths.get(project.getBuild().getOutputDirectory()); - Index index; - try (InputStream is = Files.newInputStream(output.resolve("META-INF/jandex.idx"))) { - index = new IndexReader(is).read(); - } catch (IOException e) { - throw new MojoExecutionException("IOException: " + e.getMessage(), e); + Set<String> set = new LinkedHashSet<>(); + + if (discoverClasses) { + Path output = Paths.get(project.getBuild().getOutputDirectory()); + Index index; + try (InputStream is = Files.newInputStream(output.resolve("META-INF/jandex.idx"))) { + index = new IndexReader(is).read(); + } catch (IOException e) { + throw new MojoExecutionException("IOException: " + e.getMessage(), e); + } + + // discover all classes annotated with @Configurer + List<AnnotationInstance> annotations = index.getAnnotations(CONFIGURER); + annotations.stream() + .filter(annotation -> annotation.target().kind() == AnnotationTarget.Kind.CLASS) + .filter(annotation -> annotation.target().asClass().nestingType() == ClassInfo.NestingType.TOP_LEVEL) + .filter(annotation -> asBooleanDefaultTrue(annotation, "generateConfigurer")) + .forEach(annotation -> { + String currentClass = annotation.target().asClass().name().toString(); + set.add(currentClass); + }); } - Set<String> classes = new LinkedHashSet<>(); + // additional classes + if (classes != null) { + set.addAll(Arrays.asList(classes)); + } - // discover all classes annotated with @Configurer - List<AnnotationInstance> annotations = index.getAnnotations(CONFIGURER); - annotations.stream() - .filter(annotation -> annotation.target().kind() == AnnotationTarget.Kind.CLASS) - .filter(annotation -> annotation.target().asClass().nestingType() == ClassInfo.NestingType.TOP_LEVEL) - .filter(annotation -> asBooleanDefaultTrue(annotation, "generateConfigurer")) - .forEach(annotation -> { - String currentClass = annotation.target().asClass().name().toString(); - classes.add(currentClass); - }); + if (getLog().isDebugEnabled()) { + getLog().debug("Generating configuers for the following classes: " + set); + } - for (String fqn : classes) { + for (String fqn : set) { try { List<Option> options = processClass(fqn); generateConfigurer(fqn, options); @@ -141,8 +166,19 @@ public class GenerateConfigurerMojo extends AbstractGeneratorMojo { setter &= Modifier.isPublic(m.getModifiers()) && m.getParameterCount() == 1; setter &= filterSetter(m); if (setter) { + String getter = "get" + Character.toUpperCase(m.getName().charAt(3)) + m.getName().substring(4); + Class type = m.getParameterTypes()[0]; + if (boolean.class == type || Boolean.class == type) { + try { + String isGetter = "is" + getter.substring(3); + clazz.getMethod(isGetter, null); + getter = isGetter; + } catch (Exception e) { + // ignore as its then assumed to be get + } + } String t = Character.toUpperCase(m.getName().charAt(3)) + m.getName().substring(3 + 1); - answer.add(new Option(t, m.getParameterTypes()[0])); + answer.add(new Option(t, type, getter)); } }); @@ -171,7 +207,6 @@ public class GenerateConfigurerMojo extends AbstractGeneratorMojo { String psn = "org.apache.camel.support.component.PropertyConfigurerSupport"; StringWriter sw = new StringWriter(); -// PropertyMainConfigurerGenerator.generatePropertyConfigurer(pn, cn, en, pfqn, psn, options, sw); PropertyConfigurerGenerator.generatePropertyConfigurer(pn, cn, en, pfqn, psn, false, false, options, sw); diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PropertyConfigurerGenerator.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PropertyConfigurerGenerator.java index a02d964..81f3e52 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PropertyConfigurerGenerator.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PropertyConfigurerGenerator.java @@ -121,7 +121,7 @@ public final class PropertyConfigurerGenerator { for (BaseOptionModel option : options) { String getOrSet = option.getName(); getOrSet = Character.toUpperCase(getOrSet.charAt(0)) + getOrSet.substring(1); - String getterLambda = getterLambda(getOrSet, option.getJavaType(), option.getConfigurationField(), component); + String getterLambda = getterLambda(getOrSet, option.getJavaType(), option.getGetterMethod(), option.getConfigurationField(), component); if (!option.getName().toLowerCase().equals(option.getName())) { w.write(String.format(" case \"%s\":\n", option.getName().toLowerCase())); } @@ -166,8 +166,14 @@ public final class PropertyConfigurerGenerator { return String.format("%s(property(camelContext, %s.class, value))", getOrSet, type); } - private static String getterLambda(String getOrSet, String type, String configurationField, boolean component) { - String prefix = "boolean".equals(type) ? "is" : "get"; + private static String getterLambda(String getOrSet, String type, String getterMethod, String configurationField, boolean component) { + String prefix; + if (getterMethod == null || getterMethod.isEmpty()) { + prefix = "boolean".equals(type) ? "is" : "get"; + } else { + prefix = ""; + getOrSet = getterMethod; + } if (configurationField != null) { if (component) { getOrSet = "getOrCreateConfiguration(target)." + prefix + getOrSet;