IndexSearcherBuilder.java

package sk.iway.iwcm.system.fulltext.lucene;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.lucene.search.IndexSearcher;

import sk.iway.iwcm.Logger;
import sk.iway.iwcm.system.fulltext.FulltextSearch;

/**
 * IndexSearcherBuilder.java
 *
 *@Title webjet7
 *@Company Interway s.r.o. (www.interway.sk)
 *@Copyright Interway s.r.o. (c) 2001-2011
 *@author $Author: jeeff thaber $
 *@version $Revision: 1.3 $
 *@created Date: 14.4.2011 9:47:26
 *@modified $Date: 2004/08/16 06:26:11 $
 */
public class IndexSearcherBuilder
{
	private static Map<String, IndexSearcher> searchers = new HashMap<>();
	private static Map<String, Integer> uses = new HashMap<>();
	private static boolean shouldRefresh = false;

	protected IndexSearcherBuilder() {
		//utility class
	}

	/**
	 * Vytvori IndexSearcher
	 * @param indexed
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public static IndexSearcher build(String langauge)
	{
		synchronized (searchers)
		{
			String key = langauge;
			boolean close = shouldRefresh; //toto sposobovalo problemy && (!uses.containsKey(key) || uses.get(key) == 0);

			if (uses.containsKey(key)) Logger.debug(IndexSearcherBuilder.class, "close="+close+" shouldRefresh="+shouldRefresh+" uses.get="+uses.get(key));

			if (close)
			{
				try
				{
					//musime pozatvarat vsetko, kedze shouldRefresh nenastavuje jazyk
					for (Entry<String, IndexSearcher> searcher : searchers.entrySet() )
					{
						try
						{
							//aby ked nam to padlo na jednom sme pokracovali dalej
							Logger.debug(IndexSearcherBuilder.class, "Closing index: "+searcher.getKey());
							searcher.getValue().close();
							searchers.remove(searcher.getKey());
							uses.remove(searcher.getKey());
						}
						catch (Exception e)
						{
							sk.iway.iwcm.Logger.error(e);
						}
					}
					shouldRefresh = false;
				}
				catch (Exception e)
				{
					//dost pruser, najbezpecnejsie je znova inicializovat mapy
					searchers = new HashMap<String, IndexSearcher>();
					uses = new HashMap<String, Integer>();

					sk.iway.iwcm.Logger.error(e);
				}
			}


			if (!searchers.containsKey(key))
			{
				try
				{
					searchers.put(key, new IndexSearcher(FulltextSearch.getIndexDirectory(langauge)));
				}
				catch (IOException e)
				{
					sk.iway.iwcm.Logger.error(e);
				}
			}
			if (uses.containsKey(key))
			{
				uses.put(key, uses.get(key) + 1);
			}
			else
			{
				uses.put(key,1);
			}
			return searchers.get(key);
		}
	}

	public static void refresh()
	{
		synchronized (searchers)
		{
			shouldRefresh = true;
		}
	}
	/**
	 * Zatvori IndexSearcher
	 * @param indexed
	 */
	public static void close(String language)
	{
		synchronized (searchers)
		{
			String key = language;
			if (uses.containsKey(key))
			{
				uses.put(key, uses.get(key) - 1);
			}
			else
			{
				uses.put(key, - 1);
			}
		}
	}
}