2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
22 package jalview.fts.service.uniprot;
24 import jalview.fts.api.FTSData;
25 import jalview.fts.api.FTSDataColumnI;
26 import jalview.fts.api.FTSRestClientI;
27 import jalview.fts.core.FTSRestClient;
28 import jalview.fts.core.FTSRestRequest;
29 import jalview.fts.core.FTSRestResponse;
30 import jalview.util.MessageManager;
32 import java.util.ArrayList;
33 import java.util.Collection;
34 import java.util.List;
35 import java.util.Objects;
37 import javax.ws.rs.core.MediaType;
39 import com.sun.jersey.api.client.Client;
40 import com.sun.jersey.api.client.ClientResponse;
41 import com.sun.jersey.api.client.WebResource;
42 import com.sun.jersey.api.client.config.ClientConfig;
43 import com.sun.jersey.api.client.config.DefaultClientConfig;
45 public class UniProtFTSRestClient extends FTSRestClient
47 private static FTSRestClientI instance = null;
49 public static final String UNIPROT_SEARCH_ENDPOINT = "http://www.uniprot.org/uniprot/?";
52 public FTSRestResponse executeRequest(FTSRestRequest uniportRestRequest)
57 ClientConfig clientConfig = new DefaultClientConfig();
58 Client client = Client.create(clientConfig);
60 String wantedFields = getDataColumnsFieldsAsCommaDelimitedString(uniportRestRequest
62 int responseSize = (uniportRestRequest.getResponseSize() == 0) ? getDefaultResponsePageSize()
63 : uniportRestRequest.getResponseSize();
65 int offSet = uniportRestRequest.getOffSet();
67 String query = uniportRestRequest.getFieldToSearchBy()
68 .equalsIgnoreCase("Search All") ? uniportRestRequest
69 .getSearchTerm() : uniportRestRequest.getFieldToSearchBy()
70 + ":" + uniportRestRequest.getSearchTerm();
72 // + (uniportRestRequest.isAllowUnpublishedEntries() ? ""
73 // : " AND status:REL");
74 // System.out.println(">>>>> Query : " + query);
75 // System.out.println(">>>>> Columns : " + wantedFields);
76 // System.out.println(">>>>> Response size: " + responseSize
79 WebResource webResource = null;
80 webResource = client.resource(UNIPROT_SEARCH_ENDPOINT)
81 .queryParam("format", "tab")
82 .queryParam("columns", wantedFields)
83 .queryParam("limit", String.valueOf(responseSize))
84 .queryParam("offset", String.valueOf(offSet))
85 .queryParam("sort", "score").queryParam("query", query);
86 // Execute the REST request
87 ClientResponse clientResponse = webResource.accept(
88 MediaType.TEXT_PLAIN).get(ClientResponse.class);
89 String uniProtTabDelimittedResponseString = clientResponse
90 .getEntity(String.class);
91 // Make redundant objects eligible for garbage collection to conserve
93 // System.out.println(">>>>> response : "
94 // + uniProtTabDelimittedResponseString);
95 if (clientResponse.getStatus() != 200)
97 String errorMessage = getMessageByHTTPStatusCode(
98 clientResponse.getStatus(), "Uniprot");
99 throw new Exception(errorMessage);
102 clientResponse = null;
104 return parseUniprotResponse(uniProtTabDelimittedResponseString,
106 } catch (Exception e)
108 String exceptionMsg = e.getMessage();
109 if (exceptionMsg.contains("SocketException"))
111 // No internet connection
114 .getString("exception.unable_to_detect_internet_connection"));
116 else if (exceptionMsg.contains("UnknownHostException"))
118 // The server 'http://www.uniprot.org' is unreachable
119 throw new Exception(MessageManager.formatMessage(
120 "exception.fts_server_unreachable", "Uniprot"));
130 public FTSRestResponse parseUniprotResponse(
131 String uniProtTabDelimittedResponseString,
132 FTSRestRequest uniprotRestRequest)
134 FTSRestResponse searchResult = new FTSRestResponse();
135 List<FTSData> result = null;
136 if (uniProtTabDelimittedResponseString == null
137 || uniProtTabDelimittedResponseString.trim().isEmpty())
139 searchResult.setNumberOfItemsFound(0);
142 String[] foundDataRow = uniProtTabDelimittedResponseString.split("\n");
143 if (foundDataRow != null && foundDataRow.length > 0)
145 result = new ArrayList<FTSData>();
146 String titleRow = getDataColumnsFieldsAsTabDelimitedString(uniprotRestRequest
148 // System.out.println(">>>>Title row : " + titleRow);
149 for (String dataRow : foundDataRow)
151 if (dataRow.equalsIgnoreCase(titleRow))
153 // System.out.println(">>>>>>>>>> matched!!!");
156 // System.out.println(dataRow);
157 result.add(getFTSData(dataRow, uniprotRestRequest));
159 searchResult.setNumberOfItemsFound(result.size());
160 searchResult.setSearchSummary(result);
166 * Takes a collection of FTSDataColumnI and converts its 'code' values into a
167 * tab delimited string.
169 * @param dataColumnFields
170 * the collection of FTSDataColumnI to process
171 * @return the generated comma delimited string from the supplied
172 * FTSDataColumnI collection
174 private String getDataColumnsFieldsAsTabDelimitedString(
175 Collection<FTSDataColumnI> dataColumnFields)
178 if (dataColumnFields != null && !dataColumnFields.isEmpty())
180 StringBuilder returnedFields = new StringBuilder();
181 for (FTSDataColumnI field : dataColumnFields)
183 if (field.getName().equalsIgnoreCase("Uniprot Id"))
185 returnedFields.append("\t").append("Entry");
189 returnedFields.append("\t").append(field.getName());
192 returnedFields.deleteCharAt(0);
193 result = returnedFields.toString();
198 public static FTSData getFTSData(String tabDelimittedDataStr,
199 FTSRestRequest request)
201 String primaryKey = null;
203 Object[] summaryRowData;
205 Collection<FTSDataColumnI> diplayFields = request.getWantedFields();
207 summaryRowData = new Object[diplayFields.size()];
208 String[] columns = tabDelimittedDataStr.split("\t");
209 for (FTSDataColumnI field : diplayFields)
213 String fieldData = columns[colCounter];
214 if (field.isPrimaryKeyColumn())
216 primaryKey = fieldData;
217 summaryRowData[colCounter++] = primaryKey;
219 else if (fieldData == null || fieldData.isEmpty())
221 summaryRowData[colCounter++] = null;
227 summaryRowData[colCounter++] = (field.getDataColumnClass() == Integer.class) ? Integer
229 : (field.getDataColumnClass() == Double.class) ? Double
230 .valueOf(fieldData) : fieldData;
231 } catch (Exception e)
234 System.out.println("offending value:" + fieldData);
237 } catch (Exception e)
239 // e.printStackTrace();
243 final String primaryKey1 = primaryKey;
245 final Object[] summaryRowData1 = summaryRowData;
249 public Object[] getSummaryData()
251 return summaryRowData1;
255 public Object getPrimaryKey()
261 * Returns a string representation of this object;
264 public String toString()
266 StringBuilder summaryFieldValues = new StringBuilder();
267 for (Object summaryField : summaryRowData1)
269 summaryFieldValues.append(
270 summaryField == null ? " " : summaryField.toString())
273 return summaryFieldValues.toString();
277 * Returns hash code value for this object
280 public int hashCode()
282 return Objects.hash(primaryKey1, this.toString());
286 public boolean equals(Object that)
288 return this.toString().equals(that.toString());
294 public static FTSRestClientI getInstance()
296 if (instance == null)
298 instance = new UniProtFTSRestClient();
304 public String getColumnDataConfigFileName()
306 return "/fts/uniprot_data_columns.txt";