1 18 package org.apache.tools.ant.util.depend.bcel; 19 import java.io.File ; 20 import java.io.IOException ; 21 import java.util.Enumeration ; 22 import java.util.Hashtable ; 23 import java.util.Vector ; 24 import org.apache.bcel.classfile.ClassParser; 25 import org.apache.bcel.classfile.DescendingVisitor; 26 import org.apache.bcel.classfile.JavaClass; 27 import org.apache.tools.ant.util.depend.AbstractAnalyzer; 28 29 33 public class FullAnalyzer extends AbstractAnalyzer { 34 40 public FullAnalyzer() { 41 try { 43 new ClassParser("force"); 44 } catch (IOException e) { 45 } 47 } 48 49 57 protected void determineDependencies(Vector files, Vector classes) { 58 Hashtable dependencies = new Hashtable (); 61 Hashtable containers = new Hashtable (); 62 Hashtable toAnalyze = new Hashtable (); 63 for (Enumeration e = getRootClasses(); e.hasMoreElements();) { 64 String classname = (String ) e.nextElement(); 65 toAnalyze.put(classname, classname); 66 } 67 68 int count = 0; 69 int maxCount = isClosureRequired() ? MAX_LOOPS : 2; 70 while (toAnalyze.size() != 0 && count++ < maxCount) { 71 DependencyVisitor dependencyVisitor = new DependencyVisitor(); 72 for (Enumeration e = toAnalyze.keys(); e.hasMoreElements();) { 73 String classname = (String ) e.nextElement(); 74 dependencies.put(classname, classname); 75 try { 76 File container = getClassContainer(classname); 77 if (container == null) { 78 continue; 79 } 80 containers.put(container, container); 81 82 ClassParser parser = null; 83 if (container.getName().endsWith(".class")) { 84 parser = new ClassParser(container.getPath()); 85 } else { 86 parser = new ClassParser(container.getPath(), 87 classname.replace('.', '/') + ".class"); 88 } 89 90 JavaClass javaClass = parser.parse(); 91 DescendingVisitor traverser 92 = new DescendingVisitor(javaClass, dependencyVisitor); 93 traverser.visit(); 94 } catch (IOException ioe) { 95 } 97 } 98 99 toAnalyze.clear(); 100 101 Enumeration depsEnum = dependencyVisitor.getDependencies(); 103 while (depsEnum.hasMoreElements()) { 104 String className = (String ) depsEnum.nextElement(); 105 if (!dependencies.containsKey(className)) { 106 toAnalyze.put(className, className); 107 } 108 } 109 } 110 111 files.removeAllElements(); 112 for (Enumeration e = containers.keys(); e.hasMoreElements();) { 113 files.addElement((File ) e.nextElement()); 114 } 115 116 classes.removeAllElements(); 117 for (Enumeration e = dependencies.keys(); e.hasMoreElements();) { 118 classes.addElement((String ) e.nextElement()); 119 } 120 } 121 122 127 protected boolean supportsFileDependencies() { 128 return true; 129 } 130 } 131 132 | Popular Tags |