Index: ant/project/src/org/netbeans/modules/project/ant/AntBasedProjectFactorySingleton.java =================================================================== RCS file: /cvs/ant/project/src/org/netbeans/modules/project/ant/AntBasedProjectFactorySingleton.java,v retrieving revision 1.6 diff -u -r1.6 AntBasedProjectFactorySingleton.java --- ant/project/src/org/netbeans/modules/project/ant/AntBasedProjectFactorySingleton.java 23 Feb 2005 12:25:42 -0000 1.6 +++ ant/project/src/org/netbeans/modules/project/ant/AntBasedProjectFactorySingleton.java 20 May 2005 13:37:50 -0000 @@ -15,13 +15,15 @@ import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.lang.ref.Reference; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; +import java.util.Set; import java.util.WeakHashMap; import org.netbeans.api.project.Project; import org.netbeans.spi.project.ProjectFactory; @@ -55,6 +57,7 @@ private static final Map/*>*/ project2Helper = new WeakHashMap(); private static final Map/*>*/ helper2Project = new WeakHashMap(); + private static final Map/*>>*/ type2Projects = new HashMap(); //for second part of #42738 private static final Lookup.Result/**/ antBasedProjectTypes; private static Map/**/ antBasedProjectTypesByType = null; static { @@ -62,12 +65,41 @@ antBasedProjectTypes.addLookupListener(new LookupListener() { public void resultChanged(LookupEvent ev) { synchronized (AntBasedProjectFactorySingleton.class) { + Set/**/ oldTypes = type2Projects.keySet(); + Set/**/ removed = new HashSet(oldTypes); + + removed.removeAll(antBasedProjectTypes.allInstances()); + + antBasedProjectTypesRemoved(removed); + antBasedProjectTypesByType = null; } } }); } + private static void antBasedProjectTypesRemoved(Set/**/ removed) { + for (Iterator/**/ i = removed.iterator(); i.hasNext(); ){ + AntBasedProjectType type = (AntBasedProjectType) i.next(); + List/*>*/ projects = (List/*>*/) type2Projects.get(type); + + if (projects != null) { + for (Iterator/*>*/ prjs = projects.iterator(); prjs.hasNext(); ) { + Reference/**/ r = (Reference/**/) prjs.next(); + Object instance = r.get(); + + if (instance != null) { + AntProjectHelper helper = (AntProjectHelper) instance; + + helper.notifyDeleted(); + } + } + } + + type2Projects.remove(type); + } + } + private static synchronized AntBasedProjectType findAntBasedProjectType(String type) { if (antBasedProjectTypesByType == null) { Iterator it = new ArrayList(antBasedProjectTypes.allInstances()).iterator(); @@ -133,6 +165,14 @@ Project project = provider.createProject(helper); project2Helper.put(project, new WeakReference(helper)); helper2Project.put(helper, new WeakReference(project)); + List/*>*/ l = (List/*>*/) type2Projects.get(provider); + + if (l == null) { + type2Projects.put(provider, l = new ArrayList/*>*/()); + } + + l.add(new WeakReference(helper)); + return project; } Index: ant/project/test/unit/src/org/netbeans/modules/project/ant/AntBasedProjectFactorySingletonTest.java =================================================================== RCS file: ant/project/test/unit/src/org/netbeans/modules/project/ant/AntBasedProjectFactorySingletonTest.java diff -N ant/project/test/unit/src/org/netbeans/modules/project/ant/AntBasedProjectFactorySingletonTest.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ant/project/test/unit/src/org/netbeans/modules/project/ant/AntBasedProjectFactorySingletonTest.java 20 May 2005 13:37:50 -0000 @@ -0,0 +1,123 @@ +/* + * Sun Public License Notice + * + * The contents of this file are subject to the Sun Public License + * Version 1.0 (the "License"). You may not use this file except in + * compliance with the License. A copy of the License is available at + * http://www.sun.com/ + * + * The Original Code is NetBeans. The Initial Developer of the Original + * Code is Sun Microsystems, Inc. Portions Copyright 1997-2005 Sun + * Microsystems, Inc. All Rights Reserved. + */ + +package org.netbeans.modules.project.ant; + +import java.lang.reflect.Method; +import junit.framework.Test; +import junit.framework.TestSuite; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ProjectManager; +import org.netbeans.api.project.TestUtil; +import org.netbeans.junit.NbTestCase; +import org.netbeans.spi.project.support.ant.AntBasedProjectType; +import org.netbeans.spi.project.support.ant.AntBasedTestUtil; +import org.netbeans.spi.project.support.ant.AntProjectHelper; +import org.netbeans.spi.project.support.ant.AntProjectHelperTest; +import org.openide.filesystems.FileObject; +import org.openide.util.lookup.Lookups; + + +/** + * + * @author Jan Lahoda + */ +public class AntBasedProjectFactorySingletonTest extends NbTestCase { + + public AntBasedProjectFactorySingletonTest(String testName) { + super(testName); + } + + private FileObject scratch; + private FileObject projdir; + + protected void setUp() throws Exception { + scratch = TestUtil.makeScratchDir(this); + projdir = scratch.createFolder("proj"); + TestUtil.createFileFromContent(AntProjectHelperTest.class.getResource("data/project.xml"), projdir, "nbproject/project.xml"); + TestUtil.createFileFromContent(AntProjectHelperTest.class.getResource("data/private.xml"), projdir, "nbproject/private/private.xml"); + TestUtil.createFileFromContent(AntProjectHelperTest.class.getResource("data/project.properties"), projdir, "nbproject/project.properties"); + TestUtil.createFileFromContent(AntProjectHelperTest.class.getResource("data/private.properties"), projdir, "nbproject/private/private.properties"); + TestUtil.createFileFromContent(AntProjectHelperTest.class.getResource("data/global.properties"), scratch, "userdir/build.properties"); + TestUtil.setLookup(new Object[] { + AntBasedTestUtil.testAntBasedProjectType(), + }); + } + + protected void tearDown() throws Exception { + } + + public static Test suite() { + TestSuite suite = new TestSuite(AntBasedProjectFactorySingletonTest.class); + + return suite; + } + + /**Test for second part of #42738. + */ + public void testAntBasedProjectTypesChanged() throws Exception { + AntBasedProjectFactorySingleton factory = new AntBasedProjectFactorySingleton(); + AntBasedProjectType type1 = AntBasedTestUtil.testAntBasedProjectType(); + AntBasedProjectType type2 = AntBasedTestUtil.testAntBasedProjectType(); + + TestUtil.setLookup(Lookups.fixed(new Object[] { + factory, + type1, + type2, + })); + + Method getAntBasedProjectTypeMethod = AntProjectHelper.class.getDeclaredMethod("getType", new Class[0]); + + getAntBasedProjectTypeMethod.setAccessible(true); + + Project p = ProjectManager.getDefault().findProject(projdir); + AntProjectHelper helper = (AntProjectHelper) p.getLookup().lookup(AntProjectHelper.class); + + assertTrue(getAntBasedProjectTypeMethod.invoke(helper, null) == type2); + + TestUtil.setLookup(Lookups.fixed(new Object[] { + factory, + type1, + })); + + p = ProjectManager.getDefault().findProject(projdir); + helper = (AntProjectHelper) p.getLookup().lookup(AntProjectHelper.class); + + assertTrue(getAntBasedProjectTypeMethod.invoke(helper, null) == type1); + + TestUtil.setLookup(Lookups.fixed(new Object[] { + factory, + type2, + })); + + p = ProjectManager.getDefault().findProject(projdir); + helper = (AntProjectHelper) p.getLookup().lookup(AntProjectHelper.class); + + assertTrue(getAntBasedProjectTypeMethod.invoke(helper, null) == type2); + + TestUtil.setLookup(Lookups.fixed(new Object[] { + factory, + })); + + assertNull(ProjectManager.getDefault().findProject(projdir)); + + TestUtil.setLookup(Lookups.fixed(new Object[] { + factory, + type1, + type2, + })); + + assertTrue(getAntBasedProjectTypeMethod.invoke(helper, null) == type2); + } + +}