diff --git a/projectapi/test/unit/src/org/netbeans/spi/project/support/LookupProviderSupportTest.java b/projectapi/test/unit/src/org/netbeans/spi/project/support/LookupProviderSupportTest.java --- a/projectapi/test/unit/src/org/netbeans/spi/project/support/LookupProviderSupportTest.java +++ b/projectapi/test/unit/src/org/netbeans/spi/project/support/LookupProviderSupportTest.java @@ -47,11 +47,13 @@ import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JCheckBox; @@ -230,6 +232,38 @@ Collections.sort(names); assertEquals("[group1, group2, group3]", names.toString()); } + + public void testNestedComposites2() throws Exception { // #200711 + final AtomicInteger count = new AtomicInteger(); + final Runnable orig = new Runnable() { + @Override public void run() { + count.incrementAndGet(); + } + }; + class RunnableMerger implements LookupMerger { + @Override public Class getMergeableClass() {return Runnable.class;} + @Override public Runnable merge(final Lookup lookup) { + return new Runnable() { + @Override public void run() { + orig.run(); + for (Runnable r : lookup.lookupAll(Runnable.class)) { + assertFalse(r == orig); + assertFalse(r == this); + r.run(); + } + } + }; + } + } + Lookup base = Lookups.fixed(new RunnableMerger()); + Lookup nested1 = new LookupProviderSupport.DelegatingLookupImpl(base, Lookup.EMPTY, null); + assertEquals(1, nested1.lookupAll(Runnable.class).size()); + Lookup nested2 = new LookupProviderSupport.DelegatingLookupImpl(nested1, Lookup.EMPTY, null); + Collection rs = nested2.lookupAll(Runnable.class); + assertEquals(1, rs.size()); + rs.iterator().next().run(); + assertEquals(1, count.get()); + } private class LookupProviderImpl implements LookupProvider { InstanceContent ic = new InstanceContent(); diff --git a/projectuiapi/src/org/netbeans/spi/project/ui/support/UILookupMergerSupport.java b/projectuiapi/src/org/netbeans/spi/project/ui/support/UILookupMergerSupport.java --- a/projectuiapi/src/org/netbeans/spi/project/ui/support/UILookupMergerSupport.java +++ b/projectuiapi/src/org/netbeans/spi/project/ui/support/UILookupMergerSupport.java @@ -196,7 +196,7 @@ ProjectOpenedTrampoline.DEFAULT.projectOpened(defaultInstance); } for (ProjectOpenedHook poh : lkp.lookupAll(ProjectOpenedHook.class)) { - if (poh != defaultInstance && /* XXX #200500: should be: poh != this */!(poh instanceof OpenHookImpl)) { + if (poh != defaultInstance && poh != this) { ProjectOpenedTrampoline.DEFAULT.projectOpened(poh); } } @@ -207,7 +207,7 @@ ProjectOpenedTrampoline.DEFAULT.projectClosed(defaultInstance); } for (ProjectOpenedHook poh : lkp.lookupAll(ProjectOpenedHook.class)) { - if (poh != defaultInstance && !(poh instanceof OpenHookImpl)) { + if (poh != defaultInstance && poh != this) { ProjectOpenedTrampoline.DEFAULT.projectClosed(poh); } }