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/07 14:46:52 UTC

[camel] 01/07: CAMEL-15478: javasource parser can parse inner classes

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 975a3da63ed74815a42599c6769814a28d27b143
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Sep 7 10:13:26 2020 +0200

    CAMEL-15478: javasource parser can parse inner classes
---
 .../maven/JavaSourceApiMethodGeneratorMojo.java    |  4 ++-
 .../org/apache/camel/maven/JavaSourceParser.java   | 15 ++++++++-
 .../apache/camel/component/test/NestedProxy.java   | 36 ++++++++++++++++++++++
 .../apache/camel/maven/JavaSourceParserTest.java   | 23 +++++++++++---
 4 files changed, 72 insertions(+), 6 deletions(-)

diff --git a/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/JavaSourceApiMethodGeneratorMojo.java b/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/JavaSourceApiMethodGeneratorMojo.java
index c976e55..3950b88 100644
--- a/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/JavaSourceApiMethodGeneratorMojo.java
+++ b/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/JavaSourceApiMethodGeneratorMojo.java
@@ -80,8 +80,10 @@ public class JavaSourceApiMethodGeneratorMojo extends AbstractApiMethodGenerator
 
             log.debug("Processing " + aClass.getName());
             String sourcePath = aClass.getName();
+            String nestedClass = null;
             int pos = sourcePath.indexOf('$');
             if (pos != -1) {
+                nestedClass = sourcePath.substring(pos + 1);
                 sourcePath = sourcePath.substring(0, pos);
             }
             sourcePath = sourcePath.replace('.', '/') + ".java";
@@ -95,7 +97,7 @@ public class JavaSourceApiMethodGeneratorMojo extends AbstractApiMethodGenerator
                 }
 
                 JavaSourceParser parser = new JavaSourceParser();
-                parser.parse(inputStream);
+                parser.parse(inputStream, nestedClass);
 
                 // look for parse errors
                 final String parseError = parser.getErrorMessage();
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 ad27999..57eee7f 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
@@ -28,6 +28,7 @@ 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.JavaSource;
 import org.jboss.forge.roaster.model.source.MethodSource;
 import org.jboss.forge.roaster.model.source.ParameterSource;
 import org.jboss.forge.roaster.model.source.TypeVariableSource;
@@ -44,9 +45,21 @@ public class JavaSourceParser {
     private Map<String, Map<String, String>> parameters = new LinkedHashMap<>();
     private String errorMessage;
 
-    public synchronized void parse(InputStream in) throws Exception {
+    public synchronized void parse(InputStream in, String innerClass) throws Exception {
         JavaClassSource clazz = (JavaClassSource) Roaster.parse(in);
 
+        if (innerClass != null) {
+            // we want the inner class from the parent class
+            JavaSource nested = clazz.getNestedType(innerClass);
+            if (nested instanceof JavaClassSource) {
+                clazz = (JavaClassSource) nested;
+            }
+            if (nested == null) {
+                errorMessage = "Cannot find inner class " + innerClass + " in class: " + clazz.getQualifiedName();
+                return;
+            }
+        }
+
         for (MethodSource ms : clazz.getMethods()) {
             // should not be constructor and must be public
             if (!ms.isPublic() || ms.isConstructor()) {
diff --git a/tooling/maven/camel-api-component-maven-plugin/src/test/java/org/apache/camel/component/test/NestedProxy.java b/tooling/maven/camel-api-component-maven-plugin/src/test/java/org/apache/camel/component/test/NestedProxy.java
new file mode 100644
index 0000000..cceddab
--- /dev/null
+++ b/tooling/maven/camel-api-component-maven-plugin/src/test/java/org/apache/camel/component/test/NestedProxy.java
@@ -0,0 +1,36 @@
+/*
+ * 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 NestedProxy {
+
+    public Order order() {
+        return new Order();
+    }
+
+    public static class Order {
+
+        /**
+         * Gets the order by the given id
+         *
+         * @param id the order id
+         */
+        public String getOrderById(int id) {
+            return "123";
+        }
+    }
+}
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 195c6cd..2bad48b 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
@@ -31,7 +31,7 @@ public class JavaSourceParserTest {
     public void testGetMethodsAddress() throws Exception {
         final JavaSourceParser parser = new JavaSourceParser();
 
-        parser.parse(JavaSourceParserTest.class.getResourceAsStream("/AddressGateway.java"));
+        parser.parse(JavaSourceParserTest.class.getResourceAsStream("/AddressGateway.java"), null);
         assertEquals(4, parser.getMethods().size());
 
         assertEquals(
@@ -49,7 +49,7 @@ public class JavaSourceParserTest {
     public void testGetMethodsCustomer() throws Exception {
         final JavaSourceParser parser = new JavaSourceParser();
 
-        parser.parse(JavaSourceParserTest.class.getResourceAsStream("/CustomerGateway.java"));
+        parser.parse(JavaSourceParserTest.class.getResourceAsStream("/CustomerGateway.java"), null);
         assertEquals(7, parser.getMethods().size());
 
         assertEquals(
@@ -66,7 +66,7 @@ public class JavaSourceParserTest {
     public void testGetMethodsDispute() throws Exception {
         final JavaSourceParser parser = new JavaSourceParser();
 
-        parser.parse(JavaSourceParserTest.class.getResourceAsStream("/DisputeGateway.java"));
+        parser.parse(JavaSourceParserTest.class.getResourceAsStream("/DisputeGateway.java"), null);
         assertEquals(9, parser.getMethods().size());
 
         assertEquals(
@@ -83,7 +83,7 @@ public class JavaSourceParserTest {
     public void testWildcard() throws Exception {
         final JavaSourceParser parser = new JavaSourceParser();
 
-        parser.parse(new FileInputStream("src/test/java/org/apache/camel/component/test/TestProxy.java"));
+        parser.parse(new FileInputStream("src/test/java/org/apache/camel/component/test/TestProxy.java"), null);
         assertEquals(11, parser.getMethods().size());
 
         // varargs is transformed to an array type as that is what works
@@ -93,4 +93,19 @@ public class JavaSourceParserTest {
         parser.reset();
     }
 
+    @Test
+    public void testNested() throws Exception {
+        final JavaSourceParser parser = new JavaSourceParser();
+
+        parser.parse(new FileInputStream("src/test/java/org/apache/camel/component/test/NestedProxy.java"), "Order");
+        assertEquals(1, parser.getMethods().size());
+
+        assertEquals(
+                "public java.lang.String getOrderById(int id)",
+                parser.getMethods().get(0));
+        assertEquals(1, parser.getParameters().get("getOrderById").size());
+        assertEquals("The order id", parser.getParameters().get("getOrderById").get("id"));
+        parser.reset();
+    }
+
 }