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.JavaClass; 26 import org.apache.tools.ant.util.depend.AbstractAnalyzer; 27 28 33 public class AncestorAnalyzer extends AbstractAnalyzer { 34 35 41 public AncestorAnalyzer() { 42 try { 44 new ClassParser("force"); 45 } catch (IOException e) { 46 } 48 } 49 50 58 protected void determineDependencies(Vector files, Vector classes) { 59 Hashtable dependencies = new Hashtable (); 62 Hashtable containers = new Hashtable (); 63 Hashtable toAnalyze = new Hashtable (); 64 Hashtable nextAnalyze = new Hashtable (); 65 for (Enumeration e = getRootClasses(); e.hasMoreElements();) { 66 String classname = (String ) e.nextElement(); 67 toAnalyze.put(classname, classname); 68 } 69 70 int count = 0; 71 int maxCount = isClosureRequired() ? MAX_LOOPS : 2; 72 while (toAnalyze.size() != 0 && count++ < maxCount) { 73 nextAnalyze.clear(); 74 for (Enumeration e = toAnalyze.keys(); e.hasMoreElements();) { 75 String classname = (String ) e.nextElement(); 76 dependencies.put(classname, classname); 77 try { 78 File container = getClassContainer(classname); 79 if (container == null) { 80 continue; 81 } 82 containers.put(container, container); 83 84 ClassParser parser = null; 85 if (container.getName().endsWith(".class")) { 86 parser = new ClassParser(container.getPath()); 87 } else { 88 parser = new ClassParser(container.getPath(), 89 classname.replace('.', '/') + ".class"); 90 } 91 92 JavaClass javaClass = parser.parse(); 93 String [] interfaces = javaClass.getInterfaceNames(); 94 for (int i = 0; i < interfaces.length; ++i) { 95 String interfaceName = interfaces[i]; 96 if (!dependencies.containsKey(interfaceName)) { 97 nextAnalyze.put(interfaceName, interfaceName); 98 } 99 } 100 101 if (javaClass.isClass()) { 102 String superClass = javaClass.getSuperclassName(); 103 if (!dependencies.containsKey(superClass)) { 104 nextAnalyze.put(superClass, superClass); 105 } 106 } 107 } catch (IOException ioe) { 108 } 110 } 111 112 Hashtable temp = toAnalyze; 113 toAnalyze = nextAnalyze; 114 nextAnalyze = temp; 115 } 116 117 files.removeAllElements(); 118 for (Enumeration e = containers.keys(); e.hasMoreElements();) { 119 files.addElement((File ) e.nextElement()); 120 } 121 122 classes.removeAllElements(); 123 for (Enumeration e = dependencies.keys(); e.hasMoreElements();) { 124 classes.addElement((String ) e.nextElement()); 125 } 126 } 127 128 133 protected boolean supportsFileDependencies() { 134 return true; 135 } 136 137 } 138 139 | Popular Tags |