Merge branch 'Jalview-JS/develop' into merge/Ben_trying_out_JSdevelop_with_develop
[jalview.git] / src / jalview / fts / service / pdb / PDBFTSRestClient.java
index 5293c32..c52da40 100644 (file)
@@ -27,32 +27,31 @@ import jalview.fts.api.FTSRestClientI;
 import jalview.fts.core.FTSRestClient;
 import jalview.fts.core.FTSRestRequest;
 import jalview.fts.core.FTSRestResponse;
+import jalview.util.JSONUtils;
 import jalview.util.MessageManager;
+import jalview.util.Platform;
 
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 import javax.ws.rs.core.MediaType;
 
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
 import com.sun.jersey.api.client.Client;
 import com.sun.jersey.api.client.ClientResponse;
 import com.sun.jersey.api.client.WebResource;
-import com.sun.jersey.api.client.config.ClientConfig;
 import com.sun.jersey.api.client.config.DefaultClientConfig;
 
 /**
  * A rest client for querying the Search endpoint of the PDB API
  * 
  * @author tcnofoegbu
- *
  */
 public class PDBFTSRestClient extends FTSRestClient
 {
@@ -73,15 +72,13 @@ public class PDBFTSRestClient extends FTSRestClient
    * @return the pdbResponse object for the given request
    * @throws Exception
    */
+  @SuppressWarnings({ "unused", "unchecked" })
   @Override
   public FTSRestResponse executeRequest(FTSRestRequest pdbRestRequest)
           throws Exception
   {
     try
     {
-      ClientConfig clientConfig = new DefaultClientConfig();
-      Client client = Client.create(clientConfig);
-
       String wantedFields = getDataColumnsFieldsAsCommaDelimitedString(
               pdbRestRequest.getWantedFields());
       int responseSize = (pdbRestRequest.getResponseSize() == 0)
@@ -123,7 +120,29 @@ public class PDBFTSRestClient extends FTSRestClient
                       : " AND status:REL");
 
       // Build request parameters for the REST Request
-      WebResource webResource = null;
+
+      // 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())
+      {
+        // JavaScript only -- coerce types to Java types for Java
+        client = (Client) (Object) new jalview.javascript.web.Client();
+        clientResponseClass = (Class<ClientResponse>) (Object) jalview.javascript.web.ClientResponse.class;
+      }
+      else
+      /**
+       * Java only
+       * 
+       * @j2sIgnore
+       */
+      {
+        client = Client.create(new DefaultClientConfig());
+        clientResponseClass = ClientResponse.class;
+      }
+
+      WebResource webResource;
       if (pdbRestRequest.isFacet())
       {
         webResource = client.resource(PDB_SEARCH_ENDPOINT)
@@ -143,39 +162,45 @@ public class PDBFTSRestClient extends FTSRestClient
                 .queryParam("start", String.valueOf(offSet))
                 .queryParam("q", query).queryParam("sort", sortParam);
       }
+
+      URI uri = webResource.getURI();
+
+      System.out.println(uri);
+
       // Execute the REST request
       ClientResponse clientResponse = webResource
-              .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+              .accept(MediaType.APPLICATION_JSON).get(clientResponseClass );
+
+      // Get the JSON string from the response object or directly from the
+      // client (JavaScript)
+      Map<String, Object> jsonObj = null;
+      String responseString = null;
 
-      // Get the JSON string from the response object
-      String responseString = clientResponse.getEntity(String.class);
       // System.out.println("query >>>>>>> " + pdbRestRequest.toString());
 
       // Check the response status and report exception if one occurs
       int responseStatus = clientResponse.getStatus();
-      if (responseStatus != 200)
+      switch (responseStatus)
       {
-        String errorMessage = "";
-        if (responseStatus == 400)
+      case 200:
+        if (Platform.isJS())
         {
-          errorMessage = parseJsonExceptionString(responseString);
-          throw new Exception(errorMessage);
+          jsonObj = clientResponse.getEntity(Map.class);
         }
         else
         {
-          errorMessage = getMessageByHTTPStatusCode(
-                  responseStatus, "PDB");
-          throw new Exception(errorMessage);
+          responseString = clientResponse.getEntity(String.class);
         }
+        break;
+      case 400:
+        throw new Exception(parseJsonExceptionString(responseString));
+      default:
+        throw new Exception(
+                getMessageByHTTPStatusCode(responseStatus, "PDB"));
       }
 
-      // Make redundant objects eligible for garbage collection to conserve
-      // memory
-      clientResponse = null;
-      client = null;
-
       // Process the response and return the result to the caller.
-      return parsePDBJsonResponse(responseString, pdbRestRequest);
+      return parsePDBJsonResponse(responseString, jsonObj, pdbRestRequest);
     } catch (Exception e)
     {
       String exceptionMsg = e.getMessage();
@@ -205,20 +230,40 @@ public class PDBFTSRestClient extends FTSRestClient
    *          the JSON string containing error message from the server
    * @return the processed error message from the JSON string
    */
-  public static String parseJsonExceptionString(String jsonErrorResponse)
+  @SuppressWarnings("unchecked")
+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"}]
+//      }}
+//    
     try
     {
-      JSONParser jsonParser = new JSONParser();
-      JSONObject jsonObj = (JSONObject) jsonParser.parse(jsonErrorResponse);
-      JSONObject errorResponse = (JSONObject) jsonObj.get("error");
+      Map<String, Object> jsonObj = (Map<String, Object>) JSONUtils.parse(jsonErrorResponse);
+      Map<String, Object> errorResponse = (Map<String, Object>) jsonObj.get("error");
 
-      JSONObject responseHeader = (JSONObject) jsonObj
+      Map<String, Object> responseHeader = (Map<String, Object>) jsonObj
               .get("responseHeader");
-      JSONObject paramsObj = (JSONObject) 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();
@@ -248,31 +293,39 @@ public class PDBFTSRestClient extends FTSRestClient
    *          JSON string
    * @return
    */
-  @SuppressWarnings("unchecked")
   public static FTSRestResponse parsePDBJsonResponse(
           String pdbJsonResponseString, FTSRestRequest pdbRestRequest)
   {
+    return parsePDBJsonResponse(pdbJsonResponseString,
+            (Map<String, Object>) null, pdbRestRequest);
+  }
+
+  @SuppressWarnings("unchecked")
+  public static FTSRestResponse parsePDBJsonResponse(
+          String pdbJsonResponseString, Map<String, Object> jsonObj,
+          FTSRestRequest pdbRestRequest)
+  {
     FTSRestResponse searchResult = new FTSRestResponse();
     List<FTSData> result = null;
     try
     {
-      JSONParser jsonParser = new JSONParser();
-      JSONObject jsonObj = (JSONObject) jsonParser
-              .parse(pdbJsonResponseString);
-
-      JSONObject pdbResponse = (JSONObject) jsonObj.get("response");
-      String queryTime = ((JSONObject) jsonObj.get("responseHeader"))
+      if (jsonObj == null)
+      {
+        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();
       int numFound = Integer
               .valueOf(pdbResponse.get("numFound").toString());
       if (numFound > 0)
       {
-        result = new ArrayList<FTSData>();
-        JSONArray docs = (JSONArray) pdbResponse.get("docs");
-        for (Iterator<JSONObject> docIter = docs.iterator(); docIter
+        result = new ArrayList<>();
+        List<Object> docs = (List<Object>) pdbResponse.get("docs");
+        for (Iterator<Object> docIter = docs.iterator(); docIter
                 .hasNext();)
         {
-          JSONObject doc = docIter.next();
+          Map<String, Object> doc = (Map<String, Object>) docIter.next();
           result.add(getFTSData(doc, pdbRestRequest));
         }
         searchResult.setNumberOfItemsFound(numFound);
@@ -286,7 +339,7 @@ public class PDBFTSRestClient extends FTSRestClient
     return searchResult;
   }
 
-  public static FTSData getFTSData(JSONObject pdbJsonDoc,
+  public static FTSData getFTSData(Map<String, Object> pdbJsonDoc,
           FTSRestRequest request)
   {
 
@@ -421,10 +474,12 @@ public class PDBFTSRestClient extends FTSRestClient
     if (allDefaultDisplayedStructureDataColumns == null
             || allDefaultDisplayedStructureDataColumns.isEmpty())
     {
-      allDefaultDisplayedStructureDataColumns = new ArrayList<FTSDataColumnI>();
+      allDefaultDisplayedStructureDataColumns = new ArrayList<>();
       allDefaultDisplayedStructureDataColumns
               .addAll(super.getAllDefaultDisplayedFTSDataColumns());
     }
     return allDefaultDisplayedStructureDataColumns;
   }
+  
+  
 }