/**
* Copyright © 2006-2016 Web Cohesion (info@webcohesion.com)
*
* 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 com.webcohesion.enunciate;
import com.webcohesion.enunciate.module.EnunciateModule;
import org.apache.tools.ant.AntClassLoader;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.filters.ExpandProperties;
import org.apache.tools.ant.taskdefs.MatchingTask;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Reference;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
/**
* Ant task for enunciate.
*
* @author Ryan Heaton
*/
public class EnunciateTask extends MatchingTask {
private boolean compileDebugInfo = true;
private String encoding;
private File configFile;
private File basedir;
private Path classpath;
private Path sourcepath;
private File buildDir;
private String javacSourceVersion = null;
private String javacTargetVersion = null;
private final ArrayList<Export> exports = new ArrayList<Export>();
private final ArrayList<JavacArgument> javacArguments = new ArrayList<JavacArgument>();
/**
* Executes the enunciate task.
*/
@Override
public void execute() throws BuildException {
if (basedir == null) {
throw new BuildException("A base directory must be specified.");
}
if (buildDir == null) {
throw new BuildException("A build directory must be specified.");
}
try {
Enunciate enunciate = new Enunciate();
//set up the logger.
enunciate.setLogger(new AntEnunciateLogger());
//set the build dir.
this.buildDir.mkdirs();
enunciate.setBuildDir(this.buildDir);
//add the source files.
DirectoryScanner scanner = getDirectoryScanner(basedir);
scanner.scan();
Set<File> sourceFiles = new TreeSet<File>();
for (String file : scanner.getIncludedFiles()) {
sourceFiles.add(new File(basedir, file));
}
enunciate.setSourceFiles(sourceFiles);
//load the config.
if (this.configFile != null && this.configFile.exists()) {
getProject().log("[ENUNCIATE] Using enunciate configuration at " + this.configFile.getAbsolutePath());
ExpandProperties reader = new ExpandProperties(new FileReader(this.configFile));
reader.setProject(getProject());
enunciate.loadConfiguration(reader);
enunciate.getConfiguration().setConfigFile(this.configFile);
}
if (classpath != null) {
String[] filenames = this.classpath.list();
List<File> cp = new ArrayList<File>(filenames.length);
for (String filename : filenames) {
File file = new File(filename);
if (file.exists()) {
cp.add(file);
}
}
enunciate.setClasspath(cp);
//set up the classloader for the Enunciate invocation.
AntClassLoader loader = new AntClassLoader(Enunciate.class.getClassLoader(), getProject(), this.classpath, true);
Thread.currentThread().setContextClassLoader(loader);
ServiceLoader<EnunciateModule> moduleLoader = ServiceLoader.load(EnunciateModule.class, loader);
for (EnunciateModule module : moduleLoader) {
enunciate.addModule(module);
}
}
if (sourcepath != null) {
String[] filenames = this.sourcepath.list();
List<File> cp = new ArrayList<File>(filenames.length);
for (String filename : filenames) {
File file = new File(filename);
if (file.exists()) {
cp.add(file);
}
}
enunciate.setSourcepath(cp);
}
List<String> compilerArgs = new ArrayList<String>();
String sourceVersion = this.javacSourceVersion;
if (sourceVersion != null) {
compilerArgs.add("-source");
compilerArgs.add(sourceVersion);
}
String targetVersion = this.javacTargetVersion;
if (targetVersion != null) {
compilerArgs.add("-target");
compilerArgs.add(targetVersion);
}
String sourceEncoding = this.encoding;
if (sourceEncoding != null) {
compilerArgs.add("-encoding");
compilerArgs.add(sourceEncoding);
}
enunciate.getCompilerArgs().addAll(compilerArgs);
for (JavacArgument javacArgument : this.javacArguments) {
enunciate.getCompilerArgs().add(javacArgument.getArgument());
}
for (Export export : exports) {
enunciate.addExport(export.getArtifactId(), export.getDestination());
}
enunciate.run();
}
catch (IOException e) {
throw new BuildException(e);
}
catch (EnunciateException e) {
throw new BuildException(e);
}
}
public void setEncoding(String encoding) {
this.encoding = encoding;
}
/**
* The base directory for the source files.
*
* @param basedir The base directory for the source files.
*/
public void setBasedir(File basedir) {
this.basedir = basedir;
}
/**
* The base directory for the source files.
*
* @param basedir The base directory for the source files.
*/
public void setDir(File basedir) {
setBasedir(basedir);
}
/**
* The build directory.
*
* @param buildDir The build directory.
*/
public void setBuildDir(File buildDir) {
this.buildDir = buildDir;
}
/**
* The enunciate config file.
*
* @param config The enunciate config file.
*/
public void setConfigFile(File config) {
this.configFile = config;
}
/**
* Whether to compile with debug info.
*
* @return Whether to compile with debug info.
*/
public boolean isCompileDebugInfo() {
return compileDebugInfo;
}
/**
* Whether to compile with debug info.
*
* @param compileDebugInfo Whether to compile with debug info.
*/
public void setCompileDebugInfo(boolean compileDebugInfo) {
this.compileDebugInfo = compileDebugInfo;
}
/**
* javac -source version parameter
*
* @param javacSourceVersion javac -source version parameter
*/
public void setJavacSourceVersion(String javacSourceVersion) {
this.javacSourceVersion = javacSourceVersion;
}
/**
* javac -target version parameter
*
* @param javacTargetVersion javac -target version parameter
*/
public void setJavacTargetVersion(String javacTargetVersion) {
this.javacTargetVersion = javacTargetVersion;
}
/**
* The classpath to use to enunciate.
*
* @param classpath The classpath to use to enunciate.
*/
public void setClasspath(Path classpath) {
if (this.classpath == null) {
this.classpath = classpath;
}
else {
this.classpath.append(classpath);
}
}
/**
* The classpath to use to enunciate.
*
* @return The classpath to use to enunciate.
*/
public Path getClasspath() {
return classpath;
}
/**
* Adds a path to the classpath.
*
* @return The path.
*/
public Path createClasspath() {
if (classpath == null) {
classpath = new Path(getProject());
}
return classpath.createPath();
}
/**
* Adds a reference to a classpath defined elsewhere.
*
* @param ref a reference to a classpath.
*/
public void setClasspathRef(Reference ref) {
createClasspath().setRefid(ref);
}
/**
* The sourcepath to use to enunciate.
*
* @param sourcepath The sourcepath to use to enunciate.
*/
public void setSourcepath(Path sourcepath) {
if (this.sourcepath == null) {
this.sourcepath = sourcepath;
}
else {
this.sourcepath.append(sourcepath);
}
}
/**
* The sourcepath to use to enunciate.
*
* @return The sourcepath to use to enunciate.
*/
public Path getSourcepath() {
return sourcepath;
}
/**
* Adds a path to the sourcepath.
*
* @return The path.
*/
public Path createSourcepath() {
if (sourcepath == null) {
sourcepath = new Path(getProject());
}
return sourcepath.createPath();
}
/**
* Adds a reference to a sourcepath defined elsewhere.
*
* @param ref a reference to a sourcepath.
*/
public void setSourcepathRef(Reference ref) {
createSourcepath().setRefid(ref);
}
/**
* Creates a nested export task.
*
* @return the nested export task.
*/
public Export createExport() {
Export export = new Export();
this.exports.add(export);
return export;
}
/**
* Creates a nested javac argument.
*
* @return the nested javac argument.
*/
public JavacArgument createJavacArgument() {
JavacArgument export = new JavacArgument();
this.javacArguments.add(export);
return export;
}
/**
* A nested export task.
*/
public static class Export {
private String artifactId;
private File destination;
/**
* The id of the artifact to export.
*
* @return The id of the artifact to export.
*/
public String getArtifactId() {
return artifactId;
}
/**
* The id of the artifact to export.
*
* @param artifactId The id of the artifact to export.
*/
public void setArtifactId(String artifactId) {
this.artifactId = artifactId;
}
/**
* The destination (file or directory) of the export.
*
* @return The destination (file or directory) of the export.
*/
public File getDestination() {
return destination;
}
/**
* The destination (file or directory) of the export.
*
* @param destination The destination (file or directory) of the export.
*/
public void setDestination(File destination) {
this.destination = destination;
}
}
/**
* A nested javac argument task.
*/
public static class JavacArgument {
private String argument;
/**
* The argument.
*
* @return The argument
*/
public String getArgument() {
return argument;
}
/**
* The argument.
*
* @param argument The javac argument.
*/
public void setArgument(String argument) {
this.argument = argument;
}
}
private class AntEnunciateLogger implements EnunciateLogger {
@Override
public void debug(String message, Object... formatArgs) {
getProject().log(String.format(message, formatArgs), Project.MSG_VERBOSE);
}
@Override
public void info(String message, Object... formatArgs) {
getProject().log(String.format(message, formatArgs), Project.MSG_INFO);
}
@Override
public void warn(String message, Object... formatArgs) {
getProject().log(String.format(message, formatArgs), Project.MSG_WARN);
}
@Override
public void error(String message, Object... formatArgs) {
getProject().log(String.format(message, formatArgs), Project.MSG_ERR);
}
}
}