You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by cs...@apache.org on 2018/02/09 15:40:03 UTC
aries-rsa git commit: [ARIES-1758] Support transport of DTOs using
felix converter
Repository: aries-rsa
Updated Branches:
refs/heads/master 177cb0aef -> a421c659b
[ARIES-1758] Support transport of DTOs using felix converter
Project: http://git-wip-us.apache.org/repos/asf/aries-rsa/repo
Commit: http://git-wip-us.apache.org/repos/asf/aries-rsa/commit/a421c659
Tree: http://git-wip-us.apache.org/repos/asf/aries-rsa/tree/a421c659
Diff: http://git-wip-us.apache.org/repos/asf/aries-rsa/diff/a421c659
Branch: refs/heads/master
Commit: a421c659bb3984650f786398a62b5beb68593d95
Parents: 177cb0a
Author: Christian Schneider <cs...@adobe.com>
Authored: Fri Feb 9 16:39:57 2018 +0100
Committer: Christian Schneider <cs...@adobe.com>
Committed: Fri Feb 9 16:39:57 2018 +0100
----------------------------------------------------------------------
parent/pom.xml | 5 ++++
provider/tcp/bnd.bnd | 4 +++
provider/tcp/pom.xml | 6 +++-
.../tcp/ser/BasicObjectInputStream.java | 11 ++++++-
.../tcp/ser/BasicObjectOutputStream.java | 7 +++--
.../aries/rsa/provider/tcp/ser/DTOMarker.java | 31 ++++++++++++++++++++
.../provider/tcp/TcpProviderPrimitiveTest.java | 18 ++++++++++++
.../aries/rsa/provider/tcp/TcpProviderTest.java | 25 ++++++++++++++--
.../rsa/provider/tcp/myservice/DTOType.java | 23 +++++++++++++++
.../tcp/myservice/PrimitiveService.java | 4 +++
.../tcp/myservice/PrimitiveServiceImpl.java | 10 +++++++
11 files changed, 137 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/a421c659/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index af59c55..fd4e1a5 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -199,6 +199,11 @@
</exclusion>
</exclusions>
</dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.converter</artifactId>
+ <version>0.3.0-SNAPSHOT</version>
+ </dependency>
</dependencies>
</dependencyManagement>
http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/a421c659/provider/tcp/bnd.bnd
----------------------------------------------------------------------
diff --git a/provider/tcp/bnd.bnd b/provider/tcp/bnd.bnd
index c9917d9..62caa2c 100644
--- a/provider/tcp/bnd.bnd
+++ b/provider/tcp/bnd.bnd
@@ -1,3 +1,7 @@
Bundle-Activator: org.apache.aries.rsa.provider.tcp.Activator
Provide-Capability: osgi.remoteserviceadmin.distribution;\
configs:List<String>="aries.tcp"; version:Version=1.1.0
+Private-Package: \
+ org.apache.aries.rsa.util,\
+ org.apache.aries.rsa.provider.tcp*,\
+ org.osgi.util.converter
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/a421c659/provider/tcp/pom.xml
----------------------------------------------------------------------
diff --git a/provider/tcp/pom.xml b/provider/tcp/pom.xml
index f743563..072fc25 100644
--- a/provider/tcp/pom.xml
+++ b/provider/tcp/pom.xml
@@ -28,7 +28,11 @@
<groupId>org.osgi</groupId>
<artifactId>org.osgi.util.promise</artifactId>
<version>1.0.0</version>
- </dependency>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.converter</artifactId>
+ </dependency>
</dependencies>
</project>
http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/a421c659/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
index d9bde6c..33c44d3 100644
--- 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
@@ -24,8 +24,11 @@ import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
import org.osgi.framework.Version;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class BasicObjectInputStream extends ObjectInputStream {
+ Logger log = LoggerFactory.getLogger(this.getClass());
private ClassLoader loader;
@@ -38,8 +41,11 @@ public class BasicObjectInputStream extends ObjectInputStream {
@Override
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
try {
- return loader.loadClass(desc.getName());
+ String className = desc.getName();
+ // Must use Class.forName instead of loader.loadClass to handle cases like array of user classes
+ return Class.forName(className, false, loader);
} catch (ClassNotFoundException e) {
+ log.warn("Error loading class using classloader of user bundle", e);
return super.resolveClass(desc);
}
}
@@ -49,6 +55,9 @@ public class BasicObjectInputStream extends ObjectInputStream {
if (obj instanceof VersionMarker) {
VersionMarker verionMarker = (VersionMarker)obj;
return Version.parseVersion(verionMarker.getVersion());
+ } else if (obj instanceof DTOMarker) {
+ DTOMarker dtoMarker = (DTOMarker)obj;
+ return dtoMarker.getDTO(loader);
} else {
return super.resolveObject(obj);
}
http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/a421c659/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
index 39b5399..98b6248 100644
--- 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
@@ -3,6 +3,7 @@ package org.apache.aries.rsa.provider.tcp.ser;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
+import java.io.Serializable;
import org.osgi.framework.Version;
@@ -15,10 +16,12 @@ public class BasicObjectOutputStream extends ObjectOutputStream {
@Override
protected Object replaceObject(Object obj) throws IOException {
- if (obj instanceof Version) {
+ if (obj instanceof Serializable || obj.getClass().isArray()) {
+ return obj;
+ } else if (obj instanceof Version) {
return new VersionMarker((Version) obj);
} else {
- return super.replaceObject(obj);
+ return new DTOMarker(obj);
}
}
}
http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/a421c659/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/DTOMarker.java
----------------------------------------------------------------------
diff --git a/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/DTOMarker.java b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/DTOMarker.java
new file mode 100644
index 0000000..9b71ae0
--- /dev/null
+++ b/provider/tcp/src/main/java/org/apache/aries/rsa/provider/tcp/ser/DTOMarker.java
@@ -0,0 +1,31 @@
+package org.apache.aries.rsa.provider.tcp.ser;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import org.osgi.util.converter.Converter;
+import org.osgi.util.converter.Converters;
+
+public class DTOMarker implements Serializable {
+ private static final long serialVersionUID = 2248068618419940217L;
+
+ private String className;
+ private Map<String, Object> content;
+
+ @SuppressWarnings("unchecked")
+ public DTOMarker(Object dto) {
+ Converter converter = Converters.standardConverter();
+ className = dto.getClass().getName();
+ content = converter.convert(dto).sourceAsDTO().to(Map.class);
+ }
+
+ public Object getDTO(ClassLoader classLoader) {
+ try {
+ Class<?> clazz = classLoader.loadClass(className);
+ Converter converter = Converters.standardConverter();
+ return converter.convert(content).targetAsDTO().to(clazz);
+ } catch (ClassNotFoundException e) {
+ throw new RuntimeException("Exception deserializing DTO " + className, e);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/a421c659/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 05ceb8b..ea26c54 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
@@ -22,6 +22,7 @@ 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.Matchers.samePropertyValuesAs;
import static org.hamcrest.core.StringStartsWith.startsWith;
import static org.junit.Assert.assertThat;
import static org.osgi.framework.Version.parseVersion;
@@ -33,6 +34,7 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
+import org.apache.aries.rsa.provider.tcp.myservice.DTOType;
import org.apache.aries.rsa.provider.tcp.myservice.PrimitiveService;
import org.apache.aries.rsa.provider.tcp.myservice.PrimitiveServiceImpl;
import org.apache.aries.rsa.spi.Endpoint;
@@ -137,6 +139,22 @@ public class TcpProviderPrimitiveTest {
assertThat(myServiceProxy.callVersionMap(map).entrySet(), everyItem(isIn(map.entrySet())));
}
+ @Test
+ public void testDTO() {
+ DTOType dto = new DTOType();
+ dto.value = "Test";
+ assertThat(myServiceProxy.callDTO(dto), samePropertyValuesAs(dto));
+ }
+
+ @Test
+ public void testDTOAr() {
+ DTOType dto = new DTOType();
+ dto.value = "Test";
+ DTOType[] dtoAr = new DTOType[] {dto};
+ DTOType[] result = myServiceProxy.callDTOAr(dtoAr);
+ assertThat(result[0], samePropertyValuesAs(dtoAr[0]));
+ }
+
@AfterClass
public static void close() throws IOException {
ep.close();
http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/a421c659/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 67678f3..dc4737e 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
@@ -21,7 +21,9 @@ package org.apache.aries.rsa.provider.tcp;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.core.StringStartsWith.startsWith;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
@@ -36,6 +38,7 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
+import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import org.apache.aries.rsa.provider.tcp.myservice.ExpectedTestException;
@@ -50,7 +53,9 @@ import org.junit.BeforeClass;
import org.junit.Test;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceException;
+import org.osgi.util.function.Predicate;
import org.osgi.util.promise.Promise;
+import org.osgi.util.promise.Success;
public class TcpProviderTest {
@@ -160,9 +165,23 @@ public class TcpProviderTest {
@Test
public void testAsyncPromise() throws Exception {
- Promise<String> result = myServiceProxy.callAsyncPromise(100);
- String answer = result.getValue();
- assertEquals("Finished", answer);
+ final Semaphore s = new Semaphore(0);
+ Promise<String> p = myServiceProxy.callAsyncPromise(100);
+ p.filter(new Predicate<String>() {
+ @Override
+ public boolean test(String x) {
+ return "Finished".equals(x);
+ }
+ }).then(new Success<String,Object>() {
+ @Override
+ public Promise<Object> call(Promise<String> x)
+ throws Exception {
+ s.release();
+ return null;
+ }
+ });
+ assertFalse(s.tryAcquire());
+ assertTrue(s.tryAcquire(1, TimeUnit.SECONDS));
}
@Test(expected = ExpectedTestException.class)
http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/a421c659/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/DTOType.java
----------------------------------------------------------------------
diff --git a/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/DTOType.java b/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/DTOType.java
new file mode 100644
index 0000000..7608660
--- /dev/null
+++ b/provider/tcp/src/test/java/org/apache/aries/rsa/provider/tcp/myservice/DTOType.java
@@ -0,0 +1,23 @@
+/**
+ * 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.myservice;
+
+public class DTOType {
+ public String value;
+}
http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/a421c659/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 33d0d06..357300c 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
@@ -51,4 +51,8 @@ public interface PrimitiveService {
Map<Version, Version> callVersionMap(Map<Version, Version> map);
Set<Version> callVersionSet(Set<Version> set);
+
+ DTOType callDTO(DTOType dto);
+
+ DTOType[] callDTOAr(DTOType[] dtoAr);
}
http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/a421c659/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 7bf3fe1..ed6dc6e 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
@@ -74,4 +74,14 @@ public class PrimitiveServiceImpl implements PrimitiveService {
return set;
}
+
+ @Override
+ public DTOType callDTO(DTOType dto) {
+ return dto;
+ }
+
+ @Override
+ public DTOType[] callDTOAr(DTOType[] dtoAr) {
+ return dtoAr;
+ }
}