KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > nemesis > forum > search > Indexer


1 package org.nemesis.forum.search;
2
3 import java.io.File JavaDoc;
4 import java.io.IOException JavaDoc;
5 import java.util.Iterator JavaDoc;
6
7
8
9 import org.apache.commons.logging.Log;
10 import org.apache.commons.logging.LogFactory;
11 import org.apache.lucene.analysis.Analyzer;
12 import org.apache.lucene.analysis.StopAnalyzer;
13 import org.apache.lucene.index.IndexReader;
14 import org.apache.lucene.index.IndexWriter;
15 import org.apache.lucene.index.Term;
16 import org.nemesis.forum.Authorization;
17 import org.nemesis.forum.Forum;
18 import org.nemesis.forum.ForumFactory;
19 import org.nemesis.forum.ForumThread;
20 import org.nemesis.forum.Message;
21 import org.nemesis.forum.TreeWalker;
22 import org.nemesis.forum.impl.DbForumMessage;
23 import org.nemesis.forum.impl.DbForumThread;
24 import org.nemesis.forum.config.ConfigLoader;
25 import org.nemesis.forum.config.Constants;
26 import org.nemesis.forum.event.ForumEvent;
27 import org.nemesis.forum.event.ForumListener;
28 import org.nemesis.forum.exception.UnauthorizedException;
29
30 /**
31  * @author dlaurent
32  *
33  *
34  */

35 public class Indexer implements ForumListener {
36
37     static protected Log log = LogFactory.getLog(Indexer.class);
38     private static boolean autoIndex=ConfigLoader.getInstance().getConfig().isAutoIndex();
39     
40     final private static String JavaDoc PATH = ConfigLoader.getInstance().getConfig().getDataDir() + File.separator + "index";
41
42     private static Object JavaDoc indexLock = new Object JavaDoc();
43
44     private static Analyzer analyzer = new StopAnalyzer();
45
46     static {
47         Indexer i = new Indexer();
48         DbForumMessage.addListener(i);
49         DbForumThread.addListener(i);
50     }
51
52     public void objectCreated(ForumEvent event) {
53         log.debug("Indexer.objectCreated()");
54         if (autoIndex)
55         index((Message) event.getSource());
56     }
57
58     public void objectModified(ForumEvent event) {
59         log.debug("Indexer.objectModified()");
60         if (!autoIndex)return;
61         remove((Message) event.getSource());
62         index((Message) event.getSource());
63     }
64
65     public void objectDeleted(ForumEvent event) {
66         log.debug("Indexer.objectDeleted()");
67         if (autoIndex)
68         remove((Message) event.getSource());
69     }
70
71     private static void remove(Message m) {
72         //remove recursive from index if doc not approved
73
TreeWalker walker = m.getForumThread().treeWalker();
74         removeFromIndex(m, walker);
75     }
76
77     private static void removeFromIndex(Message m, TreeWalker walker) {
78
79         synchronized (indexLock) {
80             log.debug("Indexer.removeFromIndex()" + m.getID());
81             Term term = new Term("messageID", m.getID() + "");
82             try {
83                 IndexReader reader = IndexReader.open(new File JavaDoc(PATH));
84                 reader.delete(term);
85                 reader.close();
86             } catch (IOException JavaDoc e) {
87                 log.error("impossible de supprimer le message " + m.getID() + " de l'index ", e);
88             }
89         }
90
91         for (int i = 0; i < walker.getChildCount(m); i++) {
92             removeFromIndex(walker.getChild(m, i), walker);
93         }
94
95     }
96
97     private static void index(Message m) {
98         TreeWalker walker = m.getForumThread().treeWalker();
99         addToIndex(m, walker);
100
101     }
102
103     private static void addToIndex(Message m, TreeWalker walker) {
104
105         if (!m.isApproved())
106             return;
107
108         synchronized (indexLock) {
109             log.debug("Indexer.addFromIndex()" + m.getID());
110             IndexWriter writer = null;
111             try {
112
113                 if (IndexReader.indexExists(PATH)) {
114                     writer = new IndexWriter(new File JavaDoc(PATH), new StopAnalyzer(), false);
115                 } else {
116                     writer = new IndexWriter(new File JavaDoc(PATH), new StopAnalyzer(), true);
117                 }
118                 writer.addDocument(MessageDocument.getDocument(m));
119
120             } catch (Exception JavaDoc e) {
121                 log.error("addToIndex", e);
122             } finally {
123                 try {
124                     writer.close();
125                 } catch (Exception JavaDoc e) {
126                 }
127             }
128
129         }
130
131         for (int i = 0; i < walker.getChildCount(m); i++) {
132             addToIndex(walker.getChild(m, i), walker);
133         }
134
135     }
136
137     public static void flush(Authorization auth) throws UnauthorizedException{
138         ForumFactory forumFactory = ForumFactory.getInstance(auth);
139         if(! forumFactory.getPermissions(auth).get(Constants.SYSTEM_ADMIN)) throw new UnauthorizedException();
140         try {
141             IndexWriter writer = new IndexWriter(new File JavaDoc(PATH), new StopAnalyzer(), true);
142             writer.close();
143         } catch (IOException JavaDoc e) {
144             log.error("impossible de flusher l'index ", e);
145         }
146     }
147     
148     public static void reindex(Authorization auth) throws UnauthorizedException{
149         ForumFactory forumFactory = ForumFactory.getInstance(auth);
150         if(! forumFactory.getPermissions(auth).get(Constants.SYSTEM_ADMIN)) throw new UnauthorizedException();
151         //ok system admin
152
flush(auth);
153         Forum f=null;
154         ForumThread ft=null;
155         for(Iterator JavaDoc it=forumFactory.forums();it.hasNext();){
156             f=(Forum)it.next();
157             for(Iterator JavaDoc it2=f.threads();it2.hasNext();){
158                 ft=(ForumThread)it2.next();
159                 index(ft.getRootMessage());
160             }
161         }
162         
163         
164     }
165
166     /**
167      * @return
168      */

169     public static boolean isAutoIndex() {
170         return autoIndex;
171     }
172
173     /**
174      * @param b
175      */

176     public static void setAutoIndex(boolean b,Authorization auth) throws UnauthorizedException {
177         ForumFactory forumFactory = ForumFactory.getInstance(auth);
178         if(! forumFactory.getPermissions(auth).get(Constants.SYSTEM_ADMIN)) throw new UnauthorizedException();
179         autoIndex = b;
180     }
181
182 }
183
Popular Tags