1 package de.java2html.commandline; 2 3 import java.util.HashMap ; 4 import java.util.HashSet ; 5 import java.util.Iterator ; 6 import java.util.Map ; 7 import java.util.Set ; 8 9 12 public class CommandlineArguments { 13 private Map valueByParameterName = new HashMap (); 14 private Set flags = new HashSet (); 15 16 public CommandlineArguments(String [] args) throws IllegalCommandlineParametersException { 17 for (int i = 0; i < args.length; i++) { 18 if (isValidFlagName(args[i])) { 19 String flagName = args[i].substring(1).toLowerCase(); 20 String value = null; 21 if (i + 1 < args.length) { 22 if (!isValidFlagName(args[i + 1])) { 23 value = args[i + 1]; 24 ++i; 25 } 26 } 27 if (flags.contains(flagName) || valueByParameterName.containsKey(flagName)) { 28 throw new IllegalCommandlineParametersException("Argument '" 29 + flagName 30 + "' has been defined more often than once."); 31 } 32 if (value == null) { 33 flags.add(flagName); 34 } 35 else { 36 valueByParameterName.put(flagName, value); 37 } 38 } 39 else { 40 throw new IllegalCommandlineParametersException("Unexpected parameter '" + args[i] + "'"); 41 } 42 } 43 } 44 45 private boolean isValidFlagName(String name) { 46 if (!name.startsWith("-")) { 47 return false; 48 } 49 try { 50 Double.parseDouble(name); 51 return false; 52 } 53 catch (NumberFormatException e) { 54 return true; 55 } 56 } 57 58 public String getParameterStringValue(String parameterName) { 59 return (String ) valueByParameterName.get(parameterName.toLowerCase()); 60 } 61 62 public String getParameterStringValue(String parameterName, String defaultValue) { 63 String value = getParameterStringValue(parameterName); 64 return value != null ? value : defaultValue; 65 } 66 67 public int getParameterPositiveIntValue(String parameterName, int defaultValue) 68 throws IllegalCommandlineParametersException { 69 String value = getParameterStringValue(parameterName); 70 if (value == null) { 71 return defaultValue; 72 } 73 74 int i = parseInt(value); 75 if (i < 0) { 76 throw new IllegalCommandlineParametersException( 77 "Positive value for int argument expected, was '" + value + "'"); 78 } 79 return i; 80 } 81 82 private int parseInt(String value) throws IllegalCommandlineParametersException { 83 try { 84 return Integer.parseInt(value); 85 } 86 catch (NumberFormatException e) { 87 throw new IllegalCommandlineParametersException("Illegal format for a int value '" 88 + value 89 + "'"); 90 } 91 } 92 93 public boolean isFlagSet(String flagName) { 94 return flags.contains(flagName.toLowerCase()); 95 } 96 97 public boolean isParameterSet(String flagName) { 98 return valueByParameterName.containsKey(flagName.toLowerCase()); 99 } 100 101 public String getRequiredParameterStringValue(String parameterName) 102 throws IllegalCommandlineParametersException { 103 String value = getParameterStringValue(parameterName); 104 if (value == null) { 105 throw new IllegalCommandlineParametersException("Missing required parameter value for '" 106 + parameterName 107 + "'"); 108 } 109 return value; 110 } 111 112 public void assertContainsNoUnsupportedFlags(String [] supportedFlagNames) 113 throws IllegalCommandlineParametersException { 114 Set supportedFlagNameSet = createLowerCaseNameSet(supportedFlagNames); 115 Iterator iterator = flags.iterator(); 116 while (iterator.hasNext()) { 117 String flagName = (String ) iterator.next(); 118 if (!supportedFlagNameSet.contains(flagName)) { 119 throw new IllegalCommandlineParametersException("The flag '" 120 + flagName 121 + "' is not supported (or missing required parameter value)."); 122 } 123 } 124 } 125 126 public void assertContainsNoUnsupportedParameters(String [] supportedParameterNames) 127 throws IllegalCommandlineParametersException { 128 Set supportedParameterNameSet = createLowerCaseNameSet(supportedParameterNames); 129 Iterator iterator = valueByParameterName.keySet().iterator(); 130 while (iterator.hasNext()) { 131 String flagName = (String ) iterator.next(); 132 if (!supportedParameterNameSet.contains(flagName)) { 133 throw new IllegalCommandlineParametersException("The parameter '" 134 + flagName 135 + "' is not supported."); 136 } 137 } 138 } 139 140 private Set createLowerCaseNameSet(String [] names) { 141 Set supportedFlagNameSet = new HashSet (); 142 for (int i = 0; i < names.length; i++) { 143 supportedFlagNameSet.add(names[i].toLowerCase()); 144 } 145 return supportedFlagNameSet; 146 } 147 } | Popular Tags |