JAL-1083 graceful failover to one ID per sequences query for sources that fail for...
authorjprocter <jprocter@compbio.dundee.ac.uk>
Thu, 10 May 2012 15:04:06 +0000 (16:04 +0100)
committerjprocter <jprocter@compbio.dundee.ac.uk>
Thu, 10 May 2012 15:04:06 +0000 (16:04 +0100)
src/jalview/ws/dbsources/das/datamodel/DasSequenceSource.java

index 22950f4..3883245 100644 (file)
 package jalview.ws.dbsources.das.datamodel;\r
 \r
 import java.util.ArrayList;\r
+import java.util.Arrays;\r
 import java.util.HashMap;\r
 import java.util.List;\r
 import java.util.Map;\r
 import java.util.StringTokenizer;\r
 import java.util.Vector;\r
 \r
+import org.biodas.jdas.client.SequenceClient;\r
 import org.biodas.jdas.client.adapters.sequence.DasSequenceAdapter;\r
 import org.biodas.jdas.client.threads.SequenceClientMultipleSources;\r
 import org.biodas.jdas.schema.sequence.SEQUENCE;\r
@@ -124,27 +126,83 @@ public class DasSequenceSource extends DbSourceProxyImpl implements
   public AlignmentI getSequenceRecords(String queries) throws Exception\r
   {\r
     StringTokenizer st = new StringTokenizer(queries, "\t");\r
-    List<String> toks = new ArrayList<String>(), src = new ArrayList<String>(),acIds=new ArrayList<String>();\r
+    List<String> toks = new ArrayList<String>(), src = new ArrayList<String>(), acIds = new ArrayList<String>();\r
     while (st.hasMoreTokens())\r
     {\r
       String t;\r
-      toks.add(t=st.nextToken());\r
+      toks.add(t = st.nextToken());\r
       acIds.add(t.replaceAll(":[0-9,]+", ""));\r
     }\r
     src.add(jsrc.getSourceURL());\r
     Map<String, Map<List<String>, DasSequenceAdapter>> resultset = new HashMap<String, Map<List<String>, DasSequenceAdapter>>();\r
     Map<String, Map<List<String>, Exception>> errors = new HashMap<String, Map<List<String>, Exception>>();\r
-    SequenceClientMultipleSources sclient;\r
-    sclient = new SequenceClientMultipleSources();\r
-    sclient.fetchData(src, toks, resultset, errors);\r
-    sclient.shutDown();\r
-    while (!sclient.isTerminated())\r
+    \r
+    // First try multiple sources\r
+    boolean multiple = true, retry = false;\r
+    do\r
     {\r
-      try {Thread.sleep(200);\r
-      \r
-      } catch (InterruptedException x) {}\r
-    }\r
-            \r
+      if (!multiple)\r
+      {\r
+        retry = false;\r
+        // slow, fetch one at a time.\r
+        for (String sr : src)\r
+        {\r
+          System.err\r
+                  .println("Retrieving IDs individually from das source: "\r
+                          + sr);\r
+          // todo : get conn property provider\r
+          org.biodas.jdas.client.SequenceClient sq = new SequenceClient();\r
+          for (String q : toks)\r
+          {\r
+            List<String> qset = Arrays.asList(new String[]\r
+            { q });\r
+            try\r
+            {\r
+              DasSequenceAdapter s = sq.fetchData(sr, qset);\r
+              Map<List<String>, DasSequenceAdapter> dss = resultset.get(sr);\r
+              if (dss == null)\r
+              {\r
+                resultset\r
+                        .put(sr,\r
+                                dss = new HashMap<List<String>, DasSequenceAdapter>());\r
+              }\r
+              dss.put(qset, s);\r
+            } catch (Exception x)\r
+            {\r
+              Map<List<String>, Exception> ers = errors.get(sr);\r
+              if (ers == null)\r
+              {\r
+                errors.put(sr, ers = new HashMap<List<String>, Exception>());\r
+              }\r
+              ers.put(qset, x);\r
+            }\r
+          }\r
+        }\r
+      }\r
+      else\r
+      {\r
+        SequenceClientMultipleSources sclient;\r
+        sclient = new SequenceClientMultipleSources();\r
+        sclient.fetchData(src, toks, resultset, errors);\r
+        sclient.shutDown();\r
+        while (!sclient.isTerminated())\r
+        {\r
+          try\r
+          {\r
+            Thread.sleep(200);\r
+\r
+          } catch (InterruptedException x)\r
+          {\r
+          }\r
+        }\r
+        if (resultset.isEmpty() && !errors.isEmpty())\r
+        {\r
+          retry = true;\r
+          multiple = false;\r
+        }\r
+      }\r
+    } while (retry);\r
+\r
     if (resultset.isEmpty())\r
     {\r
       System.err.println("Sequence Query to " + jsrc.getTitle() + " with '"\r