001: /**
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */package org.apache.cocoon.components.search.analyzer;
017:
018: import java.io.Reader;
019:
020: import org.apache.avalon.framework.configuration.Configuration;
021: import org.apache.avalon.framework.configuration.ConfigurationException;
022: import org.apache.avalon.framework.logger.LogEnabled;
023: import org.apache.avalon.framework.logger.Logger;
024: import org.apache.cocoon.components.search.components.AnalyzerManager;
025: import org.apache.cocoon.components.search.utils.SourceHelper;
026: import org.apache.excalibur.source.Source;
027: import org.apache.lucene.analysis.Analyzer;
028: import org.apache.lucene.analysis.TokenStream;
029:
030: /**
031: * Analyzer Wrapper to allow to configure a lucene analyzer with a XML file
032: *
033: * @author Nicolas Maisonneuve
034: */
035: public abstract class ConfigurableAnalyzer extends Analyzer implements
036: LogEnabled {
037:
038: /**
039: * the lucene analyzer
040: */
041: protected Analyzer analyzer;
042:
043: /**
044: * a logger
045: */
046: protected Logger logger;
047:
048: /**
049: * the analyzer manager component
050: */
051: protected AnalyzerManager analyzerM;
052:
053: /**
054: * Check config file or not (to update the analyzer if the config file
055: * changes)
056: */
057: private boolean checkConfigFile = false;
058:
059: /**
060: * Configuration file source
061: */
062: private Source configFile;
063:
064: /**
065: * Configure this analyzer. this method is called in
066: *
067: * @see #reconfigure() method
068: */
069: protected abstract void configure(Configuration configuration)
070: throws ConfigurationException;
071:
072: /*
073: * (non-Javadoc)
074: *
075: * @see org.apache.lucene.analysis.Analyzer#tokenStream(java.lang.String,
076: * java.io.Reader)
077: */
078: public final TokenStream tokenStream(String fieldName, Reader reader) {
079: return analyzer.tokenStream(fieldName, reader);
080: }
081:
082: /*
083: * (non-Javadoc)
084: *
085: * @see org.apache.avalon.framework.logger.LogEnabled#enableLogging(org.apache.avalon.framework.logger.Logger)
086: */
087: public void enableLogging(Logger log) {
088: logger = log;
089: }
090:
091: /**
092: * Enable the check of the config file (to update the analyzer if the config
093: * file changes) when the method
094: *
095: * @see org.apache.cocoon.component.search.components.AnalyzerManager#getAnalyzer(String)
096: * is called
097: * @param check
098: * true if we want that
099: */
100: public void setEnableCheckFile(boolean check) {
101: this .checkConfigFile = check;
102: }
103:
104: /**
105: * is the checkFile property enable ?
106: */
107: public boolean enableCheckFile() {
108: return this .checkConfigFile;
109: }
110:
111: /**
112: * reconfigure the analyzer if the config file has changed
113: *
114: * @throws ConfigurationException
115: * @return boolean true if the analyzer is reconfigured (=file has changed)
116: * else false
117: */
118: public boolean reconfigure() throws ConfigurationException {
119: if (!SourceHelper.checkSourceValidity(configFile)) {
120: logger.info("reconfiguration of "
121: + this .getClass().getName() + " (the source "
122: + configFile.getURI() + " has changed...) ");
123: Configuration conf = SourceHelper.build(configFile);
124: configure(conf);
125: return true;
126: } else {
127: return false;
128: }
129: }
130:
131: /**
132: * Set the configuration file
133: *
134: * @param source
135: * Source configuration file
136: * @throws ConfigurationException
137: */
138: public void setConfigFile(Source source)
139: throws ConfigurationException {
140: this .configFile = source;
141: SourceHelper.registerSource(configFile);
142: configure(SourceHelper.build(configFile));
143: }
144:
145: /**
146: * set the analyzerManager
147: *
148: * @param analyzerM
149: * AnalyzerManager
150: */
151: public void setAnalyerManager(AnalyzerManager analyzerM) {
152: this.analyzerM = analyzerM;
153: }
154:
155: }
|