JAL-629 sort files from java glob for predictability. reduce maxdepth of walkfiletree
[jalview.git] / src / jalview / bin / argparser / BootstrapArgs.java
1 package jalview.bin.argparser;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.Map;
8
9 import jalview.bin.argparser.Arg.Opt;
10 import jalview.util.FileUtils;
11
12 public class BootstrapArgs
13 {
14   // only need one
15   private Map<Arg, List<String>> bootstrapArgMap = new HashMap<>();
16
17   public static BootstrapArgs getBootstrapArgs(String[] args)
18   {
19     List<String> argList = new ArrayList<>(Arrays.asList(args));
20     return new BootstrapArgs(argList);
21   }
22
23   private BootstrapArgs(List<String> args)
24   {
25     parse(args);
26   }
27
28   private void parse(List<String> args)
29   {
30     if (args == null)
31       return;
32     for (int i = 0; i < args.size(); i++)
33     {
34       String arg = args.get(i);
35       String argName = null;
36       String val = null;
37       if (arg.startsWith(ArgParser.DOUBLEDASH))
38       {
39         // remove "--"
40         arg = arg.substring(ArgParser.DOUBLEDASH.length());
41         int equalPos = arg.indexOf(ArgParser.EQUALS);
42         if (equalPos > -1
43                 && ArgParser.argMap.containsKey(arg.substring(0, equalPos)))
44         {
45           argName = arg.substring(0, equalPos);
46           val = arg.substring(equalPos + 1);
47         }
48         // check for boolean prepended by "no"
49         else if (arg.startsWith(ArgParser.NEGATESTRING)
50                 && ArgParser.argMap.containsKey(
51                         arg.substring(ArgParser.NEGATESTRING.length())))
52         {
53           argName = arg.substring(ArgParser.NEGATESTRING.length());
54           val = "false";
55         }
56         else if (ArgParser.argMap.containsKey(arg))
57         {
58           argName = arg;
59           val = "true";
60         }
61
62         Arg a = ArgParser.argMap.get(argName);
63
64         if (a == null || !a.hasOption(Opt.BOOTSTRAP))
65         {
66           // not a valid bootstrap arg
67           continue;
68         }
69
70         if (a.hasOption(Opt.STRING))
71         {
72           if (equalPos == -1)
73           {
74             addAll(a, ArgParser.getShellGlobbedFilenameValues(a, args,
75                     i + 1));
76           }
77           else
78           {
79             if (a.hasOption(Opt.GLOB))
80             {
81               System.out.println("##### VAL='" + val + "'");
82               addAll(a, FileUtils.getFilenamesFromGlob(val));
83             }
84             else
85             {
86               add(a, val);
87             }
88           }
89         }
90         else
91         {
92           add(a, val);
93         }
94       }
95     }
96   }
97
98   public boolean contains(Arg a)
99   {
100     return bootstrapArgMap.containsKey(a);
101   }
102
103   public List<String> getList(Arg a)
104   {
105     return bootstrapArgMap.get(a);
106   }
107
108   private List<String> getOrCreateList(Arg a)
109   {
110     List<String> l = getList(a);
111     if (l == null)
112     {
113       l = new ArrayList<>();
114       putList(a, l);
115     }
116     return l;
117   }
118
119   private void putList(Arg a, List<String> l)
120   {
121     bootstrapArgMap.put(a, l);
122   }
123
124   /*
125    * Creates a new list if not used before,
126    * adds the value unless the existing list is non-empty
127    * and the arg is not MULTI (so first expressed value is
128    * retained).
129    */
130   private void add(Arg a, String s)
131   {
132     List<String> l = getOrCreateList(a);
133     if (a.hasOption(Opt.MULTI) || l.size() == 0)
134     {
135       l.add(s);
136     }
137   }
138
139   private void addAll(Arg a, List<String> al)
140   {
141     List<String> l = getOrCreateList(a);
142     if (a.hasOption(Opt.MULTI))
143     {
144       l.addAll(al);
145     }
146   }
147
148   /*
149    * Retrieves the first value even if MULTI.
150    * A convenience for non-MULTI args.
151    */
152   public String get(Arg a)
153   {
154     if (!bootstrapArgMap.containsKey(a))
155       return null;
156     List<String> aL = bootstrapArgMap.get(a);
157     return (aL == null || aL.size() == 0) ? null : aL.get(0);
158   }
159
160   public boolean getBoolean(Arg a, boolean d)
161   {
162     if (!bootstrapArgMap.containsKey(a))
163       return d;
164     return Boolean.parseBoolean(get(a));
165   }
166
167   public boolean getBoolean(Arg a)
168   {
169     if (!(a.hasOption(Opt.BOOLEAN) || a.hasOption(Opt.UNARY)))
170     {
171       return false;
172     }
173     if (bootstrapArgMap.containsKey(a))
174       return Boolean.parseBoolean(get(a));
175     else
176       return a.getDefaultBoolValue();
177   }
178 }