Repository: aries-rsa
Updated Branches:
  refs/heads/master 55ab0a11a -> 177cb0aef


[ARIES-1758] Improved Version serialization using custom streams


Project: http://git-wip-us.apache.org/repos/asf/aries-rsa/repo
Commit: http://git-wip-us.apache.org/repos/asf/aries-rsa/commit/177cb0ae
Tree: http://git-wip-us.apache.org/repos/asf/aries-rsa/tree/177cb0ae
Diff: http://git-wip-us.apache.org/repos/asf/aries-rsa/diff/177cb0ae

Branch: refs/heads/master
Commit: 177cb0aefd6dabee198b398f7aba18df10f7cf90
Parents: 55ab0a1
Author: Christian Schneider <cschn...@adobe.com>
Authored: Fri Feb 9 12:12:49 2018 +0100
Committer: Christian Schneider <cschn...@adobe.com>
Committed: Fri Feb 9 12:12:49 2018 +0100

----------------------------------------------------------------------
 .../repository/ZookeeperEndpointRepository.java |  1 -
 .../provider/tcp/LoaderObjectInputStream.java   | 43 -----------
 .../aries/rsa/provider/tcp/MethodInvoker.java   | 15 ----
 .../aries/rsa/provider/tcp/SerVersion.java      | 25 -------
 .../aries/rsa/provider/tcp/TCPServer.java       |  7 +-
 .../rsa/provider/tcp/TcpInvocationHandler.java  | 13 ++--
 .../rsa/provider/tcp/VersionDeserializer.java   | 67 -----------------
 .../rsa/provider/tcp/VersionSerializer.java     | 79 --------------------
 .../tcp/ser/BasicObjectInputStream.java         | 56 ++++++++++++++
 .../tcp/ser/BasicObjectOutputStream.java        | 24 ++++++
 .../rsa/provider/tcp/ser/VersionMarker.java     | 25 +++++++
 .../provider/tcp/TcpProviderPrimitiveTest.java  | 24 ++++++
 .../tcp/myservice/PrimitiveService.java         | 10 +++
 .../tcp/myservice/PrimitiveServiceImpl.java     | 19 +++++
 14 files changed, 169 insertions(+), 239 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/177cb0ae/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/repository/ZookeeperEndpointRepository.java
----------------------------------------------------------------------
diff --git 
a/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/repository/ZookeeperEndpointRepository.java
 
b/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/repository/ZookeeperEndpointRepository.java
index e290e65..84bac77 100644
--- 
a/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/repository/ZookeeperEndpointRepository.java
+++ 
b/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/repository/ZookeeperEndpointRepository.java
@@ -15,7 +15,6 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.aries.rsa.discovery.endpoint.EndpointDescriptionParser;
-import 
org.apache.aries.rsa.discovery.zookeeper.subscribe.InterfaceMonitorManager;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.KeeperException.NoNodeException;

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/177cb0ae/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/LoaderObjectInputStream.java
----------------------------------------------------------------------
diff --git 
a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/LoaderObjectInputStream.java
 
