/*
* 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 java.io.IOException;
import org.apache.commons.lang.Validate;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;
import org.xcmis.search.config.SearchServiceConfiguration;
import org.xcmis.search.content.interceptors.QueryableIndexStorage;
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 org.xcmis.search.lucene.index.StartableIndexingService;
import org.xcmis.spi.utils.Logger;
/**
* Lucene persisted implementation of {@link QueryableIndexStorage}.
*
*/
public class LuceneQueryableIndexStorage extends AbstractLuceneQueryableIndexStorage
{
/**
* Class logger.
*/
private static final Logger LOG = Logger.getLogger(LuceneQueryableIndexStorage.class);
private final StartableIndexingService indexDataManager;
/**
* @param indexConfuguration
* @throws IndexException
* @throws org.xcmis.search.lucene.index.IndexException
*/
public LuceneQueryableIndexStorage(SearchServiceConfiguration serviceConfuguration) throws IndexException
{
super(serviceConfuguration);
Validate.notNull(serviceConfuguration.getIndexConfuguration().getIndexDir(),
"The IndexDir may not be null in IndexConfiguration");
this.indexDataManager =
new StartableIndexingService(serviceConfuguration.getIndexConfuguration(), new IndexRecoveryTool(this,
nodeIndexer, serviceConfuguration.getIndexConfuguration()));
}
/**
* @see org.xcmis.search.content.interceptors.CommandInterceptor#start()
*/
@Override
public void start()
{
super.start();
this.indexDataManager.start();
}
/**
* @see org.xcmis.search.content.interceptors.CommandInterceptor#stop()
*/
@Override
public void stop()
{
super.stop();
this.indexDataManager.stop();
}
/**
*
* @see org.xcmis.search.lucene.AbstractLuceneQueryableIndexStorage#getIndexReader()
*/
@Override
protected IndexReader getIndexReader() throws IndexException
{
return indexDataManager.getIndexReader();
}
protected Document getDocument(String uuid, IndexReader reader) throws IndexException
{
try
{
if (reader != null)
{
final TermDocs termDocs = reader.termDocs(new Term(FieldNames.UUID, uuid));
if (termDocs.next())
{
final Document document = reader.document(termDocs.doc());
if (termDocs.next())
{
throw new IndexException("More then one document found for uuid:" + uuid);
}
return document;
}
}
}
catch (final IOException e)
{
throw new IndexException(e.getLocalizedMessage(), e);
}
return null;
}
/**
* @throws IndexTransactionException
* @throws IndexException
* @see org.xcmis.search.lucene.AbstractLuceneQueryableIndexStorage#save(org.xcmis.search.lucene.index.LuceneIndexTransaction)
*/
@Override
protected Object save(LuceneIndexTransaction indexTransaction) throws IndexException, IndexTransactionException
{
return indexDataManager.save(indexTransaction);
}
}