This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 130657
Collapse All | Expand All

(-)a/editor.mimelookup.impl/src/org/netbeans/modules/editor/mimelookup/impl/InstanceProviderLookup.java (-2 / +5 lines)
Lines 75-84 public final class InstanceProviderLooku Link Here
75
        
75
        
76
        this.children = new CompoundFolderChildren(paths, true);
76
        this.children = new CompoundFolderChildren(paths, true);
77
        this.children.addPropertyChangeListener(listener);
77
        this.children.addPropertyChangeListener(listener);
78
        
78
    }
79
80
    @Override
81
    protected void initialize() {
79
        rebuild();
82
        rebuild();
80
    }
83
    }
81
84
    
82
    private void rebuild() {
85
    private void rebuild() {
83
        List<FileObject> files = children.getChildren();
86
        List<FileObject> files = children.getChildren();
84
        Object instance = instanceProvider.createInstance(files);
87
        Object instance = instanceProvider.createInstance(files);
(-)a/editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/MimeLookupPopupItemsChangeTest.java (-4 / +30 lines)
Lines 43-54 package org.netbeans.modules.editor.mime Link Here
43
43
44
import java.io.IOException;
44
import java.io.IOException;
45
import java.util.List;
45
import java.util.List;
46
import javax.swing.JPanel;
47
import javax.swing.SwingUtilities;
46
import junit.framework.*;
48
import junit.framework.*;
47
import org.netbeans.api.editor.mimelookup.MimeLookup;
49
import org.netbeans.api.editor.mimelookup.MimeLookup;
48
import org.netbeans.api.editor.mimelookup.MimePath;
50
import org.netbeans.api.editor.mimelookup.MimePath;
49
import org.netbeans.junit.NbTestCase;
51
import org.netbeans.junit.NbTestCase;
52
import org.openide.actions.CopyAction;
50
import org.openide.actions.CutAction;
53
import org.openide.actions.CutAction;
51
import org.openide.actions.FindAction;
54
import org.openide.actions.FindAction;
55
import org.openide.actions.PasteAction;
52
import org.openide.actions.RenameAction;
56
import org.openide.actions.RenameAction;
53
import org.openide.actions.ReplaceAction;
57
import org.openide.actions.ReplaceAction;
54
import org.openide.util.Lookup;
58
import org.openide.util.Lookup;
Lines 85-98 public class MimeLookupPopupItemsChangeT Link Here
85
                   getClass().getClassLoader());
89
                   getClass().getClassLoader());
86
        
90
        
87
    }
91
    }
88
92
    
93
    /** This method is here to simulate that it is possible to get
94
     * instance of the lookup without querying any of registered InstanceProvider.
95
     * They could acquire AWT lock and that can cause deadlocks.
96
     */
97
    private Lookup getLookup(final MimePath path) throws Exception {
98
        
99
        class BlockAWTLock implements Runnable {
100
            Lookup l;
101
            
102
            public void run() {
103
                l = MimeLookup.getLookup(path);
104
            }
105
        }
106
        BlockAWTLock b = new BlockAWTLock();
107
        
108
        synchronized (PopupActions.LOCK) {
109
            SwingUtilities.invokeAndWait(b);
110
        }
111
        
112
        return b.l;
113
    }
114
    
89
    /** Testing Base level popup items lookup and sorting */
115
    /** Testing Base level popup items lookup and sorting */
