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