X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Febi%2FEBIFetchClient.java;h=f6928c4aa7e60e92d65ed0630b205958e5429b18;hb=37de9310bec3501cbc6381e0c3dcb282fcaad812;hp=cb61cd49f2403c8cc4f3b8894c85f2789a6ffb96;hpb=ad15cff29620f960119f80176f1fd443da9f6763;p=jalview.git diff --git a/src/jalview/ws/ebi/EBIFetchClient.java b/src/jalview/ws/ebi/EBIFetchClient.java index cb61cd4..f6928c4 100644 --- a/src/jalview/ws/ebi/EBIFetchClient.java +++ b/src/jalview/ws/ebi/EBIFetchClient.java @@ -20,15 +20,18 @@ */ package jalview.ws.ebi; +import jalview.datamodel.DBRefSource; import jalview.util.MessageManager; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; +import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; +import java.util.List; import java.util.StringTokenizer; /** @@ -39,9 +42,6 @@ import java.util.StringTokenizer; */ public class EBIFetchClient { - String format = "default"; - - String style = "raw"; /** * Creates a new EBIFetchClient object. @@ -83,15 +83,28 @@ public class EBIFetchClient throw new Error(MessageManager.getString("error.not_yet_implemented")); } - public File fetchDataAsFile(String ids, String f, String s) + /** + * Send an HTTP fetch request to EBI and save the reply in a temporary file. + * + * @param ids + * the query formatted as db:query1;query2;query3 + * @param format + * the format wanted + * @param extension + * for the temporary file to hold response + * @return the file holding the response + * @throws OutOfMemoryError + */ + + public File fetchDataAsFile(String ids, String format, String ext) throws OutOfMemoryError { File outFile = null; try { - outFile = File.createTempFile("jalview", ".xml"); + outFile = File.createTempFile("jalview", ext); outFile.deleteOnExit(); - fetchData(ids, f, s, outFile); + fetchData(ids, format, outFile); if (outFile.length() == 0) { outFile.delete(); @@ -104,83 +117,95 @@ public class EBIFetchClient } /** - * Single DB multiple record retrieval + * Fetches queries and either saves the response to a file or returns as + * string data * * @param ids - * db:query1;query2;query3 - * @param f - * raw/xml - * @param s - * ? - * - * @return Raw string array result of query set + * @param format + * @param outFile + * @return + * @throws OutOfMemoryError */ - public String[] fetchData(String ids, String f, String s) + String[] fetchData(String ids, String format, File outFile) throws OutOfMemoryError { - return fetchData(ids, f, s, null); + StringBuilder querystring = new StringBuilder(ids.length()); + String database = parseIds(ids, querystring); + if (database == null) + { + System.err.println("Invalid Query string : '" + ids + "'"); + System.err.println("Should be of form 'dbname:q1;q2;q3;q4'"); + return null; + } + + // note: outFile is currently always specified, so return value is null + String[] rslt = fetchBatch(querystring.toString(), database, format, + outFile); + + return (rslt != null && rslt.length > 0 ? rslt : null); } - public String[] fetchData(String ids, String f, String s, File outFile) - throws OutOfMemoryError + /** + * Parses ids formatted as dbname:q1;q2;q3, returns the dbname and adds + * queries as comma-separated items to the querystring. dbname must be + * specified for at least one queryId. Returns null if a mixture of different + * dbnames is found (ignoring case). + * + * @param ids + * @param queryString + * @return + */ + static String parseIds(String ids, StringBuilder queryString) { - // Need to split - // ids of the form uniprot:25KD_SARPE;ADHR_DROPS; - String[] rslts = new String[0]; + String database = null; StringTokenizer queries = new StringTokenizer(ids, ";"); - String db = null; - StringBuffer querystring = null; - int nq = 0; + boolean appending = queryString.length() > 0; while (queries.hasMoreTokens()) { String query = queries.nextToken(); - int p; - if ((p = query.indexOf(':')) > -1) + int p = query.indexOf(':'); + if (p > -1) { - db = query.substring(0, p); + String db = query.substring(0, p); + if (database != null && !db.equalsIgnoreCase(database)) + { + /* + * different databases mixed in together - invalid + */ + return null; + } + database = db; query = query.substring(p + 1); } - if (querystring == null) - { - querystring = new StringBuffer(query); - nq++; - } - else - { - querystring.append("," + query); - nq++; - } + queryString.append(appending ? "," : ""); + queryString.append(query); + appending = true; } - if (db == null) - { - System.err.println("Invalid Query string : '" + ids - + "'\nShould be of form 'dbname:q1;q2;q3;q4'"); - return null; - } - String[] rslt = fetchBatch(querystring.toString(), db, f, s, outFile); - if (rslt != null) - { - String[] nrslts = new String[rslt.length + rslts.length]; - System.arraycopy(rslts, 0, nrslts, 0, rslts.length); - System.arraycopy(rslt, 0, nrslts, rslts.length, rslt.length); - rslts = nrslts; - } - - return (rslts.length == 0 ? null : rslts); + return database; } - public String[] fetchBatch(String ids, String db, String f, String s, + /** + * Fetches queries and either saves the response to a file or (if no file + * specified) returns as string data + * + * @param ids + * @param database + * @param format + * @param outFile + * @return + * @throws OutOfMemoryError + */ + String[] fetchBatch(String ids, String database, String format, File outFile) throws OutOfMemoryError { - long time = System.currentTimeMillis(); - // max 200 ids can be added at one time + // long time = System.currentTimeMillis(); + String url = buildUrl(ids, database, format); + try { - URL rcall = new URL("http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/" - + db.toLowerCase() + "/" + ids.toLowerCase() - + (f != null ? "/" + f : "")); + URL rcall = new URL(url); - BufferedInputStream is = new BufferedInputStream(rcall.openStream()); + InputStream is = new BufferedInputStream(rcall.openStream()); if (outFile != null) { FileOutputStream fio = new FileOutputStream(outFile); @@ -197,7 +222,7 @@ public class EBIFetchClient { BufferedReader br = new BufferedReader(new InputStreamReader(is)); String rtn; - ArrayList arl = new ArrayList(); + List arl = new ArrayList(); while ((rtn = br.readLine()) != null) { arl.add(rtn); @@ -206,8 +231,7 @@ public class EBIFetchClient } } catch (OutOfMemoryError er) { - - System.out.println("OUT OF MEMORY DOWNLOADING QUERY FROM " + db + System.out.println("OUT OF MEMORY DOWNLOADING QUERY FROM " + database + ":\n" + ids); throw er; } catch (Exception ex) @@ -217,15 +241,41 @@ public class EBIFetchClient { return null; } - System.err.println("Unexpected exception when retrieving from " + db - + "\nQuery was : '" + ids + "'"); + System.err.println("Unexpected exception when retrieving from " + + database + "\nQuery was : '" + ids + "'"); ex.printStackTrace(System.err); return null; } finally { - // System.err.println("Took " + (System.currentTimeMillis() - time) - // / 1000 + " secs for one call."); + // System.err.println("EBIFetch took " + (System.currentTimeMillis() - + // time) + " ms"); } return null; } + + /** + * Constructs the URL to fetch from + * + * @param ids + * @param database + * @param format + * @return + */ + static String buildUrl(String ids, String database, String format) + { + String url; + if (database.equalsIgnoreCase(DBRefSource.EMBL) + || database.equalsIgnoreCase(DBRefSource.EMBLCDS)) + { + url = "http://www.ebi.ac.uk/ena/data/view/" + ids.toLowerCase() + + (format != null ? "&" + format : ""); + } + else + { + url = "http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/" + + database.toLowerCase() + "/" + ids.toLowerCase() + + (format != null ? "/" + format : ""); + } + return url; + } }