# HG changeset patch # User hannesw # Date 1467119871 -7200 # Node ID a049c96353aedce1dbb2a13e0c7594cfac3a8ad4 # Parent 3aa52182b3ad7c5b3a61cf05a59dd07e4c5884e5 8160435: Source.baseURL is slow for URLs with unregistered protocol Reviewed-by: sundar diff -r 3aa52182b3ad -r a049c96353ae nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Source.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Source.java Wed Jul 05 21:53:18 2017 +0200 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Source.java Tue Jun 28 15:17:51 2016 +0200 @@ -36,6 +36,7 @@ import java.io.Reader; import java.lang.ref.WeakReference; import java.net.MalformedURLException; +import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; @@ -75,8 +76,8 @@ private final String name; /** - * Base directory the File or base part of the URL. Used to implement __DIR__. - * Used to load scripts relative to the 'directory' or 'base' URL of current script. + * Base path or URL of this source. Used to implement __DIR__, which can be + * used to load scripts relative to the location of the current script. * This will be null when it can't be computed. */ private final String base; @@ -875,31 +876,25 @@ } /** - * Get the base url. This is currently used for testing only + * Returns the base directory or URL for the given URL. Used to implement __DIR__. * @param url a URL - * @return base URL for url + * @return base path or URL, or null if argument is not a hierarchical URL */ public static String baseURL(final URL url) { - if (url.getProtocol().equals("file")) { - try { - final Path path = Paths.get(url.toURI()); + try { + final URI uri = url.toURI(); + + if (uri.getScheme().equals("file")) { + final Path path = Paths.get(uri); final Path parent = path.getParent(); return (parent != null) ? (parent + File.separator) : null; - } catch (final SecurityException | URISyntaxException | IOError e) { + } + if (uri.isOpaque() || uri.getPath() == null || uri.getPath().isEmpty()) { return null; } - } + return uri.resolve("").toString(); - // FIXME: is there a better way to find 'base' URL of a given URL? - String path = url.getPath(); - if (path.isEmpty()) { - return null; - } - path = path.substring(0, path.lastIndexOf('/') + 1); - final int port = url.getPort(); - try { - return new URL(url.getProtocol(), url.getHost(), port, path).toString(); - } catch (final MalformedURLException e) { + } catch (final SecurityException | URISyntaxException | IOError e) { return null; } }