--- /dev/null
+/*
+ * 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;
+ }
+
+ }
+
+}