JAL-629 Ensure precedence of named linked ID values over wildcard linked ID set value...
[jalview.git] / src / jalview / bin / argparser / ArgValues.java
index 4a60efd..f2c299c 100644 (file)
@@ -21,6 +21,8 @@ public class ArgValues
 
   private boolean negated = false;
 
+  private boolean setByWildcard = false;
+
   private int boolIndex = -1;
 
   private List<Integer> argsIndexes;
@@ -36,6 +38,16 @@ public class ArgValues
     this.boolValue = arg.getDefaultBoolValue();
   }
 
+  protected boolean setByWildcard()
+  {
+    return setByWildcard;
+  }
+
+  protected void setSetByWildcard(boolean b)
+  {
+    setByWildcard = b;
+  }
+
   public Arg arg()
   {
     return arg;
@@ -51,8 +63,11 @@ public class ArgValues
     argCount++;
   }
 
-  protected void setNegated(boolean b)
+  protected void setNegated(boolean b, boolean beingSetByWildcard)
   {
+    // don't overwrite a wildcard set boolean with a non-wildcard set boolean
+    if (boolIndex >= 0 && !this.setByWildcard && beingSetByWildcard)
+      return;
     this.negated = b;
   }
 
@@ -61,10 +76,14 @@ public class ArgValues
     return this.negated;
   }
 
-  protected void setBoolean(boolean b, int i)
+  protected void setBoolean(boolean b, int i, boolean beingSetByWildcard)
   {
+    // don't overwrite a wildcard set boolean with a non-wildcard set boolean
+    if (boolIndex >= 0 && !this.setByWildcard && beingSetByWildcard)
+      return;
     this.boolValue = b;
     this.boolIndex = i;
+    this.setSetByWildcard(beingSetByWildcard);
   }
 
   protected boolean getBoolean()
@@ -98,28 +117,30 @@ public class ArgValues
     return sb.toString();
   }
 
-  protected void addValue()
-  {
-    addValue(null, -1);
-  }
-
-  protected void addValue(String val, int argIndex)
+  protected void addValue(String val, int argIndex, boolean wildcard)
   {
-    addArgValue(new ArgValue(arg(), val, argIndex));
+    addArgValue(new ArgValue(arg(), val, argIndex), wildcard);
   }
 
-  protected void addValue(SubVals sv, String content, int argIndex)
+  protected void addValue(SubVals sv, String content, int argIndex,
+          boolean wildcard)
   {
-    addArgValue(new ArgValue(arg(), sv, content, argIndex));
+    addArgValue(new ArgValue(arg(), sv, content, argIndex), wildcard);
   }
 
-  protected void addArgValue(ArgValue av)
+  protected void addArgValue(ArgValue av, boolean beingSetByWildcard)
   {
+    // allow a non-wildcard value to overwrite a wildcard set single value
+    boolean overwrite = !arg.hasOption(Opt.MULTI) && setByWildcard
+            && !beingSetByWildcard;
     if ((!arg.hasOption(Opt.MULTI) && argValueList.size() > 0)
-            || (arg.hasOption(Opt.NODUPLICATEVALUES)
-                    && argValueList.contains(av.getValue())))
+            && !overwrite)
       return;
-    if (argValueList == null)
+    if (arg.hasOption(Opt.NODUPLICATEVALUES)
+            && this.containsValue(av.getValue()))
+      return;
+    // new or overwrite if single valued
+    if (argValueList == null || overwrite)
     {
       argValueList = new ArrayList<ArgValue>();
     }
@@ -131,6 +152,7 @@ public class ArgValues
       idMap.put(id, av);
     }
     argValueList.add(av);
+    this.setSetByWildcard(beingSetByWildcard);
   }
 
   protected boolean hasValue(String val)
@@ -159,4 +181,21 @@ public class ArgValues
   {
     return idMap.get(id);
   }
+
+  private boolean containsValue(String v)
+  {
+    if (argValueList == null)
+      return false;
+    for (ArgValue av : argValueList)
+    {
+      String val = av.getValue();
+      if (v == null && val == null)
+        return true;
+      if (v == null)
+        continue;
+      if (v.equals(val))
+        return true;
+    }
+    return false;
+  }
 }
\ No newline at end of file