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);
+  }
+}