--- /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 19.03.2004
+ * @author Andreas Prlic
+ *
+ */
+package org.biojava.dasobert.das;
+
+
+import java.net.URL ;
+import java.io.InputStream ;
+import org.xml.sax.InputSource ;
+import org.xml.sax.XMLReader ;
+import javax.xml.parsers.* ;
+import org.xml.sax.* ;
+import java.util.ArrayList ;
+import java.util.List;
+import java.util.logging.* ;
+import java.net.HttpURLConnection ;
+import java.io.IOException;
+import java.net.ConnectException;
+import java.lang.reflect.Method;
+
+
+/**
+ * A class to perform a DAS features request
+ *
+ * @author Andreas Prlic
+ *
+ */
+public class DAS_FeatureRetrieve {
+
+ List features ;
+ Logger logger ;
+ int comeBackLater;
+ URL url;
+ /**
+ *
+ */
+ public DAS_FeatureRetrieve(URL url) {
+ super();
+
+ logger = Logger.getLogger("org.biojava.spice");
+ features = new ArrayList() ;
+ comeBackLater = -1;
+ this.url=url;
+ reload();
+ }
+
+
+ /** contact the DAS-feature server again. Usually
+ * it is not necessary to call this again, because the constructor already does, but
+ * if comeBackLater > -1 this should be called again.
+ *
+ */
+ public void reload(){
+
+ try {
+
+ InputStream dasInStream = null;
+ try {
+ dasInStream = open(url);
+ } catch (Exception e ){
+ comeBackLater = -1;
+ logger.log(Level.FINE,"could not open connection to " + url,e);
+ return ;
+ }
+
+
+ SAXParserFactory spfactory =
+ SAXParserFactory.newInstance();
+
+ spfactory.setValidating(false);
+
+ SAXParser saxParser = null ;
+
+ try{
+ saxParser =
+ spfactory.newSAXParser();
+ } catch (ParserConfigurationException e) {
+ e.printStackTrace();
+ }
+
+
+
+ String vali = System.getProperty("XMLVALIDATION");
+
+ boolean validation = false ;
+ if ( vali != null )
+ if ( vali.equals("true") )
+ validation = true ;
+
+
+ XMLReader xmlreader = saxParser.getXMLReader();
+
+ //XMLReader xmlreader = XMLReaderFactory.createXMLReader();
+ try {
+ xmlreader.setFeature("http://xml.org/sax/features/validation", validation);
+ } catch (SAXException e) {
+ logger.log(Level.FINE,"Cannot set validation " + validation);
+ }
+
+ try {
+ xmlreader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",validation);
+ } catch (SAXNotRecognizedException e){
+ e.printStackTrace();
+ logger.log(Level.FINE,"Cannot set load-external-dtd "+validation);
+
+ }
+
+ DAS_Feature_Handler cont_handle = new DAS_Feature_Handler() ;
+ cont_handle.setDASCommand(url.toString());
+ xmlreader.setContentHandler(cont_handle);
+ xmlreader.setErrorHandler(new org.xml.sax.helpers.DefaultHandler());
+ InputSource insource = new InputSource() ;
+ insource.setByteStream(dasInStream);
+
+ try {
+ xmlreader.parse(insource);
+ features = cont_handle.get_features();
+ comeBackLater = cont_handle.getComBackLater();
+ }
+ catch ( Exception e){
+ System.out.println("ERROR PARSING RESULT FROM "+url+ "\n"+e+"\n");
+ // e.printStackTrace();
+ logger.log(Level.FINE,"error while parsing response from "+ url);
+ comeBackLater = -1;
+ features = new ArrayList();
+ }
+ }
+ catch (Exception ex) {
+ ex.printStackTrace();
+ comeBackLater = -1;
+ }
+ }
+
+ /** open HttpURLConnection. Recommended way to open
+ * HttpURLConnections, since this take care of setting timeouts
+ * properly for java 1.4 and 1.5*/
+ public static HttpURLConnection openHttpURLConnection(URL url)
+ throws IOException, ConnectException {
+ HttpURLConnection huc = null;
+ huc = (HttpURLConnection) url.openConnection();
+
+ String os_name = java.lang.System.getProperty("os.name");
+ String os_version = java.lang.System.getProperty("os.version");
+ String os_arch = java.lang.System.getProperty("os.arch");
+ String VERSION = "1.0";
+
+ String userAgent = "Jalview " + VERSION + "("+os_name+"; "+os_arch + " ; "+ os_version+")";
+ //e.g. "Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.2) Gecko/20040803"
+ huc.addRequestProperty("User-Agent", userAgent);
+ //logger.finest("opening "+url);
+
+
+ // use reflection to determine if get and set timeout methods for urlconnection are available
+ // seems java 1.5 does not watch the System properties any longer...
+ // and java 1.4 did not provide these...
+ // for 1.4 see setSystemProperties
+ int timeout = 15000;
+ try {
+ // try to use reflection to set timeout property
+ Class urlconnectionClass = Class.forName("java.net.HttpURLConnection");
+
+ Method setconnecttimeout = urlconnectionClass.getMethod (
+ "setConnectTimeout", new Class [] {int.class}
+ );
+ setconnecttimeout.invoke(huc,new Object[] {new Integer(timeout)});
+
+ Method setreadtimeout = urlconnectionClass.getMethod (
+ "setReadTimeout", new Class[] {int.class}
+ );
+ setreadtimeout.invoke(huc,new Object[] {new Integer(timeout)});
+ //System.out.println("successfully set java 1.5 timeout");
+ } catch (Exception e) {
+ //e.printStackTrace();
+ // most likely it was a NoSuchMEthodException and we are running java 1.4.
+ }
+ return huc;
+ }
+
+ private InputStream open(URL url)
+ throws java.io.IOException, java.net.ConnectException
+ {
+ InputStream inStream = null;
+
+
+ HttpURLConnection huc = openHttpURLConnection(url);
+
+ inStream = huc.getInputStream();
+
+ return inStream;
+
+ }
+
+ /** returns a List of Features */
+ public List get_features() {
+
+ return features;
+ }
+
+ /** returns the comeBackLater value - if a server returned suchh -
+ *
+ * @return comeBackLater in seconds, or -1 if not provided by server
+ */
+ public int getComeBackLater(){
+
+ return comeBackLater;
+
+ }
+
+
+}