This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch CAMEL-15224 in repository https://gitbox.apache.org/repos/asf/camel.git
commit 81325c14af32a39c5e29b07794797daa78a8fa64 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Mon Jun 22 14:03:17 2020 +0200 CAMEL-15224: camel-api-component - Avoid reflection when configured nested configuration classes. --- .../camel-olingo4/camel-olingo4-component/pom.xml | 42 ++----- .../olingo4/Olingo4AppEndpointConfiguration.java | 94 ++++++++++++++ .../Olingo4AppEndpointConfigurationConfigurer.java | 140 +++++++++++++++++++++ .../olingo4/Olingo4ConfigurationConfigurer.java | 105 ++++++++++++++++ .../olingo4/internal/Olingo4ApiCollection.java | 59 +++++++++ .../component/olingo4/internal/Olingo4ApiName.java | 38 ++++++ .../olingo4/internal/Olingo4AppApiMethod.java | 123 ++++++++++++++++++ .../configurer/Olingo4AppEndpointConfiguration | 2 + .../apache/camel/configurer/Olingo4Configuration | 2 + .../component/olingo4/Olingo4Configuration.java | 2 + .../camel/component/olingo4/Olingo4Endpoint.java | 4 +- .../camel/component/olingo4/Olingo4Producer.java | 2 +- .../olingo4/internal/Olingo4PropertiesHelper.java | 9 +- .../component/ApiMethodPropertiesHelperTest.java | 4 +- .../support/component/AbstractApiEndpoint.java | 2 +- .../component/ApiMethodPropertiesHelper.java | 66 +++++++--- 16 files changed, 630 insertions(+), 64 deletions(-) diff --git a/components/camel-olingo4/camel-olingo4-component/pom.xml b/components/camel-olingo4/camel-olingo4-component/pom.xml index b28553a..10c113f 100644 --- a/components/camel-olingo4/camel-olingo4-component/pom.xml +++ b/components/camel-olingo4/camel-olingo4-component/pom.xml @@ -140,48 +140,20 @@ </executions> </plugin> <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>build-helper-maven-plugin</artifactId> + <!-- we need to generate additional configurer classes --> + <groupId>org.apache.camel</groupId> + <artifactId>camel-package-maven-plugin</artifactId> <executions> <execution> - <id>add-generated-sources</id> - <goals> - <goal>add-source</goal> - </goals> - <configuration> - <sources> - <source>${project.build.directory}/generated-sources/camel-component</source> - </sources> - </configuration> - </execution> - <execution> - <id>add-generated-test-sources</id> + <id>generate-configurer</id> + <phase>process-classes</phase> <goals> - <goal>add-test-source</goal> + <goal>generate-configurer</goal> </goals> - <configuration> - <sources> - <source>${project.build.directory}/generated-test-sources/camel-component</source> - </sources> - </configuration> </execution> </executions> </plugin> </plugins> </build> - <reporting> - <plugins> - <plugin> - <groupId>org.apache.camel</groupId> - <artifactId>camel-api-component-maven-plugin</artifactId> - <version>${project.version}</version> - <configuration> - <scheme>${schemeName}</scheme> - <componentName>${componentName}</componentName> - <componentPackage>${componentPackage}</componentPackage> - <outPackage>${outPackage}</outPackage> - </configuration> - </plugin> - </plugins> - </reporting> + </project> diff --git a/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/Olingo4AppEndpointConfiguration.java b/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/Olingo4AppEndpointConfiguration.java new file mode 100644 index 0000000..f580969 --- /dev/null +++ b/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/Olingo4AppEndpointConfiguration.java @@ -0,0 +1,94 @@ + +/* + * Camel EndpointConfiguration generated by camel-api-component-maven-plugin + */ +package org.apache.camel.component.olingo4; + +import org.apache.camel.spi.Configurer; +import org.apache.camel.spi.UriParam; +import org.apache.camel.spi.UriParams; + +/** + * Camel EndpointConfiguration for org.apache.camel.component.olingo4.api.Olingo4App + */ +@UriParams +@Configurer +public final class Olingo4AppEndpointConfiguration extends Olingo4Configuration { + + @UriParam + private Object data; + + @UriParam + private org.apache.olingo.commons.api.edm.Edm edm; + + @UriParam + private java.util.Map<String,String> endpointHttpHeaders; + + @UriParam + private String keyPredicate; + + @UriParam + private java.util.Map<String,String> queryParams; + + @UriParam + private String resourcePath; + + @UriParam + private org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public org.apache.olingo.commons.api.edm.Edm getEdm() { + return edm; + } + + public void setEdm(org.apache.olingo.commons.api.edm.Edm edm) { + this.edm = edm; + } + + public java.util.Map<String,String> getEndpointHttpHeaders() { + return endpointHttpHeaders; + } + + public void setEndpointHttpHeaders(java.util.Map<String,String> endpointHttpHeaders) { + this.endpointHttpHeaders = endpointHttpHeaders; + } + + public String getKeyPredicate() { + return keyPredicate; + } + + public void setKeyPredicate(String keyPredicate) { + this.keyPredicate = keyPredicate; + } + + public java.util.Map<String,String> getQueryParams() { + return queryParams; + } + + public void setQueryParams(java.util.Map<String,String> queryParams) { + this.queryParams = queryParams; + } + + public String getResourcePath() { + return resourcePath; + } + + public void setResourcePath(String resourcePath) { + this.resourcePath = resourcePath; + } + + public org.apache.camel.component.olingo4.api.Olingo4ResponseHandler getResponseHandler() { + return responseHandler; + } + + public void setResponseHandler(org.apache.camel.component.olingo4.api.Olingo4ResponseHandler responseHandler) { + this.responseHandler = responseHandler; + } +} diff --git a/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/Olingo4AppEndpointConfigurationConfigurer.java b/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/Olingo4AppEndpointConfigurationConfigurer.java new file mode 100644 index 0000000..25e2ade --- /dev/null +++ b/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/Olingo4AppEndpointConfigurationConfigurer.java @@ -0,0 +1,140 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.olingo4; + +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.component.olingo4.Olingo4AppEndpointConfiguration; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class Olingo4AppEndpointConfigurationConfigurer 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.olingo4.Olingo4AppEndpointConfiguration target = (org.apache.camel.component.olingo4.Olingo4AppEndpointConfiguration) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "apiname": + case "ApiName": target.setApiName(property(camelContext, org.apache.camel.component.olingo4.internal.Olingo4ApiName.class, value)); return true; + case "connecttimeout": + case "ConnectTimeout": target.setConnectTimeout(property(camelContext, int.class, value)); return true; + case "contenttype": + case "ContentType": target.setContentType(property(camelContext, java.lang.String.class, value)); return true; + case "data": + case "Data": target.setData(property(camelContext, java.lang.Object.class, value)); return true; + case "edm": + case "Edm": target.setEdm(property(camelContext, org.apache.olingo.commons.api.edm.Edm.class, value)); return true; + case "endpointhttpheaders": + case "EndpointHttpHeaders": target.setEndpointHttpHeaders(property(camelContext, java.util.Map.class, value)); return true; + case "filteralreadyseen": + case "FilterAlreadySeen": target.setFilterAlreadySeen(property(camelContext, boolean.class, value)); return true; + case "httpasyncclientbuilder": + case "HttpAsyncClientBuilder": target.setHttpAsyncClientBuilder(property(camelContext, org.apache.http.impl.nio.client.HttpAsyncClientBuilder.class, value)); return true; + case "httpclientbuilder": + case "HttpClientBuilder": target.setHttpClientBuilder(property(camelContext, org.apache.http.impl.client.HttpClientBuilder.class, value)); return true; + case "httpheaders": + case "HttpHeaders": target.setHttpHeaders(property(camelContext, java.util.Map.class, value)); return true; + case "keypredicate": + case "KeyPredicate": target.setKeyPredicate(property(camelContext, java.lang.String.class, value)); return true; + case "methodname": + case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true; + case "proxy": + case "Proxy": target.setProxy(property(camelContext, org.apache.http.HttpHost.class, value)); return true; + case "queryparams": + case "QueryParams": target.setQueryParams(property(camelContext, java.util.Map.class, value)); return true; + case "resourcepath": + case "ResourcePath": target.setResourcePath(property(camelContext, java.lang.String.class, value)); return true; + case "responsehandler": + case "ResponseHandler": target.setResponseHandler(property(camelContext, org.apache.camel.component.olingo4.api.Olingo4ResponseHandler.class, value)); return true; + case "serviceuri": + case "ServiceUri": target.setServiceUri(property(camelContext, java.lang.String.class, value)); return true; + case "sockettimeout": + case "SocketTimeout": target.setSocketTimeout(property(camelContext, int.class, value)); return true; + case "splitresult": + case "SplitResult": target.setSplitResult(property(camelContext, boolean.class, value)); return true; + case "sslcontextparameters": + case "SslContextParameters": target.setSslContextParameters(property(camelContext, org.apache.camel.support.jsse.SSLContextParameters.class, value)); return true; + default: return false; + } + } + + @Override + public Map<String, Object> getAllOptions(Object target) { + Map<String, Object> answer = new CaseInsensitiveMap(); + answer.put("ApiName", org.apache.camel.component.olingo4.internal.Olingo4ApiName.class); + answer.put("ConnectTimeout", int.class); + answer.put("ContentType", java.lang.String.class); + answer.put("Data", java.lang.Object.class); + answer.put("Edm", org.apache.olingo.commons.api.edm.Edm.class); + answer.put("EndpointHttpHeaders", java.util.Map.class); + answer.put("FilterAlreadySeen", boolean.class); + answer.put("HttpAsyncClientBuilder", org.apache.http.impl.nio.client.HttpAsyncClientBuilder.class); + answer.put("HttpClientBuilder", org.apache.http.impl.client.HttpClientBuilder.class); + answer.put("HttpHeaders", java.util.Map.class); + answer.put("KeyPredicate", java.lang.String.class); + answer.put("MethodName", java.lang.String.class); + answer.put("Proxy", org.apache.http.HttpHost.class); + answer.put("QueryParams", java.util.Map.class); + answer.put("ResourcePath", java.lang.String.class); + answer.put("ResponseHandler", org.apache.camel.component.olingo4.api.Olingo4ResponseHandler.class); + answer.put("ServiceUri", java.lang.String.class); + answer.put("SocketTimeout", int.class); + answer.put("SplitResult", boolean.class); + answer.put("SslContextParameters", org.apache.camel.support.jsse.SSLContextParameters.class); + return answer; + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.olingo4.Olingo4AppEndpointConfiguration target = (org.apache.camel.component.olingo4.Olingo4AppEndpointConfiguration) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "apiname": + case "ApiName": return target.getApiName(); + case "connecttimeout": + case "ConnectTimeout": return target.getConnectTimeout(); + case "contenttype": + case "ContentType": return target.getContentType(); + case "data": + case "Data": return target.getData(); + case "edm": + case "Edm": return target.getEdm(); + case "endpointhttpheaders": + case "EndpointHttpHeaders": return target.getEndpointHttpHeaders(); + case "filteralreadyseen": + case "FilterAlreadySeen": return target.isFilterAlreadySeen(); + case "httpasyncclientbuilder": + case "HttpAsyncClientBuilder": return target.getHttpAsyncClientBuilder(); + case "httpclientbuilder": + case "HttpClientBuilder": return target.getHttpClientBuilder(); + case "httpheaders": + case "HttpHeaders": return target.getHttpHeaders(); + case "keypredicate": + case "KeyPredicate": return target.getKeyPredicate(); + case "methodname": + case "MethodName": return target.getMethodName(); + case "proxy": + case "Proxy": return target.getProxy(); + case "queryparams": + case "QueryParams": return target.getQueryParams(); + case "resourcepath": + case "ResourcePath": return target.getResourcePath(); + case "responsehandler": + case "ResponseHandler": return target.getResponseHandler(); + case "serviceuri": + case "ServiceUri": return target.getServiceUri(); + case "sockettimeout": + case "SocketTimeout": return target.getSocketTimeout(); + case "splitresult": + case "SplitResult": return target.isSplitResult(); + case "sslcontextparameters": + case "SslContextParameters": return target.getSslContextParameters(); + default: return null; + } + } +} + diff --git a/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/Olingo4ConfigurationConfigurer.java b/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/Olingo4ConfigurationConfigurer.java new file mode 100644 index 0000000..b0da7fb --- /dev/null +++ b/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/Olingo4ConfigurationConfigurer.java @@ -0,0 +1,105 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.olingo4; + +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.component.olingo4.Olingo4Configuration; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +public class Olingo4ConfigurationConfigurer 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.olingo4.Olingo4Configuration target = (org.apache.camel.component.olingo4.Olingo4Configuration) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "apiname": + case "ApiName": target.setApiName(property(camelContext, org.apache.camel.component.olingo4.internal.Olingo4ApiName.class, value)); return true; + case "connecttimeout": + case "ConnectTimeout": target.setConnectTimeout(property(camelContext, int.class, value)); return true; + case "contenttype": + case "ContentType": target.setContentType(property(camelContext, java.lang.String.class, value)); return true; + case "filteralreadyseen": + case "FilterAlreadySeen": target.setFilterAlreadySeen(property(camelContext, boolean.class, value)); return true; + case "httpasyncclientbuilder": + case "HttpAsyncClientBuilder": target.setHttpAsyncClientBuilder(property(camelContext, org.apache.http.impl.nio.client.HttpAsyncClientBuilder.class, value)); return true; + case "httpclientbuilder": + case "HttpClientBuilder": target.setHttpClientBuilder(property(camelContext, org.apache.http.impl.client.HttpClientBuilder.class, value)); return true; + case "httpheaders": + case "HttpHeaders": target.setHttpHeaders(property(camelContext, java.util.Map.class, value)); return true; + case "methodname": + case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true; + case "proxy": + case "Proxy": target.setProxy(property(camelContext, org.apache.http.HttpHost.class, value)); return true; + case "serviceuri": + case "ServiceUri": target.setServiceUri(property(camelContext, java.lang.String.class, value)); return true; + case "sockettimeout": + case "SocketTimeout": target.setSocketTimeout(property(camelContext, int.class, value)); return true; + case "splitresult": + case "SplitResult": target.setSplitResult(property(camelContext, boolean.class, value)); return true; + case "sslcontextparameters": + case "SslContextParameters": target.setSslContextParameters(property(camelContext, org.apache.camel.support.jsse.SSLContextParameters.class, value)); return true; + default: return false; + } + } + + @Override + public Map<String, Object> getAllOptions(Object target) { + Map<String, Object> answer = new CaseInsensitiveMap(); + answer.put("ApiName", org.apache.camel.component.olingo4.internal.Olingo4ApiName.class); + answer.put("ConnectTimeout", int.class); + answer.put("ContentType", java.lang.String.class); + answer.put("FilterAlreadySeen", boolean.class); + answer.put("HttpAsyncClientBuilder", org.apache.http.impl.nio.client.HttpAsyncClientBuilder.class); + answer.put("HttpClientBuilder", org.apache.http.impl.client.HttpClientBuilder.class); + answer.put("HttpHeaders", java.util.Map.class); + answer.put("MethodName", java.lang.String.class); + answer.put("Proxy", org.apache.http.HttpHost.class); + answer.put("ServiceUri", java.lang.String.class); + answer.put("SocketTimeout", int.class); + answer.put("SplitResult", boolean.class); + answer.put("SslContextParameters", org.apache.camel.support.jsse.SSLContextParameters.class); + return answer; + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + org.apache.camel.component.olingo4.Olingo4Configuration target = (org.apache.camel.component.olingo4.Olingo4Configuration) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "apiname": + case "ApiName": return target.getApiName(); + case "connecttimeout": + case "ConnectTimeout": return target.getConnectTimeout(); + case "contenttype": + case "ContentType": return target.getContentType(); + case "filteralreadyseen": + case "FilterAlreadySeen": return target.isFilterAlreadySeen(); + case "httpasyncclientbuilder": + case "HttpAsyncClientBuilder": return target.getHttpAsyncClientBuilder(); + case "httpclientbuilder": + case "HttpClientBuilder": return target.getHttpClientBuilder(); + case "httpheaders": + case "HttpHeaders": return target.getHttpHeaders(); + case "methodname": + case "MethodName": return target.getMethodName(); + case "proxy": + case "Proxy": return target.getProxy(); + case "serviceuri": + case "ServiceUri": return target.getServiceUri(); + case "sockettimeout": + case "SocketTimeout": return target.getSocketTimeout(); + case "splitresult": + case "SplitResult": return target.isSplitResult(); + case "sslcontextparameters": + case "SslContextParameters": return target.getSslContextParameters(); + default: return null; + } + } +} + diff --git a/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/internal/Olingo4ApiCollection.java b/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/internal/Olingo4ApiCollection.java new file mode 100644 index 0000000..9253a1b --- /dev/null +++ b/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/internal/Olingo4ApiCollection.java @@ -0,0 +1,59 @@ + +/* + * Camel ApiCollection generated by camel-api-component-maven-plugin + */ +package org.apache.camel.component.olingo4.internal; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.HashMap; + +import org.apache.camel.component.olingo4.Olingo4Configuration; +import org.apache.camel.component.olingo4.Olingo4AppEndpointConfiguration; + +import org.apache.camel.support.component.ApiCollection; +import org.apache.camel.support.component.ApiMethod; +import org.apache.camel.support.component.ApiMethodHelper; + +/** + * Camel {@link ApiCollection} for Olingo4 + */ +public final class Olingo4ApiCollection extends ApiCollection<Olingo4ApiName, Olingo4Configuration> { + + private static Olingo4ApiCollection collection; + + private Olingo4ApiCollection() { + final Map<String, String> aliases = new HashMap<String, String>(); + final Map<Olingo4ApiName, ApiMethodHelper<? extends ApiMethod>> apiHelpers = new HashMap<>(); + final Map<Class<? extends ApiMethod>, Olingo4ApiName> apiMethods = new HashMap<>(); + + List<String> nullableArgs; + + aliases.clear(); + nullableArgs = Arrays.asList("queryParams", "endpointHttpHeaders", "edm", "responseHandler", "data"); + apiHelpers.put(Olingo4ApiName.DEFAULT, new ApiMethodHelper<Olingo4AppApiMethod>(Olingo4AppApiMethod.class, aliases, nullableArgs)); + apiMethods.put(Olingo4AppApiMethod.class, Olingo4ApiName.DEFAULT); + + setApiHelpers(apiHelpers); + setApiMethods(apiMethods); + } + + public Olingo4Configuration getEndpointConfiguration(Olingo4ApiName apiName) { + Olingo4Configuration result = null; + switch (apiName) { + case DEFAULT: + result = new Olingo4AppEndpointConfiguration(); + break; + } + return result; + } + + public static synchronized Olingo4ApiCollection getCollection() { + if (collection == null) { + collection = new Olingo4ApiCollection(); + } + return collection; + } +} diff --git a/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/internal/Olingo4ApiName.java b/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/internal/Olingo4ApiName.java new file mode 100644 index 0000000..4e3aa2c --- /dev/null +++ b/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/internal/Olingo4ApiName.java @@ -0,0 +1,38 @@ + +/* + * Camel ApiName Enumeration generated by camel-api-component-maven-plugin + */ +package org.apache.camel.component.olingo4.internal; + +import org.apache.camel.support.component.ApiName; + +/** + * Camel {@link ApiName} Enumeration for Component Olingo4 + */ +public enum Olingo4ApiName implements ApiName { + + DEFAULT(""); + + + private static final Olingo4ApiName[] VALUES = values(); + + private final String name; + + private Olingo4ApiName(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } + + public static Olingo4ApiName fromValue(String value) throws IllegalArgumentException { + for (int i = 0; i < VALUES.length; i++) { + if (VALUES[i].name.equals(value)) { + return VALUES[i]; + } + } + throw new IllegalArgumentException("Invalid value " + value); + } +} diff --git a/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/internal/Olingo4AppApiMethod.java b/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/internal/Olingo4AppApiMethod.java new file mode 100644 index 0000000..736c9b5 --- /dev/null +++ b/components/camel-olingo4/camel-olingo4-component/src/generated/java/org/apache/camel/component/olingo4/internal/Olingo4AppApiMethod.java @@ -0,0 +1,123 @@ + +/* + * Camel ApiMethod Enumeration generated by camel-api-component-maven-plugin + */ +package org.apache.camel.component.olingo4.internal; + +import java.lang.reflect.Method; +import java.util.List; + +import org.apache.camel.component.olingo4.api.Olingo4App; + +import org.apache.camel.support.component.ApiMethod; +import org.apache.camel.support.component.ApiMethodArg; +import org.apache.camel.support.component.ApiMethodImpl; + +import static org.apache.camel.support.component.ApiMethodArg.arg; + +/** + * Camel {@link ApiMethod} Enumeration for org.apache.camel.component.olingo4.api.Olingo4App + */ +public enum Olingo4AppApiMethod implements ApiMethod { + + ACTION( + void.class, + "action", + arg("edm", org.apache.olingo.commons.api.edm.Edm.class), + arg("resourcePath", String.class), + arg("endpointHttpHeaders", java.util.Map.class), + arg("data", Object.class), + arg("responseHandler", org.apache.camel.component.olingo4.api.Olingo4ResponseHandler.class)), + + BATCH( + void.class, + "batch", + arg("edm", org.apache.olingo.commons.api.edm.Edm.class), + arg("endpointHttpHeaders", java.util.Map.class), + arg("data", Object.class), + arg("responseHandler", org.apache.camel.component.olingo4.api.Olingo4ResponseHandler.class)), + + CREATE( + void.class, + "create", + arg("edm", org.apache.olingo.commons.api.edm.Edm.class), + arg("resourcePath", String.class), + arg("endpointHttpHeaders", java.util.Map.class), + arg("data", Object.class), + arg("responseHandler", org.apache.camel.component.olingo4.api.Olingo4ResponseHandler.class)), + + DELETE( + void.class, + "delete", + arg("resourcePath", String.class), + arg("endpointHttpHeaders", java.util.Map.class), + arg("responseHandler", org.apache.camel.component.olingo4.api.Olingo4ResponseHandler.class)), + + MERGE( + void.class, + "merge", + arg("edm", org.apache.olingo.commons.api.edm.Edm.class), + arg("resourcePath", String.class), + arg("endpointHttpHeaders", java.util.Map.class), + arg("data", Object.class), + arg("responseHandler", org.apache.camel.component.olingo4.api.Olingo4ResponseHandler.class)), + + PATCH( + void.class, + "patch", + arg("edm", org.apache.olingo.commons.api.edm.Edm.class), + arg("resourcePath", String.class), + arg("endpointHttpHeaders", java.util.Map.class), + arg("data", Object.class), + arg("responseHandler", org.apache.camel.component.olingo4.api.Olingo4ResponseHandler.class)), + + READ( + void.class, + "read", + arg("edm", org.apache.olingo.commons.api.edm.Edm.class), + arg("resourcePath", String.class), + arg("queryParams", java.util.Map.class), + arg("endpointHttpHeaders", java.util.Map.class), + arg("responseHandler", org.apache.camel.component.olingo4.api.Olingo4ResponseHandler.class)), + + UPDATE( + void.class, + "update", + arg("edm", org.apache.olingo.commons.api.edm.Edm.class), + arg("resourcePath", String.class), + arg("endpointHttpHeaders", java.util.Map.class), + arg("data", Object.class), + arg("responseHandler", org.apache.camel.component.olingo4.api.Olingo4ResponseHandler.class)), + + UREAD( + void.class, + "uread", + arg("edm", org.apache.olingo.commons.api.edm.Edm.class), + arg("resourcePath", String.class), + arg("queryParams", java.util.Map.class), + arg("endpointHttpHeaders", java.util.Map.class), + arg("responseHandler", org.apache.camel.component.olingo4.api.Olingo4ResponseHandler.class)); + + + + private final ApiMethod apiMethod; + + private Olingo4AppApiMethod(Class<?> resultType, String name, ApiMethodArg... args) { + this.apiMethod = new ApiMethodImpl(Olingo4App.class, resultType, name, args); + } + + @Override + public String getName() { return apiMethod.getName(); } + + @Override + public Class<?> getResultType() { return apiMethod.getResultType(); } + + @Override + public List<String> getArgNames() { return apiMethod.getArgNames(); } + + @Override + public List<Class<?>> getArgTypes() { return apiMethod.getArgTypes(); } + + @Override + public Method getMethod() { return apiMethod.getMethod(); } +} diff --git a/components/camel-olingo4/camel-olingo4-component/src/generated/resources/META-INF/services/org/apache/camel/configurer/Olingo4AppEndpointConfiguration b/components/camel-olingo4/camel-olingo4-component/src/generated/resources/META-INF/services/org/apache/camel/configurer/Olingo4AppEndpointConfiguration new file mode 100644 index 0000000..620aaf5 --- /dev/null +++ b/components/camel-olingo4/camel-olingo4-component/src/generated/resources/META-INF/services/org/apache/camel/configurer/Olingo4AppEndpointConfiguration @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.olingo4.Olingo4AppEndpointConfigurationConfigurer diff --git a/components/camel-olingo4/camel-olingo4-component/src/generated/resources/META-INF/services/org/apache/camel/configurer/Olingo4Configuration b/components/camel-olingo4/camel-olingo4-component/src/generated/resources/META-INF/services/org/apache/camel/configurer/Olingo4Configuration new file mode 100644 index 0000000..0abb293 --- /dev/null +++ b/components/camel-olingo4/camel-olingo4-component/src/generated/resources/META-INF/services/org/apache/camel/configurer/Olingo4Configuration @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.olingo4.Olingo4ConfigurationConfigurer diff --git a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Configuration.java b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Configuration.java index 00007db..24a93a7 100644 --- a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Configuration.java +++ b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Configuration.java @@ -19,6 +19,7 @@ package org.apache.camel.component.olingo4; import java.util.Map; import org.apache.camel.component.olingo4.internal.Olingo4ApiName; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriParam; import org.apache.camel.spi.UriParams; @@ -34,6 +35,7 @@ import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; * Component configuration for Olingo4 component. */ @UriParams +@Configurer public class Olingo4Configuration { private static final String DEFAULT_CONTENT_TYPE = ContentType.APPLICATION_JSON.toString(); diff --git a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Endpoint.java b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Endpoint.java index dc64aaf..bf7fc09 100644 --- a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Endpoint.java +++ b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Endpoint.java @@ -72,7 +72,7 @@ public class Olingo4Endpoint extends AbstractApiEndpoint<Olingo4ApiName, Olingo4 this.configuration = endpointConfiguration; // get all endpoint property names - endpointPropertyNames = new HashSet<>(getPropertiesHelper().getValidEndpointProperties(configuration)); + endpointPropertyNames = new HashSet<>(getPropertiesHelper().getValidEndpointProperties(component.getCamelContext(), configuration)); // avoid adding edm as queryParam endpointPropertyNames.add(EDM_PROPERTY); endpointPropertyNames.add(ENDPOINT_HTTP_HEADERS_PROPERTY); @@ -103,7 +103,7 @@ public class Olingo4Endpoint extends AbstractApiEndpoint<Olingo4ApiName, Olingo4 @Override protected ApiMethodPropertiesHelper<Olingo4Configuration> getPropertiesHelper() { - return Olingo4PropertiesHelper.getHelper(); + return Olingo4PropertiesHelper.getHelper(getCamelContext()); } @Override diff --git a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Producer.java b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Producer.java index 37f0c01..21932a1 100644 --- a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Producer.java +++ b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Producer.java @@ -41,7 +41,7 @@ public class Olingo4Producer extends AbstractApiProducer<Olingo4ApiName, Olingo4 private Olingo4Index resultIndex; public Olingo4Producer(Olingo4Endpoint endpoint) { - super(endpoint, Olingo4PropertiesHelper.getHelper()); + super(endpoint, Olingo4PropertiesHelper.getHelper(endpoint.getCamelContext())); } @Override diff --git a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/internal/Olingo4PropertiesHelper.java b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/internal/Olingo4PropertiesHelper.java index 9ff4643..85fd20a 100644 --- a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/internal/Olingo4PropertiesHelper.java +++ b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/internal/Olingo4PropertiesHelper.java @@ -16,6 +16,7 @@ */ package org.apache.camel.component.olingo4.internal; +import org.apache.camel.CamelContext; import org.apache.camel.component.olingo4.Olingo4Configuration; import org.apache.camel.support.component.ApiMethodPropertiesHelper; @@ -26,13 +27,13 @@ public final class Olingo4PropertiesHelper extends ApiMethodPropertiesHelper<Oli private static Olingo4PropertiesHelper helper; - private Olingo4PropertiesHelper() { - super(Olingo4Configuration.class, Olingo4Constants.PROPERTY_PREFIX); + private Olingo4PropertiesHelper(CamelContext context) { + super(context, Olingo4Configuration.class, Olingo4Constants.PROPERTY_PREFIX); } - public static synchronized Olingo4PropertiesHelper getHelper() { + public static synchronized Olingo4PropertiesHelper getHelper(CamelContext context) { if (helper == null) { - helper = new Olingo4PropertiesHelper(); + helper = new Olingo4PropertiesHelper(context); } return helper; } diff --git a/core/camel-core/src/test/java/org/apache/camel/support/component/ApiMethodPropertiesHelperTest.java b/core/camel-core/src/test/java/org/apache/camel/support/component/ApiMethodPropertiesHelperTest.java index b3e6e17..5a57319 100644 --- a/core/camel-core/src/test/java/org/apache/camel/support/component/ApiMethodPropertiesHelperTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/support/component/ApiMethodPropertiesHelperTest.java @@ -44,7 +44,7 @@ public class ApiMethodPropertiesHelperTest { private static final String VALUE_4 = "true"; private static final String VALUE_5 = "CamelCaseValue"; - private static ApiMethodPropertiesHelper<TestComponentConfiguration> propertiesHelper = new ApiMethodPropertiesHelper<TestComponentConfiguration>(TestComponentConfiguration.class, + private static ApiMethodPropertiesHelper<TestComponentConfiguration> propertiesHelper = new ApiMethodPropertiesHelper<TestComponentConfiguration>(new DefaultCamelContext(), TestComponentConfiguration.class, TEST_PREFIX) { }; @@ -86,7 +86,7 @@ public class ApiMethodPropertiesHelperTest { @Test public void testGetValidEndpointProperties() throws Exception { - assertEquals(2, propertiesHelper.getValidEndpointProperties(new TestEndpointConfiguration()).size()); + assertEquals(2, propertiesHelper.getValidEndpointProperties(new DefaultCamelContext(), new TestEndpointConfiguration()).size()); } @SuppressWarnings("unused") diff --git a/core/camel-support/src/main/java/org/apache/camel/support/component/AbstractApiEndpoint.java b/core/camel-support/src/main/java/org/apache/camel/support/component/AbstractApiEndpoint.java index 10b8c8c..d18f8d2 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/component/AbstractApiEndpoint.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/component/AbstractApiEndpoint.java @@ -220,7 +220,7 @@ public abstract class AbstractApiEndpoint<E extends ApiName, T> public final void setInBody(String inBody) throws IllegalArgumentException { // validate property name ObjectHelper.notNull(inBody, "inBody"); - if (!getPropertiesHelper().getValidEndpointProperties(getConfiguration()).contains(inBody)) { + if (!getPropertiesHelper().getValidEndpointProperties(getCamelContext(), getConfiguration()).contains(inBody)) { throw new IllegalArgumentException("Unknown property " + inBody); } this.inBody = inBody; diff --git a/core/camel-support/src/main/java/org/apache/camel/support/component/ApiMethodPropertiesHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/component/ApiMethodPropertiesHelper.java index 8a5449e..229664f 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/component/ApiMethodPropertiesHelper.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/component/ApiMethodPropertiesHelper.java @@ -47,7 +47,7 @@ public abstract class ApiMethodPropertiesHelper<C> { private final int prefixLength; private final String camelCasePrefix; - protected ApiMethodPropertiesHelper(Class<C> componentConfiguration, String propertyPrefix) { + protected ApiMethodPropertiesHelper(CamelContext context, Class<C> componentConfiguration, String propertyPrefix) { this.componentConfigClass = componentConfiguration; this.propertyPrefix = propertyPrefix; @@ -59,8 +59,21 @@ public abstract class ApiMethodPropertiesHelper<C> { this.camelCasePrefix = null; } - for (Field field : componentConfiguration.getDeclaredFields()) { - componentConfigFields.add(field.getName()); + // use reflection free configurer (if possible) + PropertyConfigurer configurer = context.adapt(ExtendedCamelContext.class).getConfigurerResolver().resolvePropertyConfigurer(componentConfiguration.getSimpleName(), context); + if (configurer instanceof PropertyConfigurerGetter) { + PropertyConfigurerGetter getter = (PropertyConfigurerGetter) configurer; + Set<String> names = getter.getAllOptions(null).keySet(); + for (String name : names) { + // lower case the first letter which is what the properties map expects + String key = Character.toLowerCase(name.charAt(0)) + name.substring(1); + componentConfigFields.add(key); + } + } else { + // fallback to be reflection based + for (Field field : componentConfiguration.getDeclaredFields()) { + componentConfigFields.add(field.getName()); + } } } @@ -94,23 +107,24 @@ public abstract class ApiMethodPropertiesHelper<C> { public void getEndpointProperties(CamelContext context, Object endpointConfiguration, Map<String, Object> properties) { Set<String> names; + // TODO: Make this work PropertyConfigurer configurer = context.adapt(ExtendedCamelContext.class).getConfigurerResolver().resolvePropertyConfigurer(endpointConfiguration.getClass().getSimpleName(), context); // use reflection free configurer (if possible) - if (configurer instanceof PropertyConfigurerGetter) { - PropertyConfigurerGetter getter = (PropertyConfigurerGetter) configurer; - names = getter.getAllOptions(endpointConfiguration).keySet(); - for (String name : names) { - Object value = getter.getOptionValue(endpointConfiguration, name, true); - if (value != null) { - // lower case the first letter which is what the properties map expects - String key = Character.toLowerCase(name.charAt(0)) + name.substring(1); - properties.put(key, value); - } - } - } else { +// if (configurer instanceof PropertyConfigurerGetter) { +// PropertyConfigurerGetter getter = (PropertyConfigurerGetter) configurer; +// names = getter.getAllOptions(endpointConfiguration).keySet(); +// for (String name : names) { +// Object value = getter.getOptionValue(endpointConfiguration, name, true); +// if (value != null) { +// lower case the first letter which is what the properties map expects +// String key = Character.toLowerCase(name.charAt(0)) + name.substring(1); +// properties.put(key, value); +// } +// } +// } else { context.adapt(ExtendedCamelContext.class).getBeanIntrospection().getProperties(endpointConfiguration, properties, null, false); names = properties.keySet(); - } +// } // remove component config properties so we only have endpoint properties names.removeAll(componentConfigFields); LOG.debug("Found endpoint properties {}", names); @@ -122,10 +136,24 @@ public abstract class ApiMethodPropertiesHelper<C> { return Collections.unmodifiableSet(properties.keySet()); } - public Set<String> getValidEndpointProperties(Object endpointConfiguration) { + public Set<String> getValidEndpointProperties(CamelContext context, Object endpointConfiguration) { Set<String> fields = new HashSet<>(); - for (Field field : endpointConfiguration.getClass().getDeclaredFields()) { - fields.add(field.getName()); + + PropertyConfigurer configurer = context.adapt(ExtendedCamelContext.class).getConfigurerResolver().resolvePropertyConfigurer(endpointConfiguration.getClass().getSimpleName(), context); + // use reflection free configurer (if possible) + if (configurer instanceof PropertyConfigurerGetter) { + PropertyConfigurerGetter getter = (PropertyConfigurerGetter) configurer; + Set<String> names = getter.getAllOptions(endpointConfiguration).keySet(); + for (String name : names) { + // lower case the first letter which is what the properties map expects + String key = Character.toLowerCase(name.charAt(0)) + name.substring(1); + fields.add(key); + } + } else { + // fallback to use reflection + for (Field field : endpointConfiguration.getClass().getDeclaredFields()) { + fields.add(field.getName()); + } } return Collections.unmodifiableSet(fields); }