Index: vcscore/src/org/netbeans/modules/vcscore/caching/VcsCache.java diff -c vcscore/src/org/netbeans/modules/vcscore/caching/VcsCache.java:1.56.2.2 vcscore/src/org/netbeans/modules/vcscore/caching/VcsCache.java:1.59 *** vcscore/src/org/netbeans/modules/vcscore/caching/VcsCache.java:1.56.2.2 Fri Apr 11 08:05:21 2003 --- vcscore/src/org/netbeans/modules/vcscore/caching/VcsCache.java Thu Apr 17 03:29:06 2003 *************** *** 71,76 **** --- 71,84 ---- */ private HashMap refreshStrategyWhenNonLocal; + /** + * The map of directories, that are scheduled for later refresh (those which + * are being loaded and should be refreshed after the loading is finished). + * The values are arrays of two objects: Boolean (whether to refresh recursively) + * and Object (locker). + */ + private Map directoriesScheduledForRefresh; + /** Creates new VcsCache with default name VCS_CACHE_NAME * public VcsCache(Reference fileSystem) { this(fileSystem, VCS_CACHE_NAME); *************** *** 94,99 **** --- 102,108 ---- rootNameLength = fsRoot.length(); cacheDirs = new Hashtable(); refreshStrategyWhenNonLocal = new HashMap(); + directoriesScheduledForRefresh = new HashMap(); } /* void setFSRoot(File fsRoot) { *************** *** 329,335 **** public void doRefreshDir(CacheDir dir, boolean recursively, Object locker) { int strategy = recursively ? CacheHandler.STRAT_REFRESH_RECURS : CacheHandler.STRAT_REFRESH; ! loadDir(dir, strategy, locker); } /* --- 338,376 ---- public void doRefreshDir(CacheDir dir, boolean recursively, Object locker) { int strategy = recursively ? CacheHandler.STRAT_REFRESH_RECURS : CacheHandler.STRAT_REFRESH; ! if (dir instanceof VcsCacheDir) { ! VcsCacheDir vdir = (VcsCacheDir) dir; ! if (vdir.isBeingLoaded()) { // Someone is already refreshing this directory. ! // We need to schedule the refresh after this directory is loaded: ! synchronized (directoriesScheduledForRefresh) { ! Object[] params = (Object[]) directoriesScheduledForRefresh.get(vdir); ! if (params != null) { ! if (recursively && !((Boolean) params[0]).booleanValue()) { ! params[0] = Boolean.TRUE; ! } ! } else { ! params = new Object[] { ((recursively) ? Boolean.TRUE : Boolean.FALSE), ! locker }; ! directoriesScheduledForRefresh.put(vdir, params); ! } ! } ! } else { ! vdir.setLoaded(false); // to force the reload ! loadDir(dir, strategy, locker); ! } ! } else { ! loadDir(dir, strategy, locker); ! } ! } ! ! private void runScheduledRefresh(CacheDir dir) { ! Object[] params; ! synchronized (directoriesScheduledForRefresh) { ! params = (Object[]) directoriesScheduledForRefresh.remove(dir); ! } ! if (params != null) { ! doRefreshDir(dir, ((Boolean) params[0]).booleanValue(), params[1]); ! } } /* *************** *** 814,819 **** --- 855,861 ---- fireCacheHandlerEvent(EVENT_CHANGED, dir); //removeLockedFileObjects(absolutePath); heyDoRefreshDir(getPath(dir.getFile())); + runScheduledRefresh(dir); } /** Index: vcscore/src/org/netbeans/modules/vcscore/caching/VcsFSCache.java diff -c vcscore/src/org/netbeans/modules/vcscore/caching/VcsFSCache.java:1.38 vcscore/src/org/netbeans/modules/vcscore/caching/VcsFSCache.java:1.39 *** vcscore/src/org/netbeans/modules/vcscore/caching/VcsFSCache.java:1.38 Thu Feb 27 15:43:02 2003 --- vcscore/src/org/netbeans/modules/vcscore/caching/VcsFSCache.java Thu Apr 17 03:29:07 2003 *************** *** 561,583 **** return ; } } - /* is part of FileSystemCache.loadDir() - * happens automagically - dir.removeAll(); - */ - // dunnot what this refreshDir() method is used for.. I guess the followng code could replace following line. - // ((VcsCache) cache).runVcsDirReader(new File(path)); - ((VcsCacheDir) dir).setLoaded(false); // to force the reload - //dir.checkServer(); ((VcsCache) cache).doRefreshDir(dir, false); - - //VcsDirReader reader = ((VcsCache) cache).getVcsDirReader(new File(path)); - //CvsCacheClient client = cache.getCacheClient(); - //client.doRefreshFor(new File(getAbsolutePath())); - //if (reader != null) { - // new Thread (reader, "VCS-DirReader").start(); // NOI18N - //} - //dir.checkServer(); } public void refreshCacheDirRecursive(String path) { --- 561,567 ---- *************** *** 609,629 **** } if (dir == null) return ; } - /* is part of FileSystemCache.loadDir() - * happens automagically - dir.removeAll(); - */ - // dunnot what this refreshDirRecursive() method is used for.. I guess the followng code could replace following line. - // ((VcsCache) cache).runVcsDirReaderRecursive(new File(path)); - ((VcsCacheDir) dir).setLoaded(false); // to force the reload - //dir.checkServerRecursive(); ((VcsCache) cache).doRefreshDir(dir, true, refreshDirsLocker); - //VcsDirReader reader = ((VcsCache) cache).getVcsDirReaderRecursive(new File(path)); - //CvsCacheClient client = cache.getCacheClient(); - //client.doRefreshFor(new File(getAbsolutePath())); - //if (reader != null) { - // new Thread (reader, "VCS-DirReader").start(); // NOI18N - //} } public void refreshDirFromDiskCache(File fpath) { --- 593,599 ---- Index: vcscore/src/org/netbeans/modules/vcscore/commands/CommandExecutorSupport.java diff -c vcscore/src/org/netbeans/modules/vcscore/commands/CommandExecutorSupport.java:1.56 vcscore/src/org/netbeans/modules/vcscore/commands/CommandExecutorSupport.java:1.57 *** vcscore/src/org/netbeans/modules/vcscore/commands/CommandExecutorSupport.java:1.56 Thu Feb 27 15:43:07 2003 --- vcscore/src/org/netbeans/modules/vcscore/commands/CommandExecutorSupport.java Thu Apr 17 03:24:34 2003 *************** *** 22,37 **** --- 22,42 ---- import java.util.ArrayList; import java.util.Collection; + import java.util.Collections; import java.util.Iterator; import java.util.Map; import java.util.Hashtable; import java.util.Enumeration; + import java.util.List; + import java.util.TreeMap; + import java.util.WeakHashMap; import org.openide.NotifyDescriptor; import org.openide.DialogDescriptor; import org.openide.util.RequestProcessor; import org.openide.util.UserCancelException; + import org.netbeans.api.vcs.commands.CommandTask; import org.netbeans.modules.vcscore.VcsFileSystem; //import org.netbeans.modules.vcscore.VcsAction; import org.netbeans.modules.vcscore.Variables; *************** *** 399,435 **** /** * Performs an automatic refresh after the command finishes. */ ! public static void doRefresh(VcsFileSystem fileSystem, VcsCommandExecutor vce) { doRefresh(fileSystem, vce, false); } /** * Performs an automatic refresh after the command finishes. */ ! public static void doRefresh(VcsFileSystem fileSystem, VcsCommandExecutor vce, boolean foldersOnly) { ! VcsCommand cmd = vce.getCommand(); ! //String dir = vce.getPath(); ! //String file = ""; ! boolean doRefreshCurrent = VcsCommandIO.getBooleanProperty(cmd, VcsCommand.PROPERTY_REFRESH_CURRENT_FOLDER); ! boolean doRefreshParent = VcsCommandIO.getBooleanProperty(cmd, VcsCommand.PROPERTY_REFRESH_PARENT_FOLDER); ! /* ! boolean doRefreshFiles = VcsCommandIO.getBooleanProperty(cmd, VcsCommand.PROPERTY_REFRESH_PROCESSED_FILES); ! if (doRefreshFiles) { ! doRefreshFiles(fileSystem, vce.getFiles()); } ! */ ! if (doRefreshCurrent || doRefreshParent) { ! Collection files = vce.getFiles(); ! for(Iterator it = files.iterator(); it.hasNext(); ) { ! String fullPath = (String) it.next(); ! String dir = VcsUtilities.getDirNamePart(fullPath); ! String file = VcsUtilities.getFileNamePart(fullPath); ! doRefresh(fileSystem, vce.getExec(), cmd, dir, file, foldersOnly, ! doRefreshCurrent, doRefreshParent); } } } /** Perform the refresh of a folder. * @param fileSystem the file system to use * @param refreshPath the folder to refresh --- 404,482 ---- /** * Performs an automatic refresh after the command finishes. */ ! private static void doRefresh(VcsFileSystem fileSystem, VcsCommandExecutor vce) { doRefresh(fileSystem, vce, false); } + /** The map of filesystems weakly referenced and correponding map of + * folders which are to be refreshed later. */ + private static final Map foldersToRefreshByFilesystems = new WeakHashMap(); + /** * Performs an automatic refresh after the command finishes. */ ! private static void doRefresh(VcsFileSystem fileSystem, VcsCommandExecutor vce, boolean foldersOnly) { ! //System.out.println("doRefresh("+vce+", "+foldersOnly+")"); ! Map foldersToRefresh = getFoldersToRefresh(fileSystem, vce, foldersOnly); ! //System.out.println(" have folders = "+foldersToRefresh); ! synchronized (foldersToRefreshByFilesystems) { ! boolean refreshLater = false; ! CommandTask[] tasks = CommandProcessor.getInstance().getRunningCommandTasks(); ! for (int i = 0; i < tasks.length; i++) { ! if (tasks[i] instanceof VcsDescribedTask) { ! if (vce.equals(((VcsDescribedTask) tasks[i]).getExecutor())) { ! //System.out.println(" detected myself, skipping..."); ! continue; ! } ! VcsCommand cmd = ((VcsDescribedTask) tasks[i]).getVcsCommand(); ! boolean doRefreshCurrent = VcsCommandIO.getBooleanProperty(cmd, VcsCommand.PROPERTY_REFRESH_CURRENT_FOLDER); ! boolean doRefreshParent = VcsCommandIO.getBooleanProperty(cmd, VcsCommand.PROPERTY_REFRESH_PARENT_FOLDER); ! if (doRefreshCurrent || doRefreshParent) { ! //System.out.println(" Command "+cmd+" running, will refresh later..."); ! refreshLater = true; ! break; ! } ! } ! } ! if (refreshLater) { ! Map fsFoldresMap = (Map) foldersToRefreshByFilesystems.get(fileSystem); ! if (fsFoldresMap == null) { ! fsFoldresMap = new TreeMap(); ! foldersToRefreshByFilesystems.put(fileSystem, fsFoldresMap); ! } ! copyFoldersToRefresh(foldersToRefresh, fsFoldresMap); ! foldersToRefresh = Collections.EMPTY_MAP; ! } else { ! Map fsFoldresMap = (Map) foldersToRefreshByFilesystems.remove(fileSystem); ! if (fsFoldresMap != null) { ! copyFoldersToRefresh(fsFoldresMap, foldersToRefresh); ! } ! } } ! doRefresh(fileSystem, foldersToRefresh); ! } ! ! private static void copyFoldersToRefresh(Map src, Map dest) { ! for (Iterator it = src.keySet().iterator(); it.hasNext(); ) { ! String folderName = (String) it.next(); ! Boolean srcRec = (Boolean) src.get(folderName); ! Boolean destRec = (Boolean) dest.get(folderName); ! if (!Boolean.TRUE.equals(destRec)) { ! dest.put(folderName, srcRec); } } } + private static void doRefresh(VcsFileSystem fileSystem, Map foldersToRefresh) { + //System.out.println("doRefresh("+foldersToRefresh+")"); + for (Iterator it = foldersToRefresh.keySet().iterator(); it.hasNext(); ) { + String folderName = (String) it.next(); + Boolean rec = (Boolean) foldersToRefresh.get(folderName); + //System.out.println("Calling doRefresh("+folderName+", "+rec.booleanValue()+")"); + doRefresh(fileSystem, folderName, rec.booleanValue()); + } + } + /** Perform the refresh of a folder. * @param fileSystem the file system to use * @param refreshPath the folder to refresh *************** *** 462,476 **** } } ! private static void doRefresh(VcsFileSystem fileSystem, String exec, VcsCommand cmd, ! String dir, String file, boolean foldersOnly, ! boolean doRefreshCurrent, boolean doRefreshParent) { FileCacheProvider cache = fileSystem.getCacheProvider(); FileStatusProvider statusProvider = fileSystem.getStatusProvider(); ! if (statusProvider == null) return; // No refresh without a status provider ! if((doRefreshCurrent || doRefreshParent) && fileSystem.getDoAutoRefresh(dir/*(String) vars.get("DIR")*/)) { // NOI18N //D.deb("Now refresh folder after CheckIn,CheckOut,Lock,Unlock... commands for convenience"); // NOI18N ! fileSystem.setAskIfDownloadRecursively(false); // do not ask if using auto refresh String refreshPath = dir;//(String) vars.get("DIR"); refreshPath.replace(java.io.File.separatorChar, '/'); String refreshPathFile = refreshPath + ((refreshPath.length() > 0) ? "/" : "") + file; //(String) vars.get("FILE"); --- 509,558 ---- } } ! /** ! * Get the map of names of folders, that need to be refreshed as keys and ! * a Boolean value of whether the refresh should be recursive or not as values. ! */ ! private static Map getFoldersToRefresh(VcsFileSystem fileSystem, VcsCommandExecutor vce, boolean foldersOnly) { ! Map foldersToRefresh = new TreeMap(); ! VcsCommand cmd = vce.getCommand(); ! boolean doRefreshCurrent = VcsCommandIO.getBooleanProperty(cmd, VcsCommand.PROPERTY_REFRESH_CURRENT_FOLDER); ! boolean doRefreshParent = VcsCommandIO.getBooleanProperty(cmd, VcsCommand.PROPERTY_REFRESH_PARENT_FOLDER); ! //System.out.println("getFoldersToRefresh("+fileSystem+", "+vce+", "+foldersOnly+"), current = "+doRefreshCurrent+", parent = "+doRefreshParent); ! if (doRefreshCurrent || doRefreshParent) { ! Collection files = vce.getFiles(); ! //System.out.println(" files = "+files); ! for(Iterator it = files.iterator(); it.hasNext(); ) { ! String fullPath = (String) it.next(); ! String dir = VcsUtilities.getDirNamePart(fullPath); ! String file = VcsUtilities.getFileNamePart(fullPath); ! //System.out.println(" fullPath = "+fullPath+", dir = "+dir+", file = "+file); ! Boolean recursively[] = { Boolean.FALSE }; ! String folderName = getFolderToRefresh(fileSystem, vce.getExec(), ! cmd, dir, file, foldersOnly, ! doRefreshCurrent, doRefreshParent, ! recursively); ! if (folderName != null) { ! Boolean rec = (Boolean) foldersToRefresh.get(folderName); ! if (!Boolean.TRUE.equals(rec)) { ! foldersToRefresh.put(folderName, recursively[0]); ! } ! } ! } ! } ! return foldersToRefresh; ! } ! ! private static String getFolderToRefresh(VcsFileSystem fileSystem, String exec, ! VcsCommand cmd, String dir, String file, ! boolean foldersOnly, boolean doRefreshCurrent, ! boolean doRefreshParent, Boolean[] recursively) { FileCacheProvider cache = fileSystem.getCacheProvider(); FileStatusProvider statusProvider = fileSystem.getStatusProvider(); ! if (statusProvider == null) return null; // No refresh without a status provider ! if (doRefreshCurrent || doRefreshParent) { // NOI18N //D.deb("Now refresh folder after CheckIn,CheckOut,Lock,Unlock... commands for convenience"); // NOI18N ! //fileSystem.setAskIfDownloadRecursively(false); // do not ask if using auto refresh String refreshPath = dir;//(String) vars.get("DIR"); refreshPath.replace(java.io.File.separatorChar, '/'); String refreshPathFile = refreshPath + ((refreshPath.length() > 0) ? "/" : "") + file; //(String) vars.get("FILE"); *************** *** 482,492 **** || (!cache.isDir(refreshPathFile) && !fileSystem.folder(refreshPathFile)))) && (patternMatch != null && patternMatch.length() > 0 && exec.indexOf(patternMatch) >= 0 || patternUnmatch != null && patternUnmatch.length() > 0 && exec.indexOf(patternUnmatch) < 0)); if (!foldersOnly || cache.isDir(refreshPath)) { ! doRefresh(fileSystem, refreshPath, rec); } } - if (!(doRefreshCurrent || doRefreshParent)) fileSystem.removeNumDoAutoRefresh(dir); //(String)vars.get("DIR")); // NOI18N } public static void checkRevisionChanges(VcsFileSystem fileSystem, VcsCommandExecutor vce) { --- 564,580 ---- || (!cache.isDir(refreshPathFile) && !fileSystem.folder(refreshPathFile)))) && (patternMatch != null && patternMatch.length() > 0 && exec.indexOf(patternMatch) >= 0 || patternUnmatch != null && patternUnmatch.length() > 0 && exec.indexOf(patternUnmatch) < 0)); + recursively[0] = (rec) ? Boolean.TRUE : Boolean.FALSE; + //System.out.println(" !foldersOnly = "+(!foldersOnly)+", cache.isDir("+refreshPath+") = "+cache.isDir(refreshPath)); if (!foldersOnly || cache.isDir(refreshPath)) { ! //System.out.println(" CALLING REFRESH!"); ! return refreshPath; ! } else { ! return null; } + } else { + return null; } } public static void checkRevisionChanges(VcsFileSystem fileSystem, VcsCommandExecutor vce) { Index: vcscore/src/org/netbeans/modules/vcscore/commands/CommandProcessor.java diff -c vcscore/src/org/netbeans/modules/vcscore/commands/CommandProcessor.java:1.8.2.2 vcscore/src/org/netbeans/modules/vcscore/commands/CommandProcessor.java:1.12 *** vcscore/src/org/netbeans/modules/vcscore/commands/CommandProcessor.java:1.8.2.2 Thu Mar 20 04:40:25 2003 --- vcscore/src/org/netbeans/modules/vcscore/commands/CommandProcessor.java Thu Apr 17 03:56:04 2003 *************** *** 768,773 **** --- 768,782 ---- return (String[]) names.toArray(new String[0]); } + synchronized CommandTask[] getRunningCommandTasks() { + LinkedList tasks = new LinkedList(); + for(Iterator it = tasksRunning.iterator(); it.hasNext(); ) { + CommandTaskInfo cw = (CommandTaskInfo) it.next(); + tasks.add(cw.getTask()); + } + return (CommandTask[]) tasks.toArray(new CommandTask[tasks.size()]); + } + /** @return true if there are two files contained in the same package folder, false otherwise. */ private static boolean areFilesInSamePackage(Collection files1, Collection files2) {