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
32 cmdOptions = new Options();
33
34 cmdOptions.addOption("h", Bootstrap.HELP_OPTION, false, "Print the help message");
35
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