? openide/fs/src/org/netbeans/api Index: openide/fs/nbproject/project.xml =================================================================== RCS file: /cvs/openide/fs/nbproject/project.xml,v retrieving revision 1.11 diff -u -r1.11 project.xml --- openide/fs/nbproject/project.xml 13 Nov 2006 20:11:54 -0000 1.11 +++ openide/fs/nbproject/project.xml 23 Feb 2007 05:01:44 -0000 @@ -46,6 +46,7 @@ + org.netbeans.api.layers org.openide.filesystems Index: core/startup/nbproject/project.xml =================================================================== RCS file: /cvs/core/startup/nbproject/project.xml,v retrieving revision 1.12 diff -u -r1.12 project.xml --- core/startup/nbproject/project.xml 11 Oct 2006 13:05:57 -0000 1.12 +++ core/startup/nbproject/project.xml 23 Feb 2007 05:01:44 -0000 @@ -80,6 +80,7 @@ org.netbeans.core.registry org.netbeans.modules.apisupport.ant org.netbeans.modules.autoupdate + org.netbeans.api.layers org.netbeans.core.startup org.netbeans.core.startup.layers Index: core/startup/src/org/netbeans/core/startup/layers/SystemFileSystem.java =================================================================== RCS file: /cvs/core/startup/src/org/netbeans/core/startup/layers/SystemFileSystem.java,v retrieving revision 1.8 diff -u -r1.8 SystemFileSystem.java --- core/startup/src/org/netbeans/core/startup/layers/SystemFileSystem.java 3 Aug 2006 09:57:27 -0000 1.8 +++ core/startup/src/org/netbeans/core/startup/layers/SystemFileSystem.java 23 Feb 2007 05:01:45 -0000 @@ -29,12 +29,19 @@ import java.io.ObjectStreamException; import java.io.Serializable; import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.Set; +import java.util.TooManyListenersException; import java.util.logging.Level; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import org.netbeans.api.layers.DynamicFilesystemLayer; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileStatusEvent; import org.openide.filesystems.FileSystem; @@ -42,6 +49,10 @@ import org.openide.filesystems.LocalFileSystem; import org.openide.filesystems.MultiFileSystem; import org.openide.filesystems.Repository; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import org.openide.util.LookupEvent; +import org.openide.util.LookupListener; import org.openide.util.NbBundle; /** The system FileSystem - represents system files under $NETBEANS_HOME/system. @@ -69,6 +80,8 @@ private ModuleLayeredFileSystem user; /** home fs */ private ModuleLayeredFileSystem home; + + private L l; /** @param fss list of file systems to delegate to */ @@ -269,18 +282,31 @@ extras[i].setRootDirectory(extradirs[i]); extras[i].setReadOnly(true); } + L l = new L(); + Set dyn = l.setResult(Lookup.getDefault().lookupResult(DynamicFilesystemLayer.class)); + FileSystem[] others = null; + if (!dyn.isEmpty()) { + List toUse = new ArrayList (dyn); + toUse.addAll (Arrays.asList(extras)); + others = toUse.toArray (new FileSystem[toUse.size()]); + } else { + others = extras; + } FileSystem[] arr = new FileSystem[home == null ? 2 : 3]; arr[0] = new ModuleLayeredFileSystem(user, new FileSystem[0], null); if (home != null) { File cachedir = new File(new File (userDir.getParentFile(), "var"), "cache"); // NOI18N - arr[1] = new ModuleLayeredFileSystem(home, extras, cachedir); + arr[1] = new ModuleLayeredFileSystem(home, others, cachedir); } FixedFileSystem.deflt = new FixedFileSystem ("org.netbeans.core.projects.FixedFileSystem", "Automatic Manifest Installation"); // NOI18N arr[home == null ? 1 : 2] = FixedFileSystem.deflt; - return new SystemFileSystem (arr); + SystemFileSystem result = new SystemFileSystem (arr); + result.l = l; + l.instance = result; + return result; } /** Notification that a file has migrated from one file system @@ -310,5 +336,114 @@ } } // --- SAFETY --- + + private static class L implements LookupListener, ChangeListener { + Set listeningTo = new HashSet (); + Lookup.Result result; + SystemFileSystem instance; + + Set setResult (Lookup.Result result) { + assert this.result == null; + this.result = result; + result.addLookupListener(this); + for (DynamicFilesystemLayer l : listeningTo) { + try { + l.addChangeListener(this); + } catch (TooManyListenersException ex) { + Exceptions.printStackTrace(ex); + } + } + listeningTo.addAll (result.allInstances()); + Set fses = new HashSet (listeningTo.size()); + for (DynamicFilesystemLayer l : listeningTo) { + if (l.isEnabled()) { + FileSystem fs = l.getFileSystem(true); + if (fs != null) { + fses.add (fs); + } + } + } + return fses; + } + + public void resultChanged(LookupEvent e) { + Set now = new HashSet (result.allInstances()); + Set removed = new HashSet (listeningTo); + Set added = new HashSet (now); + removed.removeAll (now); + added.removeAll (listeningTo); + Set removedFses = new HashSet (); + Set addedFses = new HashSet (); + for (DynamicFilesystemLayer l : removed) { + l.removeChangeListener(this); + if (l.isEnabled()) { + System.err.println(l + " was removed"); + FileSystem curr = l.getFileSystem(false); + if (curr != null) { + removedFses.add (curr); + } + } + } + for (DynamicFilesystemLayer l : added) { + try { + l.addChangeListener(this); + System.err.println(l + " was added"); + if (l.isEnabled()) { + FileSystem curr = l.getFileSystem(true); + if (curr != null) { + addedFses.add (curr); + } + } + } catch (TooManyListenersException ex) { + Exceptions.printStackTrace(ex); + } + } + if (!removedFses.isEmpty() || !addedFses.isEmpty()) { + FileSystem[] old = instance.getDelegates(); + List delegates = new ArrayList + (Arrays.asList(old)); + + for (FileSystem r : removedFses) { + delegates.remove (r); + } + for (FileSystem a : addedFses) { + delegates.add (delegates.size() - 1, + a); //XXX should be installed beside module's + //layer, maintaining dependency order! + } + FileSystem[] nue = delegates.toArray (new FileSystem[ + delegates.size()]); + instance.setLayers (nue); + } + + synchronized (this) { + listeningTo.clear(); + listeningTo.addAll(now); + } + } + public void stateChanged(ChangeEvent e) { + System.err.println("Got Change Event from " + e.getSource()); + DynamicFilesystemLayer l = (DynamicFilesystemLayer) e.getSource(); + FileSystem[] fs = instance.getDelegates(); + List nue = new ArrayList ( + Arrays.asList(fs)); + if (!l.isEnabled()) { + for (Iterator i=nue.iterator(); i.hasNext();) { + if (i.next() == l.getFileSystem(false)) { + i.remove(); + break; + } + } + } else { + FileSystem found = l.getFileSystem(true); + if (!nue.contains(found)) { + nue.add (0, found); + } + } + fs = nue.toArray (new FileSystem[nue.size()]); + instance.setLayers (fs); + instance.refresh(false); + } + } }