2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
\r
3 * Copyright (C) 2011 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
\r
5 * This file is part of Jalview.
\r
7 * Jalview is free software: you can redistribute it and/or
\r
8 * modify it under the terms of the GNU General Public License
\r
9 * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
\r
11 * Jalview is distributed in the hope that it will be useful, but
\r
12 * WITHOUT ANY WARRANTY; without even the implied warranty
\r
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
\r
14 * PURPOSE. See the GNU General Public License for more details.
\r
16 * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
\r
18 package jalview.ws.dbsources.das.datamodel;
\r
20 import java.util.ArrayList;
\r
21 import java.util.HashMap;
\r
22 import java.util.List;
\r
23 import java.util.Map;
\r
24 import java.util.StringTokenizer;
\r
25 import java.util.Vector;
\r
27 import org.biodas.jdas.client.adapters.sequence.DasSequenceAdapter;
\r
28 import org.biodas.jdas.client.threads.SequenceClientMultipleSources;
\r
29 import org.biodas.jdas.schema.sequence.SEQUENCE;
\r
30 import org.biodas.jdas.schema.sources.COORDINATES;
\r
31 import org.biodas.jdas.schema.sources.SOURCE;
\r
32 import org.biodas.jdas.schema.sources.VERSION;
\r
34 import com.stevesoft.pat.Regex;
\r
36 import jalview.ws.dbsources.das.api.jalviewSourceI;
\r
37 import jalview.ws.seqfetcher.*;
\r
38 import jalview.bin.Cache;
\r
39 import jalview.datamodel.Alignment;
\r
40 import jalview.datamodel.AlignmentI;
\r
41 import jalview.datamodel.DBRefEntry;
\r
42 import jalview.datamodel.Sequence;
\r
43 import jalview.datamodel.SequenceI;
\r
46 * an instance of this class is created for each unique DAS Sequence source (ie
\r
47 * one capable of handling the 'sequence' for a particular MapMaster)
\r
52 public class DasSequenceSource extends DbSourceProxyImpl implements
\r
55 private jalviewSourceI jsrc;
\r
57 protected SOURCE source = null;
\r
59 protected VERSION version = null;
\r
61 protected COORDINATES coordsys = null;
\r
63 protected String dbname = "DASCS";
\r
65 protected String dbrefname = "das:source";
\r
68 * create a new DbSource proxy for a DAS 1 source
\r
71 * Human Readable Name to use when fetching from this source
\r
73 * DbRefName for DbRefs attached to sequences retrieved from this
\r
78 * specific coordinate system to use for this source
\r
80 * if source is not capable of the 'sequence' command
\r
82 public DasSequenceSource(String dbname, String dbrefname, SOURCE source,
\r
83 VERSION version, COORDINATES coordsys) throws Exception
\r
85 if (!(jsrc = new JalviewSource(source, false)).isSequenceSource())
\r
87 throw new Exception("Source " + source.getTitle()
\r
88 + " does not support the sequence command.");
\r
90 this.source = source;
\r
91 this.dbname = dbname;
\r
92 this.dbrefname = dbrefname;
\r
93 this.coordsys = coordsys;
\r
96 public String getAccessionSeparator()
\r
101 public Regex getAccessionValidator()
\r
104 return Regex.perlCode("\\S+");
\r
107 public String getDbName()
\r
110 return dbname + " (DAS)";
\r
113 public String getDbSource()
\r
118 public String getDbVersion()
\r
120 return coordsys.getVersion();
\r
124 public AlignmentI getSequenceRecords(String queries) throws Exception
\r
126 StringTokenizer st = new StringTokenizer(queries, "\t");
\r
127 List<String> toks = new ArrayList<String>(), src = new ArrayList<String>();
\r
128 while (st.hasMoreTokens())
\r
130 toks.add(st.nextToken());
\r
132 src.add(jsrc.getSourceURL());
\r
133 Map<String, Map<List<String>, DasSequenceAdapter>> resultset = new HashMap<String, Map<List<String>, DasSequenceAdapter>>();
\r
134 Map<String, Map<List<String>, Exception>> errors = new HashMap<String, Map<List<String>, Exception>>();
\r
135 SequenceClientMultipleSources sclient;
\r
136 sclient = new SequenceClientMultipleSources();
\r
137 sclient.fetchData(src, toks, resultset, errors);
\r
138 sclient.shutDown();
\r
139 while (!sclient.isTerminated())
\r
141 try {Thread.sleep(200);
\r
143 } catch (InterruptedException x) {}
\r
146 if (resultset.isEmpty())
\r
148 System.err.println("Sequence Query to " + jsrc.getTitle() + " with '"
\r
149 + queries + "' returned no sequences.");
\r
154 Vector<SequenceI> seqs=null;
\r
155 for (Map.Entry<String, Map<List<String>, DasSequenceAdapter>> resset : resultset
\r
158 for (Map.Entry<List<String>, DasSequenceAdapter> result : resset
\r
159 .getValue().entrySet())
\r
161 DasSequenceAdapter dasseqresp = result.getValue();
\r
162 List<String> accessions = result.getKey();
\r
163 for (SEQUENCE e : dasseqresp.getSequence())
\r
165 String lbl = e.getId();
\r
167 if (toks.indexOf(lbl) == -1)
\r
170 .println("Warning - received sequence event for strange accession code ("
\r
177 if (e.getContent().length() == 0)
\r
180 .println("Empty sequence returned for accession code ("
\r
189 seqs = new java.util.Vector<SequenceI>();
\r
190 // JDAS returns a sequence complete with any newlines and spaces in the XML
\r
191 Sequence sq = new Sequence(lbl, e.getContent().replaceAll("\\s+", ""));
\r
192 sq.addDBRef(new DBRefEntry(getDbSource(), getDbVersion()
\r
193 + ":" + e.getVersion(), lbl));
\r
194 seqs.addElement(sq);
\r
200 if (seqs != null && seqs.size() == 0)
\r
202 SequenceI[] sqs = new SequenceI[seqs.size()];
\r
203 for (int i = 0, iSize = seqs.size(); i < iSize; i++)
\r
205 sqs[i] = (SequenceI) seqs.elementAt(i);
\r
207 Alignment al = new Alignment(sqs);
\r
208 if (jsrc.isFeatureSource())
\r
210 java.util.Vector<jalviewSourceI> srcs = new java.util.Vector<jalviewSourceI>();
\r
211 srcs.addElement(jsrc);
\r
213 new jalview.ws.DasSequenceFeatureFetcher(sqs, null, srcs, false,
\r
215 } catch (Exception x)
\r
217 Cache.log.error("Couldn't retrieve features for sequence from its source.",x);
\r
225 public String getTestQuery()
\r
227 return coordsys.getTestRange();
\r
230 public boolean isValidReference(String accession)
\r
232 // TODO try to validate an accession against source
\r
233 // We don't really know how to do this without querying source
\r
239 * @return the source
\r
241 public SOURCE getSource()
\r
247 * @return the coordsys
\r
249 public COORDINATES getCoordsys()
\r