1 package jp.sourceforge.stigmata.digger;
4 import java.io.FileInputStream;
5 import java.io.FileNotFoundException;
6 import java.io.IOException;
7 import java.io.InputStream;
8 import java.net.MalformedURLException;
10 import java.util.ArrayList;
11 import java.util.Iterator;
12 import java.util.List;
14 import org.objectweb.asm.AnnotationVisitor;
15 import org.objectweb.asm.Attribute;
16 import org.objectweb.asm.ClassReader;
17 import org.objectweb.asm.ClassVisitor;
18 import org.objectweb.asm.FieldVisitor;
19 import org.objectweb.asm.MethodVisitor;
20 import org.objectweb.asm.Opcodes;
26 * @author Haruaki TAMADA
28 public class DefaultClassFileArchive implements ClassFileArchive{
30 private String className;
32 public DefaultClassFileArchive(String file){
36 public DefaultClassFileArchive(File file){
40 } catch(ParseClassNameFailedException e){
45 public DefaultClassFileArchive(String file, String className){
46 this(new File(file), className);
49 public DefaultClassFileArchive(File file, String className){
51 this.className = className;
54 public URL getLocation(){
56 return file.toURI().toURL();
57 } catch (MalformedURLException ex) {
62 public InputStream getInputStream(ClassFileEntry entry) throws IOException{
63 return new FileInputStream(file);
66 public Iterator<ClassFileEntry> iterator(){
67 List<ClassFileEntry> list = new ArrayList<ClassFileEntry>();
68 list.add(new ClassFileEntry(className, getLocation()));
70 return list.iterator();
73 public boolean hasEntry(String className){
74 return this.className.equals(className);
77 public ClassFileEntry getEntry(String className) throws ClassNotFoundException{
78 return new ClassFileEntry(className, getLocation());
81 public String getName(){
85 private void parseClassName() throws ParseClassNameFailedException{
86 FileInputStream in = null;
88 in = new FileInputStream(file);
89 ClassReader reader = new ClassReader(in);
90 ClassNameExtractVisitor visitor = new ClassNameExtractVisitor();
91 reader.accept(visitor, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
93 this.className = visitor.getClassName();
94 } catch (FileNotFoundException ex) {
95 throw new ParseClassNameFailedException(ex);
96 } catch (IOException ex) {
97 throw new ParseClassNameFailedException(ex);
102 } catch(IOException e){
103 throw new ParseClassNameFailedException(e);
109 private static class ClassNameExtractVisitor extends ClassVisitor{
110 private String className;
112 public ClassNameExtractVisitor(){
116 public String getClassName(){
121 public void visit(int version, int access, String name, String signature,
122 String superClassName, String[] interfaces){
127 public AnnotationVisitor visitAnnotation(String arg0, boolean arg1){
132 public void visitAttribute(Attribute arg0){
136 public void visitEnd(){
140 public FieldVisitor visitField(int arg0, String arg1, String arg2,
141 String arg3, Object arg4){
146 public void visitInnerClass(String arg0, String arg1, String arg2,
151 public MethodVisitor visitMethod(int arg0, String arg1, String arg2,
152 String arg3, String[] arg4){
157 public void visitOuterClass(String arg0, String arg1, String arg2){
161 public void visitSource(String arg0, String arg1){