git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270529 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -1,204 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.tools.ant.types.optional.depend; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import java.util.HashSet; | |||
| import java.util.Iterator; | |||
| import java.util.LinkedList; | |||
| import java.util.List; | |||
| import java.util.Set; | |||
| import java.util.TreeSet; | |||
| import org.apache.bcel.*; | |||
| import org.apache.bcel.classfile.*; | |||
| import org.apache.tools.ant.DirectoryScanner; | |||
| import org.apache.tools.ant.util.depend.Dependencies; | |||
| import org.apache.tools.ant.util.depend.Filter; | |||
| /** | |||
| * An interface used to describe the actions required by any type of directory | |||
| * scanner. | |||
| */ | |||
| public class DependScanner | |||
| extends DirectoryScanner | |||
| { | |||
| List included = new LinkedList(); | |||
| File baseClass; | |||
| File basedir; | |||
| private List rootClasses; | |||
| /** | |||
| * 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; | |||
| } | |||
| public void setCaseSensitive( boolean isCaseSensitive ) | |||
| { | |||
| } | |||
| public void setExcludes( String[] excludes ) | |||
| { | |||
| } | |||
| public void setIncludes( String[] includes ) | |||
| { | |||
| } | |||
| /** | |||
| * Sets the domain, where dependant classes are searched | |||
| * | |||
| * @param rootClasses The new RootClasses value | |||
| */ | |||
| public void setRootClasses( List rootClasses ) | |||
| { | |||
| this.rootClasses = rootClasses; | |||
| } | |||
| /** | |||
| * Gets the basedir that is used for scanning. | |||
| * | |||
| * @return the basedir that is used for scanning | |||
| */ | |||
| public File getBasedir() | |||
| { | |||
| return basedir; | |||
| } | |||
| public String[] getExcludedDirectories() | |||
| { | |||
| return null; | |||
| } | |||
| public String[] getExcludedFiles() | |||
| { | |||
| return null; | |||
| } | |||
| public String[] getIncludedDirectories() | |||
| { | |||
| return new String[ 0 ]; | |||
| } | |||
| /** | |||
| * 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; | |||
| } | |||
| public String[] getNotIncludedDirectories() | |||
| { | |||
| return null; | |||
| } | |||
| public String[] getNotIncludedFiles() | |||
| { | |||
| return null; | |||
| } | |||
| public void addDefaultExcludes() | |||
| { | |||
| } | |||
| /** | |||
| * Scans the base directory for files that baseClass depends on | |||
| * | |||
| */ | |||
| public void scan() | |||
| { | |||
| Dependencies visitor = new Dependencies(); | |||
| Set set = new TreeSet(); | |||
| final String base; | |||
| try | |||
| { | |||
| base = basedir.getCanonicalPath() + File.separator; | |||
| } | |||
| catch( Exception e ) | |||
| { | |||
| throw new IllegalArgumentException( e.getMessage() ); | |||
| } | |||
| for( Iterator rootClassIterator = rootClasses.iterator(); rootClassIterator.hasNext(); ) | |||
| { | |||
| Set newSet = new HashSet(); | |||
| String start = (String)rootClassIterator.next(); | |||
| start = start.replace( '.', '/' ); | |||
| 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 ); | |||
| } | |||
| } | |||
| @@ -1,204 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.tools.ant.types.optional.depend; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import java.util.HashSet; | |||
| import java.util.Iterator; | |||
| import java.util.LinkedList; | |||
| import java.util.List; | |||
| import java.util.Set; | |||
| import java.util.TreeSet; | |||
| import org.apache.bcel.*; | |||
| import org.apache.bcel.classfile.*; | |||
| import org.apache.tools.ant.DirectoryScanner; | |||
| import org.apache.tools.ant.util.depend.Dependencies; | |||
| import org.apache.tools.ant.util.depend.Filter; | |||
| /** | |||
| * An interface used to describe the actions required by any type of directory | |||
| * scanner. | |||
| */ | |||
| public class DependScanner | |||
| extends DirectoryScanner | |||
| { | |||
| List included = new LinkedList(); | |||
| File baseClass; | |||
| File basedir; | |||
| private List rootClasses; | |||
| /** | |||
| * 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; | |||
| } | |||
| public void setCaseSensitive( boolean isCaseSensitive ) | |||
| { | |||
| } | |||
| public void setExcludes( String[] excludes ) | |||
| { | |||
| } | |||
| public void setIncludes( String[] includes ) | |||
| { | |||
| } | |||
| /** | |||
| * Sets the domain, where dependant classes are searched | |||
| * | |||
| * @param rootClasses The new RootClasses value | |||
| */ | |||
| public void setRootClasses( List rootClasses ) | |||
| { | |||
| this.rootClasses = rootClasses; | |||
| } | |||
| /** | |||
| * Gets the basedir that is used for scanning. | |||
| * | |||
| * @return the basedir that is used for scanning | |||
| */ | |||
| public File getBasedir() | |||
| { | |||
| return basedir; | |||
| } | |||
| public String[] getExcludedDirectories() | |||
| { | |||
| return null; | |||
| } | |||
| public String[] getExcludedFiles() | |||
| { | |||
| return null; | |||
| } | |||
| public String[] getIncludedDirectories() | |||
| { | |||
| return new String[ 0 ]; | |||
| } | |||
| /** | |||
| * 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; | |||
| } | |||
| public String[] getNotIncludedDirectories() | |||
| { | |||
| return null; | |||
| } | |||
| public String[] getNotIncludedFiles() | |||
| { | |||
| return null; | |||
| } | |||
| public void addDefaultExcludes() | |||
| { | |||
| } | |||
| /** | |||
| * Scans the base directory for files that baseClass depends on | |||
| * | |||
| */ | |||
| public void scan() | |||
| { | |||
| Dependencies visitor = new Dependencies(); | |||
| Set set = new TreeSet(); | |||
| final String base; | |||
| try | |||
| { | |||
| base = basedir.getCanonicalPath() + File.separator; | |||
| } | |||
| catch( Exception e ) | |||
| { | |||
| throw new IllegalArgumentException( e.getMessage() ); | |||
| } | |||
| for( Iterator rootClassIterator = rootClasses.iterator(); rootClassIterator.hasNext(); ) | |||
| { | |||
| Set newSet = new HashSet(); | |||
| String start = (String)rootClassIterator.next(); | |||
| start = start.replace( '.', '/' ); | |||
| 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 ); | |||
| } | |||
| } | |||