Request now parses the whole structures, need to fix the result
[jalview.git] / src / jalview / fts / service / threedbeacons / TDBeaconsFTSPanel.java
1 package jalview.fts.service.threedbeacons;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStreamReader;
6 import java.net.HttpURLConnection;
7 import java.net.MalformedURLException;
8 import java.net.URL;
9 import java.util.HashMap;
10 import java.util.HashSet;
11 import java.util.Map;
12
13 import org.json.JSONArray;
14 import org.json.JSONObject;
15
16 import jalview.fts.api.FTSDataColumnI;
17 import jalview.fts.api.FTSRestClientI;
18 import jalview.fts.core.FTSRestRequest;
19 import jalview.fts.core.FTSRestResponse;
20 import jalview.fts.core.GFTSPanel;
21 import jalview.fts.service.pdb.PDBFTSRestClient;
22 import jalview.gui.SequenceFetcher;
23 import jalview.util.MessageManager;
24
25 @SuppressWarnings("serial")
26 public class TDBeaconsFTSPanel extends GFTSPanel
27 {       
28   private static String defaultFTSFrameTitle = MessageManager
29           .getString("label.pdb_sequence_fetcher");
30
31   private static Map<String, Integer> tempUserPrefs = new HashMap<>();
32
33   private static final String THREEDB_FTS_CACHE_KEY = "CACHE.THREEDB_FTS";
34
35   private static final String THREEDB_AUTOSEARCH = "FTS.THREEDB.AUTOSEARCH";
36   
37   private static HttpURLConnection connection;
38   
39   public TDBeaconsFTSPanel(SequenceFetcher fetcher)
40   {
41     super(fetcher);
42     pageLimit = TDBeaconsFTSRestClient.getInstance().getDefaultResponsePageSize();
43     this.seqFetcher = fetcher;
44     this.progressIndicator = (fetcher == null) ? null
45             : fetcher.getProgressIndicator();
46   }
47   
48 //  public int TDBeaconsFTSPanel2(String result)
49 //  {
50 //    int seqlength = executeParse(result);
51 //    return seqlength;
52 //  }
53   
54   public static int executeParse(String query) {
55     BufferedReader reader;
56     String line;
57     StringBuffer responseContent = new StringBuffer();
58     try {
59       URL url = new URL("https://wwwdev.ebi.ac.uk/pdbe/pdbe-kb/3dbeacons-hub-api/uniprot/summary/" + query + ".json");
60       connection = (HttpURLConnection) url.openConnection();
61       connection.setRequestMethod("GET");
62       connection.setConnectTimeout(5000); // <=>5seconds
63       connection.setReadTimeout(5000);
64       // Status check up, 200 = connection succesful
65       int status = connection.getResponseCode();
66       // System.out.println(status);
67
68       if (status > 299) {
69               reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
70               while ((line = reader.readLine()) != null) {
71                       responseContent.append(line);
72               }
73               reader.close();
74       } else {
75               reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
76               while ((line = reader.readLine()) != null) {
77                       responseContent.append(line);
78               }
79               reader.close();
80       }
81       //System.out.println(responseContent.toString());
82       int seq = parse(responseContent.toString());
83       return seq;
84
85       } catch (MalformedURLException e) {
86         e.printStackTrace();
87       } catch (IOException e) {
88         e.printStackTrace();
89       } finally {
90       connection.disconnect();
91       }
92       return (Integer) null;
93       
94   }
95   
96   public static int parse(String jsonString) {
97     JSONObject entry = new JSONObject(jsonString);
98     System.out.println(entry);
99     int length = entry.getJSONObject("uniprot_entry").getInt("sequence_length");
100     String  ac = entry.getJSONObject("uniprot_entry").getString("ac");
101     
102     JSONArray structures = entry.getJSONArray("structures");
103     for (int i=0 ; i < structures.length() ; i++) {
104             String id = structures.getJSONObject(i).getString("model_identifier");
105             //System.out.println("identifier num " + i + " : " + id);
106     }
107     System.out.println("length : " + length + "; access name : " + ac);
108     return length;
109     
110 }
111
112   @Override
113   public void searchAction(boolean isFreshSearch)
114   {
115     mainFrame.requestFocusInWindow();
116     if (isFreshSearch)
117     {
118       offSet = 0;
119     }
120     new Thread()
121     {
122       @Override
123       public void run()
124       {
125         reset();
126         boolean allowEmptySequence = false;
127         if (getTypedText().length() > 0)
128         {
129           setSearchInProgress(true);
130           long startTime = System.currentTimeMillis();
131
132           String searchTarget = ((FTSDataColumnI) cmb_searchTarget
133                   .getSelectedItem()).getCode();
134           wantedFields = TDBeaconsFTSRestClient.getInstance()
135                   .getAllDefaultDisplayedFTSDataColumns();
136           String searchTerm = getTypedText(); // to add : decodeSearchTerm
137
138           FTSRestRequest request = new FTSRestRequest();
139           request.setAllowEmptySeq(allowEmptySequence);
140           request.setResponseSize(100);
141           request.setFieldToSearchBy("(" + searchTarget + ":");
142           request.setSearchTerm(searchTerm + ")");
143           request.setOffSet(offSet);
144           request.setWantedFields(wantedFields);
145           FTSRestClientI tdbRestClient = TDBeaconsFTSRestClient.getInstance();
146           FTSRestResponse resultList;
147           try
148           {
149             resultList = tdbRestClient.executeRequest(request);
150           } catch (Exception e)
151           {
152             setErrorMessage(e.getMessage());
153             checkForErrors();
154             setSearchInProgress(false);
155             return;
156           }
157
158           if (resultList.getSearchSummary() != null
159                   && resultList.getSearchSummary().size() > 0)
160           {
161             getResultTable().setModel(FTSRestResponse.getTableModel(request,
162                     resultList.getSearchSummary()));
163             FTSRestResponse.configureTableColumn(getResultTable(),
164                     wantedFields, tempUserPrefs);
165             getResultTable().setVisible(true);
166           }
167
168           long endTime = System.currentTimeMillis();
169           totalResultSetCount = resultList.getNumberOfItemsFound();
170           resultSetCount = resultList.getSearchSummary() == null ? 0
171                   : resultList.getSearchSummary().size();
172           String result = (resultSetCount > 0)
173                   ? MessageManager.getString("label.results")
174                   : MessageManager.getString("label.result");
175
176           if (isPaginationEnabled() && resultSetCount > 0)
177           {
178             String f1 = totalNumberformatter.format(Integer.valueOf(offSet + 1));
179             String f2 = totalNumberformatter
180                     .format(Integer.valueOf(offSet + resultSetCount));
181             String f3 = totalNumberformatter
182                     .format(Integer.valueOf(totalResultSetCount));
183             updateSearchFrameTitle(defaultFTSFrameTitle + " - " + result
184                     + " " + f1 + " to " + f2 + " of " + f3 + " " + " ("
185                     + (endTime - startTime) + " milli secs)");
186           }
187           else
188           {
189             updateSearchFrameTitle(defaultFTSFrameTitle + " - "
190                     + resultSetCount + " " + result + " ("
191                     + (endTime - startTime) + " milli secs)");
192           }
193
194           setSearchInProgress(false);
195           refreshPaginatorState();
196           updateSummaryTableSelections();
197         }
198         txt_search.updateCache();
199       }
200     }.start();
201   }
202   
203   @Override
204   public void okAction()
205   {
206     // mainFrame.dispose();
207     disableActionButtons();
208     StringBuilder selectedIds = new StringBuilder();
209     HashSet<String> selectedIdsSet = new HashSet<>();
210     int primaryKeyColIndex = 0;
211     try
212     {
213       primaryKeyColIndex = getFTSRestClient()
214               .getPrimaryKeyColumIndex(wantedFields, false);
215     } catch (Exception e)
216     {
217       e.printStackTrace();
218     }
219     int[] selectedRows = getResultTable().getSelectedRows();
220     String searchTerm = getTypedText();
221     for (int summaryRow : selectedRows)
222     {
223       String idStr = getResultTable()
224               .getValueAt(summaryRow, primaryKeyColIndex).toString();
225       selectedIdsSet.add(searchTerm);
226     }
227
228     for (String idStr : paginatorCart)
229     {
230       selectedIdsSet.add(searchTerm);
231     }
232
233     for (String selectedId : selectedIdsSet)
234     {
235       selectedIds.append(selectedId).append(";");
236     }
237
238     String ids = selectedIds.toString();
239     seqFetcher.setQuery(ids);
240     Thread worker = new Thread(seqFetcher);
241     worker.start();
242     delayAndEnableActionButtons();
243   }
244   
245   @Override
246   public FTSRestClientI getFTSRestClient()
247   {
248     return TDBeaconsFTSRestClient.getInstance();
249   }
250   
251   @Override
252   public String getFTSFrameTitle()
253   {
254     return defaultFTSFrameTitle;
255   }
256
257   @Override
258   public boolean isPaginationEnabled()
259   {
260     return true;
261   }
262
263   @Override
264   public Map<String, Integer> getTempUserPrefs()
265   {
266     return tempUserPrefs;
267   }
268
269   @Override
270   public String getCacheKey()
271   {
272     return THREEDB_FTS_CACHE_KEY;
273   }
274
275   @Override
276   public String getAutosearchPreference()
277   {
278     return THREEDB_AUTOSEARCH;
279   }
280
281   @Override
282   protected void showHelp()
283   {
284     System.out.println("No help implemented yet.");
285     
286   }
287   
288   public static String decodeSearchTerm(String enteredText) {
289     // no multiple query support yet
290     return enteredText;
291   }
292 }