JAL-3829 move mock query and responses to files
[jalview.git] / src / jalview / fts / service / pdb / PDBFTSRestClient.java
index dc7fe41..796bc0e 100644 (file)
  */
 package jalview.fts.service.pdb;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
 import java.net.URI;
+import java.nio.CharBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -41,9 +45,13 @@ import jalview.datamodel.SequenceI;
 import jalview.fts.api.FTSData;
 import jalview.fts.api.FTSDataColumnI;
 import jalview.fts.api.FTSRestClientI;
+import jalview.fts.api.StructureFTSRestClientI;
+import jalview.fts.core.FTSDataColumnPreferences;
+import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
 import jalview.fts.core.FTSRestClient;
 import jalview.fts.core.FTSRestRequest;
 import jalview.fts.core.FTSRestResponse;
+import jalview.fts.service.alphafold.AlphafoldRestClient;
 import jalview.util.JSONUtils;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
@@ -54,6 +62,7 @@ import jalview.util.Platform;
  * @author tcnofoegbu
  */
 public class PDBFTSRestClient extends FTSRestClient
+        implements StructureFTSRestClientI
 {
 
   private static FTSRestClientI instance = null;
@@ -121,8 +130,9 @@ public class PDBFTSRestClient extends FTSRestClient
 
       // Build request parameters for the REST Request
 
-      // BH 2018 the trick here is to coerce the classes in Javascript to be 
-      // different from the ones in Java yet still allow this to be correct for Java
+      // BH 2018 the trick here is to coerce the classes in Javascript to be
+      // different from the ones in Java yet still allow this to be correct for
+      // Java
       Client client;
       Class<ClientResponse> clientResponseClass;
       if (Platform.isJS())
@@ -166,11 +176,8 @@ public class PDBFTSRestClient extends FTSRestClient
       URI uri = webResource.getURI();
 
       System.out.println(uri);
-
-      // Execute the REST request
-      ClientResponse clientResponse = webResource
-              .accept(MediaType.APPLICATION_JSON).get(clientResponseClass );
-
+      ClientResponse clientResponse = null;
+      int responseStatus = -1;
       // Get the JSON string from the response object or directly from the
       // client (JavaScript)
       Map<String, Object> jsonObj = null;
@@ -178,22 +185,51 @@ public class PDBFTSRestClient extends FTSRestClient
 
       System.out.println("query >>>>>>> " + pdbRestRequest.toString());
 
+      if (!isMocked())
+      {
+        // Execute the REST request
+        clientResponse = webResource.accept(MediaType.APPLICATION_JSON)
+                .get(clientResponseClass);
+        responseStatus = clientResponse.getStatus();
+      }
+      else
+      {
+        // mock response
+        if (mockQueries.containsKey(uri.toString()))
+        {
+          responseStatus = 200;
+        }
+        else
+        {
+          // FIXME - may cause unexpected exceptions for callers when mocked
+          responseStatus = 400;
+        }
+      }
+
       // Check the response status and report exception if one occurs
-      int responseStatus = clientResponse.getStatus();
       switch (responseStatus)
       {
       case 200:
-        if (Platform.isJS())
+
+        if (isMocked())
         {
-          jsonObj = clientResponse.getEntity(Map.class);
+          responseString = mockQueries.get(uri.toString());
         }
         else
         {
-          responseString = clientResponse.getEntity(String.class);
+          if (Platform.isJS())
+          {
+            jsonObj = clientResponse.getEntity(Map.class);
+          }
+          else
+          {
+            responseString = clientResponse.getEntity(String.class);
+          }
         }
         break;
       case 400:
-        throw new Exception(parseJsonExceptionString(responseString));
+        throw new Exception(isMocked() ? "400 response (Mocked)"
+                : parseJsonExceptionString(responseString));
       default:
         throw new Exception(
                 getMessageByHTTPStatusCode(responseStatus, "PDB"));
@@ -203,6 +239,10 @@ public class PDBFTSRestClient extends FTSRestClient
       return parsePDBJsonResponse(responseString, jsonObj, pdbRestRequest);
     } catch (Exception e)
     {
+      if (e.getMessage() == null)
+      {
+        throw (e);
+      }
       String exceptionMsg = e.getMessage();
       if (exceptionMsg.contains("SocketException"))
       {
@@ -231,39 +271,42 @@ public class PDBFTSRestClient extends FTSRestClient
    * @return the processed error message from the JSON string
    */
   @SuppressWarnings("unchecked")
-public static String parseJsonExceptionString(String jsonErrorResponse)
+  public static String parseJsonExceptionString(String jsonErrorResponse)
   {
     StringBuilder errorMessage = new StringBuilder(
             "\n============= PDB Rest Client RunTime error =============\n");
 
-    
-//    {
-//      "responseHeader":{
-//        "status":0,
-//        "QTime":0,
-//        "params":{
-//          "q":"(text:q93xj9_soltu) AND molecule_sequence:['' TO *] AND status:REL",
-//          "fl":"pdb_id,title,experimental_method,resolution",
-//          "start":"0",
-//          "sort":"overall_quality desc",
-//          "rows":"500",
-//          "wt":"json"}},
-//      "response":{"numFound":1,"start":0,"docs":[
-//          {
-//            "experimental_method":["X-ray diffraction"],
-//            "pdb_id":"4zhp",
-//            "resolution":2.46,
-//            "title":"The crystal structure of Potato ferredoxin I with 2Fe-2S cluster"}]
-//      }}
-//    
+    // {
+    // "responseHeader":{
+    // "status":0,
+    // "QTime":0,
+    // "params":{
+    // "q":"(text:q93xj9_soltu) AND molecule_sequence:['' TO *] AND status:REL",
+    // "fl":"pdb_id,title,experimental_method,resolution",
+    // "start":"0",
+    // "sort":"overall_quality desc",
+    // "rows":"500",
+    // "wt":"json"}},
+    // "response":{"numFound":1,"start":0,"docs":[
+    // {
+    // "experimental_method":["X-ray diffraction"],
+    // "pdb_id":"4zhp",
+    // "resolution":2.46,
+    // "title":"The crystal structure of Potato ferredoxin I with 2Fe-2S
+    // cluster"}]
+    // }}
+    //
     try
     {
-      Map<String, Object> jsonObj = (Map<String, Object>) JSONUtils.parse(jsonErrorResponse);
-      Map<String, Object> errorResponse = (Map<String, Object>) jsonObj.get("error");
+      Map<String, Object> jsonObj = (Map<String, Object>) JSONUtils
+              .parse(jsonErrorResponse);
+      Map<String, Object> errorResponse = (Map<String, Object>) jsonObj
+              .get("error");
 
       Map<String, Object> responseHeader = (Map<String, Object>) jsonObj
               .get("responseHeader");
-      Map<String, Object> paramsObj = (Map<String, Object>) responseHeader.get("params");
+      Map<String, Object> paramsObj = (Map<String, Object>) responseHeader
+              .get("params");
       String status = responseHeader.get("status").toString();
       String message = errorResponse.get("msg").toString();
       String query = paramsObj.get("q").toString();
@@ -311,27 +354,33 @@ public static String parseJsonExceptionString(String jsonErrorResponse)
     {
       if (jsonObj == null)
       {
-        jsonObj = (Map<String, Object>) JSONUtils.parse(pdbJsonResponseString);
+        jsonObj = (Map<String, Object>) JSONUtils
+                .parse(pdbJsonResponseString);
       }
-      Map<String, Object> pdbResponse = (Map<String, Object>) jsonObj.get("response");
-      String queryTime = ((Map<String, Object>) jsonObj.get("responseHeader"))
-              .get("QTime").toString();
+      Map<String, Object> pdbResponse = (Map<String, Object>) jsonObj
+              .get("response");
+      String queryTime = ((Map<String, Object>) jsonObj
+              .get("responseHeader")).get("QTime").toString();
       int numFound = Integer
               .valueOf(pdbResponse.get("numFound").toString());
+      List<Object> docs = (List<Object>) pdbResponse.get("docs");
+
+      result = new ArrayList<FTSData>();
       if (numFound > 0)
       {
-        result = new ArrayList<>();
-        List<Object> docs = (List<Object>) pdbResponse.get("docs");
-        for (Iterator<Object> docIter = docs.iterator(); docIter
-                .hasNext();)
+
+        for (Iterator<Object> docIter = docs.iterator(); docIter.hasNext();)
         {
           Map<String, Object> doc = (Map<String, Object>) docIter.next();
           result.add(getFTSData(doc, pdbRestRequest));
         }
-        searchResult.setNumberOfItemsFound(numFound);
-        searchResult.setResponseTime(queryTime);
-        searchResult.setSearchSummary(result);
       }
+      // this is the total number found by the query,
+      // rather than the set returned in SearchSummary
+      searchResult.setNumberOfItemsFound(numFound);
+      searchResult.setResponseTime(queryTime);
+      searchResult.setSearchSummary(result);
+
     } catch (ParseException e)
     {
       e.printStackTrace();
@@ -364,10 +413,10 @@ public static String parseJsonExceptionString(String jsonErrorResponse)
 
     for (FTSDataColumnI field : diplayFields)
     {
-      //System.out.println("Field " + field);
+      // System.out.println("Field " + field);
       String fieldData = (pdbJsonDoc.get(field.getCode()) == null) ? ""
               : pdbJsonDoc.get(field.getCode()).toString();
-      //System.out.println("Field Data : " + fieldData);
+      // System.out.println("Field Data : " + fieldData);
       if (field.isPrimaryKeyColumn())
       {
         primaryKey = fieldData;
@@ -471,6 +520,7 @@ public static String parseJsonExceptionString(String jsonErrorResponse)
 
   private Collection<FTSDataColumnI> allDefaultDisplayedStructureDataColumns;
 
+  @Override
   public Collection<FTSDataColumnI> getAllDefaultDisplayedStructureDataColumns()
   {
     if (allDefaultDisplayedStructureDataColumns == null
@@ -482,6 +532,26 @@ public static String parseJsonExceptionString(String jsonErrorResponse)
     }
     return allDefaultDisplayedStructureDataColumns;
   }
-  
-  
+
+  @Override
+  public String[] getPreferencesColumnsFor(PreferenceSource source)
+  {
+    String[] columnNames = null;
+    switch (source)
+    {
+    case SEARCH_SUMMARY:
+      columnNames = new String[] { "", "Display", "Group" };
+      break;
+    case STRUCTURE_CHOOSER:
+      columnNames = new String[] { "", "Display", "Group" };
+      break;
+    case PREFERENCES:
+      columnNames = new String[] { "PDB Field", "Show in search summary",
+          "Show in structure summary" };
+      break;
+    default:
+      break;
+    }
+    return columnNames;
+  }
 }