4 * @author Daniel Brunier-Coulin
5 * @copyright OPEN CASCADE 2012
9 import java.io.IOException;
10 import java.io.Serializable;
11 import java.util.Iterator;
12 import java.util.List;
15 import org.apache.log4j.Logger;
17 import org.apache.lucene.analysis.standard.StandardAnalyzer;
18 import org.apache.lucene.document.Field;
19 import org.apache.lucene.index.CorruptIndexException;
20 import org.apache.lucene.index.IndexReader;
21 import org.apache.lucene.index.IndexWriter;
22 import org.apache.lucene.index.Term;
23 import org.apache.lucene.store.Directory;
24 import org.apache.lucene.store.FSDirectory;
25 import org.apache.lucene.store.LockObtainFailedException;
26 import org.apache.lucene.util.Version;
27 import org.splat.kernel.User;
32 private Directory index;
33 private org.apache.lucene.document.Document body;
35 protected static StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);
36 private static final Logger logger = Logger.getLogger(Index.class);
38 private class Entry extends IndexWriter {
39 // ---------------------------------------
40 private org.apache.lucene.document.Document entry;
42 private Entry (Study study) throws CorruptIndexException, LockObtainFailedException, IOException
44 super(index, analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
46 // Addition of mandatory fields
47 entry = new org.apache.lucene.document.Document();
49 field = body.getField("index");
50 field.setValue(String.valueOf(study.getIndex()));
52 field = body.getField("class");
53 field.setValue("Study");
55 field = body.getField("type");
56 field.setValue(""); // Reserved for configurable Study type
58 field = body.getField("ref");
59 field.setValue(study.getReference());
61 field = body.getField("area");
62 field.setValue(study.getVisibility().toString());
64 field = body.getField("state");
65 field.setValue(study.getProgressState().toString());
67 field = body.getField("author");
68 field.setValue(study.getAuthor().toString());
70 field = body.getField("title");
71 field.setValue(study.getTitle());
73 field = body.getField("contents");
74 field.setValue(study.getTitle());
77 // Addition of optional fields
79 setContextAt(study.getSteps());
81 private Entry (KnowledgeElement kelm) throws CorruptIndexException, LockObtainFailedException, IOException
83 super(index, analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
85 // Addition of mandatory fields
86 entry = new org.apache.lucene.document.Document();
88 field = body.getField("index");
89 field.setValue(String.valueOf(kelm.getIndex()));
91 field = body.getField("class");
92 field.setValue("KnowledgeElement");
94 field = body.getField("type");
95 field.setValue(kelm.getType().getName());
97 field = body.getField("ref");
98 field.setValue(kelm.getReference());
100 field = body.getField("area");
101 field.setValue(kelm.getVisibility().toString());
103 field = body.getField("state");
104 field.setValue(kelm.getProgressState().toString());
106 field = body.getField("author");
107 field.setValue(kelm.getAuthor().toString());
109 field = body.getField("title");
110 field.setValue(kelm.getTitle());
112 field = body.getField("contents");
113 field.setValue(kelm.getTitle());
116 //TODO: Addition of optional fields
117 Scenario scene = kelm.getOwnerScenario();
118 Study study = scene.getOwnerStudy();
119 setActorsOf(study); // For restricting the visibility of knowledges attached to private studies
120 setContextAt(study.getSteps());
121 setContextAt(scene.getSteps());
123 private void add () throws CorruptIndexException, IOException
126 // Save the new entry
127 optimize(); // Should be called before committing the index
128 close(); // Commits the index
130 private void update () throws CorruptIndexException, IOException
132 String value = entry.getField("ref").stringValue(); // Only field with unique value
133 Term term = new Term("ref").createTerm(value);
134 updateDocument(term, entry);
135 // Save the updated entry
136 optimize(); // Should be called before committing the index
137 close(); // Commits the index
139 private void setContextAt (Step[] step)
141 for (int i=0; i<step.length; i++) {
142 List<SimulationContext> contexts = step[i].getAllSimulationContexts();
143 for (Iterator<SimulationContext> j=contexts.iterator(); j.hasNext();) {
144 SimulationContext context = j.next();
145 String type = String.valueOf(context.getType().getIndex());
146 String value = context.getValue();
147 entry.add( new Field(type, value, Field.Store.NO, Field.Index.NOT_ANALYZED) );
151 private void setActorsOf (Study study)
153 Set<User> actors = study.getActors();
154 for (Iterator<User> i=actors.iterator(); i.hasNext(); ) {
155 String value = i.next().toString();
156 entry.add( new Field("actor", value, Field.Store.NO, Field.Index.NOT_ANALYZED) );
160 public static class ObjectProxy implements Proxy, Serializable {
161 // --------------------------------------------------------------
164 private ProgressState state;
165 private String title;
168 private static final long serialVersionUID = -4386494192709562221L;
170 public ObjectProxy (org.apache.lucene.document.Document ludoc) {
171 rid = Integer.valueOf(ludoc.get("index"));
172 sid = ludoc.get("ref");
173 state = ProgressState.valueOf(ludoc.get("state"));
174 title = ludoc.get("title");
175 name = ludoc.get("author");
177 public String getAuthorName () {
180 public Integer getIndex () {
183 public ProgressState getProgressState () {
186 public String getReference () {
189 public String getTitle () {
192 public String getType () {
197 // ==============================================================================================================================
199 // ==============================================================================================================================
201 protected static void create () throws IOException {
202 // -------------------------------
203 Directory index = FSDirectory.open(Database.getRepositoryIndexDirectory());
204 IndexWriter writer = new IndexWriter(index, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
205 writer.close(); // ==== Creates an empty index
208 protected Index () throws IOException {
209 // ------------------
210 File indir = Database.getRepositoryIndexDirectory();
211 index = FSDirectory.open(indir);
212 body = new org.apache.lucene.document.Document();
213 body.add( new Field("index", "", Field.Store.YES, Field.Index.NOT_ANALYZED) );
214 body.add( new Field("class", "", Field.Store.NO, Field.Index.NOT_ANALYZED) );
215 body.add( new Field("type", "", Field.Store.YES, Field.Index.NOT_ANALYZED) );
216 body.add( new Field("ref", "", Field.Store.YES, Field.Index.NOT_ANALYZED) );
217 body.add( new Field("area", "", Field.Store.NO, Field.Index.NOT_ANALYZED) );
218 body.add( new Field("state", "", Field.Store.YES, Field.Index.NOT_ANALYZED) );
219 body.add( new Field("author", "", Field.Store.YES, Field.Index.NOT_ANALYZED) );
220 body.add( new Field("title", "", Field.Store.YES, Field.Index.NOT_ANALYZED) );
221 body.add( new Field("contents","", Field.Store.NO, Field.Index.ANALYZED) );
224 // ==============================================================================================================================
226 // ==============================================================================================================================
228 protected void add (Study study) throws IOException {
229 // --------------------------------
230 Index.Entry entry = new Entry(study);
232 if (logger.isInfoEnabled()) {
233 logger.info("Study \"" + study.getIndex() + "\" indexed.");
237 protected void add (KnowledgeElement kelm) throws IOException {
238 // ------------------------------------------
239 Index.Entry entry = new Entry(kelm);
241 if (logger.isInfoEnabled()) {
242 logger.info("Knowledge \"" + kelm.getIndex() + "\" indexed.");
246 protected boolean exists () {
247 // ---------------------------
249 return IndexReader.indexExists(index);
251 catch (IOException error) {
252 error.printStackTrace();
257 protected void update (Study study) throws IOException {
258 // -----------------------------------
259 Index.Entry entry = new Entry(study);
261 if (logger.isInfoEnabled()) {
262 logger.info("Study \"" + study.getIndex() + "\" re-indexed.");
266 protected void update (KnowledgeElement kelm) throws IOException {
267 // ---------------------------------------------
268 Index.Entry entry = new Entry(kelm);
270 if (logger.isInfoEnabled()) {
271 logger.info("Knowledge \"" + kelm.getIndex() + "\" re-indexed.");