JAL-3484 temporary override of autocalc preferences for project load
[jalview.git] / src / jalview / project / Jalview2XML.java
index 59275cd..d80fd86 100644 (file)
@@ -4034,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)
@@ -4064,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.