diff --git a/projectapi/test/unit/src/org/netbeans/spi/project/support/DelegatingLookupImplTest.java b/projectapi/test/unit/src/org/netbeans/spi/project/support/DelegatingLookupImplTest.java --- a/projectapi/test/unit/src/org/netbeans/spi/project/support/DelegatingLookupImplTest.java +++ b/projectapi/test/unit/src/org/netbeans/spi/project/support/DelegatingLookupImplTest.java @@ -38,6 +38,8 @@ package org.netbeans.spi.project.support; +import java.util.Collection; +import java.util.concurrent.atomic.AtomicInteger; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; @@ -138,4 +140,36 @@ } } + public void testNestedComposites() 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 DelegatingLookupImpl(base, Lookup.EMPTY, null); + assertEquals(1, nested1.lookupAll(Runnable.class).size()); + Lookup nested2 = new DelegatingLookupImpl(nested1, Lookup.EMPTY, null); + Collection rs = nested2.lookupAll(Runnable.class); + assertEquals(1, rs.size()); + rs.iterator().next().run(); + assertEquals(1, count.get()); + } + } 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); } }