JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / ws / rest / HttpResultSet.java
index b99d538..836ca09 100644 (file)
@@ -1,20 +1,46 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
+ * Copyright (C) 2015 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 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;
 
 /**
@@ -55,17 +81,48 @@ 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<DataProvider> createResultDataProviders()
   {
-    en = con.getEntity();
-    repeatable = en.isRepeatable();
+    List<DataProvider> dp = new ArrayList<DataProvider>();
+    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<DataProvider> dp = new ArrayList<DataProvider>();
+    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 +135,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 +171,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,7 +195,7 @@ public class HttpResultSet extends FileParse
       if (br != null)
       {
         dataIn = new BufferedReader(br);
-        error=false;
+        error = false;
       }
     }
   }
@@ -142,4 +219,20 @@ public class HttpResultSet extends FileParse
     super.finalize();
   }
 
+  /**
+   * 
+   * @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;
+    }
+  }
+
 }