001    package org.extendj.ast;
002    
003    import java.util.HashSet;
004    import java.io.File;
005    import java.util.Set;
006    import java.util.Collections;
007    import java.util.Collection;
008    import java.util.ArrayList;
009    import beaver.*;
010    import java.util.*;
011    import java.io.ByteArrayOutputStream;
012    import java.io.PrintStream;
013    import java.lang.reflect.InvocationTargetException;
014    import java.lang.reflect.Method;
015    import org.jastadd.util.*;
016    import java.util.zip.*;
017    import java.io.*;
018    import org.jastadd.util.PrettyPrintable;
019    import org.jastadd.util.PrettyPrinter;
020    import java.io.FileNotFoundException;
021    import java.io.BufferedInputStream;
022    import java.io.DataInputStream;
023    /**
024     * @ast class
025     * @declaredat /home/jesper/git/extendj/java4/frontend/Options.jadd:43
026     */
027    public class Options extends java.lang.Object {
028      public  Collection<String> files() {
029        return files;
030      }
031    
032      public  void initOptions() {
033        options.clear();
034        optionDescriptions.clear();
035        files.clear();
036      }
037    
038      public  void addKeyOption(String name) {
039        if (optionDescriptions.containsKey(name)) {
040          throw new Error("Command line definition error: option description for " + name + " is multiply declared");
041        }
042        optionDescriptions.put(name, new Option(name, false, false));
043      }
044    
045      public  void addKeyValueOption(String name) {
046        if (optionDescriptions.containsKey(name)) {
047          throw new Error("Command line definition error: option description for " + name + " is multiply declared");
048        }
049        optionDescriptions.put(name, new Option(name, true, false));
050      }
051    
052      public  void addKeyCollectionOption(String name) {
053        if (optionDescriptions.containsKey(name)) {
054          throw new Error("Command line definition error: option description for " + name + " is multiply declared");
055        }
056        optionDescriptions.put(name, new Option(name, true, true));
057      }
058    
059      public  void addOptionDescription(String name, boolean value) {
060        if (optionDescriptions.containsKey(name)) {
061          throw new Error("Command line definition error: option description for " + name + " is multiply declared");
062        }
063        optionDescriptions.put(name, new Option(name, value, false));
064      }
065    
066      public  void addOptionDescription(String name, boolean value, boolean isCollection) {
067        if (optionDescriptions.containsKey(name)) {
068          throw new Error("Command line definition error: option description for " + name + " is multiply declared");
069        }
070        optionDescriptions.put(name, new Option(name, value, isCollection));
071      }
072    
073      public  void addOptions(String[] args) {
074        java.util.List<String> argList = new ArrayList<String>();
075    
076        // expand argument files
077        for (int i = 0; i < args.length; i++) {
078          String arg = args[i];
079          if (arg.length() > 1 && arg.startsWith("@")) {
080            if (arg.startsWith("@@")) {
081              // escape the double at
082              argList.add(arg.substring(1));
083            } else {
084              String fileName = arg.substring(1);
085              try {
086                java.io.StreamTokenizer tokenizer = new java.io.StreamTokenizer(new java.io.FileReader(fileName));
087                tokenizer.resetSyntax();
088                tokenizer.whitespaceChars(' ',' ');
089                tokenizer.whitespaceChars('\t','\t');
090                tokenizer.whitespaceChars('\f','\f');
091                tokenizer.whitespaceChars('\n','\n');
092                tokenizer.whitespaceChars('\r','\r');
093                tokenizer.wordChars(33,255);
094                tokenizer.commentChar('#');
095                tokenizer.quoteChar('"');
096                tokenizer.quoteChar('\'');
097                while (tokenizer.nextToken() != tokenizer.TT_EOF) {
098                  argList.add(tokenizer.sval);
099                }
100              } catch (java.io.FileNotFoundException e) {
101                System.err.println("Argument file not found: " + fileName);
102              } catch (java.io.IOException e) {
103                System.err.println("Exception: "+e.getMessage());
104              }
105            }
106          } else {
107            argList.add(arg);
108          }
109        }
110    
111        Iterator<String> all = argList.iterator();
112        while (all.hasNext()) {
113          String arg = all.next();
114          if (arg.startsWith("-")) {
115            if (!optionDescriptions.containsKey(arg)) {
116              throw new Error("Command line argument error: option " + arg + " is not defined");
117            }
118            Option o = (Option) optionDescriptions.get(arg);
119    
120            if (!o.isCollection && options.containsKey(arg)) {
121              throw new Error("Command line argument error: option " + arg + " is multiply defined");
122            }
123    
124            if (o.hasValue) {
125              String value = null;
126              if (!all.hasNext()) {
127                throw new Error("Command line argument error: value missing for key " + arg);
128              }
129              value = all.next();
130              if (value.startsWith("-")) {
131                throw new Error("Command line argument error: expected value for key " + arg
132                    + ", but found option " + value);
133              }
134    
135              if (o.isCollection) {
136                Collection<String> c = (Collection<String>) options.get(arg);
137                if (c == null) {
138                  c = new ArrayList<String>();
139                }
140                c.add(value);
141                options.put(arg, c);
142              } else {
143                options.put(arg, value);
144              }
145            } else {
146              options.put(arg, null);
147            }
148          } else {
149            files.add(arg);
150          }
151        }
152      }
153    
154      public  boolean hasOption(String name) {
155        return options.containsKey(name);
156      }
157    
158      public  void setOption(String name) {
159        options.put(name, null);
160      }
161    
162      public  boolean hasValueForOption(String name) {
163        return options.containsKey(name) && options.get(name) != null;
164      }
165    
166      public  String getValueForOption(String name) {
167        if (!hasValueForOption(name)) {
168          throw new Error("Command line argument error: key " + name + " does not have a value");
169        }
170        return (String) options.get(name);
171      }
172    
173      public  void setValueForOption(String value, String option) {
174        options.put(option, value);
175      }
176    
177      public  Collection getValueCollectionForOption(String name) {
178        if (!hasValueForOption(name)) {
179          throw new Error("Command line argument error: key " + name + " does not have a value");
180        }
181        return (Collection) options.get(name);
182      }
183    
184      public  boolean verbose() {
185        return hasOption("-verbose");
186      }
187    
188      static  class Option {
189        public String name;
190        public boolean hasValue;
191        public boolean isCollection;
192        public Option(String name, boolean hasValue, boolean isCollection) {
193          this.name = name;
194          this.hasValue = hasValue;
195          this.isCollection = isCollection;
196        }
197      }
198    
199      private final  Map<String,Object> options = new HashMap<String,Object>();
200    
201      private final  Map<String,Option> optionDescriptions = new HashMap<String,Option>();
202    
203      private final  Set<String> files = new LinkedHashSet<String>();
204    
205    
206    }