package org.bigbluebutton.webminer.index; import org.apache.log4j.Logger; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.index.TermEnum; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.LockObtainFailedException; import org.bigbluebutton.webminer.Constants; import org.bigbluebutton.webminer.config.ConfigHandler; import org.bigbluebutton.webminer.swf.PresentationMeta; import org.bigbluebutton.webminer.swf.SwfDocument; import org.bigbluebutton.webminer.web.controller.CourseIndexingController; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Date; import java.util.Map; import javax.xml.parsers.*; public class Index { private static IndexWriter writer; // new index being built private static IndexReader reader; private static Index indexer; // singleton private static Logger logger = Logger.getLogger(Index.class); public static Index getInstance() { if (indexer == null) { indexer = new Index(); } return indexer; } public void startIndex(String uid) { try { IndexReader.unlock(FSDirectory.getDirectory(ConfigHandler.indexPath)); if (logger.isInfoEnabled()){ logger.info("index file path " + ConfigHandler.indexPath); } reader = IndexReader.open(ConfigHandler.indexPath); TermEnum uidIter = reader.terms(new Term("uid")); while (uidIter.term()!= null) { if (uid.equalsIgnoreCase(uidIter.term().text())) { reader.deleteDocuments(uidIter.term()); } uidIter.next(); } reader.close(); } catch (CorruptIndexException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (LockObtainFailedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { writer = new IndexWriter(ConfigHandler.indexPath, new StandardAnalyzer(), new IndexWriter.MaxFieldLength(1000000)); } catch (CorruptIndexException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (LockObtainFailedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void addIndex (String presentationArch, Map attrs) throws Exception { URL root = new URL(presentationArch); Date start = new Date(); PresentationMeta meta = new PresentationMeta(); meta.setSummary((String) attrs.get("summary")); meta.setFileName((String) attrs.get("fileName")); meta.setUid((String) attrs.get("uid")); //If the slide has never been played, in search result, user should only see the static swf file, no replay if (attrs.get("slideTime")!=null){ meta.setSlideTime((String) attrs.get("slideTime")); } Document doc = SwfDocument.Document(root, meta); if (logger.isInfoEnabled()){ logger.info("adding " + doc.get("path")); } writer.addDocument(doc); if (logger.isInfoEnabled()){ logger.info("Optimizing index..."); } writer.optimize(); Date end = new Date(); if (logger.isInfoEnabled()){ logger.info("Total milliseconds = "+(end.getTime() - start.getTime())); } } public void finishIndex() { try { writer.close(); } catch (CorruptIndexException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }