X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2FJalviewLite.java;h=36a7cffee927eccaaf6fe0b2212ca92b2b561c23;hb=07eba26e68b83d767aac0af12c18db5eafe90db4;hp=7112381006241c2480f18e60be665277b35c9d09;hpb=2e87920be1283b0dfab1e0dd5bf4127493c96241;p=jalview.git diff --git a/src/jalview/bin/JalviewLite.java b/src/jalview/bin/JalviewLite.java index 7112381..36a7cff 100644 --- a/src/jalview/bin/JalviewLite.java +++ b/src/jalview/bin/JalviewLite.java @@ -45,8 +45,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,10 +63,9 @@ import java.awt.event.ActionEvent; 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; @@ -979,8 +980,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); @@ -1790,27 +1791,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; + return path.substring(5); } - else if (inArchive(file)) + + /* + * is it a URL? + */ + if (path.indexOf("://") != -1) { - protocol = AppletFormatAdapter.CLASSLOADER; + protocol = AppletFormatAdapter.URL; + return path; } - else + + /* + * try relative to document root + */ + URL documentBase = getDocumentBase(); + String withDocBase = resolveUrlForLocalOrAbsolute(path, documentBase); + if (HttpUtils.isValidUrl(withDocBase)) + { + if (debug) + { + System.err.println("Prepended document base '" + documentBase + + "' to make: '" + withDocBase + "'"); + } + protocol = AppletFormatAdapter.URL; + return withDocBase; + } + + /* + * 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)) { - file = addProtocol(file); protocol = AppletFormatAdapter.URL; + if (debug) + { + System.err.println("Prepended codebase '" + codeBase + + "' to make: '" + withCodeBase + "'"); + } + return withCodeBase; } - dbgMsg("Protocol identified as '" + protocol + "'"); - return file; + + /* + * try locating by classloader; try this last so files in the directory + * are resolved using document base + */ + if (inArchive(path)) + { + protocol = AppletFormatAdapter.CLASSLOADER; + } + return path; } public LoadingThread(String file, String file2, JalviewLite _applet) @@ -1920,7 +1966,7 @@ public class JalviewLite extends Applet implements { return null; } - String resolvedFile = setProtocolState(fileParam); + String resolvedFile = resolveFileProtocol(fileParam); String format = new IdentifyFile().Identify(resolvedFile, protocol); dbgMsg("File identified as '" + format + "'"); AlignmentI al = null; @@ -2055,8 +2101,8 @@ public class JalviewLite extends Applet implements else { param = st.nextToken(); - Vector tmp = new Vector(); - Vector tmp2 = new Vector(); + List tmp = new ArrayList(); + List tmp2 = new ArrayList(); while (st.hasMoreTokens()) { @@ -2065,39 +2111,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) @@ -2174,7 +2203,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); @@ -2209,7 +2238,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)) @@ -2262,7 +2291,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); } @@ -2331,7 +2360,7 @@ public class JalviewLite extends Applet implements { try { - treeFile = setProtocolState(treeFile); + treeFile = resolveFileProtocol(treeFile); NewickFile fin = new NewickFile(treeFile, protocol); fin.parse(); @@ -2375,95 +2404,10 @@ public class JalviewLite extends Applet implements return rtn; } catch (Exception ex) { - System.out.println("Exception checking resources: " + f + " " - + 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 f - * @return - */ - String addProtocol(final String f) - { - if (f.indexOf("://") != -1) - { - // already has URL format - return f; - } - - /* - * Try relative to document base - */ - URL documentBase = getDocumentBase(); - String url = applet.resolveUrlForLocalOrAbsolute(f, documentBase); - if (urlExists(url)) - { - if (debug) - { - System.err.println("Prepended document base '" + documentBase - + "' to make: '" + url + "'"); - } - return url; - } - - /* - * Try relative to codebase - */ - URL codeBase = getCodeBase(); - url = applet.resolveUrlForLocalOrAbsolute(f, codeBase); - if (urlExists(url)) - { - if (debug) - { - System.err.println("Prepended codebase '" + codeBase - + "' to make: '" + url + "'"); - } - return url; - } - - return f; - } - - /** - * 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; - } } /** @@ -2904,35 +2848,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("/")) { + String codebase = localref.toString(); String localfile = localref.getFile(); - url = codebase.substring(0, codebase.length() - localfile.length()) - + url; + 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("URL: " + localref.toString()); - System.err.println("URL.getFile: " + localref.getFile()); - System.err.println("URL.getPath: " + localref.getPath()); - System.err.println("URL.getQuery: " + localref.getQuery()); - System.err.println("returning " + url); + System.err.println("resolveUrlForLocalOrAbsolute returning " + + resolvedPath); } - return url; + return resolvedPath; } /** @@ -2954,8 +2924,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