From aae697d490a226937804e27c2b3e55cf98ff1791 Mon Sep 17 00:00:00 2001 From: Jukka Zitting Date: Tue, 21 Jan 2014 17:41:20 -0500 Subject: [PATCH 2/2] OAK-1285: QueryEngine#executeQuery takes NamePathMapper which is not part of oak-api Avoid the duplicate name mappings in UserQueryManager by constructing the query directly using Oak names and executing it with an empty set of mappings. FIXME: Since the possible values in the user queries are not mapped, they don't work property and cause test failures. --- .../oak/security/user/query/UserQueryManager.java | 35 ++++++++++++++-------- .../security/user/query/XPathConditionVisitor.java | 14 ++++----- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/query/UserQueryManager.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/query/UserQueryManager.java index 69f8cc7..dc73897 100644 --- a/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/query/UserQueryManager.java +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/query/UserQueryManager.java @@ -16,18 +16,22 @@ */ package org.apache.jackrabbit.oak.security.user.query; +import static org.apache.jackrabbit.oak.api.QueryEngine.NO_BINDINGS; +import static org.apache.jackrabbit.oak.api.QueryEngine.NO_MAPPINGS; + import java.text.ParseException; import java.util.HashSet; import java.util.Iterator; import java.util.Set; + import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.jcr.RepositoryException; import javax.jcr.Value; import com.google.common.base.Predicate; -import com.google.common.base.Strings; import com.google.common.collect.Iterators; + import org.apache.jackrabbit.api.security.user.Authorizable; import org.apache.jackrabbit.api.security.user.Query; import org.apache.jackrabbit.api.security.user.QueryBuilder; @@ -99,10 +103,10 @@ public class UserQueryManager { } StringBuilder statement = new StringBuilder(); - ConditionVisitor visitor = new XPathConditionVisitor(statement, namePathMapper, userManager); + ConditionVisitor visitor = new XPathConditionVisitor(statement, userManager); - String searchRoot = namePathMapper.getJcrPath(QueryUtil.getSearchRoot(builder.getSelectorType(), config)); - String ntName = namePathMapper.getJcrName(QueryUtil.getNodeTypeName(builder.getSelectorType())); + String searchRoot = QueryUtil.getSearchRoot(builder.getSelectorType(), config); + String ntName = QueryUtil.getNodeTypeName(builder.getSelectorType()); statement.append(searchRoot).append("//element(*,").append(ntName).append(')'); if (condition != null) { @@ -207,11 +211,12 @@ public class UserQueryManager { //------------------------------------------------------------< private >--- @Nonnull - private String buildXPathStatement(@Nonnull String relPath, - @Nullable String value, - @Nonnull AuthorizableType type, boolean exact) { + private String buildXPathStatement( + @Nonnull String relPath, @Nullable String value, + @Nonnull AuthorizableType type, boolean exact) + throws RepositoryException { StringBuilder stmt = new StringBuilder(); - String searchRoot = namePathMapper.getJcrPath(QueryUtil.getSearchRoot(type, config)); + String searchRoot = QueryUtil.getSearchRoot(type, config); if (!"/".equals(searchRoot)) { stmt.append(searchRoot); } @@ -221,11 +226,11 @@ public class UserQueryManager { String ntName; if (relPath.indexOf('/') == -1) { // search for properties somewhere in the authorizable tree - propName = relPath; + propName = namePathMapper.getOakName(relPath); path = null; ntName = null; } else { - propName = Text.getName(relPath); + propName = namePathMapper.getOakName(Text.getName(relPath)); String[] segments = Text.explode(relPath, '/', false); StringBuilder sb = new StringBuilder(); for (int i = 0; i < segments.length - 1; i++) { @@ -236,8 +241,12 @@ public class UserQueryManager { sb.append(segments[i]); } } - path = Strings.emptyToNull(sb.toString()); - ntName = namePathMapper.getJcrName(QueryUtil.getNodeTypeName(type)); + if (sb.length() > 0) { + path = namePathMapper.getOakPath(sb.toString()); + } else { + path = null; + } + ntName = QueryUtil.getNodeTypeName(type); } stmt.append("//"); @@ -277,7 +286,7 @@ public class UserQueryManager { @Nullable AuthorizableType type) throws RepositoryException { try { QueryEngine queryEngine = root.getQueryEngine(); - Iterable resultRows = queryEngine.executeQuery(statement, javax.jcr.query.Query.XPATH, limit, offset, null, namePathMapper).getRows(); + Iterable resultRows = queryEngine.executeQuery(statement, javax.jcr.query.Query.XPATH, limit, offset, NO_BINDINGS, NO_MAPPINGS).getRows(); Iterator authorizables = Iterators.transform(resultRows.iterator(), new ResultRowToAuthorizable(userManager, root, type)); return Iterators.filter(authorizables, new UniqueResultPredicate()); } catch (ParseException e) { diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/query/XPathConditionVisitor.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/query/XPathConditionVisitor.java index 370a109..31a41df 100644 --- a/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/query/XPathConditionVisitor.java +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/query/XPathConditionVisitor.java @@ -22,7 +22,6 @@ import org.apache.jackrabbit.JcrConstants; import org.apache.jackrabbit.api.security.user.Authorizable; import org.apache.jackrabbit.api.security.user.User; import org.apache.jackrabbit.api.security.user.UserManager; -import org.apache.jackrabbit.oak.namepath.NamePathMapper; import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl; import org.apache.jackrabbit.oak.spi.security.user.UserConstants; @@ -32,13 +31,10 @@ import org.apache.jackrabbit.oak.spi.security.user.UserConstants; class XPathConditionVisitor implements ConditionVisitor { private final StringBuilder statement; - private final NamePathMapper namePathMapper; private final UserManager userMgr; - XPathConditionVisitor(StringBuilder statement, NamePathMapper namePathMapper, - UserManager userMgr) { + XPathConditionVisitor(StringBuilder statement, UserManager userMgr) { this.statement = statement; - this.namePathMapper = namePathMapper; this.userMgr = userMgr; } @@ -47,7 +43,7 @@ class XPathConditionVisitor implements ConditionVisitor { public void visit(Condition.Node condition) throws RepositoryException { statement.append('(') .append("jcr:like(@") - .append(namePathMapper.getJcrName(UserConstants.REP_PRINCIPAL_NAME)) + .append(UserConstants.REP_PRINCIPAL_NAME) .append(",'") .append(condition.getPattern()) .append("')") @@ -97,13 +93,13 @@ class XPathConditionVisitor implements ConditionVisitor { } if (isAdmin) { statement.append('@') - .append(namePathMapper.getJcrName(JcrConstants.JCR_PRIMARYTYPE)) + .append(JcrConstants.JCR_PRIMARYTYPE) .append("='") - .append(namePathMapper.getJcrName(UserConstants.NT_REP_USER)) + .append(UserConstants.NT_REP_USER) .append('\''); } else { statement.append('@') - .append(namePathMapper.getJcrName(UserConstants.REP_IMPERSONATORS)) + .append(UserConstants.REP_IMPERSONATORS) .append("='") .append(condition.getName()) .append('\''); -- 1.8.3.msysgit.0