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