/**
* 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());
}
}