JAL-722 updated from 2.11.2 develop branch - needs further work before release
[jalview.git] / src / jalview / io / AnnotationFile.java
index c6b4bc7..64204b4 100755 (executable)
  */
 package jalview.io;
 
+import java.awt.Color;
+import java.io.BufferedReader;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
 import jalview.analysis.Conservation;
 import jalview.api.AlignViewportI;
 import jalview.datamodel.AlignmentAnnotation;
@@ -35,51 +47,32 @@ import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ColourSchemeProperty;
 import jalview.util.ColorUtils;
 
-import java.awt.Color;
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.InputStreamReader;
-import java.io.StringReader;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.BitSet;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.Vector;
-
 public class AnnotationFile
 {
-  public AnnotationFile()
-  {
-    init();
-  }
+  private static final String GRAPHLINE = "GRAPHLINE";
+
+  private static final String COMBINE = "COMBINE";
 
-  /**
-   * character used to write newlines
-   */
   protected String newline = System.getProperty("line.separator");
 
+  private StringBuffer text;
+
+  private SequenceI refSeq = null;
+
+  private String refSeqId = null;
+
+  private long nlinesread = 0;
+
+  private String lastread = "";
+
   /**
-   * set new line string and reset the output buffer
-   * 
-   * @param nl
+   * Constructor
    */
-  public void setNewlineString(String nl)
+  public AnnotationFile()
   {
-    newline = nl;
     init();
   }
 
-  public String getNewlineString()
-  {
-    return newline;
-  }
-
-  StringBuffer text;
-
   private void init()
   {
     text = new StringBuffer("JALVIEW_ANNOTATION" + newline + "# Created: "
@@ -274,7 +267,7 @@ public class AnnotationFile
           if (row.graphGroup > -1)
           {
             graphGroupSeen.set(row.graphGroup);
-            Integer key = new Integer(row.graphGroup);
+            Integer key = Integer.valueOf(row.graphGroup);
             if (graphGroup.containsKey(key))
             {
               graphGroup.put(key, graphGroup.get(key) + "\t" + row.label);
@@ -641,11 +634,7 @@ public class AnnotationFile
     }
   }
 
-  SequenceI refSeq = null;
-
-  String refSeqId = null;
-
-  public boolean annotateAlignmentView(AlignViewportI viewport, String file,
+  public boolean annotateAlignmentView(AlignViewportI viewport, Object file,
           DataSourceType protocol)
   {
     ColumnSelection colSel = viewport.getColumnSelection();
@@ -676,37 +665,16 @@ public class AnnotationFile
   }
 
   public boolean readAnnotationFile(AlignmentI al, HiddenColumns hidden,
-          String file, DataSourceType sourceType)
+          Object file, DataSourceType sourceType)
   {
     BufferedReader in = null;
     try
     {
-      if (sourceType == DataSourceType.FILE)
-      {
-        in = new BufferedReader(new FileReader(file));
-      }
-      else if (sourceType == DataSourceType.URL)
-      {
-        URL url = new URL(file);
-        in = new BufferedReader(new InputStreamReader(url.openStream()));
-      }
-      else if (sourceType == DataSourceType.PASTE)
-      {
-        in = new BufferedReader(new StringReader(file));
-      }
-      else if (sourceType == DataSourceType.CLASSLOADER)
-      {
-        java.io.InputStream is = getClass().getResourceAsStream("/" + file);
-        if (is != null)
-        {
-          in = new BufferedReader(new java.io.InputStreamReader(is));
-        }
-      }
+      in = new FileParse().getBufferedReader(file, sourceType);
       if (in != null)
       {
         return parseAnnotationFrom(al, hidden, in);
       }
-
     } catch (Exception ex)
     {
       ex.printStackTrace();
@@ -721,12 +689,6 @@ public class AnnotationFile
     return false;
   }
 
-  long nlinesread = 0;
-
-  String lastread = "";
-
-  private static String GRAPHLINE = "GRAPHLINE", COMBINE = "COMBINE";
-
   public boolean parseAnnotationFrom(AlignmentI al, HiddenColumns hidden,
           BufferedReader in) throws Exception
   {
@@ -761,7 +723,7 @@ public class AnnotationFile
                       autoAnnotsKey(aa[aai], aa[aai].sequenceRef,
                               (aa[aai].groupRef == null ? null
                                       : aa[aai].groupRef.getName())),
-                      new Integer(1));
+                      Integer.valueOf(1));
             }
           }
         }
