JCR-4917: spi-commons: NameParser is too picky (allow non-ASCII whitespace)

git-svn-id: https://svn.apache.org/repos/asf/jackrabbit/trunk@1908783 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/conversion/NameParser.java b/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/conversion/NameParser.java
index f4b10ce..a33909a 100644
--- a/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/conversion/NameParser.java
+++ b/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/conversion/NameParser.java
@@ -96,7 +96,7 @@
                 trailingSpaces = true;
             } else if (c == '[' || c == ']' || c == '*' || c == '|') {
                 throw new IllegalNameException(asDisplayableString(c) + " not allowed in name");
-            } else if (Character.isWhitespace(c)) {
+            } else if (Character.isWhitespace(c) && c < 128) {
                 throw new IllegalNameException("Whitespace character " + asDisplayableString(c) + " not allowed in name");
             } else if (c == '/') {
                 if (state == STATE_URI_START) {
@@ -194,10 +194,20 @@
     }
 
     private static String asDisplayableString(char c) {
-        if (Character.isWhitespace(c)) {
-            return String.format("'\\u%04x'", (int)c);
+        if (c >= ' ' && c < 127) {
+            return Character.toString(c);
+        } else if (c == '\b') {
+            return "\\b";
+        } else if (c == '\f') {
+            return "\\f";
+        } else if (c == '\n') {
+            return "\\n";
+        } else if (c == '\r') {
+            return "\\r";
+        } else if (c == '\t') {
+            return "\\t";
         } else {
-            return "'" + c + "'";
+            return String.format("\\u%04x", (int) c);
         }
     }
 
diff --git a/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/conversion/NameParserTest.java b/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/conversion/NameParserTest.java
index 6fe3b9f..6dc0ec2 100644
--- a/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/conversion/NameParserTest.java
+++ b/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/conversion/NameParserTest.java
@@ -110,6 +110,9 @@
         valid.add(new String[] {"abc { }", "", "abc { }"});
         valid.add(new String[] {"{ ab }", "", "{ ab }"});
         valid.add(new String[] {"{ }abc", "", "{ }abc"});
+        // see JCR-4917
+        valid.add(new String[] {"a\u200ab", "", "a\u200ab"});
+        valid.add(new String[] {"\u200ab\u200a", "", "\u200ab\u200a"});
         // unknown uri -> but valid non-prefixed jcr-name
         valid.add(new String[] {"{test}abc", "", "{test}abc"});
         valid.add(new String[] {"{ab}", "", "{ab}"});
@@ -243,7 +246,7 @@
             NameParser.checkFormat("horizontal\ttab");
             fail("should fail with IllegalNameException");
         } catch (IllegalNameException ex) {
-            assertTrue("message should contain '\\u0009'", ex.getMessage().indexOf("'\\u0009'") >= 0);
+            assertTrue("message should contain '\\t'", ex.getMessage().indexOf("\\t") >= 0);
         }
     }