RccTask.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:4k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.record.compiler.ant;
  19. import java.io.File;
  20. import java.util.ArrayList;
  21. import org.apache.hadoop.record.compiler.generated.Rcc;
  22. import org.apache.tools.ant.BuildException;
  23. import org.apache.tools.ant.DirectoryScanner;
  24. import org.apache.tools.ant.Project;
  25. import org.apache.tools.ant.Task;
  26. import org.apache.tools.ant.types.FileSet;
  27. /**
  28.  * Hadoop record compiler ant Task
  29.  *<p> This task takes the given record definition files and compiles them into
  30.  * java or c++
  31.  * files. It is then up to the user to compile the generated files.
  32.  *
  33.  * <p> The task requires the <code>file</code> or the nested fileset element to be
  34.  * specified. Optional attributes are <code>language</code> (set the output
  35.  * language, default is "java"),
  36.  * <code>destdir</code> (name of the destination directory for generated java/c++
  37.  * code, default is ".") and <code>failonerror</code> (specifies error handling
  38.  * behavior. default is true).
  39.  * <p><h4>Usage</h4>
  40.  * <pre>
  41.  * &lt;recordcc
  42.  *       destdir="${basedir}/gensrc"
  43.  *       language="java"&gt;
  44.  *   &lt;fileset include="**/*.jr" /&gt;
  45.  * &lt;/recordcc&gt;
  46.  * </pre>
  47.  */
  48. public class RccTask extends Task {
  49.   
  50.   private String language = "java";
  51.   private File src;
  52.   private File dest = new File(".");
  53.   private final ArrayList<FileSet> filesets = new ArrayList<FileSet>();
  54.   private boolean failOnError = true;
  55.   
  56.   /** Creates a new instance of RccTask */
  57.   public RccTask() {
  58.   }
  59.   
  60.   /**
  61.    * Sets the output language option
  62.    * @param language "java"/"c++"
  63.    */
  64.   public void setLanguage(String language) {
  65.     this.language = language;
  66.   }
  67.   
  68.   /**
  69.    * Sets the record definition file attribute
  70.    * @param file record definition file
  71.    */
  72.   public void setFile(File file) {
  73.     this.src = file;
  74.   }
  75.   
  76.   /**
  77.    * Given multiple files (via fileset), set the error handling behavior
  78.    * @param flag true will throw build exception in case of failure (default)
  79.    */
  80.   public void setFailonerror(boolean flag) {
  81.     this.failOnError = flag;
  82.   }
  83.   
  84.   /**
  85.    * Sets directory where output files will be generated
  86.    * @param dir output directory
  87.    */
  88.   public void setDestdir(File dir) {
  89.     this.dest = dir;
  90.   }
  91.   
  92.   /**
  93.    * Adds a fileset that can consist of one or more files
  94.    * @param set Set of record definition files
  95.    */
  96.   public void addFileset(FileSet set) {
  97.     filesets.add(set);
  98.   }
  99.   
  100.   /**
  101.    * Invoke the Hadoop record compiler on each record definition file
  102.    */
  103.   public void execute() throws BuildException {
  104.     if (src == null && filesets.size()==0) {
  105.       throw new BuildException("There must be a file attribute or a fileset child element");
  106.     }
  107.     if (src != null) {
  108.       doCompile(src);
  109.     }
  110.     Project myProject = getProject();
  111.     for (int i = 0; i < filesets.size(); i++) {
  112.       FileSet fs = filesets.get(i);
  113.       DirectoryScanner ds = fs.getDirectoryScanner(myProject);
  114.       File dir = fs.getDir(myProject);
  115.       String[] srcs = ds.getIncludedFiles();
  116.       for (int j = 0; j < srcs.length; j++) {
  117.         doCompile(new File(dir, srcs[j]));
  118.       }
  119.     }
  120.   }
  121.   
  122.   private void doCompile(File file) throws BuildException {
  123.     String[] args = new String[5];
  124.     args[0] = "--language";
  125.     args[1] = this.language;
  126.     args[2] = "--destdir";
  127.     args[3] = this.dest.getPath();
  128.     args[4] = file.getPath();
  129.     int retVal = Rcc.driver(args);
  130.     if (retVal != 0 && failOnError) {
  131.       throw new BuildException("Hadoop record compiler returned error code "+retVal);
  132.     }
  133.   }
  134. }