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