Author: davidb
Date: Fri May 25 12:42:59 2018
New Revision: 1832236
URL: http://svn.apache.org/viewvc?rev=1832236&view=rev
Log:
ARIES-1801 SPI Fly does not work with a dynamic class object
Test case that works with dynamic class object.
Modified:
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/ClientWeavingHookTest.java
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/TestClient.java
Modified:
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/ClientWeavingHookTest.java
URL:
http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/ClientWeavingHookTest.java?rev=1832236&r1=1832235&r2=1832236&view=diff
==============================================================================
---
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/ClientWeavingHookTest.java
(original)
+++
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/ClientWeavingHookTest.java
Fri May 25 12:42:59 2018
@@ -18,6 +18,25 @@
*/
package org.apache.aries.spifly.dynamic;
+import org.apache.aries.mytest.MySPI;
+import org.apache.aries.spifly.BaseActivator;
+import org.apache.aries.spifly.SpiFlyConstants;
+import org.apache.aries.spifly.Streams;
+import org.easymock.EasyMock;
+import org.easymock.IAnswer;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleReference;
+import org.osgi.framework.Version;
+import org.osgi.framework.hooks.weaving.WeavingHook;
+import org.osgi.framework.hooks.weaving.WovenClass;
+import org.osgi.framework.wiring.BundleRevision;
+import org.osgi.framework.wiring.BundleWiring;
+
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
@@ -43,25 +62,6 @@ import java.util.concurrent.ConcurrentHa
import javax.xml.parsers.DocumentBuilderFactory;
-import org.apache.aries.mytest.MySPI;
-import org.apache.aries.spifly.BaseActivator;
-import org.apache.aries.spifly.SpiFlyConstants;
-import org.apache.aries.spifly.Streams;
-import org.easymock.EasyMock;
-import org.easymock.IAnswer;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleReference;
-import org.osgi.framework.Version;
-import org.osgi.framework.hooks.weaving.WeavingHook;
-import org.osgi.framework.hooks.weaving.WovenClass;
-import org.osgi.framework.wiring.BundleRevision;
-import org.osgi.framework.wiring.BundleWiring;
-
public class ClientWeavingHookTest {
DynamicWeavingActivator activator;
@@ -115,6 +115,43 @@ public class ClientWeavingHookTest {
Object result = method.invoke(cls.newInstance(), "hello");
Assert.assertEquals(Collections.singleton("olleh"), result);
}
+
+ @Test
+ public void testBasicServiceLoaderUsage2() throws Exception {
+ Dictionary<String, String> consumerHeaders = new Hashtable<String,
String>();
+ consumerHeaders.put(SpiFlyConstants.SPI_CONSUMER_HEADER, "*");
+
+ // Register the bundle that provides the SPI implementation.
+ Bundle providerBundle = mockProviderBundle("impl1", 1);
+ activator.registerProviderBundle("org.apache.aries.mytest.MySPI",
providerBundle, new HashMap<String, Object>());
+
+ Bundle consumerBundle = mockConsumerBundle(consumerHeaders,
providerBundle);
+ activator.addConsumerWeavingData(consumerBundle,
SpiFlyConstants.SPI_CONSUMER_HEADER);
+
+ Bundle spiFlyBundle = mockSpiFlyBundle("spifly",
Version.parseVersion("1.9.4"), consumerBundle, providerBundle);
+ WeavingHook wh = new
ClientWeavingHook(spiFlyBundle.getBundleContext(), activator);
+
+ // Weave the TestClient class.
+ URL clsUrl = getClass().getResource("TestClient.class");
+ Assert.assertNotNull("Precondition", clsUrl);
+
+ String clientClassName = "org.apache.aries.spifly.dynamic.TestClient";
+ WovenClass wc = new MyWovenClass(clsUrl, clientClassName,
consumerBundle);
+ Assert.assertEquals("Precondition", 0, wc.getDynamicImports().size());
+ wh.weave(wc);
+ Assert.assertEquals(1, wc.getDynamicImports().size());
+ String di1 =
"org.apache.aries.spifly;bundle-symbolic-name=spifly;bundle-version=1.9.4";
+ String di2 =
"org.apache.aries.spifly;bundle-version=1.9.4;bundle-symbolic-name=spifly";
+ String di = wc.getDynamicImports().get(0);
+ Assert.assertTrue("Weaving should have added a dynamic import",
di1.equals(di) || di2.equals(di));
+
+ // Invoke the woven class and check that it properly sets the TCCL so
that the
+ // META-INF/services/org.apache.aries.mytest.MySPI file from impl1 is
visible.
+ Class<?> cls = wc.getDefinedClass();
+ Method method = cls.getMethod("testService2", new Class []
{String.class});
+ Object result = method.invoke(cls.newInstance(), "hello");
+ Assert.assertEquals(Collections.singleton("olleh"), result);
+ }
@Test
public void testTCCLResetting() throws Exception {
Modified:
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/TestClient.java
URL:
http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/TestClient.java?rev=1832236&r1=1832235&r2=1832236&view=diff
==============================================================================
---
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/TestClient.java
(original)
+++
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/TestClient.java
Fri May 25 12:42:59 2018
@@ -18,12 +18,12 @@
*/
package org.apache.aries.spifly.dynamic;
+import org.apache.aries.mytest.MySPI;
+
import java.util.HashSet;
import java.util.ServiceLoader;
import java.util.Set;
-import org.apache.aries.mytest.MySPI;
-
public class TestClient {
/**
* Load using a constant as parameter.
@@ -37,7 +37,7 @@ public class TestClient {
}
return results;
}
-
+
/**
* Load using a variable as parameter.
*/
@@ -47,11 +47,25 @@ public class TestClient {
// Try to irritate TCCLSetterVisitor by forcing an (irrelevant) LDC.
@SuppressWarnings("unused")
Class<?> causeLDC = String.class;
-
+
ServiceLoader<MySPI> loader = ServiceLoader.load(service);
for (MySPI mySPI : loader) {
results.add(mySPI.someMethod(input));
}
return results;
}
+
+ /**
+ * Slightly different example where the class is loaded using
Class.forName()
+ */
+ public Set<String> testService2(String input) throws Exception {
+ Set<String> results = new HashSet<String>();
+
+ Class<?> cls = Class.forName("org.apache.aries.mytest.MySPI");
+ ServiceLoader<?> loader = ServiceLoader.load(cls);
+ for (Object obj : loader) {
+ results.add(((MySPI) obj).someMethod(input));
+ }
+ return results;
+ }
}