You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by st...@apache.org on 2004/10/08 12:46:36 UTC
cvs commit: ant/src/main/org/apache/tools/ant/taskdefs/compilers AptCompilerAdapter.java AptExternalCompilerAdapter.java
stevel 2004/10/08 03:46:36
Added: src/main/org/apache/tools/ant/taskdefs Apt.java
src/main/org/apache/tools/ant/taskdefs/compilers
AptCompilerAdapter.java
AptExternalCompilerAdapter.java
Log:
Wrapper for Apt tool in Java1.5, from bug ID 29978
Revision Changes Path
1.1 ant/src/main/org/apache/tools/ant/taskdefs/Apt.java
Index: Apt.java
===================================================================
/*
* 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();
}
}
1.1 ant/src/main/org/apache/tools/ant/taskdefs/compilers/AptCompilerAdapter.java
Index: AptCompilerAdapter.java
===================================================================
/*
* 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);
}
}
}
1.1 ant/src/main/org/apache/tools/ant/taskdefs/compilers/AptExternalCompilerAdapter.java
Index: AptExternalCompilerAdapter.java
===================================================================
/*
* 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);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org