package com.mysema.luja.impl;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.store.Directory;
import com.mysema.query.QueryException;
/**
* Simple wrapper to encapsulate searcher specific actions.
*
* @author laim
*
*/
public class LuceneSearcher implements Leasable {
private final IndexSearcher searcher;
private final AtomicInteger refCount = new AtomicInteger();
private final AtomicBoolean closed = new AtomicBoolean(false);
public LuceneSearcher(Directory directory) {
try {
this.searcher = new IndexSearcher(directory);
//System.out.println(searcher + " searcher created for " + this);
} catch (IOException e) {
throw new QueryException(e);
}
}
public boolean isCurrent() {
try {
return searcher.getIndexReader().isCurrent();
} catch (IOException e) {
throw new QueryException(e);
}
}
@Override
public void release() {
if (closed.get()) {
throw new QueryException(
"Cannot release, LuceneSearcher is already closed");
}
//System.out.println("release for " + this);
if (refCount.getAndDecrement() == 1) {
closed.set(true);
try {
searcher.close();
//System.out.println(searcher + " searcher closed for " + this);
} catch (IOException e) {
throw new QueryException(e);
}
}
}
@Override
public boolean lease() {
if (closed.get()) {
//System.out.println("Lease failed as searcher already closed");
return false;
}
//System.out.println("lease for " + this);
refCount.getAndIncrement();
return true;
}
public IndexSearcher getIndexSearcer() {
return searcher;
}
}