X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fext%2Fensembl%2FEnsemblRestClient.java;h=24375886005dce6264b763e5dc6f12fdb0ebba2c;hb=abb4c1cc7383a54df59066186eb282588bb884e8;hp=b7b1985f5c9679bd5064fe71244057438a06c071;hpb=604cbee405a837565ba1a74aa9bddd62aed685ab;p=jalview.git diff --git a/src/jalview/ext/ensembl/EnsemblRestClient.java b/src/jalview/ext/ensembl/EnsemblRestClient.java index b7b1985..2437588 100644 --- a/src/jalview/ext/ensembl/EnsemblRestClient.java +++ b/src/jalview/ext/ensembl/EnsemblRestClient.java @@ -20,6 +20,7 @@ */ package jalview.ext.ensembl; +import jalview.io.DataSourceType; import jalview.io.FileParse; import jalview.util.StringUtils; @@ -50,15 +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 + * changes to Ensembl REST API (ref JAL-2105) * @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_ENSEMBLGENOMES_REST_VERSION = "5.0"; - private static final String LATEST_ENSEMBL_REST_VERSION = "4.7"; + private static final String LATEST_ENSEMBL_REST_VERSION = "5.0"; private static final String REST_CHANGE_LOG = "https://github.com/Ensembl/ensembl-rest/wiki/Change-log"; @@ -71,6 +76,9 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher private final static long VERSION_RETEST_INTERVAL = 1000L * 3600; // 1 hr + private static final Regex PROTEIN_REGEX = new Regex( + "(ENS)([A-Z]{3}|)P[0-9]{11}$"); + private static final Regex TRANSCRIPT_REGEX = new Regex( "(ENS)([A-Z]{3}|)T[0-9]{11}$"); @@ -120,6 +128,18 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher /** * Answers true if the query matches the regular expression pattern for an + * Ensembl protein stable identifier + * + * @param query + * @return + */ + public boolean isProteinIdentifier(String query) + { + return query == null ? false : PROTEIN_REGEX.search(query); + } + + /** + * Answers true if the query matches the regular expression pattern for an * Ensembl gene stable identifier * * @param query @@ -186,7 +206,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 @@ -196,8 +216,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(); @@ -208,9 +229,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; @@ -234,22 +261,39 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher // request failed return null; } - FileParse fp = new FileParse(reader, url.toString(), "HTTP_POST"); + 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(); @@ -269,6 +313,9 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher connection.setDoInput(true); connection.setDoOutput(multipleIds); + connection.setConnectTimeout(CONNECT_TIMEOUT_MS); + connection.setReadTimeout(readTimeout); + if (multipleIds) { writePostBody(connection, ids); @@ -481,9 +528,11 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher boolean laterVersion = StringUtils.compareVersions(version, expected) == 1; if (laterVersion) { - System.err.println(String.format( - "Expected %s REST version %s but found %s, see %s", - getDbSource(), expected, version, REST_CHANGE_LOG)); + System.err + .println(String + .format("EnsemblRestClient expected %s REST version %s but found %s, see %s", + getDbSource(), expected, version, + REST_CHANGE_LOG)); } info.restVersion = version; } catch (Throwable t)