package jdepend.framework;
import java.io.*;
import java.util.*;
import java.util.jar.*;
import java.util.zip.*;
/**
* The <code>JavaClassBuilder</code> builds <code>JavaClass</code>
* instances from .class, .jar, .war, or .zip files.
*
* @author <b>Mike Clark</b>
* @author Clarkware Consulting, Inc.
*/
public class JavaClassBuilder {
private AbstractParser parser;
private FileManager fileManager;
public JavaClassBuilder() {
this(new ClassFileParser(), new FileManager());
}
public JavaClassBuilder(FileManager fm) {
this(new ClassFileParser(), fm);
}
public JavaClassBuilder(AbstractParser parser, FileManager fm) {
this.parser = parser;
this.fileManager = fm;
}
public int countClasses() {
AbstractParser counter = new AbstractParser() {
public JavaClass parse(InputStream is) {
return new JavaClass("");
}
};
JavaClassBuilder builder = new JavaClassBuilder(counter, fileManager);
Collection classes = builder.build();
return classes.size();
}
/**
* Builds the <code>JavaClass</code> instances.
*
* @return Collection of <code>JavaClass</code> instances.
*/
public Collection build() {
Collection classes = new ArrayList();
for (Iterator i = fileManager.extractFiles().iterator(); i.hasNext();) {
File nextFile = (File)i.next();
try {
classes.addAll(buildClasses(nextFile));
} catch (IOException ioe) {
System.err.println("\n" + ioe.getMessage());
}
}
return classes;
}
/**
* Builds the <code>JavaClass</code> instances from the
* specified file.
*
* @param file Class or Jar file.
* @return Collection of <code>JavaClass</code> instances.
*/
public Collection buildClasses(File file) throws IOException {
if (fileManager.acceptClassFile(file)) {
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
JavaClass parsedClass = parser.parse(fis);
Collection javaClasses = new ArrayList();
javaClasses.add(parsedClass);
return javaClasses;
} finally {
if (fis != null) {
fis.close();
}
}
} else if (fileManager.acceptJarFile(file)) {
JarFile jarFile = new JarFile(file);
Collection result = buildClasses(jarFile);
jarFile.close();
return result;
} else {
throw new IOException("File is not a valid " +
".class, .jar, .war, or .zip file: " +
file.getPath());
}
}
/**
* Builds the <code>JavaClass</code> instances from the specified
* jar, war, or zip file.
*
* @param file Jar, war, or zip file.
* @return Collection of <code>JavaClass</code> instances.
*/
public Collection buildClasses(JarFile file) throws IOException {
Collection javaClasses = new ArrayList();
Enumeration entries = file.entries();
while (entries.hasMoreElements()) {
ZipEntry e = (ZipEntry) entries.nextElement();
if (fileManager.acceptClassFileName(e.getName())) {
InputStream is = null;
try {
is = file.getInputStream(e);
JavaClass jc = parser.parse(is);
javaClasses.add(jc);
} finally {
is.close();
}
}
}
return javaClasses;
}
}