package jdepend.framework; import java.io.*; import java.util.*; /** * The <code>FileManager</code> class is responsible for extracting * Java class files (<code>.class</code> files) from a collection of * registered directories. * * @author <b>Mike Clark</b> * @author Clarkware Consulting, Inc. */ public class FileManager { private ArrayList directories; private boolean acceptInnerClasses; public FileManager() { directories = new ArrayList(); acceptInnerClasses = true; } /** * Determines whether inner classes should be collected. * * @param b <code>true</code> to collect inner classes; * <code>false</code> otherwise. */ public void acceptInnerClasses(boolean b) { acceptInnerClasses = b; } public void addDirectory(String name) throws IOException { File directory = new File(name); if (directory.isDirectory() || acceptJarFile(directory)) { directories.add(directory); } else { throw new IOException("Invalid directory or JAR file: " + name); } } public boolean acceptFile(File file) { return acceptClassFile(file) || acceptJarFile(file); } public boolean acceptClassFile(File file) { if (!file.isFile()) { return false; } return acceptClassFileName(file.getName()); } public boolean acceptClassFileName(String name) { if (!acceptInnerClasses) { if (name.toLowerCase().indexOf("$") > 0) { return false; } } if (!name.toLowerCase().endsWith(".class")) { return false; } return true; } public boolean acceptJarFile(File file) { return isJar(file) || isZip(file) || isWar(file); } public Collection extractFiles() { Collection files = new ArrayList(); for (Iterator i = directories.iterator(); i.hasNext();) { File directory = (File)i.next(); collectFiles(directory, files); } return files; } private void collectFiles(File directory, Collection files) { if (directory.isFile()) { addFile(directory, files); } else { String[] directoryFiles = directory.list(); for (int i = 0; i < directoryFiles.length; i++) { File file = new File(directory, directoryFiles[i]); if (acceptFile(file)) { addFile(file, files); } else if (file.isDirectory()) { collectFiles(file, files); } } } } private void addFile(File f, Collection files) { if (!files.contains(f)) { files.add(f); } } private boolean isWar(File file) { return existsWithExtension(file, ".war"); } private boolean isZip(File file) { return existsWithExtension(file, ".zip"); } private boolean isJar(File file) { return existsWithExtension(file, ".jar"); } private boolean existsWithExtension(File file, String extension) { return file.isFile() && file.getName().toLowerCase().endsWith(extension); } }