+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * 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.
*
*
*/
-public class HttpResultSet extends FileParse
+public class HttpResultSet extends FileParse implements AutoCloseable
{
private HttpRequestBase cachedRequest;
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<DataProvider> createResultDataProviders()
{
- en = con.getEntity();
- repeatable = en.isRepeatable();
+ List<DataProvider> 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<DataProvider> 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)
{
}
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.
{
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;
if (br != null)
{
dataIn = new BufferedReader(br);
- error=false;
+ error = false;
}
}
}
@Override
- protected void finalize() throws Throwable
+ public void close()
{
dataIn = null;
cachedRequest = null;
} 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;
+ }
}
}