From: <die...@us...> - 2010-05-28 10:34:05
|
Revision: 2582 http://openutils.svn.sourceforge.net/openutils/?rev=2582&view=rev Author: diego_schivo Date: 2010-05-28 10:33:58 +0000 (Fri, 28 May 2010) Log Message: ----------- CRIT-12 enableAcl Modified Paths: -------------- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/advanced/impl/QueryExecutorHelper.java Added Paths: ----------- trunk/openutils-mgnlcriteria/src/main/java/org/ trunk/openutils-mgnlcriteria/src/main/java/org/apache/ trunk/openutils-mgnlcriteria/src/main/java/org/apache/jackrabbit/ trunk/openutils-mgnlcriteria/src/main/java/org/apache/jackrabbit/core/ trunk/openutils-mgnlcriteria/src/main/java/org/apache/jackrabbit/core/query/ trunk/openutils-mgnlcriteria/src/main/java/org/apache/jackrabbit/core/query/lucene/ trunk/openutils-mgnlcriteria/src/main/java/org/apache/jackrabbit/core/query/lucene/AclQueryImpl.java trunk/openutils-mgnlcriteria/src/main/java/org/apache/jackrabbit/core/query/lucene/AclSearchIndex.java Removed Paths: ------------- trunk/openutils-mgnlcriteria/src/test/java/org/ Modified: trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/advanced/impl/QueryExecutorHelper.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/advanced/impl/QueryExecutorHelper.java 2010-05-28 09:31:24 UTC (rev 2581) +++ trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/advanced/impl/QueryExecutorHelper.java 2010-05-28 10:33:58 UTC (rev 2582) @@ -21,6 +21,8 @@ import info.magnolia.cms.core.HierarchyManager; +import java.lang.reflect.Field; + import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.query.InvalidQueryException; @@ -30,7 +32,9 @@ import net.sourceforge.openutils.mgnlcriteria.jcr.query.xpath.utils.XPathTextUtils; import org.apache.commons.lang.StringUtils; +import org.apache.jackrabbit.core.query.ExecutableQuery; import org.apache.jackrabbit.core.query.QueryImpl; +import org.apache.jackrabbit.core.query.lucene.AclQueryImpl; import org.apache.jackrabbit.core.query.lucene.QueryResultImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,6 +75,7 @@ jcrQueryManager = jcrSession.getWorkspace().getQueryManager(); QueryImpl query = (QueryImpl) jcrQueryManager.createQuery(stmt, language); + enableAcl(query); if (maxResults > 0) { @@ -120,4 +125,34 @@ } } + + private static void enableAcl(QueryImpl query) + { + try + { + Field queryField = QueryImpl.class.getDeclaredField("query"); + queryField.setAccessible(true); + ExecutableQuery q = (ExecutableQuery) queryField.get(query); + if (q instanceof AclQueryImpl) + { + ((AclQueryImpl) q).setAclEnabled(true); + } + } + catch (SecurityException e) + { + // TODO Auto-generated catch block + } + catch (IllegalArgumentException e) + { + // TODO Auto-generated catch block + } + catch (NoSuchFieldException e) + { + // TODO Auto-generated catch block + } + catch (IllegalAccessException e) + { + // TODO Auto-generated catch block + } + } } Added: trunk/openutils-mgnlcriteria/src/main/java/org/apache/jackrabbit/core/query/lucene/AclQueryImpl.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/org/apache/jackrabbit/core/query/lucene/AclQueryImpl.java (rev 0) +++ trunk/openutils-mgnlcriteria/src/main/java/org/apache/jackrabbit/core/query/lucene/AclQueryImpl.java 2010-05-28 10:33:58 UTC (rev 2582) @@ -0,0 +1,240 @@ +package org.apache.jackrabbit.core.query.lucene; + +import info.magnolia.cms.security.AccessManager; +import info.magnolia.cms.security.Permission; +import info.magnolia.cms.util.SimpleUrlPattern; +import info.magnolia.context.MgnlContext; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +import javax.jcr.RepositoryException; +import javax.jcr.query.InvalidQueryException; +import javax.jcr.query.QueryResult; + +import org.apache.commons.lang.StringUtils; +import org.apache.jackrabbit.core.ItemManager; +import org.apache.jackrabbit.core.SessionImpl; +import org.apache.jackrabbit.core.query.PropertyTypeRegistry; +import org.apache.jackrabbit.spi.Path; +import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl; +import org.apache.jackrabbit.spi.commons.query.OrderQueryNode; +import org.apache.jackrabbit.spi.commons.query.QueryNodeFactory; +import org.apache.lucene.index.Term; +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.BooleanClause.Occur; + + +/** + * @author dschivo + * @version $Id$ + */ +public class AclQueryImpl extends QueryImpl +{ + + private boolean aclEnabled; + + /** + * + */ + public AclQueryImpl( + SessionImpl session, + ItemManager itemMgr, + SearchIndex index, + PropertyTypeRegistry propReg, + String statement, + String language, + QueryNodeFactory factory) throws InvalidQueryException + { + super(session, itemMgr, index, propReg, statement, language, factory); + } + + /** + * Returns the aclEnabled. + * @return the aclEnabled + */ + public boolean isAclEnabled() + { + return aclEnabled; + } + + /** + * Sets the aclEnabled. + * @param aclEnabled the aclEnabled to set + */ + public void setAclEnabled(boolean aclEnabled) + { + this.aclEnabled = aclEnabled; + } + + /** + * {@inheritDoc} + */ + @Override + public QueryResult execute(long offset, long limit) throws RepositoryException + { + // build lucene query + Query query = LuceneQueryBuilder.createQuery(root, session, index.getContext().getItemStateManager(), index + .getNamespaceMappings(), index.getTextAnalyzer(), propReg, index.getSynonymProvider(), index + .getIndexFormatVersion()); + + if (aclEnabled) + { + query = applyAcl(query); + } + + OrderQueryNode orderNode = root.getOrderNode(); + + OrderQueryNode.OrderSpec[] orderSpecs; + if (orderNode != null) + { + orderSpecs = orderNode.getOrderSpecs(); + } + else + { + orderSpecs = new OrderQueryNode.OrderSpec[0]; + } + Path[] orderProperties = new Path[orderSpecs.length]; + boolean[] ascSpecs = new boolean[orderSpecs.length]; + for (int i = 0; i < orderSpecs.length; i++) + { + orderProperties[i] = orderSpecs[i].getPropertyPath(); + ascSpecs[i] = orderSpecs[i].isAscending(); + } + + return new SingleColumnQueryResult( + index, + itemMgr, + session, + session.getAccessManager(), + this, + query, + new SpellSuggestion(index.getSpellChecker(), root), + getSelectProperties(), + orderProperties, + ascSpecs, + getRespectDocumentOrder(), + offset, + limit); + } + + @SuppressWarnings("unchecked") + private Query applyAcl(Query query) throws RepositoryException + { + List aclQueries = new ArrayList(); + AccessManager accessManager = MgnlContext.getAccessManager(session.getWorkspace().getName()); + List<Permission> permissions = accessManager.getPermissionList(); + if (!permissions.isEmpty()) + { + try + { + Field patternStringField = SimpleUrlPattern.class.getDeclaredField("patternString"); + patternStringField.setAccessible(true); + for (Permission permission : permissions) + { + if (permission.getPattern() instanceof SimpleUrlPattern) + { + String pattern = (String) patternStringField.get(permission.getPattern()); + String[] tokens = StringUtils.splitPreserveAllTokens(pattern, '/'); + if (tokens.length > 2 && "".equals(tokens[0]) && "*".equals(tokens[tokens.length - 1])) + { + Query q = null; + for (int i = 1; i < tokens.length - 1; i++) + { + if (q == null) + { + q = descendantSelfAxisQuery(jackrabbitTermQuery("_:PARENT"), nameQuery(tokens[i])); + } + else + { + q = childAxisQuery(q, tokens[i]); + } + } + q = descendantSelfAxisQuery(booleanQuery(q), new MatchAllDocsQuery()); + Occur o = (permission.getPermissions() & Permission.READ) != 0 + ? Occur.MUST + : Occur.MUST_NOT; + aclQueries.add(new Object[]{ + q, o + }); + } + } + } + } + catch (SecurityException e) + { + throw new RepositoryException(e); + } + catch (IllegalArgumentException e) + { + throw new RepositoryException(e); + } + catch (NoSuchFieldException e) + { + throw new RepositoryException(e); + } + catch (IllegalAccessException e) + { + throw new RepositoryException(e); + } + } + + if (!aclQueries.isEmpty()) + { + Query[] qs = new Query[1 + aclQueries.size()]; + Occur[] os = new Occur[qs.length]; + qs[0] = query; + os[0] = Occur.MUST; + for (int i = 1; i < qs.length; i++) + { + Object[] qo = (Object[]) aclQueries.get(i - 1); + qs[i] = (Query) qo[0]; + os[i] = (Occur) qo[1]; + } + query = booleanQuery(qs, os); + } + + return query; + } + + private NameQuery nameQuery(String n) + { + return new NameQuery(NameFactoryImpl.getInstance().create("", n), index.getIndexFormatVersion(), index + .getNamespaceMappings()); + } + + private JackrabbitTermQuery jackrabbitTermQuery(String f) + { + return new JackrabbitTermQuery(new Term(f)); + } + + private BooleanQuery booleanQuery(Query... qs) + { + return booleanQuery(qs, null); + } + + private BooleanQuery booleanQuery(Query[] qs, Occur[] os) + { + BooleanQuery bq = new BooleanQuery(); + for (int i = 0; i < qs.length; i++) + { + Occur o = (os != null && i < os.length) ? os[i] : Occur.MUST; + bq.add(qs[i], o); + } + return bq; + } + + private ChildAxisQuery childAxisQuery(Query q, String n) + { + return new ChildAxisQuery(index.getContext().getItemStateManager(), q, NameFactoryImpl.getInstance().create( + "", + n), index.getIndexFormatVersion(), index.getNamespaceMappings()); + } + + private DescendantSelfAxisQuery descendantSelfAxisQuery(Query cq, Query sq) + { + return new DescendantSelfAxisQuery(cq, sq, 1); + } +} Property changes on: trunk/openutils-mgnlcriteria/src/main/java/org/apache/jackrabbit/core/query/lucene/AclQueryImpl.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Added: trunk/openutils-mgnlcriteria/src/main/java/org/apache/jackrabbit/core/query/lucene/AclSearchIndex.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/org/apache/jackrabbit/core/query/lucene/AclSearchIndex.java (rev 0) +++ trunk/openutils-mgnlcriteria/src/main/java/org/apache/jackrabbit/core/query/lucene/AclSearchIndex.java 2010-05-28 10:33:58 UTC (rev 2582) @@ -0,0 +1,35 @@ +package org.apache.jackrabbit.core.query.lucene; + +import javax.jcr.query.InvalidQueryException; + +import org.apache.jackrabbit.core.ItemManager; +import org.apache.jackrabbit.core.SessionImpl; +import org.apache.jackrabbit.core.query.ExecutableQuery; + + +/** + * @author dschivo + * @version $Id$ + */ +public class AclSearchIndex extends SearchIndex +{ + + /** + * {@inheritDoc} + */ + @Override + public ExecutableQuery createExecutableQuery(SessionImpl session, ItemManager itemMgr, String statement, + String language) throws InvalidQueryException + { + QueryImpl query = new AclQueryImpl( + session, + itemMgr, + this, + getContext().getPropertyTypeRegistry(), + statement, + language, + getQueryNodeFactory()); + query.setRespectDocumentOrder(getRespectDocumentOrder()); + return query; + } +} Property changes on: trunk/openutils-mgnlcriteria/src/main/java/org/apache/jackrabbit/core/query/lucene/AclSearchIndex.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |