001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 package org.apache.hadoop.record.compiler.ant;
019
020 import java.io.File;
021 import java.util.ArrayList;
022
023 import org.apache.hadoop.classification.InterfaceAudience;
024 import org.apache.hadoop.classification.InterfaceStability;
025 import org.apache.hadoop.record.compiler.generated.Rcc;
026 import org.apache.tools.ant.BuildException;
027 import org.apache.tools.ant.DirectoryScanner;
028 import org.apache.tools.ant.Project;
029 import org.apache.tools.ant.Task;
030 import org.apache.tools.ant.types.FileSet;
031
032 /**
033 * Hadoop record compiler ant Task
034 *<p> This task takes the given record definition files and compiles them into
035 * java or c++
036 * files. It is then up to the user to compile the generated files.
037 *
038 * <p> The task requires the <code>file</code> or the nested fileset element to be
039 * specified. Optional attributes are <code>language</code> (set the output
040 * language, default is "java"),
041 * <code>destdir</code> (name of the destination directory for generated java/c++
042 * code, default is ".") and <code>failonerror</code> (specifies error handling
043 * behavior. default is true).
044 * <p><h4>Usage</h4>
045 * <pre>
046 * <recordcc
047 * destdir="${basedir}/gensrc"
048 * language="java">
049 * <fileset include="**\/*.jr" />
050 * </recordcc>
051 * </pre>
052 *
053 * @deprecated Replaced by <a href="http://hadoop.apache.org/avro/">Avro</a>.
054 */
055 @Deprecated
056 @InterfaceAudience.Public
057 @InterfaceStability.Stable
058 public class RccTask extends Task {
059
060 private String language = "java";
061 private File src;
062 private File dest = new File(".");
063 private final ArrayList<FileSet> filesets = new ArrayList<FileSet>();
064 private boolean failOnError = true;
065
066 /** Creates a new instance of RccTask */
067 public RccTask() {
068 }
069
070 /**
071 * Sets the output language option
072 * @param language "java"/"c++"
073 */
074 public void setLanguage(String language) {
075 this.language = language;
076 }
077
078 /**
079 * Sets the record definition file attribute
080 * @param file record definition file
081 */
082 public void setFile(File file) {
083 this.src = file;
084 }
085
086 /**
087 * Given multiple files (via fileset), set the error handling behavior
088 * @param flag true will throw build exception in case of failure (default)
089 */
090 public void setFailonerror(boolean flag) {
091 this.failOnError = flag;
092 }
093
094 /**
095 * Sets directory where output files will be generated
096 * @param dir output directory
097 */
098 public void setDestdir(File dir) {
099 this.dest = dir;
100 }
101
102 /**
103 * Adds a fileset that can consist of one or more files
104 * @param set Set of record definition files
105 */
106 public void addFileset(FileSet set) {
107 filesets.add(set);
108 }
109
110 /**
111 * Invoke the Hadoop record compiler on each record definition file
112 */
113 @Override
114 public void execute() throws BuildException {
115 if (src == null && filesets.size()==0) {
116 throw new BuildException("There must be a file attribute or a fileset child element");
117 }
118 if (src != null) {
119 doCompile(src);
120 }
121 Project myProject = getProject();
122 for (int i = 0; i < filesets.size(); i++) {
123 FileSet fs = filesets.get(i);
124 DirectoryScanner ds = fs.getDirectoryScanner(myProject);
125 File dir = fs.getDir(myProject);
126 String[] srcs = ds.getIncludedFiles();
127 for (int j = 0; j < srcs.length; j++) {
128 doCompile(new File(dir, srcs[j]));
129 }
130 }
131 }
132
133 private void doCompile(File file) throws BuildException {
134 String[] args = new String[5];
135 args[0] = "--language";
136 args[1] = this.language;
137 args[2] = "--destdir";
138 args[3] = this.dest.getPath();
139 args[4] = file.getPath();
140 int retVal = Rcc.driver(args);
141 if (retVal != 0 && failOnError) {
142 throw new BuildException("Hadoop record compiler returned error code "+retVal);
143 }
144 }
145 }