JAL-3484 temporary override of autocalc preferences for project load
[jalview.git] / src / jalview / project / Jalview2XML.java
index eaabd47..d80fd86 100644 (file)
@@ -92,6 +92,7 @@ import jalview.util.StringUtils;
 import jalview.util.jarInputStreamProvider;
 import jalview.util.matcher.Condition;
 import jalview.viewmodel.AlignmentViewport;
+import jalview.viewmodel.AlignmentViewport.AutoAnnotation;
 import jalview.viewmodel.PCAModel;
 import jalview.viewmodel.ViewportRanges;
 import jalview.viewmodel.seqfeatures.FeatureRendererSettings;
@@ -199,17 +200,21 @@ import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
 
 /**
- * Write out the current jalview desktop state as a Jalview XML stream.
- * 
- * Note: the vamsas objects referred to here are primitive versions of the
- * VAMSAS project schema elements - they are not the same and most likely never
- * will be :)
- * 
- * @author $author$
- * @version $Revision: 1.134 $
+ * Provides methods to read in or write out the Jalview desktop state as a
+ * Jalview XML model, as one or more entries in a .jar archive. The jar file may
+ * include additional data file entries, such as
+ * <ul>
+ * <li>PDB structure data files</li>
+ * <li>session state for one or more Jmol, Chimera or Varna structure
+ * viewers</li>
+ * </ul>
  */
 public class Jalview2XML
 {
+  private static final String TRUE = "true";
+
+  private static final String FALSE = "false";
+
   private static final String VIEWER_PREFIX = "viewer_";
 
   private static final String RNA_PREFIX = "rna_";
@@ -3642,17 +3647,14 @@ public class Jalview2XML
          * test if annotation is automatically calculated for this view only
          */
         boolean autoForView = false;
-        if (annotation.getLabel().equals("Quality")
-                || annotation.getLabel().equals("Conservation")
-                || annotation.getLabel().equals("Consensus"))
+        if (annotation.getLabel().equals(AutoAnnotation.QUALITY.label)
+                || annotation.getLabel()
+                        .equals(AutoAnnotation.CONSERVATION.label)
+                || annotation.getLabel()
+                        .equals(AutoAnnotation.CONSENSUS.label))
         {
           // Kludge for pre 2.5 projects which lacked the autocalculated flag
           autoForView = true;
-          // JAXB has no has() test; schema defaults value to false
-          // if (!annotation.hasAutoCalculated())
-          // {
-          // annotation.setAutoCalculated(true);
-          // }
         }
         if (autoForView || annotation.isAutoCalculated())
         {
@@ -3674,7 +3676,7 @@ public class Jalview2XML
           }
 
           al.addAnnotation(jda);
-
+          addedAnnotation.add(jda);
           continue;
         }
         // Construct new annotation from model.
@@ -4032,9 +4034,17 @@ public class Jalview2XML
 
     if (isnewview)
     {
-      af = loadViewport(file, jseqs, hiddenSeqs, al, jalviewModel, view,
-              uniqueSeqSetId, viewId);
-      // TODO restore autocalc preferences if overridden earlier?
+      Map<String, String> originalPreferences = null;
+      try
+      {
+        originalPreferences = setAutocalcPreferences(jalviewModel);
+        af = loadViewport(file, jseqs, hiddenSeqs, al, jalviewModel, view,
+                uniqueSeqSetId, viewId);
+      } finally
+      {
+        restoreAutocalcPreferences(originalPreferences);
+      }
+
       /*
        * resort annotations to their order in the project
        * (also sets height and visibility for autocalc'd annotation)
@@ -4062,6 +4072,93 @@ public class Jalview2XML
   }
 
   /**
+   * Restores previously captured preferences (or deletes the preference if the
+   * map entry value is null)
+   * 
+   * @param originalPreferences
+   */
+  private void restoreAutocalcPreferences(
+          Map<String, String> originalPreferences)
+  {
+    for (Entry<String, String> entry : originalPreferences.entrySet())
+    {
+      String key = entry.getKey();
+      String value = entry.getValue();
+      if (value == null)
+      {
+        Cache.removeProperty(key);
+      }
+      else
+      {
+        Cache.setProperty(key, value);
+      }
+    }
+  }
+
+  /**
+   * Inspects saved annotations and temporarily sets preferences for whether
+   * autocalculated annotations should be created for Conservation, Consensus,
+   * Quality, Occupancy. Returns a map containing the original values (which may
+   * be null if property is not set, or is set to null).
+   * 
+   * @param jalviewModel
+   * @return
+   */
+  private Map<String, String> setAutocalcPreferences(
+          JalviewModel jalviewModel)
+  {
+    Map<String, String> original = Cache.getProperties(
+            AutoAnnotation.OCCUPANCY.preferenceKey,
+            AutoAnnotation.CONSERVATION.preferenceKey,
+            AutoAnnotation.QUALITY.preferenceKey,
+            AutoAnnotation.CONSENSUS.preferenceKey);
+
+    Cache.setProperty(AutoAnnotation.OCCUPANCY.preferenceKey, FALSE);
+    Cache.setProperty(AutoAnnotation.CONSERVATION.preferenceKey, FALSE);
+    Cache.setProperty(AutoAnnotation.QUALITY.preferenceKey, FALSE);
+    Cache.setProperty(AutoAnnotation.CONSENSUS.preferenceKey, FALSE);
+
+    List<SequenceSet> sequenceSet = jalviewModel.getVamsasModel()
+            .getSequenceSet();
+
+    /*
+     * expect sequenceSet to have just one entry
+     */
+    if (sequenceSet.size() != 1)
+    {
+      System.err.println(
+              "Unexpected sequenceSet size: " + sequenceSet.size());
+      return original;
+    }
+    List<Annotation> anns = sequenceSet.get(0).getAnnotation();
+    for (Annotation ann : anns)
+    {
+      if (ann.isAutoCalculated())
+      {
+        String label = ann.getLabel();
+        if (AutoAnnotation.CONSERVATION.label.equals(label))
+        {
+          Cache.setProperty(AutoAnnotation.CONSERVATION.preferenceKey,
+                  TRUE);
+        }
+        else if (AutoAnnotation.QUALITY.label.equals(label))
+        {
+          Cache.setProperty(AutoAnnotation.QUALITY.preferenceKey, TRUE);
+        }
+        else if (AutoAnnotation.CONSENSUS.label.equals(label))
+        {
+          Cache.setProperty(AutoAnnotation.CONSENSUS.preferenceKey, TRUE);
+        }
+        else if (AutoAnnotation.OCCUPANCY.label.equals(label))
+        {
+          Cache.setProperty(AutoAnnotation.OCCUPANCY.preferenceKey, TRUE);
+        }
+      }
+    }
+    return original;
+  }
+
+  /**
    * Instantiate and link any saved RNA (Varna) viewers. The state of the Varna
    * panel is restored from separate jar entries, two (gapped and trimmed) per
    * sequence and secondary structure.
@@ -4589,7 +4686,7 @@ public class Jalview2XML
       {
         if (val.contains("e")) // eh? what can it be?
         {
-          if (val.trim().equals("true"))
+          if (val.trim().equals(TRUE))
           {
             val = "1";
           }