updated jalview version of dasobert 1.53e client and added Das Sequence Source discov...
[jalview.git] / src / org / biojava / dasobert / das / SequenceThread.java
diff --git a/src/org/biojava/dasobert/das/SequenceThread.java b/src/org/biojava/dasobert/das/SequenceThread.java
new file mode 100755 (executable)
index 0000000..efdd50f
--- /dev/null
@@ -0,0 +1,268 @@
+/*
+ *                  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;
+        }
+        
+    }
+    
+}