package winstone.cmdline; import winstone.Launcher; import winstone.Logger; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import static winstone.Launcher.*; /** * Command line argument parser, Winstone style. * * @author Kohsuke Kawaguchi */ public class CmdLineParser { private final List<Option<?>> options; public CmdLineParser(List<Option<?>> options) { this.options = options; } public Map<String,String> parse(String[] argv, String nonSwitchArgName) throws IOException { Map<String,String> args = new HashMap<String,String>(); // Load embedded properties file String embeddedPropertiesFilename = RESOURCES.getString( "Launcher.EmbeddedPropertiesFile"); InputStream embeddedPropsStream = Launcher.class.getResourceAsStream( embeddedPropertiesFilename); if (embeddedPropsStream != null) { loadPropsFromStream(embeddedPropsStream, args); embeddedPropsStream.close(); } // Get command line args String configFilename = RESOURCES.getString("Launcher.DefaultPropertyFile"); for (String option : argv) { if (option.startsWith("--")) { int equalPos = option.indexOf('='); String paramName = option.substring(2, equalPos == -1 ? option.length() : equalPos); Option<?> opt = toOption(paramName); if (opt == null) throw new IllegalArgumentException(RESOURCES.getString("CmdLineParser.UnrecognizedOption", option)); if (equalPos != -1) { args.put(paramName, option.substring(equalPos + 1)); } else { if (opt.type == Boolean.class) args.put(paramName, "true"); else throw new IllegalArgumentException(RESOURCES.getString("CmdLineParser.OperandExpected", option)); } if (paramName.equals(Option.CONFIG.name)) { configFilename = args.get(paramName); } } else { if (args.containsKey(nonSwitchArgName)) throw new IllegalArgumentException(RESOURCES.getString("CmdLineParser.MultipleArgs", option)); args.put(nonSwitchArgName, option); } } // Load default props if available File configFile = new File(configFilename); if (configFile.exists() && configFile.isFile()) { InputStream inConfig = new FileInputStream(configFile); loadPropsFromStream(inConfig, args); inConfig.close(); initLogger(args); Logger.log(Logger.DEBUG, RESOURCES, "Launcher.UsingPropertyFile", configFilename); } else { initLogger(args); } return args; } private static void loadPropsFromStream(InputStream inConfig, Map args) throws IOException { Properties props = new Properties(); props.load(inConfig); for (Object o : props.keySet()) { String key = (String) o; if (!args.containsKey(key.trim())) { args.put(key.trim(), props.getProperty(key).trim()); } } props.clear(); } private Option<?> toOption(String paramName) { for (Option<?> o : options) { if (o.isWildcard() && paramName.startsWith(o.name)) return o; if (!o.isWildcard() && paramName.equals(o.name)) return o; } return null; } }