9b94c2713303272ee50925ab0adf39ee12cb8a66
[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           }
114
115           PDBRestResponse.configureTableColumn(tbl_summary, wantedFields);
116
117           long endTime = System.currentTimeMillis();
118           int resultSetCount = resultList.getNumberOfItemsFound();
119           String result = (resultSetCount > 1) ? MessageManager
120                   .getString("label.results") : MessageManager
121                   .getString("label.result");
122           mainFrame.setTitle(frameTitle + " - " + resultSetCount + " "
123                   + result + " (" + (endTime - startTime) + " milli secs)");
124           lbl_loading.setVisible(false);
125         }
126       }
127     }.start();
128   }
129
130   public static String decodeSearchTerm(String enteredText,
131           String targetField)
132   {
133     String foundSearchTerms = enteredText;
134     StringBuilder foundSearchTermsBuilder = new StringBuilder();
135     if (enteredText.contains(";"))
136     {
137       String[] searchTerms = enteredText.split(";");
138       for (String searchTerm : searchTerms)
139       {
140         if (searchTerm.contains(":"))
141         {
142           foundSearchTermsBuilder.append(targetField).append(":")
143                   .append(searchTerm.split(":")[0]).append(" OR ");
144         }
145         else
146         {
147           foundSearchTermsBuilder.append(targetField).append(":")
148                   .append(searchTerm).append(" OR ");
149         }
150       }
151       int endIndex = foundSearchTermsBuilder.lastIndexOf(" OR ");
152       foundSearchTerms = foundSearchTermsBuilder.toString();
153       if (foundSearchTerms.contains(" OR "))
154       {
155         foundSearchTerms = foundSearchTerms.substring(
156                 targetField.length() + 1, endIndex);
157       }
158     }
159     else if (enteredText.contains(":"))
160     {
161       foundSearchTerms = foundSearchTerms.split(":")[0];
162     }
163     return foundSearchTerms;
164   }
165
166   @Override
167   public void btn_ok_ActionPerformed()
168   {
169     loadSelectedPDBSequencesToAlignment();
170   }
171
172   @Override
173   public void btn_back_ActionPerformed()
174   {
175     mainFrame.dispose();
176     new SequenceFetcher(progressIdicator);
177   }
178
179   @Override
180   public void btn_cancel_ActionPerformed()
181   {
182     mainFrame.dispose();
183   }
184
185   @Override
186   public void transferToSequenceFetcher(String ids)
187   {
188     // mainFrame.dispose();
189     seqFetcher.textArea.setText(ids);
190     Thread worker = new Thread(seqFetcher);
191     worker.start();
192   }
193
194   /**
195    * Add the discovered/selected sequences to a target alignment window
196    */
197   public void loadSelectedPDBSequencesToAlignment()
198   {
199     // mainFrame.dispose();
200     disableActionButtons();
201     StringBuilder selectedIds = new StringBuilder();
202     HashSet<String> selectedIdsSet = new HashSet<String>();
203     int pdbIdCol = PDBRestClient.getPDBIdColumIndex(wantedFields, false);
204     int[] selectedRows = tbl_summary.getSelectedRows();
205     for (int summaryRow : selectedRows)
206     {
207       String pdbIdStr = tbl_summary.getValueAt(summaryRow, pdbIdCol)
208               .toString();
209       String searchTerm = txt_search.getText();
210       selectedIdsSet.add(getPDBIdwithSpecifiedChain(pdbIdStr, searchTerm));
211     }
212
213     for (String selectedId : selectedIdsSet)
214     {
215       selectedIds.append(selectedId).append(";");
216     }
217
218     String ids = selectedIds.toString();
219     // System.out.println(">>>>>>>>>>>>>>>> selected Ids: " + ids);
220     seqFetcher.textArea.setText(ids);
221     Thread worker = new Thread(seqFetcher);
222     worker.start();
223     delayAndEnableActionButtons();
224
225   }
226
227   private void disableActionButtons()
228   {
229     btn_ok.setEnabled(false);
230     btn_back.setEnabled(false);
231     btn_cancel.setEnabled(false);
232   }
233
234   private void delayAndEnableActionButtons()
235   {
236     new Thread()
237     {
238       @Override
239       public void run()
240       {
241         try
242         {
243           Thread.sleep(1500);
244         } catch (InterruptedException e)
245         {
246           e.printStackTrace();
247         }
248         btn_ok.setEnabled(true);
249         btn_back.setEnabled(true);
250         btn_cancel.setEnabled(true);
251       }
252     }.start();
253   }
254
255   public static String getPDBIdwithSpecifiedChain(String pdbId,
256           String searchTerm)
257   {
258     String pdbIdWithChainCode = "";
259     if (searchTerm.contains(";"))
260     {
261       String[] foundTerms = searchTerm.split(";");
262       for (String foundTerm : foundTerms)
263       {
264         if (foundTerm.contains(pdbId))
265         {
266           pdbIdWithChainCode = foundTerm;
267         }
268       }
269     }
270     else if (searchTerm.contains(pdbId))
271     {
272       pdbIdWithChainCode = searchTerm;
273     }
274     else
275     {
276       pdbIdWithChainCode = pdbId;
277     }
278     return pdbIdWithChainCode;
279   }
280
281   /**
282    * Populates search target combo-box options
283    */
284   @Override
285   public void populateCmbSearchTargetOptions()
286   {
287     List<PDBDocField> searchableTargets = new ArrayList<PDBDocField>();
288     searchableTargets.add(PDBDocField.PDB_ID);
289     searchableTargets.add(PDBDocField.PFAM_ACCESSION);
290     searchableTargets.add(PDBDocField.MOLECULE_TYPE);
291     searchableTargets.add(PDBDocField.MOLECULE_NAME);
292     searchableTargets.add(PDBDocField.UNIPROT_ACCESSION);
293     searchableTargets.add(PDBDocField.GENE_NAME);
294     searchableTargets.add(PDBDocField.GENUS);
295     searchableTargets.add(PDBDocField.ALL);
296
297     Collections.sort(searchableTargets, new Comparator<PDBDocField>()
298     {
299       @Override
300       public int compare(PDBDocField o1, PDBDocField o2)
301       {
302         return o1.getName().compareTo(o2.getName());
303       }
304     });
305
306     for (PDBDocField searchTarget : searchableTargets)
307     {
308       cmb_searchTarget.addItem(searchTarget);
309     }
310   }
311
312   public void checkForErrors()
313   {
314     lbl_warning.setVisible(false);
315     if (errorWarning.length() > 0)
316     {
317       lbl_loading.setVisible(false);
318       lbl_warning.setToolTipText(JvSwingUtils.wrapTooltip(true,
319               errorWarning.toString()));
320       lbl_warning.setVisible(true);
321     }
322   }
323 }