git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276934 13f79535-47bb-0310-9956-ffa450edef68master
@@ -0,0 +1,161 @@ | |||||
/* | |||||
* Copyright 2002-2004 The Apache Software Foundation | |||||
* | |||||
* 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.apache.tools.ant.taskdefs; | |||||
import org.apache.tools.ant.Project; | |||||
import org.apache.tools.ant.BuildException; | |||||
import org.apache.tools.ant.taskdefs.compilers.AptExternalCompilerAdapter; | |||||
import org.apache.tools.ant.taskdefs.compilers.AptCompilerAdapter; | |||||
import org.apache.tools.ant.types.Path; | |||||
import org.apache.tools.ant.types.Reference; | |||||
import org.apache.tools.ant.util.JavaEnvUtils; | |||||
import java.util.Vector; | |||||
import java.io.File; | |||||
/** | |||||
* Apt Task for running the Annotation processing tool for JDK 1.5. It derives | |||||
* from the existing Javac task, and forces the compiler based on whether we're | |||||
* executing internally, or externally. | |||||
* | |||||
* @since Ant 1.7 | |||||
*/ | |||||
public class Apt | |||||
extends Javac { | |||||
private boolean noCompile; | |||||
private String factory; | |||||
private Path factoryPath; | |||||
private Vector options; | |||||
private File preprocessDir; | |||||
public static final String EXECUTABLE_NAME = "apt"; | |||||
public static final String ERROR_IGNORING_COMPILER_OPTION = "Ignoring compiler attribute for the APT task, as it is fixed"; | |||||
public static final String ERROR_WRONG_JAVA_VERSION = "Apt task requires Java 1.5+"; | |||||
/** | |||||
* option element | |||||
*/ | |||||
public static final class Option { | |||||
private String name; | |||||
private String value; | |||||
public Option() { | |||||
} | |||||
public String getName() { | |||||
return name; | |||||
} | |||||
public void setName(String name) { | |||||
this.name = name; | |||||
} | |||||
public String getValue() { | |||||
return value; | |||||
} | |||||
public void setValue(String value) { | |||||
this.value = value; | |||||
} | |||||
} | |||||
public Apt() { | |||||
super(); | |||||
super.setCompiler(AptCompilerAdapter.class.getName()); | |||||
this.options = new Vector(); | |||||
} | |||||
public String getAptExecutable() { | |||||
return JavaEnvUtils.getJdkExecutable(EXECUTABLE_NAME); | |||||
} | |||||
public void setCompiler(String compiler) { | |||||
log(ERROR_IGNORING_COMPILER_OPTION, | |||||
Project.MSG_WARN); | |||||
} | |||||
public void setFork(boolean fork) { | |||||
if (fork) { | |||||
super.setCompiler(AptExternalCompilerAdapter.class.getName()); | |||||
} else { | |||||
super.setCompiler(AptCompilerAdapter.class.getName()); | |||||
} | |||||
} | |||||
public String getCompiler() { | |||||
return super.getCompiler(); | |||||
} | |||||
public boolean isNoCompile() { | |||||
return noCompile; | |||||
} | |||||
public void setNoCompile(boolean noCompile) { | |||||
this.noCompile = noCompile; | |||||
} | |||||
public String getFactory() { | |||||
return factory; | |||||
} | |||||
public void setFactory(String factory) { | |||||
this.factory = factory; | |||||
} | |||||
public void setFactoryPathRef(Reference ref) { | |||||
createFactoryPath().setRefid(ref); | |||||
} | |||||
public Path createFactoryPath() { | |||||
if (factoryPath == null) { | |||||
factoryPath = new Path(getProject()); | |||||
} | |||||
return factoryPath.createPath(); | |||||
} | |||||
public Path getFactoryPath() { | |||||
return factoryPath; | |||||
} | |||||
public Option createOption() { | |||||
Option opt = new Option(); | |||||
options.add(opt); | |||||
return opt; | |||||
} | |||||
public Vector getOptions() { | |||||
return options; | |||||
} | |||||
public File getPreprocessDir() { | |||||
return preprocessDir; | |||||
} | |||||
public void setPreprocessDir(File preprocessDir) { | |||||
this.preprocessDir = preprocessDir; | |||||
} | |||||
public void execute() | |||||
throws BuildException { | |||||
if (!JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_5)) { | |||||
throw new BuildException(ERROR_WRONG_JAVA_VERSION); | |||||
} | |||||
super.execute(); | |||||
} | |||||
} |
@@ -0,0 +1,125 @@ | |||||
/* | |||||
* Copyright 2001-2002,2004 The Apache Software Foundation | |||||
* | |||||
* 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.apache.tools.ant.taskdefs.compilers; | |||||
import org.apache.tools.ant.BuildException; | |||||
import org.apache.tools.ant.Project; | |||||
import org.apache.tools.ant.taskdefs.Apt; | |||||
import org.apache.tools.ant.types.Commandline; | |||||
import org.apache.tools.ant.types.Path; | |||||
import java.io.File; | |||||
import java.lang.reflect.Method; | |||||
import java.util.Enumeration; | |||||
import java.util.Vector; | |||||
/** | |||||
* The implementation of the apt compiler for JDK 1.5 | |||||
* | |||||
* @since Ant 1.7 | |||||
*/ | |||||
public class AptCompilerAdapter extends DefaultCompilerAdapter { | |||||
/** | |||||
* Integer returned by the "Modern" jdk1.3 compiler to indicate success. | |||||
*/ | |||||
private static final int APT_COMPILER_SUCCESS = 0; | |||||
public static final String APT_ENTRY_POINT = "com.sun.tools.apt.Main"; | |||||
public static final String APT_METHOD_NAME = "compile"; | |||||
protected Apt getApt() { | |||||
return (Apt) getJavac(); | |||||
} | |||||
static void setAptCommandlineSwitches(Apt apt, Commandline cmd) { | |||||
if (apt.isNoCompile()) { | |||||
cmd.createArgument().setValue("-nocompile"); | |||||
} | |||||
// Process the factory class | |||||
String factory = apt.getFactory(); | |||||
if (factory != null) { | |||||
cmd.createArgument().setValue("-factory"); | |||||
cmd.createArgument().setValue(factory); | |||||
} | |||||
// Process the factory path | |||||
Path factoryPath = apt.getFactoryPath(); | |||||
if (factoryPath != null) { | |||||
cmd.createArgument().setValue("-factorypath"); | |||||
cmd.createArgument().setPath(factoryPath); | |||||
} | |||||
File preprocessDir = apt.getPreprocessDir(); | |||||
if (preprocessDir != null) { | |||||
cmd.createArgument().setValue("-s"); | |||||
cmd.createArgument().setFile(preprocessDir); | |||||
} | |||||
// Process the processor options | |||||
Vector options = apt.getOptions(); | |||||
Enumeration elements = options.elements(); | |||||
Apt.Option opt; | |||||
StringBuffer arg = null; | |||||
while (elements.hasMoreElements()) { | |||||
opt = (Apt.Option) elements.nextElement(); | |||||
arg = new StringBuffer(); | |||||
arg.append("-A").append(opt.getName()); | |||||
if (opt.getValue() != null) { | |||||
arg.append("=").append(opt.getValue()); | |||||
} | |||||
cmd.createArgument().setValue(arg.toString()); | |||||
} | |||||
} | |||||
protected void setAptCommandlineSwitches(Commandline cmd) { | |||||
// Process the nocompile flag | |||||
Apt apt = getApt(); | |||||
setAptCommandlineSwitches(apt, cmd); | |||||
} | |||||
/** | |||||
* Run the compilation. | |||||
* | |||||
* @throws BuildException if the compilation has problems. | |||||
*/ | |||||
public boolean execute() throws BuildException { | |||||
attributes.log("Using apt compiler", Project.MSG_VERBOSE); | |||||
Commandline cmd = setupModernJavacCommand(); | |||||
setAptCommandlineSwitches(cmd); | |||||
// Use reflection to be able to build on all JDKs: | |||||
try { | |||||
Class c = Class.forName(APT_ENTRY_POINT); | |||||
Object compiler = c.newInstance(); | |||||
Method compile = c.getMethod(APT_METHOD_NAME, | |||||
new Class[]{(new String[]{}).getClass()}); | |||||
int result = ((Integer) compile.invoke | |||||
(compiler, new Object[]{cmd.getArguments()})) | |||||
.intValue(); | |||||
return (result == APT_COMPILER_SUCCESS); | |||||
} catch (BuildException be) { | |||||
throw be; | |||||
} catch (Exception ex) { | |||||
throw new BuildException("Error starting apt compiler", | |||||
ex, location); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,62 @@ | |||||
/* | |||||
* Copyright 2001-2004 The Apache Software Foundation | |||||
* | |||||
* 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.apache.tools.ant.taskdefs.compilers; | |||||
import org.apache.tools.ant.BuildException; | |||||
import org.apache.tools.ant.Project; | |||||
import org.apache.tools.ant.taskdefs.Apt; | |||||
import org.apache.tools.ant.types.Commandline; | |||||
/** | |||||
* The implementation of the apt compiler for JDK 1.5 using an external process | |||||
* | |||||
* @since Ant 1.7 | |||||
*/ | |||||
public class AptExternalCompilerAdapter extends DefaultCompilerAdapter { | |||||
protected Apt getApt() { | |||||
return (Apt) getJavac(); | |||||
} | |||||
/** | |||||
* Performs a compile using the Javac externally. | |||||
*/ | |||||
public boolean execute() throws BuildException { | |||||
attributes.log("Using external apt compiler", Project.MSG_VERBOSE); | |||||
// Setup the apt executable | |||||
Apt apt = getApt(); | |||||
Commandline cmd = new Commandline(); | |||||
cmd.setExecutable(apt.getAptExecutable()); | |||||
setupModernJavacCommandlineSwitches(cmd); | |||||
AptCompilerAdapter.setAptCommandlineSwitches(apt, cmd); | |||||
//add the files | |||||
logAndAddFilesToCompile(cmd); | |||||
//run | |||||
return 0==executeExternalCompile(cmd.getCommandline(), | |||||
cmd.size(), | |||||
true); | |||||
} | |||||
} | |||||