[seam-commits] Seam SVN: r7575 - in trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/search: metamodel and 1 other directory.

seam-commits at lists.jboss.org seam-commits at lists.jboss.org
Fri Mar 14 00:59:44 EDT 2008


Author: christian.bauer at jboss.com
Date: 2008-03-14 00:59:44 -0400 (Fri, 14 Mar 2008)
New Revision: 7575

Modified:
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/search/WikiSearch.java
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/search/metamodel/SearchRegistry.java
Log:
JBSEAM-2731, wiki search did not restrict access level properly

Modified: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/search/WikiSearch.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/search/WikiSearch.java	2008-03-13 23:45:07 UTC (rev 7574)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/search/WikiSearch.java	2008-03-14 04:59:44 UTC (rev 7575)
@@ -1,9 +1,11 @@
 package org.jboss.seam.wiki.core.search;
 
 import org.apache.lucene.search.*;
+import org.apache.lucene.index.Term;
 import org.hibernate.Hibernate;
 import org.hibernate.search.FullTextQuery;
 import org.hibernate.search.FullTextSession;
+import org.hibernate.search.engine.DocumentBuilder;
 import org.hibernate.search.bridge.StringBridge;
 import org.jboss.seam.Component;
 import org.jboss.seam.ScopeType;
@@ -133,53 +135,63 @@
         BooleanQuery mainQuery = new BooleanQuery();
 
         // Get value holders filled out by UI forms and generate a Lucene query
-        Class[] indexedEntities = new Class[searchableEntities.size()];
-        int i = 0;
         for (SearchableEntity searchableEntity : searchableEntities) {
             log.debug("building query for entity: " + searchableEntity.getClazz());
             BooleanQuery entityQuery = new BooleanQuery();
 
+            // Add restriction to entity clazz
+            // We use a Hibernate Search internal constant here to limit THIS particular entity query
+            // fragment to a particular indexed persistent entity type.
+            log.debug("adding restriction to entity clazz: " + searchableEntity.getClazz().getName());
+            entityQuery.add(
+                new TermQuery(
+                    new Term(DocumentBuilder.CLASS_FIELDNAME, searchableEntity.getClazz().getName())
+                ),
+                BooleanClause.Occur.MUST
+            );
+
             // Add sub-queries for all entity properties
+            BooleanQuery allPropertiesQuery = new BooleanQuery();
             for (PropertySearch search : searches.get(searchableEntity)) {
                 log.debug("building query for property: " + search.getProperty());
-                Query query = search.getProperty().getQuery(search);
-                if (query != null) {
-                    log.debug("adding query for property to owning entity: " + query.toString());
-                    // If there is more than one searchable entity, use OR, otherwise combine properties with AND
-                    entityQuery.add(
-                        query,
-                        searchableEntities.size() > 1 ? BooleanClause.Occur.SHOULD : BooleanClause.Occur.MUST
+                Query propertiesQuery  = search.getProperty().getQuery(search);
+                if (propertiesQuery != null) {
+                    // Any property can match, except if we are searching only one entity, then all must match
+                    allPropertiesQuery.add(
+                        propertiesQuery,
+                        searchableEntities.size() == 1 ? BooleanClause.Occur.MUST : BooleanClause.Occur.SHOULD
                     );
                 }
             }
 
-            // Add to main query with or without access control filter wrapping
-            if (entityQuery.getClauses().length > 0 && searchableEntity.getHandler().isReadAccessChecked()) {
+            // But SOME of the property searches for this entity must match
+            log.debug("adding query to owning entity for properties: " + allPropertiesQuery.getClauses().length);
+            entityQuery.add(allPropertiesQuery, BooleanClause.Occur.MUST);
 
+            // Finally, figure out if this entity query needs to be read-restricted, we have indexed the readAccessLevel of it
+            if (searchableEntity.getHandler().isReadAccessChecked()) {
+
                 Integer currentAccessLevel = (Integer)Component.getInstance("currentAccessLevel");
                 StringBridge paddingBridge = new PaddedIntegerBridge();
                 Query accessLimitQuery =
                     new ConstantScoreRangeQuery(FIELD_READACCESSLVL, null, paddingBridge.objectToString(currentAccessLevel), true, true);
-                Filter accessFilter = new QueryFilter(accessLimitQuery);
+                Filter accessFilter = new QueryWrapperFilter(accessLimitQuery);
                 FilteredQuery accessFilterQuery = new FilteredQuery(entityQuery, accessFilter);
 
+                log.debug("adding filtered entity query to main query: " + accessFilterQuery);
                 mainQuery.add(accessFilterQuery, BooleanClause.Occur.SHOULD);
 
-            } else if (entityQuery.getClauses().length > 0) {
-
+            } else {
+                log.debug("adding unfiltered entity query to main query: " + entityQuery);
                 mainQuery.add(entityQuery, BooleanClause.Occur.SHOULD);
-
             }
-
-            indexedEntities[i++] = searchableEntity.getClazz();
         }
 
+        log.debug(">>>>> search query: " + mainQuery.toString());
 
-        log.debug("search query: " + mainQuery.toString());
-
         try {
 
-            FullTextQuery ftQuery = getFullTextSession().createFullTextQuery(mainQuery, indexedEntities);
+            FullTextQuery ftQuery = getFullTextSession().createFullTextQuery(mainQuery);
             ftQuery.setFirstResult(page * pageSize).setMaxResults(pageSize);
             totalCount = ftQuery.getResultSize();
             log.debug("total search hits (might be paginated next): " + totalCount);

Modified: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/search/metamodel/SearchRegistry.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/search/metamodel/SearchRegistry.java	2008-03-13 23:45:07 UTC (rev 7574)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/search/metamodel/SearchRegistry.java	2008-03-14 04:59:44 UTC (rev 7575)
@@ -42,7 +42,6 @@
         searchableEntitiesByName.clear();
 
         // Fire an event and let all listeners add themself into the given collection
-        // TODO: Is this smarter than PreferenceRegistry scanning approach?
         Set<SearchSupport> searchSupportComponents = new HashSet<SearchSupport>();
         Events.instance().raiseEvent("Search.addSearchSupport", searchSupportComponents);
 




More information about the seam-commits mailing list