package fitnesse.updates;
import util.FileUtil;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
public class UpdateFileList {
private List<String> mainDirectories;
private String updateListContent;
private String updateDoNotCopyOverContent;
private HashSet<String> doNotReplaceFiles = new HashSet<String>();
private String baseDirectory = "";
private String outputDirectory = "";
static UpdateFileList testUpdater = null;
public static void main(String[] args) {
UpdateFileList updater = testUpdater != null ? testUpdater : new UpdateFileList();
updater.parseCommandLine(args);
if (updater.directoriesAreValid()) {
updater.createUpdateList();
updater.createDoNotUpdateList();
} else {
updater.printMessage("Some directories are invalid.");
updater.exit();
}
}
void printMessage(String message) {
System.err.println(message);
}
void exit() {
System.exit(1);
}
public UpdateFileList() {
mainDirectories = new ArrayList<String>();
updateListContent = "";
updateDoNotCopyOverContent = "";
}
public boolean parseCommandLine(String[] args) {
if (args.length == 0)
return false;
for (String arg : args)
parseArgument(arg);
return true;
}
private void parseArgument(String arg) {
if (arg.startsWith("-doNotReplace:"))
addADoNotReplaceFileName(arg);
else if (arg.startsWith("-baseDirectory:"))
baseDirectory = parseDirectoryArgument(arg);
else if (arg.startsWith("-outputDirectory:"))
outputDirectory = parseDirectoryArgument(arg);
else
mainDirectories.add(baseDirectory + arg);
}
private void addADoNotReplaceFileName(String arg) {
String[] components = arg.split(":");
doNotReplaceFiles.add(components[1]);
}
private String parseDirectoryArgument(String arg) {
String dir = arg.substring(arg.indexOf(':')+1);
if (!dir.endsWith("/"))
dir += "/";
return dir;
}
public List<String> getDirectories() {
return mainDirectories;
}
public boolean directoriesAreValid() {
for (String dirName : mainDirectories) {
File checkFile = new File(dirName);
if (!checkFile.exists()) {
return false;
}
}
return true;
}
public File createUpdateList() {
for (String dirName : mainDirectories)
addFilePathsToList(dirName);
return FileUtil.createFile(new File(outputDirectory + "updateList"), updateListContent);
}
private void addFilePathsToList(String directoryPath) {
File directory = new File(directoryPath);
File[] files = FileUtil.getDirectoryListing(directory);
for (File childFile : files)
if (!isBackupFile(childFile))
addFilePathToAppropriateList(directoryPath, childFile);
}
private boolean isBackupFile(File childFile) {
return childFile.getName().endsWith(".zip");
}
private void addFilePathToAppropriateList(String directoryPath, File childFile) {
String childPath = directoryPath + "/" + childFile.getName();
if (childFile.isDirectory())
addFilePathsToList(childPath);
else if (isDoNotReplaceFile(childFile))
updateDoNotCopyOverContent += makePathLine(childPath);
else
updateListContent += makePathLine(childPath);
}
private String makePathLine(String path) {
if (baseDirectory != null && baseDirectory.length() > 0 && path.startsWith(baseDirectory))
path = path.replace(baseDirectory, "");
if (path.startsWith("/"))
path = path.substring(1);
return path + "\n";
}
private boolean isDoNotReplaceFile(File file) {
String name = file.getPath();
String baseDirectoryOnOS = baseDirectory.replace( "/", File.separator);
name = name.replace(baseDirectoryOnOS, "");
name = name.replace(File.separator, "/");
return doNotReplaceFiles.contains(name);
}
public File createDoNotUpdateList() {
if (updateDoNotCopyOverContent.equals(""))
for (String dirName : mainDirectories)
addFilePathsToList(dirName);
return FileUtil.createFile(new File(outputDirectory + "updateDoNotCopyOverList"), updateDoNotCopyOverContent);
}
}