X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Ffts%2Fservice%2Funiprot%2FUniProtFTSRestClient.java;h=2606b628b01a694d7347c3a1d3144480c0cf0de0;hb=8879d902c46cd33cfe201fcbd96e87d33b89259f;hp=310b1c67066cd64665b1c8ac33655130368fc222;hpb=ce26ffcae5e876cf4127173c92f0eddffc9830da;p=jalview.git diff --git a/src/jalview/fts/service/uniprot/UniProtFTSRestClient.java b/src/jalview/fts/service/uniprot/UniProtFTSRestClient.java index 310b1c6..2606b62 100644 --- a/src/jalview/fts/service/uniprot/UniProtFTSRestClient.java +++ b/src/jalview/fts/service/uniprot/UniProtFTSRestClient.java @@ -21,13 +21,6 @@ package jalview.fts.service.uniprot; -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 java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -38,83 +31,229 @@ import javax.ws.rs.core.MediaType; 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.bin.Cache; +import jalview.bin.Console; +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 jalview.util.Platform; + public class UniProtFTSRestClient extends FTSRestClient { + private static final String DEFAULT_UNIPROT_DOMAIN = "https://legacy.uniprot.org"; + + static + { + Platform.addJ2SDirectDatabaseCall(DEFAULT_UNIPROT_DOMAIN); + } + private static FTSRestClientI instance = null; - public static final String UNIPROT_SEARCH_ENDPOINT = "http://www.uniprot.org/uniprot/?"; + public final String uniprotSearchEndpoint; + + public UniProtFTSRestClient() + { + super(); + uniprotSearchEndpoint = Cache.getDefault("UNIPROT_DOMAIN", + DEFAULT_UNIPROT_DOMAIN) + "/uniprot/"; + } + @SuppressWarnings("unchecked") @Override - public FTSRestResponse executeRequest(FTSRestRequest uniportRestRequest) + public FTSRestResponse executeRequest(FTSRestRequest uniprotRestRequest) + throws Exception { - ClientConfig clientConfig = new DefaultClientConfig(); - Client client = Client.create(clientConfig); - - String wantedFields = getDataColumnsFieldsAsCommaDelimitedString(uniportRestRequest - .getWantedFields()); - int responseSize = (uniportRestRequest.getResponseSize() == 0) ? getDefaultResponsePageSize() - : uniportRestRequest.getResponseSize(); - - String query = uniportRestRequest.getFieldToSearchBy() + ":" - + uniportRestRequest.getSearchTerm(); - // + (uniportRestRequest.isAllowUnpublishedEntries() ? "" - // : " AND status:REL"); - // System.out.println(">>>>> Query : " + query); - // System.out.println(">>>>> Columns : " + wantedFields); - WebResource webResource = null; - webResource = client.resource(UNIPROT_SEARCH_ENDPOINT) - .queryParam("format", "tab") - .queryParam("columns", wantedFields) - .queryParam("limit", String.valueOf(responseSize)) - .queryParam("query", query); - // Execute the REST request - ClientResponse clientResponse = webResource - .accept(MediaType.TEXT_PLAIN).get(ClientResponse.class); - String uniProtTabDelimittedResponseString = clientResponse - .getEntity(String.class); - // Make redundant objects eligible for garbage collection to conserve - // memory - clientResponse = null; - client = null; - // System.out.println(">>>>> response : " - // + uniProtTabDelimittedResponseString); - return parseUniprotResponse(uniProtTabDelimittedResponseString, - uniportRestRequest); + try + { + String wantedFields = getDataColumnsFieldsAsCommaDelimitedString( + uniprotRestRequest.getWantedFields()); + int responseSize = (uniprotRestRequest.getResponseSize() == 0) + ? getDefaultResponsePageSize() + : uniprotRestRequest.getResponseSize(); + + int offSet = uniprotRestRequest.getOffSet(); + String query; + if (isAdvancedQuery(uniprotRestRequest.getSearchTerm())) + { + query = uniprotRestRequest.getSearchTerm(); + } + else + { + query = uniprotRestRequest.getFieldToSearchBy() + .equalsIgnoreCase("Search All") + ? uniprotRestRequest.getSearchTerm() + + " or mnemonic:" + + uniprotRestRequest.getSearchTerm() + : uniprotRestRequest.getFieldToSearchBy() + ":" + + uniprotRestRequest.getSearchTerm(); + } + + // 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 + */ + { + // Java only + client = Client.create(new DefaultClientConfig()); + clientResponseClass = ClientResponse.class; + } + + WebResource webResource = null; + webResource = client.resource(uniprotSearchEndpoint) + .queryParam("format", "tab") + .queryParam("columns", wantedFields) + .queryParam("limit", String.valueOf(responseSize)) + .queryParam("offset", String.valueOf(offSet)) + .queryParam("sort", "score").queryParam("query", query); + if (Console.isDebugEnabled()) + { + Console.debug("Uniprot FTS Request: " + webResource.toString()); + } + // Execute the REST request + ClientResponse clientResponse = webResource + .accept(MediaType.TEXT_PLAIN).get(clientResponseClass); + String uniProtTabDelimittedResponseString = clientResponse + .getEntity(String.class); + // Make redundant objects eligible for garbage collection to conserve + // memory + // System.out.println(">>>>> response : " + // + uniProtTabDelimittedResponseString); + if (clientResponse.getStatus() != 200) + { + String errorMessage = getMessageByHTTPStatusCode( + clientResponse.getStatus(), "Uniprot"); + throw new Exception(errorMessage); + + } + int xTotalResults = Platform.isJS() ? 1 + : Integer.valueOf(clientResponse.getHeaders() + .get("X-Total-Results").get(0)); + clientResponse = null; + client = null; + return parseUniprotResponse(uniProtTabDelimittedResponseString, + uniprotRestRequest, xTotalResults); + } catch (Exception e) + { + 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")) + { + // The server 'http://www.uniprot.org' is unreachable + throw new Exception(MessageManager.formatMessage( + "exception.fts_server_unreachable", "Uniprot")); + } + else + { + throw e; + } + } + } + public boolean isAdvancedQuery(String query) + { + if (query.contains(" AND ") || query.contains(" OR ") + || query.contains(" NOT ") || query.contains(" ! ") + || query.contains(" || ") || query.contains(" && ") + || query.contains(":") || query.contains("-")) + { + return true; + } + return false; } public FTSRestResponse parseUniprotResponse( String uniProtTabDelimittedResponseString, - FTSRestRequest uniprotRestRequest) + FTSRestRequest uniprotRestRequest, int xTotalResults) { FTSRestResponse searchResult = new FTSRestResponse(); List result = null; + if (uniProtTabDelimittedResponseString == null + || uniProtTabDelimittedResponseString.trim().isEmpty()) + { + searchResult.setNumberOfItemsFound(0); + return searchResult; + } String[] foundDataRow = uniProtTabDelimittedResponseString.split("\n"); if (foundDataRow != null && foundDataRow.length > 0) { - result = new ArrayList(); - String titleRow = getDataColumnsFieldsAsTabDelimitedString(uniprotRestRequest - .getWantedFields()); - // System.out.println(">>>>Title row : " + titleRow); + result = new ArrayList<>(); + boolean firstRow = true; for (String dataRow : foundDataRow) { - if (dataRow.equalsIgnoreCase(titleRow)) + // The first data row is usually the header data. This should be + // filtered out from the rest of the data See: JAL-2485 + if (firstRow) { - // System.out.println(">>>>>>>>>> matched!!!"); + firstRow = false; continue; } // System.out.println(dataRow); result.add(getFTSData(dataRow, uniprotRestRequest)); } - searchResult.setNumberOfItemsFound(result.size()); + searchResult.setNumberOfItemsFound(xTotalResults); searchResult.setSearchSummary(result); } return searchResult; } + // /** + // * Takes a collection of FTSDataColumnI and converts its 'code' values into + // a + // * tab delimited string. + // * + // * @param dataColumnFields + // * the collection of FTSDataColumnI to process + // * @return the generated comma delimited string from the supplied + // * FTSDataColumnI collection + // */ + // private String getDataColumnsFieldsAsTabDelimitedString( + // Collection dataColumnFields) + // { + // String result = ""; + // if (dataColumnFields != null && !dataColumnFields.isEmpty()) + // { + // StringBuilder returnedFields = new StringBuilder(); + // for (FTSDataColumnI field : dataColumnFields) + // { + // if (field.getName().equalsIgnoreCase("Uniprot Id")) + // { + // returnedFields.append("\t").append("Entry"); + // } + // else + // { + // returnedFields.append("\t").append(field.getName()); + // } + // } + // returnedFields.deleteCharAt(0); + // result = returnedFields.toString(); + // } + // return result; + // } + public static FTSData getFTSData(String tabDelimittedDataStr, FTSRestRequest request) { @@ -144,14 +283,17 @@ public class UniProtFTSRestClient extends FTSRestClient { try { - summaryRowData[colCounter++] = (field.getDataColumnClass() == Integer.class) ? Integer - .valueOf(fieldData) - : (field.getDataColumnClass() == Double.class) ? Double - .valueOf(fieldData) : fieldData; + summaryRowData[colCounter++] = (field.getDataType() + .getDataTypeClass() == Integer.class) + ? Integer.valueOf(fieldData.replace(",", "")) + : (field.getDataType() + .getDataTypeClass() == Double.class) + ? Double.valueOf(fieldData) + : fieldData; } catch (Exception e) { e.printStackTrace(); - System.out.println("offending value:" + fieldData); + System.out.println("offending value:" + fieldData); } } } catch (Exception e) @@ -201,10 +343,15 @@ public class UniProtFTSRestClient extends FTSRestClient { return Objects.hash(primaryKey1, this.toString()); } + + @Override + public boolean equals(Object that) + { + return this.toString().equals(that.toString()); + } }; } - public static FTSRestClientI getInstance() { if (instance == null) @@ -217,7 +364,7 @@ public class UniProtFTSRestClient extends FTSRestClient @Override public String getColumnDataConfigFileName() { - return getResourceFile("fts/uniprot_data_columns.conf"); + return "/fts/uniprot_data_columns.txt"; } }