001: /*
002:
003: * LIUS - Lucene Index Update and Search
004: * http://sourceforge.net/projects/lius/
005: *
006: * Copyright (c) 2005, Laval University Library. All rights reserved.
007: *
008: * This library is free software; you can redistribute it and/or
009: * modify it under the terms of the GNU Lesser General Public
010: * License as published by the Free Software Foundation; either
011: * version 2.1 of the License, or (at your option) any later version.
012: *
013: * This library is distributed in the hope that it will be useful,
014: * but WITHOUT ANY WARRANTY; without even the implied warranty of
015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
016: * Lesser General Public License for more details.
017: *
018: * You should have received a copy of the GNU Lesser General Public
019: * License along with this library; if not, write to the Free Software
020: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
021: */
022:
023: package ca.ulaval.bibl.lius.Lucene;
024:
025: import java.lang.reflect.Constructor;
026:
027: import org.apache.log4j.Logger;
028: import org.apache.lucene.analysis.Analyzer;
029:
030: import ca.ulaval.bibl.lius.config.LiusConfig;
031:
032: /**
033: *
034: * @author Rida Benjelloun (rida.benjelloun@bibl.ulaval.ca)
035: *
036: */
037:
038: public class AnalyzerFactory {
039:
040: static Logger logger = Logger.getRootLogger();
041:
042: /**
043: *
044: * Méthode se basant sur la réflexion. Elle retourne un objet de type
045: *
046: * "Analyzer" en se basant sur le nom de classe
047: *
048: * entré par l'utilisateur dans le fichier de configuration.
049: *
050: * Elle permet également de construire un objet analyzer en utilisant une
051: *
052: * liste de mots vides, ceci se fait en appelant un constructeur qui se base
053: *
054: * sur un tableau de mots vides. Le tableau de mots vides est construit à
055: * patir
056: *
057: * du fichier de configuration.
058: *
059: * <br/><br/>
060: *
061: * Method that bases itself on reflection. It returns an Analyzer object
062: * based
063: *
064: * from the class name given by the configuration file. Also, the
065: * constructed
066: *
067: * Analyser object can be based on a list of stop words, by calling a
068: * constructor
069: *
070: * based on stop words. The list of stop words is taken form the
071: * configuration file.
072: *
073: */
074:
075: public static Analyzer getAnalyzer(LiusConfig xc) {
076:
077: if (xc == null)
078:
079: System.out.println("xc = null");
080:
081: Analyzer an = null;
082:
083: try {
084:
085: Class classe = Class.forName(xc.getAnalyzer());
086:
087: Object analyzerInstance = null;
088:
089: if (xc.getStopWord() != null) {
090:
091: Constructor[] con = classe.getConstructors();
092:
093: for (int i = 0; i < con.length; i++) {
094:
095: Class[] conParam = con[i].getParameterTypes();
096:
097: if (conParam.length == 0 && an == null) {
098:
099: analyzerInstance = classe.newInstance();
100:
101: an = (Analyzer) analyzerInstance;
102:
103: logger.info("L'analyseur : " + xc.getAnalyzer()
104: +
105:
106: " ne prend pas de mots vides");
107:
108: }
109:
110: else {
111:
112: for (int j = 0; j < conParam.length; j++) {
113:
114: if (conParam[j].getName().equals(
115: "[Ljava.lang.String;")) {
116:
117: an = (Analyzer) con[i]
118: .newInstance(new Object[] { xc
119: .getStopWord() });
120:
121: }
122:
123: }
124:
125: }
126:
127: }
128:
129: }
130:
131: else {
132:
133: analyzerInstance = classe.newInstance();
134:
135: an = (Analyzer) analyzerInstance;
136:
137: }
138:
139: }
140:
141: catch (ClassNotFoundException e) {
142:
143: logger.error("ClassNotFoundException" + e.getMessage());
144:
145: }
146:
147: catch (InstantiationException e) {
148:
149: logger.error("La classe est abstract ou est une interface" +
150:
151: e.getMessage());
152:
153: }
154:
155: catch (IllegalAccessException e) {
156:
157: logger.error("La classe n'est pas accessible"
158: + e.getMessage());
159:
160: }
161:
162: catch (java.lang.reflect.InvocationTargetException e) {
163:
164: logger
165: .error(" Exception déclenchée si le constructeur invoqué"
166: +
167:
168: e.getMessage());
169:
170: }
171:
172: catch (IllegalArgumentException e) {
173:
174: logger.error(" Mauvais type de paramètre" + e.getMessage());
175:
176: }
177:
178: return an;
179:
180: }
181:
182: }
|