BatchSize now 10
[jalview.git] / src / jalview / io / DasSequenceFeatureFetcher.java
index 20ae27c..ad2e37b 100755 (executable)
@@ -1,6 +1,6 @@
 /*\r
 * Jalview - A Sequence Alignment Editor and Viewer\r
-* Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+* Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
 *\r
 * This program is free software; you can redistribute it and/or\r
 * modify it under the terms of the GNU General Public License\r
@@ -27,7 +27,6 @@ import java.util.*;
 import java.net.URL;\r
 \r
 import org.biojava.dasobert.das.FeatureThread;\r
-import org.biojava.dasobert.dasregistry.Das1Source;\r
 import org.biojava.dasobert.eventmodel.FeatureEvent;\r
 import org.biojava.dasobert.eventmodel.FeatureListener;\r
 import org.biojava.dasobert.dasregistry.DasSource;\r
@@ -59,6 +58,7 @@ public class DasSequenceFeatureFetcher implements Runnable
 \r
   long startTime;\r
   int threadsRunning = 0;\r
+  boolean allBatchesComplete = false;\r
 \r
 \r
   /**\r
@@ -83,7 +83,7 @@ public class DasSequenceFeatureFetcher implements Runnable
       DasCoordinateSystem[] coords = source.getCoordinateSystem();\r
       for (int c = 0; c < coords.length; c++)\r
       {\r
-        if (coords[c].getName().equalsIgnoreCase("UniProt"))\r
+        if (coords[c].getName().indexOf("UniProt")>-1)\r
         {\r
           uniprotCount++;\r
           break;\r
@@ -94,17 +94,14 @@ public class DasSequenceFeatureFetcher implements Runnable
     int refCount = 0;\r
     for(int i=0; i<sequences.length; i++)\r
     {\r
-      Vector dbref = sequences[i].getDBRef();\r
+      DBRefEntry [] dbref = sequences[i].getDBRef();\r
       if(dbref!=null)\r
       {\r
-        for(int j=0; j<dbref.size(); j++)\r
+        for(int j=0; j<dbref.length; j++)\r
         {\r
-          System.out.println(dbref.elementAt(j)\r
-                             +" "+jalview.datamodel.DBRefSource.UNIPROT);\r
-          if(dbref.elementAt(j)\r
+          if(dbref[j].getSource()\r
              .equals(jalview.datamodel.DBRefSource.UNIPROT))\r
           {\r
-            System.out.println("got a match");\r
             refCount++;\r
             break;\r
           }\r
@@ -112,7 +109,6 @@ public class DasSequenceFeatureFetcher implements Runnable
       }\r
     }\r
 \r
-   System.out.println(refCount+" "+uniprotCount+" "+sequences.length);\r
     if(refCount<sequences.length && uniprotCount>0)\r
     {\r
 \r
@@ -125,21 +121,38 @@ public class DasSequenceFeatureFetcher implements Runnable
 \r
      if(reply == JOptionPane.YES_OPTION)\r
      {\r
-       new DBRefFetcher(\r
-             af.getViewport().getAlignment(), af).fetchDBRefs(true);\r
-\r
+       Thread thread = new Thread(new FetchDBRefs());\r
+       thread.start();\r
      }\r
+     else\r
+      startFetching();\r
     }\r
+    else\r
+      startFetching();\r
 \r
-   System.out.println("User selection is "\r
-                      +\r
+  /* System.out.println("User selection is "   +\r
                        ( ( (float) uniprotCount / (float) selectedSources.size()) * 100)\r
                       + " % Uniprot,  and "+refCount+" / " +sequences.length+" have uniprot accession");\r
+*/\r
+  }\r
 \r
-\r
+  void startFetching()\r
+  {\r
     Thread thread = new Thread(this);\r
     thread.start();\r
   }\r
