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