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