blob: e98ce82db0a1a74930ff48bd26d99b1d02876f22 [file] [log] [blame]
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;
}
}
}