655b9603e7d5c178ac155b43e72048f51edd04f7
[jalview.git] / src / jalview / fts / service / threedbeacons / TDBeaconsFTSRestClient.java
1 package jalview.fts.service.threedbeacons;
2
3 import java.net.URI;
4 import java.util.ArrayList;
5 import java.util.Collection;
6 import java.util.Iterator;
7 import java.util.List;
8 import java.util.Map;
9 import java.util.Objects;
10
11 import javax.ws.rs.core.MediaType;
12
13 import org.json.simple.parser.ParseException;
14
15 import com.sun.jersey.api.client.Client;
16 import com.sun.jersey.api.client.ClientResponse;
17 import com.sun.jersey.api.client.WebResource;
18 import com.sun.jersey.api.client.config.DefaultClientConfig;
19
20 import jalview.datamodel.SequenceI;
21 import jalview.fts.api.FTSData;
22 import jalview.fts.api.FTSDataColumnI;
23 import jalview.fts.api.FTSRestClientI;
24 import jalview.fts.core.FTSRestClient;
25 import jalview.fts.core.FTSRestRequest;
26 import jalview.fts.core.FTSRestResponse;
27 import jalview.fts.service.pdb.PDBFTSRestClient;
28 import jalview.util.JSONUtils;
29 import jalview.util.MessageManager;
30 import jalview.util.Platform;
31
32 public class TDBeaconsFTSRestClient extends FTSRestClient
33 {
34   private static final String DEFAULT_THREEDBEACONS_DOMAIN = 
35           "https://wwwdev.ebi.ac.uk/pdbe/pdbe-kb/3dbeacons-hub-api/uniprot/";
36   
37   private static FTSRestClientI instance = null;
38   
39   protected TDBeaconsFTSRestClient()
40   {   
41   }
42   
43   @SuppressWarnings("unchecked")
44   @Override
45   public FTSRestResponse executeRequest(FTSRestRequest tdbRestRequest)
46           throws Exception
47   {
48     try
49     {
50       String query = tdbRestRequest.getFieldToSearchBy()
51               + tdbRestRequest.getSearchTerm();
52       Client client;
53       Class<ClientResponse> clientResponseClass;
54       if (Platform.isJS())
55       {
56         // JavaScript only
57         client = (Client) (Object) new jalview.javascript.web.Client();
58         clientResponseClass = (Class<ClientResponse>) (Object) jalview.javascript.web.ClientResponse.class;
59       }
60       else
61       /**
62        * Java only
63        * @j2sIgnore
64        */
65       {
66         client = Client.create(new DefaultClientConfig());
67         clientResponseClass = ClientResponse.class;
68       }
69       WebResource webResource;
70       webResource = client.resource(DEFAULT_THREEDBEACONS_DOMAIN)
71               .path(query);
72       URI uri = webResource.getURI();
73       System.out.println(uri.toString());
74         
75       // Execute the REST request
76       ClientResponse clientResponse = webResource
77               .accept(MediaType.APPLICATION_JSON).get(clientResponseClass);
78   
79       // Get the JSON string from the response object or directly from the
80       // client (JavaScript)
81       Map<String, Object> jsonObj = null;
82       String responseString = null;
83   
84       // Check the response status and report exception if one occurs
85       int responseStatus = clientResponse.getStatus();
86       switch (responseStatus)
87       {
88       // if success
89       case 200:
90         if (Platform.isJS())
91         {
92           jsonObj = clientResponse.getEntity(Map.class);
93         }
94         else
95         {
96           responseString = clientResponse.getEntity(String.class);
97         }
98         break;
99       case 400:
100         throw new Exception(parseJsonExceptionString(responseString));
101       default:
102         throw new Exception(
103                 getMessageByHTTPStatusCode(responseStatus, "3DBeacons"));
104       }
105       // Process the response and return the result to the caller.
106       return parseTDBeaconsJsonResponse(responseString, jsonObj, tdbRestRequest);
107     } catch (Exception e)
108     {
109       String exceptionMsg = e.getMessage();
110       if (exceptionMsg.contains("SocketException"))
111       {
112         // No internet connection
113         throw new Exception(MessageManager.getString(
114                 "exception.unable_to_detect_internet_connection"));
115       }
116       else if (exceptionMsg.contains("UnknownHostException"))
117       {
118         // The server is unreachable
119         throw new Exception(MessageManager.formatMessage(
120                 "exception.fts_server_unreachable", "3DB Hub"));
121       }
122       else
123       {
124         throw e;
125       }
126     }
127       
128   }
129   
130   public String setSearchTerm(String term) {
131     return term;
132   }
133   
134   public static FTSRestResponse parseTDBeaconsJsonResponse(
135           String tdbJsonResponseString, FTSRestRequest tdbRestRequest)
136   {
137     return parseTDBeaconsJsonResponse(tdbJsonResponseString,
138             (Map<String, Object>) null, tdbRestRequest);
139   }
140   
141   @SuppressWarnings("unchecked")
142   public static FTSRestResponse parseTDBeaconsJsonResponse(String tdbJsonResponseString,
143           Map<String, Object> jsonObj, FTSRestRequest tdbRestRequest)
144   {
145     FTSRestResponse searchResult = new FTSRestResponse();
146     List<FTSData> result = null;
147     
148     try
149     {
150       if (jsonObj == null)
151       {
152         jsonObj = (Map<String, Object>) JSONUtils.parse(tdbJsonResponseString);
153       }
154       //System.out.println(jsonObj);
155       
156       Object uniprot_entry = jsonObj.get("uniprot_entry"); 
157       System.out.println(uniprot_entry);
158       
159       Long seqLength = (Long) ((Map<String, Object>) jsonObj.get("uniprot_entry")).get("sequence_length");
160       System.out.println("seqLenght :" + seqLength);
161       
162       result = new ArrayList<>();
163       List<Object> structures = (List<Object>) jsonObj.get("structures");
164     //Map<String, Object> tdbResponse = (Map<String, Object>) jsonObj.get("structures");
165       
166       int numFound = 0;
167       for (Iterator<Object> strucIter = structures.iterator(); strucIter
168               .hasNext();)
169       {
170         Map<String, Object> structure = (Map<String, Object>) strucIter.next();
171         result.add(getFTSData(structure, tdbRestRequest));
172         numFound++;
173         //System.out.println(structure);
174       }
175       
176       System.out.println("1 : " + structures.get(1));
177       searchResult.setNumberOfItemsFound(numFound); 
178       searchResult.setSearchSummary(result);
179       searchResult.setSequenceLength(seqLength);
180         
181     } catch (ParseException e)
182     {
183       e.printStackTrace();
184     }
185     return searchResult;
186   }
187
188 private static FTSData getFTSData(Map<String, Object> tdbJsonStructure,
189           FTSRestRequest tdbRequest)
190   {
191     // TODO Auto-generated method stub
192     String primaryKey = null;
193     Object[] summaryRowData;
194     Collection<FTSDataColumnI> displayFields = tdbRequest.getWantedFields();
195     int colCounter = 0;
196     summaryRowData = new Object[displayFields.size()];
197     for (FTSDataColumnI field : displayFields) {
198       String fieldData = (tdbJsonStructure.get(field.getCode()) == null) ? " " 
199               : tdbJsonStructure.get(field.getCode()).toString();
200       if (field.isPrimaryKeyColumn())
201       {
202         primaryKey = fieldData;
203         summaryRowData[colCounter++] = primaryKey;
204       }
205       else if (fieldData == null || fieldData.isEmpty())
206       {
207         summaryRowData[colCounter++] = null;
208       }
209       else 
210       {
211         try
212         {
213           summaryRowData[colCounter++] = (field.getDataType()
214                   .getDataTypeClass() == Integer.class)
215                           ? Integer.valueOf(fieldData)
216                           : (field.getDataType()
217                                   .getDataTypeClass() == Double.class)
218                                           ? Double.valueOf(fieldData)
219                                           : fieldData;
220         } catch (Exception e)
221         {
222           e.printStackTrace();
223           System.out.println("offending value:" + fieldData);
224         }
225       }
226     }
227     final String primaryKey1 = primaryKey;
228     final Object[] summaryRowData1 = summaryRowData;
229     
230     return new FTSData()
231     {
232
233       @Override
234       public Object[] getSummaryData()
235       {
236         return summaryRowData1;
237       }
238
239       @Override
240       public Object getPrimaryKey()
241       {
242         return primaryKey1;
243       }
244       
245       /**
246        * Returns a string representation of this object;
247        */
248       @Override
249       public String toString()
250       {
251         StringBuilder summaryFieldValues = new StringBuilder();
252         for (Object summaryField : summaryRowData1)
253         {
254           summaryFieldValues.append(
255                   summaryField == null ? " " : summaryField.toString())
256                   .append("\t");
257         }
258         return summaryFieldValues.toString();
259       }
260       
261       /**
262        * Returns hash code value for this object
263        */
264       @Override
265       public int hashCode()
266       {
267         return Objects.hash(primaryKey1, this.toString());
268       }
269
270       @Override
271       public boolean equals(Object that)
272       {
273         return this.toString().equals(that.toString());
274       }
275     };
276   }
277
278 //  private static FTSData getFTSData(Map<String, Object> doc,
279 //          FTSRestRequest tdbRestRequest)
280 //  {
281 //    String primaryKey = null;
282 //
283 //    Object[] summaryRowData;
284 //
285 //    Collection<FTSDataColumnI> displayFields = tdbRestRequest.getWantedFields();
286 //    int colCounter = 0;
287 //    summaryRowData = new Object[displayFields.size() + 1];
288 // 
289 //    return null;
290 //  }
291
292   private String parseJsonExceptionString(String jsonErrorString)
293   {
294     // TODO Auto-generated method stub
295     return null;
296   }
297
298   @Override
299   public String getColumnDataConfigFileName()
300   {
301     return "/fts/tdbeacons_data_columns.txt";
302   }
303   
304   public static FTSRestClientI getInstance()
305   {
306     if (instance == null)
307     {
308       instance = new TDBeaconsFTSRestClient();
309     }
310     return instance;
311   }
312   
313   private Collection<FTSDataColumnI> allDefaultDisplayedStructureDataColumns;
314
315   public Collection<FTSDataColumnI> getAllDefaultDisplayedStructureDataColumns()
316   {
317     if (allDefaultDisplayedStructureDataColumns == null
318             || allDefaultDisplayedStructureDataColumns.isEmpty())
319     {
320       allDefaultDisplayedStructureDataColumns = new ArrayList<>();
321       allDefaultDisplayedStructureDataColumns
322               .addAll(super.getAllDefaultDisplayedFTSDataColumns());
323     }
324     return allDefaultDisplayedStructureDataColumns;
325   }
326   
327 }