Author: pkluegl Date: Fri Dec 21 13:12:52 2018 New Revision: 1849472 URL: http://svn.apache.org/viewvc?rev=1849472&view=rev Log: UIMA-5774: check on null
Removed: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/VariableCondition.java Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/AfterCondition.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/BeforeCondition.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ContextCountCondition.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/CurrentCountCondition.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/EndsWithCondition.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/FeatureCondition.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ImplicitCondition.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/InListCondition.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/IsCondition.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/LastCondition.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/NearCondition.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/PartOfNeqCondition.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/condition/RegExpCondition.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ScoreCondition.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/StartsWithCondition.java uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpressionTest.java Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/AfterCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/AfterCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/AfterCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/AfterCondition.java Fri Dec 21 13:12:52 2018 @@ -62,6 +62,9 @@ public class AfterCondition extends Type } private boolean check(AnnotationFS annotation, RutaStream stream, Type t) { + if (annotation == null) { + return false; + } boolean result = false; FSIterator<AnnotationFS> it = stream.getCas().getAnnotationIndex(t).iterator(annotation); if (!it.isValid()) { Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/BeforeCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/BeforeCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/BeforeCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/BeforeCondition.java Fri Dec 21 13:12:52 2018 @@ -62,6 +62,9 @@ public class BeforeCondition extends Typ } private boolean check(AnnotationFS annotation, RutaStream stream, Type t) { + if (annotation == null) { + return false; + } boolean result = false; FSIterator<AnnotationFS> it = stream.getCas().getAnnotationIndex(t).iterator(annotation); while (it.isValid()) { Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ConditionFactory.java Fri Dec 21 13:12:52 2018 @@ -128,7 +128,8 @@ public class ConditionFactory { } throw new RutaParseRuntimeException( - "The condition CONTAINS does not support the following arguments in script " + parent.getName() + ": " + sb.toString()); + "The condition CONTAINS does not support the following arguments in script " + + parent.getName() + ": " + sb.toString()); } public AbstractRutaCondition createConditionContains(ITypeExpression typeExpr, @@ -259,10 +260,6 @@ public class ConditionFactory { return new ParseCondition(var, localeExpr); } - public AbstractRutaCondition createConditionVariable(Token id) { - return new VariableCondition(id.getText()); - } - public AbstractRutaCondition createConditionIs(ITypeExpression type, AbstractTypeListExpression list, RutaBlock env) { if (type != null) { @@ -352,8 +349,9 @@ public class ConditionFactory { List<AbstractRutaCondition> conditions = macroConditionDefinition.getMiddle(); Set<String> vars = macroConditionDefinition.getRight(); if (definition.size() != argSize) { - throw new RutaParseRuntimeException("Arguments of macro action '" + name - + "' do not match its definition in script " + env.getName() + ": " + definition.values()); + throw new RutaParseRuntimeException( + "Arguments of macro action '" + name + "' do not match its definition in script " + + env.getName() + ": " + definition.values()); } return new MacroCondition(name, definition, conditions, vars, args); Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ContextCountCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ContextCountCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ContextCountCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ContextCountCondition.java Fri Dec 21 13:12:52 2018 @@ -68,27 +68,30 @@ public class ContextCountCondition exten } List<AnnotationFS> overlappingContexts = new ArrayList<AnnotationFS>(); for (AnnotationFS eachContext : visibleContexts) { - if (eachContext.getBegin() <= annotation.getBegin() + if (annotation != null && eachContext.getBegin() <= annotation.getBegin() && eachContext.getEnd() >= annotation.getEnd()) { overlappingContexts.add(eachContext); } } boolean result = false; + for (AnnotationFS eachContext : overlappingContexts) { int index = 0; int counter = 0; - List<RutaBasic> basicsInWindow = stream.getBasicsInWindow(eachContext); - for (RutaBasic eachBasic : basicsInWindow) { - Collection<AnnotationFS> beginAnchors = eachBasic.getBeginAnchors(annotation.getType()); - if (beginAnchors != null) { - for (AnnotationFS each : beginAnchors) { - counter++; - if (each.getBegin() == annotation.getBegin() - && each.getEnd() == annotation.getEnd() - && (each.getType().equals(annotation.getType()) || stream.getCas() - .getTypeSystem().subsumes(annotation.getType(), each.getType()))) { - index = counter; + + if (annotation != null) { + List<RutaBasic> basicsInWindow = stream.getBasicsInWindow(eachContext); + for (RutaBasic eachBasic : basicsInWindow) { + Collection<AnnotationFS> beginAnchors = eachBasic.getBeginAnchors(annotation.getType()); + if (beginAnchors != null) { + for (AnnotationFS each : beginAnchors) { + counter++; + if (each.getBegin() == annotation.getBegin() && each.getEnd() == annotation.getEnd() + && (each.getType().equals(annotation.getType()) || stream.getCas() + .getTypeSystem().subsumes(annotation.getType(), each.getType()))) { + index = counter; + } } } } Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/CurrentCountCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/CurrentCountCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/CurrentCountCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/CurrentCountCondition.java Fri Dec 21 13:12:52 2018 @@ -52,14 +52,16 @@ public class CurrentCountCondition exten RuleElement element = context.getElement(); int count = 0; - Iterator<AnnotationFS> it = stream.getCas().getAnnotationIndex(type.getType(context, stream)) - .iterator(); - while (it.hasNext()) { - AnnotationFS next = it.next(); - if (next.getBegin() < annotation.getBegin()) { - count++; - } else { - break; + if (annotation != null) { + Iterator<AnnotationFS> it = stream.getCas().getAnnotationIndex(type.getType(context, stream)) + .iterator(); + while (it.hasNext()) { + AnnotationFS next = it.next(); + if (next.getBegin() < annotation.getBegin()) { + count++; + } else { + break; + } } } if (var != null) { Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/EndsWithCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/EndsWithCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/EndsWithCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/EndsWithCondition.java Fri Dec 21 13:12:52 2018 @@ -62,8 +62,11 @@ public class EndsWithCondition extends T } } - private boolean check(RutaStream stream, AnnotationFS matched, Type givenType) { - RutaBasic endAnchor = stream.getEndAnchor(matched.getEnd()); + private boolean check(RutaStream stream, AnnotationFS annotation, Type givenType) { + if (annotation == null) { + return false; + } + RutaBasic endAnchor = stream.getEndAnchor(annotation.getEnd()); if (endAnchor != null) { return endAnchor.endsWith(givenType); } else { Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/FeatureCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/FeatureCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/FeatureCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/FeatureCondition.java Fri Dec 21 13:12:52 2018 @@ -44,7 +44,9 @@ public class FeatureCondition extends Ab @Override public EvaluatedCondition eval(MatchContext context, RutaStream stream, InferenceCrowd crowd) { AnnotationFS annotation = context.getAnnotation(); - + if (annotation == null) { + return new EvaluatedCondition(this, false); + } String typeWithFeature = annotation.getType().getName() + "." + featureStringExpression.getStringValue(context, stream); MatchReference mf = new MatchReference(typeWithFeature); Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ImplicitCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ImplicitCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ImplicitCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ImplicitCondition.java Fri Dec 21 13:12:52 2018 @@ -21,6 +21,7 @@ package org.apache.uima.ruta.condition; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import org.apache.commons.collections.CollectionUtils; @@ -57,22 +58,24 @@ public class ImplicitCondition extends A return new EvaluatedCondition(this, be.getBooleanValue(context, stream)); } else if (expr instanceof FeatureMatchExpression) { FeatureMatchExpression fme = (FeatureMatchExpression) expr; - List<AnnotationFS> annotations =new ArrayList<>(); + List<AnnotationFS> annotations = new ArrayList<>(); MatchReference matchReference = fme.getMatchReference(); // TODO refactor ITypeExpression typeExpr = matchReference.getTypeExpression(context, stream); - IAnnotationListExpression annotationListExpr = matchReference.getAnnotationListExpression(context, stream); - IAnnotationExpression annotationExpr = matchReference.getAnnotationExpression(context, stream); + IAnnotationListExpression annotationListExpr = matchReference + .getAnnotationListExpression(context, stream); + IAnnotationExpression annotationExpr = matchReference.getAnnotationExpression(context, + stream); if (typeExpr != null) { Type type = typeExpr.getType(context, stream); annotations = getAnnotationsToCheck(annotation, type, fme, stream); - } else if(annotationListExpr!=null) { + } else if (annotationListExpr != null) { annotations.addAll(annotationListExpr.getAnnotationList(context, stream)); - } else if(annotationExpr!=null) { + } else if (annotationExpr != null) { annotations.add(annotationExpr.getAnnotation(context, stream)); } - Collection<? extends FeatureStructure> featureAnnotations = fme.getFeatureStructures(annotations, true, - context, stream); + Collection<? extends FeatureStructure> featureAnnotations = fme + .getFeatureStructures(annotations, true, context, stream); return new EvaluatedCondition(this, !featureAnnotations.isEmpty()); } return new EvaluatedCondition(this, false); @@ -80,6 +83,11 @@ public class ImplicitCondition extends A private List<AnnotationFS> getAnnotationsToCheck(AnnotationFS annotation, Type type, FeatureMatchExpression fme, RutaStream stream) { + + if (annotation == null) { + return Collections.emptyList(); + } + List<AnnotationFS> result = new ArrayList<AnnotationFS>(); TypeSystem typeSystem = stream.getCas().getTypeSystem(); if (typeSystem.subsumes(type, annotation.getType())) { Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/InListCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/InListCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/InListCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/InListCondition.java Fri Dec 21 13:12:52 2018 @@ -54,6 +54,11 @@ public class InListCondition extends Ter @Override public EvaluatedCondition eval(MatchContext context, RutaStream stream, InferenceCrowd crowd) { AnnotationFS annotation = context.getAnnotation(); + + if (annotation == null) { + return new EvaluatedCondition(this, false); + } + String text = annotation.getCoveredText(); if (arg != null) { text = arg.getStringValue(context, stream); @@ -64,7 +69,7 @@ public class InListCondition extends Ter if (stringList == null) { RutaWordList wordList = listExpr.getList(context, stream); boolean contains = false; - if(wordList != null) { + if (wordList != null) { contains = wordList.contains(text, false, 0, null, 0, true); } return new EvaluatedCondition(this, contains); Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/IsCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/IsCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/IsCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/IsCondition.java Fri Dec 21 13:12:52 2018 @@ -45,10 +45,15 @@ public class IsCondition extends TypeSen @Override public EvaluatedCondition eval(MatchContext context, RutaStream stream, InferenceCrowd crowd) { AnnotationFS annotation = context.getAnnotation(); + + if (annotation == null) { + return new EvaluatedCondition(this, false); + } + RutaBasic beginAnchor = stream.getBeginAnchor(annotation.getBegin()); if (!isWorkingOnList()) { - Collection<AnnotationFS> beginAnchors = beginAnchor.getBeginAnchors(type.getType(context, - stream)); + Collection<AnnotationFS> beginAnchors = beginAnchor + .getBeginAnchors(type.getType(context, stream)); boolean result = false; if (beginAnchors != null) { for (AnnotationFS annotationFS : beginAnchors) { Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/LastCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/LastCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/LastCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/LastCondition.java Fri Dec 21 13:12:52 2018 @@ -37,6 +37,11 @@ public class LastCondition extends TypeS @Override public EvaluatedCondition eval(MatchContext context, RutaStream stream, InferenceCrowd crowd) { AnnotationFS annotation = context.getAnnotation(); + + if (annotation == null) { + return new EvaluatedCondition(this, false); + } + RutaBasic endAnchor = stream.getEndAnchor(annotation.getEnd()); Type t = type.getType(context, stream); boolean result = endAnchor.beginsWith(t) && endAnchor.endsWith(t); Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/NearCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/NearCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/NearCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/NearCondition.java Fri Dec 21 13:12:52 2018 @@ -55,12 +55,17 @@ public class NearCondition extends TypeS @Override public EvaluatedCondition eval(MatchContext context, RutaStream stream, InferenceCrowd crowd) { AnnotationFS annotation = context.getAnnotation(); + + if (annotation == null) { + return new EvaluatedCondition(this, false); + } + int maxValue = max.getIntegerValue(context, stream); int minValue = min.getIntegerValue(context, stream); boolean forwardValue = forward.getBooleanValue(context, stream); - FSIterator<AnnotationFS> it = filtered.getBooleanValue(context, stream) ? stream : stream - .getUnfilteredBasicIterator(); + FSIterator<AnnotationFS> it = filtered.getBooleanValue(context, stream) ? stream + : stream.getUnfilteredBasicIterator(); AnnotationFS pointer = null; if (forwardValue) { pointer = stream.getEndAnchor(annotation.getEnd()); Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ParseCondition.java Fri Dec 21 13:12:52 2018 @@ -52,6 +52,11 @@ public class ParseCondition extends Abst @Override public EvaluatedCondition eval(MatchContext context, RutaStream stream, InferenceCrowd crowd) { AnnotationFS annotation = context.getAnnotation(); + + if (annotation == null) { + return new EvaluatedCondition(this, false); + } + RuleElement element = context.getElement(); String text = annotation.getCoveredText(); RutaEnvironment env = element.getParent().getEnvironment(); Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/PartOfNeqCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/PartOfNeqCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/PartOfNeqCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/PartOfNeqCondition.java Fri Dec 21 13:12:52 2018 @@ -63,6 +63,11 @@ public class PartOfNeqCondition extends } private boolean check(AnnotationFS annotation, RutaStream stream, Type t) { + + if (annotation == null) { + return false; + } + RutaBasic beginAnchor = stream.getBeginAnchor(annotation.getBegin()); RutaBasic endAnchor = stream.getEndAnchor(annotation.getEnd()); boolean partOf = beginAnchor.isPartOf(t) || endAnchor.isPartOf(t); @@ -84,12 +89,13 @@ public class PartOfNeqCondition extends } for (AnnotationFS afs : set) { if (afs != null - && (afs.getType().equals(t) || stream.getCas().getTypeSystem() - .subsumes(t, afs.getType())) + && (afs.getType().equals(t) + || stream.getCas().getTypeSystem().subsumes(t, afs.getType())) && ((afs.getBegin() < annotation.getBegin() && afs.getEnd() > annotation.getEnd()) - || (afs.getBegin() == annotation.getBegin() && afs.getEnd() > annotation - .getEnd()) || (afs.getBegin() < annotation.getBegin() && afs - .getEnd() == annotation.getEnd()))) { + || (afs.getBegin() == annotation.getBegin() + && afs.getEnd() > annotation.getEnd()) + || (afs.getBegin() < annotation.getBegin() + && afs.getEnd() == annotation.getEnd()))) { return true; } 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=1849472&r1=1849471&r2=1849472&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 Dec 21 13:12:52 2018 @@ -52,6 +52,11 @@ public class PositionCondition extends T @Override public EvaluatedCondition eval(MatchContext context, RutaStream stream, InferenceCrowd crowd) { AnnotationFS annotation = context.getAnnotation(); + + if (annotation == null) { + return new EvaluatedCondition(this, false); + } + RuleElement element = context.getElement(); Type t = type.getType(context, stream); Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/RegExpCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/RegExpCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/RegExpCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/RegExpCondition.java Fri Dec 21 13:12:52 2018 @@ -53,6 +53,11 @@ public class RegExpCondition extends Ter @Override public EvaluatedCondition eval(MatchContext context, RutaStream stream, InferenceCrowd crowd) { AnnotationFS annotation = context.getAnnotation(); + + if (annotation == null) { + return new EvaluatedCondition(this, false); + } + Matcher matcher = null; boolean ignore = ignoreCase == null ? false : ignoreCase.getBooleanValue(context, stream); String stringValue = pattern.getStringValue(context, stream); Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ScoreCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ScoreCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ScoreCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/ScoreCondition.java Fri Dec 21 13:12:52 2018 @@ -46,6 +46,11 @@ public class ScoreCondition extends Term @Override public EvaluatedCondition eval(MatchContext context, RutaStream stream, InferenceCrowd crowd) { AnnotationFS annotation = context.getAnnotation(); + + if (annotation == null) { + return new EvaluatedCondition(this, false); + } + RuleElement element = context.getElement(); double score = 0; RutaAnnotation rutaAnnotation = stream.getRutaAnnotationFor(annotation, false, stream); Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/StartsWithCondition.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/StartsWithCondition.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/StartsWithCondition.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/condition/StartsWithCondition.java Fri Dec 21 13:12:52 2018 @@ -65,6 +65,7 @@ public class StartsWithCondition extends } private boolean check(AnnotationFS annotation, Type t, RutaStream stream) { + if (annotation == null) { return false; } Modified: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpressionTest.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpressionTest.java?rev=1849472&r1=1849471&r2=1849472&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpressionTest.java (original) +++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpressionTest.java Fri Dec 21 13:12:52 2018 @@ -217,14 +217,14 @@ public class AnnotationFeatureExpression RutaTestUtils.assertAnnotationsEquals(cas, 10, 1, "Some"); } - + @Test public void testFeatureMatch() throws Exception { String document = "This is a test."; String script = ""; script += "Document{-> CREATE(Struct1, \"a\" = SW.begin == 8)};\n"; script += "Struct1.a{-> T1};\n"; - + Map<String, String> complexTypes = new TreeMap<String, String>(); complexTypes.put("Struct1", "uima.tcas.Annotation"); Map<String, List<TestFeature>> features = new TreeMap<String, List<TestFeature>>(); @@ -232,11 +232,35 @@ public class AnnotationFeatureExpression features.put("Struct1", list); list.add(new TestFeature("a", "", "uima.tcas.Annotation")); list.add(new TestFeature("as", "", "uima.cas.FSArray")); - + CAS cas = RutaTestUtils.getCAS(document, complexTypes, features); - Ruta.apply(cas, script); - + Ruta.apply(cas, script); + RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "a"); } + @Test + public void testPartofOnNullMatch() throws Exception { + String document = "Some text."; + String script = ""; + script += "W{-> CREATE(Struct)};\n"; + script += "Struct.a{PARTOF(CW)-> T1};\n"; + + Map<String, String> typeMap = new TreeMap<String, String>(); + String typeName1 = "Struct"; + typeMap.put(typeName1, "uima.tcas.Annotation"); + + Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>(); + List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>(); + featureMap.put(typeName1, list); + String fn1 = "a"; + list.add(new TestFeature(fn1, "", "uima.tcas.Annotation")); + + CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap); + Ruta.apply(cas, script); + + RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Some"); + + } + }