a228c67cc1a1c89e0777ebcaf100d4c5e61cd84e
[jalview.git] / src / jalview / gui / PDBSearchPanel.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.gui;
23
24 import jalview.jbgui.GPDBSearchPanel;
25 import jalview.jbgui.PDBDocFieldPreferences;
26 import jalview.util.MessageManager;
27 import jalview.ws.dbsources.PDBRestClient;
28 import jalview.ws.dbsources.PDBRestClient.PDBDocField;
29 import jalview.ws.uimodel.PDBRestRequest;
30 import jalview.ws.uimodel.PDBRestResponse;
31
32 import java.util.ArrayList;
33 import java.util.Collection;
34 import java.util.Collections;
35 import java.util.Comparator;
36 import java.util.HashSet;
37 import java.util.List;
38
39 import javax.swing.table.DefaultTableModel;
40
41 @SuppressWarnings("serial")
42 public class PDBSearchPanel extends GPDBSearchPanel
43 {
44   private SequenceFetcher seqFetcher;
45
46   private IProgressIndicator progressIdicator;
47
48   private Collection<PDBDocField> wantedFields;
49
50   public PDBSearchPanel(SequenceFetcher seqFetcher)
51   {
52     this.seqFetcher = seqFetcher;
53     this.progressIdicator = (seqFetcher == null) ? null : seqFetcher
54             .getProgressIndicator();
55   }
56
57   /**
58    * Action performed when an input is detected on txt_search field.
59    */
60   @Override
61   public void txt_search_ActionPerformed()
62   {
63     new Thread()
64     {
65       @Override
66       public void run()
67       {
68         lbl_loading.setVisible(false);
69         errorWarning.setLength(0);
70         lbl_warning.setVisible(false);
71         btn_ok.setEnabled(false);
72         boolean allowEmptySequence = false;
73         mainFrame.setTitle(MessageManager
74                 .getString("label.pdb_sequence_getcher"));
75         tbl_summary.setModel(new DefaultTableModel());
76         if (txt_search.getText().trim().length() > 0)
77         {
78           lbl_loading.setVisible(true);
79           long startTime = System.currentTimeMillis();
80
81           String searchTarget = ((PDBDocField) cmb_searchTarget
82                   .getSelectedItem()).getCode();
83
84           wantedFields = PDBDocFieldPreferences.getSearchSummaryFields();
85
86           String searchTerm = decodeSearchTerm(txt_search.getText(),
87                   searchTarget);
88
89           PDBRestRequest request = new PDBRestRequest();
90           request.setAllowEmptySeq(allowEmptySequence);
91           request.setResponseSize(100);
92           request.setFieldToSearchBy("(" + searchTarget + ":");
93           request.setSearchTerm(searchTerm + ")");
94           request.setWantedFields(wantedFields);
95           // System.out.println(">>>>>>>>>>>>>> " + request.getQuery());
96           PDBRestClient pdbRestCleint = new PDBRestClient();
97           PDBRestResponse resultList;
98           try
99           {
100             resultList = pdbRestCleint.executeRequest(request);
101           } catch (Exception e)
102           {
103             // e.printStackTrace();
104             errorWarning.append(e.getMessage());
105             checkForErrors();
106             return;
107           }
108
109           if (resultList.getSearchSummary() != null)
110           {
111             tbl_summary.setModel(PDBRestResponse.getTableModel(request,
112                     resultList.getSearchSummary()));
113             // request.ge
114             // TableRowSorter<TableModel> sorter = new TableRowSorter<>(
115             // tbl_pdbDocFieldConfig.getModel());
116           }
117
118           long endTime = System.currentTimeMillis();
119           int resultSetCount = resultList.getNumberOfItemsFound();
120           String result = (resultSetCount > 1) ? MessageManager
121                   .getString("label.results") : MessageManager
122                   .getString("label.result");
123           mainFrame.setTitle(frameTitle + " - " + resultSetCount + " "
124                   + result + " (" + (endTime - startTime) + " milli secs)");
125           lbl_loading.setVisible(false);
126         }
127       }
128     }.start();
129   }
130
131   public static String decodeSearchTerm(String enteredText,
132           String targetField)
133   {
134     String foundSearchTerms = enteredText;
135     StringBuilder foundSearchTermsBuilder = new StringBuilder();
136     if (enteredText.contains(";"))
137     {
138       String[] searchTerms = enteredText.split(";");
139       for (String searchTerm : searchTerms)
140       {
141         if (searchTerm.contains(":"))
142         {
143           foundSearchTermsBuilder.append(targetField).append(":")
144                   .append(searchTerm.split(":")[0]).append(" OR ");
145         }
146         else
147         {
148           foundSearchTermsBuilder.append(targetField).append(":")
149                   .append(searchTerm).append(" OR ");
150         }
151       }
152       int endIndex = foundSearchTermsBuilder.lastIndexOf(" OR ");
153       foundSearchTerms = foundSearchTermsBuilder.toString();
154       if (foundSearchTerms.contains(" OR "))
155       {
156         foundSearchTerms = foundSearchTerms.substring(
157                 targetField.length() + 1, endIndex);
158       }
159     }
160     else if (enteredText.contains(":"))
161     {
162       foundSearchTerms = foundSearchTerms.split(":")[0];
163     }
164     return foundSearchTerms;
165   }
166
167   @Override
168   public void btn_ok_ActionPerformed()
169   {
170     loadSelectedPDBSequencesToAlignment();
171   }
172
173   @Override
174   public void btn_back_ActionPerformed()
175   {
176     mainFrame.dispose();
177     new SequenceFetcher(progressIdicator);
178   }
179
180   @Override
181   public void btn_cancel_ActionPerformed()
182   {
183     mainFrame.dispose();
184   }
185
186   @Override
187   public void transferToSequenceFetcher(String ids)
188   {
189     // mainFrame.dispose();
190     seqFetcher.textArea.setText(ids);
191     Thread worker = new Thread(seqFetcher);
192     worker.start();
193   }
194
195   /**
196    * Add the discovered/selected sequences to a target alignment window
197    */
198   public void loadSelectedPDBSequencesToAlignment()
199   {
200     // mainFrame.dispose();
201     disableActionButtons();
202     StringBuilder selectedIds = new StringBuilder();
203     HashSet<String> selectedIdsSet = new HashSet<String>();
204     int pdbIdCol = PDBRestClient.getPDBIdColumIndex(wantedFields, false);
205     int[] selectedRows = tbl_summary.getSelectedRows();
206     for (int summaryRow : selectedRows)
207     {
208       String pdbIdStr = tbl_summary.getValueAt(summaryRow, pdbIdCol)
209               .toString();
210       String searchTerm = txt_search.getText();
211       selectedIdsSet.add(getPDBIdwithSpecifiedChain(pdbIdStr, searchTerm));
212     }
213
214     for (String selectedId : selectedIdsSet)
215     {
216       selectedIds.append(selectedId).append(";");
217     }
218
219     String ids = selectedIds.toString();
220     // System.out.println(">>>>>>>>>>>>>>>> selected Ids: " + ids);
221     seqFetcher.textArea.setText(ids);
222     Thread worker = new Thread(seqFetcher);
223     worker.start();
224     delayAndEnableActionButtons();
225
226   }
227
228   private void disableActionButtons()
229   {
230     btn_ok.setEnabled(false);
231     btn_back.setEnabled(false);
232     btn_cancel.setEnabled(false);
233   }
234
235   private void delayAndEnableActionButtons()
236   {
237     new Thread()
238     {
239       @Override
240       public void run()
241       {
242         try
243         {
244           Thread.sleep(1500);
245         } catch (InterruptedException e)
246         {
247           e.printStackTrace();
248         }
249         btn_ok.setEnabled(true);
250         btn_back.setEnabled(true);
251         btn_cancel.setEnabled(true);
252       }
253     }.start();
254   }
255
256   public static String getPDBIdwithSpecifiedChain(String pdbId,
257           String searchTerm)
258   {
259     String pdbIdWithChainCode = "";
260     if (searchTerm.contains(";"))
261     {
262       String[] foundTerms = searchTerm.split(";");
263       for (String foundTerm : foundTerms)
264       {
265         if (foundTerm.contains(pdbId))
266         {
267           pdbIdWithChainCode = foundTerm;
268         }
269       }
270     }
271     else if (searchTerm.contains(pdbId))
272     {
273       pdbIdWithChainCode = searchTerm;
274     }
275     else
276     {
277       pdbIdWithChainCode = pdbId;
278     }
279     return pdbIdWithChainCode;
280   }
281
282   /**
283    * Populates search target combo-box options
284    */
285   @Override
286   public void populateCmbSearchTargetOptions()
287   {
288     List<PDBDocField> searchableTargets = new ArrayList<PDBDocField>();
289     searchableTargets.add(PDBDocField.PDB_ID);
290     searchableTargets.add(PDBDocField.PFAM_ACCESSION);
291     searchableTargets.add(PDBDocField.MOLECULE_TYPE);
292     searchableTargets.add(PDBDocField.MOLECULE_NAME);
293     searchableTargets.add(PDBDocField.UNIPROT_ACCESSION);
294     searchableTargets.add(PDBDocField.GENE_NAME);
295     searchableTargets.add(PDBDocField.GENUS);
296     searchableTargets.add(PDBDocField.ALL);
297
298     Collections.sort(searchableTargets, new Comparator<PDBDocField>()
299     {
300       @Override
301       public int compare(PDBDocField o1, PDBDocField o2)
302       {
303         return o1.getName().compareTo(o2.getName());
304       }
305     });
306
307     for (PDBDocField searchTarget : searchableTargets)
308     {
309       cmb_searchTarget.addItem(searchTarget);
310     }
311   }
312
313   public void checkForErrors()
314   {
315     lbl_warning.setVisible(false);
316     if (errorWarning.length() > 0)
317     {
318       lbl_loading.setVisible(false);
319       lbl_warning.setToolTipText(JvSwingUtils.wrapTooltip(true,
320               errorWarning.toString()));
321       lbl_warning.setVisible(true);
322     }
323   }
324 }