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); | |||
} | |||
} | |||