/*
* Copyright 2005 Edward Kuns
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.castor.xmlctf.compiler;
import java.io.File;
import java.util.HashSet;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Javac;
import org.apache.tools.ant.types.Path;
import org.castor.xmlctf.XMLTestCase;
import org.castor.xmlctf.util.FileServices;
/**
* Compiles a directory tree, recursively. This class is built around the use of
* the ANT JAVAC task.
*/
public class AntJavaCompiler implements Compiler {
/** A Set of directories to ignore. */
private static final HashSet IGNORE_DIRS = new HashSet();
static {
IGNORE_DIRS.add(FileServices.CVS);
IGNORE_DIRS.add(FileServices.SVN);
IGNORE_DIRS.add("org");
IGNORE_DIRS.add("com");
IGNORE_DIRS.add("net");
}
private final File _baseDirectory;
private final File _outputDirectory;
private String _javaVersion = null;
private Javac _compiler;
/**
* Creates a compiler for a given directory.
*
* @param baseDirectory The directory that holds the files to be compiled.
*/
public AntJavaCompiler(final File baseDirectory) {
if (baseDirectory == null) {
throw new IllegalArgumentException("'baseDirectory' must not be null.");
}
_baseDirectory = baseDirectory;
_outputDirectory = baseDirectory;
}
/**
* Sets the Java source version the current test will be using.
* @param javaSourceVersion The Java Source version to be used.
*/
public void setJavaSourceVersion(final float javaSourceVersion) {
float srcVersion = javaSourceVersion;
if (javaSourceVersion >= 5F && javaSourceVersion < 10F) {
srcVersion = 1.0F + (javaSourceVersion / 10F);
}
_javaVersion = "" + srcVersion;
}
/**
* Compiles the content of a directory. Throws a <code>CompilationException</code>
* if the build fails.
*/
public void compileDirectory() {
_compiler = makeCompiler(_baseDirectory, _outputDirectory);
compileDirectory(_baseDirectory, _outputDirectory);
}
/**
* Creates and returns a Ant Javac compiler.
* @param srcDir Source directory for compiation.
* @param destDir Destination directory for compilation.
*
* @return Ant Javac compiler
*/
private Javac makeCompiler(final File srcDir, final File destDir) {
Project project = new Project();
project.init();
project.setBasedir(srcDir.getAbsolutePath());
Javac compiler = new Javac();
compiler.setProject(project);
compiler.setDestdir(destDir.getAbsoluteFile());
compiler.setOptimize(false);
compiler.setDebug(true);
compiler.setDebugLevel("lines,vars,source");
compiler.setIncludejavaruntime(true);
if (XMLTestCase._verbose) {
compiler.setListfiles(true);
compiler.setVerbose(true);
} else {
compiler.setNowarn(true);
}
if (_javaVersion != null) {
compiler.setSource(_javaVersion);
}
Path classpath = compiler.createClasspath();
classpath.setPath(System.getProperty("java.class.path"));
classpath.add(new Path(project, destDir.getAbsolutePath()));
compiler.setClasspath(classpath);
return compiler;
}
/**
* Compiles a directory tree. Throws a <code>CompilationException</code> if build
* fails.
*
* @param srcDir Source directory holding the files to be compiled.
* @param destDir Destination directory to put the compiled classes in.
*/
private void compileDirectory(final File srcDir, final File destDir) {
File[] entries = srcDir.listFiles();
for (int i = 0; i < entries.length; i++) {
File entry = entries[i];
if (entry.isDirectory() && !IGNORE_DIRS.contains(entry.getName())) {
compileDirectory(entry, destDir);
}
}
entries = null;
try {
Path srcPath = _compiler.createSrc();
srcPath.setLocation(destDir);
_compiler.setSrcdir(srcPath);
_compiler.execute();
} catch (BuildException ex) {
throw new CompilationException("Problem compiling directory " + srcDir, ex);
}
}
}