You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by no...@apache.org on 2009/11/12 12:46:03 UTC
svn commit: r835350 - in /incubator/aries/trunk/jndi/jndi-url/src:
main/java/org/apache/aries/jndi/services/ServiceHelper.java
test/java/org/apache/aries/jndi/url/ServiceHelperTest.java
Author: not
Date: Thu Nov 12 11:46:02 2009
New Revision: 835350
URL: http://svn.apache.org/viewvc?rev=835350&view=rev
Log:
ARIES-41 - Walk the class loader heirarchy to find a BundleReference
Modified:
incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/services/ServiceHelper.java
incubator/aries/trunk/jndi/jndi-url/src/test/java/org/apache/aries/jndi/url/ServiceHelperTest.java
Modified: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/services/ServiceHelper.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/services/ServiceHelper.java?rev=835350&r1=835349&r2=835350&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/services/ServiceHelper.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/services/ServiceHelper.java Thu Nov 12 11:46:02 2009
@@ -198,10 +198,14 @@
*/
private static BundleContext getBundleContext()
{
- BundleContext result = context;
+ BundleContext result = null;
ClassLoader cl = Thread.currentThread().getContextClassLoader();
- if (cl instanceof BundleReference) {
- result = ((BundleReference)cl).getBundle().getBundleContext();
+ while (result == null && cl != null) {
+ if (cl instanceof BundleReference) {
+ result = ((BundleReference)cl).getBundle().getBundleContext();
+ } else if (cl != null) {
+ cl = cl.getParent();
+ }
}
if (result == null) result = context;
@@ -248,4 +252,4 @@
return data;
}
-}
\ No newline at end of file
+}
Modified: incubator/aries/trunk/jndi/jndi-url/src/test/java/org/apache/aries/jndi/url/ServiceHelperTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/test/java/org/apache/aries/jndi/url/ServiceHelperTest.java?rev=835350&r1=835349&r2=835350&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/test/java/org/apache/aries/jndi/url/ServiceHelperTest.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/test/java/org/apache/aries/jndi/url/ServiceHelperTest.java Thu Nov 12 11:46:02 2009
@@ -24,6 +24,8 @@
import static org.junit.Assert.assertTrue;
import java.lang.reflect.Field;
+import java.net.URL;
+import java.net.URLClassLoader;
import java.util.Hashtable;
import java.util.List;
import java.util.Properties;
@@ -206,4 +208,41 @@
skel.assertCalledExactNumberOfTimes(getService, 3);
skel.assertCalledExactNumberOfTimes(ungetService, 1);
}
-}
\ No newline at end of file
+
+ /**
+ * This test checks that the getServices method correctly walks the class loader heirarchy
+ * when searching for the callers bundle context.
+ */
+ @Test
+ public void parentClassLoaderImplementsBundleContext()
+ {
+ Bundle b = Skeleton.newMock(new BundleMock("scooby.doo", new Properties()), Bundle.class);
+
+ Skeleton skel = Skeleton.getSkeleton(b);
+
+ ClassLoader cl = new URLClassLoader(new URL[0], ((BundleMock)skel.getTemplateObject()).getClassLoader());
+ cl = new URLClassLoader(new URL[0], cl);
+
+ Thread.currentThread().setContextClassLoader(cl);
+
+ skel = Skeleton.getSkeleton(b.getBundleContext());
+
+ Object retrievedService = ServiceHelper.getService("java.lang.Runnable", null);
+
+ assertNotNull("We could not locate the service in the registry", retrievedService);
+
+ assertTrue("We didn't get back the service we expected", service == retrievedService);
+
+ MethodCall getService = new MethodCall(BundleContext.class, "getService", ServiceReference.class);
+ MethodCall ungetService = new MethodCall(BundleContext.class, "ungetService", ServiceReference.class);
+
+ skel.assertNotCalled(ungetService);
+ skel.assertCalledExactNumberOfTimes(getService, 1);
+
+ Object retrievedService2 = ServiceHelper.getService("java.lang.Runnable", null);
+
+ assertTrue("We got different objects, which we did not want", retrievedService == retrievedService2);
+ skel.assertCalledExactNumberOfTimes(getService, 2);
+ skel.assertCalledExactNumberOfTimes(ungetService, 1);
+ }
+}