X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Fensembl%2FEnsemblRestClient.java;fp=src%2Fjalview%2Fext%2Fensembl%2FEnsemblRestClient.java;h=8ee6aaf03c9e3d0f3c705374ce6e480b620b6d04;hb=7d67fb613ec026dc9a265e351e7fab542e3f1d61;hp=653d5d5790bc7046418d6d7f26187ed4f0aef738;hpb=02e38bb826828ab2991584cf4b737c0138cb6c44;p=jalview.git diff --git a/src/jalview/ext/ensembl/EnsemblRestClient.java b/src/jalview/ext/ensembl/EnsemblRestClient.java index 653d5d5..8ee6aaf 100644 --- a/src/jalview/ext/ensembl/EnsemblRestClient.java +++ b/src/jalview/ext/ensembl/EnsemblRestClient.java @@ -1,3 +1,23 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.ext.ensembl; import jalview.io.DataSourceType; @@ -31,14 +51,19 @@ import com.stevesoft.pat.Regex; */ abstract class EnsemblRestClient extends EnsemblSequenceFetcher { + private static final int DEFAULT_READ_TIMEOUT = 5 * 60 * 1000; // 5 minutes + + private static final int CONNECT_TIMEOUT_MS = 10 * 1000; // 10 seconds + /* * update these constants when Jalview has been checked / updated for * changes to Ensembl REST API * @see https://github.com/Ensembl/ensembl-rest/wiki/Change-log + * @see http://rest.ensembl.org/info/rest?content-type=application/json */ private static final String LATEST_ENSEMBLGENOMES_REST_VERSION = "4.6"; - private static final String LATEST_ENSEMBL_REST_VERSION = "4.6"; + private static final String LATEST_ENSEMBL_REST_VERSION = "4.7"; private static final String REST_CHANGE_LOG = "https://github.com/Ensembl/ensembl-rest/wiki/Change-log"; @@ -52,10 +77,10 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher private final static long VERSION_RETEST_INTERVAL = 1000L * 3600; // 1 hr private static final Regex TRANSCRIPT_REGEX = new Regex( - "(ENS)([A-Z]{3}|)T[0-9]{11}$"); + "(ENS)([A-Z]{3}|)T[0-9]{11}$"); private static final Regex GENE_REGEX = new Regex( - "(ENS)([A-Z]{3}|)G[0-9]{11}$"); + "(ENS)([A-Z]{3}|)G[0-9]{11}$"); static { @@ -166,7 +191,7 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher */ private boolean checkEnsembl() { - HttpURLConnection conn = null; + BufferedReader br = null; try { // note this format works for both ensembl and ensemblgenomes @@ -176,8 +201,9 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher /* * expect {"ping":1} if ok + * if ping takes more than 2 seconds to respond, treat as if unavailable */ - BufferedReader br = getHttpResponse(ping, null); + br = getHttpResponse(ping, null, 2 * 1000); JSONParser jp = new JSONParser(); JSONObject val = (JSONObject) jp.parse(br); String pingString = val.get("ping").toString(); @@ -188,9 +214,15 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher + t.getMessage()); } finally { - if (conn != null) + if (br != null) { - conn.disconnect(); + try + { + br.close(); + } catch (IOException e) + { + // ignore + } } } return false; @@ -207,28 +239,50 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher throws IOException { URL url = getUrl(ids); - + BufferedReader reader = getHttpResponse(url, ids); + if (reader == null) + { + // request failed + return null; + } FileParse fp = new FileParse(reader, url.toString(), DataSourceType.URL); return fp; } /** + * Gets a reader to the HTTP response, using the default read timeout of 5 + * minutes + * + * @param url + * @param ids + * @return + * @throws IOException + */ + protected BufferedReader getHttpResponse(URL url, List ids) + throws IOException + { + return getHttpResponse(url, ids, DEFAULT_READ_TIMEOUT); + } + + /** * Writes the HTTP request and gets the response as a reader. * * @param url * @param ids * written as Json POST body if more than one + * @param readTimeout + * in milliseconds * @return * @throws IOException * if response code was not 200, or other I/O error */ - protected BufferedReader getHttpResponse(URL url, List ids) - throws IOException + protected BufferedReader getHttpResponse(URL url, List ids, + int readTimeout) throws IOException { // long now = System.currentTimeMillis(); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - + /* * POST method allows multiple queries in one request; it is supported for * sequence queries, but not for overlap @@ -244,29 +298,33 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher connection.setDoInput(true); connection.setDoOutput(multipleIds); + connection.setConnectTimeout(CONNECT_TIMEOUT_MS); + connection.setReadTimeout(readTimeout); + if (multipleIds) { writePostBody(connection, ids); } - - InputStream response = connection.getInputStream(); + int responseCode = connection.getResponseCode(); - + if (responseCode != 200) { /* * note: a GET request for an invalid id returns an error code e.g. 415 * but POST request returns 200 and an empty Fasta response */ - throw new IOException( - "Response code was not 200. Detected response was " - + responseCode); + System.err.println("Response code " + responseCode + " for " + url); + return null; } + // get content + InputStream response = connection.getInputStream(); + // System.out.println(getClass().getName() + " took " // + (System.currentTimeMillis() - now) + "ms to fetch"); checkRateLimits(connection); - + BufferedReader reader = null; reader = new BufferedReader(new InputStreamReader(response, "UTF-8")); return reader; @@ -319,7 +377,7 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher // remaining, limit, reset)); } } - + /** * Rechecks if Ensembl is responding, unless the last check was successful and * the retest interval has not yet elapsed. Returns true if Ensembl is up,