Repository: aries-rsa Updated Branches: refs/heads/master 4ec6aa84b -> dea3223d9
[ARIES-1515] Allow interface based arguments Project: http://git-wip-us.apache.org/repos/asf/aries-rsa/repo Commit: http://git-wip-us.apache.org/repos/asf/aries-rsa/commit/dea3223d Tree: http://git-wip-us.apache.org/repos/asf/aries-rsa/tree/dea3223d Diff: http://git-wip-us.apache.org/repos/asf/aries-rsa/diff/dea3223d Branch: refs/heads/master Commit: dea3223d99b69d465da1aa1434d2836108e255f9 Parents: 4ec6aa8 Author: Christian Schneider <[email protected]> Authored: Thu Mar 31 16:13:11 2016 +0200 Committer: Christian Schneider <[email protected]> Committed: Thu Mar 31 16:14:05 2016 +0200 ---------------------------------------------------------------------- .../aries/rsa/provider/tcp/TCPServer.java | 35 ++++++++++++++++++-- .../aries/rsa/provider/tcp/TcpProviderTest.java | 18 +++++++++- .../rsa/provider/tcp/myservice/MyService.java | 5 +++ .../provider/tcp/myservice/MyServiceImpl.java | 10 ++++++ 4 files changed, 65 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/dea3223d/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/TCPServer.java ---------------------------------------------------------------------- diff --git a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/TCPServer.java b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/TCPServer.java index e70731d..2dcb61a 100644 --- a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/TCPServer.java +++ b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/TCPServer.java @@ -28,6 +28,7 @@ import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -82,16 +83,46 @@ public class TCPServer implements Closeable, Runnable { } private Object invoke(String methodName, Object[] args) - throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + throws IllegalAccessException, InvocationTargetException, SecurityException { Class<?>[] parameterTypesAr = getTypes(args); - Method method = service.getClass().getMethod(methodName, parameterTypesAr); + Method method = null; try { + method = getMethod(methodName, parameterTypesAr); return method.invoke(service, args); } catch (Throwable e) { return e; } } + private Method getMethod(String methodName, Class<?>[] parameterTypesAr) { + try { + return service.getClass().getMethod(methodName, parameterTypesAr); + } catch (NoSuchMethodException e) { + Method[] methods = service.getClass().getMethods(); + for (Method method : methods) { + if (!method.getName().equals(methodName)) { + continue; + } + if (allParamsMatch(method.getParameterTypes(), parameterTypesAr)) { + return method; + } + } + throw new IllegalArgumentException(String.format("No method found that matches name %s, types %s", + methodName, Arrays.toString(parameterTypesAr))); + } + } + + private boolean allParamsMatch(Class<?>[] methodParamTypes, Class<?>[] parameterTypesAr) { + int c = 0; + for (Class<?> type : methodParamTypes) { + if (!type.isAssignableFrom(parameterTypesAr[c])) { + return false; + } + c++; + } + return true; + } + private Class<?>[] getTypes(Object[] args) { List<Class<?>> parameterTypes = new ArrayList<>(); if (args != null) { http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/dea3223d/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/TcpProviderTest.java ---------------------------------------------------------------------- diff --git a/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/TcpProviderTest.java b/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/TcpProviderTest.java index 5d57c41..c83073d 100644 --- a/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/TcpProviderTest.java +++ b/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/TcpProviderTest.java @@ -19,7 +19,9 @@ package org.apache.aries.rsa.provider.tcp; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -65,9 +67,14 @@ public class TcpProviderTest { Assert.assertEquals(msg, result); } + @Test(expected=RuntimeException.class) + public void testCallException() throws IOException, InterruptedException { + myServiceProxy.call("throw exception"); + } + @Test public void testCall() throws IOException, InterruptedException { - myServiceProxy.call("test"); + myServiceProxy.echo("test"); } @Test @@ -75,6 +82,15 @@ public class TcpProviderTest { myServiceProxy.callOneWay("test"); } + /** + * Test for ARIES-1515 + */ + @Test + public void testCallWithInterfaceBasedParam() throws IOException, InterruptedException { + List<String> msgList = new ArrayList<String>(); + myServiceProxy.callWithList(msgList); + } + @After public void close() throws IOException { ep.close(); http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/dea3223d/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/MyService.java ---------------------------------------------------------------------- diff --git a/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/MyService.java b/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/MyService.java index e9d56bf..04cbe86 100644 --- a/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/MyService.java +++ b/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/MyService.java @@ -18,13 +18,18 @@ */ package org.apache.aries.rsa.provider.tcp.myservice; +import java.util.List; + import javax.jws.Oneway; public interface MyService { String echo(String msg); + void call(String msg); // Oneway not yet supported @Oneway void callOneWay(String msg); + + void callWithList(List<String> msg); } http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/dea3223d/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/MyServiceImpl.java ---------------------------------------------------------------------- diff --git a/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/MyServiceImpl.java b/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/MyServiceImpl.java index 5f469ed..de27304 100644 --- a/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/MyServiceImpl.java +++ b/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/MyServiceImpl.java @@ -18,6 +18,8 @@ */ package org.apache.aries.rsa.provider.tcp.myservice; +import java.util.List; + public class MyServiceImpl implements MyService { @Override @@ -27,10 +29,18 @@ public class MyServiceImpl implements MyService { @Override public void call(String msg) { + if ("throw exception".equals(msg)) { + throw new IllegalArgumentException("Throwing expected exception"); + } } @Override public void callOneWay(String msg) { } + @Override + public void callWithList(List<String> msg) { + + } + }
