JAL-629 improvements to argparser toString. Improvements to cli paeFile structure...
[jalview.git] / src / jalview / bin / argparser / SubVals.java
1 package jalview.bin.argparser;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 import jalview.bin.Console;
7
8 /**
9  * A helper class to parse a string of the possible forms "content"
10  * "[index]content", "[keyName=keyValue]content" and return the integer index,
11  * the strings keyName and keyValue, and the content after the square brackets
12  * (if present). Values not set `will be -1 or null.
13  */
14 public class SubVals
15 {
16   private static int NOTSET = -1;
17
18   private int index = NOTSET;
19
20   private Map<String, String> subVals = null;
21
22   private static char SEPARATOR = ';';
23
24   private String content = null;
25
26   public SubVals(String item)
27   {
28     this.parseVals(item);
29   }
30
31   public void parseVals(String item)
32   {
33     if (item == null)
34       return;
35     if (item.indexOf('[') == 0 && item.indexOf(']') > 1)
36     {
37       int openBracket = 0;
38       int closeBracket = item.indexOf(']');
39       String subvalsString = item.substring(openBracket + 1, closeBracket);
40       this.content = item.substring(closeBracket + 1);
41       boolean setIndex = false;
42       for (String subvalString : subvalsString
43               .split(Character.toString(SEPARATOR)))
44       {
45         int equals = subvalString.indexOf('=');
46         if (equals > -1)
47         {
48           if (subVals == null)
49             subVals = new HashMap<>();
50           subVals.put(subvalString.substring(0, equals),
51                   subvalString.substring(equals + 1));
52         }
53         else
54         {
55           try
56           {
57             this.index = Integer.parseInt(subvalString);
58             setIndex = true;
59           } catch (NumberFormatException e)
60           {
61             Console.warn("Failed to obtain subvalue or index from '" + item
62                     + "'. Setting index=0 and using content='" + content
63                     + "'.");
64           }
65         }
66       }
67       if (!setIndex)
68         this.index = NOTSET;
69     }
70     else
71     {
72       this.content = item;
73     }
74   }
75
76   public boolean notSet()
77   {
78     // notSet is true if content present but nonsensical
79     return index == NOTSET && subVals == null;
80   }
81
82   public String get(String key)
83   {
84     return subVals == null ? null : subVals.get(key);
85   }
86
87   public boolean has(String key)
88   {
89     return subVals == null ? false : subVals.containsKey(key);
90   }
91
92   public int getIndex()
93   {
94     return index;
95   }
96
97   public String getContent()
98   {
99     return content;
100   }
101
102   public String toString()
103   {
104     StringBuilder sb = new StringBuilder();
105     if (subVals == null)
106       return "";
107     for (Map.Entry<String, String> m : subVals.entrySet())
108     {
109       sb.append(m.getKey()).append('=').append(m.getValue()).append("\n");
110     }
111     return sb.toString();
112   }
113 }