JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / gui / PDBSearchPanel.java
index 5a8407a..4c89f12 100644 (file)
@@ -33,6 +33,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.List;
 
 import javax.swing.table.DefaultTableModel;
@@ -53,56 +54,110 @@ public class PDBSearchPanel extends GPDBSearchPanel
             .getProgressIndicator();
   }
 
-
   /**
    * Action performed when an input is detected on txt_search field.
    */
   @Override
   public void txt_search_ActionPerformed()
   {
-    boolean allowEmptySequence = false;
-    mainFrame.setTitle(MessageManager
-            .getString("label.pdb_sequence_getcher"));
-    tbl_summary.setModel(new DefaultTableModel());
-    if (txt_search.getText().trim().length() > 0)
+    new Thread()
     {
-      long startTime = System.currentTimeMillis();
+      public void run()
+      {
+        lbl_loading.setVisible(false);
+        errorWarning.setLength(0);
+        lbl_warning.setVisible(false);
+        btn_ok.setEnabled(false);
+        boolean allowEmptySequence = false;
+        mainFrame.setTitle(MessageManager
+                .getString("label.pdb_sequence_getcher"));
+        tbl_summary.setModel(new DefaultTableModel());
+        if (txt_search.getText().trim().length() > 0)
+        {
+          lbl_loading.setVisible(true);
+          long startTime = System.currentTimeMillis();
 
-      String searchTarget = ((PDBDocField) cmb_searchTarget
-              .getSelectedItem()).getCode();
+          String searchTarget = ((PDBDocField) cmb_searchTarget
+                  .getSelectedItem()).getCode();
 
-      wantedFields = PDBDocFieldPreferences
-              .getSearchSummaryFields();
+          wantedFields = PDBDocFieldPreferences.getSearchSummaryFields();
 
-      String searchTerm = txt_search.getText();
-      if (searchTerm.contains(":"))
-      {
-        searchTerm = searchTerm.split(":")[0];
-      }
+          String searchTerm = decodeSearchTerm(txt_search.getText(),
+                  searchTarget);
 
-      PDBRestRequest request = new PDBRestRequest();
-      request.setAllowEmptySeq(allowEmptySequence);
-      request.setResponseSize(100);
-      request.setFieldToSearchBy(searchTarget + ":");
-      request.setSearchTerm(searchTerm);
-      request.setWantedFields(wantedFields);
+          PDBRestRequest request = new PDBRestRequest();
+          request.setAllowEmptySeq(allowEmptySequence);
+          request.setResponseSize(100);
+          request.setFieldToSearchBy("(" + searchTarget + ":");
+          request.setSearchTerm(searchTerm + ")");
+          request.setWantedFields(wantedFields);
+          // System.out.println(">>>>>>>>>>>>>> " + request.getQuery());
+          PDBRestClient pdbRestCleint = new PDBRestClient();
+          PDBRestResponse resultList;
+          try
+          {
+            resultList = pdbRestCleint.executeRequest(request);
+          } catch (Exception e)
+          {
+            // e.printStackTrace();
+            errorWarning.append(e.getMessage());
+            checkForErrors();
+            return;
+          }
 
-      PDBRestClient pdbRestCleint = new PDBRestClient();
-      PDBRestResponse resultList = pdbRestCleint.executeRequest(request);
-      if (resultList.getSearchSummary() != null)
-      {
-        tbl_summary.setModel(PDBRestResponse.getTableModel(request,
-                resultList.getSearchSummary()));
+          if (resultList.getSearchSummary() != null)
+          {
+            tbl_summary.setModel(PDBRestResponse.getTableModel(request,
+                    resultList.getSearchSummary()));
+          }
+
+          long endTime = System.currentTimeMillis();
+          int resultSetCount = resultList.getNumberOfItemsFound();
+          String result = (resultSetCount > 1) ? MessageManager
+                  .getString("label.results") : MessageManager
+                  .getString("label.result");
+          mainFrame.setTitle(frameTitle + " - " + resultSetCount + " "
+                  + result + " (" + (endTime - startTime) + " milli secs)");
+          lbl_loading.setVisible(false);
+        }
       }
+    }.start();
+  }
 
-      long endTime = System.currentTimeMillis();
-      int resultSetCount = resultList.getNumberOfItemsFound();
-      String result = (resultSetCount > 1) ? MessageManager
-              .getString("label.results") : MessageManager
-              .getString("label.result");
-      mainFrame.setTitle(frameTitle + " - " + resultSetCount + " " + result
-              + " (" + (endTime - startTime) + " milli secs)");
+  public static String decodeSearchTerm(String enteredText,
+          String targetField)
+  {
+    String foundSearchTerms = enteredText;
+    StringBuilder foundSearchTermsBuilder = new StringBuilder();
+    if (enteredText.contains(";"))
+    {
+      String[] searchTerms = enteredText.split(";");
+      for (String searchTerm : searchTerms)
+      {
+        if (searchTerm.contains(":"))
+        {
+          foundSearchTermsBuilder.append(targetField).append(":")
+                  .append(searchTerm.split(":")[0]).append(" OR ");
+        }
+        else
+        {
+          foundSearchTermsBuilder.append(targetField).append(":")
+                  .append(searchTerm).append(" OR ");
+        }
+      }
+      int endIndex = foundSearchTermsBuilder.lastIndexOf(" OR ");
+      foundSearchTerms = foundSearchTermsBuilder.toString();
+      if (foundSearchTerms.contains(" OR "))
+      {
+        foundSearchTerms = foundSearchTerms.substring(
+                targetField.length() + 1, endIndex);
+      }
     }
+    else if (enteredText.contains(":"))
+    {
+      foundSearchTerms = foundSearchTerms.split(":")[0];
+    }
+    return foundSearchTerms;
   }
 
   @Override
@@ -124,36 +179,98 @@ public class PDBSearchPanel extends GPDBSearchPanel
     mainFrame.dispose();
   }
 
