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