You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/09/06 10:38:42 UTC

[camel] 03/04: CAMEL-15478: Fix and improve java source parser to include FQN types for parameter types that has generics or type arguments

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 1840e282833ab7117384e6e30096f3576f4bae74
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun Sep 6 12:34:03 2020 +0200

    CAMEL-15478: Fix and improve java source parser to include FQN types for parameter types that has generics or type arguments
---
 components/camel-zendesk/pom.xml                   |  2 +-
 .../zendesk/ZendeskEndpointConfiguration.java      |  2 +-
 .../zendesk/internal/ZendeskApiMethod.java         |  4 ---
 .../apache/camel/component/zendesk/zendesk.json    |  2 +-
 .../src/main/docs/zendesk-component.adoc           |  2 +-
 .../camel/support/component/ApiMethodParser.java   |  2 +-
 .../org/apache/camel/maven/JavaSourceParser.java   | 33 +++++++++++++++++++++-
 7 files changed, 37 insertions(+), 10 deletions(-)

diff --git a/components/camel-zendesk/pom.xml b/components/camel-zendesk/pom.xml
index 5e3478d..93472ab 100644
--- a/components/camel-zendesk/pom.xml
+++ b/components/camel-zendesk/pom.xml
@@ -84,7 +84,7 @@
                                     <apiName />
                                     <proxyClass>org.zendesk.client.v2.Zendesk</proxyClass>
                                     <fromJavasource>
-                                        <excludeMethods>isClosed|close|getTicketsByStatus|createGroups|importTickets
+                                        <excludeMethods>isClosed|close|getTicketsByStatus|createGroups|importTickets|createMappe
                                         </excludeMethods>
                                     </fromJavasource>
                                     <substitutions>
diff --git a/components/camel-zendesk/src/generated/java/org/apache/camel/component/zendesk/ZendeskEndpointConfiguration.java b/components/camel-zendesk/src/generated/java/org/apache/camel/component/zendesk/ZendeskEndpointConfiguration.java
index e46c62f..ad4a9a0 100644
--- a/components/camel-zendesk/src/generated/java/org/apache/camel/component/zendesk/ZendeskEndpointConfiguration.java
+++ b/components/camel-zendesk/src/generated/java/org/apache/camel/component/zendesk/ZendeskEndpointConfiguration.java
@@ -12,7 +12,7 @@ import org.apache.camel.spi.UriParams;
 /**
  * Camel EndpointConfiguration for org.zendesk.client.v2.Zendesk
  */
