support for multiple accession retrieval from a database source
[jalview.git] / src / jalview / datamodel / Alignment.java
index 08c04f5..c74be73 100755 (executable)
@@ -441,7 +441,10 @@ public class Alignment implements AlignmentI
     return result;
 
   }
-  /* (non-Javadoc)
+
+  /*
+   * (non-Javadoc)
+   * 
    * @see jalview.datamodel.AlignmentI#findIndex(jalview.datamodel.SequenceI)
    */
   public int findIndex(SequenceI s)
@@ -460,14 +463,17 @@ public class Alignment implements AlignmentI
 
     return -1;
   }
-  /* (non-Javadoc)
+
+  /*
+   * (non-Javadoc)
+   * 
    * @see jalview.datamodel.AlignmentI#findIndex(jalview.datamodel.SearchResults)
    */
   public int findIndex(SearchResults results)
   {
-    int i=0;
-    
-    while (i<sequences.size())
+    int i = 0;
+
+    while (i < sequences.size())
     {
       if (results.involvesSequence(getSequenceAt(i)))
       {
@@ -923,4 +929,109 @@ public class Alignment implements AlignmentI
     return removed;
   }
 
+  public void append(AlignmentI toappend)
+  {
+    // TODO test this method for a future 2.5 release
+    // currently tested for use in jalview.gui.SequenceFetcher
+    boolean samegap = toappend.getGapCharacter()==getGapCharacter();
+    char oldc = toappend.getGapCharacter();
+    boolean hashidden = toappend.getHiddenSequences()!=null && toappend.getHiddenSequences().hiddenSequences!=null;
+    // get all sequences including any hidden ones
+    Vector sqs = (hashidden) ? toappend.getHiddenSequences().getFullAlignment().getSequences() : toappend.getSequences();
+    if (sqs != null)
+    {
+      Enumeration sq = sqs.elements();
+      while (sq.hasMoreElements())
+      {
+        SequenceI addedsq=(SequenceI) sq.nextElement();
+        if (!samegap)
+        {
+          char[] oldseq = addedsq.getSequence();
+          for (int c=0;c<oldseq.length;c++)
+          {
+            if (oldseq[c]==oldc)
+            {
+              oldseq[c] = gapCharacter;
+            }
+          }
+        }
+        addSequence(addedsq);
+      }
+    }
+    AlignmentAnnotation[] alan = toappend.getAlignmentAnnotation();
+    for (int a = 0; alan != null && a < alan.length; a++)
+    {
+      addAnnotation(alan[a]);
+    }
+    AlignedCodonFrame[] acod = toappend.getCodonFrames();
+    for (int a = 0; acod != null && a < acod.length; a++)
+    {
+      this.addCodonFrame(acod[a]);
+    }
+    Vector sg = toappend.getGroups();
+    if (sg != null)
+    {
+      Enumeration el = sg.elements();
+      while (el.hasMoreElements())
+      {
+        addGroup((SequenceGroup) el.nextElement());
+      }
+    }
+    if (toappend.getHiddenSequences()!=null)
+    {
+      HiddenSequences hs = toappend.getHiddenSequences();
+      if (hiddenSequences==null)
+      {
+        hiddenSequences = new HiddenSequences(this);
+      }
+      if (hs.hiddenSequences!=null)
+      {
+        for (int s=0;s<hs.hiddenSequences.length; s++)
+        {
+          // hide the newly appended sequence in the alignment
+          if (hs.hiddenSequences[s]!=null)
+          {
+            hiddenSequences.hideSequence(hs.hiddenSequences[s]);
+          }
+        }
+      }
+    }
+    if (toappend.getProperties()!=null)
+    {
+      // we really can't do very much here - just try to concatenate strings where property collisions occur.
+      Enumeration key = toappend.getProperties().keys();
+      while (key.hasMoreElements())
+      {
+        Object k = key.nextElement();
+        Object ourval = this.getProperty(k);
+        Object toapprop = toappend.getProperty(k);
+        if (ourval!=null)
+        {
+          if (ourval.getClass().equals(toapprop.getClass()) && !ourval.equals(toapprop))
+          {
+            if (ourval instanceof String)
+            {
+              // append strings
+              this.setProperty(k, ((String) ourval)+"; "+((String) toapprop));
+            } else {
+              if (ourval instanceof Vector)
+              {
+                // append vectors
+                Enumeration theirv = ((Vector) toapprop).elements();
+                while (theirv.hasMoreElements())
+                {
+                  ((Vector)ourval).addElement(theirv);
+                }
+              }
+            }
+          }
+        } else {
+          // just add new property directly
+          setProperty(k, toapprop);
+        }
+       
+      }
+    }
+  }
+
 }