Das client files
[jalview.git] / src / org / biojava / dasobert / das / SequenceThread.java
1 /*
2  *                  BioJava development code
3  *
4  * This code may be freely distributed and modified under the
5  * terms of the GNU Lesser General Public Licence.  This should
6  * be distributed with the code.  If you do not have a copy,
7  * see:
8  *
9  *      http://www.gnu.org/copyleft/lesser.html
10  *
11  * Copyright for this code is held jointly by the individual
12  * authors.  These should be listed in @author doc comments.
13  *
14  * For more information on the BioJava project and its aims,
15  * or to join the biojava-l mailing list, visit the home page
16  * at:
17  *
18  *      http://www.biojava.org/
19  *
20  * Created on Nov 20, 2005
21  *
22  */
23 package org.biojava.dasobert.das;
24
25 import java.io.InputStream;
26 import java.net.HttpURLConnection;
27 import java.net.URL;
28 import java.util.Iterator;
29 import java.util.logging.Level;
30 import java.util.logging.Logger;
31 import javax.xml.parsers.ParserConfigurationException;
32 import javax.xml.parsers.SAXParser;
33 import javax.xml.parsers.SAXParserFactory;
34
35 import org.biojava.dasobert.dasregistry.Das1Source;
36 import org.biojava.dasobert.eventmodel.SequenceEvent;
37 import org.biojava.dasobert.eventmodel.SequenceListener;
38 import org.xml.sax.InputSource;
39 import org.xml.sax.SAXException;
40 import org.xml.sax.SAXNotRecognizedException;
41 import org.xml.sax.XMLReader;
42 import java.util.*;
43
44 /** a thread that gets the sequence from a DAS server
45  *
46  * @author Andreas Prlic
47  *
48  */
49 public class SequenceThread
50 extends Thread {
51
52     Das1Source[] sequenceServers;
53     String sp_accession;
54     List seqListeners;
55     static Logger logger = Logger.getLogger("org.biojava.spice");
56
57      public SequenceThread(String sp_accession,Das1Source ds ) {
58         super();
59         Das1Source[] dss =new Das1Source[1];
60         dss[0] = ds;
61         this.sp_accession = sp_accession;
62         this.sequenceServers =dss ;
63         clearSequenceListeners();
64     }
65     public SequenceThread(String sp_accession,Das1Source[] ds ) {
66         super();
67
68         this.sp_accession = sp_accession;
69         this.sequenceServers =ds ;
70         clearSequenceListeners();
71     }
72
73     public void clearSequenceListeners(){
74         seqListeners = new ArrayList();
75     }
76
77     public void addSequenceListener(SequenceListener lis){
78         seqListeners.add(lis);
79     }
80
81     public void run() {
82         getSequence();
83     }
84
85     public void getSequence( ){
86
87         boolean gotSequence = false ;
88
89         for ( int i = 0 ; i< sequenceServers.length; i++){
90
91             if ( gotSequence ) break ;
92
93             Das1Source ds = sequenceServers[i];
94             String url = ds.getUrl() ;
95             char lastChar = url.charAt(url.length()-1);
96             if ( ! (lastChar == '/') )
97                 url +="/" ;
98             String dascmd = url + "sequence?segment=";
99             String connstr = dascmd + sp_accession ;
100
101             try {
102
103                 String sequence = retrieveSequence(connstr);
104                 // bug in aristotle das source?
105                 sequence.replaceAll(" ","");
106                 gotSequence = true ;
107                 // set the sequence ...
108
109                 triggerNewSequence(sp_accession,sequence);
110
111
112                 return;
113             }
114             catch (Exception ex) {
115                 ex.printStackTrace();
116                 logger.warning(ex.getMessage());
117
118                 //triggerException(ex);
119
120             }
121         }
122
123         logger.log(Level.WARNING,"could not retreive UniProt sequence from any available DAS sequence server");
124
125         triggerNoSequence(sp_accession);
126
127     }
128
129
130
131 //    private void triggerException(Exception e){
132 //        Iterator iter = seqListeners.iterator();
133 //        while (iter.hasNext()){
134 //           SequenceListener li = (SequenceListener)iter.next();
135 //           li.exceptionOccured(e);
136 //        }
137 //    }
138
139     private void triggerNewSequence(String sp_accession,String sequence){
140
141         Iterator iter = seqListeners.iterator();
142         while (iter.hasNext()){
143            SequenceListener li = (SequenceListener)iter.next();
144             //SequenceEvent event = new SequenceEvent(sequence);
145            SequenceEvent event = new SequenceEvent(sp_accession,sequence);
146            li.newSequence(event);
147         }
148     }
149
150     private void triggerNoSequence(String ac){
151
152         Iterator iter = seqListeners.iterator();
153         while (iter.hasNext()){
154             SequenceListener li = (SequenceListener)iter.next();
155             li.noObjectFound(ac);
156         }
157
158     }
159
160     /** retrieve the Sequence from a DAS server.
161      *
162      * @param connstr - the DAS - request string. e.g. http://www.ebi.ac.uk/das-srv/uniprot/das/aristotle/sequence?segment=P00280
163      * @return the requested Sequence
164      * @throws Exception
165      */
166     public String retrieveSequence( String connstr)
167     throws Exception
168     {
169
170         //logger.finest("trying: " + connstr) ;
171         URL dasUrl = new URL(connstr);
172         //DAS_httpConnector dhtp = new DAS_httpConnector() ;
173         logger.info("requesting sequence from " + connstr);
174         InputStream dasInStream =open(dasUrl);
175
176
177         SAXParserFactory spfactory =
178             SAXParserFactory.newInstance();
179
180         // never do this
181         //String vali = System.getProperty("XMLVALIDATION");
182         String vali = "false";
183         boolean validate = false ;
184         if ((vali != null) && ( vali.equals("true")) )
185             validate = true ;
186         spfactory.setValidating(validate);
187
188         SAXParser saxParser = null ;
189
190         try{
191             saxParser =
192                 spfactory.newSAXParser();
193         } catch (ParserConfigurationException e) {
194             //e.printStackTrace();
195             logger.log(Level.FINER,"Uncaught exception", e);
196         }
197
198         XMLReader xmlreader = saxParser.getXMLReader();
199
200         try {
201             xmlreader.setFeature("http://xml.org/sax/features/validation", validate);
202         } catch (SAXException e) {
203             logger.finer("Cannot set validation to " + validate);
204             logger.log(Level.FINER,"Uncaught exception", e);
205         }
206
207         try {
208             xmlreader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",validate);
209         } catch (SAXNotRecognizedException e){
210             //e.printStackTrace();
211             logger.finer("Cannot set load-external-dtd to" + validate);
212             logger.log(Level.FINER,"Uncaught exception", e);
213             //System.err.println("Cannot set load-external-dtd to" + validate);
214         }
215
216
217         //DAS_DNA_Handler cont_handle = new DAS_DNA_Handler() ;
218         DAS_Sequence_Handler cont_handle = new DAS_Sequence_Handler() ;
219         xmlreader.setContentHandler(cont_handle);
220         xmlreader.setErrorHandler(new org.xml.sax.helpers.DefaultHandler());
221         InputSource insource = new InputSource() ;
222         insource.setByteStream(dasInStream);
223
224         xmlreader.parse(insource);
225         String sequence = cont_handle.get_sequence();
226         //logger.finest("Got sequence from DAS: " +sequence);
227         logger.exiting(this.getClass().getName(), "retreiveSequence",  sequence);
228         return sequence ;
229     }
230
231     private InputStream open(URL url) {
232         {
233
234             InputStream inStream = null;
235             try{
236
237
238
239
240                 HttpURLConnection huc = null;
241
242                 huc = DAS_FeatureRetrieve.openHttpURLConnection(url);
243
244
245                 logger.finest(huc.getResponseMessage());
246
247                 inStream = huc.getInputStream();
248
249
250             }
251             catch ( Exception ex){
252                 ex.printStackTrace();
253                 logger.log(Level.WARNING,"exception occured", ex);
254             }
255
256             return inStream;
257         }
258
259     }
260
261 }