Index: src/org/netbeans/core/projects/SystemFileSystem.java =================================================================== RCS file: /cvs/core/src/org/netbeans/core/projects/SystemFileSystem.java,v retrieving revision 1.38 diff -u -r1.38 SystemFileSystem.java --- src/org/netbeans/core/projects/SystemFileSystem.java 12 Aug 2003 09:38:27 -0000 1.38 +++ src/org/netbeans/core/projects/SystemFileSystem.java 20 Feb 2004 15:00:37 -0000 @@ -37,7 +37,8 @@ * * @author Jan Jancura, Ian Formanek, Petr Hamernik */ -public final class SystemFileSystem extends MultiFileSystem implements FileSystem.Status { +public final class SystemFileSystem extends MultiFileSystem +implements FileSystem.Status, org.openide.util.LookupListener { // Must be public for BeanInfo to work: #11186. /** generated Serialized Version UID */ @@ -59,6 +60,11 @@ private static final String ATTR_ICON_32 = "SystemFileSystem.icon32"; // NOI18N /** name of the layer where changed file will be stored, default is session */ static final String ATTR_LAYER = "SystemFileSystem.layer"; // NOI18N + /** lookup result we listen on */ + private static Lookup.Result result = Lookup.getDefault ().lookup (new Lookup.Template (FileSystem.class)); + /** the set of layers provided by the system */ + private static FileSystem[] layers; + /** user fs */ private ModuleLayeredFileSystem user; @@ -72,13 +78,15 @@ /** @param fss list of file systems to delegate to */ - private SystemFileSystem (FileSystem[] fss) throws PropertyVetoException { - super (fss); - user = (ModuleLayeredFileSystem) fss[0]; - home = fss.length > 2 ? (ModuleLayeredFileSystem) fss[1] : null; + private SystemFileSystem () throws PropertyVetoException { + super (computeLayers ()); + user = (ModuleLayeredFileSystem) layers[0]; + home = layers.length > 2 ? (ModuleLayeredFileSystem) layers[1] : null; setSystemName (SYSTEM_NAME); setHidden (true); + + result.addLookupListener (this); } @@ -112,8 +120,9 @@ else s.add (arr[i]); + layers = (FileSystem []) arr.clone (); // create own internal copy of passed filesystems - setDelegates ((FileSystem []) arr.clone ()); + setDelegates (computeLayers ()); firePropertyChange ("layers", null, null); // NOI18N } @@ -126,6 +135,19 @@ // don't return reference to internal buffer return (FileSystem []) getDelegates ().clone (); } + + private synchronized static FileSystem[] computeLayers () { + FileSystem[] fromLookup = (FileSystem[])result.allInstances ().toArray (new FileSystem[0]); + + if (fromLookup.length > 0) { + ArrayList arr = new ArrayList (layers.length + fromLookup.length); + arr.addAll (Arrays.asList (layers)); + arr.addAll (Arrays.asList (fromLookup)); + return (FileSystem[])arr.toArray (new FileSystem[0]); + } + + return layers; + } private final static ThreadLocal newFiles = new ThreadLocal(); /** workaround enabling create new file on other layer than target folder @@ -398,7 +420,8 @@ ("org.netbeans.core.projects.FixedFileSystem", "Automatic Manifest Installation"); // NOI18N arr[home == null ? 1 : 2] = FixedFileSystem.deflt; - return new SystemFileSystem (arr); + layers = arr; + return new SystemFileSystem (); } /** Getter for message. @@ -437,6 +460,12 @@ new NotSerializableException ("WARNING - SystemFileSystem is not designed to be serialized").printStackTrace (); // NOI18N return new SingletonSerializer (); } + + /** Refresh layers */ + public synchronized void resultChanged (org.openide.util.LookupEvent ev) { + setDelegates (computeLayers ()); + } + private static final class SingletonSerializer extends Object implements Serializable { private static final long serialVersionUID = 6436781994611L; SingletonSerializer() {} Index: test/unit/src/org/netbeans/core/projects/SystemFileSystemTest.java =================================================================== RCS file: /cvs/core/test/unit/src/org/netbeans/core/projects/SystemFileSystemTest.java,v retrieving revision 1.2 diff -u -r1.2 SystemFileSystemTest.java --- test/unit/src/org/netbeans/core/projects/SystemFileSystemTest.java 18 Dec 2002 23:41:33 -0000 1.2 +++ test/unit/src/org/netbeans/core/projects/SystemFileSystemTest.java 20 Feb 2004 15:00:39 -0000 @@ -94,6 +94,21 @@ assertEquals("correct localized data object name", "Localized Name", n.getDisplayName()); } + public void testContentOfFileSystemIsInfluencedByLookup () throws Exception { + MemoryFileSystem mem = new MemoryFileSystem (); + String dir = "/yarda/own/file"; + org.openide.filesystems.FileUtil.createFolder (mem.getRoot (), dir); + + assertNull ("File is not there yet", Repository.getDefault ().getDefaultFileSystem ().findResource (dir)); + NbTopManager.get().register (mem); + try { + assertNotNull ("The file is there now", Repository.getDefault ().getDefaultFileSystem ().findResource (dir)); + } finally { + NbTopManager.get().unregister (mem); + } + assertNull ("File is no longer there", Repository.getDefault ().getDefaultFileSystem ().findResource (dir)); + } + public void testIconFromURL() throws Exception { FileObject bar = Repository.getDefault().getDefaultFileSystem().findResource("foo/bar.txt"); Node n = DataObject.find(bar).getNodeDelegate();