You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by pk...@apache.org on 2019/06/14 07:25:40 UTC

svn commit: r1861314 - in /uima/ruta/trunk/ruta-core/src: main/java/org/apache/uima/ruta/action/ main/java/org/apache/uima/ruta/block/ main/java/org/apache/uima/ruta/condition/ main/java/org/apache/uima/ruta/rule/ main/java/org/apache/uima/ruta/verbali...

Author: pkluegl
Date: Fri Jun 14 07:25:40 2019
New Revision: 1861314

URL: http://svn.apache.org/viewvc?rev=1861314&view=rev
Log:
UIMA-6065: fix NPE for optional in FOREACH

Modified:
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/GetFeatureAction.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/ForEachBlock.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/RutaScriptBlock.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/PositionCondition.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java
    uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/block/ForEachBlockTest.java

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/GetFeatureAction.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/GetFeatureAction.java?rev=1861314&r1=1861313&r2=1861314&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/GetFeatureAction.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/GetFeatureAction.java Fri Jun 14 07:25:40 2019
@@ -33,6 +33,7 @@ import org.apache.uima.ruta.expression.s
 import org.apache.uima.ruta.rule.MatchContext;
 import org.apache.uima.ruta.rule.RuleElement;
 import org.apache.uima.ruta.rule.RuleMatch;
+import org.apache.uima.ruta.rule.RutaMatcher;
 import org.apache.uima.ruta.rule.RutaRuleElement;
 import org.apache.uima.ruta.visitor.InferenceCrowd;
 
