8160435: Source.baseURL is slow for URLs with unregistered protocol
authorhannesw
Tue, 28 Jun 2016 15:17:51 +0200
changeset 39351 a049c96353ae
parent 39184 3aa52182b3ad
child 39352 be8b15422667
8160435: Source.baseURL is slow for URLs with unregistered protocol Reviewed-by: sundar
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;
         }
     }