X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fdbsources%2FPDBRestClient.java;h=320b1c57d670e0027d0660f1df25b8cf43f69629;hb=4d7f98a6dd54d9863ba449ec79dcd95d25ed863d;hp=02523da6a52a66befcf3b3587856db1f954e8075;hpb=dc53250eeeb8c854c876b0fc896c541bd8cd8710;p=jalview.git diff --git a/src/jalview/ws/dbsources/PDBRestClient.java b/src/jalview/ws/dbsources/PDBRestClient.java index 02523da..320b1c5 100644 --- a/src/jalview/ws/dbsources/PDBRestClient.java +++ b/src/jalview/ws/dbsources/PDBRestClient.java @@ -1,5 +1,6 @@ package jalview.ws.dbsources; +import jalview.util.MessageManager; import jalview.ws.uimodel.PDBRestRequest; import jalview.ws.uimodel.PDBRestResponse; import jalview.ws.uimodel.PDBRestResponse.PDBResponseSummary; @@ -21,7 +22,6 @@ 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 com.sun.jersey.api.json.JSONConfiguration; /** * A rest client for querying the Search endpoing of the PDB REST API @@ -41,61 +41,114 @@ public class PDBRestClient * @param pdbRestRequest * the PDBRestRequest instance to be processed * @return the pdbResponse object for the given request + * @throws Exception */ public PDBRestResponse executeRequest(PDBRestRequest pdbRestRequest) + throws Exception { - ClientConfig clientConfig = new DefaultClientConfig(); - clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, - Boolean.TRUE); - Client client = Client.create(clientConfig); - - String wantedFields = getPDBDocFieldsAsCommaDelimitedString(pdbRestRequest - .getWantedFields()); - int responseSize = (pdbRestRequest.getResponseSize() == 0) ? DEFAULT_RESPONSE_SIZE - : pdbRestRequest.getResponseSize(); - String sortParam = (pdbRestRequest.getFieldToSortBy() == null || pdbRestRequest - .getFieldToSortBy().trim().isEmpty()) ? "" : (pdbRestRequest - .getFieldToSortBy() + (pdbRestRequest.isAscending() ? " asc" - : " desc")); - - // Build request parameters for the REST Request - WebResource webResource = client.resource(PDB_SEARCH_ENDPOINT) - .queryParam("wt", "json").queryParam("fl", wantedFields) - .queryParam("rows", String.valueOf(responseSize)) - .queryParam("q", pdbRestRequest.getQuery()) - .queryParam("sort", sortParam); - - // Execute the REST request - ClientResponse clientResponse = webResource.accept( - MediaType.APPLICATION_JSON).get(ClientResponse.class); - - // Get the JSON string from the response object - String responseString = clientResponse.getEntity(String.class); - - // Check the response status and report exception if one occurs - if (clientResponse.getStatus() != 200) + try + { + ClientConfig clientConfig = new DefaultClientConfig(); + Client client = Client.create(clientConfig); + + String wantedFields = getPDBDocFieldsAsCommaDelimitedString(pdbRestRequest + .getWantedFields()); + int responseSize = (pdbRestRequest.getResponseSize() == 0) ? DEFAULT_RESPONSE_SIZE + : pdbRestRequest.getResponseSize(); + String sortParam = (pdbRestRequest.getFieldToSortBy() == null || pdbRestRequest + .getFieldToSortBy().trim().isEmpty()) ? "" : (pdbRestRequest + .getFieldToSortBy() + (pdbRestRequest.isAscending() ? " asc" + : " desc")); + // Build request parameters for the REST Request + WebResource webResource = client.resource(PDB_SEARCH_ENDPOINT) + .queryParam("wt", "json").queryParam("fl", wantedFields) + .queryParam("rows", String.valueOf(responseSize)) + .queryParam("q", pdbRestRequest.getQuery()) + .queryParam("sort", sortParam); + + // Execute the REST request + ClientResponse clientResponse = webResource.accept( + MediaType.APPLICATION_JSON).get(ClientResponse.class); + + // Get the JSON string from the response object + String responseString = clientResponse.getEntity(String.class); + + // Check the response status and report exception if one occurs + if (clientResponse.getStatus() != 200) + { + String errorMessage = ""; + if (clientResponse.getStatus() == 400) + { + errorMessage = parseJsonExceptionString(responseString); + throw new Exception(errorMessage); + } + else + { + errorMessage = getMessageByHTTPStatusCode(clientResponse + .getStatus()); + throw new Exception(errorMessage); + } + } + + // 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); + } catch (Exception e) { - String errorMessage = ""; - if (clientResponse.getStatus() == 400) + String exceptionMsg = e.getMessage(); + if (exceptionMsg.contains("SocketException")) + { + // No internet connection + throw new Exception( + MessageManager + .getString("exception.unable_to_detect_internet_connection")); + } + else if (exceptionMsg.contains("UnknownHostException")) { - errorMessage = parseJsonExceptionString(responseString); - throw new RuntimeException(errorMessage); + // The server 'www.ebi.ac.uk' is unreachable + throw new Exception( + MessageManager + .getString("exception.pdb_server_unreachable")); } else { - errorMessage = "Failed : HTTP error code : " - + clientResponse.getStatus(); - throw new RuntimeException(errorMessage); + throw e; } } + } - // 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); + public String getMessageByHTTPStatusCode(int code) + { + String message = ""; + switch (code) + { + case 410: + message = MessageManager + .getString("exception.pdb_rest_service_no_longer_available"); + break; + case 403: + case 404: + message = MessageManager.getString("exception.resource_not_be_found"); + break; + case 408: + case 409: + case 500: + case 501: + case 502: + case 503: + case 504: + case 505: + message = MessageManager.getString("exception.pdb_server_error"); + break; + + default: + break; + } + return message; } /** @@ -217,30 +270,29 @@ public class PDBRestClient * table. The PDB Id serves as a unique identifier for a given row in the * summary table * - * @param wantedFeilds + * @param wantedFields * the available table columns in no particular order * @return the pdb id field column index */ public static int getPDBIdColumIndex( - Collection wantedFeilds, boolean hasRefSeq) + Collection wantedFields, boolean hasRefSeq) { // If a reference sequence is attached then start counting from 1 else // start from zero - int pdbFeildIndexCounter = hasRefSeq ? 1 : 0; + int pdbFieldIndexCounter = hasRefSeq ? 1 : 0; - for (PDBDocField feild : wantedFeilds) + for (PDBDocField field : wantedFields) { - if (feild.equals(PDBDocField.PDB_ID)) + if (field.equals(PDBDocField.PDB_ID)) { break; // Once PDB Id index is determined exit iteration } - ++pdbFeildIndexCounter; + ++pdbFieldIndexCounter; } - return pdbFeildIndexCounter; + return pdbFieldIndexCounter; } - /** * This enum represents the fields available in the PDB JSON response *