Return-Path: X-Original-To: apmail-jackrabbit-oak-commits-archive@minotaur.apache.org Delivered-To: apmail-jackrabbit-oak-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id B637EDD6D for ; Thu, 13 Sep 2012 10:24:05 +0000 (UTC) Received: (qmail 80157 invoked by uid 500); 13 Sep 2012 10:24:05 -0000 Delivered-To: apmail-jackrabbit-oak-commits-archive@jackrabbit.apache.org Received: (qmail 80078 invoked by uid 500); 13 Sep 2012 10:24:03 -0000 Mailing-List: contact oak-commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: oak-dev@jackrabbit.apache.org Delivered-To: mailing list oak-commits@jackrabbit.apache.org Received: (qmail 80047 invoked by uid 99); 13 Sep 2012 10:24:02 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 13 Sep 2012 10:24:02 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 13 Sep 2012 10:24:01 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 3A95B23889B8; Thu, 13 Sep 2012 10:23:18 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1384266 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java Date: Thu, 13 Sep 2012 10:23:18 -0000 To: oak-commits@jackrabbit.apache.org From: mduerig@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120913102318.3A95B23889B8@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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; } } }