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

网格计算

开发平台:

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.ant;
  19. import java.io.ByteArrayOutputStream;
  20. import java.io.OutputStream;
  21. import java.io.PrintStream;
  22. import java.util.LinkedList;
  23. import org.apache.hadoop.conf.Configuration;
  24. import org.apache.hadoop.fs.FsShell;
  25. import org.apache.tools.ant.AntClassLoader;
  26. import org.apache.tools.ant.BuildException;
  27. import org.apache.tools.ant.Task;
  28. import org.apache.tools.ant.Project;
  29. import org.apache.tools.ant.types.Path;
  30. import org.apache.hadoop.util.ToolRunner;
  31. /**
  32.  * {@link org.apache.hadoop.fs.FsShell FsShell} wrapper for ant Task.
  33.  */
  34. public class DfsTask extends Task {
  35.   /**
  36.    * Default sink for {@link java.lang.System.out System.out}
  37.    * and {@link java.lang.System.err System.err}.
  38.    */
  39.   private static final OutputStream nullOut = new OutputStream() {
  40.       public void write(int b)    { /* ignore */ }
  41.       public String toString()    { return ""; }
  42.   };
  43.   private static final FsShell shell = new FsShell();
  44.   protected AntClassLoader confloader;
  45.   protected OutputStream out = nullOut;
  46.   protected OutputStream err = nullOut;
  47.   // set by ant
  48.   protected String cmd;
  49.   protected final LinkedList<String> argv = new LinkedList<String>();
  50.   protected String outprop;
  51.   protected String errprop;
  52.   protected boolean failonerror = true;
  53.   // saved ant context
  54.   private PrintStream antOut;
  55.   private PrintStream antErr;
  56.   /**
  57.    * Sets the command to run in {@link org.apache.hadoop.fs.FsShell FsShell}.
  58.    * @param cmd A valid command to FsShell, sans &quot;-&quot;.
  59.    */
  60.   public void setCmd(String cmd) {
  61.     this.cmd = "-" + cmd.trim();
  62.   }
  63.   /**
  64.    * Sets the argument list from a String of comma-separated values.
  65.    * @param args A String of comma-separated arguments to FsShell.
  66.    */
  67.   public void setArgs(String args) {
  68.     for (String s : args.trim().split("\s*,\s*"))
  69.       argv.add(s);
  70.   }
  71.   /**
  72.    * Sets the property into which System.out will be written.
  73.    * @param outprop The name of the property into which System.out is written.
  74.    * If the property is defined before this task is executed, it will not be updated.
  75.    */
  76.   public void setOut(String outprop) {
  77.     this.outprop = outprop;
  78.     out = new ByteArrayOutputStream();
  79.     if (outprop.equals(errprop))
  80.       err = out;
  81.   }
  82.   /**
  83.    * Sets the property into which System.err will be written. If this property
  84.    * has the same name as the property for System.out, the two will be interlaced.
  85.    * @param errprop The name of the property into which System.err is written.
  86.    * If the property is defined before this task is executed, it will not be updated.
  87.    */
  88.   public void setErr(String errprop) {
  89.     this.errprop = errprop;
  90.     err = (errprop.equals(outprop)) ? err = out : new ByteArrayOutputStream();
  91.   }
  92.   /**
  93.    * Sets the path for the parent-last ClassLoader, intended to be used for
  94.    * {@link org.apache.hadoop.conf.Configuration Configuration}.
  95.    * @param confpath The path to search for resources, classes, etc. before
  96.    * parent ClassLoaders.
  97.    */
  98.   public void setConf(String confpath) {
  99.     confloader = new AntClassLoader(getClass().getClassLoader(), false);
  100.     confloader.setProject(getProject());
  101.     if (null != confpath)
  102.       confloader.addPathElement(confpath);
  103.   }
  104.   /**
  105.    * Sets a property controlling whether or not a
  106.    * {@link org.apache.tools.ant.BuildException BuildException} will be thrown
  107.    * if the command returns a value less than zero or throws an exception.
  108.    * @param failonerror If true, throw a BuildException on error.
  109.    */
  110.   public void setFailonerror(boolean failonerror) {
  111.     this.failonerror = failonerror;
  112.   }
  113.   /**
  114.    * Save the current values of System.out, System.err and configure output
  115.    * streams for FsShell.
  116.    */
  117.   protected void pushContext() {
  118.     antOut = System.out;
  119.     antErr = System.err;
  120.     System.setOut(new PrintStream(out));
  121.     System.setErr(out == err ? System.out : new PrintStream(err));
  122.   }
  123.   /**
  124.    * Create the appropriate output properties with their respective output,
  125.    * restore System.out, System.err and release any resources from created
  126.    * ClassLoaders to aid garbage collection.
  127.    */
  128.   protected void popContext() {
  129.     // write output to property, if applicable
  130.     if (outprop != null && !System.out.checkError())
  131.       getProject().setNewProperty(outprop, out.toString());
  132.     if (out != err && errprop != null && !System.err.checkError())
  133.       getProject().setNewProperty(errprop, err.toString());
  134.     System.setErr(antErr);
  135.     System.setOut(antOut);
  136.     confloader.cleanup();
  137.     confloader.setParent(null);
  138.   }
  139.   // in case DfsTask is overridden
  140.   protected int postCmd(int exit_code) {
  141.     if ("-test".equals(cmd) && exit_code != 0)
  142.       outprop = null;
  143.     return exit_code;
  144.   }
  145.   /**
  146.    * Invoke {@link org.apache.hadoop.fs.FsShell#doMain FsShell.doMain} after a
  147.    * few cursory checks of the configuration.
  148.    */
  149.   public void execute() throws BuildException {
  150.     if (null == cmd)
  151.       throw new BuildException("Missing command (cmd) argument");
  152.     argv.add(0, cmd);
  153.     if (null == confloader) {
  154.       setConf(getProject().getProperty("hadoop.conf.dir"));
  155.     }
  156.     int exit_code = 0;
  157.     try {
  158.       pushContext();
  159.       Configuration conf = new Configuration();
  160.       conf.setClassLoader(confloader);
  161.       exit_code = ToolRunner.run(conf, shell,
  162.           argv.toArray(new String[argv.size()]));
  163.       exit_code = postCmd(exit_code);
  164.       if (0 > exit_code) {
  165.         StringBuilder msg = new StringBuilder();
  166.         for (String s : argv)
  167.           msg.append(s + " ");
  168.         msg.append("failed: " + exit_code);
  169.         throw new Exception(msg.toString());
  170.       }
  171.     } catch (Exception e) {
  172.       if (failonerror)
  173.           throw new BuildException(e);
  174.     } finally {
  175.       popContext();
  176.     }
  177.   }
  178. }