You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ca...@apache.org on 2016/01/14 17:42:44 UTC

svn commit: r1724653 - in /jackrabbit/oak/trunk/oak-lucene/src: main/java/org/apache/jackrabbit/oak/plugins/index/lucene/ test/java/org/apache/jackrabbit/oak/plugins/index/lucene/

Author: catholicon
Date: Thu Jan 14 16:42:44 2016
New Revision: 1724653

URL: http://svn.apache.org/viewvc?rev=1724653&view=rev
Log:
OAK-3826: Lucene index augmentation doesn't work in Osgi environment
OAK-3815 was marked won't fix, so we're back to using bind/unbind in IndexAugmentFactory.
Removed tracker usage altogether.
Adjusted IndexAugmentorFactoryTest to use MockOsgi. Unfortunately, I couldn't find a way to unbind references - so, that's not covered.

Modified:
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexAugmentorFactory.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/package-info.java
    jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexAugmentorFactoryTest.java
    jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAugmentTest.java

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexAugmentorFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexAugmentorFactory.java?rev=1724653&r1=1724652&r2=1724653&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexAugmentorFactory.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexAugmentorFactory.java Thu Jan 14 16:42:44 2016
@@ -16,15 +16,23 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.lucene;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.apache.felix.scr.annotations.References;
+import org.apache.felix.scr.annotations.Service;
 import org.apache.jackrabbit.oak.plugins.index.lucene.spi.FulltextQueryTermsProvider;
 import org.apache.jackrabbit.oak.plugins.index.lucene.spi.IndexFieldProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
-import org.apache.jackrabbit.oak.spi.whiteboard.Tracker;
-import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
 import org.apache.jackrabbit.oak.util.PerfLogger;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.document.Field;
