Author: davidb
Date: Mon Feb 10 16:38:25 2014
New Revision: 1566678
URL: http://svn.apache.org/r1566678
Log:
[SPI Fly] Fix for NPE.
Unit test included.
Modified:
aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/Util.java
aries/trunk/spi-fly/spi-fly-core/src/test/java/org/apache/aries/spifly/UtilTest.java
Modified:
aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/Util.java
URL:
http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/Util.java?rev=1566678&r1=1566677&r2=1566678&view=diff
==============================================================================
---
aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/Util.java
(original)
+++
aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/Util.java
Mon Feb 10 16:38:25 2014
@@ -72,6 +72,11 @@ public class Util {
}
public static void fixContextClassloader(String cls, String method,
Class<?> clsArg, ClassLoader bundleLoader) {
+ if (BaseActivator.activator == null) {
+ // The system is not yet initialized. We can't do anything.
+ return;
+ }
+
if (!(bundleLoader instanceof BundleReference)) {
BaseActivator.activator.log(LogService.LOG_WARNING, "Classloader
of consuming bundle doesn't implement BundleReference: " + bundleLoader);
return;
Modified:
aries/trunk/spi-fly/spi-fly-core/src/test/java/org/apache/aries/spifly/UtilTest.java
URL:
http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-core/src/test/java/org/apache/aries/spifly/UtilTest.java?rev=1566678&r1=1566677&r2=1566678&view=diff
==============================================================================
---
aries/trunk/spi-fly/spi-fly-core/src/test/java/org/apache/aries/spifly/UtilTest.java
(original)
+++
aries/trunk/spi-fly/spi-fly-core/src/test/java/org/apache/aries/spifly/UtilTest.java
Mon Feb 10 16:38:25 2014
@@ -102,6 +102,39 @@ public class UtilTest {
assertSame(providerCL, Thread.currentThread().getContextClassLoader());
}
+ @Test
+ public void testNotInitialized() throws Exception {
+ BaseActivator.activator = null;
+
+ URL url = getClass().getResource("/embedded3.jar");
+ assertNotNull("precondition", url);
+
+ Bundle providerBundle = EasyMock.createMock(Bundle.class);
+ final ClassLoader providerCL = new TestBundleClassLoader(new URL []
{url}, getClass().getClassLoader(), providerBundle);
+
EasyMock.expect(providerBundle.getBundleId()).andReturn(42L).anyTimes();
+ EasyMock.expect(providerBundle.getEntryPaths((String)
EasyMock.anyObject())).andReturn(null).anyTimes();
+ Dictionary<String, String> providerHeaders = new Hashtable<String,
String>();
+ providerHeaders.put(Constants.BUNDLE_CLASSPATH, ".,embedded3.jar");
+
EasyMock.expect(providerBundle.getHeaders()).andReturn(providerHeaders).anyTimes();
+
EasyMock.expect(providerBundle.getResource("embedded3.jar")).andReturn(url).anyTimes();
+ EasyMock.expect(providerBundle.loadClass((String)
EasyMock.anyObject())).andAnswer(new IAnswer<Class<?>>() {
+ @Override
+ public Class<?> answer() throws Throwable {
+ return providerCL.loadClass((String)
EasyMock.getCurrentArguments()[0]);
+ }
+ }).anyTimes();
+ EasyMock.replay(providerBundle);
+
+ Bundle clientBundle = EasyMock.createMock(Bundle.class);
+ EasyMock.replay(clientBundle);
+ ClassLoader clientCL = new TestBundleClassLoader(new URL [] {},
getClass().getClassLoader(), clientBundle);
+
+ Thread.currentThread().setContextClassLoader(null);
+ Util.fixContextClassloader(ServiceLoader.class.getName(), "load",
MySPI.class, clientCL);
+ assertSame("The system is not yet initialized, so the TCCL should not
be set",
+ null, Thread.currentThread().getContextClassLoader());
+ }
+
private static class TestBundleClassLoader extends URLClassLoader
implements BundleReference {
private final Bundle bundle;