package jalview.bin.argparser; import java.util.HashMap; import java.util.Map; import jalview.bin.Console; /** * A helper class to parse a string of the possible forms "content" * "[index]content", "[keyName=keyValue]content" and return the integer index, * the strings keyName and keyValue, and the content after the square brackets * (if present). Values not set `will be -1 or null. */ public class SubVals { private static int NOTSET = -1; private int index = NOTSET; private Map subVals = null; private static char SEPARATOR = ';'; private String content = null; public SubVals(String item) { this.parseVals(item); } public void parseVals(String item) { if (item == null) return; if (item.indexOf('[') == 0 && item.indexOf(']') > 1) { int openBracket = 0; int closeBracket = item.indexOf(']'); String subvalsString = item.substring(openBracket + 1, closeBracket); this.content = item.substring(closeBracket + 1); boolean setIndex = false; for (String subvalString : subvalsString .split(Character.toString(SEPARATOR))) { int equals = subvalString.indexOf('='); if (equals > -1) { if (subVals == null) subVals = new HashMap<>(); subVals.put(subvalString.substring(0, equals), subvalString.substring(equals + 1)); } else { try { this.index = Integer.parseInt(subvalString); setIndex = true; } catch (NumberFormatException e) { Console.warn("Failed to obtain subvalue or index from '" + item + "'. Setting index=0 and using content='" + content + "'."); } } } if (!setIndex) this.index = NOTSET; } else { this.content = item; } } public boolean notSet() { // notSet is true if content present but nonsensical return index == NOTSET && subVals == null; } public String get(String key) { return subVals == null ? null : subVals.get(key); } public boolean has(String key) { return subVals == null ? false : subVals.containsKey(key); } public int getIndex() { return index; } public String getContent() { return content; } }