@@ -57,7 +58,10 @@ public class GetFeatureAction extends Ab
 
     Type type = null;
     if (element instanceof RutaRuleElement) {
-      type = ((RutaRuleElement) element).getMatcher().getType(parent, stream);
+      RutaMatcher matcher = ((RutaRuleElement) element).getMatcher();
+      if (matcher != null) {
+        type = matcher.getType(parent, stream);
+      }
     }
     if (type == null) {
       return;

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/ForEachBlock.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/ForEachBlock.java?rev=1861314&r1=1861313&r2=1861314&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/ForEachBlock.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/ForEachBlock.java Fri Jun 14 07:25:40 2019
@@ -122,6 +122,9 @@ public class ForEachBlock extends RutaBl
   private boolean setRuleElementAnchorRecursively(RuleElement ruleElement) {
     if (ruleElement instanceof RutaRuleElement) {
       RutaMatcher matcher = ((RutaRuleElement) ruleElement).getMatcher();
+      if (matcher == null) {
+        return false;
+      }
       IRutaExpression expression = matcher.getExpression();
       if (expression instanceof AnnotationTypeExpression) {
         MatchReference reference = ((AnnotationTypeExpression) expression).getReference();

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/RutaScriptBlock.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/RutaScriptBlock.java?rev=1861314&r1=1861313&r2=1861314&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/RutaScriptBlock.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/block/RutaScriptBlock.java Fri Jun 14 07:25:40 2019
@@ -30,6 +30,7 @@ import org.apache.uima.ruta.rule.Abstrac
 import org.apache.uima.ruta.rule.AbstractRuleMatch;
 import org.apache.uima.ruta.rule.RuleApply;
 import org.apache.uima.ruta.rule.RuleMatch;
+import org.apache.uima.ruta.rule.RutaMatcher;
 import org.apache.uima.ruta.rule.RutaRule;
 import org.apache.uima.ruta.rule.RutaRuleElement;
 import org.apache.uima.ruta.visitor.InferenceCrowd;
@@ -59,8 +60,12 @@ public class RutaScriptBlock extends Rut
           continue;
         }
         // TODO refactor!!
-        Type type = ((RutaRuleElement) rule.getRuleElements().get(0)).getMatcher()
-                .getType(getParent() == null ? this : getParent(), stream);
+        RutaMatcher matcher = ((RutaRuleElement) rule.getRuleElements().get(0)).getMatcher();
+        if (matcher == null) {
+          continue;
+        }
+
+        Type type = matcher.getType(getParent() == null ? this : getParent(), stream);
         RutaStream window = stream.getWindowStream(each, type);
         for (RutaStatement element : getElements()) {
           if (element != null) {

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/PositionCondition.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/PositionCondition.java?rev=1861314&r1=1861313&r2=1861314&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/PositionCondition.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/PositionCondition.java Fri Jun 14 07:25:40 2019
@@ -32,6 +32,7 @@ import org.apache.uima.ruta.expression.t
 import org.apache.uima.ruta.rule.EvaluatedCondition;
 import org.apache.uima.ruta.rule.MatchContext;
 import org.apache.uima.ruta.rule.RuleElement;
+import org.apache.uima.ruta.rule.RutaMatcher;
 import org.apache.uima.ruta.rule.RutaRuleElement;
 import org.apache.uima.ruta.type.RutaBasic;
 import org.apache.uima.ruta.visitor.InferenceCrowd;
@@ -91,7 +92,10 @@ public class PositionCondition extends T
     List<Type> targetTypes = new ArrayList<Type>();
     if (element instanceof RutaRuleElement) {
       RutaRuleElement re = (RutaRuleElement) element;
-      targetTypes.add(re.getMatcher().getType(element.getParent(), stream));
+      RutaMatcher matcher = re.getMatcher();
+      if (matcher != null) {
+        targetTypes.add(matcher.getType(element.getParent(), stream));
+      }
     } else {
       targetTypes.add(annotation.getType());
     }

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java?rev=1861314&r1=1861313&r2=1861314&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java Fri Jun 14 07:25:40 2019
@@ -473,7 +473,7 @@ public class WildCardRuleElement extends
           Type type = matcher.getType(parent, stream);
           iterator = getIteratorOfType(after, type, annotation, stream);
         }
-      } else {
+      } else if (matcher != null) {
         // fallback
         Type type = matcher.getType(parent, stream);
         iterator = getIteratorOfType(after, type, annotation, stream);
@@ -580,6 +580,9 @@ public class WildCardRuleElement extends
           RutaStream stream, InferenceCrowd crowd) {
     List<RuleMatch> result = new ArrayList<RuleMatch>();
     RutaLiteralMatcher matcher = (RutaLiteralMatcher) nextElement.getMatcher();
+    if (matcher == null) {
+      return result;
+    }
     IStringExpression expression = matcher.getExpression();
     MatchContext context = new MatchContext(this, ruleMatch, true);
     String stringValue = expression.getStringValue(context, stream);

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java?rev=1861314&r1=1861313&r2=1861314&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java Fri Jun 14 07:25:40 2019
@@ -156,14 +156,19 @@ public class ScriptVerbalizer {
       RutaRuleElement tmre = (RutaRuleElement) re;
       RutaMatcher matcher = tmre.getMatcher();
       // action-only rule
-      IRutaExpression expression = matcher.getExpression();
-      boolean actionOnlyRule = expression == null;
-      if (expression != null) {
-        String verbalize = verbalizer.verbalize(expression);
-        if (StringUtils.isBlank(verbalize)) {
-          actionOnlyRule = true;
-        } else {
-          result.append(verbalize);
+      boolean actionOnlyRule = false;
+      if (matcher == null) {
+        result.append("_");
+      } else {
+        IRutaExpression expression = matcher.getExpression();
+        actionOnlyRule = expression == null;
+        if (expression != null) {
+          String verbalize = verbalizer.verbalize(expression);
+          if (StringUtils.isBlank(verbalize)) {
+            actionOnlyRule = true;
+          } else {
+            result.append(verbalize);
+          }
         }
       }
       if (actionOnlyRule) {

Modified: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/block/ForEachBlockTest.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/block/ForEachBlockTest.java?rev=1861314&r1=1861313&r2=1861314&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/block/ForEachBlockTest.java (original)
+++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/block/ForEachBlockTest.java Fri Jun 14 07:25:40 2019
@@ -35,17 +35,12 @@ public class ForEachBlockTest {
   private String text = "Some text 4 more text.";
 
   @Test
-  public void testDefault() {
+  public void testDefault() throws Exception {
 
     String script = getForEachScript();
 
-    CAS cas = null;
-    try {
-      cas = RutaTestUtils.getCAS(text);
-      Ruta.apply(cas, script);
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
+    CAS cas = RutaTestUtils.getCAS(text);
+    Ruta.apply(cas, script);
 
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "4");
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "4");
@@ -58,7 +53,6 @@ public class ForEachBlockTest {
     RutaTestUtils.assertAnnotationsEquals(cas, 9, 1, "Some");
     RutaTestUtils.assertAnnotationsEquals(cas, 10, 1, "4");
 
-    cas.release();
   }
 
   @Test
@@ -90,8 +84,6 @@ public class ForEachBlockTest {
     long endForEach = System.currentTimeMillis();
     System.out.println("FOREACH: " + (endForEach - startForEach) + "ms");
 
-    cas.release();
-
   }
 
   private String getForEachScript() {
@@ -128,7 +120,6 @@ public class ForEachBlockTest {
     Ruta.apply(cas, script);
 
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 2, "2^3", "2");
-    cas.release();
   }
 
   @Test
@@ -144,7 +135,6 @@ public class ForEachBlockTest {
     Ruta.apply(cas, script, parameters);
 
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 2, "4", "2^3");
-    cas.release();
   }
 
   @Test
@@ -161,7 +151,6 @@ public class ForEachBlockTest {
 
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 3, "text 4x2^3", "text 4x2", "text 4");
     RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "text 4x2^3");
-    cas.release();
   }
 
   @Test
@@ -175,7 +164,6 @@ public class ForEachBlockTest {
     Ruta.apply(cas, script);
 
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "4x2^3");
-    cas.release();
   }
 
   @Test
@@ -189,7 +177,6 @@ public class ForEachBlockTest {
     Ruta.apply(cas, script);
 
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "1");
-    cas.release();
   }
 
   @Test
@@ -207,7 +194,19 @@ public class ForEachBlockTest {
 
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 0);
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 3, "1", "22", "333");
-    cas.release();
+  }
+
+  @Test
+  public void testWithOptional() throws Exception {
+    String script = "";
+    script += "FOREACH(num) NUM{} {\n";
+    script += "_{-PARTOF(W)} num{-> T1};\n";
+    script += "}\n";
+
+    CAS cas = RutaTestUtils.getCAS("1 22 333");
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 3, "1", "22", "333");
   }
 
 }