JAL-3560 tweak to force use of standard Java HashSet
[jalview.git] / src / jalview / util / Platform.java
index 3bce7f0..3cba2dc 100644 (file)
@@ -36,7 +36,9 @@ import java.io.InputStreamReader;
 import java.io.Reader;
 import java.net.URL;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Properties;
+import java.util.Set;
 import java.util.logging.ConsoleHandler;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -752,4 +754,38 @@ public class Platform
     return (isJS() ? jsutil.getJSContext("jssingletons") : null);
   }
 
+  /**
+   * By designating initialCapacity and loadFactor, we tell SwingJS to use a
+   * standard (slower) Java HashMap to back this HashSet, thus providing exactly
+   * the same iterator order (until a new Java version changes it!)
+   * 
+   * @return a standard Java HashSet
+   */
+  public static Set<String> getJavaOrderedHashSet()
+  {
+    return new HashSet<>(16, 0.75f);
+  }
+  
+  /**
+   * Switch the flag in SwingJS to use or not use the JavaScript Map object in
+   * any Hashtable, HashMap, or HashSet. Default is enabled.
+   * 
+   * For testing purposes only.
+   * 
+   */
+  public static boolean setJavaScriptMapObjectEnabled(boolean enabled)
+  {
+    if (!isJS())
+    {
+      return false;
+    }
+    jsutil.setJavaScriptMapObjectEnabled(enabled);
+    HashSet<String> hs = new HashSet<>();
+    // Java hash table iterator in HashMap will return "one" before "two"
+    // because of its hash code;
+    // JavaScript Map object will return "two" first because it was added first.
+    hs.add("two");
+    hs.add("one");
+    return (hs.iterator().next() == (enabled ? "two" : "one"));
+  }
 }