Browse Source

Additional functionality for classfileset.

Change baseclass paramater to rootclass and make it use dot notation for
the classname rather than making it a file.

Also allow multiple nested <root> elements to define more than one root
class

Example:
  <classfileset dir="build/classes" id="classes">
    <root classname="org.apache.tools.ant.Main"/>
    <root classname="org.apache.tools.ant.taskdefs.optional.ejb.EjbJar"/>
  </classfileset>


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270045 13f79535-47bb-0310-9956-ffa450edef68
master
Conor MacNeill 23 years ago
parent
commit
4d83c345bd
2 changed files with 59 additions and 41 deletions
  1. +23
    -9
      src/main/org/apache/tools/ant/types/optional/depend/ClassfileSet.java
  2. +36
    -32
      src/main/org/apache/tools/ant/types/optional/depend/DependScanner.java

+ 23
- 9
src/main/org/apache/tools/ant/types/optional/depend/ClassfileSet.java View File

@@ -55,6 +55,8 @@ package org.apache.tools.ant.types.optional.depend;


import java.io.File; import java.io.File;
import java.util.Stack; import java.util.Stack;
import java.util.List;
import java.util.ArrayList;
import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project; import org.apache.tools.ant.Project;
@@ -72,16 +74,24 @@ import org.apache.tools.ant.util.depend.Dependencies;
* @author <a href="mailto:hengels@innovidata.com">Holger Engels</a> * @author <a href="mailto:hengels@innovidata.com">Holger Engels</a>
*/ */
public class ClassfileSet extends FileSet { public class ClassfileSet extends FileSet {
private File baseClass = null;
private List rootClasses = new ArrayList();


/**
* Set the directory for the fileset. Prevents both "dir" and "src"
* from being specified.
*/
public void setBaseClass(File baseClass)
static public class ClassRoot {
private String rootClass;
public void setClassname(String name) {
this.rootClass = name;
}
public String getClassname() {
return rootClass;
}
}
public void setRootClass(String rootClass)
throws BuildException throws BuildException
{ {
this.baseClass = baseClass;
rootClasses.add(rootClass);
} }


public void setDir(File dir) throws BuildException { public void setDir(File dir) throws BuildException {
@@ -95,8 +105,12 @@ public class ClassfileSet extends FileSet {
public DirectoryScanner getDirectoryScanner(Project p) { public DirectoryScanner getDirectoryScanner(Project p) {
DependScanner scanner = new DependScanner(); DependScanner scanner = new DependScanner();
scanner.setBasedir(getDir(p)); scanner.setBasedir(getDir(p));
scanner.setBaseClass(baseClass);
scanner.setRootClasses(rootClasses);
scanner.scan(); scanner.scan();
return scanner; return scanner;
}
}
public void addConfiguredRoot(ClassRoot root) {
rootClasses.add(root.getClassname());
}
} }

+ 36
- 32
src/main/org/apache/tools/ant/types/optional/depend/DependScanner.java View File

@@ -72,6 +72,8 @@ public class DependScanner extends DirectoryScanner {
File baseClass; File baseClass;
List included = new LinkedList(); List included = new LinkedList();


private List rootClasses;
/** /**
* Sets the basedir for scanning. This is the directory that is scanned * Sets the basedir for scanning. This is the directory that is scanned
* recursively. * recursively.
@@ -103,8 +105,8 @@ public class DependScanner extends DirectoryScanner {
* *
* @param domain the domain * @param domain the domain
*/ */
public void setBaseClass(File baseClass) {
this.baseClass = baseClass;
public void setRootClasses(List rootClasses) {
this.rootClasses = rootClasses;
} }


/** /**
@@ -129,52 +131,54 @@ public class DependScanner extends DirectoryScanner {
*/ */
public void scan() { public void scan() {
Dependencies visitor = new Dependencies(); Dependencies visitor = new Dependencies();
Set set = new TreeSet(); Set set = new TreeSet();
Set newSet = new HashSet();
final String base; final String base;
String start;
try { try {
base = basedir.getCanonicalPath() + File.separator; base = basedir.getCanonicalPath() + File.separator;
start = baseClass.getCanonicalPath();
} }
catch (Exception e) { catch (Exception e) {
throw new IllegalArgumentException(e.getMessage()); 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());
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() {
newSet.clear();
newSet.addAll(visitor.getDependencies());
visitor.clearDependencies();
Dependencies.applyFilter(newSet, new Filter() {
public boolean accept(Object object) { public boolean accept(Object object) {
String fileName = base + ((String)object).replace('/', File.separatorChar) + ".class"; String fileName = base + ((String)object).replace('/', File.separatorChar) + ".class";
return new File(fileName).exists(); return new File(fileName).exists();
} }
}); });
newSet.removeAll(set);
set.addAll(newSet);
newSet.removeAll(set);
set.addAll(newSet);
}
while (newSet.size() > 0);
} }
while (newSet.size() > 0);

included.clear(); included.clear();
included.addAll(set); included.addAll(set);
} }


Loading…
Cancel
Save