X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2FJalviewLite.java;h=0f3feb261947df17fbc1011f194f0da2e04b04fc;hb=230fac58c5afe1843bf7177834fe1bd1d7e6f9d5;hp=c0a8d730e02c136746904b77b04f89ce03990cb8;hpb=be32c14cd8e48fe0a207cd7030cb9cd46f894678;p=jalview.git diff --git a/src/jalview/bin/JalviewLite.java b/src/jalview/bin/JalviewLite.java index c0a8d73..0f3feb2 100644 --- a/src/jalview/bin/JalviewLite.java +++ b/src/jalview/bin/JalviewLite.java @@ -20,6 +20,7 @@ */ package jalview.bin; +import jalview.analysis.AlignmentUtils; import jalview.api.StructureSelectionManagerProvider; import jalview.appletgui.AlignFrame; import jalview.appletgui.AlignViewport; @@ -36,6 +37,8 @@ import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.io.AnnotationFile; import jalview.io.AppletFormatAdapter; +import jalview.io.DataSourceType; +import jalview.io.FileFormatI; import jalview.io.FileParse; import jalview.io.IdentifyFile; import jalview.io.JPredFile; @@ -44,8 +47,10 @@ import jalview.io.NewickFile; import jalview.javascript.JSFunctionExec; import jalview.javascript.JalviewLiteJsApi; import jalview.javascript.JsCallBack; +import jalview.javascript.MouseOverStructureListener; import jalview.structure.SelectionListener; import jalview.structure.StructureSelectionManager; +import jalview.util.HttpUtils; import jalview.util.MessageManager; import java.applet.Applet; @@ -61,15 +66,14 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; +import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.StringTokenizer; import java.util.Vector; -import netscape.javascript.JSException; import netscape.javascript.JSObject; /** @@ -92,13 +96,14 @@ public class JalviewLite extends Applet implements } // ///////////////////////////////////////// - // The following public methods maybe called + // The following public methods may be called // externally, eg via javascript in HTML page /* * (non-Javadoc) * * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences() */ + @Override public String getSelectedSequences() { return getSelectedSequencesFrom(getDefaultTargetFrame()); @@ -109,6 +114,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences(java.lang.String) */ + @Override public String getSelectedSequences(String sep) { return getSelectedSequencesFrom(getDefaultTargetFrame(), sep); @@ -121,6 +127,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui * .AlignFrame) */ + @Override public String getSelectedSequencesFrom(AlignFrame alf) { return getSelectedSequencesFrom(alf, separator); // ""+0x00AC); @@ -133,6 +140,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui * .AlignFrame, java.lang.String) */ + @Override public String getSelectedSequencesFrom(AlignFrame alf, String sep) { StringBuffer result = new StringBuffer(""); @@ -161,6 +169,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#highlight(java.lang.String, * java.lang.String, java.lang.String) */ + @Override public void highlight(String sequenceId, String position, String alignedPosition) { @@ -174,6 +183,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#highlightIn(jalview.appletgui.AlignFrame, * java.lang.String, java.lang.String, java.lang.String) */ + @Override public void highlightIn(final AlignFrame alf, final String sequenceId, final String position, final String alignedPosition) { @@ -230,6 +240,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#select(java.lang.String, * java.lang.String) */ + @Override public void select(String sequenceIds, String columns) { selectIn(getDefaultTargetFrame(), sequenceIds, columns, separator); @@ -241,6 +252,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#select(java.lang.String, * java.lang.String, java.lang.String) */ + @Override public void select(String sequenceIds, String columns, String sep) { selectIn(getDefaultTargetFrame(), sequenceIds, columns, sep); @@ -252,6 +264,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#selectIn(jalview.appletgui.AlignFrame, * java.lang.String, java.lang.String) */ + @Override public void selectIn(AlignFrame alf, String sequenceIds, String columns) { selectIn(alf, sequenceIds, columns, separator); @@ -263,6 +276,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#selectIn(jalview.appletgui.AlignFrame, * java.lang.String, java.lang.String, java.lang.String) */ + @Override public void selectIn(final AlignFrame alf, String sequenceIds, String columns, String sep) { @@ -458,6 +472,9 @@ public class JalviewLite extends Applet implements if (csel != null) { List cs = csel.getSelected(); + // note - the following actually clears cs as well, since + // csel.getSelected returns a reference. Need to check if we need to + // have a concurrentModification exception thrown here csel.clear(); for (Integer selectedCol : cs) { @@ -485,6 +502,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getSelectedSequencesAsAlignment(java.lang. * String, java.lang.String) */ + @Override public String getSelectedSequencesAsAlignment(String format, String suffix) { return getSelectedSequencesAsAlignmentFrom(getDefaultTargetFrame(), @@ -498,8 +516,9 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getSelectedSequencesAsAlignmentFrom(jalview * .appletgui.AlignFrame, java.lang.String, java.lang.String) */ + @Override public String getSelectedSequencesAsAlignmentFrom(AlignFrame alf, - String format, String suffix) + FileFormatI format, String suffix) { try { @@ -527,6 +546,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getAlignmentOrder() */ + @Override public String getAlignmentOrder() { return getAlignmentOrderFrom(getDefaultTargetFrame()); @@ -539,6 +559,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getAlignmentOrderFrom(jalview.appletgui.AlignFrame * ) */ + @Override public String getAlignmentOrderFrom(AlignFrame alf) { return getAlignmentOrderFrom(alf, separator); @@ -551,6 +572,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getAlignmentOrderFrom(jalview.appletgui.AlignFrame * , java.lang.String) */ + @Override public String getAlignmentOrderFrom(AlignFrame alf, String sep) { AlignmentI alorder = alf.getAlignViewport().getAlignment(); @@ -568,6 +590,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#orderBy(java.lang.String, * java.lang.String) */ + @Override public String orderBy(String order, String undoName) { return orderBy(order, undoName, separator); @@ -579,6 +602,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#orderBy(java.lang.String, * java.lang.String, java.lang.String) */ + @Override public String orderBy(String order, String undoName, String sep) { return orderAlignmentBy(getDefaultTargetFrame(), order, undoName, sep); @@ -591,6 +615,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#orderAlignmentBy(jalview.appletgui.AlignFrame, * java.lang.String, java.lang.String, java.lang.String) */ + @Override public String orderAlignmentBy(AlignFrame alf, String order, String undoName, String sep) { @@ -647,6 +672,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getAlignment(java.lang.String) */ + @Override public String getAlignment(String format) { return getAlignmentFrom(getDefaultTargetFrame(), format, TRUE); @@ -659,6 +685,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getAlignmentFrom(jalview.appletgui.AlignFrame, * java.lang.String) */ + @Override public String getAlignmentFrom(AlignFrame alf, String format) { return getAlignmentFrom(alf, format, TRUE); @@ -670,6 +697,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#getAlignment(java.lang.String, * java.lang.String) */ + @Override public String getAlignment(String format, String suffix) { return getAlignmentFrom(getDefaultTargetFrame(), format, suffix); @@ -682,6 +710,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getAlignmentFrom(jalview.appletgui.AlignFrame, * java.lang.String, java.lang.String) */ + @Override public String getAlignmentFrom(AlignFrame alf, String format, String suffix) { @@ -704,6 +733,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#loadAnnotation(java.lang.String) */ + @Override public void loadAnnotation(String annotation) { loadAnnotationFrom(getDefaultTargetFrame(), annotation); @@ -716,17 +746,18 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#loadAnnotationFrom(jalview.appletgui.AlignFrame * , java.lang.String) */ + @Override public void loadAnnotationFrom(AlignFrame alf, String annotation) { if (new AnnotationFile().annotateAlignmentView(alf.getAlignViewport(), - annotation, AppletFormatAdapter.PASTE)) + annotation, DataSourceType.PASTE)) { alf.alignPanel.fontChanged(); alf.alignPanel.setScrollValues(0, 0); } else { - alf.parseFeaturesFile(annotation, AppletFormatAdapter.PASTE); + alf.parseFeaturesFile(annotation, DataSourceType.PASTE); } } @@ -735,6 +766,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#loadAnnotation(java.lang.String) */ + @Override public void loadFeatures(String features, boolean autoenabledisplay) { loadFeaturesFrom(getDefaultTargetFrame(), features, autoenabledisplay); @@ -747,10 +779,11 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#loadAnnotationFrom(jalview.appletgui.AlignFrame * , java.lang.String) */ + @Override public boolean loadFeaturesFrom(AlignFrame alf, String features, boolean autoenabledisplay) { - return alf.parseFeaturesFile(features, AppletFormatAdapter.PASTE, + return alf.parseFeaturesFile(features, DataSourceType.PASTE, autoenabledisplay); } @@ -759,6 +792,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getFeatures(java.lang.String) */ + @Override public String getFeatures(String format) { return getFeaturesFrom(getDefaultTargetFrame(), format); @@ -771,6 +805,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getFeaturesFrom(jalview.appletgui.AlignFrame, * java.lang.String) */ + @Override public String getFeaturesFrom(AlignFrame alf, String format) { return alf.outputFeatures(false, format); @@ -781,6 +816,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getAnnotation() */ + @Override public String getAnnotation() { return getAnnotationFrom(getDefaultTargetFrame()); @@ -793,6 +829,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getAnnotationFrom(jalview.appletgui.AlignFrame * ) */ + @Override public String getAnnotationFrom(AlignFrame alf) { return alf.outputAnnotations(false); @@ -803,6 +840,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#newView() */ + @Override public AlignFrame newView() { return newViewFrom(getDefaultTargetFrame()); @@ -813,6 +851,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#newView(java.lang.String) */ + @Override public AlignFrame newView(String name) { return newViewFrom(getDefaultTargetFrame(), name); @@ -823,6 +862,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#newViewFrom(jalview.appletgui.AlignFrame) */ + @Override public AlignFrame newViewFrom(AlignFrame alf) { return alf.newView(null); @@ -834,6 +874,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#newViewFrom(jalview.appletgui.AlignFrame, * java.lang.String) */ + @Override public AlignFrame newViewFrom(AlignFrame alf, String name) { return alf.newView(name); @@ -845,21 +886,22 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#loadAlignment(java.lang.String, * java.lang.String) */ + @Override public AlignFrame loadAlignment(String text, String title) { - Alignment al = null; + AlignmentI al = null; - String format = new IdentifyFile().Identify(text, - AppletFormatAdapter.PASTE); try { - al = new AppletFormatAdapter().readFile(text, - AppletFormatAdapter.PASTE, format); + FileFormatI format = new IdentifyFile().identify(text, + DataSourceType.PASTE); + al = new AppletFormatAdapter().readFile(text, DataSourceType.PASTE, + format); if (al.getHeight() > 0) { return new AlignFrame(al, this, title, false); } - } catch (java.io.IOException ex) + } catch (IOException ex) { ex.printStackTrace(); } @@ -871,6 +913,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#setMouseoverListener(java.lang.String) */ + @Override public void setMouseoverListener(String listener) { setMouseoverListener(currentAlignFrame, listener); @@ -885,6 +928,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#setMouseoverListener(jalview.appletgui.AlignFrame * , java.lang.String) */ + @Override public void setMouseoverListener(AlignFrame af, String listener) { if (listener != null) @@ -917,6 +961,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#setSelectionListener(java.lang.String) */ + @Override public void setSelectionListener(String listener) { setSelectionListener(null, listener); @@ -929,6 +974,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#setSelectionListener(jalview.appletgui.AlignFrame * , java.lang.String) */ + @Override public void setSelectionListener(AlignFrame af, String listener) { if (listener != null) @@ -956,12 +1002,18 @@ public class JalviewLite extends Applet implements } } - /* - * (non-Javadoc) - * + /** + * Callable from javascript to register a javascript function to pass events + * to a structure viewer. + * + * @param listener + * the name of a javascript function + * @param modelSet + * a token separated list of PDB file names listened for * @see jalview.bin.JalviewLiteJsApi#setStructureListener(java.lang.String, - * java.lang.String) + * java.lang.String) */ + @Override public void setStructureListener(String listener, String modelSet) { if (listener != null) @@ -974,8 +1026,8 @@ public class JalviewLite extends Applet implements return; } } - jalview.javascript.MouseOverStructureListener mol = new jalview.javascript.MouseOverStructureListener( - this, listener, separatorListToArray(modelSet)); + MouseOverStructureListener mol = new MouseOverStructureListener(this, + listener, separatorListToArray(modelSet)); javascriptListeners.addElement(mol); StructureSelectionManager.getStructureSelectionManager(this) .addStructureViewerListener(mol); @@ -995,6 +1047,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#removeJavascriptListener(jalview.appletgui * .AlignFrame, java.lang.String) */ + @Override public void removeJavascriptListener(AlignFrame af, String listener) { if (listener != null) @@ -1044,12 +1097,14 @@ public class JalviewLite extends Applet implements } } + @Override public void stop() { System.err.println("Applet " + getName() + " stop()."); tidyUp(); } + @Override public void destroy() { System.err.println("Applet " + getName() + " destroy()."); @@ -1106,6 +1161,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#mouseOverStructure(java.lang.String, * java.lang.String, java.lang.String) */ + @Override public void mouseOverStructure(final String pdbResNum, final String chain, final String pdbfile) { @@ -1143,6 +1199,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#scrollViewToIn(jalview.appletgui.AlignFrame, * java.lang.String, java.lang.String) */ + @Override public void scrollViewToIn(final AlignFrame alf, final String topRow, final String leftHandColumn) { @@ -1242,7 +1299,7 @@ public class JalviewLite extends Applet implements String file = "No file"; - String file2 = "No file"; + String file2 = null; Button launcher = new Button( MessageManager.getString("label.start_jalview")); @@ -1289,7 +1346,7 @@ public class JalviewLite extends Applet implements { builddate = "unknown"; version = "test"; - installation = "Webstart"; + installation = "applet"; java.net.URL url = JalviewLite.class .getResource("/.build_properties"); if (url != null) @@ -1345,9 +1402,10 @@ public class JalviewLite extends Applet implements /** * init method for Jalview Applet */ + @Override public void init() { - // remove any handlers that might be hanging around from an earlier instance + debug = TRUE.equalsIgnoreCase(getParameter("debug")); try { if (debug) @@ -1370,23 +1428,17 @@ public class JalviewLite extends Applet implements ex.printStackTrace(); } } - /** - * turn on extra applet debugging - */ - debug = TRUE.equalsIgnoreCase(getParameter("debug")); + if (debug) { - System.err.println("JalviewLite Version " + getVersion()); System.err.println("Build Date : " + getBuildDate()); System.err.println("Installation : " + getInstallation()); - } String externalsviewer = getParameter("externalstructureviewer"); if (externalsviewer != null) { - useXtrnalSviewer = externalsviewer.trim().toLowerCase() - .equals(TRUE); + useXtrnalSviewer = externalsviewer.trim().toLowerCase().equals(TRUE); } /** * if true disable the check for jmol @@ -1412,7 +1464,9 @@ public class JalviewLite extends Applet implements } else { - throw new Error(MessageManager.getString("error.invalid_separator_parameter")); + throw new Error( + MessageManager + .getString("error.invalid_separator_parameter")); } } int r = 255; @@ -1459,7 +1513,10 @@ public class JalviewLite extends Applet implements file = data.toString(); } } - file2 = getParameter("file2"); + if (getDefaultParameter("enableSplitFrame", true)) + { + file2 = getParameter("file2"); + } embedded = TRUE.equalsIgnoreCase(getParameter("embedded")); if (embedded) @@ -1482,6 +1539,7 @@ public class JalviewLite extends Applet implements add(launcher); launcher.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { LoadingThread loader = new LoadingThread(file, file2, @@ -1530,7 +1588,7 @@ public class JalviewLite extends Applet implements { notFailed = true; } - } catch (JSException jsex) + } catch (Exception jsex) { System.err.println("Attempt " + tries + " to access LiveConnect javascript failed."); @@ -1604,6 +1662,7 @@ public class JalviewLite extends Applet implements frame.setTitle(title); frame.addWindowListener(new WindowAdapter() { + @Override public void windowClosing(WindowEvent e) { if (frame instanceof AlignFrame) @@ -1628,6 +1687,7 @@ public class JalviewLite extends Applet implements frame.dispose(); } + @Override public void windowActivated(WindowEvent e) { if (frame instanceof AlignFrame) @@ -1665,6 +1725,7 @@ public class JalviewLite extends Applet implements * @param g * graphics context */ + @Override public void paint(Graphics g) { if (!fileFound) @@ -1716,6 +1777,7 @@ public class JalviewLite extends Applet implements { private boolean running = false; + @Override public void run() { if (running || checkedForJmol) @@ -1765,7 +1827,7 @@ public class JalviewLite extends Applet implements /** * State variable: protocol for access to file source */ - String protocol; + DataSourceType protocol; String _file; // alignment file or URL spec @@ -1785,27 +1847,72 @@ public class JalviewLite extends Applet implements * update the protocol state variable for accessing the datasource located * by file. * - * @param file + * @param path * @return possibly updated datasource string */ - public String setProtocolState(String file) + public String resolveFileProtocol(String path) { - if (file.startsWith("PASTE")) + /* + * is it paste data? + */ + if (path.startsWith("PASTE")) { - file = file.substring(5); - protocol = AppletFormatAdapter.PASTE; + protocol = DataSourceType.PASTE; + return path.substring(5); } - else if (inArchive(file)) + + /* + * is it a URL? + */ + if (path.indexOf("://") != -1) { - protocol = AppletFormatAdapter.CLASSLOADER; + protocol = DataSourceType.URL; + return path; } - else + + /* + * try relative to document root + */ + URL documentBase = getDocumentBase(); + String withDocBase = resolveUrlForLocalOrAbsolute(path, documentBase); + if (HttpUtils.isValidUrl(withDocBase)) { - file = addProtocol(file); - protocol = AppletFormatAdapter.URL; + if (debug) + { + System.err.println("Prepended document base '" + documentBase + + "' to make: '" + withDocBase + "'"); + } + protocol = DataSourceType.URL; + return withDocBase; } - dbgMsg("Protocol identified as '" + protocol + "'"); - return file; + + /* + * try relative to codebase (if different to document base) + */ + URL codeBase = getCodeBase(); + String withCodeBase = applet.resolveUrlForLocalOrAbsolute(path, + codeBase); + if (!withCodeBase.equals(withDocBase) + && HttpUtils.isValidUrl(withCodeBase)) + { + protocol = DataSourceType.URL; + if (debug) + { + System.err.println("Prepended codebase '" + codeBase + + "' to make: '" + withCodeBase + "'"); + } + return withCodeBase; + } + + /* + * try locating by classloader; try this last so files in the directory + * are resolved using document base + */ + if (inArchive(path)) + { + protocol = DataSourceType.CLASSLOADER; + } + return path; } public LoadingThread(String file, String file2, JalviewLite _applet) @@ -1815,6 +1922,7 @@ public class JalviewLite extends Applet implements applet = _applet; } + @Override public void run() { LoadJmolThread jmolchecker = new LoadJmolThread(); @@ -1877,15 +1985,30 @@ public class JalviewLite extends Applet implements */ public void addToDisplay(AlignFrame af, AlignFrame af2) { - if (af2 == null) - { - af.addToDisplay(embedded); - } - else + if (af2 != null) { - SplitFrame sf = new SplitFrame(af, af2); - sf.addToDisplay(embedded, JalviewLite.this); + AlignmentI al1 = af.viewport.getAlignment(); + AlignmentI al2 = af2.viewport.getAlignment(); + AlignmentI cdna = al1.isNucleotide() ? al1 : al2; + AlignmentI prot = al1.isNucleotide() ? al2 : al1; + if (AlignmentUtils.mapProteinAlignmentToCdna(prot, cdna)) + { + al2.alignAs(al1); + SplitFrame sf = new SplitFrame(af, af2); + sf.addToDisplay(embedded, JalviewLite.this); + return; + } + else + { + String msg = "Could not map any sequence in " + af2.getTitle() + + " as " + + (al1.isNucleotide() ? "protein product" : "cDNA") + + " for " + af.getTitle(); + System.err.println(msg); + } } + + af.addToDisplay(embedded); } /** @@ -1900,13 +2023,15 @@ public class JalviewLite extends Applet implements { return null; } - String resolvedFile = setProtocolState(fileParam); - String format = new IdentifyFile().Identify(resolvedFile, protocol); - dbgMsg("File identified as '" + format + "'"); + String resolvedFile = resolveFileProtocol(fileParam); AlignmentI al = null; try { - al = new AppletFormatAdapter().readFile(resolvedFile, protocol, format); + FileFormatI format = new IdentifyFile().identify(resolvedFile, + protocol); + dbgMsg("File identified as '" + format + "'"); + al = new AppletFormatAdapter().readFile(resolvedFile, protocol, + format); if ((al != null) && (al.getHeight() > 0)) { dbgMsg("Successfully loaded file."); @@ -1921,16 +2046,16 @@ public class JalviewLite extends Applet implements // update the focus. currentAlignFrame = newAlignFrame; - if (protocol == AppletFormatAdapter.PASTE) + if (protocol == DataSourceType.PASTE) { newAlignFrame.setTitle(MessageManager.formatMessage( - "label.sequences_from", new Object[] - { applet.getDocumentBase().toString() })); + "label.sequences_from", new Object[] { applet + .getDocumentBase().toString() })); } newAlignFrame.statusBar.setText(MessageManager.formatMessage( - "label.successfully_loaded_file", new Object[] - { resolvedFile })); + "label.successfully_loaded_file", + new Object[] { resolvedFile })); return newAlignFrame; } @@ -2025,18 +2150,17 @@ public class JalviewLite extends Applet implements String sequence = applet.getParameter("PDBSEQ"); if (sequence != null) { - seqs = new SequenceI[] - { matcher == null ? (Sequence) alignFrame.getAlignViewport() - .getAlignment().findName(sequence) : matcher - .findIdMatch(sequence) }; + seqs = new SequenceI[] { matcher == null ? (Sequence) alignFrame + .getAlignViewport().getAlignment().findName(sequence) + : matcher.findIdMatch(sequence) }; } } else { param = st.nextToken(); - Vector tmp = new Vector(); - Vector tmp2 = new Vector(); + List tmp = new ArrayList(); + List tmp2 = new ArrayList(); while (st.hasMoreTokens()) { @@ -2045,39 +2169,22 @@ public class JalviewLite extends Applet implements if (st2.countTokens() > 1) { // This is the chain - tmp2.addElement(st2.nextToken()); + tmp2.add(st2.nextToken()); seqstring = st2.nextToken(); } - tmp.addElement(matcher == null ? (Sequence) alignFrame + tmp.add(matcher == null ? (Sequence) alignFrame .getAlignViewport().getAlignment() .findName(seqstring) : matcher.findIdMatch(seqstring)); } - seqs = new SequenceI[tmp.size()]; - tmp.copyInto(seqs); + seqs = tmp.toArray(new SequenceI[tmp.size()]); if (tmp2.size() == tmp.size()) { - chains = new String[tmp2.size()]; - tmp2.copyInto(chains); + chains = tmp2.toArray(new String[tmp2.size()]); } } - param = setProtocolState(param); - - if (// !jmolAvailable - // && - protocol == AppletFormatAdapter.CLASSLOADER && !useXtrnalSviewer) - { - // Re: JAL-357 : the bug isn't a problem if we are using an - // external viewer! - // TODO: verify this Re: - // https://mantis.lifesci.dundee.ac.uk/view.php?id=36605 - // 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); // - } - + param = resolveFileProtocol(param); + // TODO check JAL-357 for files in a jar (CLASSLOADER) pdb.setFile(param); if (seqs != null) @@ -2110,8 +2217,7 @@ public class JalviewLite extends Applet implements } else { - pdbs.addElement(new Object[] - { pdb, seqs, chains, new String(protocol) }); + pdbs.addElement(new Object[] { pdb, seqs, chains, protocol }); } } } @@ -2154,7 +2260,7 @@ public class JalviewLite extends Applet implements { try { - param = setProtocolState(param); + param = resolveFileProtocol(param); JPredFile predictions = new JPredFile(param, protocol); JnetAnnotationMaker.add_annotation(predictions, alignFrame.viewport.getAlignment(), 0, false); @@ -2189,7 +2295,7 @@ public class JalviewLite extends Applet implements String param = applet.getParameter("annotations"); if (param != null) { - param = setProtocolState(param); + param = resolveFileProtocol(param); if (new AnnotationFile().annotateAlignmentView(alignFrame.viewport, param, protocol)) @@ -2242,7 +2348,7 @@ public class JalviewLite extends Applet implements param = applet.getParameter("features"); if (param != null) { - param = setProtocolState(param); + param = resolveFileProtocol(param); result = alignFrame.parseFeaturesFile(param, protocol); } @@ -2311,7 +2417,7 @@ public class JalviewLite extends Applet implements { try { - treeFile = setProtocolState(treeFile); + treeFile = resolveFileProtocol(treeFile); NewickFile fin = new NewickFile(treeFile, protocol); fin.parse(); @@ -2336,113 +2442,29 @@ public class JalviewLite extends Applet implements /** * Discovers whether the given file is in the Applet Archive * - * @param file + * @param f * String * @return boolean */ - boolean inArchive(String file) + boolean inArchive(String f) { // This might throw a security exception in certain browsers // Netscape Communicator for instance. try { - boolean rtn = (getClass().getResourceAsStream("/" + file) != null); + boolean rtn = (getClass().getResourceAsStream("/" + f) != null); if (debug) { - System.err.println("Resource '" + file + "' was " - + (rtn ? "" : "not") + " located by classloader."); + System.err.println("Resource '" + f + "' was " + + (rtn ? "" : "not ") + "located by classloader."); } return rtn; } catch (Exception ex) { - System.out.println("Exception checking resources: " + file + " " - + ex); + System.out.println("Exception checking resources: " + f + " " + ex); return false; } } - - /** - * If the file is not already in URL format, tries to locate it by resolving - * as a URL. - * - * @param file - * @return - */ - String addProtocol(final String file) - { - if (file.indexOf("://") == -1) - { - /* - * Try relative to document base - */ - String url = applet.resolveUrlForLocalOrAbsolute(file, - getDocumentBase()); - if (urlExists(url)) - { - if (debug) - { - System.err.println("Prepended document base for resource: '" - + file + "'"); - } - return url; - } - - /* - * Try relative to codebase - */ - url = applet.resolveUrlForLocalOrAbsolute(file, getCodeBase()); - if (urlExists(url)) - { - if (debug) - { - System.err.println("Prepended codebase for resource: '" + file - + "'"); - } - return url; - } - } - - /* - * Not resolved, leave unchanged - */ - return file; - } - - /** - * Returns true if an input stream can be opened on the specified URL, else - * false. - * - * @param url - * @return - */ - private boolean urlExists(String url) - { - InputStream is = null; - try - { - is = new URL(url).openStream(); - if (is != null) - { - return true; - } - } catch (Exception x) - { - // ignore - } finally - { - if (is != null) - { - try - { - is.close(); - } catch (IOException e) - { - // ignore - } - } - } - return false; - } } /** @@ -2495,9 +2517,9 @@ public class JalviewLite extends Applet implements * @param separator * @return elements separated by separator */ - public String[] separatorListToArray(String list, String separator) + public static String[] separatorListToArray(String list, String separator) { - // note separator local variable intentionally masks object field + // TODO use StringUtils version (slightly different...) int seplen = separator.length(); if (list == null || list.equals("") || list.equals(separator)) { @@ -2563,8 +2585,9 @@ public class JalviewLite extends Applet implements * @param separator * @return concatenated string */ - public String arrayToSeparatorList(String[] list, String separator) + public static String arrayToSeparatorList(String[] list, String separator) { + // TODO use StringUtils version StringBuffer v = new StringBuffer(); if (list != null && list.length > 0) { @@ -2600,6 +2623,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getFeatureGroups() */ + @Override public String getFeatureGroups() { String lst = arrayToSeparatorList(getDefaultTargetFrame() @@ -2614,6 +2638,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getFeatureGroupsOn(jalview.appletgui.AlignFrame * ) */ + @Override public String getFeatureGroupsOn(AlignFrame alf) { String lst = arrayToSeparatorList(alf.getFeatureGroups()); @@ -2625,6 +2650,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getFeatureGroupsOfState(boolean) */ + @Override public String getFeatureGroupsOfState(boolean visible) { return arrayToSeparatorList(getDefaultTargetFrame() @@ -2638,6 +2664,7 @@ public class JalviewLite extends Applet implements * jalview.bin.JalviewLiteJsApi#getFeatureGroupsOfStateOn(jalview.appletgui * .AlignFrame, boolean) */ + @Override public String getFeatureGroupsOfStateOn(AlignFrame alf, boolean visible) { return arrayToSeparatorList(alf.getFeatureGroupsOfState(visible)); @@ -2649,6 +2676,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#setFeatureGroupStateOn(jalview.appletgui. * AlignFrame, java.lang.String, boolean) */ + @Override public void setFeatureGroupStateOn(final AlignFrame alf, final String groups, boolean state) { @@ -2670,6 +2698,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#setFeatureGroupState(java.lang.String, * boolean) */ + @Override public void setFeatureGroupState(String groups, boolean state) { setFeatureGroupStateOn(getDefaultTargetFrame(), groups, state); @@ -2680,6 +2709,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#getSeparator() */ + @Override public String getSeparator() { return separator; @@ -2690,6 +2720,7 @@ public class JalviewLite extends Applet implements * * @see jalview.bin.JalviewLiteJsApi#setSeparator(java.lang.String) */ + @Override public void setSeparator(String separator) { if (separator == null || separator.length() < 1) @@ -2721,7 +2752,7 @@ public class JalviewLite extends Applet implements { return def; } - if (stn.toLowerCase().equals(TRUE)) + if (TRUE.equalsIgnoreCase(stn)) { return true; } @@ -2734,6 +2765,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#addPdbFile(jalview.appletgui.AlignFrame, * java.lang.String, java.lang.String, java.lang.String) */ + @Override public boolean addPdbFile(AlignFrame alFrame, String sequenceId, String pdbEntryString, String pdbFile) { @@ -2750,6 +2782,7 @@ public class JalviewLite extends Applet implements return alignPdbStructures; } + @Override public void start() { // callInitCallback(); @@ -2783,6 +2816,7 @@ public class JalviewLite extends Applet implements * @see jalview.bin.JalviewLiteJsApi#getJsMessage(java.lang.String, * java.lang.String) */ + @Override public String getJsMessage(String messageclass, String viewId) { Hashtable msgset = jsmessages.get(messageclass); @@ -2882,27 +2916,61 @@ public class JalviewLite extends Applet implements * form a complete URL given a path to a resource and a reference location on * the same server * - * @param url + * @param targetPath * - an absolute path on the same server as localref or a document * located relative to localref * @param localref * - a URL on the same server as url * @return a complete URL for the resource located by url */ - private String resolveUrlForLocalOrAbsolute(String url, URL localref) + private String resolveUrlForLocalOrAbsolute(String targetPath, + URL localref) { - String codebase = localref.toString(); - if (url.indexOf("/") == 0) + String resolvedPath = ""; + if (targetPath.startsWith("/")) { - url = codebase.substring(0, codebase.length() - - localref.getFile().length()) - + url; + String codebase = localref.toString(); + String localfile = localref.getFile(); + resolvedPath = codebase.substring(0, + codebase.length() - localfile.length()) + + targetPath; + return resolvedPath; + } + + /* + * get URL path and strip off any trailing file e.g. + * www.jalview.org/examples/index.html#applets?a=b is trimmed to + * www.jalview.org/examples/ + */ + String urlPath = localref.toString(); + String directoryPath = urlPath; + int lastSeparator = directoryPath.lastIndexOf("/"); + if (lastSeparator > 0) + { + directoryPath = directoryPath.substring(0, lastSeparator + 1); + } + + if (targetPath.startsWith("/")) + { + /* + * construct absolute URL to a file on the server - this is not allowed? + */ + // String localfile = localref.getFile(); + // resolvedPath = urlPath.substring(0, + // urlPath.length() - localfile.length()) + // + targetPath; + resolvedPath = directoryPath + targetPath.substring(1); } else { - url = localref + url; + resolvedPath = directoryPath + targetPath; + } + if (debug) + { + System.err.println("resolveUrlForLocalOrAbsolute returning " + + resolvedPath); } - return url; + return resolvedPath; } /** @@ -2924,8 +2992,8 @@ public class JalviewLite extends Applet implements URL prepend; url = resolveUrlForLocalOrAbsolute( url, - prepend = getDefaultParameter("resolvetocodebase", false) ? getDocumentBase() - : getCodeBase()); + prepend = getDefaultParameter("resolvetocodebase", false) ? getCodeBase() + : getDocumentBase()); if (debug) { System.err