diff --git a/src/main/java/rife/validation/ValidityChecks.java b/src/main/java/rife/validation/ValidityChecks.java index 7680c0d..f36ea9e 100644 --- a/src/main/java/rife/validation/ValidityChecks.java +++ b/src/main/java/rife/validation/ValidityChecks.java @@ -6,6 +6,7 @@ import rife.tools.ArrayUtils; import rife.tools.StringUtils; +import javax.lang.model.SourceVersion; import java.lang.reflect.Array; import java.net.MalformedURLException; import java.net.URL; @@ -518,12 +519,19 @@ public static boolean checkJavaPackage(Object value) { var identifier = true; var it = new StringCharacterIterator(name); + var segment = new StringBuilder(); var first = true; for (var c = it.first(); c != CharacterIterator.DONE; c = it.next()) { if ((first && !Character.isJavaIdentifierStart(c)) || (!first && !Character.isJavaIdentifierPart(c))) { if (c == '.') { + if (SourceVersion.isKeyword(segment)) { + identifier = false; + break; + } + first = true; + segment.setLength(0); continue; } else { @@ -531,10 +539,12 @@ public static boolean checkJavaPackage(Object value) { break; } } + + segment.append(c); first = false; } - return identifier; + return identifier && !SourceVersion.isKeyword(segment); } public static boolean checkJavaIdentifier(Object value) { @@ -542,22 +552,10 @@ public static boolean checkJavaIdentifier(Object value) { return false; } - if (!(value instanceof String name) || name.isBlank()) { + if (!(value instanceof CharSequence name)) { return false; } - var identifier = true; - var first = true; - var it = new StringCharacterIterator(name); - for (var c = it.first(); c != CharacterIterator.DONE; c = it.next()) { - if ((first && !Character.isJavaIdentifierStart(c)) || - (!first && !Character.isJavaIdentifierPart(c))) { - identifier = false; - break; - } - first = false; - } - - return identifier; + return SourceVersion.isIdentifier(name); } } diff --git a/src/test/java/rife/validation/TestValidityChecks.java b/src/test/java/rife/validation/TestValidityChecks.java index 1f97712..015a564 100644 --- a/src/test/java/rife/validation/TestValidityChecks.java +++ b/src/test/java/rife/validation/TestValidityChecks.java @@ -514,8 +514,13 @@ void testJavaPackage() { assertFalse(ValidityChecks.checkJavaPackage(".a.b")); assertFalse(ValidityChecks.checkJavaPackage("1.a.b")); assertFalse(ValidityChecks.checkJavaPackage("a.1b")); + assertFalse(ValidityChecks.checkJavaPackage("int")); + assertFalse(ValidityChecks.checkJavaPackage("if.b")); + assertFalse(ValidityChecks.checkJavaPackage("a.while")); assertTrue(ValidityChecks.checkJavaPackage("a")); assertTrue(ValidityChecks.checkJavaPackage("a.b")); + assertTrue(ValidityChecks.checkJavaPackage("a.int_")); + assertTrue(ValidityChecks.checkJavaPackage("a.int_.while_")); assertTrue(ValidityChecks.checkJavaPackage("com.A1.bB")); }