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[] argsthrows 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 + < 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 (StringvalueByParameterName.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 valuethrows 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 = (Stringiterator.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 = (Stringiterator.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 }