package org.netbeans.lib.cvsclient.progress.receiving; import org.netbeans.lib.cvsclient.admin.Entry; import org.netbeans.lib.cvsclient.command.ICvsFiles; import org.netbeans.lib.cvsclient.command.ICvsFilesVisitor; import org.netbeans.lib.cvsclient.file.DirectoryObject; import org.netbeans.lib.cvsclient.file.FileObject; import org.netbeans.lib.cvsclient.progress.IProgressViewer; import org.netbeans.lib.cvsclient.util.BugLog; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * @author Thomas Singer */ public class AbstractResponseProgressHandler { // Fields ================================================================= private final Set fileObjects = new HashSet(2000); private final Map directoryPaths = new HashMap(200); private final IProgressViewer progressViewer; private final int maxCount; private int count; private String previousDirectoryPath; // Setup ================================================================== protected AbstractResponseProgressHandler(IProgressViewer progressViewer, ICvsFiles cvsFiles) { BugLog.getInstance().assertNotNull(progressViewer); BugLog.getInstance().assertNotNull(cvsFiles); this.progressViewer = progressViewer; cvsFiles.visit(new ICvsFilesVisitor() { public void handleFile(FileObject fileObject, Entry entry, boolean exists) { fileObjects.add(fileObject); addDirectory(fileObject.getParent()); } public void handleDirectory(DirectoryObject directoryObject) { } }); maxCount = fileObjects.size(); } // Actions ================================================================ protected final void fileProcessed(FileObject fileObject) { if (!fileObjects.remove(fileObject)) { return; } final FileObjectsCount count = getFileObjectsCount(fileObject.getParentPath()); if (count == null) { return; } count.dec(); notifyProgressViewer(1); } protected final void directoryProcessed(String directoryPath) { if (previousDirectoryPath != null && !previousDirectoryPath.equals(directoryPath)) { final FileObjectsCount previousDirectoryCount = removeFileObjectsCount(previousDirectoryPath); if (previousDirectoryCount != null) { notifyProgressViewer(previousDirectoryCount.getUnprocessedFilesInDirectory()); } } previousDirectoryPath = directoryPath; } // Utils ================================================================== private FileObjectsCount getFileObjectsCount(String directoryPath) { return (FileObjectsCount)directoryPaths.get(directoryPath); } private FileObjectsCount removeFileObjectsCount(String directoryPath) { return (FileObjectsCount)directoryPaths.remove(directoryPath); } private void putFileObjectsCount(String directoryPath, FileObjectsCount fileObjectsCount) { directoryPaths.put(directoryPath, fileObjectsCount); } private void addDirectory(DirectoryObject directoryObject) { final String directoryPath = directoryObject.getPath(); FileObjectsCount count = getFileObjectsCount(directoryPath); if (count == null) { count = new FileObjectsCount(); putFileObjectsCount(directoryPath, count); } count.inc(); } private void notifyProgressViewer(int incrementProgress) { if (incrementProgress == 0) { return; } count += incrementProgress; progressViewer.setProgress((double)count / maxCount); } // Inner classes ========================================================== private static final class FileObjectsCount { // Fields ================================================================= private int fileObjectsPerDirectory; // Setup ================================================================== public FileObjectsCount() { } // Implemented ============================================================ public String toString() { return String.valueOf(fileObjectsPerDirectory); } // Accessing ============================================================== private void inc() { fileObjectsPerDirectory++; } private void dec() { fileObjectsPerDirectory--; } private int getUnprocessedFilesInDirectory() { return fileObjectsPerDirectory; } } }