@@ -88,13 +88,26 @@ import java.util.*;
public class Javac extends MatchingTask {
public class SourcePathElement {
private String path;
public void setPath(String path) {
this.path = path;
}
public String getPath() {
return path;
}
};
/**
* Integer returned by the "Modern" jdk1.3 compiler to indicate success.
*/
private static final int
MODERN_COMPILER_SUCCESS = 0;
private File srcDir;
private Vector srcPathElements = new Vector();
private Vector srcDirs= new Vector();
private File destDir;
private String compileClasspath;
private boolean debug = false;
@@ -109,10 +122,48 @@ public class Javac extends MatchingTask {
protected Hashtable filecopyList = new Hashtable();
/**
* Set the source dir to find the source Java files.
* Create a nested <src ...> element for multiple source path
* support.
*
* @return a nexted src element.
*/
public SourcePathElement createSrc() {
SourcePathElement element = new SourcePathElement();
srcPathElements.addElement(element);
return element;
}
/**
* Add a single directory to the collection of directories that
* make up the source path.
*
* @param srcDirName the name of the directory to add to the list of source directories.
*/
private void addSrcDir(String srcDirName) {
srcDirs.addElement(project.resolveFile(srcDirName));
}
/**
* Add a set of source directories specified as path.
*
* @param srcPath the list of source directories.
*/
private void addSrcPath(String srcPath) {
// use a Path tokenizer to find the paths and add them to
// the vector of source paths.
PathTokenizer tokenizer = new PathTokenizer(srcPath);
while (tokenizer.hasMoreTokens()) {
addSrcDir(tokenizer.nextToken());
}
}
/**
* Set the source dirs to find the source Java files.
*/
public void setSrcdir(String srcDirName) {
srcDir = project.resolveFile(srcDirName);
public void setSrcdir(String srcPath) {
// clean out the list of source dirs
srcDirs = new Vector();
addSrcPath(srcPath);
}
/**
@@ -188,24 +239,38 @@ public class Javac extends MatchingTask {
public void execute() throws BuildException {
// first off, make sure that we've got a srcdir and destdir
if (srcDir == null) {
// process the source elements into the srcDirs collection
for (Enumeration e = srcPathElements.elements(); e.hasMoreElements(); ) {
SourcePathElement element = (SourcePathElement)e.nextElement();
addSrcPath(element.getPath());
}
if (srcDirs.size() == 0) {
throw new BuildException("srcdir attribute must be set!");
}
if (!srcDir.exists()) {
throw new BuildException("srcdir does not exist!");
for (Enumeration e = srcDirs.elements(); e.hasMoreElements(); ) {
File srcDir = (File)e.nextElement();
if (!srcDir.exists()) {
throw new BuildException("srcdir " + srcDir.getPath() + " does not exist!");
}
}
if (destDir == null) {
throw new BuildException("destdir attribute must be set!");
}
// scan source and dest dirs to build up both copy lists and
// scan source directories and dest directory to build up both copy lists and
// compile lists
resetFileLists();
for (Enumeration e = srcDirs.elements(); e.hasMoreElements(); ) {
File srcDir = (File)e.nextElement();
DirectoryScanner ds = this.getDirectoryScanner(srcDir);
DirectoryScanner ds = this.getDirectoryScanner(srcDir);
String[] files = ds.getIncludedFiles();
String[] files = ds.getIncludedFiles();
scanDir(srcDir, destDir, files);
scanDir(srcDir, destDir, files);
}
// compile the source files
@@ -258,6 +323,14 @@ public class Javac extends MatchingTask {
}
}
/**
* Clear the list of files to be compiled and copied..
*/
protected void resetFileLists() {
compileList.removeAllElements();
filecopyList.clear();
}
/**
* Scans the directory looking for source files to be compiled and
* support files to be copied. The results are returned in the
@@ -266,9 +339,6 @@ public class Javac extends MatchingTask {
protected void scanDir(File srcDir, File destDir, String files[]) {
compileList.removeAllElements();
filecopyList.clear();
long now = (new Date()).getTime();
for (int i = 0; i < files.length; i++) {
@@ -372,6 +442,25 @@ public class Javac extends MatchingTask {
}
/**
* Get the list of source directories separated by a platform specific
* path separator.
*
* @return the current source directories in a single path separated using the
* platform specific path separator.
*/
private String getSourcePath() {
String sourcePath = "";
for (Enumeration e = srcDirs.elements(); e.hasMoreElements(); ) {
File srcDir = (File)e.nextElement();
if (sourcePath.length() != 0) {
sourcePath += File.pathSeparator;
}
sourcePath += srcDir.getAbsolutePath();
}
return sourcePath;
}
/**
* Peforms a copmile using the classic compiler that shipped with
* JDK 1.1 and 1.2.
@@ -391,11 +480,11 @@ public class Javac extends MatchingTask {
// Just add "sourcepath" to classpath ( for JDK1.1 )
if (Project.getJavaVersion().startsWith("1.1")) {
argList.addElement(classpath + File.pathSeparator +
srcDir.getAbsolut ePath());
getSourc ePath());
} else {
argList.addElement(classpath);
argList.addElement("-sourcepath");
argList.addElement(srcDir.getAbsolut ePath());
argList.addElement(getSourc ePath());
if (target != null) {
argList.addElement("-target");
argList.addElement(target);
@@ -471,7 +560,7 @@ public class Javac extends MatchingTask {
argList.addElement("-classpath");
argList.addElement(classpath);
argList.addElement("-sourcepath");
argList.addElement(srcDir.getAbsolut ePath());
argList.addElement(getSourc ePath());
if (target != null) {
argList.addElement("-target");
argList.addElement(target);
@@ -566,7 +655,7 @@ public class Javac extends MatchingTask {
// Jikes has no option for source-path so we
// will add it to classpath.
classpath.append(File.pathSeparator);
classpath.append(srcDir.getAbsolut ePath());
classpath.append(getSourc ePath());
Vector argList = new Vector();