-@ApiParams(apiName = "DEFAULT", apiMethods = "addTagToOrganisations,addTagToTicket,addTagToTopics,createArticle,createArticleTranslation,createAutomation,createCategory,createCategoryTranslation,createComment,createDynamicContentItem,createDynamicContentItemVariant,createForum,createGroup,createGroupMembership,createMacro,createMapper,createOrUpdateUser,createOrUpdateUsers,createOrUpdateUsersAsync,createOrganization,createOrganizationMembership,createOrganizationMemberships,createOrganiz [...]
+@ApiParams(apiName = "DEFAULT", apiMethods = "addTagToOrganisations,addTagToTicket,addTagToTopics,createArticle,createArticleTranslation,createAutomation,createCategory,createCategoryTranslation,createComment,createDynamicContentItem,createDynamicContentItemVariant,createForum,createGroup,createGroupMembership,createMacro,createOrUpdateUser,createOrUpdateUsers,createOrUpdateUsersAsync,createOrganization,createOrganizationMembership,createOrganizationMemberships,createOrganizationMembersh [...]
 @UriParams
 @Configurer
 public final class ZendeskEndpointConfiguration extends ZendeskConfiguration {
diff --git a/components/camel-zendesk/src/generated/java/org/apache/camel/component/zendesk/internal/ZendeskApiMethod.java b/components/camel-zendesk/src/generated/java/org/apache/camel/component/zendesk/internal/ZendeskApiMethod.java
index 430b1f9..6955d2d 100644
--- a/components/camel-zendesk/src/generated/java/org/apache/camel/component/zendesk/internal/ZendeskApiMethod.java
+++ b/components/camel-zendesk/src/generated/java/org/apache/camel/component/zendesk/internal/ZendeskApiMethod.java
@@ -114,10 +114,6 @@ public enum ZendeskApiMethod implements ApiMethod {
         "createMacro",
         arg("macro", org.zendesk.client.v2.model.Macro.class)),
 
-    CREATE_MAPPER(
-        com.fasterxml.jackson.databind.ObjectMapper.class,
-        "createMapper"),
-
     CREATE_OR_UPDATE_USER(
         org.zendesk.client.v2.model.User.class,
         "createOrUpdateUser",
diff --git a/components/camel-zendesk/src/generated/resources/org/apache/camel/component/zendesk/zendesk.json b/components/camel-zendesk/src/generated/resources/org/apache/camel/component/zendesk/zendesk.json
index b96cf8e..cb4720c 100644
--- a/components/camel-zendesk/src/generated/resources/org/apache/camel/component/zendesk/zendesk.json
+++ b/components/camel-zendesk/src/generated/resources/org/apache/camel/component/zendesk/zendesk.json
@@ -35,7 +35,7 @@
     "username": { "kind": "property", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "description": "The user name." }
   },
   "properties": {
-    "methodName": { "kind": "path", "displayName": "Method Name", "group": "common", "label": "", "required": true, "type": "object", "javaType": "org.apache.camel.component.zendesk.internal.ZendeskApiMethod", "enum": [ "ADD_TAG_TO_ORGANISATIONS", "ADD_TAG_TO_TICKET", "ADD_TAG_TO_TOPICS", "CREATE_ARTICLE", "CREATE_ARTICLE_1", "CREATE_ARTICLE_TRANSLATION", "CREATE_AUTOMATION", "CREATE_CATEGORY", "CREATE_CATEGORY_TRANSLATION", "CREATE_COMMENT", "CREATE_DYNAMIC_CONTENT_ITEM", "CREATE_DYNAMI [...]
+    "methodName": { "kind": "path", "displayName": "Method Name", "group": "common", "label": "", "required": true, "type": "object", "javaType": "org.apache.camel.component.zendesk.internal.ZendeskApiMethod", "enum": [ "ADD_TAG_TO_ORGANISATIONS", "ADD_TAG_TO_TICKET", "ADD_TAG_TO_TOPICS", "CREATE_ARTICLE", "CREATE_ARTICLE_1", "CREATE_ARTICLE_TRANSLATION", "CREATE_AUTOMATION", "CREATE_CATEGORY", "CREATE_CATEGORY_TRANSLATION", "CREATE_COMMENT", "CREATE_DYNAMIC_CONTENT_ITEM", "CREATE_DYNAMI [...]
     "inBody": { "kind": "parameter", "displayName": "In Body", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Sets the name of a parameter to be passed in the exchange In Body" },
     "serverUrl": { "kind": "parameter", "displayName": "Server Url", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.zendesk.ZendeskConfiguration", "configurationField": "configuration", "description": "The server URL to connect." },
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled b [...]
diff --git a/components/camel-zendesk/src/main/docs/zendesk-component.adoc b/components/camel-zendesk/src/main/docs/zendesk-component.adoc
index 284bdcc..80ff5a4 100644
--- a/components/camel-zendesk/src/main/docs/zendesk-component.adoc
+++ b/components/camel-zendesk/src/main/docs/zendesk-component.adoc
@@ -65,7 +65,7 @@ with the following path and query parameters:
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *methodName* | *Required* What operation to use. There are 283 enums and the value can be one of: ADD_TAG_TO_ORGANISATIONS, ADD_TAG_TO_TICKET, ADD_TAG_TO_TOPICS, CREATE_ARTICLE, CREATE_ARTICLE_1, CREATE_ARTICLE_TRANSLATION, CREATE_AUTOMATION, CREATE_CATEGORY, CREATE_CATEGORY_TRANSLATION, CREATE_COMMENT, CREATE_DYNAMIC_CONTENT_ITEM, CREATE_DYNAMIC_CONTENT_ITEM_VARIANT, CREATE_FORUM, CREATE_GROUP, CREATE_GROUP_MEMBERSHIP, CREATE_GROUP_MEMBERSHIP_1, CREATE_MACRO, CREATE_MAPPER, CREATE_OR_ [...]
+| *methodName* | *Required* What operation to use. There are 282 enums and the value can be one of: ADD_TAG_TO_ORGANISATIONS, ADD_TAG_TO_TICKET, ADD_TAG_TO_TOPICS, CREATE_ARTICLE, CREATE_ARTICLE_1, CREATE_ARTICLE_TRANSLATION, CREATE_AUTOMATION, CREATE_CATEGORY, CREATE_CATEGORY_TRANSLATION, CREATE_COMMENT, CREATE_DYNAMIC_CONTENT_ITEM, CREATE_DYNAMIC_CONTENT_ITEM_VARIANT, CREATE_FORUM, CREATE_GROUP, CREATE_GROUP_MEMBERSHIP, CREATE_GROUP_MEMBERSHIP_1, CREATE_MACRO, CREATE_OR_UPDATE_USER, CR [...]
 |===
 
 
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/component/ApiMethodParser.java b/core/camel-support/src/main/java/org/apache/camel/support/component/ApiMethodParser.java
index 3943fd9..248e15e 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/component/ApiMethodParser.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/component/ApiMethodParser.java
@@ -148,7 +148,7 @@ public abstract class ApiMethodParser<T> {
             // void is not a valid return type
             String rt = returnType != null ? returnType : methodMatcher.group(1);
             // use Object as return type which is what the existing behaviour was using
-            final Class<?> resultType = !"void".equals(rt) ? forName(rt) : Object.class;
+            final Class<?> resultType = !"void".equals(rt) ? forName(rt) : void.class;
             final String name = methodMatcher.group(7);
             final String argSignature = methodMatcher.group(8);
 
diff --git a/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/JavaSourceParser.java b/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/JavaSourceParser.java
index 592e423..54bfe87 100644
--- a/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/JavaSourceParser.java
+++ b/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/JavaSourceParser.java
@@ -22,12 +22,15 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.StringJoiner;
 
 import org.jboss.forge.roaster.Roaster;
 import org.jboss.forge.roaster.model.JavaDocTag;
+import org.jboss.forge.roaster.model.Type;
 import org.jboss.forge.roaster.model.source.JavaClassSource;
 import org.jboss.forge.roaster.model.source.MethodSource;
 import org.jboss.forge.roaster.model.source.ParameterSource;
+import org.jboss.forge.roaster.model.source.TypeVariableSource;
 
 import static org.apache.camel.tooling.util.JavadocHelper.sanitizeDescription;
 
@@ -74,7 +77,7 @@ public class JavaSourceParser {
                 for (int i = 0; i < list.size(); i++) {
                     ParameterSource ps = list.get(i);
                     String name = ps.getName();
-                    String type = resolveType(clazz, ps.getType().getQualifiedNameWithGenerics());
+                    String type = resolveType(clazz, ms, ps.getType());
                     if (type.startsWith("java.lang.")) {
                         type = type.substring(10);
                     }
@@ -107,6 +110,34 @@ public class JavaSourceParser {
         }
     }
 
+    private static String resolveType(JavaClassSource clazz, MethodSource ms, Type type) {
+        String name = type.getName();
+        // if the type is from a type variable (eg T extends Foo generic style)
+        // then the type should be returned as-is
+        TypeVariableSource tv = ms.getTypeVariable(name);
+        if (tv == null) {
+            clazz.getTypeVariable(name);
+        }
+        if (tv != null) {
+            return type.getName();
+        }
+
+        String answer = resolveType(clazz, name);
+        List<Type> types = type.getTypeArguments();
+        if (!types.isEmpty()) {
+            if (type.isArray()) {
+                answer = type.getQualifiedNameWithGenerics();
+            } else {
+                StringJoiner sj = new StringJoiner(", ");
+                for (Type arg : types) {
+                    sj.add(resolveType(clazz, ms, arg));
+                }
+                answer = answer + "<" + sj.toString() + ">";
+            }
+        }
+        return answer;
+    }
+
     private static String resolveType(JavaClassSource clazz, String type) {
         if ("void".equals(type)) {
             return "void";