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 42738
Collapse All | Expand All

(-)ant/project/src/org/netbeans/modules/project/ant/AntBasedProjectFactorySingleton.java (-1 / +41 lines)
Lines 15-27 Link Here
15
15
16
import java.io.File;
16
import java.io.File;
17
import java.io.IOException;
17
import java.io.IOException;
18
import java.io.InputStream;
19
import java.lang.ref.Reference;
18
import java.lang.ref.Reference;
20
import java.lang.ref.WeakReference;
19
import java.lang.ref.WeakReference;
21
import java.util.ArrayList;
20
import java.util.ArrayList;
22
import java.util.HashMap;
21
import java.util.HashMap;
22
import java.util.HashSet;
23
import java.util.Iterator;
23
import java.util.Iterator;
24
import java.util.List;
24
import java.util.Map;
25
import java.util.Map;
26
import java.util.Set;
25
import java.util.WeakHashMap;
27
import java.util.WeakHashMap;
26
import org.netbeans.api.project.Project;
28
import org.netbeans.api.project.Project;
27
import org.netbeans.spi.project.ProjectFactory;
29
import org.netbeans.spi.project.ProjectFactory;
Lines 55-60 Link Here
55
    
57
    
56
    private static final Map/*<Project,Reference<AntProjectHelper>>*/ project2Helper = new WeakHashMap();
58
    private static final Map/*<Project,Reference<AntProjectHelper>>*/ project2Helper = new WeakHashMap();
57
    private static final Map/*<AntProjectHelper,Reference<Project>>*/ helper2Project = new WeakHashMap();
59
    private static final Map/*<AntProjectHelper,Reference<Project>>*/ helper2Project = new WeakHashMap();
60
    private static final Map/*<AntBasedProjectType, List<Reference<AntProjectHelper>>>*/ type2Projects = new HashMap(); //for second part of #42738
58
    private static final Lookup.Result/*<AntBasedProjectType>*/ antBasedProjectTypes;
61
    private static final Lookup.Result/*<AntBasedProjectType>*/ antBasedProjectTypes;
59
    private static Map/*<String,AntBasedProjectType>*/ antBasedProjectTypesByType = null;
62
    private static Map/*<String,AntBasedProjectType>*/ antBasedProjectTypesByType = null;
60
    static {
63
    static {
Lines 62-73 Link Here
62
        antBasedProjectTypes.addLookupListener(new LookupListener() {
65
        antBasedProjectTypes.addLookupListener(new LookupListener() {
63
            public void resultChanged(LookupEvent ev) {
66
            public void resultChanged(LookupEvent ev) {
64
                synchronized (AntBasedProjectFactorySingleton.class) {
67
                synchronized (AntBasedProjectFactorySingleton.class) {
68
                    Set/*<AntBasedProjectType>*/ oldTypes = type2Projects.keySet();
69
                    Set/*<AntBasedProjectType>*/ removed  = new HashSet(oldTypes);
70
                    
71
                    removed.removeAll(antBasedProjectTypes.allInstances());
72
                    
73
                    antBasedProjectTypesRemoved(removed);
74
                    
65
                    antBasedProjectTypesByType = null;
75
                    antBasedProjectTypesByType = null;
66
                }
76
                }
67
            }
77
            }
68
        });
78
        });
69
    }
79
    }
70
    
80
    
81
    private static void antBasedProjectTypesRemoved(Set/*<AntBasedProjectType>*/ removed) {
82
        for (Iterator/*<AntBasedProjectType>*/ i = removed.iterator(); i.hasNext(); ){
83
            AntBasedProjectType type = (AntBasedProjectType) i.next();
84
            List/*<Reference<AntProjectHelper>>*/ projects = (List/*<Reference<AntProjectHelper>>*/) type2Projects.get(type);
85
            
86
            if (projects != null) {
87
                for (Iterator/*<Reference<AntProjectHelper>>*/ prjs = projects.iterator(); prjs.hasNext(); ) {
88
                    Reference/*<AntProjectHelper>*/ r = (Reference/*<AntProjectHelper>*/) prjs.next();
89
                    Object instance = r.get();
90
                    
91
                    if (instance != null) {
92
                        AntProjectHelper helper = (AntProjectHelper) instance;
93
                        
94
                        helper.notifyDeleted();
95
                    }
96
                }
97
            }
98
            
99
            type2Projects.remove(type);
100
        }
101
    }
102
    
