/*
 * (c) Copyright IBM Corp. 2000, 2002.
 * All Rights Reserved.
 */
package org.eclipse.help.internal.search;
import java.io.*;
import java.io.Reader;
import java.text.BreakIterator;
import java.util.*;
import java.util.List;

import org.apache.lucene.analysis.*;
import org.eclipse.help.internal.util.*;
import org.eclipse.help.internal.util.Logger;
/**
 * Lucene Analyzer.
 * LowerCaseTokenizer->WordTokenStream (uses word breaking in java.text)
 */
public class DefaultAnalyzer extends Analyzer {
	/**
	 * Constructor for Analyzer.
	 */
	private Locale locale;
	public DefaultAnalyzer(String localeString) {
		super();
		// Create a locale object for a given locale string
		Locale userLocale = getLocale(localeString);
		
		// Check if the locale is supported by BreakIterator
		// check here to do it only once.
		Locale[] availableLocales = BreakIterator.getAvailableLocales();
		for (int i = 0; i < availableLocales.length; i++) {
			if (userLocale.equals(availableLocales[i])) {
				locale = userLocale;
				break;
			}
		}

		if (locale == null) {
			// Locale is not supported, will use en_US
			Logger.logError(Resources.getString("ES24", localeString), null);
			locale = new Locale("en", "US");
		}
	}
	/**
	 * Creates a TokenStream which tokenizes all the text
	 * in the provided Reader.
	 */
	public final TokenStream tokenStream(String fieldName, Reader reader) {
		return new LowerCaseFilter(new WordTokenStream(fieldName, reader, locale));
	}
	
	/**
	 * Creates a Locale object out of a string representation
	 */
	private Locale getLocale(String localeString)
	{
		Locale locale;	

		if (localeString != null && localeString.length() >= 2) {
			String language = localeString.substring(0,2);
			String country;
			if (localeString.length() >= 5 && localeString.indexOf('_') == 2) 
				country = localeString.substring(3,5);
			else
				country = "";
			locale = new Locale(language, country);	
		}
		else
			locale = Locale.getDefault();
		
		return locale;
	}
}