now features intelligent destruction of locks on error!
authorjohn <john>
Thu, 21 Nov 2002 21:08:12 +0000 (21:08 +0000)
committerjohn <john>
Thu, 21 Nov 2002 21:08:12 +0000 (21:08 +0000)
(means might actually be usuable soon)

source/mircoders/producer/IndexingProducerNode.java

index d023198..051f597 100755 (executable)
@@ -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<br>");
     aLogger.flush();
   }
@@ -168,3 +205,10 @@ public class IndexingProducerNode implements ProducerNode {
 
 
 
+
+
+
+
+
+
+