JAL-1563 JAL-2091 Added generic pagination for FTS Service, pagination for PDB FTS...
[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().size();
111           String result = (resultSetCount > 0) ? MessageManager
112                   .getString("label.results") : MessageManager
113                   .getString("label.result");
114          
115           if (isPaginationEnabled() && resultSetCount > 0)
116           {
117             updateSearchFrameTitle(defaultFTSFrameTitle + " - " + result
118                     + " " + (offSet + 1) + " to "
119                     + (offSet + resultSetCount) + " of "
120                     + totalResultSetCount
121                     + " " + " (" + (endTime - startTime) + " milli secs)");
122           }
123           else
124           {
125             updateSearchFrameTitle(defaultFTSFrameTitle + " - "
126                     + resultSetCount + " " + result + " ("
127                     + (endTime - startTime) + " milli secs)");
128           }
129           
130           setSearchInProgress(false);
131           refreshPaginatorState();
132         }
133       }
134     }.start();
135   }
136
137   public static String decodeSearchTerm(String enteredText,
138           String targetField)
139   {
140     String foundSearchTerms = enteredText;
141     StringBuilder foundSearchTermsBuilder = new StringBuilder();
142     if (enteredText.contains(";"))
143     {
144       String[] searchTerms = enteredText.split(";");
145       for (String searchTerm : searchTerms)
146       {
147         if (searchTerm.contains(":"))
148         {
149           foundSearchTermsBuilder.append(targetField).append(":")
150                   .append(searchTerm.split(":")[0]).append(" OR ");
151         }
152         else
153         {
154           foundSearchTermsBuilder.append(targetField).append(":")
155                   .append(searchTerm).append(" OR ");
156         }
157       }
158       int endIndex = foundSearchTermsBuilder.lastIndexOf(" OR ");
159       foundSearchTerms = foundSearchTermsBuilder.toString();
160       if (foundSearchTerms.contains(" OR "))
161       {
162         foundSearchTerms = foundSearchTerms.substring(
163                 targetField.length() + 1, endIndex);
164       }
165     }
166     else if (enteredText.contains(":"))
167     {
168       foundSearchTerms = foundSearchTerms.split(":")[0];
169     }
170     return foundSearchTerms;
171   }
172
173   @Override
174   public void okAction()
175   {
176     // mainFrame.dispose();
177     disableActionButtons();
178     StringBuilder selectedIds = new StringBuilder();
179     HashSet<String> selectedIdsSet = new HashSet<String>();
180     int primaryKeyColIndex = 0;
181     try
182     {
183       primaryKeyColIndex = getFTSRestClient().getPrimaryKeyColumIndex(
184               wantedFields,
185               false);
186     } catch (Exception e)
187     {
188       e.printStackTrace();
189     }
190     int[] selectedRows = getResultTable().getSelectedRows();
191     for (int summaryRow : selectedRows)
192     {
193       String idStr = getResultTable().getValueAt(summaryRow,
194               primaryKeyColIndex)
195               .toString();
196       String searchTerm = txt_search.getText();
197       selectedIdsSet.add(getPDBIdwithSpecifiedChain(idStr, searchTerm));
198     }
199
200     for (String selectedId : selectedIdsSet)
201     {
202       selectedIds.append(selectedId).append(";");
203     }
204
205     String ids = selectedIds.toString();
206     // System.out.println(">>>>>>>>>>>>>>>> selected Ids: " + ids);
207     seqFetcher.getTextArea().setText(ids);
208     Thread worker = new Thread(seqFetcher);
209     worker.start();
210     delayAndEnableActionButtons();
211   }
212
213
214   public static String getPDBIdwithSpecifiedChain(String pdbId,
215           String searchTerm)
216   {
217     String pdbIdWithChainCode = "";
218     if (searchTerm.contains(";"))
219     {
220       String[] foundTerms = searchTerm.split(";");
221       for (String foundTerm : foundTerms)
222       {
223         if (foundTerm.contains(pdbId))
224         {
225           pdbIdWithChainCode = foundTerm;
226         }
227       }
228     }
229     else if (searchTerm.contains(pdbId))
230     {
231       pdbIdWithChainCode = searchTerm;
232     }
233     else
234     {
235       pdbIdWithChainCode = pdbId;
236     }
237     return pdbIdWithChainCode;
238   }
239
240   @Override
241   public FTSRestClientI getFTSRestClient()
242   {
243     return PDBFTSRestClient.getInstance();
244   }
245
246   @Override
247   public String getFTSFrameTitle()
248   {
249     return ftsFrameTitle;
250   }
251
252   @Override
253   public boolean isPaginationEnabled()
254   {
255     return true;
256   }
257
258 }