You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2012/09/13 12:23:18 UTC
svn commit: r1384266 -
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java
Author: mduerig
Date: Thu Sep 13 10:23:17 2012
New Revision: 1384266
URL: http://svn.apache.org/viewvc?rev=1384266&view=rev
Log:
OAK-108: Shortcut path conversions
validate path in the case of a short cut conversion
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java?rev=1384266&r1=1384265&r2=1384266&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java Thu Sep 13 10:23:17 2012
@@ -201,7 +201,7 @@ public class NamePathMapperImpl implemen
// try a shortcut
if (!hasNameStartingWithDot && !hasClarkBrackets && !hasIndexBrackets) {
if (!hasColon || !hasSessionLocalMappings()) {
- return removeTrailingSlash(jcrPath);
+ return validateJcrPath(jcrPath);
}
}
@@ -286,13 +286,65 @@ public class NamePathMapperImpl implemen
return oakPath.toString();
}
- private static String removeTrailingSlash(String path) {
- if ("/".equals(path) || path.isEmpty()) {
- return path;
- } else if (path.endsWith("/")) {
- return path.substring(0, path.length() - 1);
- } else {
- return path;
+ /**
+ * Validate a jcrPath assuming it doesn't contain any of the following
+ * characters: {@code {, }, [, ], ., :}.
+ * @param jcrPath path to validate
+ * @return {@code jcrPath} i.e. the same string instance if valid.
+ * {@code null} otherwise.
+ */
+ private String validateJcrPath(String jcrPath) {
+ final StringBuilder parseErrors = new StringBuilder();
+ JcrPathParser.Listener listener = new JcrPathParser.Listener() {
+ boolean hasRoot;
+
+ @Override
+ public boolean root() {
+ if (hasRoot) {
+ parseErrors.append("/ on non-empty path");
+ return false;
+ }
+ else {
+ hasRoot = true;
+ return true;
+ }
+ }
+
+ @Override
+ public boolean current() {
+ return true;
+ }
+
+ @Override
+ public boolean parent() {
+ return true;
+ }
+
+ @Override
+ public void error(String message) {
+ parseErrors.append(message);
+ }
+
+ @Override
+ public boolean name(String name, int index) {
+ String p = nameMapper.getOakName(name);
+ if (p == null) {
+ parseErrors.append("Invalid name: ").append(name);
+ return false;
+ }
+ else {
+ return true;
+ }
+ }
+ };
+
+ JcrPathParser.parse(jcrPath, listener);
+ if (parseErrors.length() != 0) {
+ log.debug("Could not parse path " + jcrPath + ": " + parseErrors.toString());
+ return null;
+ }
+ else {
+ return jcrPath;
}
}
}