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;
31 import java.util.ArrayList;
32 import java.util.Collection;
33 import java.util.List;
34 import java.util.Objects;
36 import javax.ws.rs.core.MediaType;
38 import com.sun.jersey.api.client.Client;
39 import com.sun.jersey.api.client.ClientResponse;
40 import com.sun.jersey.api.client.WebResource;
41 import com.sun.jersey.api.client.config.ClientConfig;
42 import com.sun.jersey.api.client.config.DefaultClientConfig;
44 public class UniProtFTSRestClient extends FTSRestClient
46 private static FTSRestClientI instance = null;
48 public static final String UNIPROT_SEARCH_ENDPOINT = "http://www.uniprot.org/uniprot/?";
51 public FTSRestResponse executeRequest(FTSRestRequest uniportRestRequest)
53 ClientConfig clientConfig = new DefaultClientConfig();
54 Client client = Client.create(clientConfig);
56 String wantedFields = getDataColumnsFieldsAsCommaDelimitedString(uniportRestRequest
58 int responseSize = (uniportRestRequest.getResponseSize() == 0) ? getDefaultResponsePageSize()
59 : uniportRestRequest.getResponseSize();
61 int offSet = (uniportRestRequest.getOffSet() == 0) ? getDefaultResponsePageSize()
62 : uniportRestRequest.getOffSet();
64 String query = uniportRestRequest.getFieldToSearchBy()
65 .equalsIgnoreCase("Search All") ? uniportRestRequest
67 : uniportRestRequest.getFieldToSearchBy() + ":"
68 + uniportRestRequest.getSearchTerm();
70 // + (uniportRestRequest.isAllowUnpublishedEntries() ? ""
71 // : " AND status:REL");
72 // System.out.println(">>>>> Query : " + query);
73 // System.out.println(">>>>> Columns : " + wantedFields);
74 WebResource webResource = null;
75 webResource = client.resource(UNIPROT_SEARCH_ENDPOINT)
76 .queryParam("format", "tab")
77 .queryParam("columns", wantedFields)
78 .queryParam("limit", String.valueOf(responseSize))
79 .queryParam("offset", String.valueOf(offSet))
80 .queryParam("sort", "score")
81 .queryParam("query", query);
82 // Execute the REST request
83 ClientResponse clientResponse = webResource
84 .accept(MediaType.TEXT_PLAIN).get(ClientResponse.class);
85 String uniProtTabDelimittedResponseString = clientResponse
86 .getEntity(String.class);
87 // Make redundant objects eligible for garbage collection to conserve
89 clientResponse = null;
91 // System.out.println(">>>>> response : "
92 // + uniProtTabDelimittedResponseString);
93 return parseUniprotResponse(uniProtTabDelimittedResponseString,
98 public FTSRestResponse parseUniprotResponse(
99 String uniProtTabDelimittedResponseString,
100 FTSRestRequest uniprotRestRequest)
102 FTSRestResponse searchResult = new FTSRestResponse();
103 List<FTSData> result = null;
104 String[] foundDataRow = uniProtTabDelimittedResponseString.split("\n");
105 if (foundDataRow != null && foundDataRow.length > 0)
107 result = new ArrayList<FTSData>();
108 String titleRow = getDataColumnsFieldsAsTabDelimitedString(uniprotRestRequest
110 // System.out.println(">>>>Title row : " + titleRow);
111 for (String dataRow : foundDataRow)
113 if (dataRow.equalsIgnoreCase(titleRow))
115 // System.out.println(">>>>>>>>>> matched!!!");
118 // System.out.println(dataRow);
119 result.add(getFTSData(dataRow, uniprotRestRequest));
121 searchResult.setNumberOfItemsFound(result.size());
122 searchResult.setSearchSummary(result);
128 * Takes a collection of FTSDataColumnI and converts its 'code' values into a
129 * tab delimited string.
131 * @param dataColumnFields
132 * the collection of FTSDataColumnI to process
133 * @return the generated comma delimited string from the supplied
134 * FTSDataColumnI collection
136 private String getDataColumnsFieldsAsTabDelimitedString(
137 Collection<FTSDataColumnI> dataColumnFields)
140 if (dataColumnFields != null && !dataColumnFields.isEmpty())
142 StringBuilder returnedFields = new StringBuilder();
143 for (FTSDataColumnI field : dataColumnFields)
145 if (field.getName().equalsIgnoreCase("Uniprot Id"))
147 returnedFields.append("\t").append("Entry");
151 returnedFields.append("\t").append(field.getName());
154 returnedFields.deleteCharAt(0);
155 result = returnedFields.toString();
159 public static FTSData getFTSData(String tabDelimittedDataStr,
160 FTSRestRequest request)
162 String primaryKey = null;
164 Object[] summaryRowData;
166 Collection<FTSDataColumnI> diplayFields = request.getWantedFields();
168 summaryRowData = new Object[diplayFields.size()];
169 String[] columns = tabDelimittedDataStr.split("\t");
170 for (FTSDataColumnI field : diplayFields)
174 String fieldData = columns[colCounter];
175 if (field.isPrimaryKeyColumn())
177 primaryKey = fieldData;
178 summaryRowData[colCounter++] = primaryKey;
180 else if (fieldData == null || fieldData.isEmpty())
182 summaryRowData[colCounter++] = null;
188 summaryRowData[colCounter++] = (field.getDataColumnClass() == Integer.class) ? Integer
190 : (field.getDataColumnClass() == Double.class) ? Double
191 .valueOf(fieldData) : fieldData;
192 } catch (Exception e)
195 System.out.println("offending value:" + fieldData);
198 } catch (Exception e)
200 // e.printStackTrace();
204 final String primaryKey1 = primaryKey;
206 final Object[] summaryRowData1 = summaryRowData;
210 public Object[] getSummaryData()
212 return summaryRowData1;
216 public Object getPrimaryKey()
222 * Returns a string representation of this object;
225 public String toString()
227 StringBuilder summaryFieldValues = new StringBuilder();
228 for (Object summaryField : summaryRowData1)
230 summaryFieldValues.append(
231 summaryField == null ? " " : summaryField.toString())
234 return summaryFieldValues.toString();
238 * Returns hash code value for this object
241 public int hashCode()
243 return Objects.hash(primaryKey1, this.toString());
249 public static FTSRestClientI getInstance()
251 if (instance == null)
253 instance = new UniProtFTSRestClient();
259 public String getColumnDataConfigFileName()
261 return "/fts/uniprot_data_columns.txt";