View Javadoc

1   package org.lsst.ccs.bootstrap;
2   
3   import java.lang.reflect.InvocationTargetException;
4   import java.lang.reflect.Method;
5   import java.util.ArrayList;
6   import java.util.List;
7   import java.util.Properties;
8   import java.util.StringTokenizer;
9   import org.apache.commons.cli.BasicParser;
10  import org.apache.commons.cli.CommandLine;
11  import org.apache.commons.cli.CommandLineParser;
12  import org.apache.commons.cli.HelpFormatter;
13  import org.apache.commons.cli.Option;
14  import org.apache.commons.cli.Options;
15  
16  class BoostrapAlternativeMain {
17  
18      
19      private static List<String> availableClassesList = new ArrayList<>();
20      private static String helpName;
21      private static Options cmdOptions;
22      
23      BoostrapAlternativeMain() {
24      }
25  
26  
27      
28      
29      public static void main(String[] args) throws Exception {
30  
31          // define the command line options
32          cmdOptions = new Options();
33          // The help option
34          cmdOptions.addOption("h", Bootstrap.HELP_OPTION, false, "Print the help message");
35          // The usb class to be launched
36          cmdOptions.addOption("mc", "mainClass", true,
37                  "The fully qualified name of the MAIN_CLASS to be invoked.");
38          cmdOptions.getOption("mainClass").setArgName("MAIN_CLASS");
39  
40  
41          CommandLineParser parser = new BasicParser();
42          CommandLine line = parser.parse(cmdOptions, args, true);
43  
44          Properties applicationProperties = Bootstrap.getBootstrapApplicationProperties();
45          helpName = applicationProperties.getProperty("org.lsst.ccs.bootstrap.altmain.program.name", "CCSBootstrapAlternativeMain");
46          String availableClasses = applicationProperties.getProperty("org.lsst.ccs.bootstrap.altmain.classes");
47          if (availableClasses != null) {
48              StringTokenizer st = new StringTokenizer(availableClasses, ",");
49              while (st.hasMoreTokens()) {
50                  availableClassesList.add(st.nextToken().trim());
51              }
52          }
53  
54  
55          if (line.hasOption(Bootstrap.HELP_OPTION)) {
56              printHelp();
57          } else {
58              String mainClass = line.getOptionValue("mainClass");
59  
60              try {
61                  int index = Integer.parseInt(mainClass);
62                  mainClass = availableClassesList.get(index);
63              } catch (Exception e) {
64                  for (String availableClass : availableClassesList) {
65                      if (availableClass.equals(mainClass)) {
66                          break;
67                      }
68                      String className = availableClass.substring(availableClass.lastIndexOf(".") + 1);
69                      if (className.equals(mainClass)) {
70                          mainClass = availableClass;
71                          break;
72                      }
73                  }
74              }
75  
76              if (mainClass != null) {
77                  try {
78                      Class main = Class.forName(mainClass);
79                      Method mainMethod = main.getMethod("main", String[].class);
80                      mainMethod.invoke(null, (Object) args);
81                  } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
82                      e.printStackTrace();
83                  }
84              } else {
85                  printHelp();
86              }
87          }
88      }
89  
90      private static void printHelp() {
91              String footer = "";
92              if (availableClassesList.size() > 0) {
93                  String description = "The MAIN_CLASS to be launched from the list below.\n";
94                  footer = "\n\tThe MAIN_CLASS can either be the fully qualified name, the index or the class name.\n\n"
95                          + "\tAvailable classes: \n";
96                  int count = 0;
97                  StringBuilder b = new StringBuilder();
98                  for (String availableClass : availableClassesList) {
99                      b.append("\t-" + count + "-  " + availableClass + "\n");
100                     count++;
101                 }
102                 footer += b.toString();
103                 Option opt = cmdOptions.getOption("mainClass");
104                 opt.setDescription(description);
105             }
106             HelpFormatter formatter = new HelpFormatter();
107             formatter.printHelp(helpName, "", cmdOptions, footer, true);
108         
109     }
110 
111 }
112 
113