001    package org.shiftone.jrat.cli;
002    
003    
004    import org.shiftone.jrat.util.io.ResourceUtil;
005    import org.shiftone.jrat.util.log.Logger;
006    
007    import java.io.PrintStream;
008    import java.lang.reflect.Method;
009    import java.util.Enumeration;
010    import java.util.Properties;
011    
012    
013    /**
014     * @author jeff@shiftone.org (Jeff Drost)
015     */
016    public class Cli {
017    
018        private static final Logger LOG = Logger.getLogger(Cli.class);
019        private static final String PROPS = "org/shiftone/jrat/cli/cli.properties";
020        private static final Class[] MAIN_PARAMS = {String[].class};
021        private static PrintStream OUT = System.out;
022    
023        public static void main(String[] args) {
024    
025            try {
026                runMain(args);
027            }
028            catch (Exception e) {
029                LOG.error("error executing command", e);
030            }
031        }
032    
033    
034        private static void runMain(String[] args) throws Exception {
035    
036            Properties properties = ResourceUtil.getResourceAsProperties(PROPS);
037            Class klass = null;
038            Method method = null;
039            String className = null;
040            String classKey = null;
041            String[] newArgs = null;
042    
043            if (args.length == 0) {
044                newArgs = new String[0];
045                classKey = properties.getProperty("default");
046            } else {
047                newArgs = new String[args.length - 1];
048                classKey = args[0];
049    
050                System.arraycopy(args, 1, newArgs, 0, newArgs.length);
051            }
052    
053            classKey = classKey.toLowerCase();
054            className = properties.getProperty("main." + classKey + ".class");
055    
056            if (className == null) {
057                printOptionsAndExit(classKey, properties);
058            }
059    
060            LOG.debug("running " + className + ".main()");
061    
062            klass = Class.forName(className);
063            method = klass.getMethod("main", MAIN_PARAMS);
064    
065            method.invoke(null, new Object[]{newArgs});
066        }
067    
068    
069        private static void printOptionsAndExit(String classKey, Properties properties) {
070    
071            OUT.println("Option '" + classKey + "' is not supported.");
072            OUT.println("Please try one of the following:");
073    
074            Enumeration enumeration = properties.keys();
075    
076            while (enumeration.hasMoreElements()) {
077                String str = (String) enumeration.nextElement();
078    
079                if (str.startsWith("main.") && str.endsWith(".class")) {
080                    str = str.substring(5);
081                    str = str.substring(0, str.length() - 6);
082    
083                    OUT.println("\t" + str);
084                }
085            }
086    
087            System.exit(3);
088        }
089    }