it.pronetics.madstore.repository.index.impl.LuceneIndexer.java Source code

Java tutorial

Introduction

Here is the source code for it.pronetics.madstore.repository.index.impl.LuceneIndexer.java

Source

/**
 * Copyright 2008 - 2009 Pro-Netics S.P.A.
 *
 *    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 it.pronetics.madstore.repository.index.impl;

import it.pronetics.madstore.common.dom.DomHelper;
import it.pronetics.madstore.repository.index.PropertyPath;
import it.pronetics.madstore.repository.support.AtomIndexingException;

import java.io.InputStream;
import java.util.List;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;

/**
 * Low-level Lucene-based class for indexing Atom entry properties.
 * 
 * @author Salvatore Incandela
 * @author Sergio Bossa
 */
public class LuceneIndexer {

    private static final Logger LOG = LoggerFactory.getLogger(LuceneIndexer.class);
    private Directory directory;
    private List<PropertyPath> indexedProperties;

    public LuceneIndexer(Directory directory, List<PropertyPath> propertyPaths) {
        this.directory = directory;
        this.indexedProperties = propertyPaths;
    }

    public void index(String collectionKey, String entryKey, Element element) {
        if (collectionKey == null || entryKey == null || element == null) {
            throw new AtomIndexingException("Parameters collectionKey, entryKey and element cannot be null.");
        }
        try {
            IndexWriter indexWriter = newIndexWriter(directory);
            Document document = getDocumentFromElement(collectionKey, entryKey, element);
            indexWriter.addDocument(document);
            indexWriter.close();
        } catch (Exception e) {
            throw new AtomIndexingException(e.getMessage(), e);
        }
    }

    public void delete(String collectionKey, String entryKey) {
        try {
            if (collectionKey == null || entryKey == null) {
                throw new AtomIndexingException("Parameters collectionKey and entryKey cannot be null.");
            }
            Term primaryKeyTerm = new Term(LuceneIndexManager.INDEX_PRIMARY_KEY, collectionKey + entryKey);
            IndexWriter indexWriter = newIndexWriter(directory);
            indexWriter.deleteDocuments(primaryKeyTerm);
            indexWriter.close();
        } catch (Exception e) {
            throw new AtomIndexingException(e.getMessage(), e);
        }
    }

    private Document getDocumentFromElement(String collectionKey, String entryKey, Element element)
            throws Exception {
        Document doc = new Document();
        doc.add(new Field(LuceneIndexManager.INDEX_COLLECTION_KEY, collectionKey, Field.Store.YES,
                Field.Index.UN_TOKENIZED));
        doc.add(new Field(LuceneIndexManager.INDEX_ENTRY_KEY, entryKey, Field.Store.YES, Field.Index.UN_TOKENIZED));
        doc.add(new Field(LuceneIndexManager.INDEX_PRIMARY_KEY, collectionKey + entryKey, Field.Store.YES,
                Field.Index.UN_TOKENIZED));
        for (PropertyPath propertyPath : indexedProperties) {
            InputStream elementStream = DomHelper.getStreamFromDomElement(element);
            String value = propertyPath.getXPathExpression().evaluate(new InputSource(elementStream));
            Field field = new Field(propertyPath.getName(), value, Field.Store.YES, Field.Index.TOKENIZED);
            field.setBoost(propertyPath.getBoost());
            doc.add(field);
        }
        return doc;
    }

    private IndexWriter newIndexWriter(Directory directory) throws Exception {
        return new IndexWriter(directory, false, new StandardAnalyzer());
    }
}