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
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
* 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
this.dbname = dbname;\r
this.dbrefname = dbrefname;\r
this.coordsys = coordsys;\r
+ this.connprops=connprops;\r
}\r
\r
public String getAccessionSeparator()\r
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>();\r
+ List<String> toks = new ArrayList<String>(), src = new ArrayList<String>(), acIds = new ArrayList<String>();\r
while (st.hasMoreTokens())\r
{\r
- toks.add(st.nextToken());\r
+ String t;\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
}\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
{\r
String lbl = e.getId();\r
\r
- if (toks.indexOf(lbl) == -1)\r
+ if (acIds.indexOf(lbl) == -1)\r
{\r
System.err\r
.println("Warning - received sequence event for strange accession code ("\r
+ 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
}\r
}\r
\r
- if (seqs != null && seqs.size() == 0)\r
+ if (seqs == null || seqs.size() == 0)\r
return null;\r
SequenceI[] sqs = new SequenceI[seqs.size()];\r
for (int i = 0, iSize = seqs.size(); i < iSize; i++)\r
{\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