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

网格计算

开发平台:

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.util;
  19. import java.lang.reflect.InvocationTargetException;
  20. import java.lang.reflect.Method;
  21. import java.util.Map;
  22. import java.util.TreeMap;
  23. /** A driver that is used to run programs added to it
  24.  */
  25. public class ProgramDriver {
  26.     
  27.   /**
  28.    * A description of a program based on its class and a 
  29.    * human-readable description.
  30.    * @date april 2006
  31.    */
  32.   Map<String, ProgramDescription> programs;
  33.      
  34.   public ProgramDriver(){
  35.     programs = new TreeMap<String, ProgramDescription>();
  36.   }
  37.      
  38.   static private class ProgramDescription {
  39.     static final Class<?>[] paramTypes = new Class<?>[] {String[].class};
  40.     /**
  41.      * Create a description of an example program.
  42.      * @param mainClass the class with the main for the example program
  43.      * @param description a string to display to the user in help messages
  44.      * @throws SecurityException if we can't use reflection
  45.      * @throws NoSuchMethodException if the class doesn't have a main method
  46.      */
  47.     public ProgramDescription(Class<?> mainClass, 
  48.                               String description)
  49.       throws SecurityException, NoSuchMethodException {
  50.       this.main = mainClass.getMethod("main", paramTypes);
  51.       this.description = description;
  52.     }
  53.     /**
  54.      * Invoke the example application with the given arguments
  55.      * @param args the arguments for the application
  56.      * @throws Throwable The exception thrown by the invoked method
  57.      */
  58.     public void invoke(String[] args)
  59.       throws Throwable {
  60.       try {
  61.         main.invoke(null, new Object[]{args});
  62.       } catch (InvocationTargetException except) {
  63.         throw except.getCause();
  64.       }
  65.     }
  66.     public String getDescription() {
  67.       return description;
  68.     }
  69.     private Method main;
  70.     private String description;
  71.   }
  72.     
  73.   private static void printUsage(Map<String, ProgramDescription> programs) {
  74.     System.out.println("Valid program names are:");
  75.     for(Map.Entry<String, ProgramDescription> item : programs.entrySet()) {
  76.       System.out.println("  " + item.getKey() + ": " +
  77.                          item.getValue().getDescription());         
  78.     } 
  79.   }
  80.     
  81.   /**
  82.    * This is the method that adds the classed to the repository
  83.    * @param name The name of the string you want the class instance to be called with
  84.    * @param mainClass The class that you want to add to the repository
  85.    * @param description The description of the class
  86.    * @throws NoSuchMethodException 
  87.    * @throws SecurityException 
  88.    */
  89.   public void addClass (String name, Class mainClass, String description) throws Throwable {
  90.     programs.put(name , new ProgramDescription(mainClass, description));
  91.   }
  92.     
  93.   /**
  94.    * This is a driver for the example programs.
  95.    * It looks at the first command line argument and tries to find an
  96.    * example program with that name.
  97.    * If it is found, it calls the main method in that class with the rest 
  98.    * of the command line arguments.
  99.    * @param args The argument from the user. args[0] is the command to run.
  100.    * @throws NoSuchMethodException 
  101.    * @throws SecurityException 
  102.    * @throws IllegalAccessException 
  103.    * @throws IllegalArgumentException 
  104.    * @throws Throwable Anything thrown by the example program's main
  105.    */
  106.   public void driver(String[] args) 
  107.     throws Throwable 
  108.   {
  109.     // Make sure they gave us a program name.
  110.     if (args.length == 0) {
  111.       System.out.println("An example program must be given as the" + 
  112.                          " first argument.");
  113.       printUsage(programs);
  114.       System.exit(-1);
  115.     }
  116.     // And that it is good.
  117.     ProgramDescription pgm = programs.get(args[0]);
  118.     if (pgm == null) {
  119.       System.out.println("Unknown program '" + args[0] + "' chosen.");
  120.       printUsage(programs);
  121.       System.exit(-1);
  122.     }
  123.     // Remove the leading argument and call main
  124.     String[] new_args = new String[args.length - 1];
  125.     for(int i=1; i < args.length; ++i) {
  126.       new_args[i-1] = args[i];
  127.     }
  128.     pgm.invoke(new_args);
  129.   }
  130.     
  131. }