90
    public void testDynamicChangeInPopupFolders() throws IOException{
116
    public void testDynamicChangeInPopupFolders() throws Exception {
91
        final int resultChangedCount[] = new int[1];
117
        final int resultChangedCount[] = new int[1];
92
        resultChangedCount[0] = 0;
118
        resultChangedCount[0] = 0;
93
119
94
        MimePath mp = MimePath.parse("text/x-java/text/xml/text/html");
120
        MimePath mp = MimePath.parse("text/x-java/text/xml/text/html");
95
        Lookup lookup = MimeLookup.getLookup(mp);
121
        Lookup lookup = getLookup(mp);
96
        Lookup.Result result = lookup.lookup(new Template(PopupActions.class));
122
        Lookup.Result result = lookup.lookup(new Template(PopupActions.class));
97
        result.allInstances(); // remove this line if issue #60010 is fixed
123
        result.allInstances(); // remove this line if issue #60010 is fixed
98
        LookupListener listener = new LookupListener(){
124
        LookupListener listener = new LookupListener(){
Lines 145-151 public class MimeLookupPopupItemsChangeT Link Here
145
        //ReplaceAction was created in the uppermost folder
171
        //ReplaceAction was created in the uppermost folder
146
        // let's try it is missing in the lower lookup
172
        // let's try it is missing in the lower lookup
147
        mp = MimePath.get(MimePath.get("text/x-java"), "text/xml");
173
        mp = MimePath.get(MimePath.get("text/x-java"), "text/xml");
148
        lookup = MimeLookup.getLookup(mp);
174
        lookup = getLookup(mp);
149
        checkPopupItemPresence(lookup, ReplaceAction.class, false);        
175
        checkPopupItemPresence(lookup, ReplaceAction.class, false);        
150
        checkPopupItemPresence(lookup, FindAction.class, true);
176
        checkPopupItemPresence(lookup, FindAction.class, true);
151
        
177
        
(-)a/editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/PopupActions.java (+8 lines)
Lines 46-51 import java.util.ArrayList; Link Here
46
import java.util.ArrayList;
46
import java.util.ArrayList;
47
import java.util.List;
47
import java.util.List;
48
import javax.swing.Action;
48
import javax.swing.Action;
49
import javax.swing.JPanel;
49
import javax.swing.JSeparator;
50
import javax.swing.JSeparator;
50
import org.netbeans.spi.editor.mimelookup.InstanceProvider;
51
import org.netbeans.spi.editor.mimelookup.InstanceProvider;
51
import org.openide.cookies.InstanceCookie;
52
import org.openide.cookies.InstanceCookie;
Lines 59-72 import org.openide.util.actions.SystemAc Link Here
59
 * @author Martin Roskanin
60
 * @author Martin Roskanin
60
 */
61
 */
61
public class PopupActions implements InstanceProvider{
62
public class PopupActions implements InstanceProvider{
63
    static final Object LOCK = new JPanel().getTreeLock();
62
64
63
    List ordered;
65
    List ordered;
64
66
65
    public PopupActions(){
67
    public PopupActions(){
68
        synchronized (LOCK) {
69
            // just try to hold a lock
70
        }
66
    }
71
    }
67
72
68
    public PopupActions(List ordered){
73
    public PopupActions(List ordered){
69
        this.ordered = ordered;
74
        this.ordered = ordered;
75
        synchronized (LOCK) {
76
            // just try to hold a lock
77
        }
70
    }
78
    }
71
79
72
    public List getPopupActions(){
80
    public List getPopupActions(){
(-)a/editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/SwitchLookupTest.java (-1 / +11 lines)
Lines 42-52 package org.netbeans.modules.editor.mime Link Here
42
package org.netbeans.modules.editor.mimelookup.impl;
42
package org.netbeans.modules.editor.mimelookup.impl;
43
43
44
import java.util.Collection;
44
import java.util.Collection;
45
import javax.swing.JPanel;
46
import junit.framework.Test;
45
import org.netbeans.api.editor.mimelookup.MimePath;
47
import org.netbeans.api.editor.mimelookup.MimePath;
46
import org.netbeans.junit.NbTestCase;
48
import org.netbeans.junit.NbTestCase;
49
import org.netbeans.junit.NbTestSuite;
50
import org.openide.util.Exceptions;
47
import org.openide.util.Lookup;
51
import org.openide.util.Lookup;
48
import org.openide.util.LookupEvent;
52
import org.openide.util.LookupEvent;
49
import org.openide.util.LookupListener;
53
import org.openide.util.LookupListener;
54
import org.openide.util.RequestProcessor;
50
55
51
/**
56
/**
52
 *
57
 *
Lines 57-62 public class SwitchLookupTest extends Nb Link Here
57
    /** Creates a new instance of FolderPathLookupTest */
62
    /** Creates a new instance of FolderPathLookupTest */
58
    public SwitchLookupTest(String name) {
63
    public SwitchLookupTest(String name) {
59
        super(name);
64
        super(name);
65
    }
66
    
67
    public static Test suite() {
68
        //return new SwitchLookupTest("testSimpleWhileSomeOneElseHoldsAWTLock");
69
        return new NbTestSuite(SwitchLookupTest.class);
60
    }
70
    }
61
71
62
    protected @Override void setUp() throws Exception {
72
    protected @Override void setUp() throws Exception {
Lines 89-95 public class SwitchLookupTest extends Nb Link Here
89
        
99
        
90
        assertEquals("Wrong number of instances", 0, instances.size());
100
        assertEquals("Wrong number of instances", 0, instances.size());
91
    }
101
    }
92
102
    
93
    public void testAddingMimePath() throws Exception {
103
    public void testAddingMimePath() throws Exception {
94
        // Create lookup over a non-existing mime path
104
        // Create lookup over a non-existing mime path
95
        Lookup lookup = new SwitchLookup(MimePath.parse("text/x-jsp/text/x-java"));
105
        Lookup lookup = new SwitchLookup(MimePath.parse("text/x-jsp/text/x-java"));
(-)a/editor.mimelookup/src/org/netbeans/modules/editor/mimelookup/MimePathLookup.java (-2 / +12 lines)
Lines 52-61 import org.netbeans.spi.editor.mimelooku Link Here
52
import org.netbeans.spi.editor.mimelookup.MimeDataProvider;
52
import org.netbeans.spi.editor.mimelookup.MimeDataProvider;
53
import org.netbeans.spi.editor.mimelookup.MimeLookupInitializer;
53
import org.netbeans.spi.editor.mimelookup.MimeLookupInitializer;
54
import org.openide.util.Lookup;
54
import org.openide.util.Lookup;
55
import org.openide.util.Lookup.Template;
55
import org.openide.util.LookupEvent;
56
import org.openide.util.LookupEvent;
56
import org.openide.util.LookupListener;
57
import org.openide.util.LookupListener;
57
import org.openide.util.WeakListeners;
58
import org.openide.util.WeakListeners;
58
import org.openide.util.lookup.ProxyLookup;
59
import org.openide.util.lookup.ProxyLookup;
60
59
61
60
/**
62
/**
61
 *
63
 *
Lines 70-75 public final class MimePathLookup extend Link Here
70
    private final boolean mimePathBanned;
72
    private final boolean mimePathBanned;
71
    private final Lookup.Result<MimeDataProvider> dataProviders;
73
    private final Lookup.Result<MimeDataProvider> dataProviders;
72
    private final Lookup.Result<MimeLookupInitializer> mimeInitializers; // This is supported for backwards compatibility only.
74
    private final Lookup.Result<MimeLookupInitializer> mimeInitializers; // This is supported for backwards compatibility only.
75
    private volatile transient boolean initialized;
73
    
76
    
74
    /** Creates a new instance of MimePathLookup */
77
    /** Creates a new instance of MimePathLookup */
75
    public MimePathLookup(MimePath mimePath) {
78
    public MimePathLookup(MimePath mimePath) {
Lines 87-96 public final class MimePathLookup extend Link Here
87
90
88
        mimeInitializers = Lookup.getDefault().lookup(new Lookup.Template<MimeLookupInitializer>(MimeLookupInitializer.class));
91
        mimeInitializers = Lookup.getDefault().lookup(new Lookup.Template<MimeLookupInitializer>(MimeLookupInitializer.class));
89
        mimeInitializers.addLookupListener(WeakListeners.create(LookupListener.class, this, mimeInitializers));
92
        mimeInitializers.addLookupListener(WeakListeners.create(LookupListener.class, this, mimeInitializers));
90
        
91
        rebuild();
92
    }
93
    }
93
94
95
    @Override
96
    protected void beforeLookup(Template<?> template) {
97
        if (!initialized) {
98
            initialized = true;
99
            rebuild();
100
        }
101
    }
102
    
103
    
94
    public MimePath getMimePath() {
104
    public MimePath getMimePath() {
95
        return mimePath;
105
        return mimePath;
96
    }
106
    }

Return to bug 130657