1 package org.nemesis.forum.search; 2 3 import java.io.File ; 4 import java.io.IOException ; 5 import java.util.Iterator ; 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 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 PATH = ConfigLoader.getInstance().getConfig().getDataDir() + File.separator + "index"; 41 42 private static Object indexLock = new Object (); 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 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 (PATH)); 84 reader.delete(term); 85 reader.close(); 86 } catch (IOException 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 (PATH), new StopAnalyzer(), false); 115 } else { 116 writer = new IndexWriter(new File (PATH), new StopAnalyzer(), true); 117 } 118 writer.addDocument(MessageDocument.getDocument(m)); 119 120 } catch (Exception e) { 121 log.error("addToIndex", e); 122 } finally { 123 try { 124 writer.close(); 125 } catch (Exception 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 (PATH), new StopAnalyzer(), true); 142 writer.close(); 143 } catch (IOException 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 flush(auth); 153 Forum f=null; 154 ForumThread ft=null; 155 for(Iterator it=forumFactory.forums();it.hasNext();){ 156 f=(Forum)it.next(); 157 for(Iterator it2=f.threads();it2.hasNext();){ 158 ft=(ForumThread)it2.next(); 159 index(ft.getRootMessage()); 160 } 161 } 162 163 164 } 165 166 169 public static boolean isAutoIndex() { 170 return autoIndex; 171 } 172 173 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 |