/** * author: Marcel Genzmehr * 19.07.2011 */ package org.freeplane.plugin.workspace.io; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.util.Arrays; import java.util.Comparator; import java.util.List; import org.freeplane.core.io.ListHashTable; import org.freeplane.core.resources.ResourceController; import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode; public class FilesystemManager { private final FileReadManager typeManager; private boolean filtering = true; public FilesystemManager(final FileReadManager typeManager) { this.typeManager = typeManager; } public boolean isFiltering() { return filtering; } public void setFiltering(boolean filtering) { this.filtering = filtering; } public void scanFileSystem(final AWorkspaceTreeNode node, final File file) { if (file != null && file.exists()) { if (file.isDirectory()) { if(node instanceof IFileSystemRepresentation) { iterateDirectory(node, file, ((IFileSystemRepresentation) node).orderDescending()); } else { iterateDirectory(node, file, false); } } else { createFileNode(node, file); } } } /** * @param directoryName * @param parentDir * @throws IOException */ public File createDirectory(String directoryName, File parentDir) throws IOException { File newDir = new File(parentDir, directoryName); int count = 0; while(newDir.exists() && count++ < 100) { newDir = new File(parentDir, directoryName + " ("+count+")"); } if(!newDir.mkdirs()) { throw new IOException("could not create directory: "+newDir.getPath()); } return newDir; } /** * @param directoryName * @param parentDir * @throws IOException */ public File createFile(String fileName, File parentDir) throws IOException { String pureName = fileName; String fileExtension = ""; int strPointer = fileName.lastIndexOf("."); if(strPointer > -1) { pureName = fileName.substring(0, strPointer); fileExtension = fileName.substring(strPointer+1); } File newFile = new File(parentDir, pureName+"."+fileExtension); int count = 0; while(newFile.exists() && count++ < 100) { newFile = new File(parentDir, pureName + " ("+count+")" +(fileExtension.trim().length() > 0 ? "."+fileExtension : "")); } if(!newFile.createNewFile()) { throw new IOException("could not create file: "+newFile.getPath()); } return newFile; } private ListHashTable<String, IFileTypeHandler> getFileTypeHandlers() { return typeManager.getFileTypeHandlers(); } private void iterateDirectory(AWorkspaceTreeNode parent, File directory, final boolean orderDescending) { boolean orderDesc = orderDescending; // if(parent instanceof IFileSystemRepresentation) { // orderDesc = ((IFileSystemRepresentation) parent).orderDescending(); // } for (File file : sortFiles(directory.listFiles(new DirectoryFilter()), orderDesc, true)) { AWorkspaceTreeNode newParent = createFileNode(parent, FileReadManager.DIRECTORY_HANDLE, file); iterateDirectory(newParent, file, orderDesc); } for (File file : sortFiles(directory.listFiles(new FilesOnlyFilter()), orderDesc, true)) { createFileNode(parent, file); } } /** * @param files * @param orderAscending * @param ignoreCase * @return */ private File[] sortFiles(File[] files, final boolean orderDescending, final boolean ignoreCase) { Comparator<File> comparator = new Comparator<File>() { public int compare(File o1, File o2) { File f1 = o1; File f2 = o2; if(ignoreCase) { f1 = new File(f1.getParentFile(), f1.getName().toLowerCase()); f2 = new File(f2.getParentFile(), f2.getName().toLowerCase()); } int compareResult = f1.compareTo(f2); if(orderDescending) { return compareResult*-1; } return compareResult; } }; Arrays.sort(files, comparator); return files; } private AWorkspaceTreeNode createFileNode(final AWorkspaceTreeNode parent, final File file) { String fileExtension = FileReadManager.DEFAULT_HANDLE; int dot = file.getPath().lastIndexOf('.'); if (-1 != dot) { fileExtension = file.getPath().substring(dot); } return createFileNode(parent, fileExtension, file); } private AWorkspaceTreeNode createFileNode(final AWorkspaceTreeNode parent, String fileExtension, final File file) { List<IFileTypeHandler> handlers = getFileTypeHandlers().list(fileExtension); if (handlers == null) { fileExtension = FileReadManager.DEFAULT_HANDLE; handlers = getFileTypeHandlers().list(fileExtension); } if (handlers != null && handlers.size() == 1) { //FIXME: what if there is more than one handler for a single type? IFileTypeHandler nodeCreator = handlers.get(0); AWorkspaceTreeNode newParent = nodeCreator.createFileNode(parent, fileExtension, file); return newParent; } return parent; } /*********************************************************************************** * INTERNAL CLASS DEFINITIONS **********************************************************************************/ private class DirectoryFilter implements FileFilter { private boolean filtering = true; public boolean accept(File pathname) { if(filtering && pathname.getName().startsWith(".") && !pathname.getName().equals("."+ResourceController.getResourceController().getProperty("workspace.profile"))) { return false; } if (pathname.isDirectory()) { return true; } return false; } } private class FilesOnlyFilter implements FileFilter { private boolean filtering = true; public boolean accept(File pathname) { if(filtering && pathname.getName().startsWith(".")) { return false; } if (pathname.isFile()) { return true; } return false; } } }