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="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"/> | |||
| @@ -176,6 +178,9 @@ | |||
| <available property="xerces.present" | |||
| classname="org.apache.xerces.parsers.SAXParser" | |||
| classpathref="classpath" /> | |||
| <available property="bcel.present" | |||
| classname="de.fub.bytecode.Constants" | |||
| classpathref="classpath" /> | |||
| <condition property="javamail.complete"> | |||
| <and> | |||
| @@ -284,6 +289,10 @@ | |||
| <exclude name="${optional.package}/metamata/**" unless="jdk1.2+" /> | |||
| <exclude name="${optional.package}/ManifestFile.java" | |||
| unless="jdk1.2+" /> | |||
| <exclude name="${optional.type.package}/depend/*.java" | |||
| unless="bcel.present" /> | |||
| <exclude name="${util.package}/depend/*.java" | |||
| unless="bcel.present" /> | |||
| </javac> | |||
| <copy todir="${build.classes}"> | |||
| @@ -5,4 +5,5 @@ patternset=org.apache.tools.ant.types.PatternSet | |||
| mapper=org.apache.tools.ant.types.Mapper | |||
| filterset=org.apache.tools.ant.types.FilterSet | |||
| 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); | |||
| } | |||