/*
* Copyright (c) www.bugull.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.tooan.ynpay.third.mongodb.lucene;
import net.tooan.ynpay.third.jfinal.log.Logger;
import net.tooan.ynpay.third.mongodb.cache.IndexWriterCache;
import net.tooan.ynpay.third.mongodb.lucene.backend.IndexReopenTask;
import net.tooan.ynpay.third.mongodb.lucene.cluster.ClusterConfig;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.util.Version;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* Set the lucene index attributes.
* <p/>
* <p>Singleton Pattern is used here. An application should use only one BuguIndex.</p>
*
* @author Frank Wen(xbwen@hotmail.com)
*/
public class BuguIndex {
private final static Logger logger = Logger.getLogger(BuguIndex.class);
private static BuguIndex instance;
private double bufferSizeMB = 16;
private Version version = Version.LUCENE_35;
private Analyzer analyzer = new StandardAnalyzer(version);
private String directoryPath;
private ClusterConfig clusterConfig; //used in clustering environment
private ExecutorService executor; //thread pool to maintain index writing
private int threadPoolSize = 10; //default thread pool size is 10
private ScheduledExecutorService scheduler; //scheduler to reopen index
private long period = 30L * 1000L; //by default, reopen index per 30 seconds
private boolean reopening = false;
private boolean rebuilding = false;
private BuguIndex() {
}
public static BuguIndex getInstance() {
if (instance == null) {
instance = new BuguIndex();
}
return instance;
}
public void open() {
executor = Executors.newFixedThreadPool(threadPoolSize);
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new IndexReopenTask(), period, period, TimeUnit.MILLISECONDS);
if (clusterConfig != null) {
clusterConfig.validate();
}
}
public void close() {
try {
if (executor != null) {
executor.shutdown();
executor.awaitTermination(5, TimeUnit.SECONDS);
}
if (scheduler != null) {
scheduler.shutdown();
scheduler.awaitTermination(5, TimeUnit.SECONDS);
}
if (clusterConfig != null) {
clusterConfig.invalidate();
}
} catch (InterruptedException ex) {
logger.error(ex.getMessage(), ex);
}
Map<String, IndexWriter> map = IndexWriterCache.getInstance().getAll();
for (IndexWriter writer : map.values()) {
if (writer != null) {
Directory dir = writer.getDirectory();
try {
writer.commit();
writer.close(true);
} catch (CorruptIndexException ex) {
logger.error("Can not commit and close the lucene index", ex);
} catch (IOException ex) {
logger.error("Can not commit and close the lucene index", ex);
} finally {
try {
if (dir != null && IndexWriter.isLocked(dir)) {
IndexWriter.unlock(dir);
}
} catch (IOException ex) {
logger.error("Can not unlock the lucene index", ex);
}
}
}
}
}
public ExecutorService getExecutor() {
return executor;
}
public void setThreadPoolSize(int threadPoolSize) {
this.threadPoolSize = threadPoolSize;
}
public double getBufferSizeMB() {
return bufferSizeMB;
}
public void setBufferSizeMB(double bufferSizeMB) {
this.bufferSizeMB = bufferSizeMB;
}
public void setIndexReopenPeriod(long period) {
this.period = period;
}
public Version getVersion() {
return version;
}
public void setVersion(Version version) {
this.version = version;
}
public Analyzer getAnalyzer() {
return analyzer;
}
public void setAnalyzer(Analyzer analyzer) {
this.analyzer = analyzer;
}
public String getDirectoryPath() {
return directoryPath;
}
public void setDirectoryPath(String directoryPath) {
this.directoryPath = directoryPath;
}
public boolean isReopening() {
return reopening;
}
public void setReopening(boolean reopening) {
this.reopening = reopening;
}
public boolean isRebuilding() {
return rebuilding;
}
public void setRebuilding(boolean rebuilding) {
this.rebuilding = rebuilding;
}
public ClusterConfig getClusterConfig() {
return clusterConfig;
}
public void setClusterConfig(ClusterConfig clusterConfig) {
this.clusterConfig = clusterConfig;
}
}