KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > mvnforum > search > member > MemberIndexer


1 /*
2  * $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/search/member/MemberIndexer.java,v 1.12 2006/04/14 17:05:27 minhnn Exp $
3  * $Author: minhnn $
4  * $Revision: 1.12 $
5  * $Date: 2006/04/14 17:05:27 $
6  *
7  * ====================================================================
8  *
9  * Copyright (C) 2002-2006 by MyVietnam.net
10  *
11  * All copyright notices regarding mvnForum MUST remain
12  * intact in the scripts and in the outputted HTML.
13  * The "powered by" text/logo with a link back to
14  * http://www.mvnForum.com and http://www.MyVietnam.net in
15  * the footer of the pages MUST remain visible when the pages
16  * are viewed on the internet or intranet.
17  *
18  * This program is free software; you can redistribute it and/or modify
19  * it under the terms of the GNU General Public License as published by
20  * the Free Software Foundation; either version 2 of the License, or
21  * any later version.
22  *
23  * This program is distributed in the hope that it will be useful,
24  * but WITHOUT ANY WARRANTY; without even the implied warranty of
25  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26  * GNU General Public License for more details.
27  *
28  * You should have received a copy of the GNU General Public License
29  * along with this program; if not, write to the Free Software
30  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31  *
32  * Support can be obtained from support forums at:
33  * http://www.mvnForum.com/mvnforum/index
34  *
35  * Correspondence and Marketing Questions can be sent to:
36  * info at MyVietnam net
37  *
38  * @author: Minh Nguyen
39  * @author: Dejan Krsmanovic dejan_krsmanovic@yahoo.com
40  */

