From 996d3319402197c787ced05f24b201cc66f6ed50 Mon Sep 17 00:00:00 2001 From: jprocter Date: Thu, 10 May 2012 16:04:06 +0100 Subject: [PATCH] JAL-1083 graceful failover to one ID per sequences query for sources that fail for multiple ID queries --- .../dbsources/das/datamodel/DasSequenceSource.java | 82 +++++++++++++++++--- 1 file changed, 70 insertions(+), 12 deletions(-) diff --git a/src/jalview/ws/dbsources/das/datamodel/DasSequenceSource.java b/src/jalview/ws/dbsources/das/datamodel/DasSequenceSource.java index 22950f4..3883245 100644 --- a/src/jalview/ws/dbsources/das/datamodel/DasSequenceSource.java +++ b/src/jalview/ws/dbsources/das/datamodel/DasSequenceSource.java @@ -18,12 +18,14 @@ package jalview.ws.dbsources.das.datamodel; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.Vector; +import org.biodas.jdas.client.SequenceClient; import org.biodas.jdas.client.adapters.sequence.DasSequenceAdapter; import org.biodas.jdas.client.threads.SequenceClientMultipleSources; import org.biodas.jdas.schema.sequence.SEQUENCE; @@ -124,27 +126,83 @@ public class DasSequenceSource extends DbSourceProxyImpl implements public AlignmentI getSequenceRecords(String queries) throws Exception { StringTokenizer st = new StringTokenizer(queries, "\t"); - List toks = new ArrayList(), src = new ArrayList(),acIds=new ArrayList(); + List toks = new ArrayList(), src = new ArrayList(), acIds = new ArrayList(); while (st.hasMoreTokens()) { String t; - toks.add(t=st.nextToken()); + toks.add(t = st.nextToken()); acIds.add(t.replaceAll(":[0-9,]+", "")); } src.add(jsrc.getSourceURL()); Map, DasSequenceAdapter>> resultset = new HashMap, DasSequenceAdapter>>(); Map, Exception>> errors = new HashMap, Exception>>(); - SequenceClientMultipleSources sclient; - sclient = new SequenceClientMultipleSources(); - sclient.fetchData(src, toks, resultset, errors); - sclient.shutDown(); - while (!sclient.isTerminated()) + + // First try multiple sources + boolean multiple = true, retry = false; + do { - try {Thread.sleep(200); - - } catch (InterruptedException x) {} - } - + if (!multiple) + { + retry = false; + // slow, fetch one at a time. + for (String sr : src) + { + System.err + .println("Retrieving IDs individually from das source: " + + sr); + // todo : get conn property provider + org.biodas.jdas.client.SequenceClient sq = new SequenceClient(); + for (String q : toks) + { + List qset = Arrays.asList(new String[] + { q }); + try + { + DasSequenceAdapter s = sq.fetchData(sr, qset); + Map, DasSequenceAdapter> dss = resultset.get(sr); + if (dss == null) + { + resultset + .put(sr, + dss = new HashMap, DasSequenceAdapter>()); + } + dss.put(qset, s); + } catch (Exception x) + { + Map, Exception> ers = errors.get(sr); + if (ers == null) + { + errors.put(sr, ers = new HashMap, Exception>()); + } + ers.put(qset, x); + } + } + } + } + else + { + SequenceClientMultipleSources sclient; + sclient = new SequenceClientMultipleSources(); + sclient.fetchData(src, toks, resultset, errors); + sclient.shutDown(); + while (!sclient.isTerminated()) + { + try + { + Thread.sleep(200); + + } catch (InterruptedException x) + { + } + } + if (resultset.isEmpty() && !errors.isEmpty()) + { + retry = true; + multiple = false; + } + } + } while (retry); + if (resultset.isEmpty()) { System.err.println("Sequence Query to " + jsrc.getTitle() + " with '" -- 1.7.10.2