blob: 860ba69439ecddfb331ba0ca24ab60db0ed69137 [file] [log] [blame]
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.lib.cvsclient.command;
import org.netbeans.lib.cvsclient.IClientEnvironment;
import org.netbeans.lib.cvsclient.admin.Entry;
import org.netbeans.lib.cvsclient.admin.IAdminReader;
import org.netbeans.lib.cvsclient.admin.IAdminWriter;
import org.netbeans.lib.cvsclient.event.ICvsListener;
import org.netbeans.lib.cvsclient.event.ICvsListenerRegistry;
import org.netbeans.lib.cvsclient.event.IDirectoryListener;
import org.netbeans.lib.cvsclient.file.DirectoryObject;
import org.netbeans.lib.cvsclient.file.ICvsFileSystem;
import org.netbeans.lib.cvsclient.file.ILocalFileReader;
import org.netbeans.lib.cvsclient.util.BugLog;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @author Thomas Singer
*/
public final class DirectoryPruner
implements ICvsListener, IDirectoryListener {
// Fields =================================================================
private final List directoriesToScan = new ArrayList();
private final IClientEnvironment clientEnvironment;
// Setup ==================================================================
public DirectoryPruner(IClientEnvironment clientEnvironment) {
BugLog.getInstance().assertNotNull(clientEnvironment);
this.clientEnvironment = clientEnvironment;
}
// Implemented ============================================================
public void processingDirectory(DirectoryObject directoryObject) {
if (directoryObject.isRoot()) {
return;
}
if (directoriesToScan.contains(directoryObject)) {
return;
}
directoriesToScan.add(directoryObject);
}
public void registerListeners(ICvsListenerRegistry listenerRegistry) {
listenerRegistry.addDirectoryListener(this);
}
public void unregisterListeners(ICvsListenerRegistry listenerRegistry) {
listenerRegistry.removeDirectoryListener(this);
}
// Actions ================================================================
/**
* Remove any directories that don't contain any files
*/
public final void pruneEmptyDirectories() throws IOException {
while (directoriesToScan.size() > 0) {
final DirectoryObject directoryObject = (DirectoryObject)directoriesToScan.remove(0);
pruneEmptyDirectory(directoryObject);
}
}
// Utils ==================================================================
private boolean pruneEmptyDirectory(DirectoryObject directoryObject) throws IOException {
final ILocalFileReader localFileReader = clientEnvironment.getLocalFileReader();
final ICvsFileSystem cvsFileSystem = clientEnvironment.getCvsFileSystem();
final IAdminWriter adminWriter = clientEnvironment.getAdminWriter();
final IAdminReader adminReader = clientEnvironment.getAdminReader();
directoriesToScan.remove(directoryObject);
if (!localFileReader.exists(directoryObject, cvsFileSystem)) {
return true;
}
final List fileNames = new ArrayList();
final List directoryNames = new ArrayList();
localFileReader.listFilesAndDirectories(directoryObject, fileNames, directoryNames, cvsFileSystem);
if (fileNames.size() > 0) {
return false;
}
if (hasFileEntry(directoryObject, cvsFileSystem, adminReader)) {
return false;
}
for (Iterator it = directoryNames.iterator(); it.hasNext();) {
final String directoryName = (String)it.next();
if (!pruneEmptyDirectory(DirectoryObject.createInstance(directoryObject, directoryName))) {
return false;
}
}
if (adminReader.hasCvsDirectory(directoryObject, cvsFileSystem)) {
try {
adminWriter.removeEntryForFile(directoryObject, cvsFileSystem);
}
catch (FileNotFoundException ex) {
// ignore
return false;
}
adminWriter.pruneDirectory(directoryObject, cvsFileSystem);
return true;
}
return false;
}
private boolean hasFileEntry(DirectoryObject directoryObject, ICvsFileSystem cvsFileSystem, IAdminReader adminReader) throws IOException {
for (Iterator it = adminReader.getEntries(directoryObject, cvsFileSystem).iterator(); it.hasNext();) {
final Entry entry = (Entry)it.next();
if (!entry.isDirectory()) {
return true;
}
}
return false;
}
}