@@ -967,7 +929,7 @@ public class AnnotationFile
             else
             {
               // consider deferring this till after the file has been parsed ?
-              hidden.hideInsertionsFor(sr);
+              hidden.hideList(sr.getInsertions());
             }
           }
           modified = true;
@@ -1124,8 +1086,8 @@ public class AnnotationFile
               if (rowset != null && rowset.size() > 0)
               {
                 AlignmentAnnotation alan = null;
-                for (int elm = 0, elmSize = rowset
-                        .size(); elm < elmSize; elm++)
+                for (int elm = 0,
+                        elmSize = rowset.size(); elm < elmSize; elm++)
                 {
                   alan = (AlignmentAnnotation) rowset.elementAt(elm);
                   alan.groupRef = theGroup;
@@ -1270,7 +1232,7 @@ public class AnnotationFile
         {
           displayChar = token;
           // foo
-          value = new Float(token).floatValue();
+          value = Float.valueOf(token).floatValue();
           parsedValue = true;
           continue;
         } catch (NumberFormatException ex)
@@ -1587,108 +1549,120 @@ public class AnnotationFile
     }
 
     String name = st.nextToken();
-    SequenceGroup sg = null;
-    for (SequenceGroup _sg : al.getGroups())
+
+    Map<String, String> properties = new HashMap<>();
+    while (st.hasMoreTokens())
     {
-      if ((sg = _sg).getName().equals(name))
-      {
-        break;
-      }
-      else
+      String keyValue = st.nextToken();
+      String key = keyValue.substring(0, keyValue.indexOf("="));
+      String value = keyValue.substring(keyValue.indexOf("=") + 1);
+      properties.put(key, value);
+    }
+
+    for (SequenceGroup sg : al.getGroups())
+    {
+      if (sg.getName().equals(name))
       {
-        sg = null;
+        addProperties(sg, properties, al);
       }
     }
+  }
 