71
    private static synchronized AntBasedProjectType findAntBasedProjectType(String type) {
103
    private static synchronized AntBasedProjectType findAntBasedProjectType(String type) {
72
        if (antBasedProjectTypesByType == null) {
104
        if (antBasedProjectTypesByType == null) {
73
            Iterator it = new ArrayList(antBasedProjectTypes.allInstances()).iterator();
105
            Iterator it = new ArrayList(antBasedProjectTypes.allInstances()).iterator();
Lines 133-138 Link Here
133
        Project project = provider.createProject(helper);
165
        Project project = provider.createProject(helper);
134
        project2Helper.put(project, new WeakReference(helper));
166
        project2Helper.put(project, new WeakReference(helper));
135
        helper2Project.put(helper, new WeakReference(project));
167
        helper2Project.put(helper, new WeakReference(project));
168
        List/*<Reference<AntProjectHelper>>*/ l = (List/*<Reference<AntProjectHelper>>*/) type2Projects.get(provider);
169
        
170
        if (l == null) {
171
            type2Projects.put(provider, l = new ArrayList/*<Reference<AntProjectHelper>>*/());
172
        }
173
        
174
        l.add(new WeakReference(helper));
175
        
136
        return project;
176
        return project;
137
    }
177
    }
138
    
178
    
(-)ant/project/test/unit/src/org/netbeans/modules/project/ant/AntBasedProjectFactorySingletonTest.java (+123 lines)
Added Link Here
1
/*
2
 *                 Sun Public License Notice
3
 *
4
 * The contents of this file are subject to the Sun Public License
5
 * Version 1.0 (the "License"). You may not use this file except in
6
 * compliance with the License. A copy of the License is available at
7
 * http://www.sun.com/
8
 *
9
 * The Original Code is NetBeans. The Initial Developer of the Original
10
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2005 Sun
11
 * Microsystems, Inc. All Rights Reserved.
12
 */
13
14
package org.netbeans.modules.project.ant;
15
16
import java.lang.reflect.Method;
17
import junit.framework.Test;
18
import junit.framework.TestSuite;
19
import org.netbeans.api.project.Project;
20
import org.netbeans.api.project.ProjectManager;
21
import org.netbeans.api.project.TestUtil;
22
import org.netbeans.junit.NbTestCase;
23
import org.netbeans.spi.project.support.ant.AntBasedProjectType;
24
import org.netbeans.spi.project.support.ant.AntBasedTestUtil;
25
import org.netbeans.spi.project.support.ant.AntProjectHelper;
26
import org.netbeans.spi.project.support.ant.AntProjectHelperTest;
27
import org.openide.filesystems.FileObject;
28
import org.openide.util.lookup.Lookups;
29
30
31
/**
32
 *
33
 * @author Jan Lahoda
34
 */
35
public class AntBasedProjectFactorySingletonTest extends NbTestCase {
36
    
37
    public AntBasedProjectFactorySingletonTest(String testName) {
38
        super(testName);
39
    }
40
41
    private FileObject scratch;
42
    private FileObject projdir;
43
    
44
    protected void setUp() throws Exception {
45
        scratch = TestUtil.makeScratchDir(this);
46
        projdir = scratch.createFolder("proj");
47
        TestUtil.createFileFromContent(AntProjectHelperTest.class.getResource("data/project.xml"), projdir, "nbproject/project.xml");
48
        TestUtil.createFileFromContent(AntProjectHelperTest.class.getResource("data/private.xml"), projdir, "nbproject/private/private.xml");
49
        TestUtil.createFileFromContent(AntProjectHelperTest.class.getResource("data/project.properties"), projdir, "nbproject/project.properties");
50
        TestUtil.createFileFromContent(AntProjectHelperTest.class.getResource("data/private.properties"), projdir, "nbproject/private/private.properties");
51
        TestUtil.createFileFromContent(AntProjectHelperTest.class.getResource("data/global.properties"), scratch, "userdir/build.properties");
52
        TestUtil.setLookup(new Object[] {
53
            AntBasedTestUtil.testAntBasedProjectType(),
54
        });
55
    }
56
57
    protected void tearDown() throws Exception {
58
    }
59
60
    public static Test suite() {
61
        TestSuite suite = new TestSuite(AntBasedProjectFactorySingletonTest.class);
62
        
63
        return suite;
64
    }
65
66
    /**Test for second part of #42738.
67
     */
68
    public void testAntBasedProjectTypesChanged() throws Exception {
69
        AntBasedProjectFactorySingleton factory = new AntBasedProjectFactorySingleton();
70
        AntBasedProjectType type1 = AntBasedTestUtil.testAntBasedProjectType();
71
        AntBasedProjectType type2 = AntBasedTestUtil.testAntBasedProjectType();
72
        
73
        TestUtil.setLookup(Lookups.fixed(new Object[] {
74
            factory,
75
            type1,
76
            type2,
77
        }));
78
        
79
        Method getAntBasedProjectTypeMethod = AntProjectHelper.class.getDeclaredMethod("getType", new Class[0]);
80
        
81
        getAntBasedProjectTypeMethod.setAccessible(true);
82
        
83
        Project p = ProjectManager.getDefault().findProject(projdir);
84
        AntProjectHelper helper = (AntProjectHelper) p.getLookup().lookup(AntProjectHelper.class);
85
        
86
        assertTrue(getAntBasedProjectTypeMethod.invoke(helper, null) == type2);
87
        
88
        TestUtil.setLookup(Lookups.fixed(new Object[] {
89
            factory,
90
            type1,
91
        }));
92
        
93
        p = ProjectManager.getDefault().findProject(projdir);
94
        helper = (AntProjectHelper) p.getLookup().lookup(AntProjectHelper.class);
95
        
96
        assertTrue(getAntBasedProjectTypeMethod.invoke(helper, null) == type1);
97
        
98
        TestUtil.setLookup(Lookups.fixed(new Object[] {
99
            factory,
100
            type2,
101
        }));
102
        
103
        p = ProjectManager.getDefault().findProject(projdir);
104
        helper = (AntProjectHelper) p.getLookup().lookup(AntProjectHelper.class);
105
        
106
        assertTrue(getAntBasedProjectTypeMethod.invoke(helper, null) == type2);
107
        
108
        TestUtil.setLookup(Lookups.fixed(new Object[] {
109
            factory,
110
        }));
111
        
112
        assertNull(ProjectManager.getDefault().findProject(projdir));
113
114
        TestUtil.setLookup(Lookups.fixed(new Object[] {
115
            factory,
116
            type1,
117
            type2,
118
        }));
119
        
120
        assertTrue(getAntBasedProjectTypeMethod.invoke(helper, null) == type2);
121
    }
122
    
123
}

Return to bug 42738