/* * Copyright 2002-2005 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.springmodules.lucene.search.core; import org.apache.lucene.search.Searcher; import org.springframework.beans.factory.InitializingBean; import org.springmodules.lucene.search.factory.SearcherFactory; import org.springmodules.lucene.search.factory.SearcherFactoryUtils; import org.springmodules.lucene.search.factory.SearcherHolder; import org.springmodules.resource.AbstractResourceManager; import org.springmodules.resource.support.ResourceBindingManager; /** * Dedicated resource manager for SearcherFactory. It allows the * application to manage the Lucene Searcher openings and closings. * * <p>Searcher is lazily opened at its first uses. * * @author Thierry Templier * @see org.springmodules.lucene.search.factory.SearcherFactory * @see org.springmodules.lucene.search.factory.SearcherFactoryUtils#getSearcher(SearcherFactory) * @see org.springmodules.lucene.search.factory.SearcherFactoryUtils#closeSearcherIfNecessary(SearcherFactory, Searcher) * @see org.springmodules.resource.support.ResourceBindingManager#getResource(Object) * @see org.springmodules.resource.support.ResourceBindingManager#bindResource(Object, Object) * @see org.springmodules.resource.support.ResourceBindingManager#unbindResource(Object) */ public class LuceneSearcherResourceManager extends AbstractResourceManager implements InitializingBean { private SearcherFactory searcherFactory; /** * Construct a new LuceneSearcherResourceManager for bean usage. * Note: The SearcherFactory has to be set before using the instance. * This constructor can be used to prepare a LuceneSearchTemplate via a BeanFactory, * typically setting the SearcherFactory via setSearcherFactory. * @see #setSearcherFactory(SearcherFactory) */ public LuceneSearcherResourceManager() { } /** * Construct a new LuceneSearcherResourceManager, given an SearcherFactory to manage * as a resource. * @param searcherFactory SearcherFactory to obtain Searcher */ public LuceneSearcherResourceManager(SearcherFactory searcherFactory) { setSearcherFactory(searcherFactory); } /** * Set the SearcherFactory that this instance manages resources for. */ public void setSearcherFactory(SearcherFactory searcherFactory) { this.searcherFactory = searcherFactory; } /** * Return the Lucene SearcherFactory that this instance manages resources for. */ public SearcherFactory getSearcherFactory() { return searcherFactory; } /** * Binds an empty SearcherHolder for the configured factory. The * corresponding Searcher resource will * be created lazily by a LuceneSearcherTemplate or a search query. * @see org.springmodules.resource.ResourceManager#open() */ public void doOpen() { SearcherHolder holder=new SearcherHolder(null); ResourceBindingManager.bindResource(this.searcherFactory, holder); } /** * Closes the opened Searcher, and unbind the * corresponding SearcherHolder. * @see org.springmodules.resource.ResourceManager#close() * @see SearcherFactoryUtils#releaseSearcher(SearcherFactory, Searcher) */ public void doClose() { SearcherHolder holder=(SearcherHolder)ResourceBindingManager.getResource(this.searcherFactory); // Remove the resource holder from the thread. ResourceBindingManager.unbindResource(this.searcherFactory); // Close searcher. Searcher searcher = holder.getSearcher(); if (logger.isDebugEnabled()) { logger.debug("Closing Lucene searcher [" + searcher + "]"); } SearcherFactoryUtils.releaseSearcher(this.searcherFactory,searcher); } /** * Check if the searcherFactory is set. */ public void afterPropertiesSet() throws Exception { if (this.searcherFactory == null) { throw new IllegalArgumentException("searcherFactory is required"); } } }