From: gmungoc Date: Fri, 29 May 2020 15:23:05 +0000 (+0100) Subject: JAL-3551 null pointer defence while structure files loading; comments X-Git-Tag: Develop-2_11_2_0-d20201215~24^2~56^2 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=ca4ed63aacf92872319f2bf64225c2742c338184;p=jalview.git JAL-3551 null pointer defence while structure files loading; comments --- diff --git a/src/jalview/ext/jmol/JalviewJmolBinding.java b/src/jalview/ext/jmol/JalviewJmolBinding.java index 63c1fd3..eee48df 100644 --- a/src/jalview/ext/jmol/JalviewJmolBinding.java +++ b/src/jalview/ext/jmol/JalviewJmolBinding.java @@ -118,7 +118,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel private String jmolScript(String script) { Cache.log.debug(">>Jmol>> " + script); - String s = jmolViewer.scriptWait(script); + String s = jmolViewer.evalStringQuiet(script); // scriptWait(script); BH Cache.log.debug("< 1 + if (getBinding().getMappedStructureCount() > 1 && getBinding().getSequence().length > 1) { viewSelectionMenu.setEnabled(true); diff --git a/src/jalview/project/Jalview2XML.java b/src/jalview/project/Jalview2XML.java index 8bbe20c..ccd9ab0 100644 --- a/src/jalview/project/Jalview2XML.java +++ b/src/jalview/project/Jalview2XML.java @@ -29,7 +29,6 @@ import java.awt.Font; import java.awt.Rectangle; import java.io.BufferedReader; import java.io.ByteArrayInputStream; -import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -1089,13 +1088,14 @@ public class Jalview2XML if (frames[f] instanceof StructureViewerBase) { StructureViewerBase viewFrame = (StructureViewerBase) frames[f]; - matchedFile = saveStructureState(ap, jds, pdb, entry, viewIds, + matchedFile = saveStructureViewer(ap, jds, pdb, entry, viewIds, matchedFile, viewFrame); /* * Only store each structure viewer's state once in the project * jar. First time through only (storeDS==false) */ String viewId = viewFrame.getViewId(); + String viewerType = viewFrame.getViewerType().toString(); if (!storeDS && !viewIds.contains(viewId)) { viewIds.add(viewId); @@ -1103,13 +1103,13 @@ public class Jalview2XML if (viewerState != null) { copyFileToJar(jout, viewerState.getPath(), - getViewerJarEntryName(viewId)); + getViewerJarEntryName(viewId), viewerType); } else { Cache.log.error("Failed to save viewer state for " + - viewFrame.getViewerType().toString()); + viewerType); } } } @@ -1131,7 +1131,7 @@ public class Jalview2XML if (!pdbfiles.contains(pdbId)) { pdbfiles.add(pdbId); - copyFileToJar(jout, matchedFile, pdbId); + copyFileToJar(jout, matchedFile, pdbId, pdbId); } } @@ -1678,7 +1678,7 @@ public class Jalview2XML // using save and then load try { - fileName = fileName.replace('\\', '/'); + fileName = fileName.replace('\\', '/'); System.out.println("Writing jar entry " + fileName); JarEntry entry = new JarEntry(fileName); jout.putNextEntry(entry); @@ -1979,7 +1979,7 @@ public class Jalview2XML String varnaStateFile = varna.getStateInfo(model.rna); jarEntryName = RNA_PREFIX + viewId + "_" + nextCounter(); - copyFileToJar(jout, varnaStateFile, jarEntryName); + copyFileToJar(jout, varnaStateFile, jarEntryName, "Varna"); rnaSessions.put(model, jarEntryName); } SecondaryStructure ss = new SecondaryStructure(); @@ -2003,16 +2003,19 @@ public class Jalview2XML * @param jout * @param infilePath * @param jarEntryName + * @param msg + * additional identifying info to log to the console */ protected void copyFileToJar(JarOutputStream jout, String infilePath, - String jarEntryName) + String jarEntryName, String msg) { try (InputStream is = new FileInputStream(infilePath)) { File file = new File(infilePath); if (file.exists() && jout != null) { - System.out.println("Writing jar entry " + jarEntryName); + System.out.println( + "Writing jar entry " + jarEntryName + " (" + msg + ")"); jout.putNextEntry(new JarEntry(jarEntryName)); copyAll(is, jout); jout.closeEntry(); @@ -2028,29 +2031,6 @@ public class Jalview2XML } /** - * Write the data to a new entry of given name in the output jar file - * - * @param jout - * @param jarEntryName - * @param data - * @throws IOException - */ - protected void writeJarEntry(JarOutputStream jout, String jarEntryName, - byte[] data) throws IOException - { - if (jout != null) - { - jarEntryName = jarEntryName.replace('\\','/'); - System.out.println("Writing jar entry " + jarEntryName); - jout.putNextEntry(new JarEntry(jarEntryName)); - DataOutputStream dout = new DataOutputStream(jout); - dout.write(data, 0, data.length); - dout.flush(); - jout.closeEntry(); - } - } - - /** * Copies input to output, in 4K buffers; handles any data (text or binary) * * @param in @@ -2081,7 +2061,7 @@ public class Jalview2XML * @param viewFrame * @return */ - protected String saveStructureState(AlignmentPanel ap, SequenceI jds, + protected String saveStructureViewer(AlignmentPanel ap, SequenceI jds, Pdbids pdb, PDBEntry entry, List viewIds, String matchedFile, StructureViewerBase viewFrame) { @@ -6198,8 +6178,8 @@ public class Jalview2XML String state = svattrib.getStateData(); // Jalview < 2.9 if (state == null || state.isEmpty()) // Jalview >= 2.9 { - state = readJarEntry(jprovider, - getViewerJarEntryName(svattrib.getViewId())); + String jarEntryName = getViewerJarEntryName(svattrib.getViewId()); + state = readJarEntry(jprovider, jarEntryName); } // TODO or simpler? for each key in oldFiles, // replace key.getPath() in state with oldFiles.get(key).getFilePath() @@ -6246,8 +6226,7 @@ public class Jalview2XML { // add pdb files that should be present in the viewer StructureData filedat = oldFiles.get(id); - rewritten.append(filedat.getFilePath()).append(" \"") - .append(filedat.getFilePath()).append("\""); + rewritten.append(" \"").append(filedat.getFilePath()).append("\""); } rewritten.append(";"); } diff --git a/src/jalview/structures/models/AAStructureBindingModel.java b/src/jalview/structures/models/AAStructureBindingModel.java index dcd6da8..5949847 100644 --- a/src/jalview/structures/models/AAStructureBindingModel.java +++ b/src/jalview/structures/models/AAStructureBindingModel.java @@ -1855,4 +1855,17 @@ public abstract class AAStructureBindingModel } } } + + /** + * Returns the number of structure files in the structure viewer and mapped to + * Jalview. This may be zero if the files are still in the process of loading + * in the viewer. + * + * @return + */ + public int getMappedStructureCount() + { + String[] files = getStructureFiles(); + return files == null ? 0 : files.length; + } }