package org.compass.core.lucene.engine.merge.scheduler; import org.apache.lucene.index.MergeScheduler; import org.apache.lucene.index.SerialMergeScheduler; import org.compass.core.config.CompassSettings; import org.compass.core.engine.SearchEngineException; import org.compass.core.lucene.LuceneEnvironment; import org.compass.core.lucene.engine.manager.LuceneSearchEngineIndexManager; import org.compass.core.util.ClassUtils; /** * A {@link org.apache.lucene.index.MergeScheduler} factory using {@link MergeSchedulerProvider} * to create one. * * @author kimchy */ public class MergeSchedulerFactory { public static MergeScheduler create(LuceneSearchEngineIndexManager indexManager, CompassSettings settings) throws SearchEngineException { if (!indexManager.supportsConcurrentOperations()) { return new SerialMergeScheduler(); } String type = settings.getSetting(LuceneEnvironment.MergeScheduler.TYPE, LuceneEnvironment.MergeScheduler.Executor.NAME); MergeSchedulerProvider provider; if (type.equals(LuceneEnvironment.MergeScheduler.Executor.NAME)) { provider = new ExecutorMergeSchedulerProvider(); } else if (type.equals(LuceneEnvironment.MergeScheduler.Concurrent.NAME)) { provider = new ConcurrentMergeSchedulerProvider(); } else if (type.equals(LuceneEnvironment.MergeScheduler.Serial.NAME)) { provider = new SerialMergeSchedulerProvider(); } else { try { provider = (MergeSchedulerProvider) ClassUtils.forName(type, settings.getClassLoader()).newInstance(); } catch (Exception e) { throw new SearchEngineException("Failed to create merge scheduler provider [" + type + "]", e); } } return provider.create(indexManager, settings); } }