b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/LoaderObjectInputStream.java
deleted file mode 100644
index ac60950..0000000
--- 
a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/LoaderObjectInputStream.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * 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.aries.rsa.provider.tcp;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectStreamClass;
-
-public class LoaderObjectInputStream extends ObjectInputStream {
-
-    private ClassLoader loader;
-
-    public LoaderObjectInputStream(InputStream in, ClassLoader loader) throws 
IOException {
-        super(in);
-        this.loader = loader;
-    }
-
-    @Override
-    protected Class<?> resolveClass(ObjectStreamClass desc) throws 
IOException, ClassNotFoundException {
-        try {
-            return loader.loadClass(desc.getName());
-        } catch (ClassNotFoundException e) {
-            return super.resolveClass(desc);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/177cb0ae/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/MethodInvoker.java
----------------------------------------------------------------------
diff --git 
a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/MethodInvoker.java
 
b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/MethodInvoker.java
index dadf5f7..4a4053a 100644
--- 
a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/MethodInvoker.java
+++ 
b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/MethodInvoker.java
@@ -24,8 +24,6 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 
-import org.osgi.framework.Version;
-
 public class MethodInvoker {
 
     private HashMap<Object, Object> primTypes;
@@ -45,7 +43,6 @@ public class MethodInvoker {
     }
     
     public Object invoke(String methodName, Object[] args) {
-        args = VersionDeserializer.replaceAr(args);
         Class<?>[] parameterTypesAr = getTypes(args);
         Method method = null;
         try {
@@ -56,18 +53,6 @@ public class MethodInvoker {
         }
     }
     
-    private void readReplaceVersion(Object[] args) {
-        if (args != null) {
-            for (int c=0; c<args.length; c++) {
-                Object current = args[c];
-                if (current instanceof SerVersion) {
-                    SerVersion serVersion = (SerVersion)current;
-                    args[c] = new Version(serVersion.getVersion());
-                }
-            }
-        }
-    }
-    
     private Method getMethod(String methodName, Class<?>[] parameterTypesAr) {
         try {
             return service.getClass().getMethod(methodName, parameterTypesAr);

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/177cb0ae/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/SerVersion.java
----------------------------------------------------------------------
diff --git 
a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/SerVersion.java 
b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/SerVersion.java
deleted file mode 100644
index ad912df..0000000
--- 
a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/SerVersion.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.apache.aries.rsa.provider.tcp;
-
-import java.io.Serializable;
-
-import org.osgi.framework.Version;
-
-public class SerVersion implements Serializable {
-    private static final long serialVersionUID = 4725855052866235835L;
-
-    private String version;
-    
-    public SerVersion() {
-    }
-    
-    public SerVersion(Version version) {
-        this.version = version.toString();
-    }
-    
-    public String getVersion() {
-        return version;
-    }
-    public void setVersion(String version) {
-        this.version = version;
-    }
-}

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/177cb0ae/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 fca6df3..1769a3d 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
@@ -33,6 +33,8 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.aries.rsa.provider.tcp.ser.BasicObjectOutputStream;
+import org.apache.aries.rsa.provider.tcp.ser.BasicObjectInputStream;
 import org.osgi.util.promise.Promise;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -69,8 +71,8 @@ public class TCPServer implements Closeable, Runnable {
         while (running) {
             try (
                     Socket socket = this.serverSocket.accept();
-                    ObjectInputStream ois = new 
LoaderObjectInputStream(socket.getInputStream(), serviceCL);
-                    ObjectOutputStream objectOutput = new 
ObjectOutputStream(socket.getOutputStream())
+                    ObjectInputStream ois = new 
BasicObjectInputStream(socket.getInputStream(), serviceCL);
+                    ObjectOutputStream objectOutput = new 
BasicObjectOutputStream(socket.getOutputStream())
                 ) {
                 handleCall(ois, objectOutput);
             } catch (SocketException e) {
@@ -86,7 +88,6 @@ public class TCPServer implements Closeable, Runnable {
         Object[] args = (Object[])ois.readObject();
         Object result = invoker.invoke(methodName, args);
         result = resolveAsnyc(result);
-        result = VersionSerializer.replace(result);
         if (result instanceof InvocationTargetException) {
             result = ((InvocationTargetException) result).getCause();
         }

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/177cb0ae/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/TcpInvocationHandler.java
----------------------------------------------------------------------
diff --git 
a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/TcpInvocationHandler.java
 
b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/TcpInvocationHandler.java
index 0fd3526..8e78f4d 100644
--- 
a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/TcpInvocationHandler.java
+++ 
b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/TcpInvocationHandler.java
@@ -33,6 +33,9 @@ import java.util.concurrent.CompletionStage;
 import java.util.concurrent.Future;
 import java.util.function.Supplier;
 
+import org.apache.aries.rsa.provider.tcp.ser.BasicObjectInputStream;
+import org.apache.aries.rsa.provider.tcp.ser.BasicObjectOutputStream;
+import org.apache.aries.rsa.provider.tcp.ser.VersionMarker;
 import org.osgi.framework.ServiceException;
 import org.osgi.framework.Version;
 import org.osgi.util.promise.Deferred;
@@ -95,11 +98,10 @@ public class TcpInvocationHandler implements 
InvocationHandler {
     }
 
     private Object handleSyncCall(Method method, Object[] args) throws 
Throwable {
-        args = (Object[])VersionSerializer.replace(args);
         Object result;
         try (
                 Socket socket = openSocket();
-                ObjectOutputStream out = new 
ObjectOutputStream(socket.getOutputStream())
+                ObjectOutputStream out = new 
BasicObjectOutputStream(socket.getOutputStream())
             ) {
             socket.setSoTimeout(timeoutMillis);
             out.writeObject(method.getName());
@@ -107,7 +109,6 @@ public class TcpInvocationHandler implements 
InvocationHandler {
             out.writeObject(args);
             out.flush();
             result = parseResult(socket);
-            result = VersionDeserializer.replace(result);
         } catch (SocketTimeoutException e) {
             throw new ServiceException("Timeout calling " + host + ":" + port 
+ " method: " + method.getName(), ServiceException.REMOTE, e);
         } catch (Throwable e) {
@@ -134,14 +135,14 @@ public class TcpInvocationHandler implements 
InvocationHandler {
     }
 
     private Object parseResult(Socket socket) throws Throwable {
-        try (ObjectInputStream in = new 
LoaderObjectInputStream(socket.getInputStream(), cl)) {
+        try (ObjectInputStream in = new 
BasicObjectInputStream(socket.getInputStream(), cl)) {
             return readReplaceVersion(in.readObject());
         }
     }
 
     private Object readReplaceVersion(Object readObject) {
-        if (readObject instanceof SerVersion) {
-            return new Version(((SerVersion)readObject).getVersion());
+        if (readObject instanceof VersionMarker) {
+            return new Version(((VersionMarker)readObject).getVersion());
         } else {
             return readObject;
         }

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/177cb0ae/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/VersionDeserializer.java
----------------------------------------------------------------------
diff --git 
a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/VersionDeserializer.java
 
b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/VersionDeserializer.java
deleted file mode 100644
index 84d965e..0000000
--- 
a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/VersionDeserializer.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * 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.aries.rsa.provider.tcp;
-
-import org.osgi.framework.Version;
-
-public class VersionDeserializer {
-
-    public static Object[] replaceAr(Object[] args) {
-        if (args == null) {
-            return null;
-        }
-        Object[] result = new Object[args.length];
-        for (int c=0; c<args.length; c++) {
-            result[c] = replace(args[c]);
-        }
-        return result;
-    }
-    
-    public static Object replace(Object obj) {
-        if (obj == null) {
-            return obj;
-        }
-        if (obj.getClass().isArray()) {
-            if (obj.getClass().getComponentType() == SerVersion.class) {
-                return replaceVersionAr((SerVersion[]) obj);
-            } else if (obj.getClass().getComponentType() == Object.class) {
-                return replaceAr((Object[]) obj);
-            } else {
-                return obj;
-            }
-        } else if (obj instanceof SerVersion) {
-            SerVersion serVersion = (SerVersion) obj;
-            return Version.parseVersion(serVersion.getVersion());
-        } else {
-            return obj;
-        }
-    }
-    
-    private static Version[] replaceVersionAr(SerVersion[] obj) {
-        if (obj == null) {
-            return null;
-        }
-        Version[] result = new Version[obj.length];
-        for (int c=0; c<obj.length; c++) {
-            result[c] = Version.parseVersion(obj[c].getVersion());
-        }
-        return result;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/177cb0ae/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/VersionSerializer.java
----------------------------------------------------------------------
diff --git 
a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/VersionSerializer.java
 
b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/VersionSerializer.java
deleted file mode 100644
index 2de7114..0000000
--- 
a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/VersionSerializer.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * 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.aries.rsa.provider.tcp;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.osgi.framework.Version;
-
-public class VersionSerializer {
-
-    public static Object replace(Object obj) {
-        if (obj == null) {
-            return null;
-        }
-        if (obj.getClass().isArray()) {
-            if (obj.getClass().getComponentType() == Version.class) {
-                return replaceVersionAr((Version[]) obj);
-            } else if (obj.getClass().getComponentType() == Object.class) {
-                return replaceAr((Object[]) obj);
-            } else {
-                return obj;
-            }
-        } else if (obj instanceof List) {
-            return replaceList((List)obj);
-        } else if (obj instanceof Version) {
-            return new SerVersion((Version) obj);
-        } else {
-            return obj;
-        }
-    }
-    
-    private static Object replaceList(List<Version> obj) {
-        List<SerVersion> result = new ArrayList<>();
-        for (Version version : obj) {
-            result.add(new SerVersion(version));
-        }
-        return result;
-    }
-
-    private static SerVersion[] replaceVersionAr(Version[] obj) {
-        if (obj == null) {
-            return null;
-        }
-        SerVersion[] result = new SerVersion[obj.length];
-        for (int c=0; c<obj.length; c++) {
-            result[c] = new SerVersion((Version) obj[c]);
-        }
-        return result;
-    }
-
-    public static Object[] replaceAr(Object[] args) {
-        if (args == null) {
-            return null;
-        }
-        Object[] result = new Object[args.length];
-        for (int c=0; c<args.length; c++) {
-            result[c] = replace(args[c]);
-        }
-        return result;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/177cb0ae/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/BasicObjectInputStream.java
----------------------------------------------------------------------
diff --git 
a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/BasicObjectInputStream.java
 
b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/BasicObjectInputStream.java
new file mode 100644
index 0000000..d9bde6c
--- /dev/null
+++ 
b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/BasicObjectInputStream.java
@@ -0,0 +1,56 @@
+/**
+ * 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.aries.rsa.provider.tcp.ser;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamClass;
+
+import org.osgi.framework.Version;
+
+public class BasicObjectInputStream extends ObjectInputStream {
+
+    private ClassLoader loader;
+
+    public BasicObjectInputStream(InputStream in, ClassLoader loader) throws 
IOException {
+        super(in);
+        enableResolveObject(true);
+        this.loader = loader;
+    }
+
+    @Override
+    protected Class<?> resolveClass(ObjectStreamClass desc) throws 
IOException, ClassNotFoundException {
+        try {
+            return loader.loadClass(desc.getName());
+        } catch (ClassNotFoundException e) {
+            return super.resolveClass(desc);
+        }
+    }
+    
+    @Override
+    protected Object resolveObject(Object obj) throws IOException {
+        if (obj instanceof VersionMarker) {
+            VersionMarker verionMarker = (VersionMarker)obj;
+            return Version.parseVersion(verionMarker.getVersion());
+        } else {
+            return super.resolveObject(obj);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/177cb0ae/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/BasicObjectOutputStream.java
----------------------------------------------------------------------
diff --git 
a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/BasicObjectOutputStream.java
 
b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/BasicObjectOutputStream.java
new file mode 100644
index 0000000..39b5399
--- /dev/null
+++ 
b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/BasicObjectOutputStream.java
@@ -0,0 +1,24 @@
+package org.apache.aries.rsa.provider.tcp.ser;
+
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+
+import org.osgi.framework.Version;
+
+public class BasicObjectOutputStream extends ObjectOutputStream {
+
+    public BasicObjectOutputStream(OutputStream out) throws IOException {
+        super(out);
+        enableReplaceObject(true);
+    }
+
+    @Override
+    protected Object replaceObject(Object obj) throws IOException {
+        if (obj instanceof Version) {
+            return new VersionMarker((Version) obj);
+        } else {
+            return super.replaceObject(obj);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/177cb0ae/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/VersionMarker.java
----------------------------------------------------------------------
diff --git 
a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/VersionMarker.java
 
b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/VersionMarker.java
new file mode 100644
index 0000000..1f9f296
--- /dev/null
+++ 
b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/VersionMarker.java
@@ -0,0 +1,25 @@
+package org.apache.aries.rsa.provider.tcp.ser;
+
+import java.io.Serializable;
+
+import org.osgi.framework.Version;
+
+public class VersionMarker implements Serializable {
+    private static final long serialVersionUID = 4725855052866235835L;
+
+    private String version;
+    
+    public VersionMarker() {
+    }
+    
+    public VersionMarker(Version version) {
+        this.version = version.toString();
+    }
+    
+    public String getVersion() {
+        return version;
+    }
+    public void setVersion(String version) {
+        this.version = version;
+    }
+}

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/177cb0ae/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/TcpProviderPrimitiveTest.java
----------------------------------------------------------------------
diff --git 
a/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/TcpProviderPrimitiveTest.java
 
b/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/TcpProviderPrimitiveTest.java
index 8badef7..05ceb8b 100644
--- 
a/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/TcpProviderPrimitiveTest.java
+++ 
b/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/TcpProviderPrimitiveTest.java
@@ -18,14 +18,20 @@
  */
 package org.apache.aries.rsa.provider.tcp;
 
+import static java.util.Arrays.asList;
 import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.everyItem;
+import static org.hamcrest.Matchers.isIn;
 import static org.hamcrest.core.StringStartsWith.startsWith;
 import static org.junit.Assert.assertThat;
 import static org.osgi.framework.Version.parseVersion;
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.aries.rsa.provider.tcp.myservice.PrimitiveService;
 import org.apache.aries.rsa.provider.tcp.myservice.PrimitiveServiceImpl;
@@ -112,6 +118,24 @@ public class TcpProviderPrimitiveTest {
     public void testVersionAr() {
         assertThat(myServiceProxy.callVersionAr(new Version[] 
{parseVersion("1.0.0")}), equalTo(new Version[] {parseVersion("1.0.0")}));
     }
+    
+    @Test
+    public void testVersionList() {
+        
assertThat(myServiceProxy.callVersionList(Arrays.asList(parseVersion("1.0.0"))),
 equalTo(Arrays.asList(parseVersion("1.0.0"))));
+    }
+    
+    @Test
+    public void testVersionSet() {
+        Set<Version> set = new HashSet<>(asList(parseVersion("1.0.0")));
+        assertThat(myServiceProxy.callVersionSet(set), everyItem(isIn(set)));
+    }
+    
+    @Test
+    public void testVersionMap() {
+        HashMap<Version, Version> map = new HashMap<>();
+        map.put(parseVersion("1.2.3"), parseVersion("2.3.4"));
+        assertThat(myServiceProxy.callVersionMap(map).entrySet(), 
everyItem(isIn(map.entrySet())));
+    }
 
     @AfterClass
     public static void close() throws IOException {

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/177cb0ae/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/PrimitiveService.java
----------------------------------------------------------------------
diff --git 
a/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/PrimitiveService.java
 
b/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/PrimitiveService.java
index 679c2fa..33d0d06 100644
--- 
a/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/PrimitiveService.java
+++ 
b/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/PrimitiveService.java
@@ -18,6 +18,10 @@
  */
 package org.apache.aries.rsa.provider.tcp.myservice;
 
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 import org.osgi.framework.Version;
 
 public interface PrimitiveService {
@@ -41,4 +45,10 @@ public interface PrimitiveService {
     Version callVersion(Version version);
 
     Version[] callVersionAr(Version[] version);
+
+    List<Version> callVersionList(List<Version> version);
+
+    Map<Version, Version> callVersionMap(Map<Version, Version> map);
+
+    Set<Version> callVersionSet(Set<Version> set);
 }

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/177cb0ae/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/PrimitiveServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/PrimitiveServiceImpl.java
 
b/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/PrimitiveServiceImpl.java
index 9039dc2..7bf3fe1 100644
--- 
a/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/PrimitiveServiceImpl.java
+++ 
b/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/PrimitiveServiceImpl.java
@@ -1,5 +1,9 @@
 package org.apache.aries.rsa.provider.tcp.myservice;
 
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 import org.osgi.framework.Version;
 
 public class PrimitiveServiceImpl implements PrimitiveService {
@@ -55,4 +59,19 @@ public class PrimitiveServiceImpl implements 
PrimitiveService {
         return version;
     }
 
+    @Override
+    public List<Version> callVersionList(List<Version> version) {
+        return version;
+    }
+
+    @Override
+    public Map<Version, Version> callVersionMap(Map<Version, Version> map) {
+        return map;
+    }
+    
+    @Override
+    public Set<Version> callVersionSet(Set<Version> set) {
+        return set;
+    }
+    
 }

Reply via email to