JAL-1569 preserve input ordering for stockholm files (Hashtable implementation change...
[jalview.git] / src / jalview / io / StockholmFile.java
index 1c84f00..c546930 100644 (file)
@@ -40,7 +40,9 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.Hashtable;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.StringTokenizer;
 import java.util.Vector;
 
@@ -185,7 +187,7 @@ public class StockholmFile extends AlignFile
     String version;
     // String id;
     Hashtable seqAnn = new Hashtable(); // Sequence related annotations
-    Hashtable seqs = new Hashtable();
+    LinkedHashMap<String, String> seqs = new LinkedHashMap<String, String>();
     Regex p, r, rend, s, x;
     // Temporary line for processing RNA annotation
     // String RNAannot = "";
@@ -257,12 +259,11 @@ public class StockholmFile extends AlignFile
           }
         }
         // logger.debug("Number of sequences: " + this.noSeqs);
-        Enumeration accs = seqs.keys();
-        while (accs.hasMoreElements())
+        for (Map.Entry<String, String> skey : seqs.entrySet())
         {
-          String acc = (String) accs.nextElement();
           // logger.debug("Processing sequence " + acc);
-          String seq = (String) seqs.remove(acc);
+          String acc = skey.getKey();
+          String seq = skey.getValue();
           if (maxLength < seq.length())
           {
             maxLength = seq.length();
@@ -366,6 +367,7 @@ public class StockholmFile extends AlignFile
                     AlignmentAnnotation an = (AlignmentAnnotation) vv
                             .elementAt(ii);
                     seqO.addAlignmentAnnotation(an);
+                    annotations.add(an);
                   }
                 }
               }
@@ -635,9 +637,13 @@ public class StockholmFile extends AlignFile
               strucAnn = new Hashtable();
             }
 
-            Vector newStruc = new Vector();
+            Vector<AlignmentAnnotation> newStruc = new Vector<AlignmentAnnotation>();
             parseAnnotationRow(newStruc, type, ns);
-
+            for (AlignmentAnnotation alan : newStruc)
+            {
+              alan.visible = false;
+            }
+            // annotations.addAll(newStruc);
             strucAnn.put(type, newStruc);
             seqAnn.put(acc, strucAnn);
           }
@@ -1041,11 +1047,12 @@ public class StockholmFile extends AlignFile
 
         out.append(new Format("%-" + maxid + "s").form("#=GC " + label
                 + " "));
+        boolean isrna = aa.isValidStruc();
         for (int j = 0; j < aa.annotations.length; j++)
         {
           String ch = (aa.annotations[j] == null) ? "-"
                   : aa.annotations[j].displayCharacter;
-          if (ch.length() == 0)
+          if (ch.length() == 0 || isrna)
           {
             char ll = aa.annotations[j].secondaryStructure;
             if (Character.toString(ll).equals(" "))