You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opennlp.apache.org by jo...@apache.org on 2011/10/13 15:47:38 UTC

svn commit: r1182856 - in /incubator/opennlp/sandbox/caseditor-opennlp-plugin/src/main/java/org/apache/opennlp/caseditor/namefinder: EntityContentProvider.java NameFinderViewPage.java

Author: joern
Date: Thu Oct 13 13:47:38 2011
New Revision: 1182856

URL: http://svn.apache.org/viewvc?rev=1182856&view=rev
Log:
OPENNLP-310 Changing properties now triggers a name finder run.

Modified:
    incubator/opennlp/sandbox/caseditor-opennlp-plugin/src/main/java/org/apache/opennlp/caseditor/namefinder/EntityContentProvider.java
    incubator/opennlp/sandbox/caseditor-opennlp-plugin/src/main/java/org/apache/opennlp/caseditor/namefinder/NameFinderViewPage.java

Modified: incubator/opennlp/sandbox/caseditor-opennlp-plugin/src/main/java/org/apache/opennlp/caseditor/namefinder/EntityContentProvider.java
URL: http://svn.apache.org/viewvc/incubator/opennlp/sandbox/caseditor-opennlp-plugin/src/main/java/org/apache/opennlp/caseditor/namefinder/EntityContentProvider.java?rev=1182856&r1=1182855&r2=1182856&view=diff
==============================================================================
--- incubator/opennlp/sandbox/caseditor-opennlp-plugin/src/main/java/org/apache/opennlp/caseditor/namefinder/EntityContentProvider.java (original)
+++ incubator/opennlp/sandbox/caseditor-opennlp-plugin/src/main/java/org/apache/opennlp/caseditor/namefinder/EntityContentProvider.java Thu Oct 13 13:47:38 2011
@@ -19,13 +19,12 @@ package org.apache.opennlp.caseditor.nam
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
-import opennlp.tools.tokenize.SimpleTokenizer;
 import opennlp.tools.util.Span;
 
+import org.apache.opennlp.caseditor.OpenNLPPlugin;
 import org.apache.opennlp.caseditor.OpenNLPPreferenceConstants;
 import org.apache.opennlp.caseditor.util.ContainingConstraint;
 import org.apache.opennlp.caseditor.util.UIMAUtil;
@@ -41,6 +40,8 @@ import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.jobs.IJobChangeEvent;
 import org.eclipse.core.runtime.jobs.JobChangeAdapter;
 import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
