From f28f40242c4aed508468c362d14d9421062009e2 Mon Sep 17 00:00:00 2001 From: jprocter Date: Thu, 10 Apr 2008 12:56:32 +0000 Subject: [PATCH] bug fix for Features/Annotations file parameter parsing in JalviewLite reported and fixed by Daron Standley and Reiko Yamashita. Also enhanced Jmol to allow it to be used to view PDB files retrieved via Classloader in the Applet --- src/jalview/appletgui/AppletJmol.java | 26 ++++++- src/jalview/bin/JalviewLite.java | 125 +++++++++++++++++++-------------- src/jalview/io/FileParse.java | 9 +++ 3 files changed, 105 insertions(+), 55 deletions(-) diff --git a/src/jalview/appletgui/AppletJmol.java b/src/jalview/appletgui/AppletJmol.java index 1202c68..82a5911 100644 --- a/src/jalview/appletgui/AppletJmol.java +++ b/src/jalview/appletgui/AppletJmol.java @@ -163,12 +163,34 @@ public class AppletJmol extends EmbmenuFrame if(pdbentry.getFile()!=null) { + // import structure data from pdbentry.getFile based on given protocol if (protocol.equals(AppletFormatAdapter.PASTE)) + { loadInline(pdbentry.getFile()); - else + } else + if (protocol.equals(AppletFormatAdapter.FILE) || protocol.equals(AppletFormatAdapter.URL)){ viewer.openFile(pdbentry.getFile()); + } + else + { + // probably CLASSLOADER based datasource.. + // Try and get a reader on the datasource, and pass that to Jmol + try { + FileParse fparser = new jalview.io.FileParse(protocol, pdbentry.getFile()); + if (!fparser.isValid()) + { + throw new Exception("Invalid datasource. "+fparser.getWarningMessage()); + } + viewer.openReader(pdbentry.getFile(), pdbentry.getId(), fparser.getReader()); + } catch (Exception e) + { + // give up! + System.err.println("Couldn't access pdbentry id="+pdbentry.getId()+" and file="+pdbentry.getFile()+" using protocol="+protocol); + e.printStackTrace(); + } + } } - + jalview.bin.JalviewLite.addFrame(this, "Jmol", 400,400); } diff --git a/src/jalview/bin/JalviewLite.java b/src/jalview/bin/JalviewLite.java index 4d45f8c..4945ec0 100755 --- a/src/jalview/bin/JalviewLite.java +++ b/src/jalview/bin/JalviewLite.java @@ -436,19 +436,34 @@ public class JalviewLite class LoadingThread extends Thread { - String file; + /** + * State variable: File source + */ + String file; + /** + * State variable: protocol for access to file source + */ String protocol; + /** + * State variable: format of file source + */ String format; JalviewLite applet; - - public LoadingThread(String _file, - JalviewLite _applet) + private void dbgMsg(String msg) { if (applet.debug) { - System.err.println("Loading thread started with:\n>>file\n"+_file+">>endfile"); + System.err.println(msg); } - file = _file; + } + /** + * update the protocol state variable for accessing the datasource + * located by file. + * @param file + * @return possibly updated datasource string + */ + public String setProtocolState(String file) + { if (file.startsWith("PASTE")) { file = file.substring(5); @@ -463,15 +478,17 @@ public class JalviewLite file = addProtocol(file); protocol = AppletFormatAdapter.URL; } - if (applet.debug) - { - System.err.println("Protocol identified as '"+protocol+"'"); - } + dbgMsg("Protocol identified as '"+protocol+"'"); + return file; + } + public LoadingThread(String _file, + JalviewLite _applet) + { + dbgMsg("Loading thread started with:\n>>file\n"+_file+">>endfile"); + file = setProtocolState(_file); + format = new jalview.io.IdentifyFile().Identify(file, protocol); - if (applet.debug) - { - System.err.println("File identified as '"+format+"'"); - } + dbgMsg("File identified as '"+format+"'"); applet = _applet; } @@ -482,6 +499,7 @@ public class JalviewLite private void startLoading() { + dbgMsg("Loading started."); Alignment al = null; try { @@ -490,10 +508,12 @@ public class JalviewLite } catch (java.io.IOException ex) { + dbgMsg("File load exception."); ex.printStackTrace(); } if ( (al != null) && (al.getHeight() > 0)) { + dbgMsg("Successfully loaded file."); initialAlignFrame = new AlignFrame(al, applet, file, @@ -518,7 +538,8 @@ public class JalviewLite { try { - if (inArchive(treeFile)) + treeFile = setProtocolState(treeFile); + /*if (inArchive(treeFile)) { protocol = AppletFormatAdapter.CLASSLOADER; } @@ -527,7 +548,7 @@ public class JalviewLite protocol = AppletFormatAdapter.URL; treeFile = addProtocol(treeFile); } - + */ jalview.io.NewickFile fin = new jalview.io.NewickFile(treeFile, protocol); @@ -536,6 +557,9 @@ public class JalviewLite if (fin.getTree() != null) { currentAlignFrame.loadTree(fin, treeFile); + dbgMsg("Successfuly imported tree."); + } else { + dbgMsg("Tree parameter did not resolve to a valid tree."); } } catch (Exception ex) @@ -547,11 +571,8 @@ public class JalviewLite String param = getParameter("features"); if (param != null) { - if (!inArchive(param)) - { - param = addProtocol(param); - } - + param = setProtocolState(param); + currentAlignFrame.parseFeaturesFile(param, protocol); } @@ -564,19 +585,19 @@ public class JalviewLite param = getParameter("annotations"); if (param != null) - { - if (!inArchive(param)) - { - param = addProtocol(param); - } - - new AnnotationFile().readAnnotationFile( + { + param = setProtocolState(param); + + if (new AnnotationFile().readAnnotationFile( currentAlignFrame.viewport.getAlignment(), param, - protocol); - - currentAlignFrame.alignPanel.fontChanged(); - currentAlignFrame.alignPanel.setScrollValues(0, 0); + protocol)) + { + currentAlignFrame.alignPanel.fontChanged(); + currentAlignFrame.alignPanel.setScrollValues(0, 0); + } else { + System.err.println("Annotations were not added from annotation file '"+param+"'"); + } } @@ -585,21 +606,12 @@ public class JalviewLite { try { - if (inArchive(param)) - { - protocol = AppletFormatAdapter.CLASSLOADER; - } - else - { - protocol = AppletFormatAdapter.URL; - param = addProtocol(param); - } - + param = setProtocolState(param); jalview.io.JPredFile predictions = new jalview.io.JPredFile( param, protocol); - new JnetAnnotationMaker().add_annotation(predictions, + JnetAnnotationMaker.add_annotation(predictions, currentAlignFrame.viewport.getAlignment(), - 0, false); // do not add sequence profile from concise output + 0, false); // false==do not add sequence profile from concise output currentAlignFrame.alignPanel.fontChanged(); currentAlignFrame.alignPanel.setScrollValues(0, 0); } @@ -675,15 +687,14 @@ public class JalviewLite tmp2.copyInto(chains); } } - - if (inArchive(param) && !jmolAvailable) - { - protocol = AppletFormatAdapter.CLASSLOADER; - } - else + param = setProtocolState(param); + + if (!jmolAvailable && protocol==AppletFormatAdapter.CLASSLOADER) { - protocol = AppletFormatAdapter.URL; - param = addProtocol(param); + // TODO: pass PDB file in classloader on to Jmol + // This exception preserves the current behaviour where, even if the local pdb file was identified in the class loader + protocol = AppletFormatAdapter.URL; // this is probably NOT CORRECT! + param = addProtocol(param); // } pdb.setFile(param); @@ -753,7 +764,11 @@ public class JalviewLite //Netscape Communicator for instance. try { - return (getClass().getResourceAsStream("/" + file) != null); + boolean rtn = (getClass().getResourceAsStream("/" + file) != null); + if (debug) + { System.err.println("Resource '"+file+"' was "+(rtn ? "" : "not") +" located by classloader."); + } + return rtn; } catch (Exception ex) { @@ -767,6 +782,10 @@ public class JalviewLite if (file.indexOf("://") == -1) { file = getCodeBase() + file; + if (debug) + { + System.err.println("Prepended codebase for resource: '"+file+"'"); + } } return file; diff --git a/src/jalview/io/FileParse.java b/src/jalview/io/FileParse.java index 4c69ce0..04a673c 100755 --- a/src/jalview/io/FileParse.java +++ b/src/jalview/io/FileParse.java @@ -287,4 +287,13 @@ public class FileParse return "From Paste + ("+index+")"; } } + + public Reader getReader() throws IOException + { + if (dataIn!=null && dataIn.ready()) + { + return dataIn; + } + return null; + } } -- 1.7.10.2