new SequenceFetcher gui and visual delay indication for initialisation and fetching
[jalview.git] / src / jalview / gui / SequenceFetcher.java
index 10e1b59..53f75a4 100755 (executable)
@@ -23,6 +23,7 @@ import java.util.*;
 
 import java.awt.*;
 import java.awt.event.*;
+
 import javax.swing.*;
 
 import MCview.*;
@@ -31,7 +32,9 @@ import jalview.datamodel.xdb.embl.*;
 import java.io.File;
 import jalview.io.*;
 import jalview.ws.DBRefFetcher;
-import jalview.ws.EBIFetchClient;
+import jalview.ws.ebi.EBIFetchClient;
+import jalview.ws.seqfetcher.ASequenceFetcher;
+import jalview.ws.seqfetcher.DbSourceProxy;
 
 import java.awt.Rectangle;
 import java.awt.BorderLayout;
@@ -40,15 +43,56 @@ import java.awt.Dimension;
 public class SequenceFetcher
 extends JPanel implements Runnable
 {
-  jalview.ws.SequenceFetcher sfetch; 
+  // ASequenceFetcher sfetch; 
   JInternalFrame frame;
+  IProgressIndicator guiWindow;
   AlignFrame alignFrame;
   StringBuffer result;
   final String noDbSelected = "-- Select Database --";
-  public SequenceFetcher(AlignFrame af)
+  Hashtable sources = new Hashtable();
+  private static ASequenceFetcher sfetch=null;
+  public SequenceFetcher(IProgressIndicator guiIndic)
   {
-    alignFrame = af;
-    sfetch = new jalview.ws.SequenceFetcher();
+      final IProgressIndicator guiWindow = guiIndic;
+      final SequenceFetcher us = this;
+      // launch initialiser thread
+      Thread sf = new Thread(new Runnable() {
+
+        public void run()
+        {
+          if (sfetch==null)
+          {
+            /**
+           * give a visual indication that sequence fetcher construction is occuring
+           */
+          if ( guiWindow!=null )
+            {
+              guiWindow.setProgressBar("Initialising Sequence Database Fetchers", this.hashCode());
+            }
+            ASequenceFetcher sf = new jalview.ws.SequenceFetcher();
+            if ( guiWindow!=null )
+            {
+              guiWindow.setProgressBar("Initialising Sequence Database Fetchers", this.hashCode());
+            }
+            sfetch = sf;
+            
+          }
+          us.initGui(guiWindow);
+        }
+      });
+      sf.start();
+  }
+  /**
+   * called by thread spawned by constructor
+   * @param guiWindow
+   */
+  private void initGui(IProgressIndicator guiWindow) {
+    this.guiWindow = guiWindow;
+    if (guiWindow instanceof AlignFrame)
+    {
+      alignFrame = (AlignFrame) guiWindow;
+    }
+      
     database.addItem(noDbSelected);
     /*
      * Dynamically generated database list
@@ -56,24 +100,23 @@ extends JPanel implements Runnable
      * internal source to externally distinct names.
      * UNIPROT and UP_NAME are identical DB sources,
      * and should be collapsed. 
-     *
+     */
      
-     String dbs[] = sfetch.getSupportedDb();
+    String dbs[] = sfetch.getSupportedDb();
     for (int i=0; i<dbs.length;i++)
     {
-      if (DBRefSource.isPrimaryDb(dbs[i]))
+      if (!sources.containsValue(dbs[i]))
       {  
-        database.addItem(dbs[i]);
-        // should have some kind of human readable description of each database displayed when
-         * that combo is selected.
+        String name = sfetch.getSourceProxy(dbs[i]).getDbName();
+        // duplicate source names are thrown away, here.
+        if (!sources.containsKey(name))
+        {
+          database.addItem(name);
+        }
+        // overwrite with latest version of the retriever for this source
+        sources.put(name, dbs[i]);        
       }
-    }*/
-    database.addItem("Uniprot");
-    database.addItem("EMBL");
-    database.addItem("EMBLCDS");
-    database.addItem("PDB");
-    database.addItem("PFAM");
-
+    }
     try
     {
       jbInit();
@@ -85,7 +128,7 @@ extends JPanel implements Runnable
 
     frame = new JInternalFrame();
     frame.setContentPane(this);
-    if (System.getProperty("os.name").startsWith("Mac"))
+    if (new jalview.util.Platform().isAMac())
     {
       Desktop.addInternalFrame(frame, getFrameTitle(), 400, 140);
     }
@@ -107,6 +150,7 @@ extends JPanel implements Runnable
     this.setLayout(borderLayout2);
 
     database.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));
