/* * Copyright (C) 2010 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This software is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this software; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF * site: http://www.fsf.org. */ package org.xcmis.search.lucene; import org.apache.lucene.analysis.SimpleAnalyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.index.IndexWriter.MaxFieldLength; import org.apache.lucene.store.LockObtainFailedException; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.Version; import org.xcmis.search.config.SearchServiceConfiguration; import org.xcmis.search.content.IndexModificationException; import org.xcmis.search.lucene.index.FieldNames; import org.xcmis.search.lucene.index.IndexException; import org.xcmis.search.lucene.index.IndexTransactionException; import org.xcmis.search.lucene.index.LuceneIndexTransaction; import java.io.IOException; import java.util.Map.Entry; /** * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a> * @version $Id: InMemoryLuceneQueryableIndexStorage.java 34360 2009-07-22 23:58:59Z * aheritier $ * */ public class InMemoryLuceneQueryableIndexStorage extends AbstractLuceneQueryableIndexStorage { /** * Lucene in memory index directory. */ private final RAMDirectory ramDirectory; private IndexReader indexReader; /** * @param serviceConfuguration * @throws IndexException */ public InMemoryLuceneQueryableIndexStorage(SearchServiceConfiguration serviceConfuguration) throws IndexException { super(serviceConfuguration); this.ramDirectory = new RAMDirectory(); initDirectory(); } /** * @throws IndexException */ private void initDirectory() throws IndexException { try { IndexWriter.MaxFieldLength fieldLength = new IndexWriter.MaxFieldLength(IndexWriter.DEFAULT_MAX_FIELD_LENGTH); IndexWriter iw = new IndexWriter(ramDirectory, new SimpleAnalyzer(), true, fieldLength); iw.close(); } catch (IOException e) { throw new IndexException(e.getLocalizedMessage(), e); } } /** * @throws IndexException * @see org.xcmis.search.lucene.AbstractLuceneQueryableIndexStorage#getIndexReader() */ @Override protected IndexReader getIndexReader() throws IndexException { try { // reopen if need if (this.indexReader == null) { this.indexReader = IndexReader.open(this.ramDirectory); } else if (!this.indexReader.isCurrent()) { this.indexReader = this.indexReader.reopen(); } } catch (CorruptIndexException e) { throw new IndexException(e.getLocalizedMessage(), e); } catch (IOException e) { throw new IndexException(e.getLocalizedMessage(), e); } return indexReader; } /** * @throws IndexException * @see org.xcmis.search.lucene.AbstractLuceneQueryableIndexStorage#save(org.xcmis.search.lucene.index.LuceneIndexTransaction) */ @Override protected synchronized Object save(LuceneIndexTransaction indexTransaction) throws IndexException, IndexTransactionException { try { IndexWriter writer = new IndexWriter(ramDirectory, new StandardAnalyzer(Version.LUCENE_35), MaxFieldLength.UNLIMITED); // removed for (final String uuid : indexTransaction.getRemovedDocuments()) { writer.deleteDocuments(new Term(FieldNames.UUID, uuid)); } // added for (final Entry<String, Document> entry : indexTransaction.getAddedDocuments().entrySet()) { writer.updateDocument(new Term(FieldNames.UUID, entry.getKey()), entry.getValue()); } writer.commit(); writer.close(); } catch (CorruptIndexException e) { throw new IndexModificationException(e.getLocalizedMessage(), e); } catch (LockObtainFailedException e) { throw new IndexModificationException(e.getLocalizedMessage(), e); } catch (IOException e) { throw new IndexModificationException(e.getLocalizedMessage(), e); } return new Object(); } }