2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
3 * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
11 * Jalview is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
18 package jalview.ws.dbsources.das.datamodel;
20 import java.util.ArrayList;
21 import java.util.Arrays;
22 import java.util.HashMap;
23 import java.util.List;
25 import java.util.StringTokenizer;
26 import java.util.Vector;
28 import org.biodas.jdas.client.SequenceClient;
29 import org.biodas.jdas.client.adapters.sequence.DasSequenceAdapter;
30 import org.biodas.jdas.client.threads.MultipleConnectionPropertyProviderI;
31 import org.biodas.jdas.client.threads.SequenceClientMultipleSources;
32 import org.biodas.jdas.schema.sequence.SEQUENCE;
33 import org.biodas.jdas.schema.sources.COORDINATES;
34 import org.biodas.jdas.schema.sources.SOURCE;
35 import org.biodas.jdas.schema.sources.VERSION;
37 import com.stevesoft.pat.Regex;
39 import jalview.ws.dbsources.das.api.jalviewSourceI;
40 import jalview.ws.seqfetcher.*;
41 import jalview.bin.Cache;
42 import jalview.datamodel.Alignment;
43 import jalview.datamodel.AlignmentI;
44 import jalview.datamodel.DBRefEntry;
45 import jalview.datamodel.Sequence;
46 import jalview.datamodel.SequenceI;
49 * an instance of this class is created for each unique DAS Sequence source (ie
50 * one capable of handling the 'sequence' for a particular MapMaster)
55 public class DasSequenceSource extends DbSourceProxyImpl implements
58 private jalviewSourceI jsrc;
60 protected SOURCE source = null;
62 protected VERSION version = null;
64 protected COORDINATES coordsys = null;
66 protected String dbname = "DASCS";
68 protected String dbrefname = "das:source";
70 protected MultipleConnectionPropertyProviderI connprops = null;
73 * DAS sources are tier 1 - if we have a direct DB connection then we should prefer it
78 * create a new DbSource proxy for a DAS 1 source
81 * Human Readable Name to use when fetching from this source
83 * DbRefName for DbRefs attached to sequences retrieved from this
88 * specific coordinate system to use for this source
90 * if source is not capable of the 'sequence' command
92 public DasSequenceSource(String dbname, String dbrefname, SOURCE source,
93 VERSION version, COORDINATES coordsys,
94 MultipleConnectionPropertyProviderI connprops) throws Exception
96 if (!(jsrc = new JalviewSource(source, connprops, false))
99 throw new Exception("Source " + source.getTitle()
100 + " does not support the sequence command.");
102 this.source = source;
103 this.dbname = dbname;
104 this.dbrefname = dbrefname.toUpperCase();
105 if (coordsys != null)
107 this.coordsys = coordsys;
109 this.connprops = connprops;
112 public String getAccessionSeparator()
117 public Regex getAccessionValidator()
120 return Regex.perlCode("m/([^:]+)(:\\d+,\\d+)?/");
123 public String getDbName()
126 return dbname + " (DAS)";
129 public String getDbSource()
134 public String getDbVersion()
136 return coordsys != null ? coordsys.getVersion() : "";
139 public AlignmentI getSequenceRecords(String queries) throws Exception
141 StringTokenizer st = new StringTokenizer(queries, "\t");
142 List<String> toks = new ArrayList<String>(), src = new ArrayList<String>(), acIds = new ArrayList<String>();
143 while (st.hasMoreTokens())
146 toks.add(t = st.nextToken());
147 acIds.add(t.replaceAll(":[0-9,]+", ""));
149 src.add(jsrc.getSourceURL());
150 Map<String, Map<List<String>, DasSequenceAdapter>> resultset = new HashMap<String, Map<List<String>, DasSequenceAdapter>>();
151 Map<String, Map<List<String>, Exception>> errors = new HashMap<String, Map<List<String>, Exception>>();
153 // First try multiple sources
154 boolean multiple = true, retry = false;
160 // slow, fetch one at a time.
161 for (String sr : src)
164 .println("Retrieving IDs individually from das source: "
166 org.biodas.jdas.client.SequenceClient sq = new SequenceClient(
167 connprops.getConnectionPropertyProviderFor(sr));
168 for (String q : toks)
170 List<String> qset = Arrays.asList(new String[]
174 DasSequenceAdapter s = sq.fetchData(sr, qset);
175 Map<List<String>, DasSequenceAdapter> dss = resultset.get(sr);
180 dss = new HashMap<List<String>, DasSequenceAdapter>());
183 } catch (Exception x)
185 Map<List<String>, Exception> ers = errors.get(sr);
188 errors.put(sr, ers = new HashMap<List<String>, Exception>());
197 SequenceClientMultipleSources sclient;
198 sclient = new SequenceClientMultipleSources();
199 sclient.fetchData(src, toks, resultset, errors);
201 while (!sclient.isTerminated())
207 } catch (InterruptedException x)
211 if (resultset.isEmpty() && !errors.isEmpty())
219 if (resultset.isEmpty())
221 System.err.println("Sequence Query to " + jsrc.getTitle() + " with '"
222 + queries + "' returned no sequences.");
227 Vector<SequenceI> seqs = null;
228 for (Map.Entry<String, Map<List<String>, DasSequenceAdapter>> resset : resultset
231 for (Map.Entry<List<String>, DasSequenceAdapter> result : resset
232 .getValue().entrySet())
234 DasSequenceAdapter dasseqresp = result.getValue();
235 List<String> accessions = result.getKey();
236 for (SEQUENCE e : dasseqresp.getSequence())
238 String lbl = e.getId();
240 if (acIds.indexOf(lbl) == -1)
243 .println("Warning - received sequence event for strange accession code ("
250 if (e.getContent().length() == 0)
253 .println("Empty sequence returned for accession code ("
257 + " (source is " + getDbName());
261 seqs = new java.util.Vector<SequenceI>();
262 // JDAS returns a sequence complete with any newlines and spaces
264 Sequence sq = new Sequence(lbl, e.getContent().replaceAll(
266 sq.setStart(e.getStart().intValue());
267 sq.addDBRef(new DBRefEntry(getDbSource(), getDbVersion()
268 + ":" + e.getVersion(), lbl));
275 if (seqs == null || seqs.size() == 0)
277 SequenceI[] sqs = new SequenceI[seqs.size()];
278 for (int i = 0, iSize = seqs.size(); i < iSize; i++)
280 sqs[i] = (SequenceI) seqs.elementAt(i);
282 Alignment al = new Alignment(sqs);
283 if (jsrc.isFeatureSource())
285 java.util.Vector<jalviewSourceI> srcs = new java.util.Vector<jalviewSourceI>();
286 srcs.addElement(jsrc);
289 jalview.ws.DasSequenceFeatureFetcher dssf = new jalview.ws.DasSequenceFeatureFetcher(
290 sqs, null, srcs, false, false, multiple);
291 while (dssf.isRunning())
296 } catch (InterruptedException x)
302 } catch (Exception x)
305 .error("Couldn't retrieve features for sequence from its source.",
314 public String getTestQuery()
316 return coordsys == null ? "" : coordsys.getTestRange();
319 public boolean isValidReference(String accession)
321 // TODO try to validate an accession against source
322 // We don't really know how to do this without querying source
330 public SOURCE getSource()
336 * @return the coordsys
338 public COORDINATES getCoordsys()