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;
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_";
* 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())
{
}
al.addAnnotation(jda);
-
+ addedAnnotation.add(jda);
continue;
}
// Construct new annotation from model.
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.
{
if (val.contains("e")) // eh? what can it be?
{
- if (val.trim().equals("true"))
+ if (val.trim().equals(TRUE))
{
val = "1";
}