net.sf.logsaw.index.internal.ARunWithIndexWriter.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.logsaw.index.internal.ARunWithIndexWriter.java

Source

/*******************************************************************************
 * Copyright (c) 2010, 2011 LogSaw project and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    LogSaw project committers - initial API and implementation
 *******************************************************************************/
package net.sf.logsaw.index.internal;

import net.sf.logsaw.core.logresource.ILogResource;
import net.sf.logsaw.index.IndexPlugin;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.LogByteSizeMergePolicy;
import org.apache.lucene.index.LogMergePolicy;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.osgi.util.NLS;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * This is a convenience base class for executing code which requires an <code>IndexWriter</code>.
 * 
 * @author Philipp Nanz
 * @param <T> the return type
 */
public abstract class ARunWithIndexWriter<T> {

    private static transient Logger logger = LoggerFactory.getLogger(ARunWithIndexWriter.class);

    /**
     * Opens a Lucene index writer, executes the callback method and then closes the writer.
     * @param log the log resource, may be <code>null</code>
     * @param analyzer the Lucene analyzer to set on the index writer
     * @param matchVersion the Lucene match version
     * @return any object or <code>null</code>
     * @throws CoreException if an <strong>expected</strong> error occurred
     */
    protected final T runWithIndexWriter(ILogResource log, Analyzer analyzer, Version matchVersion)
            throws CoreException {
        logger.info("Opening index writer for '" + log.getName() + "'..."); //$NON-NLS-1$ //$NON-NLS-2$
        IndexWriter writer = null;
        try {
            Directory dir = FSDirectory.open(IndexPlugin.getDefault().getIndexFile(log));
            LogMergePolicy mp = new LogByteSizeMergePolicy();
            mp.setMergeFactor(30);
            IndexWriterConfig cfg = new IndexWriterConfig(matchVersion, analyzer);
            cfg.setMaxBufferedDocs(1000);
            cfg.setMergePolicy(mp);
            writer = new IndexWriter(dir, cfg);
            try {
                return doRunWithIndexWriter(writer, log);
            } finally {
                logger.info("Closing index writer for '" + log.getName() + "'..."); //$NON-NLS-1$ //$NON-NLS-2$
                writer.close();
            }
        } catch (CoreException e) {
            // Rethrow original CoreException
            throw e;
        } catch (Exception e) {
            // Unexpected exception; wrap with CoreException
            throw new CoreException(new Status(IStatus.ERROR, IndexPlugin.PLUGIN_ID,
                    NLS.bind(Messages.LuceneIndexService_error_failedToUpdateIndex,
                            new Object[] { log.getName(), e.getLocalizedMessage() }),
                    e));
        }
    }

    /**
     * Callback method being called by <code>runWithIndexWriter(ILogResource, ILogDialect)</code>.
     * @param writer the index writer
     * @param log the log resource, may be <code>null</code>
     * @return any object or <code>null</code>
     * @throws CoreException if an <strong>expected</strong> error occurred
     */
    protected abstract T doRunWithIndexWriter(IndexWriter writer, ILogResource log) throws CoreException;

}