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);
     }

Reply via email to