Salome HOME
Reindex of studies is fixed.
[tools/siman.git] / Workspace / Siman-Common / src / org / splat / service / technical / IndexServiceImpl.java
index 6f96dc9401d755e873d3b71d465f63c310d49c72..498026d2ed26001cebab91af52490462322d5ec8 100644 (file)
@@ -1,4 +1,5 @@
 package org.splat.service.technical;
+
 /**
  * 
  * @author    Daniel Brunier-Coulin
@@ -30,261 +31,297 @@ import org.splat.dal.bo.som.ProgressState;
 import org.splat.dal.bo.som.Scenario;
 import org.splat.dal.bo.som.SimulationContext;
 import org.splat.dal.bo.som.Study;
-import org.splat.dal.dao.som.Database;
 import org.splat.service.ProjectElementService;
 import org.splat.service.dto.Proxy;
 import org.splat.som.Step;
 
-
 public class IndexServiceImpl implements IndexService {
 
-    private Directory                            index;
-    private org.apache.lucene.document.Document  body;
+       private Directory index;
+       private org.apache.lucene.document.Document body;
        private ProjectElementService _projectElementService;
-       private RepositoryService     _repositoryService;
-    
-       protected static       StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);
-    private   static final Logger           logger   = Logger.getLogger(IndexServiceImpl.class);
-
-    private class Entry extends IndexWriter {
-//  ---------------------------------------
-      private org.apache.lucene.document.Document entry;
-
-      private Entry (Study study) throws CorruptIndexException, LockObtainFailedException, IOException
-      {
-        super(index, analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
-
-//      Addition of mandatory fields
-        entry = new org.apache.lucene.document.Document();        
-       Field  field;
-       field = body.getField("index");
-       field.setValue(String.valueOf(study.getIndex()));
-       entry.add(field);
-       field = body.getField("class");
-       field.setValue("Study");
-       entry.add(field);
-       field = body.getField("type");
-       field.setValue("");     // Reserved for configurable Study type
-       entry.add(field);
-       field = body.getField("ref");
-       field.setValue(study.getReference());
-       entry.add(field);
-       field = body.getField("area");
-       field.setValue(study.getVisibility().toString());
-       entry.add(field);
-       field = body.getField("state");
-       field.setValue(study.getProgressState().toString());
-       entry.add(field);
-       field = body.getField("author");
-       field.setValue(study.getAuthor().toString());
-       entry.add(field);
-       field = body.getField("title");
-       field.setValue(study.getTitle());
-       entry.add(field);
-       field = body.getField("contents");
-       field.setValue(study.getTitle());
-       entry.add(field);
-
-//      Addition of optional fields
-       setActorsOf(study);
-       setContextAt(getProjectElementService().getSteps(study));
-      }
-      private Entry (KnowledgeElement kelm) throws CorruptIndexException, LockObtainFailedException, IOException
-      {
-        super(index, analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
-
-//      Addition of mandatory fields
-        entry = new org.apache.lucene.document.Document();        
-       Field field;
-        field = body.getField("index");
-        field.setValue(String.valueOf(kelm.getIndex()));
-       entry.add(field);
-        field = body.getField("class");
-        field.setValue("KnowledgeElement");
-       entry.add(field);
-        field = body.getField("type");
-        field.setValue(kelm.getType().getName());
-       entry.add(field);
-        field = body.getField("ref");
-        field.setValue(kelm.getReference());
-       entry.add(field);
-       field = body.getField("area");
-       field.setValue(kelm.getVisibility().toString());
-       entry.add(field);
-       field = body.getField("state");
-       field.setValue(kelm.getProgressState().toString());
-       entry.add(field);
-        field = body.getField("author");
-        field.setValue(kelm.getAuthor().toString());
-       entry.add(field);
-        field = body.getField("title");
-        field.setValue(kelm.getTitle());
-       entry.add(field);
-        field = body.getField("contents");
-        field.setValue(kelm.getTitle());
-       entry.add(field);
-
-//TODO: Addition of optional fields
-       Scenario scene = kelm.getOwnerScenario();
-       Study    study = scene.getOwnerStudy();
-       setActorsOf(study);  // For restricting the visibility of knowledges attached to private studies
-       setContextAt(getProjectElementService().getSteps(study));
-       setContextAt(getProjectElementService().getSteps(scene));
-      }
-      private void add () throws CorruptIndexException, IOException
-      {
-        addDocument(entry);
-//      Save the new entry
-        optimize();          // Should be called before committing the index
-        close();             // Commits the index
-      }
-      private void update () throws CorruptIndexException, IOException
-      {
-       String value = entry.getField("ref").stringValue();   // Only field with unique value
-       Term   term  = new Term("ref").createTerm(value);
-        updateDocument(term, entry);
-//      Save the updated entry
-        optimize();          // Should be called before committing the index
-        close();             // Commits the index
-      }
-      private void setContextAt (Step[] step)
-      {
-               for (int i=0; i<step.length; i++) {
-          List<SimulationContext> contexts = step[i].getAllSimulationContexts();
-          for (Iterator<SimulationContext> j=contexts.iterator(); j.hasNext();) {
-            SimulationContext  context = j.next();
-            String             type    = String.valueOf(context.getType().getIndex());
-            String             value   = context.getValue();
-            entry.add( new Field(type, value, Field.Store.NO, Field.Index.NOT_ANALYZED) );
-          }
-       }
-      }
-      private void setActorsOf (Study study)
-      {
-//RKV: This set is always not null. Let's assume that it must be initialized before reindexing:        Set<User> actors = study.getActors();
-       Set<User> actors = study.getActor(); //RKV
-       for (Iterator<User> i=actors.iterator(); i.hasNext(); ) {
-         String value = i.next().toString();
-          entry.add( new Field("actor", value, Field.Store.NO, Field.Index.NOT_ANALYZED) );
-       }
-      }
-    }      
-    public static class ObjectProxy implements Proxy, Serializable {
-//  --------------------------------------------------------------
-      private Long           rid;
-      private String        sid;
-      private ProgressState state;
-      private String        title;
-      private String        type;
-      private String        name;
-      private static final long serialVersionUID = -4386494192709562221L;
-          
-      public ObjectProxy (org.apache.lucene.document.Document ludoc) {
-        rid   = Long.valueOf(ludoc.get("index"));
-        sid   = ludoc.get("ref");
-        state = ProgressState.valueOf(ludoc.get("state"));
-        title = ludoc.get("title");
-        name  = ludoc.get("author");
-      }
-      public String getAuthorName () {
-        return name;
-      }
-      public Long getIndex () {
-        return rid;
-      }
-      public ProgressState getProgressState () {
-        return state;
-      }
-      public String getReference () {
-        return sid;
-      }
-      public String getTitle () {
-       return title;
-      }
-      public String getType () {
-        return type;
-      }
-    }
-
-//  ==============================================================================================================================
-//  Construction
-//  ==============================================================================================================================
-    
-    public void configure () throws IOException {
-        File indir = getRepositoryService().getRepositoryIndexDirectory();
-        index = FSDirectory.open(indir);
-        body  = new org.apache.lucene.document.Document();
-        body.add( new Field("index",   "", Field.Store.YES, Field.Index.NOT_ANALYZED) );
-        body.add( new Field("class",   "", Field.Store.NO,  Field.Index.NOT_ANALYZED) );
-        body.add( new Field("type",    "", Field.Store.YES, Field.Index.NOT_ANALYZED) );
-        body.add( new Field("ref",     "", Field.Store.YES, Field.Index.NOT_ANALYZED) );
-        body.add( new Field("area",    "", Field.Store.NO,  Field.Index.NOT_ANALYZED) );
-        body.add( new Field("state",   "", Field.Store.YES, Field.Index.NOT_ANALYZED) );
-        body.add( new Field("author",  "", Field.Store.YES, Field.Index.NOT_ANALYZED) );
-        body.add( new Field("title",   "", Field.Store.YES, Field.Index.NOT_ANALYZED) );
-        body.add( new Field("contents","", Field.Store.NO,  Field.Index.ANALYZED) );
-        if ( !this.exists() ) this.create();     // Happens when re-indexing all studies
-    }
-    
-    public void create () throws IOException {
-//  -------------------------------
-      Directory   index  = FSDirectory.open(getRepositoryService().getRepositoryIndexDirectory());
-         IndexWriter writer = new IndexWriter(index, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
-         writer.close();                                    // ====  Creates an empty index
-    }
-
-//  ==============================================================================================================================
-//  Member functions
-//  ==============================================================================================================================
-
-    public void add (Study study) throws IOException {
-//  --------------------------------
-      IndexServiceImpl.Entry entry = new Entry(study);
-      entry.add();
-      if (logger.isInfoEnabled()) {
-          logger.info("Study \"" + study.getIndex() + "\" indexed.");
-      }
-    }
-
-    public void add (KnowledgeElement kelm) throws IOException {
-//  ------------------------------------------
-         IndexServiceImpl.Entry entry = new Entry(kelm);
-      entry.add();
-         if (logger.isInfoEnabled()) {
-          logger.info("Knowledge \"" + kelm.getIndex() + "\" indexed.");
-         }
-    }
-
-    public boolean exists () {
-//  ---------------------------
-      try {
-               return IndexReader.indexExists(index);
-      }
-      catch (IOException error) {
-        error.printStackTrace();
-        return false;
+       private RepositoryService _repositoryService;
+
+       protected static StandardAnalyzer analyzer = new StandardAnalyzer(
+                       Version.LUCENE_29);
+       private static final Logger logger = Logger
+                       .getLogger(IndexServiceImpl.class);
+
+       private class Entry extends IndexWriter {
+               private org.apache.lucene.document.Document entry;
+
+               private Entry(Study study) throws CorruptIndexException,
+                               LockObtainFailedException, IOException {
+                       super(index, analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
+
+                       // Addition of mandatory fields
+                       entry = new org.apache.lucene.document.Document();
+                       Field field;
+                       field = body.getField("index");
+                       field.setValue(String.valueOf(study.getIndex()));
+                       entry.add(field);
+                       field = body.getField("class");
+                       field.setValue("Study");
+                       entry.add(field);
+                       field = body.getField("type");
+                       field.setValue(""); // Reserved for configurable Study type
+                       entry.add(field);
+                       field = body.getField("ref");
+                       field.setValue(study.getReference());
+                       entry.add(field);
+                       field = body.getField("area");
+                       field.setValue(study.getVisibility().toString());
+                       entry.add(field);
+                       field = body.getField("state");
+                       field.setValue(study.getProgressState().toString());
+                       entry.add(field);
+                       field = body.getField("author");
+                       field.setValue(study.getAuthor().toString());
+                       entry.add(field);
+                       field = body.getField("title");
+                       field.setValue(study.getTitle());
+                       entry.add(field);
+                       field = body.getField("contents");
+                       field.setValue(study.getTitle());
+                       entry.add(field);
+
+                       // Addition of optional fields
+                       setActorsOf(study);
+                       setContextAt(getProjectElementService().getSteps(study));
+               }
+
+               private Entry(KnowledgeElement kelm) throws CorruptIndexException,
+                               LockObtainFailedException, IOException {
+                       super(index, analyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
+
+                       // Addition of mandatory fields
+                       entry = new org.apache.lucene.document.Document();
+                       Field field;
+                       field = body.getField("index");
+                       field.setValue(String.valueOf(kelm.getIndex()));
+                       entry.add(field);
+                       field = body.getField("class");
+                       field.setValue("KnowledgeElement");
+                       entry.add(field);
+                       field = body.getField("type");
+                       field.setValue(kelm.getType().getName());
+                       entry.add(field);
+                       field = body.getField("ref");
+                       field.setValue(kelm.getReference());
+                       entry.add(field);
+                       field = body.getField("area");
+                       field.setValue(kelm.getVisibility().toString());
+                       entry.add(field);
+                       field = body.getField("state");
+                       field.setValue(kelm.getProgressState().toString());
+                       entry.add(field);
+                       field = body.getField("author");
+                       field.setValue(kelm.getAuthor().toString());
+                       entry.add(field);
+                       field = body.getField("title");
+                       field.setValue(kelm.getTitle());
+                       entry.add(field);
+                       field = body.getField("contents");
+                       field.setValue(kelm.getTitle());
+                       entry.add(field);
+
+                       // TODO: Addition of optional fields
+                       Scenario scene = kelm.getOwnerScenario();
+                       Study study = scene.getOwnerStudy();
+                       setActorsOf(study); // For restricting the visibility of knowledges attached to private studies
+                       setContextAt(getProjectElementService().getSteps(study));
+                       setContextAt(getProjectElementService().getSteps(scene));
+               }
+
+               private void add() throws CorruptIndexException, IOException {
+                       addDocument(entry);
+                       // Save the new entry
+                       optimize(); // Should be called before committing the index
+                       close(); // Commits the index
+               }
+
+               private void update() throws CorruptIndexException, IOException {
+                       String value = entry.getField("ref").stringValue(); // Only field with unique value
+                       Term term = new Term("ref").createTerm(value);
+                       updateDocument(term, entry);
+                       // Save the updated entry
+                       optimize(); // Should be called before committing the index
+                       close(); // Commits the index
+               }
+
+               private void setContextAt(Step[] step) {
+                       for (int i = 0; i < step.length; i++) {
+                               List<SimulationContext> contexts = step[i]
+                                               .getAllSimulationContexts();
+                               for (Iterator<SimulationContext> j = contexts.iterator(); j
+                                               .hasNext();) {
+                                       SimulationContext context = j.next();
+                                       String type = String.valueOf(context.getType().getIndex());
+                                       String value = context.getValue();
+                                       entry.add(new Field(type, value, Field.Store.NO,
+                                                       Field.Index.NOT_ANALYZED));
+                               }
+                       }
+               }
+
+               private void setActorsOf(Study study) {
+                       // RKV: This set is always not null. Let's assume that it must be initialized before reindexing: Set<User> actors =
+                       // study.getActors();
+                       Set<User> actors = study.getActor(); // RKV
+                       if (logger.isDebugEnabled()) {
+                               logger.debug("Study " + study.getReference()
+                                               + " actors number to be added to the lucen index: "
+                                               + actors.size());
+                       }
+                       for (Iterator<User> i = actors.iterator(); i.hasNext();) {
+                               String value = i.next().toString();
+                               entry.add(new Field("actor", value, Field.Store.NO,
+                                               Field.Index.NOT_ANALYZED));
+                               if (logger.isDebugEnabled()) {
+                                       logger.debug("    actor added to the lucen index: " + value);
+                               }
+                       }
+               }
+       }
+
+       public static class ObjectProxy implements Proxy, Serializable {
+               // --------------------------------------------------------------
+               private Long rid;
+               private String sid;
+               private ProgressState state;
+               private String title;
+               private String type;
+               private String name;
+               private static final long serialVersionUID = -4386494192709562221L;
+
+               public ObjectProxy(org.apache.lucene.document.Document ludoc) {
+                       rid = Long.valueOf(ludoc.get("index"));
+                       sid = ludoc.get("ref");
+                       state = ProgressState.valueOf(ludoc.get("state"));
+                       title = ludoc.get("title");
+                       name = ludoc.get("author");
+               }
+
+               public String getAuthorName() {
+                       return name;
+               }
+
+               public Long getIndex() {
+                       return rid;
+               }
+
+               public ProgressState getProgressState() {
+                       return state;
+               }
+
+               public String getReference() {
+                       return sid;
+               }
+
+               public String getTitle() {
+                       return title;
+               }
+
+               public String getType() {
+                       return type;
+               }
+       }
+
+       // ==============================================================================================================================
+       // Construction
+       // ==============================================================================================================================
+
+       public void configure() throws IOException {
+               File indir = getRepositoryService().getRepositoryIndexDirectory();
+               index = FSDirectory.open(indir);
+               body = new org.apache.lucene.document.Document();
+               body.add(new Field("index", "", Field.Store.YES,
+                               Field.Index.NOT_ANALYZED));
+               body.add(new Field("class", "", Field.Store.NO,
+                               Field.Index.NOT_ANALYZED));
+               body.add(new Field("type", "", Field.Store.YES,
+                               Field.Index.NOT_ANALYZED));
+               body
+                               .add(new Field("ref", "", Field.Store.YES,
+                                               Field.Index.NOT_ANALYZED));
+               body
+                               .add(new Field("area", "", Field.Store.NO,
+                                               Field.Index.NOT_ANALYZED));
+               body.add(new Field("state", "", Field.Store.YES,
+                               Field.Index.NOT_ANALYZED));
+               body.add(new Field("author", "", Field.Store.YES,
+                               Field.Index.NOT_ANALYZED));
+               body.add(new Field("title", "", Field.Store.YES,
+                               Field.Index.NOT_ANALYZED));
+               body
+                               .add(new Field("contents", "", Field.Store.NO,
+                                               Field.Index.ANALYZED));
+               if (!this.exists())
+                       this.create(); // Happens when re-indexing all studies
+       }
+
+       public void create() throws IOException {
+               // -------------------------------
+               Directory index = FSDirectory.open(getRepositoryService()
+                               .getRepositoryIndexDirectory());
+               IndexWriter writer = new IndexWriter(index, analyzer, true,
+                               IndexWriter.MaxFieldLength.UNLIMITED);
+               writer.close(); // ==== Creates an empty index
+       }
+
+       // ==============================================================================================================================
+       // Member functions
+       // ==============================================================================================================================
+
+       public void add(Study study) throws IOException {
+               // --------------------------------
+               IndexServiceImpl.Entry entry = new Entry(study);
+               entry.add();
+               if (logger.isInfoEnabled()) {
+                       logger.info("Study \"" + study.getIndex() + "\" indexed.");
+               }
+       }
+
+       public void add(KnowledgeElement kelm) throws IOException {
+               // ------------------------------------------
+               IndexServiceImpl.Entry entry = new Entry(kelm);
+               entry.add();
+               if (logger.isInfoEnabled()) {
+                       logger.info("Knowledge \"" + kelm.getIndex() + "\" indexed.");
+               }
+       }
+
+       public boolean exists() {
+               // ---------------------------
+               try {
+                       return IndexReader.indexExists(index);
+               } catch (IOException error) {
+                       error.printStackTrace();
+                       return false;
+               }
        }
-    }
-
-    public void update (Study study) throws IOException {
-//  -----------------------------------
-         IndexServiceImpl.Entry entry = new Entry(study);
-         entry.update();
-      if (logger.isInfoEnabled()) {
-          logger.info("Study \"" + study.getIndex() + "\" re-indexed.");
-      }
-    }
-
-    public void update (KnowledgeElement kelm) throws IOException {
-//  ---------------------------------------------
-         IndexServiceImpl.Entry entry = new Entry(kelm);
-         entry.update();
-      if (logger.isInfoEnabled()) {
-          logger.info("Knowledge \"" + kelm.getIndex() + "\" re-indexed.");
-      }
-    }
+
+       public void update(Study study) throws IOException {
+               // -----------------------------------
+               IndexServiceImpl.Entry entry = new Entry(study);
+               entry.update();
+               if (logger.isInfoEnabled()) {
+                       logger.info("Study \"" + study.getIndex() + "\" re-indexed.");
+               }
+       }
+
+       public void update(KnowledgeElement kelm) throws IOException {
+               // ---------------------------------------------
+               IndexServiceImpl.Entry entry = new Entry(kelm);
+               entry.update();
+               if (logger.isInfoEnabled()) {
+                       logger.info("Knowledge \"" + kelm.getIndex() + "\" re-indexed.");
+               }
+       }
+
        /**
         * Get the projectElementService.
+        * 
         * @return the projectElementService
         */
        public ProjectElementService getProjectElementService() {
@@ -293,14 +330,18 @@ public class IndexServiceImpl implements IndexService {
 
        /**
         * Set the projectElementService.
-        * @param projectElementService the projectElementService to set
+        * 
+        * @param projectElementService
+        *            the projectElementService to set
         */
-       public void setProjectElementService(ProjectElementService projectElementService) {
+       public void setProjectElementService(
+                       ProjectElementService projectElementService) {
                _projectElementService = projectElementService;
        }
 
        /**
         * Get the repositoryService.
+        * 
         * @return the repositoryService
         */
        public RepositoryService getRepositoryService() {
@@ -309,7 +350,9 @@ public class IndexServiceImpl implements IndexService {
 
        /**
         * Set the repositoryService.
-        * @param repositoryService the repositoryService to set
+        * 
+        * @param repositoryService
+        *            the repositoryService to set
         */
        public void setRepositoryService(RepositoryService repositoryService) {
                _repositoryService = repositoryService;