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); | |||||
} |