/* * BioJava development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. If you do not have a copy, * see: * * http://www.gnu.org/copyleft/lesser.html * * Copyright for this code is held jointly by the individual * authors. These should be listed in @author doc comments. * * For more information on the BioJava project and its aims, * or to join the biojava-l mailing list, visit the home page * at: * * http://www.biojava.org/ * * Created on Nov 20, 2005 * */ package org.biojava.dasobert.das; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.Iterator; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.biojava.dasobert.dasregistry.Das1Source; import org.biojava.dasobert.eventmodel.SequenceEvent; import org.biojava.dasobert.eventmodel.SequenceListener; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.XMLReader; import java.util.*; /** a thread that gets the sequence from a DAS server * * @author Andreas Prlic * */ public class SequenceThread extends Thread { Das1Source[] sequenceServers; String sp_accession; List seqListeners; String version ; static Logger logger = Logger.getLogger("org.biojava.spice"); public SequenceThread(String sp_accession,Das1Source ds ) { super(); Das1Source[] dss =new Das1Source[1]; dss[0] = ds; this.sp_accession = sp_accession; this.sequenceServers =dss ; clearSequenceListeners(); version = ""; } public SequenceThread(String sp_accession,Das1Source[] ds ) { super(); this.sp_accession = sp_accession; this.sequenceServers =ds ; clearSequenceListeners(); } public void clearSequenceListeners(){ seqListeners = new ArrayList(); } public void addSequenceListener(SequenceListener lis){ seqListeners.add(lis); } public void run() { getSequence(); } public void getSequence( ){ boolean gotSequence = false ; for ( int i = 0 ; i< sequenceServers.length; i++){ if ( gotSequence ) break ; Das1Source ds = sequenceServers[i]; String url = ds.getUrl() ; char lastChar = url.charAt(url.length()-1); if ( ! (lastChar == '/') ) url +="/" ; String dascmd = url + "sequence?segment="; String connstr = dascmd + sp_accession ; try { version = ""; String sequence = retrieveSequence(connstr); // bug in aristotle das source? sequence.replaceAll(" ",""); gotSequence = true ; // set the sequence ... triggerNewSequence(sp_accession,sequence,ds,version); return; } catch (Exception ex) { ex.printStackTrace(); logger.warning(ex.getMessage()); //triggerException(ex); } } logger.log(Level.WARNING,"could not retreive UniProt sequence from any available DAS sequence server"); triggerNoSequence(sp_accession); } // private void triggerException(Exception e){ // Iterator iter = seqListeners.iterator(); // while (iter.hasNext()){ // SequenceListener li = (SequenceListener)iter.next(); // li.exceptionOccured(e); // } // } private void triggerNewSequence(String sp_accession,String sequence,Das1Source source,String version){ Iterator iter = seqListeners.iterator(); while (iter.hasNext()){ SequenceListener li = (SequenceListener)iter.next(); //SequenceEvent event = new SequenceEvent(sequence); SequenceEvent event = new SequenceEvent(sp_accession,sequence,version); event.setSource(source); li.newSequence(event); } } private void triggerNoSequence(String ac){ Iterator iter = seqListeners.iterator(); while (iter.hasNext()){ SequenceListener li = (SequenceListener)iter.next(); li.noObjectFound(ac); } } /** retrieve the Sequence from a DAS server. * * @param connstr - the DAS - request string. e.g. http://www.ebi.ac.uk/das-srv/uniprot/das/aristotle/sequence?segment=P00280 * @return the requested Sequence * @throws Exception */ public String retrieveSequence( String connstr) throws Exception { //logger.finest("trying: " + connstr) ; URL dasUrl = new URL(connstr); //DAS_httpConnector dhtp = new DAS_httpConnector() ; logger.info("requesting sequence from " + connstr); InputStream dasInStream =open(dasUrl); SAXParserFactory spfactory = SAXParserFactory.newInstance(); // never do this //String vali = System.getProperty("XMLVALIDATION"); String vali = "false"; boolean validate = false ; if ((vali != null) && ( vali.equals("true")) ) validate = true ; spfactory.setValidating(validate); SAXParser saxParser = null ; try{ saxParser = spfactory.newSAXParser(); } catch (ParserConfigurationException e) { //e.printStackTrace(); logger.log(Level.FINER,"Uncaught exception", e); } XMLReader xmlreader = saxParser.getXMLReader(); try { xmlreader.setFeature("http://xml.org/sax/features/validation", validate); } catch (SAXException e) { logger.finer("Cannot set validation to " + validate); logger.log(Level.FINER,"Uncaught exception", e); } try { xmlreader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",validate); } catch (SAXNotRecognizedException e){ //e.printStackTrace(); logger.finer("Cannot set load-external-dtd to" + validate); logger.log(Level.FINER,"Uncaught exception", e); //System.err.println("Cannot set load-external-dtd to" + validate); } //DAS_DNA_Handler cont_handle = new DAS_DNA_Handler() ; DAS_Sequence_Handler cont_handle = new DAS_Sequence_Handler() ; xmlreader.setContentHandler(cont_handle); xmlreader.setErrorHandler(new org.xml.sax.helpers.DefaultHandler()); InputSource insource = new InputSource() ; insource.setByteStream(dasInStream); xmlreader.parse(insource); String sequence = cont_handle.get_sequence(); version = cont_handle.getVersion(); //logger.finest("Got sequence from DAS: " +sequence); logger.exiting(this.getClass().getName(), "retreiveSequence", sequence); return sequence ; } private InputStream open(URL url) { { InputStream inStream = null; try{ HttpURLConnection huc = null; huc = DAS_FeatureRetrieve.openHttpURLConnection(url); logger.finest(huc.getResponseMessage()); inStream = huc.getInputStream(); } catch ( Exception ex){ ex.printStackTrace(); logger.log(Level.WARNING,"exception occured", ex); } return inStream; } } }