001 package de.java2html.commandline;
002
003 import java.util.HashMap;
004 import java.util.HashSet;
005 import java.util.Iterator;
006 import java.util.Map;
007 import java.util.Set;
008
009 /**
010 * @author Markus Gebhard
011 */
012 public class CommandlineArguments {
013 private final Map valueByParameterName = new HashMap();
014 private final Set flags = new HashSet();
015
016 public CommandlineArguments(String[] args) throws IllegalCommandlineParametersException {
017 for (int i = 0; i < args.length; i++) {
018 if (isValidFlagName(args[i])) {
019 final String flagName = args[i].substring(1).toLowerCase();
020 String value = null;
021 if (i + 1 < args.length) {
022 if (!isValidFlagName(args[i + 1])) {
023 value = args[i + 1];
024 ++i;
025 }
026 }
027 if (flags.contains(flagName) || valueByParameterName.containsKey(flagName)) {
028 throw new IllegalCommandlineParametersException("Argument '"
029 + flagName
030 + "' has been defined more often than once.");
031 }
032 if (value == null) {
033 flags.add(flagName);
034 }
035 else {
036 valueByParameterName.put(flagName, value);
037 }
038 }
039 else {
040 throw new IllegalCommandlineParametersException("Unexpected parameter '" + args[i] + "'");
041 }
042 }
043 }
044
045 private boolean isValidFlagName(String name) {
046 if (!name.startsWith("-")) {
047 return false;
048 }
049 try {
050 Double.parseDouble(name);
051 return false;
052 }
053 catch (final NumberFormatException e) {
054 return true;
055 }
056 }
057
058 public String getParameterStringValue(String parameterName) {
059 return (String) valueByParameterName.get(parameterName.toLowerCase());
060 }
061
062 public String getParameterStringValue(String parameterName, String defaultValue) {
063 final String value = getParameterStringValue(parameterName);
064 return value != null ? value : defaultValue;
065 }
066
067 public int getParameterPositiveIntValue(String parameterName, int defaultValue)
068 throws IllegalCommandlineParametersException {
069 final String value = getParameterStringValue(parameterName);
070 if (value == null) {
071 return defaultValue;
072 }
073
074 final int i = parseInt(value);
075 if (i < 0) {
076 throw new IllegalCommandlineParametersException(
077 "Positive value for int argument expected, was '" + value + "'");
078 }
079 return i;
080 }
081
082 private int parseInt(String value) throws IllegalCommandlineParametersException {
083 try {
084 return Integer.parseInt(value);
085 }
086 catch (final NumberFormatException e) {
087 throw new IllegalCommandlineParametersException("Illegal format for a int value '"
088 + value
089 + "'");
090 }
091 }
092
093 public boolean isFlagSet(String flagName) {
094 return flags.contains(flagName.toLowerCase());
095 }
096
097 public boolean isParameterSet(String flagName) {
098 return valueByParameterName.containsKey(flagName.toLowerCase());
099 }
100
101 public String getRequiredParameterStringValue(String parameterName)
102 throws IllegalCommandlineParametersException {
103 final 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 final Set supportedFlagNameSet = createLowerCaseNameSet(supportedFlagNames);
115 final Iterator iterator = flags.iterator();
116 while (iterator.hasNext()) {
117 final 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 final Set supportedParameterNameSet = createLowerCaseNameSet(supportedParameterNames);
129 final Iterator iterator = valueByParameterName.keySet().iterator();
130 while (iterator.hasNext()) {
131 final 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 final 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 }
|