JAL-1563 JAL-2091 Added total result count to Uniprot pagination, implemented caching...
[jalview.git] / src / jalview / fts / service / pdb / PDBFTSPanel.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
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.
11  *  
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.
16  * 
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.
20  */
21
22 package jalview.fts.service.pdb;
23
24 import jalview.fts.api.FTSDataColumnI;
25 import jalview.fts.api.FTSRestClientI;
26 import jalview.fts.core.FTSRestRequest;
27 import jalview.fts.core.FTSRestResponse;
28 import jalview.fts.core.GFTSPanel;
29 import jalview.gui.SequenceFetcher;
30 import jalview.util.MessageManager;
31
32 import java.util.HashSet;
33
34 @SuppressWarnings("serial")
35 public class PDBFTSPanel extends GFTSPanel
36 {
37   private static String defaultFTSFrameTitle = MessageManager
38           .getString("label.pdb_sequence_fetcher");
39
40   private String ftsFrameTitle = defaultFTSFrameTitle;
41
42   public PDBFTSPanel(SequenceFetcher seqFetcher)
43   {
44     pageLimit = PDBFTSRestClient.getInstance().getDefaultResponsePageSize();
45     this.seqFetcher = seqFetcher;
46     this.progressIdicator = (seqFetcher == null) ? null : seqFetcher
47             .getProgressIndicator();
48   }
49
50
51   @Override
52   public void searchAction(boolean isFreshSearch)
53   {
54     if (isFreshSearch)
55     {
56       offSet = 0;
57     }
58     new Thread()
59     {
60       @Override
61       public void run()
62       {
63         ftsFrameTitle = defaultFTSFrameTitle;
64         reset();
65         boolean allowEmptySequence = false;
66         if (getTypedText().length() > 0)
67         {
68           setSearchInProgress(true);
69           long startTime = System.currentTimeMillis();
70
71           String searchTarget = ((FTSDataColumnI) cmb_searchTarget
72                   .getSelectedItem()).getCode();
73           wantedFields = PDBFTSRestClient.getInstance()
74                   .getAllDefaulDisplayedDataColumns();
75           String searchTerm = decodeSearchTerm(txt_search.getText(),
76                   searchTarget);
77
78           FTSRestRequest request = new FTSRestRequest();
79           request.setAllowEmptySeq(allowEmptySequence);
80           request.setResponseSize(100);
81           request.setFieldToSearchBy("(" + searchTarget + ":");
82           request.setSearchTerm(searchTerm + ")");
83           request.setOffSet(offSet);
84           request.setWantedFields(wantedFields);
85           FTSRestClientI pdbRestCleint = PDBFTSRestClient.getInstance();
86           FTSRestResponse resultList;
87           try
88           {
89             resultList = pdbRestCleint.executeRequest(request);
90           } catch (Exception e)
91           {
92             setErrorMessage(e.getMessage());
93             checkForErrors();
94             return;
95           }
96
97           if (resultList.getSearchSummary() != null
98                   && resultList.getSearchSummary().size() > 0)
99           {
100             getResultTable().setModel(
101                     FTSRestResponse.getTableModel(request,
102                     resultList.getSearchSummary()));
103             FTSRestResponse.configureTableColumn(getResultTable(),
104                     wantedFields);
105             getResultTable().setVisible(true);
106           }
107
108           long endTime = System.currentTimeMillis();
109           totalResultSetCount = resultList.getNumberOfItemsFound();
110           resultSetCount = resultList.getSearchSummary() == null ? 0
111                   : resultList.getSearchSummary().size();
112           String result = (resultSetCount > 0) ? MessageManager
113                   .getString("label.results") : MessageManager
114                   .getString("label.result");
115          
116           if (isPaginationEnabled() && resultSetCount > 0)
117           {
118             updateSearchFrameTitle(defaultFTSFrameTitle + " - " + result
119                     + " " + (offSet + 1) + " to "
120                     + (offSet + resultSetCount) + " of "
121                     + totalResultSetCount
122                     + " " + " (" + (endTime - startTime) + " milli secs)");
123           }
124           else
125           {
126             updateSearchFrameTitle(defaultFTSFrameTitle + " - "
127                     + resultSetCount + " " + result + " ("
128                     + (endTime - startTime) + " milli secs)");
129           }
130           
131           setSearchInProgress(false);
132           refreshPaginatorState();
133           updateSummaryTableSelections();
134         }
135       }
136     }.start();
137   }
138
139   public static String decodeSearchTerm(String enteredText,
140           String targetField)
141   {
142     String foundSearchTerms = enteredText;
143     StringBuilder foundSearchTermsBuilder = new StringBuilder();
144     if (enteredText.contains(";"))
145     {
146       String[] searchTerms = enteredText.split(";");
147       for (String searchTerm : searchTerms)
148       {
149         if (searchTerm.contains(":"))
150         {
151           foundSearchTermsBuilder.append(targetField).append(":")
152                   .append(searchTerm.split(":")[0]).append(" OR ");
153         }
154         else
155         {
156           foundSearchTermsBuilder.append(targetField).append(":")
157                   .append(searchTerm).append(" OR ");
158         }
159       }
160       int endIndex = foundSearchTermsBuilder.lastIndexOf(" OR ");
161       foundSearchTerms = foundSearchTermsBuilder.toString();
162       if (foundSearchTerms.contains(" OR "))
163       {
164         foundSearchTerms = foundSearchTerms.substring(
165                 targetField.length() + 1, endIndex);
166       }
167     }
168     else if (enteredText.contains(":"))
169     {
170       foundSearchTerms = foundSearchTerms.split(":")[0];
171     }
172     return foundSearchTerms;
173   }
174
175   @Override
176   public void okAction()
177   {
178     // mainFrame.dispose();
179     disableActionButtons();
180     StringBuilder selectedIds = new StringBuilder();
181     HashSet<String> selectedIdsSet = new HashSet<String>();
182     int primaryKeyColIndex = 0;
183     try
184     {
185       primaryKeyColIndex = getFTSRestClient().getPrimaryKeyColumIndex(
186               wantedFields,
187               false);
188     } catch (Exception e)
189     {
190       e.printStackTrace();
191     }
192     int[] selectedRows = getResultTable().getSelectedRows();
193     String searchTerm = txt_search.getText();
194     for (int summaryRow : selectedRows)
195     {
196       String idStr = getResultTable().getValueAt(summaryRow,
197               primaryKeyColIndex)
198               .toString();
199       selectedIdsSet.add(getPDBIdwithSpecifiedChain(idStr, searchTerm));
200     }
201
202     for (String idStr : paginatorCart)
203     {
204       selectedIdsSet.add(getPDBIdwithSpecifiedChain(idStr, searchTerm));
205     }
206
207     for (String selectedId : selectedIdsSet)
208     {
209       selectedIds.append(selectedId).append(";");
210     }
211
212     String ids = selectedIds.toString();
213     // System.out.println(">>>>>>>>>>>>>>>> selected Ids: " + ids);
214     seqFetcher.getTextArea().setText(ids);
215     Thread worker = new Thread(seqFetcher);
216     worker.start();
217     delayAndEnableActionButtons();
218   }
219
220
221   public static String getPDBIdwithSpecifiedChain(String pdbId,
222           String searchTerm)
223   {
224     String pdbIdWithChainCode = "";
225     if (searchTerm.contains(";"))
226     {
227       String[] foundTerms = searchTerm.split(";");
228       for (String foundTerm : foundTerms)
229       {
230         if (foundTerm.contains(pdbId))
231         {
232           pdbIdWithChainCode = foundTerm;
233         }
234       }
235     }
236     else if (searchTerm.contains(pdbId))
237     {
238       pdbIdWithChainCode = searchTerm;
239     }
240     else
241     {
242       pdbIdWithChainCode = pdbId;
243     }
244     return pdbIdWithChainCode;
245   }
246
247   @Override
248   public FTSRestClientI getFTSRestClient()
249   {
250     return PDBFTSRestClient.getInstance();
251   }
252
253   @Override
254   public String getFTSFrameTitle()
255   {
256     return ftsFrameTitle;
257   }
258
259   @Override
260   public boolean isPaginationEnabled()
261   {
262     return true;
263   }
264
265 }