From 4d441e088f375a76ecca3e4b0a3b99be0ee526f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Avard=20Ottestad?= Date: Sun, 8 Dec 2024 13:44:10 +0100 Subject: [PATCH] more fixes --- .../org/eclipse/rdf4j/model/util/URIUtil.java | 15 +++++++- .../eclipse/rdf4j/rio/turtle/TurtleUtil.java | 37 +------------------ 2 files changed, 16 insertions(+), 36 deletions(-) diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/URIUtil.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/URIUtil.java index e3495f23d43..8fb9789c0df 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/URIUtil.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/URIUtil.java @@ -228,6 +228,19 @@ public static boolean isValidLocalName(String name) { for (int i = 1; i < name.length(); i++) { if (!isNameChar(name.charAt(i))) { + + // PLX + if (name.charAt(i) == '%') { + continue; + } else if (name.charAt(i) == '\\') { + if (i + 1 < name.length() && isPN_LOCAL_ESC(name.substring(i, i + 2))) { + i++; + continue; + } else { + return false; + } + } + return false; } @@ -341,7 +354,7 @@ private static boolean isNameStartChar(int codePoint) { * @return true if the supplied code point represents a valid name char, false otherwise. */ private static boolean isNameChar(int codePoint) { - return isPN_CHARS(codePoint) || codePoint == '.' || codePoint == ':' | codePoint == '\\' || codePoint == '%'; + return isPN_CHARS(codePoint) || codePoint == '.' || codePoint == ':'; } /** diff --git a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleUtil.java b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleUtil.java index b7b9985449f..9ce214265e3 100644 --- a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleUtil.java +++ b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleUtil.java @@ -13,6 +13,7 @@ import java.util.Arrays; import org.eclipse.rdf4j.common.text.ASCIIUtil; +import org.eclipse.rdf4j.model.util.URIUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -366,41 +367,7 @@ public static boolean isPN_LOCAL_ESC(String name) { } public static boolean isPN_LOCAL(String name) { - // Empty names are legal - if (name.isEmpty()) { - return true; - } - - if (!isPN_CHARS_U(name.charAt(0)) && name.charAt(0) != ':' && !ASCIIUtil.isNumber(name.charAt(0)) - && !isPLX_START(name)) { - logger.debug("PN_LOCAL was not valid (start characters invalid) i=" + 0 + " nextchar=" - + name.charAt(0) + " name=" + name); - return false; - } - - if (!isNameStartChar(name.charAt(0))) { - logger.debug("name was not valid (start character invalid) i=" + 0 + " nextchar=" + name.charAt(0) - + " name=" + name); - return false; - } - - for (int i = 1; i < name.length(); i++) { - if (!isNameChar(name.charAt(i))) { - logger.debug("name was not valid (intermediate character invalid) i=" + i + " nextchar=" - + name.charAt(i) + " name=" + name); - return false; - } - - // Check if the percent encoding was less than two characters from the - // end of the prefix, in which case it is invalid - if (name.charAt(i) == '%' && (name.length() - i) < 3) { - logger.debug("name was not valid (short percent escape) i=" + i + " nextchar=" + name.charAt(i) - + " name=" + name); - return false; - } - } - - return true; + return URIUtil.isValidLocalName(name); } // public static boolean isLegalName(String name) {