From b4c3cd9c13e761f8dcb803b5e6778e223b35c387 Mon Sep 17 00:00:00 2001 From: john Date: Thu, 21 Nov 2002 21:08:12 +0000 Subject: [PATCH] now features intelligent destruction of locks on error! (means might actually be usuable soon) --- .../mircoders/producer/IndexingProducerNode.java | 112 ++++++++++++++------- 1 file changed, 78 insertions(+), 34 deletions(-) diff --git a/source/mircoders/producer/IndexingProducerNode.java b/source/mircoders/producer/IndexingProducerNode.java index d023198e..051f5976 100755 --- a/source/mircoders/producer/IndexingProducerNode.java +++ b/source/mircoders/producer/IndexingProducerNode.java @@ -33,11 +33,12 @@ package mircoders.producer; import java.util.*; import java.io.*; - + import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.index.*; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; +import org.apache.lucene.store.FSDirectory; import freemarker.template.*; @@ -56,97 +57,101 @@ import mircoders.storage.*; public class IndexingProducerNode implements ProducerNode { private String contentKey; private String indexPath; - - + + public IndexingProducerNode(String aContentKey, String pathToIndex) { contentKey = aContentKey; indexPath=pathToIndex; } - + public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure { - IndexWriter indexWriter; + IndexReader indexReader = null; + IndexWriter indexWriter = null; Object data; Entity entity; - + long startTime; long endTime; - + startTime = System.currentTimeMillis(); - + try { data = ParameterExpander.findValueForKey( aValueMap, contentKey ); - + if (! (data instanceof EntityAdapter)) { - throw new ProducerFailure("IndexingProducerNode: value of '"+contentKey+"' is not an EntityAdapter, but an " + data.getClass().getName(), null); + throw new ProducerFailure("IndexingProducerNode: value of '"+contentKey+"' is not an EntityAdapter, but an " + data.getClass().getName(), null); } - + entity = ((EntityAdapter) data).getEntity(); if (! (entity instanceof EntityContent)) { - throw new ProducerFailure("IndexingProducerNode: value of '"+contentKey+"' is not a content EntityAdapter, but a " + entity.getClass().getName() + " adapter", null); + throw new ProducerFailure("IndexingProducerNode: value of '"+contentKey+"' is not a content EntityAdapter, but a " + entity.getClass().getName() + " adapter", null); } aLogger.println("Indexing " + (String) entity.getValue("id") + " into " + indexPath); aLogger.flush(); - - IndexReader indexReader = IndexReader.open(indexPath); + + indexReader = IndexReader.open(indexPath); indexReader.delete(new Term("id",entity.getValue("id"))); indexReader.close(); - + indexWriter = new IndexWriter(indexPath, new StandardAnalyzer(), false); Document theDoc = new Document(); - + // Keyword is stored and indexed, but not tokenized // Text is tokenized,stored, indexed // Unindexed is not tokenized or indexed, only stored // Unstored is tokenized and indexed, but not stored - + theDoc.add(Field.Keyword("id",entity.getValue("id"))); theDoc.add(Field.Keyword("where",entity.getValue("publish_path")+entity.getValue("id")+".shtml")); theDoc.add(Field.Text("creator",entity.getValue("creator"))); theDoc.add(Field.Text("title",entity.getValue("title"))); theDoc.add(Field.Keyword("webdb_create",entity.getValue("webdb_create_formatted"))); theDoc.add(Field.UnStored("content_and_description",entity.getValue("description")+entity.getValue("content_data"))); - + //topics TemplateModel topics=entity.get("to_topics"); aLogger.println("THE CLASS NAME WAS: "+entity.get("to_topics").getClass().getName()); while (((TemplateListModel)topics).hasNext()){ - theDoc.add(Field.UnStored("topic",((TemplateHashModel)((TemplateListModel)topics).next()).get("title").toString())); + theDoc.add(Field.UnStored("topic",((TemplateHashModel)((TemplateListModel)topics).next()).get("title").toString())); } - - + + //media - + //images TemplateModel images=entity.get("to_media_images"); if (images != null){ - theDoc.add(Field.UnStored("media","images")); + //here we should really store a list of urls instead, + //so we can thumbnail from another server + theDoc.add(Field.UnStored("media","images")); + } //audio TemplateModel audio=entity.get("to_media_audio"); if (audio != null){ - theDoc.add(Field.UnStored("media","audio")); + theDoc.add(Field.UnStored("media","audio")); } //video TemplateModel video=entity.get("to_media_video"); if (video != null){ - theDoc.add(Field.UnStored("media","video")); + theDoc.add(Field.UnStored("media","video")); } //comments-just aggregate all relevant fields String commentsAggregate = ""; TemplateModel comments=entity.get("to_comments"); if (comments != null){ - while (((TemplateListModel)comments).hasNext()){ - TemplateModel aComment = ((TemplateListModel)comments).next(); - commentsAggregate = commentsAggregate + " " + ((TemplateHashModel)aComment).get("title").toString() - + " " + ((TemplateHashModel)aComment).get("creator").toString() - + " " + ((TemplateHashModel)aComment).get("text").toString(); - } + while (((TemplateListModel)comments).hasNext()){ + TemplateModel aComment = ((TemplateListModel)comments).next(); + commentsAggregate = commentsAggregate + " " + ((TemplateHashModel)aComment).get("title").toString() + + " " + ((TemplateHashModel)aComment).get("creator").toString() + + " " + ((TemplateHashModel)aComment).get("text").toString(); + } } theDoc.add(Field.UnStored("comments",commentsAggregate)); indexWriter.addDocument(theDoc); - indexWriter.close(); + } catch (Throwable t) { @@ -155,12 +160,44 @@ public class IndexingProducerNode implements ProducerNode { //should remove index lock here.....jd throw new ProducerFailure(t.getMessage(), t); } + finally { + if (indexReader != null){ + try{ + indexReader.close(); + } + catch (Throwable t) { + aLogger.println("Error while closing indexReader: " + t.getMessage()); + } + + } + if (indexWriter != null){ + try{ + indexWriter.close(); + } + catch (Throwable t) { + aLogger.println("Error while closing indexWriter: " + t.getMessage()); + } + + } - + + try{ + FSDirectory theIndexDir=FSDirectory.getDirectory(indexPath,false); + if (indexReader.isLocked(theIndexDir)){ + indexReader.unlock(theIndexDir); + } + } + catch (Throwable t) { + aLogger.println("Error while unlocking index: " + t.getMessage()); + } + } + + + endTime = System.currentTimeMillis(); - + aLogger.println(" IndexTime: " + (endTime-startTime) + " ms
"); aLogger.flush(); } @@ -168,3 +205,10 @@ public class IndexingProducerNode implements ProducerNode { + + + + + + + -- 2.11.0