org.compass.core.lucene.engine.manager.LuceneIndexHolder.java Source code

Java tutorial

Introduction

Here is the source code for org.compass.core.lucene.engine.manager.LuceneIndexHolder.java

Source

/*
 * Copyright 2004-2009 the original author or authors.
 *
 * 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 org.compass.core.lucene.engine.manager;

import java.util.concurrent.atomic.AtomicInteger;

import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.IndexSearcher;

/**
 * @author kimchy
 */
public class LuceneIndexHolder {

    private final IndexHoldersCache indexHoldersCache;

    private final String subIndex;

    private final IndexSearcher indexSearcher;

    private final IndexReader indexReader;

    private volatile long lastCacheInvalidation = System.currentTimeMillis();

    private volatile boolean invalidated;

    private int count = 0;

    private boolean markForClose = false;

    private boolean closed;

    public LuceneIndexHolder(IndexHoldersCache indexHoldersCache, String subIndex, IndexSearcher indexSearcher) {
        this.indexHoldersCache = indexHoldersCache;
        this.subIndex = subIndex;
        this.indexSearcher = indexSearcher;
        this.indexReader = indexSearcher.getIndexReader();
        if (indexHoldersCache.isDebug()) {
            AtomicInteger count = indexHoldersCache.getDebugHoldersCount().get(subIndex);
            if (count == null) {
                AtomicInteger newCount = new AtomicInteger();
                count = indexHoldersCache.getDebugHoldersCount().putIfAbsent(subIndex, newCount);
                if (count == null) {
                    count = newCount;
                }
            }
            count.incrementAndGet();
        }
    }

    public IndexSearcher getIndexSearcher() {
        return indexSearcher;
    }

    public IndexReader getIndexReader() {
        return indexReader;
    }

    public String getSubIndex() {
        return this.subIndex;
    }

    public synchronized boolean acquire() {
        if (markForClose) {
            return false;
        }
        count++;
        return true;
    }

    public synchronized void release() {
        count--;
        checkIfCanClose();
    }

    public synchronized void markForClose() {
        markForClose = true;
        checkIfCanClose();
    }

    public boolean isInvalidated() {
        return invalidated;
    }

    public void setInvalidated(boolean invalidated) {
        this.invalidated = invalidated;
    }

    private void checkIfCanClose() {
        if (markForClose && count <= 0 && !closed) {
            if (indexHoldersCache.isDebug()) {
                indexHoldersCache.getDebugHoldersCount().get(subIndex).decrementAndGet();
            }
            closed = true;
            try {
                indexSearcher.close();
            } catch (Exception e) {
                // do nothing
            }
            try {
                indexReader.close();
            } catch (Exception e) {
                // do nothing
            }
        }
    }

    public long getLastCacheInvalidation() {
        return lastCacheInvalidation;
    }

    public void markLastCacheInvalidation() {
        this.lastCacheInvalidation = System.currentTimeMillis();
    }
}