41 package com.mvnforum.search.member;
42
43 import java.io.IOException JavaDoc;
44
45 import net.myvietnam.mvncore.exception.SearchException;
46 import net.myvietnam.mvncore.util.DateUtil;
47 import net.myvietnam.mvncore.util.TimerUtil;
48
49 import org.apache.commons.logging.Log;
50 import org.apache.commons.logging.LogFactory;
51 import org.apache.lucene.analysis.Analyzer;
52 import org.apache.lucene.analysis.standard.StandardAnalyzer;
53 import org.apache.lucene.document.*;
54 import org.apache.lucene.index.*;
55 import org.apache.lucene.search.IndexSearcher;
56
57 import com.mvnforum.*;
58 import com.mvnforum.db.MemberBean;
59
60 public class MemberIndexer
61 {
62     private static Log log = LogFactory.getLog(MemberIndexer.class);
63
64     //Field names (used for indexing)
65
public static final String JavaDoc FIELD_MEMBER_ID = "MemberID";
66     public static final String JavaDoc FIELD_MEMBER_NAME = "MemberName";
67     public static final String JavaDoc FIELD_CREATION_DATE = "MemberCreationDate";
68     public static final String JavaDoc FIELD_MEMBER_EMAIL = "MemberEmail";
69     public static final String JavaDoc FIELD_MEMBER_LASTNAME = "MemberLastName";
70     public static final String JavaDoc FIELD_MEMBER_FIRSTNAME = "MemberFirstName";
71     public static final String JavaDoc FIELD_MEMBER_COUNTRY = "MemberCountry";
72
73     //public static final String PROPERTY_SEARCH_PATH = "search.path";
74
//public static final String PROPERTY_SEARCH_AUTOINDEX = "search.autoindex";
75

76     //Timer is used for scheduling jobs
77
private static Analyzer analyzer;
78
79     private static long lastOptimizeTime = 0;
80
81     static {
82         initializeAnalyzer();
83     }
84
85     public static void scheduleAddMemberTask(MemberBean MemberBean) {
86         AddUpdateMemberIndexTask task = new AddUpdateMemberIndexTask(MemberBean, AddUpdateMemberIndexTask.OPERATION_ADD);
87         TimerUtil.getInstance().schedule(task, 0);
88     }
89
90     public static void scheduleUpdateMemberTask(MemberBean MemberBean) {
91         AddUpdateMemberIndexTask task = new AddUpdateMemberIndexTask(MemberBean, AddUpdateMemberIndexTask.OPERATION_UPDATE);
92         TimerUtil.getInstance().schedule(task, 0);
93     }
94
95     public static void scheduleDeleteMemberTask(int objectID) {
96         DeleteMemberIndexTask task = new DeleteMemberIndexTask(objectID);
97         TimerUtil.getInstance().schedule(task, 0);
98     }
99
100     public static void scheduleRebuildIndexTask() {
101         int maxMemberID = 0;
102         RebuildMemberIndexTask task = new RebuildMemberIndexTask(maxMemberID);
103         TimerUtil.getInstance().schedule(task, 0);
104     }
105
106     static Analyzer getAnalyzer() {
107         return analyzer;
108     }
109
110     /**
111      * This class will load analyzer when starting. If specified analyzer class
112      * cannot be loaded then default analyzer will be used.
113      */

114     private static void initializeAnalyzer() {
115         String JavaDoc analyzerClassName = MVNForumFactoryConfig.getLuceneAnalyzerClassName();
116         if ( (analyzerClassName == null) || (analyzerClassName.equals("")) ) {
117             //create standard analyzer
118
//String[] stopWords = this.loadStopWords();
119
analyzer = new StandardAnalyzer();
120             log.debug("Using StandardAnalyzer for indexing");
121         } else {
122             //try to create specified analyzer
123
try {
124                 log.debug("About to load Analyzer [" + analyzerClassName + "] for indexing");
125                 analyzer = (Analyzer) Class.forName(analyzerClassName).newInstance();
126             } catch (Exception JavaDoc e) {
127                 log.warn("Cannot load " + analyzerClassName + ". Loading StandardAnalyzer");
128                 analyzer = new StandardAnalyzer();
129             }
130         }
131     }
132
133     /**
134      * This method is used for getting new IndexWriter. It can create new index
135      * or add Member to existing index. Creating new index will delete previous so it
136      * should be used for rebuilding index.
137      * @param create - true if new index should be created.
138      * - false for adding companies to existing index
139      * @return IndexWriter object that is used for adding companies to index
140      */

141     static IndexWriter getIndexWriter(boolean create) throws SearchException {
142         IndexWriter writer = null;
143
144         //If create = false, we will create IndexWriter with false argument
145
if (create == false) {
146             try {
147                 writer = new IndexWriter(MVNForumConfig.getSearchMemberIndexDir(), analyzer, false);
148                 if (MVNForumConfig.getSearchMemberIndexType() == MVNForumGlobal.SEARCH_INDEX_TYPE_DISK) {
149                     writer.setUseCompoundFile(true);
150                 }
151                 return writer;
152             } catch (IOException JavaDoc e) {
153                 log.warn("Cannot open existed index. New index will be created.", e);
154                 //Ignore Exception. We will try to create index with true parameter
155
}
156         }
157         // We are here in two cases: We wanted to create new index or because
158
// index doesn't existed
159
try {
160             //This will create new index and delete existing
161
writer = new IndexWriter(MVNForumConfig.getSearchMemberIndexDir(true), analyzer, true);
162             if (MVNForumConfig.getSearchMemberIndexType() == MVNForumGlobal.SEARCH_INDEX_TYPE_DISK) {
163                 writer.setUseCompoundFile(true);
164             }
165             return writer;
166         } catch (IOException JavaDoc e) {
167             throw new SearchException("Error while creating index writer");
168         }
169     }
170
171     /**
172      * This method is used for adding single Member to index
173      * Note: this method doesnt close the writer
174      * @param MemberBean A Member that should be indexed
175      * @param writer IndexWriter that is used for storing
176      * @throws SearchException
177      */

178     static void doIndexMember(MemberBean memberBean, IndexWriter writer) throws SearchException {
179         if (memberBean == null) return;
180         if ( memberBean.getMemberName() == null || memberBean.getMemberName().equals("") ||
181              (memberBean.getMemberCreationDate() == null)) {
182             return;
183         }
184
185         //Each Member will be represented as a document
186
Document memberDocument = new Document();
187         //Document has following fields that could be queried on
188
memberDocument.add(Field.Keyword(FIELD_MEMBER_ID, Integer.toString(memberBean.getMemberID())));
189         memberDocument.add(Field.UnStored(FIELD_MEMBER_NAME, memberBean.getMemberName()));
190         memberDocument.add(Field.UnStored(FIELD_MEMBER_EMAIL, memberBean.getMemberEmail()));
191         memberDocument.add(Field.UnStored(FIELD_MEMBER_LASTNAME, memberBean.getMemberLastname()));
192         memberDocument.add(Field.UnStored(FIELD_MEMBER_FIRSTNAME, memberBean.getMemberFirstname()));
193         memberDocument.add(Field.UnStored(FIELD_MEMBER_COUNTRY, memberBean.getMemberCountry()));
194         memberDocument.add(Field.Keyword(FIELD_CREATION_DATE, DateField.dateToString(memberBean.getMemberCreationDate())));//MemberBean.getMemberCreationDate())); // DateField.dateToString(MemberBean.getMemberCreationDate())));
195
//now we have created document with fields so we can store it
196
try {
197             writer.addDocument(memberDocument);
198         } catch (IOException JavaDoc e) {
199             log.error("MemberIndexer.doIndexMember failed", e);
200             throw new SearchException("Error writing new Member to index");
201         }
202     }
203
204     /**
205      * Add single Member to index
206      * @param MemberBean
207      * @throws SearchException
208      */

209     static void addMemberToIndex(MemberBean memberBean) throws SearchException, IOException JavaDoc {
210         IndexWriter writer = null;
211         try {
212             writer = getIndexWriter(false);
213             if (writer == null) {
214                 log.warn("Cannot get the IndexWriter");
215                 return;
216             }
217             doIndexMember(memberBean, writer);
218
219             // now check if we should optimize index (each hour)
220
long now = System.currentTimeMillis();
221             long timeFromLastOptimize = now - lastOptimizeTime;
222             if (timeFromLastOptimize > DateUtil.HOUR) {
223                 log.debug("writer.optimize() called in addMemberToIndex");
224                 writer.optimize();
225                 lastOptimizeTime = now;
226             }
227         } catch (SearchException ex) {
228             throw ex;
229         } finally {
230             try {
231                 if (writer != null) {
232                     writer.close();
233                 }
234             } catch (IOException JavaDoc e) {
235             }
236         }
237     }
238
239     /**
240      * This method is used for deleting Member from index.
241      * @param MemberID is id of the Member that should be deleted
242      * @throws SearchException
243      */

244     static void deleteMemberFromIndex(int memberID) throws SearchException {
245         IndexReader reader = null;
246         try {
247             reader = IndexReader.open(MVNForumConfig.getSearchMemberIndexDir());
248             if (reader == null) {
249                 log.warn("Cannot get the IndexReader");
250                 return;
251             }
252
253             Term term = new Term(FIELD_MEMBER_ID, String.valueOf(memberID));
254             int deletedCount = reader.delete(term);
255             log.debug("deleteMemberFromIndex: deleted member = " + deletedCount);
256         } catch (IOException JavaDoc e) {
257             throw new SearchException("Error trying to delete Member with memberID = " + memberID);
258         } finally {
259             try {
260                 if (reader != null) {
261                     reader.close();
262                 }
263             } catch (IOException JavaDoc e) {
264             }
265         }
266     }
267
268     public static IndexSearcher getSearcher() throws IOException JavaDoc {
269         try {
270             IndexSearcher searcher = new IndexSearcher(MVNForumConfig.getSearchMemberIndexDir());
271             return searcher;
272         } catch (IOException JavaDoc ex) {
273             // we throw new IOException because the original exception
274
// contain sensitive directory information
275
log.error("Cannot access the lucene search index for query. Please check if you have configed mvnForumHome properly. You can also go to Admin Zone to rebuild the Lucene index files.", ex);
276             //@todo : localize me
277
throw new IOException JavaDoc("Cannot access the lucene search index. Please report this error to web site Administrator (check mvnForumHome or rebuild Lucene index).");
278         }
279     }
280
281     public static int getNumDocs() {
282         int numDocs = -1;
283         IndexReader reader = null;
284         try {
285             reader = IndexReader.open(MVNForumConfig.getSearchMemberIndexDir());
286             if (reader == null) {
287                 log.warn("Cannot get the IndexReader");
288                 return -1;
289             }
290             numDocs = reader.numDocs();
291         } catch ( IOException JavaDoc ioe) {
292             //ignore
293
} finally {
294             try {
295                 if (reader != null) reader.close();
296             } catch (IOException JavaDoc e) {
297                 log.debug("Error closing Lucene IndexReader", e);
298             }
299         }
300         return numDocs;
301     }
302
303 }
304
Popular Tags