+  public void transferToSequenceFetcher(String ids)
+  {
+    // mainFrame.dispose();
+    seqFetcher.textArea.setText(ids);
+    Thread worker = new Thread(seqFetcher);
+    worker.start();
+  }
+
   /**
    * Add the discovered/selected sequences to a target alignment window
    */
   public void loadSelectedPDBSequencesToAlignment()
   {
-    mainFrame.dispose();
+    // mainFrame.dispose();
+    disableActionButtons();
     StringBuilder selectedIds = new StringBuilder();
+    HashSet<String> selectedIdsSet = new HashSet<String>();
     int pdbIdCol = PDBRestClient.getPDBIdColumIndex(wantedFields, false);
     int[] selectedRows = tbl_summary.getSelectedRows();
     for (int summaryRow : selectedRows)
     {
       String pdbIdStr = tbl_summary.getValueAt(summaryRow, pdbIdCol)
               .toString();
-
       String searchTerm = txt_search.getText();
-      if (searchTerm.contains(":"))
-      {
-        selectedIds.append(";").append(pdbIdStr).append(":")
-                .append(searchTerm.split(":")[1].toUpperCase());
-      }
-      else
-      {
-        selectedIds.append(";").append(pdbIdStr);
-      }
+      selectedIdsSet.add(getPDBIdwithSpecifiedChain(pdbIdStr, searchTerm));
     }
 
-    String ids = selectedIds.deleteCharAt(0).toString();
+    for (String selectedId : selectedIdsSet)
+    {
+      selectedIds.append(selectedId).append(";");
+    }
+
+    String ids = selectedIds.toString();
+    // System.out.println(">>>>>>>>>>>>>>>> selected Ids: " + ids);
     seqFetcher.textArea.setText(ids);
     Thread worker = new Thread(seqFetcher);
     worker.start();
+    delayAndEnableActionButtons();
+
+  }
+
+  private void disableActionButtons()
+  {
+    btn_ok.setEnabled(false);
+    btn_back.setEnabled(false);
+    btn_cancel.setEnabled(false);
+  }
+
+  private void delayAndEnableActionButtons()
+  {
+    new Thread()
+    {
+      public void run()
+      {
+        try
+        {
+          Thread.sleep(1500);
+        } catch (InterruptedException e)
+        {
+          e.printStackTrace();
+        }
+        btn_ok.setEnabled(true);
+        btn_back.setEnabled(true);
+        btn_cancel.setEnabled(true);
+      }
+    }.start();
+  }
+
+  public static String getPDBIdwithSpecifiedChain(String pdbId,
+          String searchTerm)
+  {
+    String pdbIdWithChainCode = "";
+    if (searchTerm.contains(";"))
+    {
+      String[] foundTerms = searchTerm.split(";");
+      for (String foundTerm : foundTerms)
+      {
+        if (foundTerm.contains(pdbId))
+        {
+          pdbIdWithChainCode = foundTerm;
+        }
+      }
+    }
+    else if (searchTerm.contains(pdbId))
+    {
+      pdbIdWithChainCode = searchTerm;
+    }
+    else
+    {
+      pdbIdWithChainCode = pdbId;
+    }
+    return pdbIdWithChainCode;
   }
 
   /**
@@ -186,4 +303,15 @@ public class PDBSearchPanel extends GPDBSearchPanel
     }
   }
 
+  public void checkForErrors()
+  {
+    lbl_warning.setVisible(false);
+    if (errorWarning.length() > 0)
+    {
+      lbl_loading.setVisible(false);
+      lbl_warning.setToolTipText(JvSwingUtils.wrapTooltip(true,
+              errorWarning.toString()));
+      lbl_warning.setVisible(true);
+    }
+  }
 }