1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
|
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
|
10 |
|
|
11 |
|
|
12 |
|
|
13 |
|
|
14 |
|
|
15 |
|
|
16 |
|
|
17 |
|
|
18 |
|
|
19 |
|
|
20 |
|
|
21 |
|
package jalview.fts.service.pdb; |
22 |
|
|
23 |
|
import jalview.datamodel.SequenceI; |
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; |
31 |
|
|
32 |
|
import java.net.URI; |
33 |
|
import java.util.ArrayList; |
34 |
|
import java.util.Collection; |
35 |
|
import java.util.Iterator; |
36 |
|
import java.util.List; |
37 |
|
import java.util.Objects; |
38 |
|
|
39 |
|
import javax.ws.rs.core.MediaType; |
40 |
|
|
41 |
|
import org.json.simple.JSONArray; |
42 |
|
import org.json.simple.JSONObject; |
43 |
|
import org.json.simple.parser.JSONParser; |
44 |
|
import org.json.simple.parser.ParseException; |
45 |
|
|
46 |
|
|
47 |
|
|
48 |
|
|
49 |
|
|
50 |
|
import com.sun.jersey.api.client.Client; |
51 |
|
import com.sun.jersey.api.client.ClientResponse; |
52 |
|
import com.sun.jersey.api.client.WebResource; |
53 |
|
|
54 |
|
import com.sun.jersey.api.client.config.ClientConfig; |
55 |
|
import com.sun.jersey.api.client.config.DefaultClientConfig; |
56 |
|
|
57 |
|
|
58 |
|
|
59 |
|
|
60 |
|
|
61 |
|
|
62 |
|
|
63 |
|
|
64 |
|
@author |
65 |
|
|
66 |
|
|
|
|
| 37.6% |
Uncovered Elements: 126 (202) |
Complexity: 50 |
Complexity Density: 0.37 |
|
67 |
|
public class PDBFTSRestClient extends FTSRestClient |
68 |
|
{ |
69 |
|
|
70 |
|
private static FTSRestClientI instance = null; |
71 |
|
|
72 |
|
public static final String PDB_SEARCH_ENDPOINT = "https://www.ebi.ac.uk/pdbe/search/pdb/select?"; |
73 |
|
|
|
|
| - |
Uncovered Elements: 0 (0) |
Complexity: 1 |
Complexity Density: - |
|
74 |
1 |
protected PDBFTSRestClient()... |
75 |
|
{ |
76 |
|
} |
77 |
|
|
78 |
|
|
79 |
|
|
80 |
|
|
81 |
|
@param |
82 |
|
|
83 |
|
@return |
84 |
|
@throws |
85 |
|
|
|
|
| 62.3% |
Uncovered Elements: 26 (69) |
Complexity: 17 |
Complexity Density: 0.4 |
|
86 |
1 |
@SuppressWarnings({ "unused", "unchecked" })... |
87 |
|
@Override |
88 |
|
public FTSRestResponse executeRequest(FTSRestRequest pdbRestRequest) |
89 |
|
throws Exception |
90 |
|
{ |
91 |
1 |
try |
92 |
|
{ |
93 |
1 |
Client client; |
94 |
1 |
WebResource webResource; |
95 |
|
|
96 |
1 |
String wantedFields = getDataColumnsFieldsAsCommaDelimitedString( |
97 |
|
pdbRestRequest.getWantedFields()); |
98 |
1 |
int responseSize = (pdbRestRequest.getResponseSize() == 0) |
99 |
|
? getDefaultResponsePageSize() |
100 |
|
: pdbRestRequest.getResponseSize(); |
101 |
1 |
int offSet = pdbRestRequest.getOffSet(); |
102 |
1 |
String sortParam = null; |
103 |
1 |
if (pdbRestRequest.getFieldToSortBy() == null |
104 |
|
|| pdbRestRequest.getFieldToSortBy().trim().isEmpty()) |
105 |
|
{ |
106 |
0 |
sortParam = ""; |
107 |
|
} |
108 |
|
else |
109 |
|
{ |
110 |
1 |
if (pdbRestRequest.getFieldToSortBy() |
111 |
|
.equalsIgnoreCase("Resolution")) |
112 |
|
{ |
113 |
0 |
sortParam = pdbRestRequest.getFieldToSortBy() |
114 |
0 |
+ (pdbRestRequest.isAscending() ? " asc" : " desc"); |
115 |
|
} |
116 |
|
else |
117 |
|
{ |
118 |
1 |
sortParam = pdbRestRequest.getFieldToSortBy() |
119 |
1 |
+ (pdbRestRequest.isAscending() ? " desc" : " asc"); |
120 |
|
} |
121 |
|
} |
122 |
|
|
123 |
1 |
String facetPivot = (pdbRestRequest.getFacetPivot() == null |
124 |
|
|| pdbRestRequest.getFacetPivot().isEmpty()) ? "" |
125 |
|
: pdbRestRequest.getFacetPivot(); |
126 |
1 |
String facetPivotMinCount = String |
127 |
|
.valueOf(pdbRestRequest.getFacetPivotMinCount()); |
128 |
|
|
129 |
1 |
String query = pdbRestRequest.getFieldToSearchBy() |
130 |
|
+ pdbRestRequest.getSearchTerm() |
131 |
1 |
+ (pdbRestRequest.isAllowEmptySeq() ? "" |
132 |
|
: " AND molecule_sequence:['' TO *]") |
133 |
1 |
+ (pdbRestRequest.isAllowUnpublishedEntries() ? "" |
134 |
|
: " AND status:REL"); |
135 |
|
|
136 |
|
|
137 |
|
|
138 |
|
|
139 |
|
|
140 |
1 |
Class<ClientResponse> clientResponseClass; |
141 |
1 |
if ( |
142 |
|
false) |
143 |
|
{ |
144 |
|
|
145 |
0 |
client = (Client) (Object) new jalview.javascript.web.Client(); |
146 |
0 |
clientResponseClass = (Class<ClientResponse>) (Object) jalview.javascript.web.ClientResponse.class; |
147 |
|
} |
148 |
|
else |
149 |
|
{ |
150 |
|
|
151 |
1 |
client = Client.create(new DefaultClientConfig()); |
152 |
1 |
clientResponseClass = ClientResponse.class; |
153 |
|
} |
154 |
|
|
155 |
1 |
if (pdbRestRequest.isFacet()) |
156 |
|
{ |
157 |
0 |
webResource = client.resource(PDB_SEARCH_ENDPOINT) |
158 |
|
.queryParam("wt", "json").queryParam("fl", wantedFields) |
159 |
|
.queryParam("rows", String.valueOf(responseSize)) |
160 |
|
.queryParam("q", query) |
161 |
|
.queryParam("start", String.valueOf(offSet)) |
162 |
|
.queryParam("sort", sortParam).queryParam("facet", "true") |
163 |
|
.queryParam("facet.pivot", facetPivot) |
164 |
|
.queryParam("facet.pivot.mincount", facetPivotMinCount); |
165 |
|
} |
166 |
|
else |
167 |
|
{ |
168 |
1 |
webResource = client.resource(PDB_SEARCH_ENDPOINT) |
169 |
|
.queryParam("wt", "json").queryParam("fl", wantedFields) |
170 |
|
.queryParam("rows", String.valueOf(responseSize)) |
171 |
|
.queryParam("start", String.valueOf(offSet)) |
172 |
|
.queryParam("q", query).queryParam("sort", sortParam); |
173 |
|
} |
174 |
|
|
175 |
1 |
URI uri = webResource.getURI(); |
176 |
|
|
177 |
|
|
178 |
1 |
ClientResponse clientResponse = webResource |
179 |
|
.accept(MediaType.APPLICATION_JSON).get(clientResponseClass ); |
180 |
|
|
181 |
|
|
182 |
1 |
String responseString = clientResponse.getEntity(String.class); |
183 |
|
|
184 |
|
|
185 |
|
|
186 |
1 |
if (clientResponse.getStatus() != 200) |
187 |
|
{ |
188 |
1 |
String errorMessage = ""; |
189 |
1 |
if (clientResponse.getStatus() == 400) |
190 |
|
{ |
191 |
1 |
errorMessage = parseJsonExceptionString(responseString); |
192 |
1 |
throw new Exception(errorMessage); |
193 |
|
} |
194 |
|
else |
195 |
|
{ |
196 |
0 |
errorMessage = getMessageByHTTPStatusCode( |
197 |
|
clientResponse.getStatus(), "PDB"); |
198 |
0 |
throw new Exception(errorMessage); |
199 |
|
} |
200 |
|
} |
201 |
|
|
202 |
|
|
203 |
|
|
204 |
0 |
clientResponse = null; |
205 |
0 |
client = null; |
206 |
|
|
207 |
|
|
208 |
0 |
return parsePDBJsonResponse(responseString, pdbRestRequest); |
209 |
|
} catch (Exception e) |
210 |
|
{ |
211 |
1 |
String exceptionMsg = e.getMessage(); |
212 |
1 |
if (exceptionMsg.contains("SocketException")) |
213 |
|
{ |
214 |
|
|
215 |
0 |
throw new Exception(MessageManager.getString( |
216 |
|
"exception.unable_to_detect_internet_connection")); |
217 |
|
} |
218 |
1 |
else if (exceptionMsg.contains("UnknownHostException")) |
219 |
|
{ |
220 |
|
|
221 |
0 |
throw new Exception(MessageManager.formatMessage( |
222 |
|
"exception.fts_server_unreachable", "PDB Solr")); |
223 |
|
} |
224 |
|
else |
225 |
|
{ |
226 |
1 |
throw e; |
227 |
|
} |
228 |
|
} |
229 |
|
} |
230 |
|
|
231 |
|
|
232 |
|
|
233 |
|
|
234 |
|
@param |
235 |
|
|
236 |
|
@return |
237 |
|
|
|
|
| 94.1% |
Uncovered Elements: 1 (17) |
Complexity: 2 |
Complexity Density: 0.12 |
|
238 |
1 |
public static String parseJsonExceptionString(String jsonErrorResponse)... |
239 |
|
{ |
240 |
1 |
StringBuilder errorMessage = new StringBuilder( |
241 |
|
"\n============= PDB Rest Client RunTime error =============\n"); |
242 |
|
|
243 |
|
|
244 |
|
|
245 |
|
|
246 |
|
|
247 |
|
|
248 |
|
|
249 |
|
|
250 |
|
|
251 |
|
|
252 |
|
|
253 |
|
|
254 |
|
|
255 |
|
|
256 |
|
|
257 |
|
|
258 |
|
|
259 |
|
|
260 |
|
|
261 |
|
|
262 |
|
|
263 |
1 |
try |
264 |
|
{ |
265 |
1 |
JSONParser jsonParser = new JSONParser(); |
266 |
1 |
JSONObject jsonObj = (JSONObject) jsonParser.parse(jsonErrorResponse); |
267 |
1 |
JSONObject errorResponse = (JSONObject) jsonObj.get("error"); |
268 |
|
|
269 |
1 |
JSONObject responseHeader = (JSONObject) jsonObj |
270 |
|
.get("responseHeader"); |
271 |
1 |
JSONObject paramsObj = (JSONObject) responseHeader.get("params"); |
272 |
1 |
String status = responseHeader.get("status").toString(); |
273 |
1 |
String message = errorResponse.get("msg").toString(); |
274 |
1 |
String query = paramsObj.get("q").toString(); |
275 |
1 |
String fl = paramsObj.get("fl").toString(); |
276 |
|
|
277 |
1 |
errorMessage.append("Status: ").append(status).append("\n"); |
278 |
1 |
errorMessage.append("Message: ").append(message).append("\n"); |
279 |
1 |
errorMessage.append("query: ").append(query).append("\n"); |
280 |
1 |
errorMessage.append("fl: ").append(fl).append("\n"); |
281 |
|
|
282 |
|
} catch (ParseException e) |
283 |
|
{ |
284 |
0 |
e.printStackTrace(); |
285 |
|
} |
286 |
1 |
return errorMessage.toString(); |
287 |
|
} |
288 |
|
|
289 |
|
|
290 |
|
|
291 |
|
|
292 |
|
|
293 |
|
|
294 |
|
@param |
295 |
|
|
296 |
|
@param |
297 |
|
|
298 |
|
|
299 |
|
@return |
300 |
|
|
|
|
| 0% |
Uncovered Elements: 23 (23) |
Complexity: 4 |
Complexity Density: 0.21 |
|
301 |
0 |
@SuppressWarnings("unchecked")... |
302 |
|
public static FTSRestResponse parsePDBJsonResponse( |
303 |
|
String pdbJsonResponseString, FTSRestRequest pdbRestRequest) |
304 |
|
{ |
305 |
0 |
FTSRestResponse searchResult = new FTSRestResponse(); |
306 |
0 |
List<FTSData> result = null; |
307 |
0 |
try |
308 |
|
{ |
309 |
0 |
JSONParser jsonParser = new JSONParser(); |
310 |
0 |
JSONObject jsonObj = (JSONObject) jsonParser |
311 |
|
.parse(pdbJsonResponseString); |
312 |
|
|
313 |
0 |
JSONObject pdbResponse = (JSONObject) jsonObj.get("response"); |
314 |
0 |
String queryTime = ((JSONObject) jsonObj.get("responseHeader")) |
315 |
|
.get("QTime").toString(); |
316 |
0 |
int numFound = Integer |
317 |
|
.valueOf(pdbResponse.get("numFound").toString()); |
318 |
0 |
if (numFound > 0) |
319 |
|
{ |
320 |
0 |
result = new ArrayList<FTSData>(); |
321 |
0 |
JSONArray docs = (JSONArray) pdbResponse.get("docs"); |
322 |
0 |
for (Iterator<JSONObject> docIter = docs.iterator(); docIter |
323 |
|
.hasNext();) |
324 |
|
{ |
325 |
0 |
JSONObject doc = docIter.next(); |
326 |
0 |
result.add(getFTSData(doc, pdbRestRequest)); |
327 |
|
} |
328 |
0 |
searchResult.setNumberOfItemsFound(numFound); |
329 |
0 |
searchResult.setResponseTime(queryTime); |
330 |
0 |
searchResult.setSearchSummary(result); |
331 |
|
} |
332 |
|
} catch (ParseException e) |
333 |
|
{ |
334 |
0 |
e.printStackTrace(); |
335 |
|
} |
336 |
0 |
return searchResult; |
337 |
|
} |
338 |
|
|
|
|
| 0% |
Uncovered Elements: 39 (39) |
Complexity: 10 |
Complexity Density: 0.4 |
|
339 |
0 |
public static FTSData getFTSData(JSONObject pdbJsonDoc,... |
340 |
|
FTSRestRequest request) |
341 |
|
{ |
342 |
|
|
343 |
0 |
String primaryKey = null; |
344 |
|
|
345 |
0 |
Object[] summaryRowData; |
346 |
|
|
347 |
0 |
SequenceI associatedSequence; |
348 |
|
|
349 |
0 |
Collection<FTSDataColumnI> diplayFields = request.getWantedFields(); |
350 |
0 |
SequenceI associatedSeq = request.getAssociatedSequence(); |
351 |
0 |
int colCounter = 0; |
352 |
0 |
summaryRowData = new Object[(associatedSeq != null) |
353 |
|
? diplayFields.size() + 1 |
354 |
|
: diplayFields.size()]; |
355 |
0 |
if (associatedSeq != null) |
356 |
|
{ |
357 |
0 |
associatedSequence = associatedSeq; |
358 |
0 |
summaryRowData[0] = associatedSequence; |
359 |
0 |
colCounter = 1; |
360 |
|
} |
361 |
|
|
362 |
0 |
for (FTSDataColumnI field : diplayFields) |
363 |
|
{ |
364 |
0 |
String fieldData = (pdbJsonDoc.get(field.getCode()) == null) ? "" |
365 |
|
: pdbJsonDoc.get(field.getCode()).toString(); |
366 |
0 |
if (field.isPrimaryKeyColumn()) |
367 |
|
{ |
368 |
0 |
primaryKey = fieldData; |
369 |
0 |
summaryRowData[colCounter++] = primaryKey; |
370 |
|
} |
371 |
0 |
else if (fieldData == null || fieldData.isEmpty()) |
372 |
|
{ |
373 |
0 |
summaryRowData[colCounter++] = null; |
374 |
|
} |
375 |
|
else |
376 |
|
{ |
377 |
0 |
try |
378 |
|
{ |
379 |
0 |
summaryRowData[colCounter++] = (field.getDataType() |
380 |
|
.getDataTypeClass() == Integer.class) |
381 |
|
? Integer.valueOf(fieldData) |
382 |
0 |
: (field.getDataType() |
383 |
|
.getDataTypeClass() == Double.class) |
384 |
|
? Double.valueOf(fieldData) |
385 |
|
: sanitiseData(fieldData); |
386 |
|
} catch (Exception e) |
387 |
|
{ |
388 |
0 |
e.printStackTrace(); |
389 |
0 |
System.out.println("offending value:" + fieldData); |
390 |
|
} |
391 |
|
} |
392 |
|
} |
393 |
|
|
394 |
0 |
final String primaryKey1 = primaryKey; |
395 |
|
|
396 |
0 |
final Object[] summaryRowData1 = summaryRowData; |
397 |
0 |
return new FTSData() |
398 |
|
{ |
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
399 |
0 |
@Override... |
400 |
|
public Object[] getSummaryData() |
401 |
|
{ |
402 |
0 |
return summaryRowData1; |
403 |
|
} |
404 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
405 |
0 |
@Override... |
406 |
|
public Object getPrimaryKey() |
407 |
|
{ |
408 |
0 |
return primaryKey1; |
409 |
|
} |
410 |
|
|
411 |
|
|
412 |
|
|
413 |
|
|
|
|
| 0% |
Uncovered Elements: 6 (6) |
Complexity: 2 |
Complexity Density: 0.5 |
|
414 |
0 |
@Override... |
415 |
|
public String toString() |
416 |
|
{ |
417 |
0 |
StringBuilder summaryFieldValues = new StringBuilder(); |
418 |
0 |
for (Object summaryField : summaryRowData1) |
419 |
|
{ |
420 |
0 |
summaryFieldValues.append( |
421 |
0 |
summaryField == null ? " " : summaryField.toString()) |
422 |
|
.append("\t"); |
423 |
|
} |
424 |
0 |
return summaryFieldValues.toString(); |
425 |
|
} |
426 |
|
|
427 |
|
|
428 |
|
|
429 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
430 |
0 |
@Override... |
431 |
|
public int hashCode() |
432 |
|
{ |
433 |
0 |
return Objects.hash(primaryKey1, this.toString()); |
434 |
|
} |
435 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
436 |
0 |
@Override... |
437 |
|
public boolean equals(Object that) |
438 |
|
{ |
439 |
0 |
return this.toString().equals(that.toString()); |
440 |
|
} |
441 |
|
}; |
442 |
|
} |
443 |
|
|
|
|
| 0% |
Uncovered Elements: 2 (2) |
Complexity: 1 |
Complexity Density: 0.5 |
|
444 |
0 |
private static String sanitiseData(String data)... |
445 |
|
{ |
446 |
0 |
String cleanData = data.replaceAll("\\[\"", "").replaceAll("\\]\"", "") |
447 |
|
.replaceAll("\\[", "").replaceAll("\\]", "") |
448 |
|
.replaceAll("\",\"", ", ").replaceAll("\"", ""); |
449 |
0 |
return cleanData; |
450 |
|
} |
451 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
452 |
1 |
@Override... |
453 |
|
public String getColumnDataConfigFileName() |
454 |
|
{ |
455 |
1 |
return "/fts/pdb_data_columns.txt"; |
456 |
|
} |
457 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (5) |
Complexity: 2 |
Complexity Density: 0.67 |
|
458 |
19 |
public static FTSRestClientI getInstance()... |
459 |
|
{ |
460 |
19 |
if (instance == null) |
461 |
|
{ |
462 |
1 |
instance = new PDBFTSRestClient(); |
463 |
|
} |
464 |
19 |
return instance; |
465 |
|
} |
466 |
|
|
467 |
|
private Collection<FTSDataColumnI> allDefaultDisplayedStructureDataColumns; |
468 |
|
|
|
|
| 83.3% |
Uncovered Elements: 1 (6) |
Complexity: 3 |
Complexity Density: 0.75 |
|
469 |
1 |
public Collection<FTSDataColumnI> getAllDefaultDisplayedStructureDataColumns()... |
470 |
|
{ |
471 |
1 |
if (allDefaultDisplayedStructureDataColumns == null |
472 |
|
|| allDefaultDisplayedStructureDataColumns.isEmpty()) |
473 |
|
{ |
474 |
1 |
allDefaultDisplayedStructureDataColumns = new ArrayList<FTSDataColumnI>(); |
475 |
1 |
allDefaultDisplayedStructureDataColumns |
476 |
|
.addAll(super.getAllDefaultDisplayedFTSDataColumns()); |
477 |
|
} |
478 |
1 |
return allDefaultDisplayedStructureDataColumns; |
479 |
|
} |
480 |
|
|
|
|
| 0% |
Uncovered Elements: 15 (15) |
Complexity: 3 |
Complexity Density: 0.23 |
|
481 |
0 |
public static void main(String[] args) {... |
482 |
|
|
483 |
|
|
484 |
|
|
485 |
|
|
486 |
|
|
487 |
0 |
String s = "e"; |
488 |
0 |
char c = 'c'; |
489 |
0 |
char f = 'f'; |
490 |
0 |
s += c | f; |
491 |
0 |
int x = c&f; |
492 |
0 |
int y = 2 & c; |
493 |
0 |
int z = c ^ 5; |
494 |
0 |
String result = s +x + y + z; |
495 |
0 |
assert (result == "e103982102"); |
496 |
0 |
JSONParser jsonParser = new JSONParser(); |
497 |
0 |
try |
498 |
|
{ |
499 |
0 |
JSONObject jsonObj = (JSONObject) jsonParser.parse("{\"a\":3}"); |
500 |
0 |
System.out.println(jsonObj); |
501 |
|
} catch (ParseException e) |
502 |
|
{ |
503 |
0 |
e.printStackTrace(); |
504 |
|
} |
505 |
|
|
506 |
|
} |
507 |
|
|
508 |
|
|
509 |
|
} |