diff -r 39486fc0cdce editor.mimelookup.impl/src/org/netbeans/modules/editor/mimelookup/impl/InstanceProviderLookup.java --- a/editor.mimelookup.impl/src/org/netbeans/modules/editor/mimelookup/impl/InstanceProviderLookup.java Thu Mar 20 23:01:12 2008 +0100 +++ b/editor.mimelookup.impl/src/org/netbeans/modules/editor/mimelookup/impl/InstanceProviderLookup.java Fri Mar 21 00:01:00 2008 +0100 @@ -75,10 +75,13 @@ public final class InstanceProviderLooku this.children = new CompoundFolderChildren(paths, true); this.children.addPropertyChangeListener(listener); - + } + + @Override + protected void initialize() { rebuild(); } - + private void rebuild() { List files = children.getChildren(); Object instance = instanceProvider.createInstance(files); diff -r 39486fc0cdce editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/MimeLookupPopupItemsChangeTest.java --- a/editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/MimeLookupPopupItemsChangeTest.java Thu Mar 20 23:01:12 2008 +0100 +++ b/editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/MimeLookupPopupItemsChangeTest.java Fri Mar 21 00:01:00 2008 +0100 @@ -43,12 +43,16 @@ package org.netbeans.modules.editor.mime import java.io.IOException; import java.util.List; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; import junit.framework.*; import org.netbeans.api.editor.mimelookup.MimeLookup; import org.netbeans.api.editor.mimelookup.MimePath; import org.netbeans.junit.NbTestCase; +import org.openide.actions.CopyAction; import org.openide.actions.CutAction; import org.openide.actions.FindAction; +import org.openide.actions.PasteAction; import org.openide.actions.RenameAction; import org.openide.actions.ReplaceAction; import org.openide.util.Lookup; @@ -85,14 +89,36 @@ public class MimeLookupPopupItemsChangeT getClass().getClassLoader()); } - + + /** This method is here to simulate that it is possible to get + * instance of the lookup without querying any of registered InstanceProvider. + * They could acquire AWT lock and that can cause deadlocks. + */ + private Lookup getLookup(final MimePath path) throws Exception { + + class BlockAWTLock implements Runnable { + Lookup l; + + public void run() { + l = MimeLookup.getLookup(path); + } + } + BlockAWTLock b = new BlockAWTLock(); + + synchronized (PopupActions.LOCK) { + SwingUtilities.invokeAndWait(b); + } + + return b.l; + } + /** Testing Base level popup items lookup and sorting */ - public void testDynamicChangeInPopupFolders() throws IOException{ + public void testDynamicChangeInPopupFolders() throws Exception { final int resultChangedCount[] = new int[1]; resultChangedCount[0] = 0; MimePath mp = MimePath.parse("text/x-java/text/xml/text/html"); - Lookup lookup = MimeLookup.getLookup(mp); + Lookup lookup = getLookup(mp); Lookup.Result result = lookup.lookup(new Template(PopupActions.class)); result.allInstances(); // remove this line if issue #60010 is fixed LookupListener listener = new LookupListener(){ @@ -145,7 +171,7 @@ public class MimeLookupPopupItemsChangeT //ReplaceAction was created in the uppermost folder // let's try it is missing in the lower lookup mp = MimePath.get(MimePath.get("text/x-java"), "text/xml"); - lookup = MimeLookup.getLookup(mp); + lookup = getLookup(mp); checkPopupItemPresence(lookup, ReplaceAction.class, false); checkPopupItemPresence(lookup, FindAction.class, true); diff -r 39486fc0cdce editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/PopupActions.java --- a/editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/PopupActions.java Thu Mar 20 23:01:12 2008 +0100 +++ b/editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/PopupActions.java Fri Mar 21 00:01:00 2008 +0100 @@ -46,6 +46,7 @@ import java.util.ArrayList; import java.util.ArrayList; import java.util.List; import javax.swing.Action; +import javax.swing.JPanel; import javax.swing.JSeparator; import org.netbeans.spi.editor.mimelookup.InstanceProvider; import org.openide.cookies.InstanceCookie; @@ -59,14 +60,21 @@ import org.openide.util.actions.SystemAc * @author Martin Roskanin */ public class PopupActions implements InstanceProvider{ + static final Object LOCK = new JPanel().getTreeLock(); List ordered; public PopupActions(){ + synchronized (LOCK) { + // just try to hold a lock + } } public PopupActions(List ordered){ this.ordered = ordered; + synchronized (LOCK) { + // just try to hold a lock + } } public List getPopupActions(){ diff -r 39486fc0cdce editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/SwitchLookupTest.java --- a/editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/SwitchLookupTest.java Thu Mar 20 23:01:12 2008 +0100 +++ b/editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/SwitchLookupTest.java Fri Mar 21 00:01:00 2008 +0100 @@ -42,11 +42,16 @@ package org.netbeans.modules.editor.mime package org.netbeans.modules.editor.mimelookup.impl; import java.util.Collection; +import javax.swing.JPanel; +import junit.framework.Test; import org.netbeans.api.editor.mimelookup.MimePath; import org.netbeans.junit.NbTestCase; +import org.netbeans.junit.NbTestSuite; +import org.openide.util.Exceptions; import org.openide.util.Lookup; import org.openide.util.LookupEvent; import org.openide.util.LookupListener; +import org.openide.util.RequestProcessor; /** * @@ -57,6 +62,11 @@ public class SwitchLookupTest extends Nb /** Creates a new instance of FolderPathLookupTest */ public SwitchLookupTest(String name) { super(name); + } + + public static Test suite() { + //return new SwitchLookupTest("testSimpleWhileSomeOneElseHoldsAWTLock"); + return new NbTestSuite(SwitchLookupTest.class); } protected @Override void setUp() throws Exception { @@ -89,7 +99,7 @@ public class SwitchLookupTest extends Nb assertEquals("Wrong number of instances", 0, instances.size()); } - + public void testAddingMimePath() throws Exception { // Create lookup over a non-existing mime path Lookup lookup = new SwitchLookup(MimePath.parse("text/x-jsp/text/x-java")); diff -r 39486fc0cdce editor.mimelookup/src/org/netbeans/modules/editor/mimelookup/MimePathLookup.java --- a/editor.mimelookup/src/org/netbeans/modules/editor/mimelookup/MimePathLookup.java Thu Mar 20 23:01:12 2008 +0100 +++ b/editor.mimelookup/src/org/netbeans/modules/editor/mimelookup/MimePathLookup.java Fri Mar 21 00:01:00 2008 +0100 @@ -52,10 +52,12 @@ import org.netbeans.spi.editor.mimelooku import org.netbeans.spi.editor.mimelookup.MimeDataProvider; import org.netbeans.spi.editor.mimelookup.MimeLookupInitializer; import org.openide.util.Lookup; +import org.openide.util.Lookup.Template; import org.openide.util.LookupEvent; import org.openide.util.LookupListener; import org.openide.util.WeakListeners; import org.openide.util.lookup.ProxyLookup; + /** * @@ -70,6 +72,7 @@ public final class MimePathLookup extend private final boolean mimePathBanned; private final Lookup.Result dataProviders; private final Lookup.Result mimeInitializers; // This is supported for backwards compatibility only. + private volatile transient boolean initialized; /** Creates a new instance of MimePathLookup */ public MimePathLookup(MimePath mimePath) { @@ -87,10 +90,17 @@ public final class MimePathLookup extend mimeInitializers = Lookup.getDefault().lookup(new Lookup.Template(MimeLookupInitializer.class)); mimeInitializers.addLookupListener(WeakListeners.create(LookupListener.class, this, mimeInitializers)); - - rebuild(); } + @Override + protected void beforeLookup(Template template) { + if (!initialized) { + initialized = true; + rebuild(); + } + } + + public MimePath getMimePath() { return mimePath; }