@@ -39,23 +47,40 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+@SuppressWarnings("UnusedDeclaration")
+@Component
+@Service(value = IndexAugmentorFactory.class)
+@References({
+        @Reference(name = "IndexFieldProvider",
+                policy = ReferencePolicy.DYNAMIC,
+                cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
+                referenceInterface = IndexFieldProvider.class),
+        @Reference(name = "FulltextQueryTermsProvider",
+                policy = ReferencePolicy.DYNAMIC,
+                cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
+                referenceInterface = FulltextQueryTermsProvider.class)
+})
 public class IndexAugmentorFactory {
 
     private static final PerfLogger PERFLOG = new PerfLogger(
             LoggerFactory.getLogger(IndexAugmentorFactory.class.getName() + ".perf"));
 
-    private final Tracker<IndexFieldProvider> indexFieldProviderTracker;
-    private final Tracker<FulltextQueryTermsProvider> fulltextQueryTermsProviderTracker;
+    private final Set<IndexFieldProvider> indexFieldProviders;
+    private final Set<FulltextQueryTermsProvider> fulltextQueryTermsProviders;
 
     private volatile Map<String, CompositeIndexFieldProvider> indexFieldProviderMap;
     private volatile Map<String, CompositeFulltextQueryTermsProvider> fulltextQueryTermsProviderMap;
 
-    public IndexAugmentorFactory(Whiteboard whiteboard) {
-        indexFieldProviderTracker = whiteboard.track(IndexFieldProvider.class);
-        fulltextQueryTermsProviderTracker = whiteboard.track(FulltextQueryTermsProvider.class);
+    public IndexAugmentorFactory() {
+        indexFieldProviders = Sets.newIdentityHashSet();
+        fulltextQueryTermsProviders = Sets.newIdentityHashSet();
 
-        indexFieldProviderMap = Maps.newHashMap();
-        fulltextQueryTermsProviderMap = Maps.newHashMap();
+        resetState();
+    }
+
+    @Deactivate
+    private synchronized void deactivate() {
+        resetState();
     }
 
     @Nonnull
@@ -70,51 +95,81 @@ public class IndexAugmentorFactory {
         return (provider != null) ? provider : FulltextQueryTermsProvider.DEFAULT;
     }
 
-    public void refreshServices() {
-        refreshIndexFieldProviderServices();
-        refreshFulltextQueryTermsProviderServices();
+    synchronized void bindIndexFieldProvider(IndexFieldProvider indexFieldProvider) {
+        indexFieldProviders.add(indexFieldProvider);
+        refreshIndexFieldProviders();
+    }
+
+    synchronized void unbindIndexFieldProvider(IndexFieldProvider indexFieldProvider) {
+        indexFieldProviders.remove(indexFieldProvider);
+        refreshIndexFieldProviders();
     }
 
-    private void refreshIndexFieldProviderServices() {
-        ListMultimap<String, IndexFieldProvider> indexFieldProviderListMultimap =
+    synchronized void bindFulltextQueryTermsProvider(FulltextQueryTermsProvider fulltextQueryTermsProvider) {
+        fulltextQueryTermsProviders.add(fulltextQueryTermsProvider);
+        refreshFulltextQueryTermsProviders();
+    }
+
+    synchronized void unbindFulltextQueryTermsProvider(FulltextQueryTermsProvider fulltextQueryTermsProvider) {
+        fulltextQueryTermsProviders.remove(fulltextQueryTermsProvider);
+        refreshFulltextQueryTermsProviders();
+    }
+
+    private void refreshIndexFieldProviders() {
+        ListMultimap<String, IndexFieldProvider> providerMultimap =
                 LinkedListMultimap.create();
-        for (IndexFieldProvider provider : indexFieldProviderTracker.getServices()) {
+        for (IndexFieldProvider provider : indexFieldProviders) {
             Set<String> supportedNodeTypes = provider.getSupportedTypes();
             for (String nodeType : supportedNodeTypes) {
-                indexFieldProviderListMultimap.put(nodeType, provider);
+                providerMultimap.put(nodeType, provider);
             }
         }
 
-        Map<String, CompositeIndexFieldProvider> tempMap = Maps.newHashMap();
-        for (String nodeType : indexFieldProviderListMultimap.keySet()) {
-            List<IndexFieldProvider> providers = indexFieldProviderListMultimap.get(nodeType);
+        Map<String, CompositeIndexFieldProvider> providerMap = Maps.newHashMap();
+        for (String nodeType : providerMultimap.keySet()) {
+            List<IndexFieldProvider> providers = providerMultimap.get(nodeType);
             CompositeIndexFieldProvider compositeIndexFieldProvider =
                     new CompositeIndexFieldProvider(nodeType, providers);
-            tempMap.put(nodeType, compositeIndexFieldProvider);
+            providerMap.put(nodeType, compositeIndexFieldProvider);
         }
 
-        indexFieldProviderMap = tempMap;
+        indexFieldProviderMap = ImmutableMap.copyOf(providerMap);
     }
 
-    private void refreshFulltextQueryTermsProviderServices() {
-        ListMultimap<String, FulltextQueryTermsProvider> fulltextQueryTermsProviderLinkedListMultimap =
+    private void refreshFulltextQueryTermsProviders() {
+        ListMultimap<String, FulltextQueryTermsProvider> providerMultimap =
                 LinkedListMultimap.create();
-        for (FulltextQueryTermsProvider provider : fulltextQueryTermsProviderTracker.getServices()) {
+        for (FulltextQueryTermsProvider provider : fulltextQueryTermsProviders) {
             Set<String> supportedNodeTypes = provider.getSupportedTypes();
             for (String nodeType : supportedNodeTypes) {
-                fulltextQueryTermsProviderLinkedListMultimap.put(nodeType, provider);
+                providerMultimap.put(nodeType, provider);
             }
         }
 
-        Map<String, CompositeFulltextQueryTermsProvider> tempMap = Maps.newHashMap();
-        for (String nodeType : fulltextQueryTermsProviderLinkedListMultimap.keySet()) {
-            List<FulltextQueryTermsProvider> providers = fulltextQueryTermsProviderLinkedListMultimap.get(nodeType);
+        Map<String, CompositeFulltextQueryTermsProvider> providerMap = Maps.newHashMap();
+        for (String nodeType : providerMultimap.keySet()) {
+            List<FulltextQueryTermsProvider> providers = providerMultimap.get(nodeType);
             CompositeFulltextQueryTermsProvider compositeFulltextQueryTermsProvider =
                     new CompositeFulltextQueryTermsProvider(nodeType, providers);
-            tempMap.put(nodeType, compositeFulltextQueryTermsProvider);
+            providerMap.put(nodeType, compositeFulltextQueryTermsProvider);
         }
 
-        fulltextQueryTermsProviderMap = tempMap;
+        fulltextQueryTermsProviderMap = ImmutableMap.copyOf(providerMap);
+    }
+
+    private void resetState() {
+        indexFieldProviders.clear();
+        fulltextQueryTermsProviders.clear();
+
+        indexFieldProviderMap = Collections.EMPTY_MAP;
+        fulltextQueryTermsProviderMap = Collections.EMPTY_MAP;
+    }
+
+    boolean isStateEmpty() {
+        return indexFieldProviders.size() == 0 &&
+                indexFieldProviderMap.size() == 0 &&
+                fulltextQueryTermsProviders.size() == 0 &&
+                fulltextQueryTermsProviderMap.size() == 0;
     }
 
     class CompositeIndexFieldProvider implements IndexFieldProvider {
@@ -124,7 +179,7 @@ public class IndexAugmentorFactory {
 
         CompositeIndexFieldProvider(String nodeType, List<IndexFieldProvider> providers) {
             this.nodeType = nodeType;
-            this.providers = providers;
+            this.providers = ImmutableList.copyOf(providers);
         }
 
         @Nonnull
@@ -158,7 +213,7 @@ public class IndexAugmentorFactory {
 
         CompositeFulltextQueryTermsProvider(String nodeType, List<FulltextQueryTermsProvider> providers) {
             this.nodeType = nodeType;
-            this.providers = providers;
+            this.providers = ImmutableList.copyOf(providers);
         }
 
         @Override

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java?rev=1724653&r1=1724652&r2=1724653&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java Thu Jan 14 16:42:44 2016
@@ -45,7 +45,6 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.ReferencePolicy;
 import org.apache.felix.scr.annotations.ReferencePolicyOption;
-import org.apache.felix.scr.annotations.References;
 import org.apache.jackrabbit.oak.api.jmx.CacheStatsMBean;
 import org.apache.jackrabbit.oak.cache.CacheStats;
 import org.apache.jackrabbit.oak.commons.PropertiesUtil;
@@ -53,8 +52,6 @@ import org.apache.jackrabbit.oak.osgi.Os
 import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
 import org.apache.jackrabbit.oak.plugins.index.fulltext.PreExtractedTextProvider;
-import org.apache.jackrabbit.oak.plugins.index.lucene.spi.FulltextQueryTermsProvider;
-import org.apache.jackrabbit.oak.plugins.index.lucene.spi.IndexFieldProvider;
 import org.apache.jackrabbit.oak.spi.commit.BackgroundObserver;
 import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory;
 import org.apache.jackrabbit.oak.spi.commit.BackgroundObserverMBean;
@@ -77,20 +74,6 @@ import static org.apache.jackrabbit.oak.
 
 @SuppressWarnings("UnusedDeclaration")
 @Component(metatype = true, label = "Apache Jackrabbit Oak LuceneIndexProvider")
-@References({
-        @Reference(name = "IndexFieldProvider",
-                policy = ReferencePolicy.DYNAMIC,
-                cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
-                referenceInterface = IndexFieldProvider.class,
-                bind = "indexFieldProviderServiceUpdated",
-                unbind = "indexFieldProviderServiceUpdated"),
-        @Reference(name = "FulltextQueryTermsProvider",
-                policy = ReferencePolicy.DYNAMIC,
-                cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
-                referenceInterface = FulltextQueryTermsProvider.class,
-                bind = "indexFulltextQueryTermsProviderServiceUpdated",
-                unbind = "indexFulltextQueryTermsProviderServiceUpdated")
-})
 public class LuceneIndexProviderService {
     public static final String REPOSITORY_HOME = "repository.home";
 
@@ -194,6 +177,7 @@ public class LuceneIndexProviderService
     @Reference
     ScorerProviderFactory scorerFactory;
 
+    @Reference
     private IndexAugmentorFactory augmentorFactory;
 
     @Reference(policy = ReferencePolicy.DYNAMIC,
@@ -226,7 +210,6 @@ public class LuceneIndexProviderService
         whiteboard = new OsgiWhiteboard(bundleContext);
         threadPoolSize = PropertiesUtil.toInteger(config.get(PROP_THREAD_POOL_SIZE), PROP_THREAD_POOL_SIZE_DEFAULT);
         initializeExtractedTextCache(bundleContext, config);
-        augmentorFactory = new IndexAugmentorFactory(whiteboard);
         indexProvider = new LuceneIndexProvider(createTracker(bundleContext, config), scorerFactory, augmentorFactory);
         initializeLogging(config);
         initialize();
@@ -490,12 +473,4 @@ public class LuceneIndexProviderService
         this.extractedTextProvider = null;
         registerExtractedTextProvider(null);
     }
-
-    private void indexFieldProviderServiceUpdated(IndexFieldProvider indexFieldProvider) {
-        augmentorFactory.refreshServices();
-    }
-
-    private void indexFulltextQueryTermsProviderServiceUpdated(FulltextQueryTermsProvider fulltextQueryTermsProvider) {
-        augmentorFactory.refreshServices();
-    }
 }

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/package-info.java?rev=1724653&r1=1724652&r2=1724653&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/package-info.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/package-info.java Thu Jan 14 16:42:44 2016
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("3.1.0")
+@Version("4.0.0")
 @Export(optional = "provide:=true")
 package org.apache.jackrabbit.oak.plugins.index.lucene;
 

Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexAugmentorFactoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexAugmentorFactoryTest.java?rev=1724653&r1=1724652&r2=1724653&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexAugmentorFactoryTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexAugmentorFactoryTest.java Thu Jan 14 16:42:44 2016
@@ -25,8 +25,6 @@ import com.google.common.collect.Sets;
 import org.apache.jackrabbit.oak.plugins.index.lucene.spi.FulltextQueryTermsProvider;
 import org.apache.jackrabbit.oak.plugins.index.lucene.spi.IndexFieldProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
-import org.apache.jackrabbit.oak.spi.whiteboard.DefaultWhiteboard;
-import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.document.Field;
 import org.apache.lucene.document.StringField;
@@ -35,26 +33,27 @@ import org.apache.lucene.search.BooleanC
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.TermQuery;
+import org.apache.sling.testing.mock.osgi.MockOsgi;
+import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
 import org.hamcrest.CoreMatchers;
-import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 
 import javax.annotation.Nonnull;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
 import static org.apache.lucene.search.BooleanClause.Occur.SHOULD;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 
 public class IndexAugmentorFactoryTest {
-    private IndexAugmentorFactory indexAugmentorFactory;
-    private Whiteboard whiteboard = new DefaultWhiteboard();
+    private IndexAugmentorFactory indexAugmentorFactory = new IndexAugmentorFactory();
 
-    @Before
-    public void initializeFactory() {
-        indexAugmentorFactory = new IndexAugmentorFactory(whiteboard);
-    }
+    @Rule
+    public final OsgiContext context = new OsgiContext();
 
     @Test
     public void compositeIndexProvider()
@@ -64,15 +63,23 @@ public class IndexAugmentorFactoryTest {
         final String typeC = "type:C";
         final String typeD = "type:D";
 
+        context.registerInjectActivateService(indexAugmentorFactory);
+
         new IdentifiableIndexFiledProvider("1", Sets.newHashSet(typeA, typeB));
         new IdentifiableIndexFiledProvider("2", Sets.newHashSet(typeC));
         new IdentifiableIndexFiledProvider("3", Sets.newHashSet(typeA, typeB));
 
-        indexAugmentorFactory.refreshServices();
+        //register an instance which would be unregistered before validation
+        IndexFieldProvider unreg = new IdentifiableIndexFiledProvider("4", Sets.newHashSet(typeD));
+        indexAugmentorFactory.unbindIndexFieldProvider(unreg);
 
         validateComposedFields(typeA, "1", "3");
         validateComposedFields(typeC, "2");
         validateComposedFields(typeD);
+
+        MockOsgi.deactivate(indexAugmentorFactory, context.bundleContext(), Collections.EMPTY_MAP);
+
+        validateDeactivatedService();
     }
 
     @Test
@@ -84,21 +91,35 @@ public class IndexAugmentorFactoryTest {
         final String typeD = "type:D";
         final String typeE = "type:E";
 
+        context.registerInjectActivateService(indexAugmentorFactory);
+
         new IdentifiableQueryTermsProvider("1", Sets.newHashSet(typeA, typeB));
         new IdentifiableQueryTermsProvider("2", Sets.newHashSet(typeC));
         new IdentifiableQueryTermsProvider("3", Sets.newHashSet(typeA, typeB));
         new IdentifiableQueryTermsProvider(null, Sets.newHashSet(typeE));
 
-        indexAugmentorFactory.refreshServices();
+        //register an instance which would be unregistered before validation
+        FulltextQueryTermsProvider unreg = new IdentifiableQueryTermsProvider("4", Sets.newHashSet(typeD));
+        indexAugmentorFactory.unbindFulltextQueryTermsProvider(unreg);
 
         validateComposedQueryTerms(typeA, "1", "3");
         validateComposedQueryTerms(typeC, "2");
         validateComposedQueryTerms(typeD);
         validateComposedQueryTerms(typeE);
+
+        MockOsgi.deactivate(indexAugmentorFactory, context.bundleContext(), Collections.EMPTY_MAP);
+
+        validateDeactivatedService();
     }
 
     void validateComposedFields(String type, String ... expected) {
         IndexFieldProvider compositeIndexProvider = indexAugmentorFactory.getIndexFieldProvider(type);
+
+        if (expected.length > 0) {
+            assertTrue("Composed index field provider doesn't declare correct supported type",
+                    compositeIndexProvider.getSupportedTypes().contains(type));
+        }
+
         Iterable<Field> fields = compositeIndexProvider.getAugmentedFields(null, null, null);
         Set<String> ids = Sets.newHashSet();
         for (Field f : fields) {
@@ -111,6 +132,12 @@ public class IndexAugmentorFactoryTest {
 
     void validateComposedQueryTerms(String type, String ... expected) {
         FulltextQueryTermsProvider compositeQueryTermsProvider = indexAugmentorFactory.getFulltextQueryTermsProvider(type);
+
+        if (expected.length > 0) {
+            assertTrue("Composed query terms provider doesn't declare correct supported type",
+                    compositeQueryTermsProvider.getSupportedTypes().contains(type));
+        }
+
         Query q = compositeQueryTermsProvider.getQueryTerm(null, null, null);
         if (q == null) {
             assertEquals("No query terms generated for " + type + ".", 0, expected.length);
@@ -136,6 +163,10 @@ public class IndexAugmentorFactoryTest {
         }
     }
 
+    private void validateDeactivatedService() {
+        assertTrue("All data structures must be empty after deactivate", indexAugmentorFactory.isStateEmpty());
+    }
+
     class IdentifiableIndexFiledProvider implements IndexFieldProvider {
         private final Field id;
         private final Set<String> nodeTypes;
@@ -143,8 +174,7 @@ public class IndexAugmentorFactoryTest {
         IdentifiableIndexFiledProvider(String id, Set<String> nodeTypes) {
             this.id = new StringField("id", id, Field.Store.NO);
             this.nodeTypes = nodeTypes;
-
-            whiteboard.register(IndexFieldProvider.class, this, null);
+            context.registerService(IndexFieldProvider.class, this);
         }
 
         @Nonnull
@@ -167,8 +197,7 @@ public class IndexAugmentorFactoryTest {
         IdentifiableQueryTermsProvider(String id, Set<String> nodeTypes) {
             this.id = (id == null)?null:new TermQuery(new Term(id, "1"));
             this.nodeTypes = nodeTypes;
-
-            whiteboard.register(FulltextQueryTermsProvider.class, this, null);
+            context.registerService(FulltextQueryTermsProvider.class, this);
         }
 
         @Override

Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAugmentTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAugmentTest.java?rev=1724653&r1=1724652&r2=1724653&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAugmentTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAugmentTest.java Thu Jan 14 16:42:44 2016
@@ -36,8 +36,6 @@ import org.apache.jackrabbit.oak.spi.com
 import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
-import org.apache.jackrabbit.oak.spi.whiteboard.DefaultWhiteboard;
-import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
@@ -319,6 +317,22 @@ public class LuceneIndexAugmentTest exte
             }
         };
         checkSimpleBehavior(rootTree, testIndex++);
+
+        //setup composite query term provider with one returning null query
+        factory.registerQueryTermsProvider(new FulltextQueryTermsProvider() {
+            @Override
+            public Query getQueryTerm(String text, Analyzer analyzer, NodeState indexDefinition) {
+                return null;
+            }
+
+            @Nonnull
+            @Override
+            public Set<String> getSupportedTypes() {
+                return Collections.singleton(TestUtil.NT_TEST);
+            }
+        });
+        factory.useSuperBehavior = true;
+        checkSimpleBehavior(rootTree, testIndex++);
     }
 
     //OAK-3576
@@ -642,25 +656,13 @@ public class LuceneIndexAugmentTest exte
         IndexFieldProvider indexFieldProvider = null;
         FulltextQueryTermsProvider fulltextQueryTermsProvider = null;
         private boolean useSuperBehavior = false;
-        private final Whiteboard whiteboard;
-
-        SimpleIndexAugmentorFactory() {
-            this(new DefaultWhiteboard());
-        }
-
-        SimpleIndexAugmentorFactory(Whiteboard whiteboard) {
-            super(whiteboard);
-            this.whiteboard = whiteboard;
-        }
 
         void registerIndexFieldProvider(IndexFieldProvider provider) {
-            whiteboard.register(IndexFieldProvider.class, provider, null);
-            refreshServices();
+            bindIndexFieldProvider(provider);
         }
 
         void registerQueryTermsProvider(FulltextQueryTermsProvider provider) {
-            whiteboard.register(FulltextQueryTermsProvider.class, provider, null);
-            refreshServices();
+            bindFulltextQueryTermsProvider(provider);
         }
 
         @Nonnull