@@ -51,9 +52,14 @@ import org.eclipse.swt.widgets.Display;
 // Maybe we should create again, a "View" map of indexes to its annotations?!
 public class EntityContentProvider implements IStructuredContentProvider {
 
-  // TODO: Triggering should be more refined, and only happen if
-  // Sentences, Tokens, or entities change ..
-  class NameFinderTrigger implements ICasDocumentListener {
+  /**
+   * Listener which triggers a run of the name finder if something in the CAS changed.
+   * <p>
+   * TODO: Listener should only trigger a run if something changed which might change the results
+   * of the name finder run.
+   */
+  // TODO: Rename it ...
+  private class CasChangeNameFinderTrigger implements ICasDocumentListener {
 
     @Override
     public void added(FeatureStructure fs) {
@@ -98,14 +104,18 @@ public class EntityContentProvider imple
     
   }
   
-  private static boolean contains(String array[], String element) {
-    
-    for (String arrayElement : array) {
-      if (element.equals(arrayElement))
-        return true;
+  /**
+   * Listeners which triggers a run of the name finder when a related preferences changed.
+   */
+  private class PreferenceChangeNameFinderTrigger implements IPropertyChangeListener{
+
+    @Override
+    public void propertyChange(PropertyChangeEvent event) {
+      // Filter all changes of preferences which do not belong to this plugin
+      if (event.getProperty().startsWith(OpenNLPPlugin.ID)) {
+        runNameFinder();
+      }
     }
-    
-    return false;
   }
   
   class ConfirmedEntityListener implements ICasDocumentListener {
@@ -224,7 +234,8 @@ public class EntityContentProvider imple
   
   private NameFinderJob nameFinder;
   
-  private NameFinderTrigger nameFinderTrigger = new NameFinderTrigger();
+  private CasChangeNameFinderTrigger casChangeTrigger = new CasChangeNameFinderTrigger();
+  private PreferenceChangeNameFinderTrigger preferenceChangeTrigger = new PreferenceChangeNameFinderTrigger();
   private ConfirmedEntityListener casChangeListener = new ConfirmedEntityListener();
   
   private TableViewer entityListViewer;
@@ -242,17 +253,92 @@ public class EntityContentProvider imple
 
   private NameFinderViewPage nameFinderView;
   
-  EntityContentProvider(NameFinderViewPage nameFinderView, AnnotationEditor editor, NameFinderJob nameFinder, TableViewer entityList) {
-    this.nameFinder = nameFinder;
+  EntityContentProvider(NameFinderViewPage nameFinderView, AnnotationEditor editor, TableViewer entityList) {
+    this.nameFinder = new NameFinderJob();
     this.entityListViewer = entityList;
     this.editor = editor;
     this.nameFinderView = nameFinderView;
     
     IPreferenceStore store = editor.getCasDocumentProvider().getTypeSystemPreferenceStore(editor.getEditorInput());
+    
+    store.addPropertyChangeListener(preferenceChangeTrigger);
+  }
+  
+  private static boolean contains(String array[], String element) {
+    
+    for (String arrayElement : array) {
+      if (element.equals(arrayElement))
+        return true;
+    }
+    
+    return false;
+  }
+  
+  public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+    // Problem: "The viewer should not be updated during this call, as it might be in 
+   //           the process of being disposed." (Javadoc)
+    // Does it mean that the name finder listener must check if the viewer is still alive?
+    
+    if (oldInput != null) {
+      ICasDocument oldDocument = (ICasDocument) oldInput;
+      oldDocument.removeChangeListener(casChangeListener);
+      oldDocument.removeChangeListener(casChangeTrigger);      
+    }
+    
+    if (newInput != null) {
+      input = (ICasDocument) newInput;
+      
+      // Note: Name Finder might run to often ... 
+      input.addChangeListener(casChangeListener);
+      input.addChangeListener(casChangeTrigger);
+      
+      runNameFinder();
+    }
+  }
+  
+  void runNameFinder() {
+    
+    IPreferenceStore store = editor.getCasDocumentProvider().getTypeSystemPreferenceStore(editor.getEditorInput());
+    
+    
+    // TODO: All preferences should be retrieved when the name finder executed!
+    // Just move it down the run method ...
     nameTypeNames = store.getString(OpenNLPPreferenceConstants.NAME_TYPE).split(",");
     
     for (int i = 0; i < nameTypeNames.length; i++) {
       nameTypeNames[i] = nameTypeNames[i].trim();
+      
+      if (nameTypeNames[i].isEmpty()) {
+        nameFinderView.setMessage("Name type name(s) must be set!");
+        return;
+      }
+    }
+    
+    confirmedEntities.clear();
+    
+    for (String nameTypeName : nameTypeNames) {
+      Type nameType = input.getCAS().getTypeSystem().getType(nameTypeName); 
+      
+      // TODO: Do error handling!
+      if (nameType == null)
+        return;
+      
+      FSIndex<AnnotationFS> nameAnnotations = input.getCAS()
+          .getAnnotationIndex(nameType);
+      
+      for (Iterator<AnnotationFS> nameIterator = nameAnnotations
+          .iterator(); nameIterator.hasNext();) {
+        
+        AnnotationFS nameAnnotation = (AnnotationFS) nameIterator.next();
+        
+        // TODO: Entity must have a type ...
+        Entity entity = new Entity(nameAnnotation.getBegin(),
+            nameAnnotation.getEnd(), nameAnnotation.getCoveredText(), null, true,
+            nameAnnotation.getType().getName());
+        entity.setLinkedAnnotation(nameAnnotation);
+        confirmedEntities.add(entity); // TODO: This needs to go into a second list!
+      }
     }
     
     nameFinder.addJobChangeListener(new JobChangeAdapter() {
@@ -331,60 +417,7 @@ public class EntityContentProvider imple
         });
       };
     });
-  }
-  
-  public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-    // Problem: "The viewer should not be updated during this call, as it might be in 
-   //           the process of being disposed." (Javadoc)
-    // Does it mean that the name finder listener must check if the viewer is still alive?
     
-    if (oldInput != null) {
-      ICasDocument oldDocument = (ICasDocument) oldInput;
-      oldDocument.removeChangeListener(casChangeListener);
-      oldDocument.removeChangeListener(nameFinderTrigger);      
-    }
-    
-    if (newInput != null) {
-      input = (ICasDocument) newInput;
-      
-      // Note: Name Finder might run to often ... 
-      input.addChangeListener(casChangeListener);
-      input.addChangeListener(nameFinderTrigger);
-      
-      // Create initial list of confirmed entities ...
-      
-      for (String nameTypeName : nameTypeNames) {
-        Type nameType = input.getCAS().getTypeSystem().getType(nameTypeName); 
-        
-        // TODO: Do error handling!
-        if (nameType == null)
-          return;
-        
-        FSIndex<AnnotationFS> nameAnnotations = input.getCAS()
-            .getAnnotationIndex(nameType);
-        
-        for (Iterator<AnnotationFS> nameIterator = nameAnnotations
-            .iterator(); nameIterator.hasNext();) {
-          
-          AnnotationFS nameAnnotation = (AnnotationFS) nameIterator.next();
-          
-          // TODO: Entity must have a type ...
-          Entity entity = new Entity(nameAnnotation.getBegin(),
-              nameAnnotation.getEnd(), nameAnnotation.getCoveredText(), null, true,
-              nameAnnotation.getType().getName());
-          entity.setLinkedAnnotation(nameAnnotation);
-          confirmedEntities.add(entity); // TODO: This needs to go into a second list!
-        }
-      }
-      
-      runNameFinder();
-    }
-  }
-  
-  void runNameFinder() {
-    
-    IPreferenceStore store = editor.getCasDocumentProvider().getTypeSystemPreferenceStore(editor.getEditorInput());
     String sentenceTypeName = store.getString(OpenNLPPreferenceConstants.SENTENCE_TYPE);
     
     if (sentenceTypeName.isEmpty()) {
@@ -527,6 +560,8 @@ public class EntityContentProvider imple
   }
   
   public void dispose() {
+    IPreferenceStore store = editor.getCasDocumentProvider().getTypeSystemPreferenceStore(editor.getEditorInput());
+    store.removePropertyChangeListener(preferenceChangeTrigger);
   }
   
   static List<Entity> searchEntities(List<Entity> entities, int begin, int end) {

Modified: incubator/opennlp/sandbox/caseditor-opennlp-plugin/src/main/java/org/apache/opennlp/caseditor/namefinder/NameFinderViewPage.java
URL: http://svn.apache.org/viewvc/incubator/opennlp/sandbox/caseditor-opennlp-plugin/src/main/java/org/apache/opennlp/caseditor/namefinder/NameFinderViewPage.java?rev=1182856&r1=1182855&r2=1182856&view=diff
==============================================================================
--- incubator/opennlp/sandbox/caseditor-opennlp-plugin/src/main/java/org/apache/opennlp/caseditor/namefinder/NameFinderViewPage.java (original)
+++ incubator/opennlp/sandbox/caseditor-opennlp-plugin/src/main/java/org/apache/opennlp/caseditor/namefinder/NameFinderViewPage.java Thu Oct 13 13:47:38 2011
@@ -36,7 +36,6 @@ import org.eclipse.jface.viewers.TableVi
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Table;
 import org.eclipse.swt.widgets.TableColumn;
 import org.eclipse.swt.widgets.Text;
@@ -97,7 +96,7 @@ class NameFinderViewPage extends Page im
     typeColumn.setWidth(40);
     
     entityList.setLabelProvider(new EntityLabelProvider());
-    entityList.setContentProvider(new EntityContentProvider(this, (AnnotationEditor) editor, new NameFinderJob(), entityList));
+    entityList.setContentProvider(new EntityContentProvider(this, (AnnotationEditor) editor, entityList));
     getSite().setSelectionProvider(entityList);
     
     entityList.setComparator(new EntityComperator());