JAL-1085 - ensure sequence fetching client waits around until feature retrieval has...
[jalview.git] / src / jalview / ws / dbsources / das / datamodel / DasSequenceSource.java
index 22950f4..5f18331 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.ConnectionPropertyProviderI;\r
+import org.biodas.jdas.client.SequenceClient;\r
 import org.biodas.jdas.client.adapters.sequence.DasSequenceAdapter;\r
+import org.biodas.jdas.client.threads.MultipleConnectionPropertyProviderI;\r
 import org.biodas.jdas.client.threads.SequenceClientMultipleSources;\r
 import org.biodas.jdas.schema.sequence.SEQUENCE;\r
 import org.biodas.jdas.schema.sources.COORDINATES;\r
@@ -63,7 +67,7 @@ public class DasSequenceSource extends DbSourceProxyImpl implements
   protected String dbname = "DASCS";\r
 \r
   protected String dbrefname = "das:source";\r
-\r
+  protected MultipleConnectionPropertyProviderI connprops=null;\r
   /**\r
    * create a new DbSource proxy for a DAS 1 source\r
    * \r
@@ -80,9 +84,9 @@ public class DasSequenceSource extends DbSourceProxyImpl implements
    *           if source is not capable of the 'sequence' command\r
    */\r
   public DasSequenceSource(String dbname, String dbrefname, SOURCE source,\r
-          VERSION version, COORDINATES coordsys) throws Exception\r
+          VERSION version, COORDINATES coordsys, MultipleConnectionPropertyProviderI connprops) throws Exception\r
   {\r
-    if (!(jsrc = new JalviewSource(source, false)).isSequenceSource())\r
+    if (!(jsrc = new JalviewSource(source, connprops, false)).isSequenceSource())\r
     {\r
       throw new Exception("Source " + source.getTitle()\r
               + " does not support the sequence command.");\r
@@ -91,6 +95,7 @@ public class DasSequenceSource extends DbSourceProxyImpl implements
     this.dbname = dbname;\r
     this.dbrefname = dbrefname;\r
     this.coordsys = coordsys;\r
+    this.connprops=connprops;\r
   }\r
 \r
   public String getAccessionSeparator()\r
@@ -120,31 +125,85 @@ public class DasSequenceSource extends DbSourceProxyImpl implements
     return coordsys.getVersion();\r
   }\r
 \r
-\r
   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
+          org.biodas.jdas.client.SequenceClient sq = new SequenceClient(connprops.getConnectionPropertyProviderFor(sr));\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
@@ -153,7 +212,7 @@ public class DasSequenceSource extends DbSourceProxyImpl implements
     }\r
     else\r
     {\r
-      Vector<SequenceI> seqs=null;\r
+      Vector<SequenceI> seqs = null;\r
       for (Map.Entry<String, Map<List<String>, DasSequenceAdapter>> resset : resultset\r
               .entrySet())\r
       {\r
@@ -183,14 +242,15 @@ public class DasSequenceSource extends DbSourceProxyImpl implements
                                   + lbl\r
                                   + ") from "\r
                                   + resset.getKey()\r
-                                  + " (source is "\r
-                                  + getDbName());\r
+                                  + " (source is " + getDbName());\r
                   continue;\r
                 }\r
               }\r
               seqs = new java.util.Vector<SequenceI>();\r
-              // JDAS returns a sequence complete with any newlines and spaces in the XML\r
-              Sequence sq = new Sequence(lbl, e.getContent().replaceAll("\\s+", ""));\r
+              // JDAS returns a sequence complete with any newlines and spaces\r
+              // in the XML\r
+              Sequence sq = new Sequence(lbl, e.getContent().replaceAll(\r
+                      "\\s+", ""));\r
               sq.addDBRef(new DBRefEntry(getDbSource(), getDbVersion()\r
                       + ":" + e.getVersion(), lbl));\r
               seqs.addElement(sq);\r
@@ -211,12 +271,25 @@ public class DasSequenceSource extends DbSourceProxyImpl implements
       {\r
         java.util.Vector<jalviewSourceI> srcs = new java.util.Vector<jalviewSourceI>();\r
         srcs.addElement(jsrc);\r
-        try {\r
-          new jalview.ws.DasSequenceFeatureFetcher(sqs, null, srcs, false,\r
-                false);\r
+        try\r
+        {\r
+          jalview.ws.DasSequenceFeatureFetcher dssf=new jalview.ws.DasSequenceFeatureFetcher(sqs, null, srcs, false,\r
+                  false, multiple);\r
+          while (dssf.isRunning())\r
+          {\r
+            try {\r
+              Thread.sleep(200);\r
+            } catch (InterruptedException x)\r
+            {\r
+              \r
+            }\r
+          }\r
+          \r
         } catch (Exception x)\r
         {\r
-          Cache.log.error("Couldn't retrieve features for sequence from its source.",x);\r
+          Cache.log\r
+                  .error("Couldn't retrieve features for sequence from its source.",\r
+                          x);\r
         }\r
       }\r
 \r