/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.cocoon.components.search.components.impl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.cocoon.components.search.IndexException;
import org.apache.lucene.document.Document;

/**
 * 
 * @author Nicolas Maisonneuve
 */
public class DefaultIndexerImpl extends AbstractIndexer implements Configurable {

    /**
     * Buffer size is element
     */
    static public final String DOCUMENT_BUFFERED_NUM_ELEMENT = "buffer_size";

    /**
     * the default size of the buffer
     */
    private int defaultMaxBufDocs = 100;

    /**
     * Buffer Size: the number of the maximum documents buffered, before to
     * flush and index this documents (the buffer is used in the update mode)
     */
    private int bufferSize;

    /**
     * the buffer: the List where are stored the documents
     */
    private List buffer = new ArrayList();

    /*
     * (non-Javadoc)
     * 
     * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
     */
    public void configure(Configuration conf) throws ConfigurationException {
        defaultMaxBufDocs = conf.getChild(DOCUMENT_BUFFERED_NUM_ELEMENT)
                .getValueAsInteger(100);
        if (this.getLogger().isDebugEnabled()) {
            this.getLogger().debug(
                    "default max buffered documents: " + defaultMaxBufDocs);
        }
    }

    /**
     * Set the maximum number of buffered documents to avoid to open and close
     * the IndexWriter a lot of times
     * 
     * @param value
     *            int number (default 100)
     */
    public void setBufferSize(int value) {
        bufferSize = value;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.apache.cocoon.components.search.components.impl.AbstractIndexer#release()
     */
    final protected void release() throws IndexException {
        // flush the last documents to update
        if (buffer.size() > 0) {
            flushBufferedDocs();
        }
        bufferSize = defaultMaxBufDocs;
        this.optimize();
        super.release();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.apache.cocoon.components.search.components.impl.AbstractIndexer#addDocument(org.apache.lucene.document.Document)
     */
    final protected void addDocument(Document doc) throws IndexException {
        switchToADD_MODE(false);
        addDocument(add_writer, doc);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.apache.cocoon.components.search.components.impl.AbstractIndexer#updateDocument(org.apache.lucene.document.Document)
     */
    final protected void updateDocument(Document doc) throws IndexException {
        // first delete the old document
        del(doc.get(DOCUMENT_UID_FIELD));

        // then store in the index queue
        buffer.add(doc);

        // flush the queue if it's necessary
        if (buffer.size() == bufferSize) {
            flushBufferedDocs();
        }
    }

    /**
     * Index the list of documents to update
     * 
     * @throws IOException
     */
    private void flushBufferedDocs() throws IndexException {
        this.switchToADD_MODE(false);
        Iterator iter = buffer.iterator();
        while (iter.hasNext()) {
            addDocument(add_writer, (Document) iter.next());
        }
        buffer.clear();
    }
}
