< prev index next >

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

Print this page

        

*** 23,103 **** * questions. */ package jdk.internal.module; public final class Checks { private Checks() { } ! private static void fail(String what, String id, int i) { ! throw new IllegalArgumentException(id ! + ": Invalid " + what + ": " ! + " Illegal character" ! + " at index " + i); } /** ! * Returns {@code true} if the given identifier is a legal Java identifier. */ ! public static boolean isJavaIdentifier(String id) { ! int n = id.length(); ! if (n == 0) ! return false; ! if (!Character.isJavaIdentifierStart(id.codePointAt(0))) ! return false; ! int cp = id.codePointAt(0); ! int i = Character.charCount(cp); ! for (; i < n; i += Character.charCount(cp)) { ! cp = id.codePointAt(i); ! if (!Character.isJavaIdentifierPart(cp) && id.charAt(i) != '.') return false; } ! if (cp == '.') return false; ! return true; } /** ! * Checks if a given identifier is a legal Java identifier. */ ! public static String requireJavaIdentifier(String what, String id) { ! if (id == null) ! throw new IllegalArgumentException("Null " + what); ! int n = id.length(); ! if (n == 0) ! throw new IllegalArgumentException("Empty " + what); ! if (!Character.isJavaIdentifierStart(id.codePointAt(0))) ! fail(what, id, 0); ! int cp = id.codePointAt(0); ! int i = Character.charCount(cp); ! int last = 0; ! for (; i < n; i += Character.charCount(cp)) { ! cp = id.codePointAt(i); ! if (!Character.isJavaIdentifierPart(cp) && id.charAt(i) != '.') ! fail(what, id, i); ! last = i; } - if (cp == '.') - fail(what, id, last); ! return id; } ! public static String requireModuleName(String id) { ! return requireJavaIdentifier("module name", id); } ! public static String requirePackageName(String id) { ! return requireJavaIdentifier("package name", id); } ! public static String requireServiceTypeName(String id) { ! return requireJavaIdentifier("service type name", id); } ! public static String requireServiceProviderName(String id) { ! return requireJavaIdentifier("service provider name", id); } } --- 23,224 ---- * questions. */ package jdk.internal.module; + /** + * Utility class for checking module name and binary names. + */ + public final class Checks { private Checks() { } ! /** ! * Checks a name to ensure that it's a legal module name. ! * ! * @throws IllegalArgumentException if name is null or not a legal ! * module name ! */ ! public static String requireModuleName(String name) { ! if (name == null) ! throw new IllegalArgumentException("Null module name"); ! int next; ! int off = 0; ! while ((next = name.indexOf('.', off)) != -1) { ! if (isJavaIdentifier(name, off, (next - off)) == -1) { ! String id = name.substring(off, next); ! throw new IllegalArgumentException(name + ": Invalid module name" ! + ": '" + id + "' is not a Java identifier"); ! } ! off = next+1; ! } ! int last = isJavaIdentifier(name, off, name.length() - off); ! if (last == -1) { ! String id = name.substring(off); ! throw new IllegalArgumentException(name + ": Invalid module name" ! + ": '" + id + "' is not a Java identifier"); ! } ! //if (!Character.isJavaIdentifierStart(last)) ! // throw new IllegalArgumentException(name + ": Module name ends in digit"); ! return name; } /** ! * Returns {@code true} if the given name is a legal module name. */ ! public static boolean isModuleName(String name) { ! int next; ! int off = 0; ! while ((next = name.indexOf('.', off)) != -1) { ! if (isJavaIdentifier(name, off, (next - off)) == -1) return false; + off = next+1; } ! int last = isJavaIdentifier(name, off, name.length() - off); ! if (last == -1) return false; ! //if (!Character.isJavaIdentifierStart(last)) ! // return false; return true; } /** ! * Checks a name to ensure that it's a legal package name. ! * ! * @throws IllegalArgumentException if name is null or not a legal ! * package name */ ! public static String requirePackageName(String name) { ! return requireBinaryName("package name", name); ! } ! ! /** ! * Checks a name to ensure that it's a legal type name. ! * ! * @throws IllegalArgumentException if name is null or not a legal ! * type name ! */ ! public static String requireServiceTypeName(String name) { ! return requireBinaryName("service type name", name); ! } ! ! /** ! * Checks a name to ensure that it's a legal type name. ! * ! * @throws IllegalArgumentException if name is null or not a legal ! * type name ! */ ! public static String requireServiceProviderName(String name) { ! return requireBinaryName("service provider name", name); ! } ! ! /** ! * Returns {@code true} if the given name is a legal binary name. ! */ ! public static boolean isJavaIdentifier(String name) { ! return isBinaryName(name); } ! /** ! * Returns {@code true} if the given name is a legal binary name. ! */ ! public static boolean isBinaryName(String name) { ! int next; ! int off = 0; ! while ((next = name.indexOf('.', off)) != -1) { ! if (isJavaIdentifier(name, off, (next - off)) == -1) ! return false; ! off = next+1; ! } ! int count = name.length() - off; ! return (isJavaIdentifier(name, off, count) != -1); } ! /** ! * Checks if the given name is a legal binary name. ! * ! * @throws IllegalArgumentException if name is null or not a legal ! * binary name ! */ ! public static String requireBinaryName(String what, String name) { ! if (name == null) ! throw new IllegalArgumentException("Null " + what); ! int next; ! int off = 0; ! while ((next = name.indexOf('.', off)) != -1) { ! if (isJavaIdentifier(name, off, (next - off)) == -1) { ! String id = name.substring(off, next); ! throw new IllegalArgumentException(name + ": Invalid " + what ! + ": '" + id + "' is not a Java identifier"); ! } ! off = next + 1; ! } ! if (isJavaIdentifier(name, off, name.length() - off) == -1) { ! String id = name.substring(off, name.length()); ! throw new IllegalArgumentException(name + ": Invalid " + what ! + ": '" + id + "' is not a Java identifier"); ! } ! return name; } ! /** ! * Returns {@code true} if the last character of the given name is legal ! * as the last character of a module name. ! * ! * @throws IllegalArgumentException if name is empty ! */ ! public static boolean hasLegalModuleNameLastCharacter(String name) { ! if (name.isEmpty()) ! throw new IllegalArgumentException("name is empty"); ! int len = name.length(); ! if (isASCIIString(name)) { ! char c = name.charAt(len-1); ! return Character.isJavaIdentifierStart(c); ! } else { ! int i = 0; ! int cp = -1; ! while (i < len) { ! cp = name.codePointAt(i); ! i += Character.charCount(cp); ! } ! return Character.isJavaIdentifierStart(cp); ! } } ! /** ! * Returns true if the given string only contains ASCII characters. ! */ ! private static boolean isASCIIString(String s) { ! int i = 0; ! while (i < s.length()) { ! int c = s.charAt(i); ! if (c > 0x7F) ! return false; ! i++; ! } ! return true; } ! /** ! * Checks if a char sequence is a legal Java identifier, returning the code ! * point of the last character if legal or {@code -1} if not legal. ! */ ! private static int isJavaIdentifier(CharSequence cs, int offset, int count) { ! if (count == 0) ! return -1; ! int first = Character.codePointAt(cs, offset); ! if (!Character.isJavaIdentifierStart(first)) ! return -1; ! ! int cp = first; ! int i = Character.charCount(first); ! while (i < count) { ! cp = Character.codePointAt(cs, offset+i); ! if (!Character.isJavaIdentifierPart(cp)) ! return -1; ! i += Character.charCount(cp); } + return cp; + } }
< prev index next >