You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by dh...@apache.org on 2014/06/20 23:09:33 UTC
[2/2] git commit: Fixed APIMethodParser to support generic class
parameters with multiple type arguments, e.g. Map,
added tests for same
Fixed APIMethodParser to support generic class parameters with multiple type arguments, e.g. Map<String, String>, added tests for same
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/909077a1
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/909077a1
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/909077a1
Branch: refs/heads/master
Commit: 909077a133eff456355aad8fc73283d62cb2060c
Parents: 7616b43
Author: Dhiraj Bokde <dh...@yahoo.com>
Authored: Fri Jun 20 13:41:35 2014 -0700
Committer: Dhiraj Bokde <dh...@yahoo.com>
Committed: Fri Jun 20 14:09:20 2014 -0700
----------------------------------------------------------------------
.../camel/util/component/ApiMethodParser.java | 40 ++++++++------------
.../util/component/ApiMethodHelperTest.java | 24 +++++++++++-
.../ArgumentSubstitutionParserTest.java | 20 ++++++----
.../apache/camel/util/component/TestProxy.java | 12 ++++++
4 files changed, 62 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/909077a1/camel-core/src/main/java/org/apache/camel/util/component/ApiMethodParser.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/util/component/ApiMethodParser.java b/camel-core/src/main/java/org/apache/camel/util/component/ApiMethodParser.java
index c5331be..f545202 100644
--- a/camel-core/src/main/java/org/apache/camel/util/component/ApiMethodParser.java
+++ b/camel-core/src/main/java/org/apache/camel/util/component/ApiMethodParser.java
@@ -35,10 +35,12 @@ import org.slf4j.LoggerFactory;
*/
public abstract class ApiMethodParser<T> {
- private static final String METHOD_PREFIX = "^(\\s*(public|final|synchronized|native)\\s+)*(\\s*<[^\\>]>)?\\s*(\\S+)\\s+([^\\(]+\\s*)\\(";
- private static final Pattern METHOD_PATTERN = Pattern.compile("\\s*(\\S+)\\s+(\\S+)\\s*\\(\\s*([\\S\\s,]*)\\)\\s*;?\\s*");
- private static final Pattern ARGS_PATTERN = Pattern.compile("\\s*(\\S+)\\s+([^\\s,]+)\\s*,?");
- private static final Pattern GENERIC_ARG_PATTERN = Pattern.compile("(\\S+)<([^>]+)>");
+ // 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 Pattern METHOD_PATTERN = Pattern.compile("\\s*([^<\\s]+)\\s*(<[^>]+>)?\\s+(\\S+)\\s*\\(\\s*([\\S\\s,]*)\\)\\s*;?\\s*");
+
private static final String JAVA_LANG = "java.lang.";
private static final Map<String, Class> PRIMITIVE_TYPES;
@@ -110,32 +112,22 @@ public abstract class ApiMethodParser<T> {
throw new IllegalArgumentException("Invalid method signature " + signature);
}
- // drop any generic type parameters in result, if any
- final String resultTypeWithArgs = methodMatcher.group(1);
- final Matcher resultMatcher = GENERIC_ARG_PATTERN.matcher(resultTypeWithArgs);
- final Class<?> resultType = (resultMatcher.matches()) ?
- forName(resultMatcher.group(1)) : forName(resultTypeWithArgs);
-
- final String name = methodMatcher.group(2);
- final String argSignature = methodMatcher.group(3);
+ // ignore generic type parameters in result, if any
+ final Class<?> resultType = forName(methodMatcher.group(1));
+ final String name = methodMatcher.group(3);
+ final String argSignature = methodMatcher.group(4);
final List<Argument> arguments = new ArrayList<Argument>();
+ final List<Class<?>> argTypes = new ArrayList<Class<?>>();
- List<Class<?>> argTypes = new ArrayList<Class<?>>();
final Matcher argsMatcher = ARGS_PATTERN.matcher(argSignature);
while (argsMatcher.find()) {
- final String argTypeWithParams = argsMatcher.group(1);
- final Matcher genericMatcher = GENERIC_ARG_PATTERN.matcher(argTypeWithParams);
- Class<?> type;
- String typeArgs = null;
- if (genericMatcher.matches()) {
- type = forName(genericMatcher.group(1));
- typeArgs = genericMatcher.group(2);
- } else {
- type = forName(argTypeWithParams);
- }
- arguments.add(new Argument(argsMatcher.group(2), type, typeArgs));
+
+ final Class<?> type = forName(argsMatcher.group(1));
argTypes.add(type);
+
+ final String typeArgs = argsMatcher.group(2) != null ? argsMatcher.group(2).replaceAll(" ", "") : null;
+ arguments.add(new Argument(argsMatcher.group(3), type, typeArgs));
}
Method method;
http://git-wip-us.apache.org/repos/asf/camel/blob/909077a1/camel-core/src/test/java/org/apache/camel/util/component/ApiMethodHelperTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/util/component/ApiMethodHelperTest.java b/camel-core/src/test/java/org/apache/camel/util/component/ApiMethodHelperTest.java
index 93597aa..38994d6 100644
--- a/camel-core/src/test/java/org/apache/camel/util/component/ApiMethodHelperTest.java
+++ b/camel-core/src/test/java/org/apache/camel/util/component/ApiMethodHelperTest.java
@@ -22,9 +22,12 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
-import org.junit.Test;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
public class ApiMethodHelperTest {
@@ -53,6 +56,9 @@ public class ApiMethodHelperTest {
methods = apiMethodHelper.getCandidateMethods("greetUs", "name1");
assertEquals("Can't find greetUs(name1, name2)", 1, methods.size());
+
+ methods = apiMethodHelper.getCandidateMethods("greetAll", "nameMap");
+ assertEquals("Can't find greetAll(nameMap)", 1, methods.size());
}
@Test
@@ -81,6 +87,7 @@ public class ApiMethodHelperTest {
assertEquals("GetArguments failed for hi", 2, apiMethodHelper.getArguments("hi").size());
assertEquals("GetArguments failed for greetMe", 2, apiMethodHelper.getArguments("greetMe").size());
assertEquals("GetArguments failed for greetUs", 4, apiMethodHelper.getArguments("greetUs").size());
+ assertEquals("GetArguments failed for greetAll", 6, apiMethodHelper.getArguments("greetAll").size());
}
@Test
@@ -101,7 +108,7 @@ public class ApiMethodHelperTest {
@Test
public void testAllArguments() throws Exception {
- assertEquals("Get all arguments", 6, apiMethodHelper.allArguments().size());
+ assertEquals("Get all arguments", 7, apiMethodHelper.allArguments().size());
}
@Test
@@ -109,6 +116,7 @@ public class ApiMethodHelperTest {
assertEquals("Get type name", String.class, apiMethodHelper.getType("name"));
assertEquals("Get type name1", String.class, apiMethodHelper.getType("name1"));
assertEquals("Get type name2", String.class, apiMethodHelper.getType("name2"));
+ assertEquals("Get type nameMap", Map.class, apiMethodHelper.getType("nameMap"));
}
@Test
@@ -137,6 +145,17 @@ public class ApiMethodHelperTest {
properties.put("names", new String[] {"Dave", "Frank"});
assertEquals("greetAll(names)", "Greetings Dave, Frank", ApiMethodHelper.invokeMethod(proxy, TestMethod.GREETALL, properties));
+ properties.clear();
+ Map<String, String> nameMap = new HashMap<String, String>();
+ nameMap.put("Dave", "Hello");
+ nameMap.put("Frank", "Goodbye");
+ properties.put("nameMap", nameMap);
+ final Map<String, String> result = (Map<String, String>) ApiMethodHelper.invokeMethod(proxy, TestMethod.GREETALL_2, properties);
+ assertNotNull("greetAll(nameMap)", result);
+ for (Map.Entry<String, String> entry : result.entrySet()) {
+ assertTrue("greetAll(nameMap)", entry.getValue().endsWith(entry.getKey()));
+ }
+
// test with a derived proxy
proxy = new TestProxy() {
@Override
@@ -157,6 +176,7 @@ public class ApiMethodHelperTest {
GREETUS(String.class, "greetUs", String.class, "name1", String.class, "name2"),
GREETALL(String.class, "greetAll", new String[0].getClass(), "names"),
GREETALL_1(String.class, "greetAll", List.class, "nameList"),
+ GREETALL_2(Map.class, "greetAll", Map.class, "nameMap"),
GREETTIMES(new String[0].getClass(), "greetTimes", String.class, "name", int.class, "times");
private final ApiMethod apiMethod;
http://git-wip-us.apache.org/repos/asf/camel/blob/909077a1/camel-core/src/test/java/org/apache/camel/util/component/ArgumentSubstitutionParserTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/util/component/ArgumentSubstitutionParserTest.java b/camel-core/src/test/java/org/apache/camel/util/component/ArgumentSubstitutionParserTest.java
index 6f095b4..fbd4842 100644
--- a/camel-core/src/test/java/org/apache/camel/util/component/ArgumentSubstitutionParserTest.java
+++ b/camel-core/src/test/java/org/apache/camel/util/component/ArgumentSubstitutionParserTest.java
@@ -19,9 +19,9 @@ package org.apache.camel.util.component;
import java.util.ArrayList;
import java.util.List;
-import org.junit.Test;
-import static org.apache.camel.util.component.ArgumentSubstitutionParser.*;
+import static org.apache.camel.util.component.ArgumentSubstitutionParser.Substitution;
import static org.junit.Assert.assertEquals;
+import org.junit.Test;
public class ArgumentSubstitutionParserTest {
@@ -45,28 +45,32 @@ public class ArgumentSubstitutionParserTest {
signatures.add("public final String greetUs(final String name1, String name2);");
signatures.add("public final String greetAll(String[] names);");
signatures.add("public final String greetAll(java.util.List<String> names);");
+ signatures.add("public final java.util.Map<String, String> greetAll(java.util.Map<String> nameMap);");
signatures.add("public final String[] greetTimes(String name, int times);");
parser.setSignatures(signatures);
final List<ApiMethodParser.ApiMethodModel> methodModels = parser.parse();
- assertEquals(7, methodModels.size());
+ assertEquals(8, methodModels.size());
- final ApiMethodParser.ApiMethodModel sayHi1 = methodModels.get(6);
+ final ApiMethodParser.ApiMethodModel sayHi1 = methodModels.get(7);
assertEquals(PERSON, sayHi1.getArguments().get(0).getName());
assertEquals("SAYHI_1", sayHi1.getUniqueName());
- final ApiMethodParser.ApiMethodModel greetMe = methodModels.get(2);
+ final ApiMethodParser.ApiMethodModel greetMe = methodModels.get(3);
assertEquals(PERSON, greetMe.getArguments().get(0).getName());
- final ApiMethodParser.ApiMethodModel greetUs = methodModels.get(4);
+ final ApiMethodParser.ApiMethodModel greetUs = methodModels.get(5);
assertEquals("astronaut1", greetUs.getArguments().get(0).getName());
assertEquals("astronaut2", greetUs.getArguments().get(1).getName());
final ApiMethodParser.ApiMethodModel greetAll = methodModels.get(0);
- assertEquals("personsList", greetAll.getArguments().get(0).getName());
+ assertEquals("personMap", greetAll.getArguments().get(0).getName());
final ApiMethodParser.ApiMethodModel greetAll1 = methodModels.get(1);
- assertEquals("stringArray", greetAll1.getArguments().get(0).getName());
+ assertEquals("personsList", greetAll1.getArguments().get(0).getName());
+
+ final ApiMethodParser.ApiMethodModel greetAll2 = methodModels.get(2);
+ assertEquals("stringArray", greetAll2.getArguments().get(0).getName());
}
}
http://git-wip-us.apache.org/repos/asf/camel/blob/909077a1/camel-core/src/test/java/org/apache/camel/util/component/TestProxy.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/util/component/TestProxy.java b/camel-core/src/test/java/org/apache/camel/util/component/TestProxy.java
index d707eb8..2b4a320 100644
--- a/camel-core/src/test/java/org/apache/camel/util/component/TestProxy.java
+++ b/camel-core/src/test/java/org/apache/camel/util/component/TestProxy.java
@@ -17,7 +17,9 @@
package org.apache.camel.util.component;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
class TestProxy {
public String sayHi() {
@@ -61,4 +63,14 @@ class TestProxy {
}
return result.toArray(new String[result.size()]);
}
+
+ public Map<String, String> greetAll(Map<String, String> nameMap) {
+ Map<String, String> result = new HashMap<String, String>();
+ for (Map.Entry<String, String> entry : nameMap.entrySet()) {
+ final String name = entry.getKey();
+ final String greeting = entry.getValue();
+ result.put(name, greeting + " " + name);
+ }
+ return result;
+ }
}