X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Frest%2FHttpResultSet.java;h=8414da5d78ac2a17eda45752462f9b06d1c49f3d;hb=7b9f93ca2c7f5e5d9347f00be309522f76e3e778;hp=bfef0cce1efce6125b9bc84a55c9e87f2139caea;hpb=c762d9525db36ffd5d3fca49fb5e7d506d13401a;p=jalview.git diff --git a/src/jalview/ws/rest/HttpResultSet.java b/src/jalview/ws/rest/HttpResultSet.java index bfef0cc..8414da5 100644 --- a/src/jalview/ws/rest/HttpResultSet.java +++ b/src/jalview/ws/rest/HttpResultSet.java @@ -1,23 +1,48 @@ +/* + * 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.ws.rest; -import java.io.BufferedInputStream; +import jalview.bin.Cache; +import jalview.io.FileParse; +import jalview.io.packed.DataProvider; +import jalview.io.packed.DataProvider.JvDataType; +import jalview.io.packed.ParsePackedSet; +import jalview.io.packed.SimpleDataProvider; +import jalview.util.MessageManager; +import jalview.ws.io.mime.JalviewMimeContentHandler; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.entity.mime.MultipartEntity; +import org.apache.http.util.EntityUtils; import org.apache.james.mime4j.MimeException; -import org.apache.james.mime4j.parser.ContentHandler; import org.apache.james.mime4j.parser.MimeStreamParser; - -import jalview.bin.Cache; -import jalview.io.FileParse; -import jalview.io.mime.JalviewMimeContentHandler; - /** * data source instantiated from the response of an httpclient request. * @@ -25,7 +50,7 @@ import jalview.io.mime.JalviewMimeContentHandler; * */ -public class HttpResultSet extends FileParse +public class HttpResultSet extends FileParse implements AutoCloseable { private HttpRequestBase cachedRequest; @@ -56,38 +81,87 @@ public class HttpResultSet extends FileParse initDataSource(con); } - private void initDataSource(HttpResponse con) throws IOException + /** + * construct a set of dataproviders to parse a result set from this service + * + * @param resSet + * @return + */ + public List createResultDataProviders() { - en = con.getEntity(); - repeatable = en.isRepeatable(); + List dp = new ArrayList<>(); + for (JvDataType type : restJob.rsd.getResultDataTypes()) + { + dp.add(new SimpleDataProvider(type, this, null)); + } + return dp; + } - if (en instanceof MultipartEntity) + /** + * parses the results of the service output. + * + * @return the result of ParsePackedSet.getAlignment() + * @throws Exception + * @throws Error + */ + public Object[] parseResultSet() throws Exception, Error + { + List dp = new ArrayList<>(); + Object[] results = null; + + if (en == null) + { + throw new Error(MessageManager.getString( + "error.implementation_error_need_to_have_httpresponse")); + } + jalview.io.packed.JalviewDataset ds = restJob.newJalviewDataset(); + // Decide how we deal with content. + // TODO : verify we are detecting a multipart response correctly + if (en.getContentType().getValue().startsWith("multipart/form-data")) { - MultipartEntity mpe = (MultipartEntity) en; - // multipart - jalview.io.packed.JalviewDataset ds = restJob.newJalviewDataset(); - ContentHandler handler = new JalviewMimeContentHandler(ds); + // Multipart messages should be properly typed, so we parse them as we go. + JalviewMimeContentHandler handler = new JalviewMimeContentHandler(ds); MimeStreamParser parser = new MimeStreamParser(); parser.setContentHandler(handler); try { - parser.parse(mpe.getContent()); + parser.parse(en.getContent()); } catch (MimeException me) { error = true; errormessage = "Couldn't parse message from web service."; Cache.log.warn("Failed to parse MIME multipart content", me); - en.consumeContent(); + EntityUtils.consume(en); } + return new ParsePackedSet().getAlignment(ds, + handler.getJalviewDataProviders()); } else { + // Need to use hints from rest service description. + dp = createResultDataProviders(); + ParsePackedSet pps = new ParsePackedSet(); + return pps.getAlignment(ds, dp); + } + } + + private void initDataSource(HttpResponse con) throws IOException + { + en = con.getEntity(); + repeatable = en.isRepeatable(); + + if (!(en instanceof MultipartEntity)) + { // assume content is simple text stream that can be read from - String enc = (en.getContentEncoding()==null) ? null : en.getContentEncoding().getValue(); - if (en.getContentType()!=null) { - Cache.log.info("Result Type: " + en.getContentType().toString()); - } else { - Cache.log.info("No Result Type Specified."); + String enc = (en.getContentEncoding() == null) ? null + : en.getContentEncoding().getValue(); + if (en.getContentType() != null) + { + Cache.log.debug("Result Type: " + en.getContentType().toString()); + } + else + { + Cache.log.debug("No Result Type Specified."); } if (enc == null || enc.length() < 1) { @@ -95,7 +169,7 @@ public class HttpResultSet extends FileParse } else { - Cache.log.debug("Result Encoded as : "+enc); + Cache.log.debug("Result Encoded as : " + enc); } // attempt to identify file and construct an appropriate DataSource // identifier for it. @@ -111,7 +185,7 @@ public class HttpResultSet extends FileParse { Cache.log.error("Can't handle encoding '" + enc + "' for response from webservice.", e); - en.consumeContent(); + EntityUtils.consume(en); error = true; errormessage = "Can't handle encoding for response from webservice"; return; @@ -119,13 +193,13 @@ public class HttpResultSet extends FileParse if (br != null) { dataIn = new BufferedReader(br); - error=false; + error = false; } } } @Override - protected void finalize() throws Throwable + public void close() { dataIn = null; cachedRequest = null; @@ -140,7 +214,24 @@ public class HttpResultSet extends FileParse } catch (Error ex) { } - super.finalize(); + // no finalize for FileParse + // super.close(); + } + + /** + * + * @return the URL that this result set read data from. + */ + public String getUrl() + { + try + { + return cachedRequest.getURI().toURL().toString(); + } catch (Exception x) + { + x.printStackTrace(); + return null; + } } }