# HG changeset patch # User Alexander Simon # Date 1326959152 -14400 # Node ID 28d2c6e94aded859a53cd330b9452e202ff87baf # Parent a0842676f1b71b8df7f1986545d438a3e9a3450b fixing 207435 - FileUtil.refreshFor(File... files) should be java.io.File independent. - variant #2 (fixed TS01) diff --git a/dlight.remote.impl/src/org/netbeans/modules/remote/impl/fileoperations/spi/FileOperationsProvider.java b/dlight.remote.impl/src/org/netbeans/modules/remote/impl/fileoperations/spi/FileOperationsProvider.java --- a/dlight.remote.impl/src/org/netbeans/modules/remote/impl/fileoperations/spi/FileOperationsProvider.java +++ b/dlight.remote.impl/src/org/netbeans/modules/remote/impl/fileoperations/spi/FileOperationsProvider.java @@ -42,6 +42,7 @@ package org.netbeans.modules.remote.impl.fileoperations.spi; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; @@ -56,6 +57,7 @@ import org.netbeans.modules.remote.impl.fs.RemoteFileObjectBase; import org.netbeans.modules.remote.impl.fs.RemoteFileSystem; import org.netbeans.modules.remote.impl.fs.RemoteFileSystemManager; +import org.netbeans.modules.remote.spi.FileSystemProvider; import org.netbeans.spi.extexecution.ProcessBuilderFactory; import org.netbeans.spi.extexecution.ProcessBuilderImplementation; import org.openide.filesystems.FileObject; @@ -278,6 +280,32 @@ protected ProcessBuilder createProcessBuilder(FileProxyO file) { return ProcessBuilderFactory.createProcessBuilder(new ProcessBuilderImplementationImpl(env), "RFS Process Builder"); // NOI18N } + + protected void refreshFor(FileProxyO ... files) { + List paths = new ArrayList(); + for(FileProxyO f : files) { + String path = findExistingParent(f.getPath()); + if (path != null) { + paths.add(path); + } + } + FileSystemProvider.scheduleRefresh(env, paths); + // TODO wait finishing + } + + private String findExistingParent(String path) { + while(true) { + RemoteFileObjectBase fo = RemoteFileSystemManager.getInstance().getFileSystem(env).findResource(path); + if (fo != null) { + break; + } + path = PathUtilities.getDirName(path); + if (path == null) { + return null; + } + } + return path; + } private ExecutionEnvironment getExecutionEnvironment() { return env; diff --git a/remotefs.versioning/src/org/netbeans/modules/remotefs/versioning/spi/FileProxyProviderImpl.java b/remotefs.versioning/src/org/netbeans/modules/remotefs/versioning/spi/FileProxyProviderImpl.java --- a/remotefs.versioning/src/org/netbeans/modules/remotefs/versioning/spi/FileProxyProviderImpl.java +++ b/remotefs.versioning/src/org/netbeans/modules/remotefs/versioning/spi/FileProxyProviderImpl.java @@ -41,7 +41,9 @@ */ package org.netbeans.modules.remotefs.versioning.spi; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; @@ -181,7 +183,16 @@ softEDTAssert(); return createProcessBuilder(toFileProxy(file)); } - + + @Override + public void refreshFor(VCSFileProxy... files) { + List list = new ArrayList(); + for(VCSFileProxy f : files) { + list.add(toFileProxy(f)); + } + refreshFor(list.toArray(new FileProxyO[list.size()])); + } + private void softEDTAssert() { if (assertIt) { if (SwingUtilities.isEventDispatchThread()) { @@ -189,6 +200,7 @@ } } } + } private static FileProxyO toFileProxy(final VCSFileProxy file) { diff --git a/versioning.core/src/org/netbeans/modules/versioning/core/api/VCSFileProxy.java b/versioning.core/src/org/netbeans/modules/versioning/core/api/VCSFileProxy.java --- a/versioning.core/src/org/netbeans/modules/versioning/core/api/VCSFileProxy.java +++ b/versioning.core/src/org/netbeans/modules/versioning/core/api/VCSFileProxy.java @@ -41,13 +41,13 @@ */ package org.netbeans.modules.versioning.core.api; -import org.netbeans.modules.versioning.core.filesystems.VCSFileProxyOperations; import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; import org.netbeans.api.extexecution.ProcessBuilder; import org.netbeans.modules.versioning.core.APIAccessor; import org.netbeans.modules.versioning.core.FlatFolder; +import org.netbeans.modules.versioning.core.filesystems.VCSFileProxyOperations; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileStateInvalidException; import org.openide.filesystems.FileSystem; @@ -381,4 +381,8 @@ return proxy.createProcessBuilder(this); } } + + VCSFileProxyOperations getFileProxyOperations() { + return proxy; + } } diff --git a/versioning.core/src/org/netbeans/modules/versioning/core/api/VersioningSupport.java b/versioning.core/src/org/netbeans/modules/versioning/core/api/VersioningSupport.java --- a/versioning.core/src/org/netbeans/modules/versioning/core/api/VersioningSupport.java +++ b/versioning.core/src/org/netbeans/modules/versioning/core/api/VersioningSupport.java @@ -43,12 +43,17 @@ */ package org.netbeans.modules.versioning.core.api; -import org.netbeans.modules.versioning.core.VersioningManager; - +import java.io.File; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import java.util.prefs.Preferences; import org.netbeans.modules.versioning.core.*; +import org.netbeans.modules.versioning.core.filesystems.VCSFileProxyOperations; import org.netbeans.modules.versioning.core.spi.VersioningSystem; import org.netbeans.modules.versioning.core.util.VCSSystemProvider; +import org.openide.filesystems.FileUtil; /** * Collection of utility methods for Versioning systems implementors. @@ -146,4 +151,36 @@ return file.createProcessBuilder(); } + /** + * Refreshes all necessary filesystems. Not all instances of FileObject are refreshed + * but just those that represent passed files and their children recursively. + * + * @param files + */ + public static void refreshFor(VCSFileProxy[] files) { + Set fileList = new HashSet(); + Map> proxyMap = new HashMap>(); + for(VCSFileProxy file : files) { + File javaFile = file.toFile(); + if (javaFile != null) { + fileList.add(javaFile); + } else { + VCSFileProxyOperations fileProxyOperations = file.getFileProxyOperations(); + if (fileProxyOperations != null) { + Set set = proxyMap.get(fileProxyOperations); + if (set == null) { + set = new HashSet(); + } + set.add(file); + } + } + } + if (fileList.size() > 0) { + FileUtil.refreshFor(fileList.toArray(new File[fileList.size()])); + } + for (Map.Entry> e : proxyMap.entrySet()) { + VCSFileProxyOperations fileProxyOperations = e.getKey(); + fileProxyOperations.refreshFor(e.getValue().toArray(new VCSFileProxy[fileList.size()])); + } + } } \ No newline at end of file diff --git a/versioning.core/src/org/netbeans/modules/versioning/core/filesystems/VCSFileProxyOperations.java b/versioning.core/src/org/netbeans/modules/versioning/core/filesystems/VCSFileProxyOperations.java --- a/versioning.core/src/org/netbeans/modules/versioning/core/filesystems/VCSFileProxyOperations.java +++ b/versioning.core/src/org/netbeans/modules/versioning/core/filesystems/VCSFileProxyOperations.java @@ -76,4 +76,6 @@ VCSFileProxy[] list(VCSFileProxy file); ProcessBuilder createProcessBuilder(VCSFileProxy file); + + void refreshFor(VCSFileProxy ... files); }