proof of concept producer which takes content and indexes it using lucene
[mir.git] / source / mircoders / producer / IndexingProducerNode.java
1 package mircoders.producer;
2
3 import java.util.*;
4 import java.io.*;
5
6 import org.apache.lucene.analysis.standard.StandardAnalyzer;
7 import org.apache.lucene.index.*;
8 import org.apache.lucene.document.Document;
9 import org.apache.lucene.document.Field;
10
11
12 import freemarker.template.*;
13
14
15 import mir.util.*;
16 import mir.producer.*;
17 //import mir.generator.*;
18 import mircoders.global.*;
19 import mircoders.localizer.*;
20 import mir.entity.*;
21 import mir.entity.adapter.*;
22 import mircoders.entity.*;
23 import mircoders.storage.*;
24
25
26 public class IndexingProducerNode implements ProducerNode {
27   private String contentKey;
28   private String indexPath;
29     
30
31   public IndexingProducerNode(String aContentKey, String pathToIndex) {
32     contentKey = aContentKey;
33     indexPath=pathToIndex;
34   }
35
36   public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
37     IndexWriter indexWriter;
38     Object data;
39     Entity entity;
40
41     long startTime;
42     long endTime;
43
44     startTime = System.currentTimeMillis();
45     
46     try {
47       data = ParameterExpander.findValueForKey( aValueMap, contentKey );
48
49       if (! (data instanceof EntityAdapter)) {
50         throw new ProducerFailure("IndexingProducerNode: value of '"+contentKey+"' is not an EntityAdapter, but an " + data.getClass().getName(), null);
51       }
52       
53       entity = ((EntityAdapter) data).getEntity();
54       if (! (entity instanceof EntityContent)) {
55         throw new ProducerFailure("IndexingProducerNode: value of '"+contentKey+"' is not a content EntityAdapter, but a " + entity.getClass().getName() + " adapter", null);
56       }
57       aLogger.println("Indexing " + (String) entity.getValue("id") + " into " + indexPath);
58       aLogger.flush();
59       
60       IndexReader indexReader = IndexReader.open(indexPath);
61       indexReader.delete(new Term("id",entity.getValue("id")));
62       indexReader.close();
63       
64       indexWriter = new IndexWriter(indexPath, new StandardAnalyzer(), false);
65       Document theDoc =  new Document();
66       
67       // Keyword is stored and indexed, but not tokenized
68       // Text is tokenized,stored, indexed 
69       // Unindexed is not tokenized or indexed, only stored
70       // Unstored is tokenized and indexed, but not stored
71  
72       theDoc.add(Field.Keyword("id",entity.getValue("id")));
73       theDoc.add(Field.Keyword("where",entity.getValue("publish_path")+entity.getValue("id")+".shtml"));
74       theDoc.add(Field.Text("creator",entity.getValue("creator")));
75       theDoc.add(Field.Text("title",entity.getValue("title")));
76       theDoc.add(Field.Keyword("webdb_create",entity.getValue("webdb_create_formatted")));
77       theDoc.add(Field.UnStored("content_and_description",entity.getValue("description")+entity.getValue("content_data")));
78       
79       //topics
80       TemplateModel topics=entity.get("to_topics");
81       aLogger.println("THE CLASS NAME WAS: "+entity.get("to_topics").getClass().getName());
82       while (((TemplateListModel)topics).hasNext()){
83           theDoc.add(Field.UnStored("topic",((SimpleHash)((TemplateListModel)topics).next()).get("title").toString()));
84       }
85
86       
87       //media
88       
89       //images
90       TemplateModel images=entity.get("to_media_images");
91       if (images != null){
92           theDoc.add(Field.UnStored("media","images"));
93       }
94       //audio
95       TemplateModel audio=entity.get("to_media_audio");
96       if (audio != null){
97           theDoc.add(Field.UnStored("media","audio"));
98       }
99       //video
100       TemplateModel video=entity.get("to_media_video");
101       if (video != null){
102           theDoc.add(Field.UnStored("media","video"));
103       }
104
105       //comments-just aggregate all relevant fields
106       String commentsAggregate = "";
107       TemplateModel comments=entity.get("to_comments");
108       if (comments != null){
109         while (((TemplateListModel)comments).hasNext()){
110           SimpleHash aComment = (SimpleHash)((TemplateListModel)comments).next();
111           commentsAggregate = commentsAggregate + " " + aComment.get("title").toString() 
112             + " " + aComment.get("creator").toString() 
113             + " " + aComment.get("text").toString();
114         }
115       }
116       theDoc.add(Field.UnStored("comments",commentsAggregate));
117
118       indexWriter.addDocument(theDoc);
119       indexWriter.close();
120       
121     }
122     catch (Throwable t) {
123       aLogger.println("Error while indexing content: " + t.getMessage());
124       t.printStackTrace(aLogger);
125       //should remove index lock here.....jd
126       throw new ProducerFailure(t.getMessage(), t);
127     }
128       
129       
130   
131       
132     endTime = System.currentTimeMillis();
133     
134     aLogger.println("  IndexTime: " + (endTime-startTime) + " ms<br>");
135     aLogger.flush();
136   }
137
138   public Set buildVerbSet() {
139     return new HashSet();
140   }
141 }
142
143
144