import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
+import java.util.HashMap;
import java.util.Locale;
+import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.TreeSet;
{
return applicationProperties.getProperty(key);
}
+
+ /**
+ * A convenience method that returns a map holding property values for the
+ * specified keys. A null entry in the map indicates a property that is either
+ * not set, or set with value null.
+ *
+ * @param key
+ * @return
+ */
+ public static Map<String, String> getProperties(String... key)
+ {
+ Map<String, String> map = new HashMap<>();
+ for (String k : key)
+ {
+ map.put(k, getProperty(k));
+ }
+ return map;
+ }
+
/**
* These methods are used when checking if the saved preference is different
* to the default setting
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)
}
/**
+ * 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.