JAL-3560 tweak to force use of standard Java HashSet
authorBobHanson <hansonr@stolaf.edu>
Sat, 21 Mar 2020 14:05:07 +0000 (09:05 -0500)
committerBobHanson <hansonr@stolaf.edu>
Sat, 21 Mar 2020 14:05:07 +0000 (09:05 -0500)
adds Platform.getOrderedHashSet()
adds Platform.setJavaScriptMapObjectEnabled(boolean enabled)

sets the results from SequenceFeatures.getFeatureTypesForGroups(...) to
be a standard Java HashSet, not using the JavaScript Map object.

12 files changed:
src/jalview/datamodel/features/SequenceFeatures.java
src/jalview/util/Platform.java
src/jalview/viewmodel/seqfeatures/FeaturesDisplayed.java
src/swingjs/api/JSUtilI.java
swingjs/SwingJS-site.zip
swingjs/net.sf.j2s.core-j11.jar
swingjs/net.sf.j2s.core.jar
swingjs/timestamp
swingjs/ver/3.2.9/SwingJS-site.zip
swingjs/ver/3.2.9/net.sf.j2s.core-j11.jar
swingjs/ver/3.2.9/net.sf.j2s.core.jar
swingjs/ver/3.2.9/timestamp

index c75dbe0..1e579e0 100644 (file)
@@ -23,6 +23,7 @@ package jalview.datamodel.features;
 import jalview.datamodel.SequenceFeature;
 import jalview.io.gff.SequenceOntologyFactory;
 import jalview.io.gff.SequenceOntologyI;
+import jalview.util.Platform;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -315,7 +316,10 @@ public class SequenceFeatures implements SequenceFeaturesI
   public Set<String> getFeatureTypesForGroups(boolean positionalFeatures,
           String... groups)
   {
-    Set<String> result = new HashSet<>();
+    // BH 2020.03.21 This set is the one that sets the initial ordering for
+    // feature rendering. We set it to new HashSet<>(16,0.75) to force it to
+    // be backed by a Java hash-ordered HashMap instead of a JavaScript Map.
+    Set<String> result = Platform.getJavaOrderedHashSet();
 
     for (Entry<String, FeatureStore> featureType : featureStore.entrySet())
     {
@@ -343,7 +347,7 @@ public class SequenceFeatures implements SequenceFeaturesI
   @Override
   public Set<String> getFeatureTypes(String... soTerm)
   {
-    Set<String> types = new HashSet<>();
+    Set<String> types = new HashSet<>(15, 0.75f);
     for (Entry<String, FeatureStore> entry : featureStore.entrySet())
     {
       String type = entry.getKey();
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"));
+  }
 }
index f44a2d1..d2979cf 100644 (file)
@@ -29,9 +29,9 @@ import java.util.Set;
 
 public class FeaturesDisplayed implements FeaturesDisplayedI
 {
-  private Set<String> featuresDisplayed = new HashSet<String>();
+  private Set<String> featuresDisplayed = new HashSet<>();
 
-  private Set<String> featuresRegistered = new HashSet<String>();
+  private Set<String> featuresRegistered = new HashSet<>();
 
   public FeaturesDisplayed(FeaturesDisplayedI featuresDisplayed2)
   {
index ddf4141..5625f79 100644 (file)
@@ -174,4 +174,12 @@ public interface JSUtilI {
    */
   boolean streamToFile(InputStream is, File outFile);
 
+  /**
+   * Switch the flag in SwingJS to use or not use the JavaScript Map object in
+   * Hashtable, HashMap, and HashSet. Default is enabled.
+   * 
+   */
+
+  void setJavaScriptMapObjectEnabled(boolean enabled);
+
 }
index 27fac05..ec81fff 100644 (file)
Binary files a/swingjs/SwingJS-site.zip and b/swingjs/SwingJS-site.zip differ
index b636f3f..303fea5 100644 (file)
Binary files a/swingjs/net.sf.j2s.core-j11.jar and b/swingjs/net.sf.j2s.core-j11.jar differ
index 28b3976..dd5b904 100644 (file)
Binary files a/swingjs/net.sf.j2s.core.jar and b/swingjs/net.sf.j2s.core.jar differ
index 856f05a..cbdae99 100644 (file)
@@ -1 +1 @@
-20200319234711 
+20200321085805 
index 27fac05..ec81fff 100644 (file)
Binary files a/swingjs/ver/3.2.9/SwingJS-site.zip and b/swingjs/ver/3.2.9/SwingJS-site.zip differ
index b636f3f..303fea5 100644 (file)
Binary files a/swingjs/ver/3.2.9/net.sf.j2s.core-j11.jar and b/swingjs/ver/3.2.9/net.sf.j2s.core-j11.jar differ
index 28b3976..dd5b904 100644 (file)
Binary files a/swingjs/ver/3.2.9/net.sf.j2s.core.jar and b/swingjs/ver/3.2.9/net.sf.j2s.core.jar differ
index 856f05a..cbdae99 100644 (file)
@@ -1 +1 @@
-20200319234711 
+20200321085805