From: <fg...@us...> - 2010-08-27 10:17:26
|
Revision: 2908 http://openutils.svn.sourceforge.net/openutils/?rev=2908&view=rev Author: fgiust Date: 2010-08-27 10:17:19 +0000 (Fri, 27 Aug 2010) Log Message: ----------- CRIT-19 refactored using proxies Modified Paths: -------------- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/lucene/AclSearchIndex.java trunk/openutils-mgnlcriteria/src/test/resources/crit-repository/indexing_configuration.xml Modified: trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/lucene/AclSearchIndex.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/lucene/AclSearchIndex.java 2010-08-26 14:40:18 UTC (rev 2907) +++ trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/lucene/AclSearchIndex.java 2010-08-27 10:17:19 UTC (rev 2908) @@ -20,12 +20,17 @@ package net.sourceforge.openutils.mgnlcriteria.jcr.query.lucene; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.jcr.RepositoryException; +import net.sf.cglib.proxy.Enhancer; +import net.sf.cglib.proxy.MethodInterceptor; +import net.sf.cglib.proxy.MethodProxy; + import org.apache.jackrabbit.core.SessionImpl; import org.apache.jackrabbit.core.query.lucene.LuceneQueryBuilder; import org.apache.jackrabbit.core.query.lucene.SearchIndex; @@ -35,6 +40,8 @@ import org.apache.jackrabbit.spi.commons.query.QueryNodeVisitor; import org.apache.jackrabbit.spi.commons.query.QueryRootNode; import org.apache.lucene.search.Query; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** @@ -45,30 +52,45 @@ public class AclSearchIndex extends SearchIndex { - private final AclQueryNodeFactory aclQueryNodeFactory = new AclQueryNodeFactory(Collections.unmodifiableList(Arrays - .asList(new Name[]{ - NameConstants.NT_CHILDNODEDEFINITION, - NameConstants.NT_FROZENNODE, - NameConstants.NT_NODETYPE, - NameConstants.NT_PROPERTYDEFINITION, - NameConstants.NT_VERSION, - NameConstants.NT_VERSIONEDCHILD, - NameConstants.NT_VERSIONHISTORY, - NameConstants.NT_VERSIONLABELS, - NameConstants.REP_NODETYPES, - NameConstants.REP_SYSTEM, - NameConstants.REP_VERSIONSTORAGE, - // Supertypes - NameConstants.NT_BASE, - NameConstants.MIX_REFERENCEABLE }))); + private DefaultQueryNodeFactory proxiedQueryNodeFactory; /** + * Logger. + */ + private Logger log = LoggerFactory.getLogger(AclSearchIndex.class); + + public AclSearchIndex() + { + Enhancer enhancer = new Enhancer(); + enhancer.setSuperclass(DefaultQueryNodeFactory.class); + enhancer.setCallback(new AclMethodInterceptor()); + proxiedQueryNodeFactory = (DefaultQueryNodeFactory) enhancer.create( + new Class[]{List.class }, + new Object[]{Collections.unmodifiableList(Arrays.asList(new Name[]{ + NameConstants.NT_CHILDNODEDEFINITION, + NameConstants.NT_FROZENNODE, + NameConstants.NT_NODETYPE, + NameConstants.NT_PROPERTYDEFINITION, + NameConstants.NT_VERSION, + NameConstants.NT_VERSIONEDCHILD, + NameConstants.NT_VERSIONHISTORY, + NameConstants.NT_VERSIONLABELS, + NameConstants.REP_NODETYPES, + NameConstants.REP_SYSTEM, + NameConstants.REP_VERSIONSTORAGE, + NameConstants.NT_BASE, + NameConstants.MIX_REFERENCEABLE })) }); + + } + + /** * {@inheritDoc} */ @Override protected DefaultQueryNodeFactory getQueryNodeFactory() { - return aclQueryNodeFactory; + + return proxiedQueryNodeFactory; } /** @@ -76,52 +98,45 @@ * @author dschivo * @version $Id$ */ - class AclQueryNodeFactory extends DefaultQueryNodeFactory + class AclMethodInterceptor implements MethodInterceptor { /** - * + * {@inheritDoc} */ - @SuppressWarnings("unchecked") - public AclQueryNodeFactory(List validJcrSystemNodeTypeNames) + public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { - super(validJcrSystemNodeTypeNames); - } + String name = method.getName(); - /** - * {@inheritDoc} - */ - @Override - public QueryRootNode createQueryRootNode() - { - return new QueryRootNode() + if ("createQueryRootNode".equals(name)) { + return new QueryRootNode() + { - /** - * {@inheritDoc} - */ - @Override - public Object accept(QueryNodeVisitor visitor, Object data) throws RepositoryException - { - // the lucene query without acl constraints - Query luceneQuery = (Query) super.accept(visitor, data); - try + @Override + public Object accept(QueryNodeVisitor visitor, Object data) throws RepositoryException { - // retrieves the session - Field sessionField = LuceneQueryBuilder.class.getDeclaredField("session"); - sessionField.setAccessible(true); - SessionImpl session = (SessionImpl) sessionField.get(visitor); + // the lucene query without acl constraints + Query luceneQuery = (Query) super.accept(visitor, data); + try + { + // retrieves the session + Field sessionField = LuceneQueryBuilder.class.getDeclaredField("session"); + sessionField.setAccessible(true); + SessionImpl session = (SessionImpl) sessionField.get(visitor); - // adds acl constraints - AclQueryDecorator decorator = new AclQueryDecorator(session, AclSearchIndex.this); - return decorator.applyAcl(luceneQuery); + // adds acl constraints + AclQueryDecorator decorator = new AclQueryDecorator(session, AclSearchIndex.this); + return decorator.applyAcl(luceneQuery); + } + catch (Throwable e) + { + throw new RepositoryException(e); + } } - catch (Throwable e) - { - throw new RepositoryException(e); - } - } - }; + }; + } + return proxy.invokeSuper(obj, args); } } Modified: trunk/openutils-mgnlcriteria/src/test/resources/crit-repository/indexing_configuration.xml =================================================================== --- trunk/openutils-mgnlcriteria/src/test/resources/crit-repository/indexing_configuration.xml 2010-08-26 14:40:18 UTC (rev 2907) +++ trunk/openutils-mgnlcriteria/src/test/resources/crit-repository/indexing_configuration.xml 2010-08-27 10:17:19 UTC (rev 2908) @@ -11,7 +11,8 @@ <property boost="10" useInExcerpt="false">title</property> <property boost="1.0" useInExcerpt="true">text</property> <!-- exclude jcr:* and mgnl:* properties --> - <property isRegexp="true" nodeScopeIndex="false" useInExcerpt="false">.*:.*</property> + <property isRegexp="true" nodeScopeIndex="false" useInExcerpt="false">mgnl:.*</property> + <property isRegexp="true" nodeScopeIndex="false" useInExcerpt="false">jcr:.*</property> </index-rule> <index-rule nodeType="mgnl:content"> <property boost="10" useInExcerpt="false">title</property> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |