X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Ffts%2Fservice%2Fpdb%2FPDBFTSRestClient.java;h=04fb17ccec449d7e03ab3fb41ad9e40280ea1fee;hb=45be678db479035369eab0a1a1ab570c7c342bbb;hp=a5b441f10877c2a3f6a48b93542966fb66c5b6a2;hpb=0ddbb5cb5c0ae3e53d344c624c717d5ca3085d5f;p=jalview.git diff --git a/src/jalview/fts/service/pdb/PDBFTSRestClient.java b/src/jalview/fts/service/pdb/PDBFTSRestClient.java index a5b441f..04fb17c 100644 --- a/src/jalview/fts/service/pdb/PDBFTSRestClient.java +++ b/src/jalview/fts/service/pdb/PDBFTSRestClient.java @@ -20,51 +20,44 @@ */ package jalview.fts.service.pdb; -import jalview.datamodel.SequenceI; -import jalview.fts.api.FTSData; -import jalview.fts.api.FTSDataColumnI; -import jalview.fts.api.FTSRestClientI; -import jalview.fts.core.FTSRestClient; -import jalview.fts.core.FTSRestRequest; -import jalview.fts.core.FTSRestResponse; -import jalview.util.MessageManager; - 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 jalview.javascript.web.Client; -//import jalview.javascript.web.ClientResponse; -//import jalview.javascript.web.WebResource; - 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; +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; + /** * A rest client for querying the Search endpoint of the PDB API * - * BH 2018: just a tiny tweak here - for SwingJS, we coerce the classes to be - * from jalview.javascript.web instead of com.sun.jersey.api.client - * - * * @author tcnofoegbu - * */ -public class PDBFTSRestClient extends FTSRestClient +public class PDBFTSRestClient extends FTSRestClient implements StructureFTSRestClientI { private static FTSRestClientI instance = null; @@ -90,9 +83,6 @@ public class PDBFTSRestClient extends FTSRestClient { try { - Client client; - WebResource webResource; - String wantedFields = getDataColumnsFieldsAsCommaDelimitedString( pdbRestRequest.getWantedFields()); int responseSize = (pdbRestRequest.getResponseSize() == 0) @@ -137,21 +127,26 @@ public class PDBFTSRestClient extends FTSRestClient // 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 (/** @j2sNative true || */ - false) + 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 + */ { - // Java only client = Client.create(new DefaultClientConfig()); clientResponseClass = ClientResponse.class; } + WebResource webResource; if (pdbRestRequest.isFacet()) { webResource = client.resource(PDB_SEARCH_ENDPOINT) @@ -174,38 +169,42 @@ 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 ); - // Get the JSON string from the response object - String responseString = clientResponse.getEntity(String.class); - // System.out.println("query >>>>>>> " + pdbRestRequest.toString()); + // Get the JSON string from the response object or directly from the + // client (JavaScript) + Map jsonObj = null; + String responseString = null; + + System.out.println("query >>>>>>> " + pdbRestRequest.toString()); // Check the response status and report exception if one occurs - if (clientResponse.getStatus() != 200) + int responseStatus = clientResponse.getStatus(); + switch (responseStatus) { - String errorMessage = ""; - if (clientResponse.getStatus() == 400) + case 200: + if (Platform.isJS()) { - errorMessage = parseJsonExceptionString(responseString); - throw new Exception(errorMessage); + jsonObj = clientResponse.getEntity(Map.class); } else { - errorMessage = getMessageByHTTPStatusCode( - clientResponse.getStatus(), "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(); @@ -235,7 +234,8 @@ 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"); @@ -262,13 +262,12 @@ public class PDBFTSRestClient extends FTSRestClient // 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(); @@ -298,37 +297,48 @@ 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()); + List docs = (List) pdbResponse.get("docs"); + // add in any alphafold bits at the top + result = AlphafoldRestClient.getFTSData(pdbRestRequest); if (numFound > 0) { - result = new ArrayList(); - JSONArray docs = (JSONArray) pdbResponse.get("docs"); - for (Iterator docIter = docs.iterator(); docIter + + for (Iterator docIter = docs.iterator(); docIter .hasNext();) { - JSONObject doc = docIter.next(); + Map doc = (Map) docIter.next(); result.add(getFTSData(doc, pdbRestRequest)); } - searchResult.setNumberOfItemsFound(numFound); - searchResult.setResponseTime(queryTime); - searchResult.setSearchSummary(result); } + searchResult.setNumberOfItemsFound(result.size()); + searchResult.setResponseTime(queryTime); + searchResult.setSearchSummary(result); + } catch (ParseException e) { e.printStackTrace(); @@ -336,7 +346,7 @@ public class PDBFTSRestClient extends FTSRestClient return searchResult; } - public static FTSData getFTSData(JSONObject pdbJsonDoc, + public static FTSData getFTSData(Map pdbJsonDoc, FTSRestRequest request) { @@ -361,8 +371,10 @@ public class PDBFTSRestClient extends FTSRestClient for (FTSDataColumnI field : diplayFields) { + //System.out.println("Field " + field); String fieldData = (pdbJsonDoc.get(field.getCode()) == null) ? "" : pdbJsonDoc.get(field.getCode()).toString(); + //System.out.println("Field Data : " + fieldData); if (field.isPrimaryKeyColumn()) { primaryKey = fieldData; @@ -465,45 +477,36 @@ public class PDBFTSRestClient extends FTSRestClient } private Collection allDefaultDisplayedStructureDataColumns; - + @Override public Collection getAllDefaultDisplayedStructureDataColumns() { if (allDefaultDisplayedStructureDataColumns == null || allDefaultDisplayedStructureDataColumns.isEmpty()) { - allDefaultDisplayedStructureDataColumns = new ArrayList(); + allDefaultDisplayedStructureDataColumns = new ArrayList<>(); allDefaultDisplayedStructureDataColumns .addAll(super.getAllDefaultDisplayedFTSDataColumns()); } return allDefaultDisplayedStructureDataColumns; } - - public static void main(String[] args) { - - - // check for transpiler fix associated with JSONParser yylex.java use of charAt() - // instead of codePointAt() - - String s = "e"; - char c = 'c'; - char f = 'f'; - s += c | f; - int x = c&f; - int y = 2 & c; - int z = c ^ 5; - String result = s +x + y + z; - assert (result == "e103982102"); - JSONParser jsonParser = new JSONParser(); - try - { - JSONObject jsonObj = (JSONObject) jsonParser.parse("{\"a\":3}"); - System.out.println(jsonObj); - } catch (ParseException e) + @Override + public String[] getPreferencesColumnsFor(PreferenceSource source) { + String[] columnNames = null; + switch (source) { - e.printStackTrace(); + 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; } - - }