JAL-3829 JAL-3855 moved routing for retrieving structures prior to opening a Jmol...
authorJim Procter <j.procter@dundee.ac.uk>
Tue, 14 Sep 2021 16:11:53 +0000 (17:11 +0100)
committerJim Procter <j.procter@dundee.ac.uk>
Tue, 14 Sep 2021 16:11:53 +0000 (17:11 +0100)
src/jalview/gui/AppJmol.java
src/jalview/gui/AppJmolBinding.java
src/jalview/gui/StructureViewerBase.java

index 9280caa..458abc6 100644 (file)
@@ -26,7 +26,6 @@ import java.awt.Dimension;
 import java.awt.Font;
 import java.awt.Graphics;
 import java.io.File;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -38,7 +37,6 @@ import javax.swing.event.InternalFrameEvent;
 
 import jalview.api.AlignmentViewPanel;
 import jalview.bin.Cache;
-import jalview.datamodel.AlignmentI;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
 import jalview.datamodel.StructureViewerModel;
@@ -52,9 +50,6 @@ import jalview.util.BrowserLauncher;
 import jalview.util.ImageMaker;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
-import jalview.ws.dbsources.EBIAlfaFold;
-import jalview.ws.dbsources.Pdb;
-import jalview.ws.utils.UrlDownloadClient;
 
 public class AppJmol extends StructureViewerBase
 {
@@ -274,7 +269,7 @@ public class AppJmol extends StructureViewerBase
     _started = true;
     try
     {
-      List<String> files = fetchPdbFiles();
+      List<String> files = jmb.fetchPdbFiles(this);
       if (files.size() > 0)
       {
         showFilesInViewer(files);
@@ -420,132 +415,6 @@ public class AppJmol extends StructureViewerBase
   }
 
   /**
-   * Retrieves and saves as file any modelled PDB entries for which we do not
-   * already have a file saved. Returns a list of absolute paths to structure
-   * files which were either retrieved, or already stored but not modelled in
-   * the structure viewer (i.e. files to add to the viewer display).
-   * 
-   * @return
-   */
-  List<String> fetchPdbFiles()
-  {
-    // todo - record which pdbids were successfully imported.
-    StringBuilder errormsgs = new StringBuilder();
-
-    List<String> files = new ArrayList<>();
-    String pdbid = "";
-    try
-    {
-      String[] filesInViewer = jmb.getStructureFiles();
-      // TODO: replace with reference fetching/transfer code (validate PDBentry
-      // as a DBRef?)
-      Pdb pdbclient = new Pdb();
-      EBIAlfaFold afclient = new EBIAlfaFold();
-      
-      for (int pi = 0; pi < jmb.getPdbCount(); pi++)
-      {
-        String file = jmb.getPdbEntry(pi).getFile();
-        if (file == null)
-        {
-          // todo: extract block as method and pull up (also ChimeraViewFrame)
-          // retrieve the pdb and store it locally
-          AlignmentI pdbseq = null;
-          PDBEntry strucEntry = jmb.getPdbEntry(pi);
-          pdbid = strucEntry.getId();
-          long hdl = pdbid.hashCode() - System.currentTimeMillis();
-          setProgressMessage(MessageManager
-                  .formatMessage("status.fetching_pdb", new String[]
-                  { pdbid }), hdl);
-          try
-          {
-            if (afclient.isValidReference(pdbid))
-            {
-              pdbseq = afclient.getSequenceRecords(pdbid);
-            } else {
-              if (strucEntry.hasRetrievalUrl())
-              {
-                File tmpFile = File.createTempFile(pdbid, "cif");
-                String fromUrl = strucEntry.getRetrievalUrl();
-                UrlDownloadClient.download(fromUrl, tmpFile);
-                
-                // may not need this check ?
-                file = tmpFile.getAbsolutePath();
-                if (file != null)
-                {
-                  pdbseq = EBIAlfaFold.importDownloadedStructureFromUrl(fromUrl,tmpFile,pdbid,null,null,null);
-                }
-              } else {
-                pdbseq = pdbclient.getSequenceRecords(pdbid);
-              }
-            }
-          } catch (OutOfMemoryError oomerror)
-          {
-            new OOMWarning("Retrieving PDB id " + pdbid, oomerror);
-          } catch (Exception ex)
-          {
-            ex.printStackTrace();
-            errormsgs.append("'").append(pdbid).append("'");
-          } finally
-          {
-            setProgressMessage(
-                    MessageManager.getString("label.state_completed"), hdl);
-          }
-          if (pdbseq != null)
-          {
-            // just transfer the file name from the first sequence's first
-            // PDBEntry
-            file = new File(pdbseq.getSequenceAt(0).getAllPDBEntries()
-                    .elementAt(0).getFile()).getAbsolutePath();
-            jmb.getPdbEntry(pi).setFile(file);
-            files.add(file);
-          }
-          else
-          {
-            errormsgs.append("'").append(pdbid).append("' ");
-          }
-        }
-        else
-        {
-          if (filesInViewer != null && filesInViewer.length > 0)
-          {
-            addingStructures = true; // already files loaded.
-            for (int c = 0; c < filesInViewer.length; c++)
-            {
-              if (Platform.pathEquals(filesInViewer[c], file))
-              {
-                file = null;
-                break;
-              }
-            }
-          }
-          if (file != null)
-          {
-            files.add(file);
-          }
-        }
-      }
-    } catch (OutOfMemoryError oomerror)
-    {
-      new OOMWarning("Retrieving PDB files: " + pdbid, oomerror);
-    } catch (Exception ex)
-    {
-      ex.printStackTrace();
-      errormsgs.append("When retrieving pdbfiles : current was: '")
-              .append(pdbid).append("'");
-    }
-    if (errormsgs.length() > 0)
-    {
-      JvOptionPane.showInternalMessageDialog(Desktop.desktop,
-              MessageManager.formatMessage(
-                      "label.pdb_entries_couldnt_be_retrieved", new String[]
-                      { errormsgs.toString() }),
-              MessageManager.getString("label.couldnt_load_file"),
-              JvOptionPane.ERROR_MESSAGE);
-    }
-    return files;
-  }
-
-  /**
    * Outputs the Jmol viewer image as an image file, after prompting the user to
    * choose a file and (for EPS) choice of Text or Lineart character rendering
    * (unless a preference for this is set)
index 98787cb..037b97e 100644 (file)
@@ -22,6 +22,7 @@ package jalview.gui;
 
 import java.awt.Container;
 import java.io.File;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -33,12 +34,17 @@ import org.openscience.jmol.app.jmolpanel.console.AppConsole;
 import jalview.api.AlignmentViewPanel;
 import jalview.api.structures.JalviewStructureDisplayI;
 import jalview.bin.Cache;
+import jalview.datamodel.AlignmentI;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
 import jalview.ext.jmol.JalviewJmolBinding;
 import jalview.io.DataSourceType;
 import jalview.structure.StructureSelectionManager;
+import jalview.util.MessageManager;
 import jalview.util.Platform;
+import jalview.ws.dbsources.EBIAlfaFold;
+import jalview.ws.dbsources.Pdb;
+import jalview.ws.utils.UrlDownloadClient;
 import javajs.util.BS;
 
 public class AppJmolBinding extends JalviewJmolBinding
@@ -189,4 +195,137 @@ public class AppJmolBinding extends JalviewJmolBinding
       Platform.cacheFileData(f);
     }
   }
+
+  /**
+   * Retrieves and saves as file any modelled PDB entries for which we do not
+   * already have a file saved. Returns a list of absolute paths to structure
+   * files which were either retrieved, or already stored but not modelled in
+   * the structure viewer (i.e. files to add to the viewer display).
+   * 
+   * Currently only used by Jmol - similar but different code used for Chimera/X
+   * and Pymol so still need to refactor
+   * 
+   * @param structureViewer
+   *          UI proxy for the structure viewer
+   * @return list of absolute paths to structures retrieved that need to be
+   *         added to the display
+   */
+  public List<String> fetchPdbFiles(StructureViewerBase structureViewer)
+  {
+    // todo - record which pdbids were successfully imported.
+    StringBuilder errormsgs = new StringBuilder();
+  
+    List<String> files = new ArrayList<>();
+    String pdbid = "";
+    try
+    {
+      String[] filesInViewer = getStructureFiles();
+      // TODO: replace with reference fetching/transfer code (validate PDBentry
+      // as a DBRef?)
+      Pdb pdbclient = new Pdb();
+      EBIAlfaFold afclient = new EBIAlfaFold();
+      
+      for (int pi = 0; pi < getPdbCount(); pi++)
+      {
+        String file = getPdbEntry(pi).getFile();
+        if (file == null)
+        {
+          // todo: extract block as method and pull up (also ChimeraViewFrame)
+          // retrieve the pdb and store it locally
+          AlignmentI pdbseq = null;
+          PDBEntry strucEntry = getPdbEntry(pi);
+          pdbid = strucEntry.getId();
+          long hdl = pdbid.hashCode() - System.currentTimeMillis();
+          structureViewer.setProgressMessage(MessageManager
+                  .formatMessage("status.fetching_pdb", new String[]
+                  { pdbid }), hdl);
+          try
+          {
+            if (afclient.isValidReference(pdbid))
+            {
+              pdbseq = afclient.getSequenceRecords(pdbid);
+            } else {
+              if (strucEntry.hasRetrievalUrl())
+              {
+                File tmpFile = File.createTempFile(pdbid, ".cif");
+                String fromUrl = strucEntry.getRetrievalUrl();
+                UrlDownloadClient.download(fromUrl, tmpFile);
+                
+                // may not need this check ?
+                file = tmpFile.getAbsolutePath();
+                if (file != null)
+                {
+                  pdbseq = EBIAlfaFold.importDownloadedStructureFromUrl(fromUrl,tmpFile,pdbid,null,null,null);
+                }
+              } else {
+                pdbseq = pdbclient.getSequenceRecords(pdbid);
+              }
+            }
+          } catch (OutOfMemoryError oomerror)
+          {
+            new OOMWarning("Retrieving PDB id " + pdbid, oomerror);
+          } catch (Exception ex)
+          {
+            ex.printStackTrace();
+            errormsgs.append("'").append(pdbid).append("'");
+          } finally
+          {
+            structureViewer.setProgressMessage(
+                    MessageManager.getString("label.state_completed"), hdl);
+          }
+          if (pdbseq != null)
+          {
+            // just transfer the file name from the first sequence's first
+            // PDBEntry
+            file = new File(pdbseq.getSequenceAt(0).getAllPDBEntries()
+                    .elementAt(0).getFile()).getAbsolutePath();
+            getPdbEntry(pi).setFile(file);
+            files.add(file);
+          }
+          else
+          {
+            errormsgs.append("'").append(pdbid).append("' ");
+          }
+        }
+        else
+        {
+          if (filesInViewer != null && filesInViewer.length > 0)
+          {
+            structureViewer.setAddingStructures(true); // already files loaded.
+            for (int c = 0; c < filesInViewer.length; c++)
+            {
+              if (Platform.pathEquals(filesInViewer[c], file))
+              {
+                file = null;
+                break;
+              }
+            }
+          }
+          if (file != null)
+          {
+            files.add(file);
+          }
+        }
+      }
+    } catch (OutOfMemoryError oomerror)
+    {
+      new OOMWarning("Retrieving PDB files: " + pdbid, oomerror);
+    } catch (Exception ex)
+    {
+      ex.printStackTrace();
+      errormsgs.append("When retrieving pdbfiles : current was: '")
+              .append(pdbid).append("'");
+    }
+    if (errormsgs.length() > 0)
+    {
+      JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+              MessageManager.formatMessage(
+                      "label.pdb_entries_couldnt_be_retrieved", new String[]
+                      { errormsgs.toString() }),
+              MessageManager.getString("label.couldnt_load_file"),
+              JvOptionPane.ERROR_MESSAGE);
+    }
+    return files;
+  }
+
 }
index b349559..11bf50f 100644 (file)
@@ -154,6 +154,15 @@ public abstract class StructureViewerBase extends GStructureViewer
   {
     alignAddedStructures = alignAdded;
   }
+  
+  /**
+   * called by the binding model to indicate when adding structures is happening or has been completed
+   * @param addingStructures
+   */
+  public synchronized void setAddingStructures(boolean addingStructures)
+  {
+    this.addingStructures = addingStructures;
+  }
 
   /**
    * 
@@ -1077,7 +1086,7 @@ public abstract class StructureViewerBase extends GStructureViewer
     progressBar = pi;
   }
 
-  protected void setProgressMessage(String message, long id)
+  public void setProgressMessage(String message, long id)
   {
     if (progressBar != null)
     {