| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.hadoop.record.compiler.ant; |
| |
| import java.io.File; |
| import java.util.ArrayList; |
| import org.apache.hadoop.record.compiler.generated.Rcc; |
| import org.apache.tools.ant.BuildException; |
| import org.apache.tools.ant.DirectoryScanner; |
| import org.apache.tools.ant.Project; |
| import org.apache.tools.ant.Task; |
| import org.apache.tools.ant.types.FileSet; |
| |
| /** |
| * Hadoop record compiler ant Task |
| *<p> This task takes the given record definition files and compiles them into |
| * java or c++ |
| * files. It is then up to the user to compile the generated files. |
| * |
| * <p> The task requires the <code>file</code> or the nested fileset element to be |
| * specified. Optional attributes are <code>language</code> (set the output |
| * language, default is "java"), |
| * <code>destdir</code> (name of the destination directory for generated java/c++ |
| * code, default is ".") and <code>failonerror</code> (specifies error handling |
| * behavior. default is true). |
| * <p><h4>Usage</h4> |
| * <pre> |
| * <recordcc |
| * destdir="${basedir}/gensrc" |
| * language="java"> |
| * <fileset include="**\/*.jr" /> |
| * </recordcc> |
| * </pre> |
| */ |
| public class RccTask extends Task { |
| |
| private String language = "java"; |
| private File src; |
| private File dest = new File("."); |
| private final ArrayList<FileSet> filesets = new ArrayList<FileSet>(); |
| private boolean failOnError = true; |
| |
| /** Creates a new instance of RccTask */ |
| public RccTask() { |
| } |
| |
| /** |
| * Sets the output language option |
| * @param language "java"/"c++" |
| */ |
| public void setLanguage(String language) { |
| this.language = language; |
| } |
| |
| /** |
| * Sets the record definition file attribute |
| * @param file record definition file |
| */ |
| public void setFile(File file) { |
| this.src = file; |
| } |
| |
| /** |
| * Given multiple files (via fileset), set the error handling behavior |
| * @param flag true will throw build exception in case of failure (default) |
| */ |
| public void setFailonerror(boolean flag) { |
| this.failOnError = flag; |
| } |
| |
| /** |
| * Sets directory where output files will be generated |
| * @param dir output directory |
| */ |
| public void setDestdir(File dir) { |
| this.dest = dir; |
| } |
| |
| /** |
| * Adds a fileset that can consist of one or more files |
| * @param set Set of record definition files |
| */ |
| public void addFileset(FileSet set) { |
| filesets.add(set); |
| } |
| |
| /** |
| * Invoke the Hadoop record compiler on each record definition file |
| */ |
| public void execute() throws BuildException { |
| if (src == null && filesets.size()==0) { |
| throw new BuildException("There must be a file attribute or a fileset child element"); |
| } |
| if (src != null) { |
| doCompile(src); |
| } |
| Project myProject = getProject(); |
| for (int i = 0; i < filesets.size(); i++) { |
| FileSet fs = filesets.get(i); |
| DirectoryScanner ds = fs.getDirectoryScanner(myProject); |
| File dir = fs.getDir(myProject); |
| String[] srcs = ds.getIncludedFiles(); |
| for (int j = 0; j < srcs.length; j++) { |
| doCompile(new File(dir, srcs[j])); |
| } |
| } |
| } |
| |
| private void doCompile(File file) throws BuildException { |
| String[] args = new String[5]; |
| args[0] = "--language"; |
| args[1] = this.language; |
| args[2] = "--destdir"; |
| args[3] = this.dest.getPath(); |
| args[4] = file.getPath(); |
| int retVal = Rcc.driver(args); |
| if (retVal != 0 && failOnError) { |
| throw new BuildException("Hadoop record compiler returned error code "+retVal); |
| } |
| } |
| } |