? 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 extends DynamicFilesystemLayer> result;
+ SystemFileSystem instance;
+
+ Set setResult (Lookup.Result extends DynamicFilesystemLayer> 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);
+ }
+ }
}