Merge branch 'develop' into feature/r2_11_2/JAL-3808_gff2_exonerate
[jalview.git] / src / jalview / gui / AppJmolBinding.java
index 98787cb..34d930d 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;
 
@@ -32,13 +33,18 @@ import org.openscience.jmol.app.jmolpanel.console.AppConsole;
 
 import jalview.api.AlignmentViewPanel;
 import jalview.api.structures.JalviewStructureDisplayI;
-import jalview.bin.Cache;
+import jalview.bin.Console;
+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
@@ -85,7 +91,7 @@ public class AppJmolBinding extends JalviewJmolBinding
       jalview.util.BrowserLauncher.openURL(url);
     } catch (Exception e)
     {
-      Cache.log.error("Failed to launch Jmol-associated url " + url, e);
+      Console.error("Failed to launch Jmol-associated url " + url, e);
       // TODO: 2.6 : warn user if browser was not configured.
     }
   }
@@ -189,4 +195,101 @@ 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?)
+      
+      for (int pi = 0; pi < getPdbCount(); pi++)
+      {
+        PDBEntry strucEntry = getPdbEntry(pi);
+
+        String file = strucEntry.getFile();
+        if (file == null)
+        {
+          pdbid = strucEntry.getId();
+          try{ 
+            file = structureViewer.fetchPdbFile(strucEntry);
+          } catch (OutOfMemoryError oomerror)
+          {
+            new OOMWarning("Retrieving PDB id " + pdbid, oomerror);
+          } catch (Exception ex)
+          {
+            ex.printStackTrace();
+            errormsgs.append("'").append(pdbid).append("'");
+          }
+          if (file!=null)
+          {
+            // success
+            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;
+  }
+
 }