Index: src/org/netbeans/api/java/classpath/GlobalPathRegistry.java =================================================================== RCS file: /cvs/java/api/src/org/netbeans/api/java/classpath/GlobalPathRegistry.java,v --- src/org/netbeans/api/java/classpath/GlobalPathRegistry.java 18 Jun 2004 03:00:16 -0000 1.9 +++ src/org/netbeans/api/java/classpath/GlobalPathRegistry.java 18 Nov 2004 10:58:54 -0000 @@ -13,6 +13,8 @@ package org.netbeans.api.java.classpath; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -97,6 +99,14 @@ } } }; + private PropertyChangeListener classpathListener = new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + synchronized (GlobalPathRegistry.this) { + //Reset cache + GlobalPathRegistry.this.resetSourceRootsCache (); + } + } + }; private GlobalPathRegistry() {} @@ -148,6 +158,9 @@ if (added != null && !added.contains(paths[i]) && !l.contains(paths[i])) { added.add(paths[i]); } + if (!l.contains(paths[i])) { + paths[i].addPropertyChangeListener(classpathListener); + } l.add(paths[i]); } if (added != null && !added.isEmpty()) { @@ -193,6 +206,9 @@ } if (removed != null && !removed.contains(paths[i]) && !l2.contains(paths[i])) { removed.add(paths[i]); + } + if (!l2.contains(paths[i])) { + paths[i].removePropertyChangeListener(classpathListener); } } this.paths.put(id, l2); Index: test/unit/src/org/netbeans/api/java/classpath/ClassPathTest.java =================================================================== RCS file: /cvs/java/api/test/unit/src/org/netbeans/api/java/classpath/ClassPathTest.java,v --- test/unit/src/org/netbeans/api/java/classpath/ClassPathTest.java 4 Aug 2004 13:53:55 -0000 1.5 +++ test/unit/src/org/netbeans/api/java/classpath/ClassPathTest.java 18 Nov 2004 10:58:54 -0000 @@ -252,7 +252,7 @@ cp = null; } - private static final class TestClassPathImplementation implements ClassPathImplementation, PropertyChangeListener { + static final class TestClassPathImplementation implements ClassPathImplementation, PropertyChangeListener { private PropertyChangeSupport support = new PropertyChangeSupport (this); private List resources = new ArrayList (); Index: test/unit/src/org/netbeans/api/java/classpath/GlobalPathRegistryTest.java =================================================================== RCS file: /cvs/java/api/test/unit/src/org/netbeans/api/java/classpath/GlobalPathRegistryTest.java,v --- test/unit/src/org/netbeans/api/java/classpath/GlobalPathRegistryTest.java 15 Jun 2004 14:39:52 -0000 1.5 +++ test/unit/src/org/netbeans/api/java/classpath/GlobalPathRegistryTest.java 18 Nov 2004 10:58:54 -0000 @@ -13,6 +13,8 @@ package org.netbeans.api.java.classpath; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; @@ -20,18 +22,18 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.List; import java.util.Set; import java.util.Map; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.netbeans.api.java.queries.SourceForBinaryQuery; import org.netbeans.junit.NbTestCase; +import org.netbeans.spi.java.classpath.ClassPathImplementation; import org.netbeans.spi.java.classpath.support.ClassPathSupport; import org.netbeans.spi.java.queries.SourceForBinaryQueryImplementation; import org.openide.filesystems.FileObject; import org.netbeans.api.project.TestUtil; -import org.openide.filesystems.FileStateInvalidException; +import org.netbeans.spi.java.classpath.ClassPathFactory; import org.openide.filesystems.FileUtil; import org.openide.util.Lookup; import org.openide.util.lookup.Lookups; @@ -133,16 +135,29 @@ } - public void testGetSourceRoots () throws FileStateInvalidException { + public void testGetSourceRoots () throws Exception { SFBQImpl query = (SFBQImpl) Lookup.getDefault().lookup(SFBQImpl.class); assertNotNull ("SourceForBinaryQueryImplementation not found in lookup",query); query.addPair(cp3.getRoots()[0].getURL(),new FileObject[0]); - r.register(ClassPath.SOURCE, new ClassPath[] {cp1, cp2}); + ClassPathTest.TestClassPathImplementation cpChangingImpl = new ClassPathTest.TestClassPathImplementation(); + ClassPath cpChanging = ClassPathFactory.createClassPath(cpChangingImpl); + assertEquals("cpChangingImpl is empty", 0, cpChanging.getRoots().length); + r.register(ClassPath.SOURCE, new ClassPath[] {cp1, cp2, cpChanging}); r.register (ClassPath.COMPILE, new ClassPath[] {cp3}); Set result = r.getSourceRoots(); assertEquals ("Wrong number of source roots",result.size(),cp1.getRoots().length + cp2.getRoots().length); assertTrue ("Missing roots from cp1",result.containsAll (Arrays.asList(cp1.getRoots()))); assertTrue ("Missing roots from cp2",result.containsAll (Arrays.asList(cp2.getRoots()))); + // simulate classpath change: + URL u = ((ClassPath.Entry)cp5.entries().get(0)).getURL(); + cpChangingImpl.addResource(u); + assertEquals("cpChangingImpl is not empty", 1, cpChanging.getRoots().length); + result = r.getSourceRoots(); + assertEquals ("Wrong number of source roots",result.size(),cp1.getRoots().length + cp2.getRoots().length + cpChanging.getRoots().length); + assertTrue ("Missing roots from cp1",result.containsAll (Arrays.asList(cp1.getRoots()))); + assertTrue ("Missing roots from cp2",result.containsAll (Arrays.asList(cp2.getRoots()))); + cpChangingImpl.removeResource(u); + query.addPair(cp3.getRoots()[0].getURL(),cp4.getRoots()); result = r.getSourceRoots(); assertEquals ("Wrong number of source roots",result.size(),cp1.getRoots().length + cp2.getRoots().length+cp4.getRoots().length);