diff --git a/openide.util/src/org/openide/util/lookup/MetaInfServicesLookup.java b/openide.util/src/org/openide/util/lookup/MetaInfServicesLookup.java --- a/openide.util/src/org/openide/util/lookup/MetaInfServicesLookup.java +++ b/openide.util/src/org/openide/util/lookup/MetaInfServicesLookup.java @@ -55,11 +55,11 @@ import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; -import java.util.Map; -import java.util.WeakHashMap; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import org.openide.util.Lookup; +import org.openide.util.WeakSet; /** * @author Jaroslav Tulach, Jesse Glick @@ -84,7 +84,7 @@ * However we also hold classes which are definitely not loadable by * our loader. */ - private final Map classes = new WeakHashMap(); + private final Set classes = new WeakSet(); /** class loader to use */ private final ClassLoader loader; @@ -108,29 +108,13 @@ /* Tries to load appropriate resources from manifest files. */ @Override - protected final void beforeLookup(Lookup.Template t) { + protected synchronized final void beforeLookup(Lookup.Template t) { Class c = t.getType(); - - HashSet listeners; - - synchronized (this) { - if (classes.put(c, "") == null) { // NOI18N - // Added new class, search for it. - LinkedHashSet> arr = getPairsAsLHS(); - search(c, arr); - - // listeners are notified under while holding lock on class c, - // let say it is acceptable now - listeners = setPairsAndCollectListeners(arr); - } else { - // ok, nothing needs to be done - return; - } - } - - NotifyListeners notify = new NotifyListeners(listeners); - if (notify.shallRun()) { - notify.run(); + if (classes.add(c)) { + // Added new class, search for it. + LinkedHashSet> arr = getPairsAsLHS(); + search(c, arr); + setPairsAndCollectListeners(arr); // #169844: do not notify } } diff --git a/openide.util/test/unit/src/org/openide/util/lookup/MetaInfServicesLookupTest.java b/openide.util/test/unit/src/org/openide/util/lookup/MetaInfServicesLookupTest.java --- a/openide.util/test/unit/src/org/openide/util/lookup/MetaInfServicesLookupTest.java +++ b/openide.util/test/unit/src/org/openide/util/lookup/MetaInfServicesLookupTest.java @@ -62,8 +62,6 @@ import java.util.Set; import java.util.TreeSet; import java.util.WeakHashMap; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import java.util.logging.Level; @@ -74,8 +72,6 @@ import org.netbeans.junit.MockServices; import org.netbeans.junit.NbTestCase; import org.openide.util.Lookup; -import org.openide.util.LookupEvent; -import org.openide.util.LookupListener; import org.openide.util.test.MockLookup; /** Test finding services from manifest. @@ -389,39 +385,12 @@ assertGC("Class can be garbage collected", ref); } - public void testListenersAreNotifiedWithoutHoldingALockIssue36035() throws Exception { + public void testSuperTypes() throws Exception { final Lookup l = getTestedLookup(c2); - final Class xface = c1.loadClass("org.foo.Interface"); - final Lookup.Result res = l.lookup(new Lookup.Template(Object.class)); - - class L implements LookupListener, Runnable { - private Thread toInterrupt; - - public void run() { - assertNotNull("Possible to query lookup", l.lookup(xface)); - assertEquals("and there are two items", 2, res.allInstances().size()); - toInterrupt.interrupt(); - } - - public synchronized void resultChanged(LookupEvent ev) { - toInterrupt = Thread.currentThread(); - Executors.newSingleThreadScheduledExecutor().schedule(this, 0, TimeUnit.MICROSECONDS); - try { - wait(3000); - fail("Should be interrupted - means it was not possible to finish query in run() method"); - } catch (InterruptedException ex) { - // this is what we want - } - } - } - L listener = new L(); - - res.addLookupListener(listener); + final Class xface = c1.loadClass("org.foo.Interface"); + final Lookup.Result res = l.lookupResult(Object.class); assertEquals("Nothing yet", 0, res.allInstances().size()); - assertNotNull("Interface found", l.lookup(xface)); - assertNotNull("Listener notified", listener.toInterrupt); - assertEquals("Now two", 2, res.allInstances().size()); }