1 package jalview.bin.argparser;
4 import java.util.ArrayList;
5 import java.util.HashMap;
10 import jalview.bin.argparser.Arg.Opt;
11 import jalview.util.FileUtils;
14 * Helper class to allow easy extraction of information about specific argument
15 * values (without having to check for null etc all the time)
17 public class ArgValuesMap
19 protected Map<Arg, ArgValues> m;
21 protected ArgValuesMap()
26 protected ArgValuesMap(Map<Arg, ArgValues> map)
31 private Map<Arg, ArgValues> getMap()
38 m = new HashMap<Arg, ArgValues>();
41 private void newArg(Arg a)
46 m.put(a, new ArgValues(a));
49 protected void addArgValue(Arg a, ArgValue av)
52 m = new HashMap<Arg, ArgValues>();
54 if (!m.containsKey(a))
55 m.put(a, new ArgValues(a));
56 ArgValues avs = m.get(a);
60 public ArgValues getArgValues(Arg a)
62 return m == null ? null : m.get(a);
65 public ArgValues getOrCreateArgValues(Arg a)
67 ArgValues avs = m.get(a);
70 return getArgValues(a);
73 public List<ArgValue> getArgValueList(Arg a)
75 ArgValues avs = getArgValues(a);
76 return avs == null ? new ArrayList<>() : avs.getArgValueList();
79 public ArgValue getArgValue(Arg a)
81 List<ArgValue> vals = getArgValueList(a);
82 return (vals == null || vals.size() == 0) ? null : vals.get(0);
85 public String getValue(Arg a)
87 ArgValue av = getArgValue(a);
88 return av == null ? null : av.getValue();
91 public boolean containsArg(Arg a)
93 if (m == null || !m.containsKey(a))
95 return a.hasOption(Opt.STRING) ? getArgValue(a) != null
99 public boolean hasValue(Arg a, String val)
101 if (m == null || !m.containsKey(a))
103 for (ArgValue av : getArgValueList(a))
105 String avVal = av.getValue();
106 if ((val == null && avVal == null)
107 || (val != null && val.equals(avVal)))
115 public boolean getBoolean(Arg a)
117 ArgValues av = getArgValues(a);
118 return av == null ? false : av.getBoolean();
121 public Set<Arg> getArgKeys()
126 public ArgValue getClosestPreviousArgValueOfArg(ArgValue thisAv, Arg a)
128 ArgValue closestAv = null;
129 int thisArgIndex = thisAv.getArgIndex();
130 ArgValues compareAvs = this.getArgValues(a);
131 int closestPreviousIndex = -1;
132 for (ArgValue av : compareAvs.getArgValueList())
134 int argIndex = av.getArgIndex();
135 if (argIndex < thisArgIndex && argIndex > closestPreviousIndex)
137 closestPreviousIndex = argIndex;
144 public ArgValue getClosestNextArgValueOfArg(ArgValue thisAv, Arg a)
146 // this looks for the *next* arg that *might* be referring back to
147 // a thisAv. Such an arg would have no subValues (if it does it should
148 // specify an id in the subValues so wouldn't need to be guessed).
149 ArgValue closestAv = null;
150 int thisArgIndex = thisAv.getArgIndex();
151 ArgValues compareAvs = this.getArgValues(a);
152 int closestNextIndex = Integer.MAX_VALUE;
153 for (ArgValue av : compareAvs.getArgValueList())
155 int argIndex = av.getArgIndex();
156 if (argIndex > thisArgIndex && argIndex < closestNextIndex)
158 closestNextIndex = argIndex;
165 public ArgValue[] getArgValuesReferringTo(String key, String value, Arg a)
167 // this looks for the *next* arg that *might* be referring back to
168 // a thisAv. Such an arg would have no subValues (if it does it should
169 // specify an id in the subValues so wouldn't need to be guessed).
170 List<ArgValue> avList = new ArrayList<>();
171 Arg[] args = a == null ? (Arg[]) this.getMap().keySet().toArray()
174 for (Arg keyArg : args)
176 for (ArgValue av : this.getArgValueList(keyArg))
181 return (ArgValue[]) avList.toArray();
184 public boolean hasId(Arg a, String id)
186 ArgValues avs = this.getArgValues(a);
187 return avs == null ? false : avs.hasId(id);
190 public ArgValue getId(Arg a, String id)
192 ArgValues avs = this.getArgValues(a);
193 return avs == null ? null : avs.getId(id);
197 * This method returns the basename of the first --open or --opennew value.
198 * Used primarily for substitutions in output filenames.
200 public String getBasename()
202 return getDirOrBasename(false);
206 * This method returns the dirname of the first --open or --opennew value.
207 * Used primarily for substitutions in output filenames.
209 public String getDirname()
211 return getDirOrBasename(true);
214 public String getDirOrBasename(boolean dirname)
216 String filename = null;
217 String openVal = getValue(Arg.OPEN);
218 String opennewVal = getValue(Arg.OPENNEW);
221 if (filename == null && opennewVal != null)
222 filename = opennewVal;
223 if (filename == null)
226 File file = new File(filename);
227 return dirname ? FileUtils.getDirname(file)
228 : FileUtils.getBasename(file);