< prev index next >

src/java.base/share/classes/jdk/internal/module/Resources.java

Print this page

        

*** 20,83 **** * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ ! package jdk.internal.loader; import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; ! ! import jdk.internal.module.Checks; /** ! * Helper class for Class#getResource, Module#getResourceAsStream, and other ! * methods that locate a resource in a module. */ ! public final class ResourceHelper { ! private ResourceHelper() { } /** ! * Returns the <em>package name</em> for a resource or the empty package if ! * the resource name does not contain a slash. */ ! public static String getPackageName(String name) { ! int index = name.lastIndexOf('/'); ! if (index != -1) { ! return name.substring(0, index).replace("/", "."); } else { ! return ""; } } /** ! * Returns true if the resource is a <em>simple resource</em>. Simple ! * resources can never be encapsulated. Resources ending in "{@code .class}" ! * or where the package name is not a legal package name can not be ! * encapsulated. */ ! public static boolean isSimpleResource(String name) { ! int len = name.length(); ! if (len > 6 && name.endsWith(".class")) { ! return true; } - if (!Checks.isPackageName(getPackageName(name))) { - return true; } ! return false; } /** ! * Converts a resource name to a file path. Returns {@code null} if the ! * resource name cannot be converted into a file path. Resource names ! * with empty elements, or elements that are "." or ".." are rejected, ! * as is a resource name that translates to a file path with a root ! * component. */ ! public static Path toFilePath(String name) { ! // scan the resource name to eagerly reject obviously invalid names int next; int off = 0; while ((next = name.indexOf('/', off)) != -1) { int len = next - off; if (!mayTranslate(name, off, len)) { --- 20,125 ---- * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ ! package jdk.internal.module; import java.io.File; + import java.io.IOException; + import java.nio.file.Files; + import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.nio.file.Paths; ! import java.nio.file.attribute.BasicFileAttributes; /** ! * A helper class to support working with resources in modules. Also provides ! * support for translating resource names to file paths. */ ! public final class Resources { ! private Resources() { } /** ! * Return true if a resource can be encapsulated. Resource with names ! * ending in ".class" or "/" cannot be encapsulated. Resource names ! * that map to a legal package name can be encapsulated. */ ! public static boolean canEncapsulate(String name) { ! int len = name.length(); ! if (len > 6 && name.endsWith(".class")) { ! return false; } else { ! return Checks.isPackageName(toPackageName(name)); } } /** ! * Derive a <em>package name</em> for a resource. The package name ! * returned by this method may not be a legal package name. This method ! * returns null if the the resource name ends with a "/" (a directory) ! * or the resource name does not contain a "/". */ ! public static String toPackageName(String name) { ! int index = name.lastIndexOf('/'); ! if (index == -1 || index == name.length()-1) { ! return ""; ! } else { ! return name.substring(0, index).replace("/", "."); } } ! ! /** ! * Returns a resource name corresponding to the relative file path ! * between {@code dir} and {@code file}. If the file is a directory ! * then the name will end with a "/", except the top-level directory ! * where the empty string is returned. ! */ ! public static String toResourceName(Path dir, Path file) { ! String s = dir.relativize(file) ! .toString() ! .replace(File.separatorChar, '/'); ! if (s.length() > 0 && Files.isDirectory(file)) ! s += "/"; ! return s; } /** ! * Returns a file path to a resource in a file tree. If the resource ! * name has a trailing "/" then the file path will locate a directory. ! * Returns {@code null} if the resource does not map to a file in the ! * tree file. ! */ ! public static Path toFilePath(Path dir, String name) throws IOException { ! boolean expectDirectory = name.endsWith("/"); ! if (expectDirectory) { ! name = name.substring(0, name.length() - 1); // drop trailing "/" ! } ! Path path = toSafeFilePath(name); ! if (path != null) { ! Path file = dir.resolve(path); ! try { ! BasicFileAttributes attrs; ! attrs = Files.readAttributes(file, BasicFileAttributes.class); ! if (attrs.isDirectory() ! || (!attrs.isDirectory() && !expectDirectory)) ! return file; ! } catch (NoSuchFileException ignore) { } ! } ! return null; ! } ! ! /** ! * Map a resource name to a "safe" file path. Returns {@code null} if ! * the resource name cannot be converted into a "safe" file path. ! * ! * Resource names with empty elements, or elements that are "." or ".." ! * are rejected, as are resource names that translates to a file path ! * with a root component. */ ! private static Path toSafeFilePath(String name) { ! // scan elements of resource name int next; int off = 0; while ((next = name.indexOf('/', off)) != -1) { int len = next - off; if (!mayTranslate(name, off, len)) {
< prev index next >