X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Frest%2FHttpResultSet.java;h=5bfe3b5fe9636b5c034b0584029b9ad881567966;hb=efb5cfa00ee832a62dfdf59f5fb847a0e16424d9;hp=b99d5383ba5c8bc3d610a2ee6944841359d75a9d;hpb=6451d24f0987cf8283341750672ba95ee085fc9c;p=jalview.git
diff --git a/src/jalview/ws/rest/HttpResultSet.java b/src/jalview/ws/rest/HttpResultSet.java
index b99d538..5bfe3b5 100644
--- a/src/jalview/ws/rest/HttpResultSet.java
+++ b/src/jalview/ws/rest/HttpResultSet.java
@@ -1,20 +1,46 @@
+/*
+ * 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 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.james.mime4j.MimeException;
-import org.apache.james.mime4j.parser.ContentHandler;
import org.apache.james.mime4j.parser.MimeStreamParser;
/**
@@ -24,7 +50,7 @@ import org.apache.james.mime4j.parser.MimeStreamParser;
*
*/
-public class HttpResultSet extends FileParse
+public class HttpResultSet extends FileParse implements AutoCloseable
{
private HttpRequestBase cachedRequest;
@@ -55,17 +81,47 @@ 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;
+ }
+
+ /**
+ * 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.
if (en instanceof MultipartEntity)
{
+ // Multipart messages should be properly typed, so we parse them as we go.
MultipartEntity mpe = (MultipartEntity) en;
// multipart
- jalview.io.packed.JalviewDataset ds = restJob.newJalviewDataset();
- ContentHandler handler = new JalviewMimeContentHandler(ds);
+ JalviewMimeContentHandler handler = new JalviewMimeContentHandler(ds);
MimeStreamParser parser = new MimeStreamParser();
parser.setContentHandler(handler);
try
@@ -78,15 +134,35 @@ public class HttpResultSet extends FileParse
Cache.log.warn("Failed to parse MIME multipart content", me);
en.consumeContent();
}
+ 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)
{
@@ -94,7 +170,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.
@@ -118,13 +194,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;
@@ -139,7 +215,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;
+ }
}
}