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/04/07 07:02:50 UTC

[camel] branch master updated: CAMEL-14626 : api maven plugin - Cannot load class (#3706)

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


The following commit(s) were added to refs/heads/master by this push:
     new 7fefaf9  CAMEL-14626 : api maven plugin - Cannot load <T> class (#3706)
7fefaf9 is described below

commit 7fefaf9feaaff48c3f9285a221aea1c50cedbde4
Author: Kirill Yankov <my...@gmail.com>
AuthorDate: Tue Apr 7 16:02:36 2020 +0900

    CAMEL-14626 : api maven plugin - Cannot load <T> class (#3706)
    
    * CAMEL-14626 : api maven plugin - Cannot load <T> class
    
    * improved parser to handle multiple generic args, fixed ignoring
---
 .../camel/support/component/ApiMethodParser.java   |  4 ++--
 .../maven/AbstractApiMethodGeneratorMojo.java      | 22 ++++++++++------------
 .../org/apache/camel/component/test/TestProxy.java |  5 +++++
 .../src/test/resources/test-proxy-signatures.txt   |  2 ++
 4 files changed, 19 insertions(+), 14 deletions(-)

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 522a602..bfa4fe1 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
@@ -38,7 +38,7 @@ public abstract class ApiMethodParser<T> {
     // also used by JavadocApiMethodGeneratorMojo
     public static final Pattern ARGS_PATTERN = Pattern.compile("\\s*([^<\\s]+)\\s*(<[^>]+>)?\\s+([^\\s,]+)\\s*,?");
 
-    private static final String METHOD_PREFIX = "^(\\s*(public|final|synchronized|native)\\s+)*(\\s*<[^>]>)?\\s*(\\S+)\\s+([^\\(]+\\s*)\\(";
+    private static final String METHOD_PREFIX = "^(\\s*(public|final|synchronized|native)\\s+)*(\\s*<((?!\\sextends\\s)[^>])+>)?\\s*(\\S+)\\s+([^\\(]+\\s*)\\(";
     private static final Pattern METHOD_PATTERN = Pattern.compile("\\s*([^<\\s]+)?\\s*(<[^>]+>)?(<(?<genericTypeParameterName>\\S+)\\s+extends\\s+"
             + "(?<genericTypeParameterUpperBound>\\S+)>\\s+(?<returnType>\\S+))?\\s+(\\S+)\\s*\\(\\s*(?<signature>[\\S\\s,]*)\\)\\s*;?\\s*");
 
@@ -105,7 +105,7 @@ public abstract class ApiMethodParser<T> {
             }
 
             // remove all modifiers and type parameters for method
-            signature = signature.replaceAll(METHOD_PREFIX, "$4 $5(");
+            signature = signature.replaceAll(METHOD_PREFIX, "$5 $6(");
             // remove all final modifiers for arguments
             signature = signature.replaceAll("(\\(|,\\s*)final\\s+", "$1");
             // remove all redundant spaces in generic parameters
diff --git a/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/AbstractApiMethodGeneratorMojo.java b/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/AbstractApiMethodGeneratorMojo.java
index 90e509a..a043d2d 100644
--- a/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/AbstractApiMethodGeneratorMojo.java
+++ b/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/AbstractApiMethodGeneratorMojo.java
@@ -326,7 +326,6 @@ public abstract class AbstractApiMethodGeneratorMojo extends AbstractApiMethodBa
 
             // Note: its ok to split, since we don't support parsing nested type arguments
             final String[] argTypes = typeArgs.split(",");
-            boolean ignore = false;
             final int nTypes = argTypes.length;
             int i = 0;
             for (String argType : argTypes) {
@@ -344,24 +343,23 @@ public abstract class AbstractApiMethodGeneratorMojo extends AbstractApiMethodBa
                         parameterizedType.append(
                             getCanonicalName(getProjectClassLoader().loadClass("java.lang." + argType)));
                     } catch (ClassNotFoundException e1) {
-                        log.warn("Ignoring type parameters <" + typeArgs + "> for argument " + argument.getName()
-                                 + ", unable to load parametric type argument " + argType, e1);
-                        ignore = true;
+                        parameterizedType.append("?");
+                        // if the length of the artType is 1, we think that it's variable type parameter (like T in List<T>)
+                        // not perfect solution, but should work in most of the cases
+                        if (argType.trim().length() > 1) {
+                            log.warn("Ignoring type parameters <" + typeArgs + "> for argument " + argument.getName()
+                                    + ", unable to load parametric type argument " + argType, e1);
+                        }
                     }
                 }
 
-                if (ignore) {
-                    // give up
-                    break;
-                } else if (++i < nTypes) {
+                if (++i < nTypes) {
                     parameterizedType.append(",");
                 }
             }
 
-            if (!ignore) {
-                parameterizedType.append('>');
-                canonicalName = parameterizedType.toString();
-            }
+            parameterizedType.append('>');
+            canonicalName = parameterizedType.toString();
         }
 
         return canonicalName;
diff --git a/tooling/maven/camel-api-component-maven-plugin/src/test/java/org/apache/camel/component/test/TestProxy.java b/tooling/maven/camel-api-component-maven-plugin/src/test/java/org/apache/camel/component/test/TestProxy.java
index 6fb1af9..47bedde 100644
--- a/tooling/maven/camel-api-component-maven-plugin/src/test/java/org/apache/camel/component/test/TestProxy.java
+++ b/tooling/maven/camel-api-component-maven-plugin/src/test/java/org/apache/camel/component/test/TestProxy.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.test;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 public class TestProxy {
     public String sayHi() {
@@ -58,6 +59,10 @@ public class TestProxy {
         return builder.toString();
     }
 
+    public final <K, V> String greetAll(Map<K, V> peopleMap) {
+        return null;
+    }
+
     public final String[] greetTimes(String name, int times) {
         final List<String> result = new ArrayList<>();
         for (int i = 0; i < times; i++) {
diff --git a/tooling/maven/camel-api-component-maven-plugin/src/test/resources/test-proxy-signatures.txt b/tooling/maven/camel-api-component-maven-plugin/src/test/resources/test-proxy-signatures.txt
index d9214f0..1d1b926 100644
--- a/tooling/maven/camel-api-component-maven-plugin/src/test/resources/test-proxy-signatures.txt
+++ b/tooling/maven/camel-api-component-maven-plugin/src/test/resources/test-proxy-signatures.txt
@@ -5,5 +5,7 @@ public final String greetMe(final String name);
 public final String greetUs(final String name1, String name2);
 public final String greetAll(String[] names);
 public final String greetAll(java.util.List<String> names);
+public final <T> String greetAll(java.util.List<T> people);
+public final <K, Vv> String greetAll(java.util.Map<K, Vv> peopleMap);
 public final String[] greetTimes(String name, int times);
 public final String greetInnerChild(org.apache.camel.component.test.TestProxy.InnerChild child);