-    if (sg != null)
+  /**
+   * Helper method that applies any specified properties to a SequenceGroup
+   * 
+   * @param sg
+   * @param properties
+   * @param al
+   */
+  private void addProperties(SequenceGroup sg,
+          Map<String, String> properties, AlignmentI al)
+  {
+    ColourSchemeI def = sg.getColourScheme();
+    for (String key : properties.keySet())
     {
-      String keyValue, key, value;
-      ColourSchemeI def = sg.getColourScheme();
-      while (st.hasMoreTokens())
+      String value = properties.get(key);
+      if (key.equalsIgnoreCase("description"))
       {
-        keyValue = st.nextToken();
-        key = keyValue.substring(0, keyValue.indexOf("="));
-        value = keyValue.substring(keyValue.indexOf("=") + 1);
-
-        if (key.equalsIgnoreCase("description"))
-        {
-          sg.setDescription(value);
-        }
-        else if (key.equalsIgnoreCase("colour"))
-        {
-          sg.cs.setColourScheme(
-                  ColourSchemeProperty.getColourScheme(al, value));
-        }
-        else if (key.equalsIgnoreCase("pidThreshold"))
-        {
-          sg.cs.setThreshold(Integer.parseInt(value), true);
+        sg.setDescription(value);
+      }
+      else if (key.equalsIgnoreCase("colour"))
+      {
+        // TODO need to notify colourscheme of view reference once it is
+        // available
+        sg.cs.setColourScheme(
+                ColourSchemeProperty.getColourScheme(null, al, value));
+      }
+      else if (key.equalsIgnoreCase("pidThreshold"))
+      {
+        sg.cs.setThreshold(Integer.parseInt(value), true);
 
-        }
-        else if (key.equalsIgnoreCase("consThreshold"))
-        {
-          sg.cs.setConservationInc(Integer.parseInt(value));
-          Conservation c = new Conservation("Group", sg.getSequences(null),
-                  sg.getStartRes(), sg.getEndRes() + 1);
+      }
+      else if (key.equalsIgnoreCase("consThreshold"))
+      {
+        sg.cs.setConservationInc(Integer.parseInt(value));
+        Conservation c = new Conservation("Group", sg.getSequences(null),
+                sg.getStartRes(), sg.getEndRes() + 1);
 
-          c.calculate();
-          c.verdict(false, 25); // TODO: refer to conservation percent threshold
+        c.calculate();
+        c.verdict(false, 25); // TODO: refer to conservation percent threshold
 
-          sg.cs.setConservation(c);
+        sg.cs.setConservation(c);
 
-        }
-        else if (key.equalsIgnoreCase("outlineColour"))
-        {
-          sg.setOutlineColour(ColorUtils.parseColourString(value));
-        }
-        else if (key.equalsIgnoreCase("displayBoxes"))
-        {
-          sg.setDisplayBoxes(Boolean.valueOf(value).booleanValue());
-        }
-        else if (key.equalsIgnoreCase("showUnconserved"))
-        {
-          sg.setShowNonconserved(Boolean.valueOf(value).booleanValue());
-        }
-        else if (key.equalsIgnoreCase("displayText"))
-        {
-          sg.setDisplayText(Boolean.valueOf(value).booleanValue());
-        }
-        else if (key.equalsIgnoreCase("colourText"))
-        {
-          sg.setColourText(Boolean.valueOf(value).booleanValue());
-        }
-        else if (key.equalsIgnoreCase("textCol1"))
-        {
-          sg.textColour = ColorUtils.parseColourString(value);
-        }
-        else if (key.equalsIgnoreCase("textCol2"))
-        {
-          sg.textColour2 = ColorUtils.parseColourString(value);
-        }
-        else if (key.equalsIgnoreCase("textColThreshold"))
-        {
-          sg.thresholdTextColour = Integer.parseInt(value);
-        }
-        else if (key.equalsIgnoreCase("idColour"))
-        {
-          Color idColour = ColorUtils.parseColourString(value);
-          sg.setIdColour(idColour == null ? Color.black : idColour);
-        }
-        else if (key.equalsIgnoreCase("hide"))
-        {
-          // see bug https://mantis.lifesci.dundee.ac.uk/view.php?id=25847
-          sg.setHidereps(true);
-        }
-        else if (key.equalsIgnoreCase("hidecols"))
-        {
-          // see bug https://mantis.lifesci.dundee.ac.uk/view.php?id=25847
-          sg.setHideCols(true);
-        }
-        sg.recalcConservation();
       }
-      if (sg.getColourScheme() == null)
+      else if (key.equalsIgnoreCase("outlineColour"))
+      {
+        sg.setOutlineColour(ColorUtils.parseColourString(value));
+      }
+      else if (key.equalsIgnoreCase("displayBoxes"))
+      {
+        sg.setDisplayBoxes(Boolean.valueOf(value).booleanValue());
+      }
+      else if (key.equalsIgnoreCase("showUnconserved"))
+      {
+        sg.setShowNonconserved(Boolean.valueOf(value).booleanValue());
+      }
+      else if (key.equalsIgnoreCase("displayText"))
+      {
+        sg.setDisplayText(Boolean.valueOf(value).booleanValue());
+      }
+      else if (key.equalsIgnoreCase("colourText"))
+      {
+        sg.setColourText(Boolean.valueOf(value).booleanValue());
+      }
+      else if (key.equalsIgnoreCase("textCol1"))
+      {
+        sg.textColour = ColorUtils.parseColourString(value);
+      }
+      else if (key.equalsIgnoreCase("textCol2"))
+      {
+        sg.textColour2 = ColorUtils.parseColourString(value);
+      }
+      else if (key.equalsIgnoreCase("textColThreshold"))
+      {
+        sg.thresholdTextColour = Integer.parseInt(value);
+      }
+      else if (key.equalsIgnoreCase("idColour"))
+      {
+        Color idColour = ColorUtils.parseColourString(value);
+        sg.setIdColour(idColour == null ? Color.black : idColour);
+      }
+      else if (key.equalsIgnoreCase("hide"))
+      {
+        // see bug https://mantis.lifesci.dundee.ac.uk/view.php?id=25847
+        sg.setHidereps(true);
+      }
+      else if (key.equalsIgnoreCase("hidecols"))
       {
-        sg.setColourScheme(def);
+        // see bug https://mantis.lifesci.dundee.ac.uk/view.php?id=25847
+        sg.setHideCols(true);
       }
+      sg.recalcConservation();
+    }
+
+    if (sg.getColourScheme() == null)
+    {
+      sg.setColourScheme(def);
     }
   }