1 package jalview.bin.argparser;
3 import java.util.ArrayList;
4 import java.util.HashMap;
8 import jalview.bin.Console;
11 * A helper class to parse a string of the possible forms "content"
12 * "[index]content", "[keyName=keyValue]content" and return the integer index,
13 * the strings keyName and keyValue, and the content after the square brackets
14 * (if present). Values not set `will be -1 or null.
18 public static int NOTSET = -1;
20 private int index = NOTSET;
22 private Map<String, String> subValMap;
24 private static char SEPARATOR = ';';
26 private static char EQUALS = '=';
28 private String content = null;
30 protected SubVals(SubVals sv, String c)
34 this.subValMap = new HashMap<>();
38 this.subValMap = sv == null ? new HashMap<>() : sv.getSubValMap();
39 this.index = sv.getIndex();
44 protected SubVals(String item)
46 if (subValMap == null)
47 subValMap = new HashMap<>();
51 public void parseVals(String item)
55 if (item.indexOf('[') == 0 && item.indexOf(']') > 1)
58 int closeBracket = item.indexOf(']');
59 String subvalsString = item.substring(openBracket + 1, closeBracket);
60 this.content = item.substring(closeBracket + 1);
61 boolean setIndex = false;
62 for (String subvalString : subvalsString
63 .split(Character.toString(SEPARATOR)))
65 int equals = subvalString.indexOf(EQUALS);
68 this.put(subvalString.substring(0, equals),
69 subvalString.substring(equals + 1));
75 this.index = Integer.parseInt(subvalString);
77 } catch (NumberFormatException e)
79 // store this non-numeric key as a "true" value
80 this.put(subvalString, "true");
87 Console.debug("SubVals from '" + subvalsString + "' has index "
88 + this.index + " set");
96 protected void put(String key, String val)
98 subValMap.put(key, val);
101 public boolean notSet()
103 // notSet is true if content present but nonsensical
104 return index == NOTSET && (subValMap == null || subValMap.size() == 0);
107 public String get(String key)
109 return subValMap.get(key);
112 public boolean has(String key)
114 return subValMap.containsKey(key);
117 public int getIndex()
122 public String getContent()
127 protected Map<String, String> getSubValMap()
132 public String toString()
134 if (subValMap == null && getIndex() == NOTSET)
137 StringBuilder sb = new StringBuilder();
138 List<String> entries = new ArrayList<>();
139 subValMap.entrySet().stream().forEachOrdered(
140 m -> entries.add(m.getValue().equals("true") ? m.getKey()
141 : new StringBuilder().append(m.getKey()).append(EQUALS)
142 .append(m.getValue()).toString()));
143 if (getIndex() != NOTSET)
144 entries.add(Integer.toString(getIndex()));
146 sb.append(String.join(Character.toString(SEPARATOR), entries));
148 return sb.toString();