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