< prev index next >
src/java.base/share/classes/jdk/internal/loader/URLClassPath.java
Print this page
rev 51675 : 8207690: Parsing API for classpath and similar path strings
*** 46,63 ****
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.security.cert.Certificate;
import java.util.ArrayDeque;
import java.util.ArrayList;
- import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
--- 46,63 ----
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.security.cert.Certificate;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.NoSuchElementException;
+ import java.util.Objects;
import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
*** 68,77 ****
--- 68,78 ----
import java.util.zip.ZipFile;
import jdk.internal.misc.JavaNetURLAccess;
import jdk.internal.misc.JavaUtilZipFileAccess;
import jdk.internal.misc.SharedSecrets;
+ import jdk.internal.util.PathParser;
import jdk.internal.util.jar.InvalidJarIndexError;
import jdk.internal.util.jar.JarIndex;
import sun.net.util.URLUtil;
import sun.net.www.ParseUtil;
import sun.security.action.GetPropertyAction;
*** 99,109 ****
p = props.getProperty("jdk.net.URLClassPath.disableRestrictedPermissions");
DISABLE_ACC_CHECKING = p != null ? p.equals("true") || p.equals("") : false;
}
/* The original search path of URLs. */
! private final ArrayList<URL> path;
/* The deque of unopened URLs */
private final ArrayDeque<URL> unopenedUrls;
/* The resulting search path of Loaders */
--- 100,110 ----
p = props.getProperty("jdk.net.URLClassPath.disableRestrictedPermissions");
DISABLE_ACC_CHECKING = p != null ? p.equals("true") || p.equals("") : false;
}
/* The original search path of URLs. */
! private final List<URL> path;
/* The deque of unopened URLs */
private final ArrayDeque<URL> unopenedUrls;
/* The resulting search path of Loaders */
*** 162,202 ****
this(urls, null, acc);
}
/**
* Constructs a URLClassPath from a class path string.
*
* @param cp the class path string
* @param skipEmptyElements indicates if empty elements are ignored or
* treated as the current working directory
*
* @apiNote Used to create the application class path.
*/
URLClassPath(String cp, boolean skipEmptyElements) {
! ArrayList<URL> path = new ArrayList<>();
! if (cp != null) {
! // map each element of class path to a file URL
! int off = 0, next;
! do {
! next = cp.indexOf(File.pathSeparator, off);
! String element = (next == -1)
! ? cp.substring(off)
! : cp.substring(off, next);
! if (element.length() > 0 || !skipEmptyElements) {
! URL url = toFileURL(element);
! if (url != null) path.add(url);
! }
! off = next + 1;
! } while (next != -1);
! }
// can't use ArrayDeque#addAll or new ArrayDeque(Collection);
// it's too early in the bootstrap to trigger use of lambdas
! int size = path.size();
! ArrayDeque<URL> unopenedUrls = new ArrayDeque<>(size);
! for (int i = 0; i < size; i++)
! unopenedUrls.add(path.get(i));
this.unopenedUrls = unopenedUrls;
this.path = path;
this.jarHandler = null;
this.acc = null;
--- 163,197 ----
this(urls, null, acc);
}
/**
* Constructs a URLClassPath from a class path string.
+ * Empty path strings are later used to open a directory that defaults
+ * to the current directory.
*
* @param cp the class path string
* @param skipEmptyElements indicates if empty elements are ignored or
* treated as the current working directory
*
* @apiNote Used to create the application class path.
*/
URLClassPath(String cp, boolean skipEmptyElements) {
! String[] strings = PathParser
! .parsePath(Objects.requireNonNullElse(cp, ""),
! skipEmptyElements ? null : "");
! int size = strings.length;
! ArrayList<URL> path = new ArrayList<>(size);
! ArrayDeque<URL> unopenedUrls = new ArrayDeque<>(size);
// can't use ArrayDeque#addAll or new ArrayDeque(Collection);
// it's too early in the bootstrap to trigger use of lambdas
! // Add a URL for each path element to the paths and the unopenedUrls.
! for (String s : strings) {
! URL url = toFileURL(s);
! path.add(url);
! unopenedUrls.add(url);
! }
this.unopenedUrls = unopenedUrls;
this.path = path;
this.jarHandler = null;
this.acc = null;
< prev index next >