diff --git a/extensions/modeshape-search-lucene/src/main/java/org/modeshape/search/lucene/LuceneSearchEngine.java b/extensions/modeshape-search-lucene/src/main/java/org/modeshape/search/lucene/LuceneSearchEngine.java index d26a942..798fdce 100644 --- a/extensions/modeshape-search-lucene/src/main/java/org/modeshape/search/lucene/LuceneSearchEngine.java +++ b/extensions/modeshape-search-lucene/src/main/java/org/modeshape/search/lucene/LuceneSearchEngine.java @@ -31,6 +31,9 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; import net.jcip.annotations.Immutable; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; @@ -113,6 +116,7 @@ public class LuceneSearchEngine extends AbstractLuceneSearchEngine workspaces, Observer observer, boolean readOnly ) { - return new LuceneSearchProcessor(getSourceName(), context, workspaces, observer, null, readOnly); + final Lock lock = readOnly ? processingLock.readLock() : processingLock.writeLock(); + lock.lock(); + return new LuceneSearchProcessor(getSourceName(), context, workspaces, observer, null, readOnly, lock); } /** diff --git a/extensions/modeshape-search-lucene/src/main/java/org/modeshape/search/lucene/LuceneSearchProcessor.java b/extensions/modeshape-search-lucene/src/main/java/org/modeshape/search/lucene/LuceneSearchProcessor.java index f21a8f6..6043d84 100644 --- a/extensions/modeshape-search-lucene/src/main/java/org/modeshape/search/lucene/LuceneSearchProcessor.java +++ b/extensions/modeshape-search-lucene/src/main/java/org/modeshape/search/lucene/LuceneSearchProcessor.java @@ -23,6 +23,13 @@ */ package org.modeshape.search.lucene; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.locks.Lock; import net.jcip.annotations.NotThreadSafe; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.search.Query; @@ -55,13 +62,6 @@ import org.modeshape.graph.search.AbstractSearchEngine.Workspaces; import org.modeshape.graph.search.SearchEngineProcessor; import org.modeshape.search.lucene.AbstractLuceneSearchEngine.AbstractLuceneProcessor; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - /** * Abstract {@link SearchEngineProcessor} implementation for the {@link LuceneSearchEngine}. */ @@ -71,13 +71,31 @@ public class LuceneSearchProcessor extends AbstractLuceneProcessor workspaces, Observer observer, DateTime now, - boolean readOnly ) { + boolean readOnly, + Lock lock ) { super(sourceName, context, workspaces, observer, now, readOnly); + this.lock = lock; + } + + /** + * {@inheritDoc} + * + * @see org.modeshape.graph.search.SearchEngineProcessor#close() + */ + @Override + public void close() { + try { + super.close(); + } finally { + this.lock.unlock(); + } } /** diff --git a/extensions/modeshape-search-lucene/src/test/java/org/modeshape/search/lucene/LuceneSearchSessionTest.java b/extensions/modeshape-search-lucene/src/test/java/org/modeshape/search/lucene/LuceneSearchSessionTest.java index b1953bd..a94b6b7 100644 --- a/extensions/modeshape-search-lucene/src/test/java/org/modeshape/search/lucene/LuceneSearchSessionTest.java +++ b/extensions/modeshape-search-lucene/src/test/java/org/modeshape/search/lucene/LuceneSearchSessionTest.java @@ -26,6 +26,7 @@ package org.modeshape.search.lucene; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; +import java.util.concurrent.locks.ReentrantLock; import org.junit.Before; import org.junit.Test; import org.modeshape.graph.ExecutionContext; @@ -47,7 +48,7 @@ public class LuceneSearchSessionTest { DateTime now = context.getValueFactories().getDateFactory().create(); Workspaces workspaces = mock(Workspaces.class); LuceneSearchWorkspace workspace = mock(LuceneSearchWorkspace.class); - processor = new LuceneSearchProcessor("source", context, workspaces, observer, now, true); + processor = new LuceneSearchProcessor("source", context, workspaces, observer, now, true, new ReentrantLock()); search = new LuceneSearchSession(workspace, processor); }