Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ClassLoadingBundleTests.java')
-rw-r--r--bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ClassLoadingBundleTests.java81
1 files changed, 81 insertions, 0 deletions
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ClassLoadingBundleTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ClassLoadingBundleTests.java
index 20fbe4366..1acbfb4a1 100644
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ClassLoadingBundleTests.java
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ClassLoadingBundleTests.java
@@ -15,6 +15,7 @@ import java.lang.reflect.Method;
import java.net.*;
import java.util.*;
import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicBoolean;
import javax.jws.WebService;
import javax.xml.namespace.QName;
import javax.xml.ws.Endpoint;
@@ -25,6 +26,8 @@ import org.eclipse.osgi.tests.OSGiTestsActivator;
import org.osgi.framework.*;
import org.osgi.framework.hooks.resolver.ResolverHook;
import org.osgi.framework.hooks.resolver.ResolverHookFactory;
+import org.osgi.framework.hooks.weaving.WeavingHook;
+import org.osgi.framework.hooks.weaving.WovenClass;
import org.osgi.framework.namespace.PackageNamespace;
import org.osgi.framework.wiring.*;
import org.osgi.service.packageadmin.ExportedPackage;
@@ -2221,6 +2224,84 @@ public class ClassLoadingBundleTests extends AbstractBundleTests {
}
}
+ public void testRecursiveWeavingHookFactory() {
+ final ThreadLocal<Boolean> testThread = new ThreadLocal<Boolean>() {
+ @Override
+ protected Boolean initialValue() {
+ return Boolean.FALSE;
+ }
+ };
+
+ testThread.set(Boolean.TRUE);
+ final Set<String> weavingHookClasses = new HashSet<String>();
+ final List<WovenClass> called = new ArrayList<WovenClass>();
+ final AtomicBoolean loadNewClassInWeave = new AtomicBoolean(false);
+
+ ServiceFactory<WeavingHook> topFactory = new ServiceFactory<WeavingHook>() {
+ @Override
+ public WeavingHook getService(Bundle bundle, ServiceRegistration<WeavingHook> registration) {
+ if (!testThread.get()) {
+ return null;
+ }
+ WeavingHook hook = new WeavingHook() {
+
+ @Override
+ public void weave(WovenClass wovenClass) {
+ if (loadNewClassInWeave.get()) {
+ // Force a load of inner class
+ Runnable run = new Runnable() {
+ @Override
+ public void run() {
+ // nothing
+ }
+ };
+ run.run();
+ weavingHookClasses.add(run.getClass().getName());
+ }
+ called.add(wovenClass);
+ }
+ };
+ weavingHookClasses.add(hook.getClass().getName());
+ return hook;
+ }
+
+ @Override
+ public void ungetService(Bundle bundle, ServiceRegistration<WeavingHook> registration, WeavingHook service) {
+ // nothing
+ }
+ };
+ ServiceRegistration<WeavingHook> reg = getContext().registerService(WeavingHook.class, topFactory, null);
+
+ Runnable run = null;
+ try {
+ // force call to factory without protection of the framework recursion checks
+ topFactory.getService(null, null);
+
+ // set flag to load inner class while weaving
+ loadNewClassInWeave.set(true);
+
+ // Force a load of inner class
+ run = new Runnable() {
+ @Override
+ public void run() {
+ // nothing
+ }
+ };
+ run.run();
+ } finally {
+ reg.unregister();
+ }
+
+ assertEquals("Unexpected number of woven classes.", 3, called.size());
+ for (WovenClass wovenClass : called) {
+ if (weavingHookClasses.contains(wovenClass.getClassName())) {
+ assertNull("Did not expect to find class: " + wovenClass.getDefinedClass(), wovenClass.getDefinedClass());
+ } else {
+ assertEquals("Expected the inner runnable class.", run.getClass(), wovenClass.getDefinedClass());
+ }
+ }
+ }
+
public void testLoaderUninstalledBundle() throws BundleException, IOException {
String testResourcePath = "testResource";
File config = OSGiTestsActivator.getContext().getDataFile(getName()); //$NON-NLS-1$

Back to the top