X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=blobdiff_plain;f=src%2Fjalview%2Ffts%2Fservice%2Fpdb%2FPDBFTSRestClient.java;fp=src%2Fjalview%2Ffts%2Fservice%2Fpdb%2FPDBFTSRestClient.java;h=c52da400ae3cf98a37a2920141bbbfc52b8ec80f;hp=5293c3206d7ef8f683cabbb2dc3e2e76f96c3f14;hb=e95c5f895775891d55d9f23d5da64f8ce6bd07bb;hpb=74f21ca6ca8fa17d53708e457d191e15904f8310 diff --git a/src/jalview/fts/service/pdb/PDBFTSRestClient.java b/src/jalview/fts/service/pdb/PDBFTSRestClient.java index 5293c32..c52da40 100644 --- a/src/jalview/fts/service/pdb/PDBFTSRestClient.java +++ b/src/jalview/fts/service/pdb/PDBFTSRestClient.java @@ -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 clientResponseClass; + if (Platform.isJS()) + { + // JavaScript only -- coerce types to Java types for Java + client = (Client) (Object) new jalview.javascript.web.Client(); + clientResponseClass = (Class) (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 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 jsonObj = (Map) JSONUtils.parse(jsonErrorResponse); + Map errorResponse = (Map) jsonObj.get("error"); - JSONObject responseHeader = (JSONObject) jsonObj + Map responseHeader = (Map) jsonObj .get("responseHeader"); - JSONObject paramsObj = (JSONObject) responseHeader.get("params"); + Map paramsObj = (Map) 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) null, pdbRestRequest); + } + + @SuppressWarnings("unchecked") + public static FTSRestResponse parsePDBJsonResponse( + String pdbJsonResponseString, Map jsonObj, + FTSRestRequest pdbRestRequest) + { FTSRestResponse searchResult = new FTSRestResponse(); List 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) JSONUtils.parse(pdbJsonResponseString); + } + Map pdbResponse = (Map) jsonObj.get("response"); + String queryTime = ((Map) jsonObj.get("responseHeader")) .get("QTime").toString(); int numFound = Integer .valueOf(pdbResponse.get("numFound").toString()); if (numFound > 0) { - result = new ArrayList(); - JSONArray docs = (JSONArray) pdbResponse.get("docs"); - for (Iterator docIter = docs.iterator(); docIter + result = new ArrayList<>(); + List docs = (List) pdbResponse.get("docs"); + for (Iterator docIter = docs.iterator(); docIter .hasNext();) { - JSONObject doc = docIter.next(); + Map doc = (Map) 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 pdbJsonDoc, FTSRestRequest request) { @@ -421,10 +474,12 @@ public class PDBFTSRestClient extends FTSRestClient if (allDefaultDisplayedStructureDataColumns == null || allDefaultDisplayedStructureDataColumns.isEmpty()) { - allDefaultDisplayedStructureDataColumns = new ArrayList(); + allDefaultDisplayedStructureDataColumns = new ArrayList<>(); allDefaultDisplayedStructureDataColumns .addAll(super.getAllDefaultDisplayedFTSDataColumns()); } return allDefaultDisplayedStructureDataColumns; } + + }