+    dbeg.setFont(new java.awt.Font("Verdana", Font.BOLD, 11));
     jLabel1.setFont(new java.awt.Font("Verdana", Font.ITALIC, 11));
     jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
     jLabel1.setText(
@@ -119,6 +163,23 @@ extends JPanel implements Runnable
         ok_actionPerformed();
       }
     });
+    clear.setText("Clear");
+    clear.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        clear_actionPerformed();
+      }
+    });
+
+    example.setText("Example");
+    example.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        example_actionPerformed();
+      }
+    });
     close.setText("Close");
     close.addActionListener(new ActionListener()
     {
@@ -140,28 +201,74 @@ extends JPanel implements Runnable
     jPanel3.setLayout(borderLayout1);
     borderLayout1.setVgap(5);
     jPanel1.add(ok);
+    jPanel1.add(example);
+    jPanel1.add(clear);
     jPanel1.add(close);
-    jPanel3.add(jPanel2, java.awt.BorderLayout.WEST);
-    jPanel2.add(database);
+    jPanel3.add(jPanel2, java.awt.BorderLayout.CENTER);
+    jPanel2.setLayout(borderLayout3);
+    
+    database.addActionListener(new ActionListener() {
+
+      public void actionPerformed(ActionEvent e)
+      {
+        DbSourceProxy db=null;
+        try {
+          db = sfetch.getSourceProxy((String)sources.get(database.getSelectedItem()));
+          dbeg.setText("Example query: "+db.getTestQuery());
+        } catch (Exception ex)
+        {
+          dbeg.setText("");
+        }
+        jPanel2.repaint();
+      }
+    });
+    dbeg.setText("");
+    jPanel2.add(database, java.awt.BorderLayout.NORTH);
+    jPanel2.add(dbeg, java.awt.BorderLayout.CENTER);
+    jPanel2.add(jLabel1, java.awt.BorderLayout.SOUTH);
+    // jPanel2.setPreferredSize(new Dimension())
     jPanel3.add(jScrollPane1, java.awt.BorderLayout.CENTER);
-    jPanel3.add(jLabel1, java.awt.BorderLayout.NORTH);
     this.add(jPanel1, java.awt.BorderLayout.SOUTH);
     this.add(jPanel3, java.awt.BorderLayout.CENTER);
+    this.add(jPanel2,java.awt.BorderLayout.NORTH);
     jScrollPane1.getViewport().add(textArea);
+    
 
   }
+  protected void example_actionPerformed()
+  {
+    DbSourceProxy db=null;
+    try {
+      db = sfetch.getSourceProxy((String)sources.get(database.getSelectedItem()));
+      textArea.setText(db.getTestQuery());
+    } catch (Exception ex)
+    {
+    }
+    jPanel3.repaint();
+  }
 
+  protected void clear_actionPerformed()
+  {
+    textArea.setText("");
+    jPanel3.repaint();
+  }
+  JLabel dbeg = new JLabel();
   JComboBox database = new JComboBox();
   JLabel jLabel1 = new JLabel();
   JButton ok = new JButton();
+  JButton clear = new JButton();
+  JButton example = new JButton();
   JButton close = new JButton();
   JPanel jPanel1 = new JPanel();
   JTextArea textArea = new JTextArea();
   JScrollPane jScrollPane1 = new JScrollPane();
   JPanel jPanel2 = new JPanel();
   JPanel jPanel3 = new JPanel();
+  JPanel jPanel4 = new JPanel();
+  
   BorderLayout borderLayout1 = new BorderLayout();
   BorderLayout borderLayout2 = new BorderLayout();
+  BorderLayout borderLayout3 = new BorderLayout();
   public void close_actionPerformed(ActionEvent e)
   {
     try
@@ -210,7 +317,41 @@ extends JPanel implements Runnable
       resetDialog();
       return;
     }
-
+    AlignmentI aresult=null;
+    try {
+      guiWindow.setProgressBar("Fetching Sequences from "+database.getSelectedItem(), Thread.currentThread().hashCode());
+      aresult = sfetch.getSourceProxy((String)sources.get(database.getSelectedItem()))
+      .getSequenceRecords(textArea.getText());
+      
+    }
+    catch (Exception e)
+    {
+      showErrorMessage("Error retrieving " + textArea.getText()
+              + " from " + database.getSelectedItem());
+      //error +="Couldn't retrieve sequences from "+database.getSelectedItem();
+      System.err.println("Retrieval failed for source ='"+database.getSelectedItem()+"' and query\n'"+textArea.getText()+"'\n");
+      e.printStackTrace();
+    }
+    catch (OutOfMemoryError e)
+    {
+      showErrorMessage("Out of Memory when retrieving " + textArea.getText()
+              + " from " + database.getSelectedItem()+"\nPlease see the Jalview FAQ for instructions for increasing the memory available to Jalview.\n");
+      e.printStackTrace();
+    }
+    catch (Error e)
+    {
+      showErrorMessage("Serious Error retrieving " + textArea.getText()
+              + " from " + database.getSelectedItem());
+      e.printStackTrace();
+    }
+    guiWindow.setProgressBar(null, Thread.currentThread().hashCode());
+    if (aresult!=null)
+    {
+      parseResult(aresult, null, null);
+    }
+    resetDialog();
+  }
+    /*
     result = new StringBuffer();
     if (database.getSelectedItem().equals("Uniprot"))
     {
@@ -228,10 +369,10 @@ extends JPanel implements Runnable
       while(st.hasMoreTokens())
       {
         EBIFetchClient dbFetch = new EBIFetchClient();
-
+        String qry = database.getSelectedItem().toString().toLowerCase(
+        ) + ":" + st.nextToken();
         File reply = dbFetch.fetchDataAsFile(
-            database.getSelectedItem().toString().toLowerCase(
-            ) + ":" + st.nextToken(),
+            qry,
             "emblxml",null);
 
         jalview.datamodel.xdb.embl.EmblFile efile=null;
@@ -264,12 +405,14 @@ extends JPanel implements Runnable
             }
           }
         } else {
-          result=null;
+          result.append("# no response for "+qry);
         }
       }
       if (seqs!=null && seqs.length>0) {
         if (parseResult(new Alignment(seqs), null, null)!=null)
-          result.append("# Successfully parsed the "+database.getSelectedItem()+" Queries into an Alignment");
+        {
+            result.append("# Successfully parsed the "+database.getSelectedItem()+" Queries into an Alignment");
+        }
       }
     }
     else if (database.getSelectedItem().equals("PDB"))
@@ -473,7 +616,7 @@ extends JPanel implements Runnable
                         + "=" + sq.getStart()
                         + "-" + sq.getEnd());
             sq.getDatasetSequence().addPDBId(entry);
-           */
+           *
           // Add PDB DB Refs
           // We make a DBRefEtntry because we have obtained the PDB file from a verifiable source
           // JBPNote - PDB DBRefEntry should also carry the chain and mapping information
@@ -505,9 +648,9 @@ extends JPanel implements Runnable
       results[i] = (SequenceI) result.elementAt(i);
       result.setElementAt(null,i);
     }
-    return results;
-  }
-  Alignment parseResult(String result, String title)
+    return results; 
+  }*/
+  AlignmentI parseResult(String result, String title)
   {
     String format = new IdentifyFile().Identify(result, "Paste");
     Alignment sequences = null;
@@ -536,7 +679,7 @@ extends JPanel implements Runnable
     return null;
   }
 
-  Alignment parseResult(Alignment al, String title, String currentFileFormat)
+  AlignmentI parseResult(AlignmentI al, String title, String currentFileFormat)
   {
 
     if (al != null && al.getHeight() > 0)