JAL-3829 removed unneeded attribute in FTS core
[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       
155       Object uniprot_entry = jsonObj.get("uniprot_entry"); 
156       // TODO: decide if anything from uniprot_entry needs to be reported via the FTSRestResponse object
157       // Arnaud added seqLength = (Long) ((Map<String, Object>) jsonObj.get("uniprot_entry")).get("sequence_length");
158
159       List<Object> structures = (List<Object>) jsonObj.get("structures");
160       result = new ArrayList<>();
161       
162       int numFound = 0;
163       for (Iterator<Object> strucIter = structures.iterator(); strucIter.hasNext();)
164       {
165         Map<String, Object> structure = (Map<String, Object>) strucIter.next();
166         result.add(getFTSData(structure, tdbRestRequest));
167         numFound++;
168       }
169       
170       searchResult.setNumberOfItemsFound(numFound); 
171       searchResult.setSearchSummary(result);
172         
173     } catch (ParseException e)
174     {
175       e.printStackTrace();
176     }
177     return searchResult;
178   }
179
180 private static FTSData getFTSData(Map<String, Object> tdbJsonStructure,
181           FTSRestRequest tdbRequest)
182   {
183     // TODO Auto-generated method stub
184     String primaryKey = null;
185     Object[] summaryRowData;
186     Collection<FTSDataColumnI> displayFields = tdbRequest.getWantedFields();
187     int colCounter = 0;
188     summaryRowData = new Object[displayFields.size()];
189     
190     for (FTSDataColumnI field : displayFields) {
191       String fieldData = (tdbJsonStructure.get(field.getCode()) == null) ? " " 
192               : tdbJsonStructure.get(field.getCode()).toString();
193       System.out.println("Field : " + field + "  Data : " + fieldData);
194       if (field.isPrimaryKeyColumn())
195       {
196         primaryKey = fieldData;
197         summaryRowData[colCounter++] = primaryKey;
198       }
199       else if (fieldData == null || fieldData.isEmpty())
200       {
201         summaryRowData[colCounter++] = null;
202       }
203       else 
204       {
205         try
206         {
207           summaryRowData[colCounter++] = (field.getDataType()
208                   .getDataTypeClass() == Integer.class)
209                           ? Integer.valueOf(fieldData)
210                           : (field.getDataType()
211                                   .getDataTypeClass() == Double.class)
212                                           ? Double.valueOf(fieldData)
213                                           : fieldData;
214         } catch (Exception e)
215         {
216           //e.printStackTrace();
217           System.out.println("offending value:" + fieldData + fieldData);
218         }
219       }
220     }
221     final String primaryKey1 = primaryKey;
222     final Object[] summaryRowData1 = summaryRowData;
223     
224     return new FTSData()
225     {
226
227       @Override
228       public Object[] getSummaryData()
229       {
230         return summaryRowData1;
231       }
232
233       @Override
234       public Object getPrimaryKey()
235       {
236         return primaryKey1;
237       }
238       
239       /**
240        * Returns a string representation of this object;
241        */
242       @Override
243       public String toString()
244       {
245         StringBuilder summaryFieldValues = new StringBuilder();
246         for (Object summaryField : summaryRowData1)
247         {
248           summaryFieldValues.append(
249                   summaryField == null ? " " : summaryField.toString())
250                   .append("\t");
251         }
252         return summaryFieldValues.toString();
253       }
254       
255       /**
256        * Returns hash code value for this object
257        */
258       @Override
259       public int hashCode()
260       {
261         return Objects.hash(primaryKey1, this.toString());
262       }
263
264       @Override
265       public boolean equals(Object that)
266       {
267         return this.toString().equals(that.toString());
268       }
269     };
270   }
271
272 //  private static FTSData getFTSData(Map<String, Object> doc,
273 //          FTSRestRequest tdbRestRequest)
274 //  {
275 //    String primaryKey = null;
276 //
277 //    Object[] summaryRowData;
278 //
279 //    Collection<FTSDataColumnI> displayFields = tdbRestRequest.getWantedFields();
280 //    int colCounter = 0;
281 //    summaryRowData = new Object[displayFields.size() + 1];
282 // 
283 //    return null;
284 //  }
285
286   private String parseJsonExceptionString(String jsonErrorString)
287   {
288     // TODO Auto-generated method stub
289     return null;
290   }
291
292   @Override
293   public String getColumnDataConfigFileName()
294   {
295     return "/fts/tdbeacons_data_columns.txt";
296   }
297   
298   public static FTSRestClientI getInstance()
299   {
300     if (instance == null)
301     {
302       instance = new TDBeaconsFTSRestClient();
303     }
304     return instance;
305   }
306   
307   private Collection<FTSDataColumnI> allDefaultDisplayedStructureDataColumns;
308
309   public Collection<FTSDataColumnI> getAllDefaultDisplayedStructureDataColumns()
310   {
311     if (allDefaultDisplayedStructureDataColumns == null
312             || allDefaultDisplayedStructureDataColumns.isEmpty())
313     {
314       allDefaultDisplayedStructureDataColumns = new ArrayList<>();
315       allDefaultDisplayedStructureDataColumns
316               .addAll(super.getAllDefaultDisplayedFTSDataColumns());
317     }
318     return allDefaultDisplayedStructureDataColumns;
319   }
320   
321 }