JAL-3253-applet JAL-3397 JAL-3383 fast IntervalStore for JavaScript
[jalview.git] / src / jalview / analysis / CrossRef.java
index 4f01cea..dbad53e 100644 (file)
@@ -31,13 +31,14 @@ import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
 import jalview.util.DBRefUtils;
 import jalview.util.MapList;
-import jalview.ws.SequenceFetcherFactory;
-import jalview.ws.seqfetcher.ASequenceFetcher;
+import jalview.ws.SequenceFetcher;
 
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import intervalstore.api.IntervalI;
+
 /**
  * Functions for cross-referencing sequence databases.
  * 
@@ -402,7 +403,6 @@ public class CrossRef
   private void retrieveCrossRef(List<DBRefEntry> sourceRefs, SequenceI seq,
           List<DBRefEntry> xrfs, boolean fromDna, AlignedCodonFrame cf)
   {
-    ASequenceFetcher sftch = SequenceFetcherFactory.getSequenceFetcher();
     SequenceI[] retrieved = null;
     SequenceI dss = seq.getDatasetSequence() == null ? seq
             : seq.getDatasetSequence();
@@ -418,7 +418,8 @@ public class CrossRef
     }
     try
     {
-      retrieved = sftch.getSequences(sourceRefs, !fromDna);
+      retrieved = SequenceFetcher.getInstance()
+              .getSequences(sourceRefs, !fromDna);
     } catch (Exception e)
     {
       System.err.println(
@@ -483,9 +484,9 @@ public class CrossRef
   private void removeAlreadyRetrievedSeqs(List<DBRefEntry> sourceRefs,
           boolean fromDna)
   {
-    List<DBRefEntry> dbrSourceSet = new ArrayList<DBRefEntry>(sourceRefs);
+    List<DBRefEntry> dbrSourceSet = new ArrayList<>(sourceRefs);
     List<SequenceI> dsSeqs = dataset.getSequences();
-    for (int ids = dsSeqs.size(); --ids >= 0;)
+    for (int ids = 0, nds = dsSeqs.size(); ids < nds; ids++)
     {
       SequenceI sq = dsSeqs.get(ids);
       boolean dupeFound = false;
@@ -494,11 +495,11 @@ public class CrossRef
       if (sq.isProtein() == fromDna)
       {
        List<DBRefEntry> sqdbrefs = sq.getPrimaryDBRefs();
-        for (int idb = sqdbrefs.size(); --idb >= 0;)
+        for (int idb = 0, ndb = sqdbrefs.size(); idb < ndb; idb++)
         {
           DBRefEntry dbr = sqdbrefs.get(idb);  
           List<DBRefEntry> searchrefs = DBRefUtils.searchRefs(dbrSourceSet, dbr, DBRefUtils.SEARCH_MODE_FULL);
-          for (int isr = searchrefs.size(); --isr >= 0;)
+          for (int isr = 0, nsr = searchrefs.size(); isr < nsr; isr++)
           {
             sourceRefs.remove(searchrefs.get(isr));
             dupeFound = true;
@@ -638,12 +639,23 @@ public class CrossRef
                    */
                   SequenceFeature newFeature = new SequenceFeature(feat)
                   {
+                    // BH 2019.08.15 We must override equalsInterval, not
+                    // equals, because that is part of the IntervalI interface,
+                    // and IntervalStore may need that for proper, faster
+                    // processing.
+                    // @Override
+                    // public boolean equals(Object o)
+                    // {
+                    // return super.equals(o, true);
+                    // }
+                    //
                     @Override
-                    public boolean equals(Object o)
+                    public boolean equalsInterval(IntervalI sf)
                     {
-                      return super.equals(o, true);
+                      return equals((SequenceFeature) sf, true);
                     }
                   };
+
                   matched.addSequenceFeature(newFeature);
                 }
               }