+\r
+  class FetchDBRefs implements Runnable\r
+  {\r
+    public void run()\r
+    {\r
+      new DBRefFetcher(\r
+             af.getViewport().getAlignment(), af).fetchDBRefs(true);\r
+      startFetching();\r
+    }\r
+  }\r
+\r
+\r
   /**\r
    * creates a jalview sequence feature from a das feature document\r
    * @param dasfeature\r
@@ -193,11 +206,12 @@ public class DasSequenceFeatureFetcher implements Runnable
                                //  null\r
                        // );\r
 \r
-                     // System.out.println(nickname+" "+f.getType()+" "+f.begin+" "+f.end);\r
          return f;\r
          }\r
          catch (Exception e) {\r
+            System.out.println("ERRR "+e);\r
             e.printStackTrace();\r
+            System.out.println("############");\r
                  Cache.log.debug("Failed to parse "+dasfeature.toString(), e);\r
                  return null;\r
          }\r
@@ -227,9 +241,8 @@ public class DasSequenceFeatureFetcher implements Runnable
           {\r
             setThreadsRunning(+1);\r
 \r
-            int start=seq.getStart(), end = seq.getEnd();\r
-\r
-            if(af.getViewport().getSelectionGroup()!=null)\r
+          //  int start=seq.getStart(), end = seq.getEnd();\r
+          /*  if(af.getViewport().getSelectionGroup()!=null)\r
             {\r
               SequenceI tmp = af.getViewport().getAlignment().findName(seq.getName());\r
               start = tmp.findPosition(\r
@@ -239,10 +252,12 @@ public class DasSequenceFeatureFetcher implements Runnable
               end = tmp.findPosition(\r
                  af.getViewport().getSelectionGroup().getEndRes()\r
                  );\r
-            }\r
+            }*/\r
 \r
             FeatureThread fetcher = new FeatureThread(id\r
-               +  ":" + start + "," + end, source);\r
+                                                   //  +  ":" + start + "," + end,\r
+                                                      , source);\r
+\r
 \r
             fetcher.addFeatureListener(new FeatureListener()\r
             {\r
@@ -296,8 +311,13 @@ public class DasSequenceFeatureFetcher implements Runnable
   synchronized void setThreadsRunning(int i)\r
   {\r
     threadsRunning += i;\r
-    if(threadsRunning<1)\r
+    if(threadsRunning<1 && allBatchesComplete)\r
+    {\r
       af.setProgressBar("DAS Feature Fetching Complete", startTime);\r
+\r
+      if(af.featureSettings!=null)\r
+        af.featureSettings.setTableData();\r
+    }\r
   }\r
 \r
   /**\r
@@ -339,10 +359,21 @@ public class DasSequenceFeatureFetcher implements Runnable
 \r
     try\r
     {\r
+      //We must limit the feature fetching to 20 to prevent\r
+      //Servers being overloaded with too many requests\r
+      int batchCount = 0;\r
+      int batchMaxSize = 10;\r
       int seqIndex = 0;\r
       while (seqIndex < sequences.length)\r
       {\r
-          Vector uprefs = jalview.util.DBRefUtils.selectRefs(sequences[seqIndex].getDBRef(),\r
+          batchCount ++;\r
+          if(batchCount>=batchMaxSize)\r
+          {\r
+            waitTillBatchComplete();\r
+            batchCount = 0;\r
+          }\r
+\r
+          DBRefEntry [] uprefs = jalview.util.DBRefUtils.selectRefs(sequences[seqIndex].getDBRef(),\r
               new String[]  {\r
               jalview.datamodel.DBRefSource.PDB,\r
               jalview.datamodel.DBRefSource.UNIPROT});\r
@@ -354,15 +385,14 @@ public class DasSequenceFeatureFetcher implements Runnable
             if (uprefs != null)\r
             {\r
               // we know the id for this entry, so don't note its ID in the unknownSequences list\r
-              for (int j = 0;  j < uprefs.size(); j++)\r
+              for (int j = 0;  j < uprefs.length; j++)\r
               {\r
 \r
                 // Will have to pass any mapping information to the fetcher - the start/end for the DBRefEntry may not be the same as the sequence's start/end\r
-                org.biojava.dasobert.dasregistry.DasCoordinateSystem cs[] = dasSource.getCoordinateSystem();\r
+                DasCoordinateSystem cs[] = dasSource.getCoordinateSystem();\r
                 for (int l=0; l<cs.length; l++)\r
                 {\r
-                  if (jalview.util.DBRefUtils.isDasCoordinateSystem(cs[l].getName(), (DBRefEntry)\r
-                      uprefs.get(j)))\r
+                  if (jalview.util.DBRefUtils.isDasCoordinateSystem(cs[l].getName(), uprefs[j]))\r
                   {\r
                     Cache.log.debug("Launched fetcher for coordinate system " +\r
                                     cs[l].getName());\r
@@ -370,8 +400,7 @@ public class DasSequenceFeatureFetcher implements Runnable
 \r
                     createFeatureFetcher(sequences[seqIndex],\r
                                          dasSource.getUrl(),\r
-                                         ( (DBRefEntry) uprefs.get(j)).\r
-                                         getAccessionId(),\r
+                                          uprefs[j].getAccessionId(),\r
                                          dasSource.getNickname());\r
                   }\r
                 }\r
@@ -408,6 +437,22 @@ public class DasSequenceFeatureFetcher implements Runnable
     {\r
       ex.printStackTrace();\r
     }\r
+    allBatchesComplete = true;\r
+  }\r
+\r
+  void waitTillBatchComplete()\r
+  {\r
+    while( threadsRunning > 0 )\r
+    {\r
+      try{\r
+        Thread.sleep(500);\r
+\r
+      }catch(Exception ex)\r
+      {\r
+        ex.printStackTrace();\r
+      }\r
+    }\r
+\r
   }\r
 \r
 \r