This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch api in repository https://gitbox.apache.org/repos/asf/camel.git
commit 919fca17c8a41db340229c0e7dc7d39e6c11c2e4 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Tue Sep 15 16:26:17 2020 +0200 CAMEL-15478: api-component should generate @ApiParam with more fine grained details so we know which parameter is for which api method. --- .../org/apache/camel/maven/JavaSourceParser.java | 99 ++++++++++++++++------ .../apache/camel/component/test/OuterChild.java | 31 +++++++ .../org/apache/camel/component/test/TestProxy.java | 4 + .../apache/camel/maven/JavaSourceParserTest.java | 2 +- 4 files changed, 110 insertions(+), 26 deletions(-) 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 48351cc..ec95b10 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 @@ -123,42 +123,54 @@ public class JavaSourceParser { ParameterSource ps = list.get(i); String name = ps.getName(); String type = resolveType(rootClazz, clazz, ms, ps.getType()); - if (type.startsWith("java.lang.")) { - type = type.substring(10); - } - if (ps.isVarArgs() || ps.getType().isArray()) { - // the old way with javadoc did not use varargs in the signature, so lets transform this to an array style - type = type + "[]"; - } if (ps.getType().isParameterized()) { // for parameterized types then it can get complex if they are variables (T, T extends Foo etc) + // or if there are no bounds for these types which we then can't resolve. List<Type> types = ps.getType().getTypeArguments(); - hasTypeVariables = false; + boolean bounds = false; + boolean found = false; for (Type t : types) { - hasTypeVariables |= ms.hasTypeVariable(t.getName()) || clazz.hasTypeVariable(t.getName()); + if (hasTypeVariableBounds(ms, clazz, t.getName())) { + bounds = true; + // okay now it gets complex as we have a type like T which is a type variable and we need to resolve that into + // what base class that is + String tn = resolveTypeVariable(ms, clazz, t.getName()); + if (tn != null) { + type = type.replace(t.getName(), tn); + found = true; + } + } + } + if (!bounds && !found) { + // argh this is getting complex, it may be T or just java.lang.String but this **** generics and roaster + // does not make this easy, so let see if we can resolve each type variable + boolean fqn = types.stream().allMatch(t -> { + // okay lets assume its a type variable if the name is upper case only + boolean upperOnly = isUpperCaseOnly(t.getName()); + return !upperOnly && t.getQualifiedName().indexOf('.') != -1; + }); + if (!fqn) { + // remove generics we could not resolve that even if we have bounds information + bounds = true; + found = false; + } } - if (hasTypeVariables) { - // okay this gets to complex then remove the generics + if (bounds && !found) { + // remove generics we could not resolve that even if we have bounds information type = ps.getType().getQualifiedName(); } } else if (ms.hasTypeVariable(type) || clazz.hasTypeVariable(type)) { // okay now it gets complex as we have a type like T which is a type variable and we need to resolve that into // what base class that is - TypeVariable tv = ms.getTypeVariable(type); - if (tv == null) { - tv = clazz.getTypeVariable(type); - } - List<Type> bounds = tv.getBounds(); - for (Type bt : bounds) { - String bn = bt.getQualifiedName(); - if (!type.equals(bn)) { - type = bn; - break; - } - } + type = resolveTypeVariable(ms, clazz, type); + } + if (ps.isVarArgs() || ps.getType().isArray()) { + // the old way with javadoc did not use varargs in the signature, so lets transform this to an array style + type = type + "[]"; + } + if (type.startsWith("java.lang.")) { + type = type.substring(10); } - // remove java.lang. prefix as it should not be there - type = type.replaceAll("java.lang.", ""); sb.append(type); sb.append(" ").append(name); @@ -186,6 +198,43 @@ public class JavaSourceParser { } } + private static boolean isUpperCaseOnly(String name) { + for (int i = 0; i < name.length(); i++) { + if (!Character.isUpperCase(name.charAt(i))) { + return false; + } + } + return true; + } + + private static boolean hasTypeVariableBounds(MethodSource ms, AbstractGenericCapableJavaSource clazz, String type) { + TypeVariable tv = ms.getTypeVariable(type); + if (tv == null) { + tv = clazz.getTypeVariable(type); + } + if (tv != null) { + return !tv.getBounds().isEmpty(); + } + return false; + } + + private static String resolveTypeVariable(MethodSource ms, AbstractGenericCapableJavaSource clazz, String type) { + TypeVariable tv = ms.getTypeVariable(type); + if (tv == null) { + tv = clazz.getTypeVariable(type); + } + if (tv != null) { + List<Type> bounds = tv.getBounds(); + for (Type bt : bounds) { + String bn = bt.getQualifiedName(); + if (!type.equals(bn)) { + return bn; + } + } + } + return null; + } + private static AbstractGenericCapableJavaSource findInnerClass( AbstractGenericCapableJavaSource rootClazz, String innerClass) { String[] parts = innerClass.split("\\$"); diff --git a/tooling/maven/camel-api-component-maven-plugin/src/test/java/org/apache/camel/component/test/OuterChild.java b/tooling/maven/camel-api-component-maven-plugin/src/test/java/org/apache/camel/component/test/OuterChild.java new file mode 100644 index 0000000..faf2e72 --- /dev/null +++ b/tooling/maven/camel-api-component-maven-plugin/src/test/java/org/apache/camel/component/test/OuterChild.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.test; + +public class OuterChild { + + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} 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 ea94d23..fd7eae4 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 @@ -104,6 +104,10 @@ public class TestProxy { return result.toArray(new String[result.size()]); } + public final <K extends OuterChild> String damnGenerics(K someStuff) { + return null; + } + public final String greetInnerChild(InnerChild child) { return sayHi(child.getName()); } diff --git a/tooling/maven/camel-api-component-maven-plugin/src/test/java/org/apache/camel/maven/JavaSourceParserTest.java b/tooling/maven/camel-api-component-maven-plugin/src/test/java/org/apache/camel/maven/JavaSourceParserTest.java index 52b7125..0f5a111 100644 --- a/tooling/maven/camel-api-component-maven-plugin/src/test/java/org/apache/camel/maven/JavaSourceParserTest.java +++ b/tooling/maven/camel-api-component-maven-plugin/src/test/java/org/apache/camel/maven/JavaSourceParserTest.java @@ -77,7 +77,7 @@ public class JavaSourceParserTest { final JavaSourceParser parser = new JavaSourceParser(); parser.parse(new FileInputStream("src/test/java/org/apache/camel/component/test/TestProxy.java"), null); - assertEquals(10, parser.getMethods().size()); + assertEquals(11, parser.getMethods().size()); // varargs is transformed to an array type as that is what works assertEquals(