Merge branch 'alpha/JAL-3066_Jalview_212_slivka-integration' into alpha/JAL-3362_Jalv...
[jalview.git] / src / jalview / analysis / AlignmentAnnotationUtils.java
index f5626ce..5c2d936 100644 (file)
@@ -75,11 +75,11 @@ public class AlignmentAnnotationUtils
      * Build a lookup, by calcId (annotation source), of all annotation types in
      * each graph group.
      */
-    Map<String, Map<Integer, List<String>>> groupLabels = new HashMap<String, Map<Integer, List<String>>>();
+    Map<String, Map<Integer, List<String>>> groupLabels = new HashMap<>();
 
     // trackers for which calcId!label combinations we have dealt with
-    List<String> addedToShown = new ArrayList<String>();
-    List<String> addedToHidden = new ArrayList<String>();
+    List<String> addedToShown = new ArrayList<>();
+    List<String> addedToHidden = new ArrayList<>();
 
     for (AlignmentAnnotation aa : annotations)
     {
@@ -99,7 +99,7 @@ public class AlignmentAnnotationUtils
         /*
          * Build a 'composite label' for types in line graph groups.
          */
-        final List<String> labelAsList = new ArrayList<String>();
+        final List<String> labelAsList = new ArrayList<>();
         final String displayLabel = aa.label;
         labelAsList.add(displayLabel);
         if (aa.graph == AlignmentAnnotation.LINE_GRAPH
@@ -239,4 +239,42 @@ public class AlignmentAnnotationUtils
     return (anns == null ? Collections.<AlignmentAnnotation> emptyList()
             : Arrays.asList(anns));
   }
+
+  /**
+   * replace an existing sequence associated annotation with another, creating
+   * association as necessary.
+   * 
+   * @param newAnnot
+   *          - annotation row associated with a sequence to be propagated to
+   *          its reference annotation
+   * @param typeName
+   *          - label used to match existing row
+   * @param calcId
+   *          - calcId for existing row
+   */
+  public static void replaceAnnotationOnAlignmentWith(
+          AlignmentAnnotation newAnnot, String typeName, String calcId)
+  {
+    if (newAnnot.sequenceRef != null)
+    {
+      SequenceI dsseq = newAnnot.sequenceRef;
+      while (dsseq.getDatasetSequence() != null)
+      {
+        dsseq = dsseq.getDatasetSequence();
+      }
+      // look for same annotation on dataset and lift this one over
+      List<AlignmentAnnotation> dsan = dsseq.getAlignmentAnnotations(calcId,
+              typeName);
+      if (dsan != null && dsan.size() > 0)
+      {
+        for (AlignmentAnnotation dssan : dsan)
+        {
+          dsseq.removeAlignmentAnnotation(dssan);
+        }
+      }
+      AlignmentAnnotation dssan = new AlignmentAnnotation(newAnnot);
+      dsseq.addAlignmentAnnotation(dssan);
+      dssan.adjustForAlignment();
+    }
+  }
 }