001/**
002 *
003 * Copyright (c) 2014, the Railo Company Ltd. All rights reserved.
004 *
005 * This library is free software; you can redistribute it and/or
006 * modify it under the terms of the GNU Lesser General Public
007 * License as published by the Free Software Foundation; either 
008 * version 2.1 of the License, or (at your option) any later version.
009 * 
010 * This library is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
013 * Lesser General Public License for more details.
014 * 
015 * You should have received a copy of the GNU Lesser General Public 
016 * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
017 * 
018 **/
019package lucee.runtime.search.lucene2;
020
021import java.util.Map;
022
023import lucee.commons.collection.MapFactory;
024import lucee.commons.lang.ClassUtil;
025import lucee.commons.lang.StringUtil;
026import lucee.runtime.search.SearchException;
027import lucee.runtime.search.lucene2.analyzer.DanishAnalyzer;
028import lucee.runtime.search.lucene2.analyzer.ItalianAnalyzer;
029import lucee.runtime.search.lucene2.analyzer.NorwegianAnalyzer;
030import lucee.runtime.search.lucene2.analyzer.PortugueseAnalyzer;
031import lucee.runtime.search.lucene2.analyzer.SpanishAnalyzer;
032
033import org.apache.lucene.analysis.Analyzer;
034import org.apache.lucene.analysis.br.BrazilianAnalyzer;
035import org.apache.lucene.analysis.cjk.CJKAnalyzer;
036import org.apache.lucene.analysis.cn.ChineseAnalyzer;
037import org.apache.lucene.analysis.cz.CzechAnalyzer;
038import org.apache.lucene.analysis.de.GermanAnalyzer;
039import org.apache.lucene.analysis.el.GreekAnalyzer;
040import org.apache.lucene.analysis.fr.FrenchAnalyzer;
041import org.apache.lucene.analysis.nl.DutchAnalyzer;
042import org.apache.lucene.analysis.ru.RussianAnalyzer;
043import org.apache.lucene.analysis.snowball.SnowballAnalyzer;
044import org.apache.lucene.analysis.standard.StandardAnalyzer;
045import org.apache.lucene.analysis.th.ThaiAnalyzer;
046public final class SearchUtil {
047
048        private static Map<String,Analyzer> analyzers=MapFactory.<String,Analyzer>getConcurrentMap();
049        
050        public static Analyzer getAnalyzer(String language) throws SearchException {
051        if(language==null)language="english";
052        else language=language.toLowerCase().trim();
053        language=lucee.runtime.search.SearchUtil.translateLanguage(language);
054                
055        Analyzer analyzer=analyzers.get(language);
056        if(analyzer!=null) return analyzer;
057        
058        
059        if(language.equals("english"))
060                analyzer= new StandardAnalyzer();
061        else if(language.equals("german"))              
062                analyzer= new GermanAnalyzer();
063        else if(language.equals("russian"))     
064                analyzer= new RussianAnalyzer();
065        else if(language.equals("dutch"))               
066                analyzer= new DutchAnalyzer();
067        else if(language.equals("french"))              
068                analyzer= new FrenchAnalyzer();
069        else if(language.equals("norwegian"))   
070                analyzer= new NorwegianAnalyzer();
071        else if(language.equals("portuguese"))  
072                analyzer= new PortugueseAnalyzer();
073        else if(language.equals("spanish"))     
074                analyzer= new SpanishAnalyzer();
075        else if(language.equals("brazilian"))   
076                analyzer= new BrazilianAnalyzer();
077        else if(language.equals("chinese"))     
078                analyzer= new ChineseAnalyzer();
079        else if(language.startsWith("czech"))   
080                analyzer= new CzechAnalyzer();
081        else if(language.equals("greek"))               
082                analyzer= new GreekAnalyzer();
083        else if(language.equals("thai"))
084                analyzer= new ThaiAnalyzer();
085        else if(language.equals("japanese"))
086                analyzer= new CJKAnalyzer();
087        else if(language.equals("korean"))
088                analyzer= new CJKAnalyzer();
089
090        else if(language.equals("italian"))
091                analyzer= new ItalianAnalyzer();
092        else if(language.equals("danish"))
093                analyzer= new DanishAnalyzer();
094        else if(language.equals("norwegian"))
095                analyzer= new NorwegianAnalyzer();
096        else if(language.equals("finnish"))
097                analyzer= new SnowballAnalyzer( "Finnish" );
098        else if(language.equals("swedish"))
099                analyzer= new SnowballAnalyzer( "Swedish" );
100        
101        
102        else {
103                String clazzName="org.apache.lucene.analysis.el."+StringUtil.ucFirst(language.trim().toLowerCase())+"Analyzer;";
104                Object o=ClassUtil.loadInstance(clazzName,(Object)null);
105            if(o==null){
106                clazzName="lucee.runtime.search.lucene2.analyzer."+StringUtil.ucFirst(language.trim().toLowerCase())+"Analyzer";
107                o=ClassUtil.loadInstance(clazzName,(Object)null);//Class.orName(clazzName).newInstance();
108                }
109            if(o instanceof Analyzer) analyzer=(Analyzer) o;
110            else if(o==null) 
111                 throw new SearchException("can't create Language Analyzer for Lanuage "+language+", make Analyzer ["+clazzName+"] available");
112            else 
113                throw new SearchException( "can't create Language Analyzer for Lanuage "+language+", Analyzer ["+clazzName+"] is of invalid type");
114        }        
115        analyzers.put(language, analyzer);
116        return analyzer;
117    }
118}