Author: rec
Date: Sun Nov  2 21:12:23 2014
New Revision: 1636194

URL: http://svn.apache.org/r1636194
Log:
[UIMA-3024] CASDumpWriter is sensitive to type system changes
- Added parameter to sort annotations instead of relying on index order. 
Disabled by default because it is assumed that client configures index order 
using type priorities.

Modified:
    
uima/uimafit/trunk/uimafit-core/src/main/java/org/apache/uima/fit/component/CasDumpWriter.java

Modified: 
uima/uimafit/trunk/uimafit-core/src/main/java/org/apache/uima/fit/component/CasDumpWriter.java
URL: 
http://svn.apache.org/viewvc/uima/uimafit/trunk/uimafit-core/src/main/java/org/apache/uima/fit/component/CasDumpWriter.java?rev=1636194&r1=1636193&r2=1636194&view=diff
==============================================================================
--- 
uima/uimafit/trunk/uimafit-core/src/main/java/org/apache/uima/fit/component/CasDumpWriter.java
 (original)
+++ 
uima/uimafit/trunk/uimafit-core/src/main/java/org/apache/uima/fit/component/CasDumpWriter.java
 Sun Nov  2 21:12:23 2014
@@ -24,8 +24,12 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -35,7 +39,6 @@ import org.apache.commons.io.output.Clos
 import org.apache.uima.UimaContext;
 import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
 import org.apache.uima.cas.CAS;
-import org.apache.uima.cas.FSIterator;
 import org.apache.uima.cas.FeatureStructure;
 import org.apache.uima.cas.Type;
 import org.apache.uima.cas.text.AnnotationFS;
@@ -99,6 +102,15 @@ public class CasDumpWriter extends CasCo
   @ConfigurationParameter(name = PARAM_TYPE_PATTERNS, mandatory = true, 
defaultValue = { "+|.*" })
   private String[] typePatterns;
 
+  /**
+   * Sort increasing by begin, decreasing by end, increasing by name instead 
of relying on index
+   * order.
+   */
+  public static final String PARAM_SORT = "sort";
+
+  @ConfigurationParameter(name = PARAM_SORT, mandatory = true, defaultValue = 
"false")
+  private boolean sort;
+    
   private InExPattern[] cookedTypePatterns;
 
   private PrintWriter out;
@@ -173,7 +185,34 @@ public class CasDumpWriter extends CasCo
 
   private void processFeatureStructures(CAS aCAS) {
     Set<String> typesToPrint = getTypes(aCAS);
-    FSIterator<AnnotationFS> annotationIterator = 
aCAS.getAnnotationIndex().iterator();
+    Iterator<AnnotationFS> annotationIterator = 
aCAS.getAnnotationIndex().iterator();
+
+    if (sort) {
+      List<AnnotationFS> sortedFS = new ArrayList<AnnotationFS>();
+      while (annotationIterator.hasNext()) {
+        sortedFS.add(annotationIterator.next());
+      }
+
+      Collections.sort(sortedFS, new Comparator<AnnotationFS>() {
+        @Override
+        public int compare(AnnotationFS aO1, AnnotationFS aO2) {
+          int begin = aO1.getBegin() - aO2.getBegin();
+          if (begin != 0) {
+            return begin;
+          }
+
+          int end = aO2.getEnd() - aO1.getEnd();
+          if (end != 0) {
+            return end;
+          }
+
+          return aO1.getType().getName().compareTo(aO2.getType().getName());
+        }
+      });
+      
+      annotationIterator = sortedFS.iterator();
+    }
+
     while (annotationIterator.hasNext()) {
       AnnotationFS annotation = annotationIterator.next();
       if (!typesToPrint.contains(annotation.getType().getName())) {
@@ -187,7 +226,7 @@ public class CasDumpWriter extends CasCo
       processFeatureStructure(annotation);
     }
   }
-
+  
   private void processFeatureStructure(FeatureStructure aFS) {
     String meta = aFS.toString();
     for (String line : meta.split("\n")) {


Reply via email to