diff -r 850fe3f0316a api.java/src/org/netbeans/api/java/classpath/ClassPath.java --- a/api.java/src/org/netbeans/api/java/classpath/ClassPath.java Fri Feb 08 12:01:59 2008 +0100 +++ b/api.java/src/org/netbeans/api/java/classpath/ClassPath.java Mon Feb 11 14:30:59 2008 +0100 @@ -929,18 +929,9 @@ public final class ClassPath { } public void addRoot (URL url) { - if (!isInitialized()) { - FileSystem[] fss = getFileSystems (); - if (fss != null && fss.length > 0) { - for (FileSystem fs : fss) { - if (fs != null) { - fs.addFileChangeListener (this); - } - } - setInitialized(true); - } else { - LOG.warning("Cannot find file system, not able to listen on changes."); - } + if (!isInitialized()) { + FileUtil.getFileBasedFileSystems().addFileChangeListener(this); + setInitialized(true); } if ("jar".equals(url.getProtocol())) { //NOI18N url = FileUtil.getArchiveFile(url); @@ -965,12 +956,7 @@ public final class ClassPath { public void removeAllRoots () { this.roots.clear(); - FileSystem[] fss = getFileSystems (); - for (FileSystem fs : fss) { - if (fs != null) { - fs.removeFileChangeListener (this); - } - } + FileUtil.getFileBasedFileSystems().removeFileChangeListener(this); initialized = false; //Already synchronized } @@ -1013,11 +999,7 @@ public final class ClassPath { public void run() { if (isInitialized()) { - for (FileSystem fs : getFileSystems()) { - if (fs != null) { - fs.removeFileChangeListener (this); - } - } + FileUtil.getFileBasedFileSystems().removeFileChangeListener(this); } } @@ -1078,36 +1060,7 @@ public final class ClassPath { //http:/java.netbeans.org/source/browse/java/javacore/src/org/netbeans/modules/javacore/Util.java //http://core.netbeans.org/source/browse/core/ui/src/org/netbeans/core/ui/MenuWarmUpTask.java //http://core.netbeans.org/source/browse/core/src/org/netbeans/core/actions/RefreshAllFilesystemsAction.java - //http://java.netbeans.org/source/browse/java/api/src/org/netbeans/api/java/classpath/ClassPath.java - - private static FileSystem[] fileSystems; - - private static FileSystem[] getFileSystems() { - if (fileSystems != null) { - return fileSystems; - } - File[] roots = File.listRoots(); - Set allRoots = new LinkedHashSet(); - assert roots != null && roots.length > 0 : "Could not list file roots"; // NOI18N - - for (File root : roots) { - FileObject random = FileUtil.toFileObject(root); - if (random == null) continue; - - FileSystem fs; - try { - fs = random.getFileSystem(); - allRoots.add(fs); - } catch (FileStateInvalidException e) { - throw new AssertionError(e); - } - } - FileSystem[] retVal = new FileSystem [allRoots.size()]; - allRoots.toArray(retVal); - assert retVal.length > 0 : "Could not get any filesystem"; // NOI18N - - return fileSystems = retVal; - } + //http://java.netbeans.org/source/browse/java/api/src/org/netbeans/api/java/classpath/ClassPath.java } } diff -r 850fe3f0316a java.source/src/org/netbeans/modules/java/source/usages/RepositoryUpdater.java --- a/java.source/src/org/netbeans/modules/java/source/usages/RepositoryUpdater.java Fri Feb 08 12:01:59 2008 +0100 +++ b/java.source/src/org/netbeans/modules/java/source/usages/RepositoryUpdater.java Mon Feb 11 14:30:59 2008 +0100 @@ -593,41 +593,11 @@ public class RepositoryUpdater implement private void registerFileSystemListener () { - final File[] roots = File.listRoots(); - final Set fss = new HashSet (); - for (File root : roots) { - final FileObject fo = FileUtil.toFileObject (root); - if (fo != null) { - try { - final FileSystem fs = fo.getFileSystem(); - if (!fss.contains(fs)) { - fs.addFileChangeListener (this); - fss.add(fs); - } - } catch (FileStateInvalidException e) { - Exceptions.printStackTrace(e); - } - } - } + FileUtil.getFileBasedFileSystems().addFileChangeListener(this); } private void unregisterFileSystemListener () { - final File[] roots = File.listRoots(); - final Set fss = new HashSet (); - for (File root : roots) { - final FileObject fo = FileUtil.toFileObject (root); - if (fo != null) { - try { - final FileSystem fs = fo.getFileSystem(); - if (!fss.contains(fs)) { - fs.removeFileChangeListener (this); - fss.add(fs); - } - } catch (FileStateInvalidException e) { - Exceptions.printStackTrace(e); - } - } - } + FileUtil.getFileBasedFileSystems().removeFileChangeListener(this); } private URL getOwningSourceRoot (final FileObject fo) { diff -r 850fe3f0316a masterfs/src/org/netbeans/modules/masterfs/filebasedfs/FileBasedFileSystem.java --- a/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/FileBasedFileSystem.java Fri Feb 08 12:01:59 2008 +0100 +++ b/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/FileBasedFileSystem.java Mon Feb 11 14:30:59 2008 +0100 @@ -60,23 +60,27 @@ import org.netbeans.modules.masterfs.fil import org.netbeans.modules.masterfs.filebasedfs.utils.FileInfo; import org.netbeans.modules.masterfs.providers.AnnotationProvider; import org.netbeans.modules.masterfs.providers.ProvidedExtensions; +import org.openide.filesystems.FileChangeListener; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileSystem; +import org.openide.filesystems.FileBasedFileSystemsSPI; import org.openide.filesystems.FileUtil; import org.openide.util.Exceptions; +import org.openide.util.Lookup; import org.openide.util.actions.SystemAction; /** * @author Radek Matous */ public final class FileBasedFileSystem extends FileSystem { - private static Map allInstances = new HashMap(); + private static Map fileToFileSystems = new HashMap(); private transient final FileObjectFactory factory; transient private final StatusImpl status = new StatusImpl(); public static boolean WARNINGS = true; private ThreadLocal refreshIsOn = new ThreadLocal(); - + private static Repository repo; + public boolean isWarningEnabled() { Boolean isRefreshOn = refreshIsOn.get(); return WARNINGS && (isRefreshOn == null || !isRefreshOn.booleanValue()); @@ -84,7 +88,7 @@ public final class FileBasedFileSystem e //only for tests purposes public static void reinitForTests() { - FileBasedFileSystem.allInstances = new HashMap(); + FileBasedFileSystem.fileToFileSystems = new HashMap(); } public static FileBasedFileSystem getInstance(final File file) { @@ -96,21 +100,40 @@ public final class FileBasedFileSystem e final FileInfo rootInfo = new FileInfo(file).getRoot(); final File rootFile = rootInfo.getFile(); - synchronized (FileBasedFileSystem.allInstances) { - retVal = (FileBasedFileSystem) FileBasedFileSystem.allInstances.get(rootFile); + synchronized (FileBasedFileSystem.fileToFileSystems) { + retVal = fileToFileSystems.get(rootFile); } if (retVal == null && addMising) { - if (rootInfo.isConvertibleToFileObject()) { - synchronized (FileBasedFileSystem.allInstances) { - retVal = (FileBasedFileSystem) FileBasedFileSystem.allInstances.get(rootFile); + if (rootInfo.isConvertibleToFileObject()) { + boolean changed =false; + synchronized (fileToFileSystems) { + retVal = FileBasedFileSystem.fileToFileSystems.get(rootFile); if (retVal == null) { retVal = new FileBasedFileSystem(rootFile); - FileBasedFileSystem.allInstances.put(rootFile, retVal); + fileToFileSystems.put(rootFile, retVal); + changed = true; } + } + if (changed) { + getRepository().fireChange(); } } } return retVal; + } + + private static Repository getRepository() { + synchronized(FileBasedFileSystem.class) { + if (repo != null) { + return repo; + } + } + Repository tmp = (Repository)Lookup.getDefault().lookup(FileBasedFileSystemsSPI.class); + synchronized(FileBasedFileSystem.class) { + repo = Repository.getDefault(); + } + assert repo != null; + return repo; } public static final FileObject getFileObject(final File file) { @@ -119,19 +142,23 @@ public final class FileBasedFileSystem e } - static Collection getInstances() { - synchronized (FileBasedFileSystem.allInstances) { - return new ArrayList(allInstances.values()); + static Collection getInstances() { + synchronized (FileBasedFileSystem.fileToFileSystems) { + return new ArrayList(fileToFileSystems.values()); } } - + + public static Map getFileSystems() { + return new HashMap(fileToFileSystems); + } + public Status getStatus() { return status; } static int getSize () { - synchronized (FileBasedFileSystem.allInstances) { - return allInstances.size(); + synchronized (FileBasedFileSystem.fileToFileSystems) { + return fileToFileSystems.size(); } } @@ -214,7 +241,7 @@ public final class FileBasedFileSystem e Statistics.REFRESH_FILE.reset(); } - public final void refreshFor(final File file) { + public final void refreshFor(final File... files) { Statistics.StopWatch stopWatch = Statistics.getStopWatch(Statistics.REFRESH_FS); stopWatch.start(); try { @@ -222,7 +249,7 @@ public final class FileBasedFileSystem e refreshIsOn.set(true); this.runAtomicAction(new FileSystem.AtomicAction() { public void run() throws IOException { - getFactory().refreshFor(file); + getFactory().refreshFor(files); } }); } finally { diff -r 850fe3f0316a masterfs/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FileObjectFactory.java --- a/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FileObjectFactory.java Fri Feb 08 12:01:59 2008 +0100 +++ b/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FileObjectFactory.java Mon Feb 11 14:30:59 2008 +0100 @@ -379,9 +379,9 @@ public final class FileObjectFactory { refresh(all2Refresh, expected); } - public void refreshFor(File f) { + public void refreshFor(File... files) { Set all2Refresh = collectForRefresh(); - refresh(all2Refresh, f); + refresh(all2Refresh, files); } private Set collectForRefresh() { @@ -410,12 +410,16 @@ public final class FileObjectFactory { return all2Refresh; } - private void refresh(final Set all2Refresh, File file) { + private void refresh(final Set all2Refresh, File... files) { for (Iterator iterator = all2Refresh.iterator(); iterator.hasNext();) { final BaseFileObj fo = (BaseFileObj) iterator.next(); - if (isParentOf(file, fo.getFileName().getFile())) { - fo.refresh(true); + for (File file : files) { + if (isParentOf(file, fo.getFileName().getFile())) { + fo.refresh(true); + break; + } } + } } diff -r 850fe3f0316a masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/BaseFileObjectTestHid.java --- a/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/BaseFileObjectTestHid.java Fri Feb 08 12:01:59 2008 +0100 +++ b/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/BaseFileObjectTestHid.java Mon Feb 11 14:30:59 2008 +0100 @@ -674,8 +674,8 @@ public class BaseFileObjectTestHid exten IgnoreDirFileSystem ifs = new IgnoreDirFileSystem(); ifs.setRootDirectory(f); - Repository.getDefault().addFileSystem(ifs); - Repository.getDefault().addFileSystem(testedFS); + org.openide.filesystems.Repository.getDefault().addFileSystem(ifs); + org.openide.filesystems.Repository.getDefault().addFileSystem(testedFS); FileObject[] fos = FileUtil.fromFile(f); assertTrue(fos.length > 0); diff -r 850fe3f0316a masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FileObjectFactoryTest.java --- a/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FileObjectFactoryTest.java Fri Feb 08 12:01:59 2008 +0100 +++ b/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/FileObjectFactoryTest.java Mon Feb 11 14:30:59 2008 +0100 @@ -137,6 +137,7 @@ public class FileObjectFactoryTest exten FileUtil.refreshFor(workDir); fdc.assertFolderCreated(1); assertNotNull(foWorkDir.getFileObject(external.getName())); + FileUtil.refreshFor(workDir.getParentFile(),workDir, workDir.getParentFile()); } finally { fdc.cleanUp(); diff -r 850fe3f0316a openide.filesystems/src/org/openide/filesystems/FileUtil.java --- a/openide.filesystems/src/org/openide/filesystems/FileUtil.java Fri Feb 08 12:01:59 2008 +0100 +++ b/openide.filesystems/src/org/openide/filesystems/FileUtil.java Mon Feb 11 14:30:59 2008 +0100 @@ -77,6 +77,7 @@ import org.openide.filesystems.FileSyste import org.openide.filesystems.FileSystem.AtomicAction; import org.openide.util.Exceptions; import org.openide.util.Lookup; +import org.openide.util.Lookup.Item; import org.openide.util.NbBundle; import org.openide.util.Utilities; import org.openide.util.WeakListeners; @@ -121,7 +122,8 @@ public final class FileUtil extends Obje /** Cache for {@link #isArchiveFile(FileObject)}. */ private static final Map archiveFileCache = new WeakHashMap(); - private static FileSystem diskFileSystem; + private static FileBasedFileSystemsSPI filesystems; + private static FileBasedFileSystems fsSupport; private FileUtil() { } @@ -133,24 +135,45 @@ public final class FileUtil extends Obje * @since 7.6 */ public static void refreshFor(File... files) { - FileSystem fs = getDiskFileSystem(); - if (fs == null) { - for (File file : files) { - FileObject fo = toFileObject(file); - fs = getDiskFileSystem(); - if (fs != null) { - break; - } + FileBasedFileSystemsSPI fbs = getFileBasedFileSystemsSPI(); + fbs.refreshFor(files); + } + + /** + * + * @return + */ + static FileBasedFileSystemsSPI getFileBasedFileSystemsSPI() { + synchronized (FileUtil.class) { + if (filesystems != null) { + return filesystems; } } - if (fs != null) { - try { - fs.getRoot().setAttribute("request_for_refreshing_files_be_aware_this_is_not_public_api", files); - } catch (IOException ex) { - Exceptions.printStackTrace(ex); + FileBasedFileSystemsSPI tmp = null; + Lookup.Result res = Lookup.getDefault().lookup(new Lookup.Template(FileBasedFileSystemsSPI.class)); + Iterator> it = res.allItems().iterator(); + for (; it.hasNext();) { + Lookup.Item item = it.next(); + if (item != null && item.getId().contains("org.netbeans.modules.masterfs.filebasedfs")) {//NOI18N + tmp = item.getInstance(); + break; } - } - } + } + synchronized (FileUtil.class) { + if (filesystems == null) { + filesystems = tmp; + } + return filesystems; + } + } + + public static FileBasedFileSystems getFileBasedFileSystems() { + if (fsSupport == null) { + fsSupport = new FileBasedFileSystems(); + } + return fsSupport; + } + /** * Executes atomic action. For more info see {@link FileSystem#runAtomicAction}. @@ -630,17 +653,6 @@ public final class FileUtil extends Obje /*probably temporary piece of code to catch the cause of #46630*/ } catch (MalformedURLException e) { retVal = null; - } - - if (retVal != null) { - if (getDiskFileSystem() == null) { - try { - FileSystem fs = retVal.getFileSystem(); - setDiskFileSystem(fs); - } catch (FileStateInvalidException ex) { - Exceptions.printStackTrace(ex); - } - } } return retVal; } @@ -1873,20 +1885,5 @@ public final class FileUtil extends Obje public File createFileObject(String path) { return wrapFileNoCanonicalize(delegate.createFileObject(path)); } - } - - private static FileSystem getDiskFileSystem() { - synchronized (FileUtil.class) { - return diskFileSystem; - } - } - - private static void setDiskFileSystem(FileSystem fs) { - Object o = fs.getRoot().getAttribute("SupportsRefreshForNoPublicAPI"); - if (o instanceof Boolean && ((Boolean) o).booleanValue()) { - synchronized (FileUtil.class) { - diskFileSystem = fs; - } - } } } diff -r 850fe3f0316a versioning/src/org/netbeans/modules/versioning/FilesystemInterceptor.java --- a/versioning/src/org/netbeans/modules/versioning/FilesystemInterceptor.java Fri Feb 08 12:01:59 2008 +0100 +++ b/versioning/src/org/netbeans/modules/versioning/FilesystemInterceptor.java Mon Feb 11 14:30:59 2008 +0100 @@ -67,44 +67,15 @@ class FilesystemInterceptor extends Prov void init(VersioningManager versioningManager) { assert master == null; master = versioningManager; - Set filesystems = getRootFilesystems(); - for (Iterator i = filesystems.iterator(); i.hasNext();) { - FileSystem fileSystem = (FileSystem) i.next(); - fileSystem.addFileChangeListener(this); - } + FileUtil.getFileBasedFileSystems().addFileChangeListener(this); } /** * Unregisters listeners from all disk filesystems. */ void shutdown() { - Set filesystems = getRootFilesystems(); - for (Iterator i = filesystems.iterator(); i.hasNext();) { - FileSystem fileSystem = (FileSystem) i.next(); - fileSystem.removeFileChangeListener(this); - } + FileUtil.getFileBasedFileSystems().removeFileChangeListener(this); } - - /** - * Retrieves all filesystems. - * - * @return Set set of filesystems - */ - private Set getRootFilesystems() { - Set filesystems = new HashSet(); - File [] roots = File.listRoots(); - for (int i = 0; i < roots.length; i++) { - File root = roots[i]; - FileObject fo = FileUtil.toFileObject(FileUtil.normalizeFile(root)); - if (fo == null) continue; - try { - filesystems.add(fo.getFileSystem()); - } catch (FileStateInvalidException e) { - // ignore invalid filesystems - } - } - return filesystems; - } // ================================================================================================== // CHANGE diff -r 850fe3f0316a versioning/src/org/netbeans/modules/versioning/VersioningAnnotationProvider.java --- a/versioning/src/org/netbeans/modules/versioning/VersioningAnnotationProvider.java Fri Feb 08 12:01:59 2008 +0100 +++ b/versioning/src/org/netbeans/modules/versioning/VersioningAnnotationProvider.java Mon Feb 11 14:30:59 2008 +0100 @@ -282,19 +282,7 @@ public class VersioningAnnotationProvide clearMap(filesToRefresh); clearMap(parentsToRefresh); - Set filesystems = new HashSet(1); - File[] allRoots = File.listRoots(); - for (int i = 0; i < allRoots.length; i++) { - File root = allRoots[i]; - FileObject fo = FileUtil.toFileObject(root); - if (fo != null) { - try { - filesystems.add(fo.getFileSystem()); - } catch (FileStateInvalidException e) { - // ignore invalid filesystems - } - } - } + Collection filesystems = FileUtil.getFileBasedFileSystems().getFileSystems(); for (Iterator i = filesystems.iterator(); i.hasNext();) { FileSystem fileSystem = i.next(); fireFileStatusChanged(new FileStatusEvent(fileSystem, true, true));