classes upon which that class depends. Submitted by: Holger Engels <hengels@mercatis.de> git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269884 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -36,7 +36,9 @@ | |||||
| <property name="ant.package" value="org/apache/tools/ant"/> | <property name="ant.package" value="org/apache/tools/ant"/> | ||||
| <property name="optional.package" value="${ant.package}/taskdefs/optional"/> | <property name="optional.package" value="${ant.package}/taskdefs/optional"/> | ||||
| <property name="regexp.package" value="${ant.package}/util/regexp"/> | |||||
| <property name="optional.type.package" value="${ant.package}/types/optional"/> | |||||
| <property name="util.package" value="${ant.package}/util"/> | |||||
| <property name="regexp.package" value="${util.package}/regexp"/> | |||||
| <property name="manifest" value="src/etc/manifest"/> | <property name="manifest" value="src/etc/manifest"/> | ||||
| @@ -176,6 +178,9 @@ | |||||
| <available property="xerces.present" | <available property="xerces.present" | ||||
| classname="org.apache.xerces.parsers.SAXParser" | classname="org.apache.xerces.parsers.SAXParser" | ||||
| classpathref="classpath" /> | classpathref="classpath" /> | ||||
| <available property="bcel.present" | |||||
| classname="de.fub.bytecode.Constants" | |||||
| classpathref="classpath" /> | |||||
| <condition property="javamail.complete"> | <condition property="javamail.complete"> | ||||
| <and> | <and> | ||||
| @@ -284,6 +289,10 @@ | |||||
| <exclude name="${optional.package}/metamata/**" unless="jdk1.2+" /> | <exclude name="${optional.package}/metamata/**" unless="jdk1.2+" /> | ||||
| <exclude name="${optional.package}/ManifestFile.java" | <exclude name="${optional.package}/ManifestFile.java" | ||||
| unless="jdk1.2+" /> | unless="jdk1.2+" /> | ||||
| <exclude name="${optional.type.package}/depend/*.java" | |||||
| unless="bcel.present" /> | |||||
| <exclude name="${util.package}/depend/*.java" | |||||
| unless="bcel.present" /> | |||||
| </javac> | </javac> | ||||
| <copy todir="${build.classes}"> | <copy todir="${build.classes}"> | ||||
| @@ -5,4 +5,5 @@ patternset=org.apache.tools.ant.types.PatternSet | |||||
| mapper=org.apache.tools.ant.types.Mapper | mapper=org.apache.tools.ant.types.Mapper | ||||
| filterset=org.apache.tools.ant.types.FilterSet | filterset=org.apache.tools.ant.types.FilterSet | ||||
| description=org.apache.tools.ant.types.Description | description=org.apache.tools.ant.types.Description | ||||
| classfileset=org.apache.tools.ant.types.optional.depend.ClassfileSet | |||||
| @@ -0,0 +1,102 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.types.optional.depend; | |||||
| import java.io.File; | |||||
| import java.util.Stack; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.DirectoryScanner; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.types.FileSet; | |||||
| import org.apache.tools.ant.util.depend.Dependencies; | |||||
| /** | |||||
| * A DepSet is a FileSet, that enlists all classes that depend on a | |||||
| * certain class. | |||||
| * | |||||
| * A DependSet extends FileSets and uses another FileSet as input. The | |||||
| * nested FileSet attribute provides the domain, that is used for searching | |||||
| * for dependent classes | |||||
| * | |||||
| * @author <a href="mailto:hengels@innovidata.com">Holger Engels</a> | |||||
| */ | |||||
| public class ClassfileSet extends FileSet { | |||||
| private File baseClass = null; | |||||
| /** | |||||
| * Set the directory for the fileset. Prevents both "dir" and "src" | |||||
| * from being specified. | |||||
| */ | |||||
| public void setBaseClass(File baseClass) | |||||
| throws BuildException | |||||
| { | |||||
| this.baseClass = baseClass; | |||||
| } | |||||
| public void setDir(File dir) throws BuildException { | |||||
| super.setDir(dir); | |||||
| } | |||||
| /** | |||||
| * Return the DirectoryScanner associated with this FileSet. | |||||
| */ | |||||
| public DirectoryScanner getDirectoryScanner(Project p) { | |||||
| DependScanner scanner = new DependScanner(); | |||||
| scanner.setBasedir(getDir(p)); | |||||
| scanner.setBaseClass(baseClass); | |||||
| scanner.scan(); | |||||
| return scanner; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,192 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.types.optional.depend; | |||||
| import java.io.*; | |||||
| import java.util.*; | |||||
| import org.apache.tools.ant.util.depend.Dependencies; | |||||
| import org.apache.tools.ant.util.depend.Filter; | |||||
| import org.apache.tools.ant.DirectoryScanner; | |||||
| import de.fub.bytecode.classfile.*; | |||||
| import de.fub.bytecode.*; | |||||
| /** | |||||
| * An interface used to describe the actions required by any type of | |||||
| * directory scanner. | |||||
| */ | |||||
| public class DependScanner extends DirectoryScanner { | |||||
| File basedir; | |||||
| File baseClass; | |||||
| List included = new LinkedList(); | |||||
| /** | |||||
| * Sets the basedir for scanning. This is the directory that is scanned | |||||
| * recursively. | |||||
| * | |||||
| * @param basedir the (non-null) basedir for scanning | |||||
| */ | |||||
| public void setBasedir(String basedir) { | |||||
| setBasedir(new File(basedir.replace('/',File.separatorChar).replace('\\',File.separatorChar))); | |||||
| } | |||||
| /** | |||||
| * Sets the basedir for scanning. This is the directory that is scanned | |||||
| * recursively. | |||||
| * | |||||
| * @param basedir the basedir for scanning | |||||
| */ | |||||
| public void setBasedir(File basedir) { | |||||
| this.basedir = basedir; | |||||
| } | |||||
| /** | |||||
| * Gets the basedir that is used for scanning. | |||||
| * | |||||
| * @return the basedir that is used for scanning | |||||
| */ | |||||
| public File getBasedir() { return basedir; } | |||||
| /** | |||||
| * Sets the domain, where dependant classes are searched | |||||
| * | |||||
| * @param domain the domain | |||||
| */ | |||||
| public void setBaseClass(File baseClass) { | |||||
| this.baseClass = baseClass; | |||||
| } | |||||
| /** | |||||
| * Get the names of the class files, baseClass depends on | |||||
| * | |||||
| * @return the names of the files | |||||
| */ | |||||
| public String[] getIncludedFiles() { | |||||
| int count = included.size(); | |||||
| String[] files = new String[count]; | |||||
| for (int i = 0; i < count; i++) { | |||||
| files[i] = included.get(i) + ".class"; | |||||
| //System.err.println(" " + files[i]); | |||||
| } | |||||
| return files; | |||||
| } | |||||
| /** | |||||
| * Scans the base directory for files that baseClass depends on | |||||
| * | |||||
| * @exception IllegalStateException when basedir was set incorrecly | |||||
| */ | |||||
| public void scan() { | |||||
| Dependencies visitor = new Dependencies(); | |||||
| Set set = new TreeSet(); | |||||
| Set newSet = new HashSet(); | |||||
| final String base; | |||||
| String start; | |||||
| try { | |||||
| base = basedir.getCanonicalPath() + File.separator; | |||||
| start = baseClass.getCanonicalPath(); | |||||
| } | |||||
| catch (Exception e) { | |||||
| throw new IllegalArgumentException(e.getMessage()); | |||||
| } | |||||
| start = start.substring(base.length(), start.length() - ".class".length()).replace(File.separatorChar, '/'); | |||||
| System.err.println("start: " + start); | |||||
| newSet.add(start); | |||||
| set.add(start); | |||||
| do { | |||||
| Iterator i = newSet.iterator(); | |||||
| while (i.hasNext()) { | |||||
| String fileName = base + ((String)i.next()).replace('/', File.separatorChar) + ".class"; | |||||
| try { | |||||
| JavaClass javaClass = new ClassParser(fileName).parse(); | |||||
| javaClass.accept(visitor); | |||||
| } | |||||
| catch (IOException e) { | |||||
| System.err.println("exception: " + e.getMessage()); | |||||
| } | |||||
| } | |||||
| newSet.clear(); | |||||
| newSet.addAll(visitor.getDependencies()); | |||||
| visitor.clearDependencies(); | |||||
| Dependencies.applyFilter(newSet, new Filter() { | |||||
| public boolean accept(Object object) { | |||||
| String fileName = base + ((String)object).replace('/', File.separatorChar) + ".class"; | |||||
| return new File(fileName).exists(); | |||||
| } | |||||
| }); | |||||
| newSet.removeAll(set); | |||||
| set.addAll(newSet); | |||||
| } | |||||
| while (newSet.size() > 0); | |||||
| included.clear(); | |||||
| included.addAll(set); | |||||
| } | |||||
| public void addDefaultExcludes() {} | |||||
| public String[] getExcludedDirectories() { return null; }; | |||||
| public String[] getExcludedFiles() { return null; } | |||||
| public String[] getIncludedDirectories() { return new String[0]; } | |||||
| public String[] getNotIncludedDirectories() { return null; } | |||||
| public String[] getNotIncludedFiles() { return null; } | |||||
| public void setExcludes(String[] excludes) {} | |||||
| public void setIncludes(String[] includes) {} | |||||
| public void setCaseSensitive(boolean isCaseSensitive) {} | |||||
| } | |||||
| @@ -0,0 +1,261 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.util.depend; | |||||
| import java.io.*; | |||||
| import java.util.*; | |||||
| import de.fub.bytecode.classfile.*; | |||||
| import de.fub.bytecode.*; | |||||
| public class Dependencies implements Visitor { | |||||
| private boolean verbose = false; | |||||
| private JavaClass javaClass; | |||||
| private ConstantPool constantPool; | |||||
| private Set dependencies = new HashSet(); | |||||
| public void clearDependencies() { | |||||
| dependencies.clear(); | |||||
| } | |||||
| public Set getDependencies() { | |||||
| return dependencies; | |||||
| } | |||||
| public void visitCode(Code obj) {} | |||||
| public void visitCodeException(CodeException obj) {} | |||||
| public void visitConstantClass(ConstantClass obj) { | |||||
| if (verbose) { | |||||
| System.out.println("visit ConstantClass"); | |||||
| System.out.println(obj.getConstantValue(constantPool)); | |||||
| } | |||||
| dependencies.add("" + obj.getConstantValue(constantPool)); | |||||
| } | |||||
| public void visitConstantDouble(ConstantDouble obj) {} | |||||
| public void visitConstantFieldref(ConstantFieldref obj) {} | |||||
| public void visitConstantFloat(ConstantFloat obj) {} | |||||
| public void visitConstantInteger(ConstantInteger obj) {} | |||||
| public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) {} | |||||
| public void visitConstantLong(ConstantLong obj) {} | |||||
| public void visitConstantMethodref(ConstantMethodref obj) {} | |||||
| public void visitConstantNameAndType(ConstantNameAndType obj) {} | |||||
| public void visitConstantPool(ConstantPool obj) { | |||||
| if (verbose) | |||||
| System.out.println("visit ConstantPool"); | |||||
| this.constantPool = obj; | |||||
| // visit constants | |||||
| for(int idx = 0; idx < constantPool.getLength(); idx++) { | |||||
| Constant c = constantPool.getConstant(idx); | |||||
| if (c != null) { | |||||
| c.accept(this); | |||||
| } | |||||
| } | |||||
| } | |||||
| public void visitConstantString(ConstantString obj) {} | |||||
| public void visitConstantUtf8(ConstantUtf8 obj) {} | |||||
| public void visitConstantValue(ConstantValue obj) {} | |||||
| public void visitDeprecated(Deprecated obj) {} | |||||
| public void visitExceptionTable(ExceptionTable obj) {} | |||||
| public void visitField(Field obj) { | |||||
| if (verbose) { | |||||
| System.out.println("visit Field"); | |||||
| System.out.println(obj.getSignature()); | |||||
| } | |||||
| addClasses(obj.getSignature()); | |||||
| } | |||||
| public void visitInnerClass(InnerClass obj) {} | |||||
| public void visitInnerClasses(InnerClasses obj) {} | |||||
| public void visitJavaClass(JavaClass obj) { | |||||
| if (verbose) { | |||||
| System.out.println("visit JavaClass"); | |||||
| } | |||||
| this.javaClass = obj; | |||||
| dependencies.add(javaClass.getClassName().replace('.', '/')); | |||||
| // visit constant pool | |||||
| javaClass.getConstantPool().accept(this); | |||||
| // visit fields | |||||
| Field[] fields = obj.getFields(); | |||||
| for(int i=0; i < fields.length; i++) { | |||||
| fields[i].accept(this); | |||||
| } | |||||
| // visit methods | |||||
| Method[] methods = obj.getMethods(); | |||||
| for(int i=0; i < methods.length; i++) { | |||||
| methods[i].accept(this); | |||||
| } | |||||
| } | |||||
| public void visitLineNumber(LineNumber obj) {} | |||||
| public void visitLineNumberTable(LineNumberTable obj) {} | |||||
| public void visitLocalVariable(LocalVariable obj) {} | |||||
| public void visitLocalVariableTable(LocalVariableTable obj) {} | |||||
| public void visitMethod(Method obj) { | |||||
| if (verbose) { | |||||
| System.out.println("visit Method"); | |||||
| System.out.println(obj.getSignature()); | |||||
| } | |||||
| String signature = obj.getSignature(); | |||||
| int pos = signature.indexOf(")"); | |||||
| addClasses(signature.substring(1, pos)); | |||||
| addClasses(signature.substring(pos + 1)); | |||||
| } | |||||
| public void visitSourceFile(SourceFile obj) {} | |||||
| public void visitSynthetic(Synthetic obj) {} | |||||
| public void visitUnknown(Unknown obj) {} | |||||
| public void visitStackMap(StackMap obj) {} | |||||
| public void visitStackMapEntry(StackMapEntry obj) {} | |||||
| void addClasses(String string) { | |||||
| StringTokenizer tokens = new StringTokenizer(string, ";"); | |||||
| while (tokens.hasMoreTokens()) { | |||||
| addClass(tokens.nextToken()); | |||||
| } | |||||
| } | |||||
| void addClass(String string) { | |||||
| int pos = string.indexOf('L'); | |||||
| if (pos != -1) { | |||||
| dependencies.add(string.substring(pos+1)); | |||||
| } | |||||
| } | |||||
| public static void main(String[] args) { | |||||
| try { | |||||
| Dependencies visitor = new Dependencies(); | |||||
| Set set = new TreeSet(); | |||||
| Set newSet = new HashSet(); | |||||
| int o=0; | |||||
| String arg = null; | |||||
| if ("-base".equals(args[0])) { | |||||
| arg = args[1]; | |||||
| if (!arg.endsWith(File.separator)) { | |||||
| arg = arg + File.separator; | |||||
| } | |||||
| o=2; | |||||
| } | |||||
| final String base = arg; | |||||
| for (int i=o; i < args.length; i++) { | |||||
| String fileName = args[i].substring(0, args[i].length() - ".class".length()); | |||||
| if (base != null && fileName.startsWith(base)) | |||||
| fileName = fileName.substring(base.length()); | |||||
| newSet.add(fileName); | |||||
| } | |||||
| set.addAll(newSet); | |||||
| do { | |||||
| Iterator i = newSet.iterator(); | |||||
| while (i.hasNext()) { | |||||
| String fileName = i.next() + ".class"; | |||||
| if (base != null) { | |||||
| fileName = base + fileName; | |||||
| } | |||||
| JavaClass javaClass = new ClassParser(fileName).parse(); | |||||
| javaClass.accept(visitor); | |||||
| } | |||||
| newSet.clear(); | |||||
| newSet.addAll(visitor.getDependencies()); | |||||
| visitor.clearDependencies(); | |||||
| applyFilter(newSet, new Filter() { | |||||
| public boolean accept(Object object) { | |||||
| String fileName = object + ".class"; | |||||
| if (base != null) | |||||
| fileName = base + fileName; | |||||
| return new File(fileName).exists(); | |||||
| } | |||||
| }); | |||||
| newSet.removeAll(set); | |||||
| set.addAll(newSet); | |||||
| } | |||||
| while (newSet.size() > 0); | |||||
| Iterator i = set.iterator(); | |||||
| while (i.hasNext()) { | |||||
| System.out.println(i.next()); | |||||
| } | |||||
| } | |||||
| catch (Exception e) { | |||||
| System.err.println(e.getMessage()); | |||||
| e.printStackTrace(System.err); | |||||
| } | |||||
| } | |||||
| public static void applyFilter(Collection collection, Filter filter) { | |||||
| Iterator i = collection.iterator(); | |||||
| while (i.hasNext()) { | |||||
| Object next = i.next(); | |||||
| if (!filter.accept(next)) { | |||||
| i.remove(); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,60 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.util.depend; | |||||
| import java.util.*; | |||||
| public interface Filter { | |||||
| boolean accept(Object object); | |||||
| } | |||||