package org.hivedb.util; import java.util.Hashtable; import java.util.Map; public class GetOpt { Map<String,Key> keys; Map<String,String> lastProcessed; public GetOpt() { this.keys = new Hashtable<String, Key>(); } public GetOpt(String format) { this.keys = extractKeys(format); } public Map<String, String> toMap(String[] argz) { Map<String,String> argumentMap = new Hashtable<String, String>(); Integer unnamedArgumentCount = 0; for(int i=0; i<argz.length; i++) { if(isFlag(argz[i])) { if(keys.get(trimFlag(argz[i])).requiresArgument && i != argz.length-1) argumentMap.put(trimFlag(argz[i]), argz[++i]); else argumentMap.put(trimFlag(argz[i]), ""); } else { argumentMap.put(unnamedArgumentCount.toString(), argz[i].trim()); unnamedArgumentCount++; } } lastProcessed = argumentMap; return argumentMap; } public Map<String,String> getLast() {return lastProcessed;} public boolean validate() { return validateArgumentMap(this.lastProcessed, keys); } public static boolean validateArgumentMap(Map<String,String> argz, Map<String,Key> keys) { boolean isValid = true; for(Key key : keys.values()) isValid &= key.requiresArgument ? !"".equals(argz.get(key.value)) : "".equals(argz.get(key.value)); return isValid; } public void add(String value, boolean requiresArgument) { this.keys.put(value, new Key(value, requiresArgument)); } private Map<String,Key> extractKeys(String format) { String[] flags = format.split(","); Map<String,Key> keys = new Hashtable<String, Key>(); for(String s : flags) { keys.put(trimFormatString(s),new Key(trimFormatString(s), needsArgument(s))); } return keys; } public static boolean isFlag(String s) { return s.startsWith("-"); } private String trimFormatString(String s) { return s.trim().replaceAll(":", ""); } private boolean needsArgument(String s) { return s.trim().endsWith(":"); } private String trimFlag(String s) { s = s.trim(); while(isFlag(s)) { s = s.replaceFirst("-", ""); } return s; } private class Key { private boolean requiresArgument; private String value; public Key(String value, boolean requiresArgument) { this.value = value; this.requiresArgument = requiresArgument; } } }