updated jalview version of dasobert 1.53e client and added Das Sequence Source discov...
[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     String version ;
56     
57     static Logger logger = Logger.getLogger("org.biojava.spice");
58     
59      public SequenceThread(String sp_accession,Das1Source ds ) {
60         super();
61         Das1Source[] dss =new Das1Source[1];
62         dss[0] = ds;
63         this.sp_accession = sp_accession;
64         this.sequenceServers =dss ;
65         clearSequenceListeners();
66         version = "";
67     }
68     public SequenceThread(String sp_accession,Das1Source[] ds ) {
69         super();
70         
71         this.sp_accession = sp_accession;
72         this.sequenceServers =ds ;
73         clearSequenceListeners();
74     }
75     
76     public void clearSequenceListeners(){
77         seqListeners = new ArrayList();
78     }
79     
80     public void addSequenceListener(SequenceListener lis){
81         seqListeners.add(lis);
82     }
83     
84     public void run() {
85         getSequence();
86     }
87     
88     public void getSequence( ){
89         
90         boolean gotSequence = false ;
91         
92         for ( int i = 0 ; i< sequenceServers.length; i++){
93             
94             if ( gotSequence ) break ;
95             
96             Das1Source ds = sequenceServers[i];
97             String url = ds.getUrl() ;
98             char lastChar = url.charAt(url.length()-1);      
99             if ( ! (lastChar == '/') ) 
100                 url +="/" ;
101             String dascmd = url + "sequence?segment=";
102             String connstr = dascmd + sp_accession ;
103             
104             try {
105                 version = "";
106                 
107                 String sequence = retrieveSequence(connstr);
108                 // bug in aristotle das source?
109                 sequence.replaceAll(" ","");
110                 gotSequence = true ;
111                 // set the sequence ...
112                 
113                 triggerNewSequence(sp_accession,sequence,ds,version);
114                 
115                 
116                 return;
117             }
118             catch (Exception ex) {
119                 ex.printStackTrace();     
120                 logger.warning(ex.getMessage());
121                 
122                 //triggerException(ex);
123                 
124             }       
125         }
126         
127         logger.log(Level.WARNING,"could not retreive UniProt sequence from any available DAS sequence server");
128         
129         triggerNoSequence(sp_accession);
130         
131     }
132
133    
134     
135 //    private void triggerException(Exception e){
136 //        Iterator iter = seqListeners.iterator();
137 //        while (iter.hasNext()){
138 //           SequenceListener li = (SequenceListener)iter.next();
139 //           li.exceptionOccured(e);
140 //        }
141 //    }
142     
143     private void triggerNewSequence(String sp_accession,String sequence,Das1Source source,String version){
144
145         Iterator iter = seqListeners.iterator();
146         while (iter.hasNext()){
147            SequenceListener li = (SequenceListener)iter.next();
148             //SequenceEvent event = new SequenceEvent(sequence);
149            SequenceEvent event = new SequenceEvent(sp_accession,sequence,version); 
150            event.setSource(source);
151            li.newSequence(event);
152         }
153     }
154     
155     private void triggerNoSequence(String ac){
156
157         Iterator iter = seqListeners.iterator();
158         while (iter.hasNext()){
159             SequenceListener li = (SequenceListener)iter.next();
160             li.noObjectFound(ac);
161         }
162     
163     }
164     
165     /** retrieve the Sequence from a DAS server.  
166      * 
167      * @param connstr - the DAS - request string. e.g. http://www.ebi.ac.uk/das-srv/uniprot/das/aristotle/sequence?segment=P00280
168      * @return the requested Sequence
169      * @throws Exception
170      */
171     public String retrieveSequence( String connstr) 
172     throws Exception 
173     {
174         
175         //logger.finest("trying: " + connstr) ;
176         URL dasUrl = new URL(connstr);
177         //DAS_httpConnector dhtp = new DAS_httpConnector() ;
178         logger.info("requesting sequence from " + connstr);
179         InputStream dasInStream =open(dasUrl); 
180         
181         
182         SAXParserFactory spfactory =
183             SAXParserFactory.newInstance();
184         
185         // never do this 
186         //String vali = System.getProperty("XMLVALIDATION");
187         String vali = "false";
188         boolean validate = false ;
189         if ((vali != null) && ( vali.equals("true")) ) 
190             validate = true ;
191         spfactory.setValidating(validate);
192         
193         SAXParser saxParser = null ;
194         
195         try{
196             saxParser =
197                 spfactory.newSAXParser();
198         } catch (ParserConfigurationException e) {
199             //e.printStackTrace();
200             logger.log(Level.FINER,"Uncaught exception", e);
201         }
202         
203         XMLReader xmlreader = saxParser.getXMLReader();
204         
205         try {
206             xmlreader.setFeature("http://xml.org/sax/features/validation", validate);
207         } catch (SAXException e) {
208             logger.finer("Cannot set validation to " + validate); 
209             logger.log(Level.FINER,"Uncaught exception", e);
210         }
211         
212         try {
213             xmlreader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",validate);
214         } catch (SAXNotRecognizedException e){
215             //e.printStackTrace();
216             logger.finer("Cannot set load-external-dtd to" + validate); 
217             logger.log(Level.FINER,"Uncaught exception", e);
218             //System.err.println("Cannot set load-external-dtd to" + validate); 
219         }
220         
221         
222         //DAS_DNA_Handler cont_handle = new DAS_DNA_Handler() ;
223         DAS_Sequence_Handler cont_handle = new DAS_Sequence_Handler() ;
224         xmlreader.setContentHandler(cont_handle);
225         xmlreader.setErrorHandler(new org.xml.sax.helpers.DefaultHandler());
226         InputSource insource = new InputSource() ;
227         insource.setByteStream(dasInStream);
228         
229         xmlreader.parse(insource);
230         String sequence = cont_handle.get_sequence();
231         version = cont_handle.getVersion();
232         //logger.finest("Got sequence from DAS: " +sequence);
233         
234         logger.exiting(this.getClass().getName(), "retreiveSequence",  sequence);
235         return sequence ;
236     }
237     
238     private InputStream open(URL url) {
239         {
240             
241             InputStream inStream = null;
242             try{
243                 
244              
245                
246                 
247                 HttpURLConnection huc = null;
248              
249                 huc = DAS_FeatureRetrieve.openHttpURLConnection(url);
250                 
251                 
252                 logger.finest(huc.getResponseMessage());
253                 
254                 inStream = huc.getInputStream();
255                 
256                 
257             }
258             catch ( Exception ex){
259                 ex.printStackTrace();
260                 logger.log(Level.WARNING,"exception occured", ex);
261             }
262             
263             return inStream;
264         }
265         
266     }
267     
268 }