/**
 * 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.hcatalog.utils;

import org.apache.hadoop.util.ProgramDriver;

/**
 * A description of an example program based on its class and a 
 * human-readable description.
 */
public class HCatTestDriver {
  
  public static void main(String argv[]){
    int exitCode = -1;
    ProgramDriver pgd = new ProgramDriver();
    try {
      pgd.addClass("typedatacheck", TypeDataCheck.class, 
                   "A map/reduce program that checks the type of each field and" +
                   " outputs the entire table (to test hcat).");
      pgd.addClass("sumnumbers", SumNumbers.class, 
      "A map/reduce program that performs a group by on the first column and a " +
      "SUM operation on the other columns of the \"numbers\" table.");
      pgd.addClass("storenumbers", StoreNumbers.class, "A map/reduce program that " +
      		"reads from the \"numbers\" table and adds 10 to each fields and writes " +
      				"to the \"numbers_partitioned\" table into the datestamp=20100101 " +
      				"partition OR the \"numbers_empty_initially\" table based on a " +
      				"cmdline arg");
      pgd.addClass("storecomplex", StoreComplex.class, "A map/reduce program that " +
              "reads from the \"complex\" table and stores as-is into the " +
              "\"complex_empty_initially\" table.");
      pgd.addClass("storedemo", StoreDemo.class, "demo prog.");
      pgd.driver(argv);
      
      // Success
      exitCode = 0;
    }
    catch(Throwable e){
      e.printStackTrace();
    }
    
    System.exit(exitCode);
  }
}
	
