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 2015/11/13 19:09:28 UTC
svn commit: r1714245 - in /uima/ruta/branches/UIMA-4408/ruta-core/src/main:
antlr3/org/apache/uima/ruta/parser/ java/org/apache/uima/ruta/
java/org/apache/uima/ruta/action/ java/org/apache/uima/ruta/condition/
java/org/apache/uima/ruta/expression/ java...
Author: pkluegl
Date: Fri Nov 13 18:09:27 2015
New Revision: 1714245
URL: http://svn.apache.org/viewvc?rev=1714245&view=rev
Log:
UIMA-4408 + UIMA-4683
- towards general annotation expression handling in ruta
Added:
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java (with props)
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpression.java (with props)
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFunctionExpression.java (with props)
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaAnnotationFunctionExtension.java (with props)
Modified:
uima/ruta/branches/UIMA-4408/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/AbstractStructureAction.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitFeatureAction.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/SetFeatureAction.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/FeatureCondition.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/ImplicitCondition.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationExpression.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureExpression.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureMatchExpression.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/SimpleFeatureExpression.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/RutaExternalFactory.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaTypeMatcher.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ExpressionVerbalizer.java
uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g Fri Nov 13 18:09:27 2015
@@ -399,6 +399,9 @@ public void setExternalFactory(RutaExter
private boolean isTypeFunctionExtension(String name) {
return external.getTypeFunctionExtensions().keySet().contains(name);
}
+ private boolean isAnnotationFunctionExtension(String name) {
+ return external.getAnnotationFunctionExtensions().keySet().contains(name);
+ }
private boolean isBlockExtension(String name) {
return external.getBlockExtensions().keySet().contains(name);
}
@@ -1148,16 +1151,16 @@ typeMatchExpression returns [IRutaExpres
options {
backtrack = true;
}
- :
- (typeFunction)=> tf = typeFunction {expr = tf;}
+ :
+ (featureMatchExpression)=> fme = featureMatchExpression {expr = fme;}
|
- (matchReference)=> mr = matchReference {expr = mr;}
+ (typeExpression)=> te = typeExpression {expr = te;}
;
matchReference returns [MatchReference mr = null]
:
- ref = dottedId ((comp = LESS | comp = GREATER | comp = GREATEREQUAL | comp = LESSEQUAL |comp = EQUAL | comp = NOTEQUAL) arg = argument)?
- {mr = ExpressionFactory.createMatchReference(ref, comp, arg);}
+ ref = dottedId
+ {mr = ExpressionFactory.createMatchReference(ref);}
;
typeExpression returns [TypeExpression type = null]
@@ -1196,6 +1199,13 @@ simpleTypeExpression returns [TypeExpres
{type = ExpressionFactory.createSimpleTypeExpression(at, $blockDeclaration::env);}
;
+
+matchExpression returns [FeatureExpression feat = null]
+ :
+ match = dottedId
+ {MatchReference mr = ExpressionFactory.createMatchReference(match);}
+ ;
+
featureExpression returns [FeatureExpression feat = null]
@init{
List<Token> fs = new ArrayList<Token>();
@@ -1204,25 +1214,30 @@ TypeExpression te = null;
:
match = dottedId2
{
- MatchReference mr = ExpressionFactory.createMatchReference(match, null, null);
+ MatchReference mr = ExpressionFactory.createMatchReference(match);
feat = ExpressionFactory.createFeatureExpression(mr, $blockDeclaration::env);
}
;
-featureMatchExpression returns [FeatureMatchExpression fme = null]
+featureMatchExpression returns [FeatureExpression fme = null]
:
match = dottedId2 ((comp = LESS | comp = GREATER | comp = GREATEREQUAL | comp = LESSEQUAL |comp = EQUAL | comp = NOTEQUAL) arg = argument)?
{
- MatchReference mr = ExpressionFactory.createMatchReference(match, comp, arg);
- fme = ExpressionFactory.createFeatureMatchExpression(mr, $blockDeclaration::env);}
+ MatchReference mr = ExpressionFactory.createMatchReference(match);
+ if(comp != null) {
+ fme = ExpressionFactory.createFeatureMatchExpression(mr, comp, arg, $blockDeclaration::env);
+ } else {
+ fme = ExpressionFactory.createFeatureExpression(mr, $blockDeclaration::env);
+ }
+ }
;
featureMatchExpression2 returns [FeatureMatchExpression fme = null]
:
match = dottedId2 (comp = LESS | comp = GREATER | comp = GREATEREQUAL | comp = LESSEQUAL |comp = EQUAL | comp = NOTEQUAL) arg = argument
{
- MatchReference mr = ExpressionFactory.createMatchReference(match, comp, arg);
- fme = ExpressionFactory.createFeatureMatchExpression(mr, $blockDeclaration::env);}
+ MatchReference mr = ExpressionFactory.createMatchReference(match);
+ fme = ExpressionFactory.createFeatureMatchExpression(mr, comp, arg, $blockDeclaration::env);}
;
@@ -1230,8 +1245,8 @@ featureAssignmentExpression returns [Fea
:
match = dottedId2 op = ASSIGN_EQUAL arg = argument
{
- MatchReference mr = ExpressionFactory.createMatchReference(match, op, arg);
- fme = ExpressionFactory.createFeatureMatchExpression(mr, $blockDeclaration::env);
+ MatchReference mr = ExpressionFactory.createMatchReference(match);
+ fme = ExpressionFactory.createFeatureMatchExpression(mr, op, arg, $blockDeclaration::env);
}
;
@@ -2179,7 +2194,14 @@ options {
annotationOrTypeExpression returns [IRutaExpression expr = null]
:
- a1 = typeExpression {expr = a1;}
+ aae = annotationAddressExpression {expr = aae;}
+ |
+ tf = typeFunction {expr = tf;}
+ |
+ af = annotationFunction {expr = af;}
+ |
+ ref = dottedId
+ {expr = ExpressionFactory.createGenericExpression(ref);}
;
annotationExpression returns [IRutaExpression expr = null]
@@ -2206,6 +2228,21 @@ annotationLabelExpression returns [IRuta
label = Identifier {expr = ExpressionFactory.createAnnotationLabelExpression(label);}
;
+annotationFunction returns [IAnnotationExpression expr = null]
+ :
+ (e = externalAnnotationFunction)=> e = externalAnnotationFunction {expr = e;}
+ ;
+
+externalAnnotationFunction returns [IAnnotationExpression expr = null]
+ :
+ {isAnnotationFunctionExtension(input.LT(1).getText())}?
+ id = Identifier LPAREN
+ args = varArgumentList? RPAREN
+ {
+ expr = external.createExternalAnnotationFunction(id, args);
+ }
+ ;
+
nullExpression returns [IRutaExpression expr = null]
:
NULL {expr = ExpressionFactory.createNullExpression();}
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaScriptFactory.java Fri Nov 13 18:09:27 2015
@@ -29,13 +29,12 @@ import org.apache.uima.UimaContext;
import org.apache.uima.ruta.action.AbstractRutaAction;
import org.apache.uima.ruta.condition.AbstractRutaCondition;
import org.apache.uima.ruta.expression.IRutaExpression;
-import org.apache.uima.ruta.expression.MatchReference;
import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
+import org.apache.uima.ruta.expression.feature.FeatureExpression;
import org.apache.uima.ruta.expression.number.INumberExpression;
import org.apache.uima.ruta.expression.string.IStringExpression;
import org.apache.uima.ruta.expression.type.ITypeExpression;
import org.apache.uima.ruta.expression.type.SimpleTypeExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
import org.apache.uima.ruta.rule.AbstractRuleElement;
import org.apache.uima.ruta.rule.ComposedRuleElement;
import org.apache.uima.ruta.rule.ConjunctRulesRuleElement;
@@ -105,8 +104,8 @@ public class RutaScriptFactory {
RutaScriptBlock result = createScriptBlock(module, null, null, null, defaultNamespace);
List<RuleElement> ruleElements = new ArrayList<RuleElement>();
RuleElementIsolator container = new RuleElementIsolator();
- ruleElements.add(createRuleElement(new MatchReference("uima.tcas.DocumentAnnotation", null,
- null), null, null, null, container, result));
+ ruleElements.add(createRuleElement(new SimpleTypeExpression("uima.tcas.DocumentAnnotation"), null,
+ null, null, container, result));
RutaRule createRule = createRule(ruleElements, result);
container.setContainer(createRule);
@@ -140,16 +139,16 @@ public class RutaScriptFactory {
RuleElementQuantifier quantifier, List<AbstractRutaCondition> conditions,
List<AbstractRutaAction> actions, RuleElementContainer container, RutaBlock parent) {
RutaMatcher matcher = null;
- if (expression instanceof MatchReference) {
- matcher = new RutaTypeMatcher((MatchReference) expression);
- } else if (expression instanceof ITypeExpression) {
- // e.g., for functions
- MatchReference matchReference = new MatchReference((TypeExpression) expression);
- matcher = new RutaTypeMatcher(matchReference);
+ if (expression instanceof ITypeExpression) {
+ matcher = new RutaTypeMatcher((ITypeExpression) expression);
+ } else if (expression instanceof FeatureExpression) {
+ matcher = new RutaTypeMatcher((FeatureExpression) expression);
} else if (expression instanceof IAnnotationExpression) {
- matcher = new RutaAnnotationMatcher((IAnnotationExpression)expression);
+ matcher = new RutaAnnotationMatcher((IAnnotationExpression) expression);
} else if (expression instanceof IStringExpression) {
matcher = new RutaLiteralMatcher((IStringExpression) expression);
+ } else {
+ throw new RuntimeException(expression.getClass().getSimpleName() + " is not a valid expression for a matching condition.");
}
return new RutaRuleElement(matcher, quantifier, conditions, actions, container, parent);
}
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java Fri Nov 13 18:09:27 2015
@@ -54,7 +54,6 @@ import org.apache.uima.ruta.expression.f
import org.apache.uima.ruta.expression.number.INumberExpression;
import org.apache.uima.ruta.expression.string.IStringExpression;
import org.apache.uima.ruta.expression.type.ITypeExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
import org.apache.uima.ruta.rule.AbstractRule;
import org.apache.uima.ruta.rule.AbstractRuleMatch;
import org.apache.uima.ruta.rule.MatchContext;
@@ -970,7 +969,7 @@ public class RutaStream extends FSIterat
}
} else if (value instanceof GenericFeatureExpression && !feature.getRange().isPrimitive()) {
FeatureExpression fe = ((GenericFeatureExpression) value).getFeatureExpression();
- TypeExpression typeExpr = fe.getTypeExpr(context, this);
+ ITypeExpression typeExpr = fe.getTypeExpr(context, this);
Type t = typeExpr.getType(context, this);
List<AnnotationFS> inWindow = this.getAnnotationsInWindow(context.getAnnotation(), t);
if (fe instanceof SimpleFeatureExpression) {
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/AbstractStructureAction.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/AbstractStructureAction.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/AbstractStructureAction.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/AbstractStructureAction.java Fri Nov 13 18:09:27 2015
@@ -40,6 +40,7 @@ import org.apache.uima.ruta.expression.f
import org.apache.uima.ruta.expression.feature.GenericFeatureExpression;
import org.apache.uima.ruta.expression.number.INumberExpression;
import org.apache.uima.ruta.expression.string.IStringExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
import org.apache.uima.ruta.expression.type.TypeExpression;
import org.apache.uima.ruta.rule.MatchContext;
import org.apache.uima.ruta.utils.UIMAUtils;
@@ -80,7 +81,7 @@ public abstract class AbstractStructureA
} else if (valueObject instanceof GenericFeatureExpression && !range.isPrimitive()) {
GenericFeatureExpression gfe = (GenericFeatureExpression) valueObject;
FeatureExpression fe = gfe.getFeatureExpression();
- TypeExpression type = fe.getTypeExpr(context, stream);
+ ITypeExpression type = fe.getTypeExpr(context, stream);
List<AnnotationFS> annotationsInWindow = stream.getAnnotationsInWindow(matchedAnnotation,
type.getType(context, stream));
List<AnnotationFS> featureAnnotations = annotationsInWindow;
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitFeatureAction.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitFeatureAction.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitFeatureAction.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/ImplicitFeatureAction.java Fri Nov 13 18:09:27 2015
@@ -33,7 +33,7 @@ import org.apache.uima.cas.text.Annotati
import org.apache.uima.ruta.RutaStream;
import org.apache.uima.ruta.expression.IRutaExpression;
import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
import org.apache.uima.ruta.rule.AnnotationComparator;
import org.apache.uima.ruta.rule.MatchContext;
import org.apache.uima.ruta.rule.RuleElement;
@@ -55,7 +55,7 @@ public class ImplicitFeatureAction exten
public void execute(MatchContext context, RutaStream stream, InferenceCrowd crowd) {
RuleMatch match = context.getRuleMatch();
RuleElement element = context.getElement();
- TypeExpression typeExpr = expr.getTypeExpr(context, stream);
+ ITypeExpression typeExpr = expr.getTypeExpr(context, stream);
Type type = typeExpr.getType(context, stream);
List<AnnotationFS> matchedAnnotations = match.getMatchedAnnotationsOfElement(element);
Collection<AnnotationFS> annotations = new TreeSet<AnnotationFS>(comp);
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/SetFeatureAction.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/SetFeatureAction.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/SetFeatureAction.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/action/SetFeatureAction.java Fri Nov 13 18:09:27 2015
@@ -32,7 +32,6 @@ import org.apache.uima.ruta.expression.f
import org.apache.uima.ruta.expression.number.INumberExpression;
import org.apache.uima.ruta.expression.string.IStringExpression;
import org.apache.uima.ruta.expression.type.ITypeExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
import org.apache.uima.ruta.rule.MatchContext;
import org.apache.uima.ruta.rule.RuleElement;
import org.apache.uima.ruta.rule.RuleMatch;
@@ -118,7 +117,7 @@ public class SetFeatureAction extends Ab
}
}
} else if (expr instanceof GenericFeatureExpression) {
- TypeExpression typeExpr = ((GenericFeatureExpression) expr).getFeatureExpression()
+ ITypeExpression typeExpr = ((GenericFeatureExpression) expr).getFeatureExpression()
.getTypeExpr(context, stream);
Type t = typeExpr.getType(context, stream);
List<AnnotationFS> inWindow = stream.getAnnotationsInWindow(annotationFS, t);
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/FeatureCondition.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/FeatureCondition.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/FeatureCondition.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/FeatureCondition.java Fri Nov 13 18:09:27 2015
@@ -23,7 +23,6 @@ import org.apache.uima.cas.text.Annotati
import org.apache.uima.ruta.RutaStream;
import org.apache.uima.ruta.expression.IRutaExpression;
import org.apache.uima.ruta.expression.MatchReference;
-import org.apache.uima.ruta.expression.feature.FeatureExpression;
import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
import org.apache.uima.ruta.expression.string.IStringExpression;
import org.apache.uima.ruta.rule.EvaluatedCondition;
@@ -48,14 +47,10 @@ public class FeatureCondition extends Ab
String typeWithFeature = annotation.getType().getName() + "."
+ featureStringExpression.getStringValue(context, stream);
- MatchReference mf = new MatchReference(typeWithFeature, "==", argExpr);
- FeatureExpression featureExpression = mf.getFeatureExpression(context, stream);
- if (featureExpression instanceof FeatureMatchExpression) {
- FeatureMatchExpression fme = (FeatureMatchExpression) featureExpression;
- boolean checkFeatureValue = fme.checkFeatureValue(annotation, context, stream);
- return new EvaluatedCondition(this, checkFeatureValue);
- }
- return new EvaluatedCondition(this, false);
+ MatchReference mf = new MatchReference(typeWithFeature);
+ FeatureMatchExpression fme = new FeatureMatchExpression(mf, "==", argExpr, context.getParent());
+ boolean checkFeatureValue = fme.checkFeatureValue(annotation, context, stream);
+ return new EvaluatedCondition(this, checkFeatureValue);
}
public IStringExpression getFeatureStringExpression() {
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/ImplicitCondition.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/ImplicitCondition.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/ImplicitCondition.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/condition/ImplicitCondition.java Fri Nov 13 18:09:27 2015
@@ -31,7 +31,7 @@ import org.apache.uima.ruta.RutaStream;
import org.apache.uima.ruta.expression.IRutaExpression;
import org.apache.uima.ruta.expression.bool.IBooleanExpression;
import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
import org.apache.uima.ruta.rule.EvaluatedCondition;
import org.apache.uima.ruta.rule.MatchContext;
import org.apache.uima.ruta.visitor.InferenceCrowd;
@@ -53,7 +53,7 @@ public class ImplicitCondition extends A
return new EvaluatedCondition(this, be.getBooleanValue(context, stream));
} else if (expr instanceof FeatureMatchExpression) {
FeatureMatchExpression fme = (FeatureMatchExpression) expr;
- TypeExpression typeExpr = fme.getTypeExpr(context, stream);
+ ITypeExpression typeExpr = fme.getTypeExpr(context, stream);
Type type = typeExpr.getType(context, stream);
List<AnnotationFS> annotations = getAnnotationsToCheck(annotation, type, fme, stream);
Collection<AnnotationFS> featureAnnotations = fme.getFeatureAnnotations(annotations, stream,
Added: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java?rev=1714245&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java (added)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java Fri Nov 13 18:09:27 2015
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.expression;
+
+import org.apache.uima.cas.Type;
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
+import org.apache.uima.ruta.rule.MatchContext;
+
+public class AnnotationTypeExpression extends RutaExpression implements ITypeExpression, IAnnotationExpression {
+
+
+ private MatchReference reference;
+
+ private ITypeExpression typeExpression;
+
+ private IAnnotationExpression annotationExpression;
+
+ private boolean initialized = false;
+
+ public AnnotationTypeExpression(MatchReference reference) {
+ super();
+ this.reference = reference;
+ }
+
+ private void initialize(MatchContext context, RutaStream stream) {
+ annotationExpression = reference.getAnnotationExpression(context, stream);
+ typeExpression = reference.getTypeExpression(context, stream);
+ initialized = true;
+ }
+
+
+ @Override
+ public AnnotationFS getAnnotation(MatchContext context, RutaStream stream) {
+ if (!initialized) {
+ initialize(context, stream);
+ }
+ return annotationExpression.getAnnotation(context, stream);
+ }
+
+ @Override
+ public Type getType(MatchContext context, RutaStream stream) {
+ if (!initialized) {
+ initialize(context, stream);
+ }
+ if(typeExpression != null) {
+ return typeExpression.getType(context, stream);
+ } else {
+ return getAnnotation(context, stream).getType();
+ }
+ }
+
+ @Override
+ public String getStringValue(MatchContext context, RutaStream stream) {
+ if (!initialized) {
+ initialize(context, stream);
+ }
+ if(annotationExpression != null) {
+ return annotationExpression.getStringValue(context, stream);
+ } else {
+ return typeExpression.getStringValue(context, stream);
+ }
+ }
+
+
+
+
+}
Propchange: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java Fri Nov 13 18:09:27 2015
@@ -25,6 +25,7 @@ import java.util.List;
import org.antlr.runtime.Token;
import org.apache.uima.ruta.RutaBlock;
import org.apache.uima.ruta.expression.annotation.AnnotationAddressExpression;
+import org.apache.uima.ruta.expression.annotation.AnnotationFeatureExpression;
import org.apache.uima.ruta.expression.annotation.AnnotationLabelExpression;
import org.apache.uima.ruta.expression.annotation.AnnotationVariableExpression;
import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
@@ -250,18 +251,18 @@ public class ExpressionFactory {
return new SimpleFeatureExpression(mr);
}
- public static FeatureMatchExpression createFeatureMatchExpression(MatchReference mr, RutaBlock env) {
- return new FeatureMatchExpression(mr, env);
+ public static FeatureMatchExpression createFeatureMatchExpression(MatchReference mr, Token opToken,
+ IRutaExpression arg, RutaBlock env) {
+ String op = "";
+ if(opToken != null) {
+ op = opToken.getText();
+ }
+ return new FeatureMatchExpression(mr, op, arg, env);
}
- public static MatchReference createMatchReference(Token refToken, Token opToken,
- IRutaExpression arg) {
+ public static MatchReference createMatchReference(Token refToken) {
String match = refToken.getText();
- String op = null;
- if (opToken != null) {
- op = opToken.getText();
- }
- return new MatchReference(match, op, arg);
+ return new MatchReference(match);
}
public static INumberExpression createNumberFeatureExpression(FeatureExpression fe) {
@@ -314,4 +315,14 @@ public class ExpressionFactory {
return null;
}
+ public static IAnnotationExpression createAnnotationFeatureExpression(
+ FeatureExpression featureExpression) {
+ return new AnnotationFeatureExpression(featureExpression);
+ }
+
+ public static IRutaExpression createGenericExpression(Token ref) {
+ MatchReference match = new MatchReference(ref.getText());
+ return new AnnotationTypeExpression(match);
+ }
+
}
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java Fri Nov 13 18:09:27 2015
@@ -25,47 +25,45 @@ import java.util.List;
import org.apache.uima.ruta.RutaBlock;
import org.apache.uima.ruta.RutaEnvironment;
import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.expression.annotation.AnnotationLabelExpression;
+import org.apache.uima.ruta.expression.annotation.AnnotationVariableExpression;
+import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
import org.apache.uima.ruta.expression.feature.FeatureExpression;
-import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
import org.apache.uima.ruta.expression.feature.SimpleFeatureExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
import org.apache.uima.ruta.expression.type.SimpleTypeExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
import org.apache.uima.ruta.expression.type.TypeVariableExpression;
import org.apache.uima.ruta.rule.MatchContext;
+import org.apache.uima.ruta.rule.RuleElement;
+import org.apache.uima.ruta.rule.RuleMatch;
public class MatchReference extends RutaExpression {
- private String match;
+ private String reference;
- private String op;
-
- private IRutaExpression arg;
-
- private TypeExpression typeExpression;
+ private ITypeExpression typeExpression;
+
+ private IAnnotationExpression annotationExpression;
private FeatureExpression featureExpression;
- public MatchReference(String match, String op, IRutaExpression arg) {
- super();
- this.match = match;
- this.op = op;
- this.arg = arg;
- }
-
- public MatchReference(TypeExpression expression) {
+ private boolean initialized = false;
+
+ public MatchReference(String reference) {
super();
- this.typeExpression = expression;
+ this.reference = reference;
}
private void resolve(MatchContext context, RutaStream stream) {
- if (typeExpression != null) {
+ if (initialized) {
return;
}
RutaBlock parent = context.getParent();
RutaEnvironment e = parent.getEnvironment();
- typeExpression = buildTypeExpression(match, e);
- if (typeExpression == null) {
- String[] elements = match.split("[.]");
+
+ boolean success = buildTypeOrAnnotationExpression(reference, e, context, stream);
+ if (!success) {
+ String[] elements = reference.split("[.]");
StringBuilder sb = new StringBuilder();
List<String> tail = null;
int counter = 0;
@@ -75,75 +73,65 @@ public class MatchReference extends Ruta
}
sb.append(eachPart);
String head = sb.toString();
- typeExpression = buildTypeExpression(head, e);
- if (typeExpression != null) {
+ success = buildTypeOrAnnotationExpression(head, e, context, stream);
+ if (success) {
tail = Arrays.asList(elements).subList(counter + 1, elements.length);
break;
}
counter++;
}
if (tail != null) {
- if (op == null) {
featureExpression = new SimpleFeatureExpression(typeExpression, tail);
- } else {
- SimpleFeatureExpression expr = new SimpleFeatureExpression(typeExpression, tail);
- featureExpression = new FeatureMatchExpression(expr, op, arg, parent);
- }
}
}
- if (typeExpression == null || typeExpression.getType(context, stream) == null) {
- throw new IllegalArgumentException("Not able to resolve type of expression: " + match);
+ initialized = true;
+ if (typeExpression == null && annotationExpression == null) {
+ throw new IllegalArgumentException("Not able to resolve annotation/type expression: " + reference);
}
}
-
- private TypeExpression buildTypeExpression(String candidate, RutaEnvironment e) {
+
+ private boolean buildTypeOrAnnotationExpression(String candidate, RutaEnvironment e, MatchContext context, RutaStream stream) {
if (e.isVariableOfType(candidate, "TYPE")) {
- return new TypeVariableExpression(candidate);
+ typeExpression = new TypeVariableExpression(candidate);
+ return true;
+ } else if (e.isVariableOfType(candidate, "ANNOTATION")) {
+ annotationExpression = new AnnotationVariableExpression(candidate);
+ return true;
} else if (e.getType(candidate) != null) {
- return new SimpleTypeExpression(candidate);
+ typeExpression = new SimpleTypeExpression(candidate);
+ return true;
+ } else if (context.getRuleMatch() != null) {
+ RuleMatch ruleMatch = context.getRuleMatch();
+ RuleElement ruleElementWithLabel = ruleMatch.getRule().getRuleElementWithLabel(candidate);
+ if(ruleElementWithLabel != null) {
+ annotationExpression = new AnnotationLabelExpression(candidate);
+ return true;
+ }
}
- return null;
+ return false;
}
- public TypeExpression getTypeExpression(MatchContext context, RutaStream stream) {
+ public ITypeExpression getTypeExpression(MatchContext context, RutaStream stream) {
resolve(context, stream);
return typeExpression;
}
-
- public FeatureExpression getFeatureExpression(MatchContext context, RutaStream stream) {
+
+ public IAnnotationExpression getAnnotationExpression(MatchContext context, RutaStream stream) {
resolve(context, stream);
- return featureExpression;
+ return annotationExpression;
}
- public String getOp() {
- return op;
- }
-
- public IRutaExpression getArg() {
- return arg;
- }
-
- public RutaExpression getRawTypeExpression() {
- return typeExpression;
- }
-
- public RutaExpression getRawFeatureExpression() {
+ public FeatureExpression getFeatureExpression(MatchContext context, RutaStream stream) {
+ resolve(context, stream);
return featureExpression;
}
public String toString() {
- String tail = "";
- if (op != null) {
- tail += op;
- }
- if (arg != null) {
- tail += arg.toString();
- }
- return match + tail;
+ return reference;
}
public String getMatch() {
- return match;
+ return reference;
}
}
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationExpression.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationExpression.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AbstractAnnotationExpression.java Fri Nov 13 18:09:27 2015
@@ -21,14 +21,19 @@ package org.apache.uima.ruta.expression.
import org.apache.uima.cas.text.AnnotationFS;
import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.expression.RutaExpression;
import org.apache.uima.ruta.rule.MatchContext;
-public abstract class AbstractAnnotationExpression implements IAnnotationExpression {
+public abstract class AbstractAnnotationExpression extends RutaExpression implements IAnnotationExpression {
@Override
public String getStringValue(MatchContext context, RutaStream stream) {
AnnotationFS annotation = getAnnotation(context, stream);
- return annotation.getCoveredText();
+ if(annotation != null) {
+ return annotation.getCoveredText();
+ } else {
+ return "null";
+ }
}
}
Added: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpression.java?rev=1714245&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpression.java (added)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpression.java Fri Nov 13 18:09:27 2015
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.expression.annotation;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.uima.cas.Feature;
+import org.apache.uima.cas.FeatureStructure;
+import org.apache.uima.cas.Type;
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.expression.feature.FeatureExpression;
+import org.apache.uima.ruta.rule.MatchContext;
+
+/**
+ * An expression referring to an annotation stored in a feature.
+ *
+ */
+public class AnnotationFeatureExpression extends AbstractAnnotationExpression {
+
+ private FeatureExpression fe;
+
+ public AnnotationFeatureExpression(FeatureExpression fe) {
+ super();
+ this.fe = fe;
+ }
+
+ @Override
+ public AnnotationFS getAnnotation(MatchContext context, RutaStream stream) {
+ AnnotationFS annotation = context.getAnnotation();
+ Type type = fe.getTypeExpr(context, stream).getType(context, stream);
+ Feature feature = fe.getFeature(context, stream);
+ List<AnnotationFS> list = getTargetAnnotation(annotation, type, stream);
+ Collection<AnnotationFS> featureAnnotations = fe.getFeatureAnnotations(list, stream, context,
+ false);
+ if (!featureAnnotations.isEmpty()) {
+ AnnotationFS next = featureAnnotations.iterator().next();
+ FeatureStructure featureValue = next.getFeatureValue(feature);
+ if(featureValue instanceof AnnotationFS) {
+ return (AnnotationFS) featureValue;
+ }
+ }
+ return null;
+ }
+
+
+ public FeatureExpression getFeatureExpression() {
+ return fe;
+ }
+
+ public void setFeatureExpression(FeatureExpression fe) {
+ this.fe = fe;
+ }
+
+
+
+}
Propchange: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFeatureExpression.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFunctionExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFunctionExpression.java?rev=1714245&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFunctionExpression.java (added)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFunctionExpression.java Fri Nov 13 18:09:27 2015
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.expression.annotation;
+
+public abstract class AnnotationFunctionExpression extends AbstractAnnotationExpression {
+
+}
Propchange: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationFunctionExpression.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureExpression.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureExpression.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureExpression.java Fri Nov 13 18:09:27 2015
@@ -26,7 +26,7 @@ import org.apache.uima.cas.Feature;
import org.apache.uima.cas.text.AnnotationFS;
import org.apache.uima.ruta.RutaStream;
import org.apache.uima.ruta.expression.RutaExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
import org.apache.uima.ruta.rule.MatchContext;
public abstract class FeatureExpression extends RutaExpression {
@@ -37,7 +37,7 @@ public abstract class FeatureExpression
public abstract List<String> getFeatureStringList(MatchContext context, RutaStream stream);
- public abstract TypeExpression getTypeExpr(MatchContext context, RutaStream stream);
+ public abstract ITypeExpression getTypeExpr(MatchContext context, RutaStream stream);
public abstract Collection<AnnotationFS> getFeatureAnnotations(
Collection<AnnotationFS> annotations, RutaStream stream, MatchContext context,
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureMatchExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureMatchExpression.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureMatchExpression.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureMatchExpression.java Fri Nov 13 18:09:27 2015
@@ -47,23 +47,13 @@ public class FeatureMatchExpression exte
private String op;
- public FeatureMatchExpression(FeatureExpression f, String op, IRutaExpression arg,
- RutaBlock parent) {
- // FIXME
- super(f.getTypeExpr(new MatchContext(parent), null), f.getFeatureStringList(new MatchContext(
- parent), null));
+ public FeatureMatchExpression(MatchReference mr, String op, IRutaExpression arg, RutaBlock env) {
+ super(mr);
this.op = op;
this.arg = arg;
}
- public FeatureMatchExpression(MatchReference mr, RutaBlock env) {
- super(mr);
- }
-
public IRutaExpression getArg() {
- if (getMatchReference() != null && arg == null) {
- arg = getMatchReference().getArg();
- }
return arg;
}
@@ -72,9 +62,6 @@ public class FeatureMatchExpression exte
}
public String getOp() {
- if (getMatchReference() != null && op == null) {
- op = getMatchReference().getOp();
- }
return op;
}
@@ -191,4 +178,15 @@ public class FeatureMatchExpression exte
return false;
}
+ public String toString() {
+ String result = super.toString();
+ if(op != null) {
+ result += op;
+ }
+ if(arg != null) {
+ result += arg.toString();
+ }
+ return result;
+ }
+
}
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/GenericFeatureExpression.java Fri Nov 13 18:09:27 2015
@@ -19,16 +19,18 @@
package org.apache.uima.ruta.expression.feature;
+import org.apache.uima.cas.text.AnnotationFS;
import org.apache.uima.ruta.RutaStream;
import org.apache.uima.ruta.expression.ExpressionFactory;
import org.apache.uima.ruta.expression.RutaExpression;
+import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
import org.apache.uima.ruta.expression.bool.IBooleanExpression;
import org.apache.uima.ruta.expression.number.INumberExpression;
import org.apache.uima.ruta.expression.string.IStringExpression;
import org.apache.uima.ruta.rule.MatchContext;
public class GenericFeatureExpression extends RutaExpression implements INumberExpression,
- IBooleanExpression, IStringExpression {
+ IBooleanExpression, IStringExpression, IAnnotationExpression {
private FeatureExpression featureExpression;
@@ -37,6 +39,8 @@ public class GenericFeatureExpression ex
private IStringExpression stringExpression;
private IBooleanExpression booleanExpression;
+
+ private IAnnotationExpression annotationExpression;
public GenericFeatureExpression(FeatureExpression fe) {
super();
@@ -83,6 +87,14 @@ public class GenericFeatureExpression ex
return numberExpression.getFloatValue(context, stream);
}
+ @Override
+ public AnnotationFS getAnnotation(MatchContext context, RutaStream stream) {
+ if (annotationExpression == null) {
+ annotationExpression = ExpressionFactory.createAnnotationFeatureExpression(featureExpression);
+ }
+ return annotationExpression.getAnnotation(context, stream);
+ }
+
public FeatureExpression getFeatureExpression() {
return featureExpression;
}
@@ -91,4 +103,5 @@ public class GenericFeatureExpression ex
this.featureExpression = featureExpression;
}
+
}
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/SimpleFeatureExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/SimpleFeatureExpression.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/SimpleFeatureExpression.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/SimpleFeatureExpression.java Fri Nov 13 18:09:27 2015
@@ -34,6 +34,7 @@ import org.apache.uima.ruta.UIMAConstant
import org.apache.uima.ruta.expression.IRutaExpression;
import org.apache.uima.ruta.expression.MatchReference;
import org.apache.uima.ruta.expression.NullExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
import org.apache.uima.ruta.expression.type.TypeExpression;
import org.apache.uima.ruta.rule.AnnotationComparator;
import org.apache.uima.ruta.rule.MatchContext;
@@ -42,13 +43,13 @@ public class SimpleFeatureExpression ext
private MatchReference mr;
- private TypeExpression typeExpr;
+ private ITypeExpression typeExpr;
private List<String> features;
protected AnnotationComparator comparator = new AnnotationComparator();
- public SimpleFeatureExpression(TypeExpression te, List<String> featureReferences) {
+ public SimpleFeatureExpression(ITypeExpression te, List<String> featureReferences) {
super();
this.typeExpr = te;
this.features = featureReferences;
@@ -102,7 +103,7 @@ public class SimpleFeatureExpression ext
return result;
}
- public TypeExpression getTypeExpr(MatchContext context, RutaStream stream) {
+ public ITypeExpression getTypeExpr(MatchContext context, RutaStream stream) {
if (mr != null) {
return mr.getTypeExpression(context, stream);
}
@@ -128,34 +129,37 @@ public class SimpleFeatureExpression ext
RutaStream stream, MatchContext context, boolean checkOnFeatureValue) {
Collection<AnnotationFS> result = new TreeSet<AnnotationFS>(comparator);
List<Feature> features = getFeatures(context, stream);
+
for (AnnotationFS eachBase : annotations) {
AnnotationFS afs = eachBase;
- for (Feature feature : features) {
- if (afs == null) {
- break;
- }
- if (feature == null || feature.getRange().isPrimitive()) {
- // feature == null -> this is the coveredText "feature"
- if (this instanceof FeatureMatchExpression) {
- FeatureMatchExpression fme = (FeatureMatchExpression) this;
- if (checkOnFeatureValue) {
- if (fme.checkFeatureValue(afs, context, feature, stream)) {
+ if (features != null) {
+ for (Feature feature : features) {
+ if (afs == null) {
+ break;
+ }
+ if (feature == null || feature.getRange().isPrimitive()) {
+ // feature == null -> this is the coveredText "feature"
+ if (this instanceof FeatureMatchExpression) {
+ FeatureMatchExpression fme = (FeatureMatchExpression) this;
+ if (checkOnFeatureValue) {
+ if (fme.checkFeatureValue(afs, context, feature, stream)) {
+ result.add(afs);
+ }
+ } else {
result.add(afs);
}
+ break;
} else {
result.add(afs);
}
- break;
} else {
- result.add(afs);
- }
- } else {
- FeatureStructure value = afs.getFeatureValue(feature);
- if (value instanceof AnnotationFS) {
- afs = (AnnotationFS) value;
- } else if (value != null) {
- throw new IllegalArgumentException(value.getType()
- + " is not supported in a feature match expression (" + mr.getMatch() + ").");
+ FeatureStructure value = afs.getFeatureValue(feature);
+ if (value instanceof AnnotationFS) {
+ afs = (AnnotationFS) value;
+ } else if (value != null) {
+ throw new IllegalArgumentException(value.getType()
+ + " is not supported in a feature match expression (" + mr.getMatch() + ").");
+ }
}
}
}
@@ -178,4 +182,8 @@ public class SimpleFeatureExpression ext
return mr;
}
+ public String toString() {
+ return mr.getMatch();
+ }
+
}
Added: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaAnnotationFunctionExtension.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaAnnotationFunctionExtension.java?rev=1714245&view=auto
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaAnnotationFunctionExtension.java (added)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaAnnotationFunctionExtension.java Fri Nov 13 18:09:27 2015
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.extensions;
+
+import java.util.List;
+
+import org.apache.uima.ruta.expression.RutaExpression;
+import org.apache.uima.ruta.expression.annotation.AnnotationFunctionExpression;
+
+public interface IRutaAnnotationFunctionExtension extends IRutaExtension {
+
+ AnnotationFunctionExpression createAnnotationFunction(String name, List<RutaExpression> args)
+ throws RutaParseException;
+
+}
Propchange: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/IRutaAnnotationFunctionExtension.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/RutaExternalFactory.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/RutaExternalFactory.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/RutaExternalFactory.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/extensions/RutaExternalFactory.java Fri Nov 13 18:09:27 2015
@@ -29,6 +29,7 @@ import org.apache.uima.ruta.RutaBlock;
import org.apache.uima.ruta.action.AbstractRutaAction;
import org.apache.uima.ruta.condition.AbstractRutaCondition;
import org.apache.uima.ruta.expression.RutaExpression;
+import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
import org.apache.uima.ruta.expression.bool.IBooleanExpression;
import org.apache.uima.ruta.expression.number.INumberExpression;
import org.apache.uima.ruta.expression.string.AbstractStringExpression;
@@ -42,6 +43,8 @@ public class RutaExternalFactory {
private Map<String, IRutaTypeFunctionExtension> typeFunctionExtensions;
+ private Map<String, IRutaAnnotationFunctionExtension> annotationFunctionExtensions;
+
private Map<String, IRutaBooleanFunctionExtension> booleanFunctionExtensions;
private Map<String, IRutaStringFunctionExtension> stringFunctionExtensions;
@@ -60,6 +63,7 @@ public class RutaExternalFactory {
stringFunctionExtensions = new HashMap<String, IRutaStringFunctionExtension>();
numberFunctionExtensions = new HashMap<String, IRutaNumberFunctionExtension>();
typeFunctionExtensions = new HashMap<String, IRutaTypeFunctionExtension>();
+ annotationFunctionExtensions = new HashMap<String, IRutaAnnotationFunctionExtension>();
blockExtensions = new HashMap<String, IRutaBlockExtension>();
}
@@ -96,6 +100,17 @@ public class RutaExternalFactory {
return null;
}
+ public IAnnotationExpression createExternalAnnotationFunction(Token id, List<RutaExpression> args)
+ throws RutaParseException {
+ String name = id.getText();
+ IRutaAnnotationFunctionExtension extension = annotationFunctionExtensions.get(name);
+ if (extension != null) {
+ return extension.createAnnotationFunction(name, args);
+ }
+ // Throw exception
+ return null;
+ }
+
public IBooleanExpression createExternalBooleanFunction(Token id, List<RutaExpression> args)
throws RutaParseException {
String name = id.getText();
@@ -232,6 +247,15 @@ public class RutaExternalFactory {
this.typeFunctionExtensions = typeFunctionExtensions;
}
+ public Map<String, IRutaAnnotationFunctionExtension> getAnnotationFunctionExtensions() {
+ return annotationFunctionExtensions;
+ }
+
+ public void setAnnotationFunctionExtensions(
+ Map<String, IRutaAnnotationFunctionExtension> annotationFunctionExtensions) {
+ this.annotationFunctionExtensions = annotationFunctionExtensions;
+ }
+
public Map<String, IRutaActionExtension> getActionExtensions() {
return actionExtensions;
}
@@ -264,4 +288,6 @@ public class RutaExternalFactory {
this.context = context;
}
+
+
}
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java Fri Nov 13 18:09:27 2015
@@ -29,7 +29,7 @@ import org.apache.uima.ruta.RutaBlock;
import org.apache.uima.ruta.RutaStream;
import org.apache.uima.ruta.action.AbstractRutaAction;
import org.apache.uima.ruta.condition.AbstractRutaCondition;
-import org.apache.uima.ruta.expression.MatchReference;
+import org.apache.uima.ruta.expression.IRutaExpression;
import org.apache.uima.ruta.expression.feature.FeatureExpression;
import org.apache.uima.ruta.rule.quantifier.RuleElementQuantifier;
import org.apache.uima.ruta.visitor.InferenceCrowd;
@@ -373,10 +373,8 @@ public class RutaRuleElement extends Abs
boolean base = true;
if (matcher instanceof RutaTypeMatcher) {
RutaTypeMatcher rtm = (RutaTypeMatcher) matcher;
- MatchReference mr = (MatchReference) rtm.getExpression();
- MatchContext context = new MatchContext(this, ruleMatch, after);
- FeatureExpression featureExpression = mr.getFeatureExpression(context, stream);
- if (featureExpression != null) {
+ IRutaExpression expression = rtm.getExpression();
+ if (expression instanceof FeatureExpression) {
base = matcher.match(annotation, stream, getParent());
}
}
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaTypeMatcher.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaTypeMatcher.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaTypeMatcher.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaTypeMatcher.java Fri Nov 13 18:09:27 2015
@@ -31,24 +31,31 @@ import org.apache.uima.cas.TypeSystem;
import org.apache.uima.cas.text.AnnotationFS;
import org.apache.uima.ruta.RutaBlock;
import org.apache.uima.ruta.RutaStream;
-import org.apache.uima.ruta.expression.MatchReference;
-import org.apache.uima.ruta.expression.RutaExpression;
+import org.apache.uima.ruta.expression.IRutaExpression;
import org.apache.uima.ruta.expression.feature.FeatureExpression;
import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
-import org.apache.uima.ruta.expression.type.TypeExpression;
+import org.apache.uima.ruta.expression.type.ITypeExpression;
import org.apache.uima.ruta.type.RutaBasic;
public class RutaTypeMatcher implements RutaMatcher {
private static final boolean CHECK_ON_FEATURE = false;
- protected final MatchReference mr;
+ private ITypeExpression typeExpression;
+
+ private FeatureExpression featureExpression;
protected AnnotationComparator comparator;
- public RutaTypeMatcher(MatchReference mr) {
+ public RutaTypeMatcher(FeatureExpression expression) {
+ super();
+ this.featureExpression = expression;
+ this.comparator = new AnnotationComparator();
+ }
+
+ public RutaTypeMatcher(ITypeExpression expression) {
super();
- this.mr = mr;
+ this.typeExpression = expression;
this.comparator = new AnnotationComparator();
}
@@ -76,7 +83,6 @@ public class RutaTypeMatcher implements
}
MatchContext context = new MatchContext(null, null, true);
context.setParent(parent);
- FeatureExpression featureExpression = mr.getFeatureExpression(context, stream);
if (featureExpression != null) {
return featureExpression
.getFeatureAnnotations(annotations, stream, context, CHECK_ON_FEATURE);
@@ -133,9 +139,8 @@ public class RutaTypeMatcher implements
}
MatchContext context = new MatchContext(null, null, true);
context.setParent(parent);
- FeatureExpression fm = mr.getFeatureExpression(context, stream);
- if (fm != null) {
- return fm.getFeatureAnnotations(anchors, stream, context, CHECK_ON_FEATURE);
+ if (featureExpression != null) {
+ return featureExpression.getFeatureAnnotations(anchors, stream, context, CHECK_ON_FEATURE);
} else {
return anchors;
}
@@ -180,9 +185,8 @@ public class RutaTypeMatcher implements
}
MatchContext context = new MatchContext(null, null, true);
context.setParent(parent);
- FeatureExpression fm = mr.getFeatureExpression(context, stream);
- if (fm != null) {
- return fm.getFeatureAnnotations(anchors, stream, context, CHECK_ON_FEATURE);
+ if (featureExpression != null) {
+ return featureExpression.getFeatureAnnotations(anchors, stream, context, CHECK_ON_FEATURE);
} else {
return anchors;
}
@@ -191,21 +195,29 @@ public class RutaTypeMatcher implements
}
public boolean match(AnnotationFS annotation, RutaStream stream, RutaBlock parent) {
+ // TODO refactor method, current state was chosen for debugging
if (annotation == null) {
return false;
}
- MatchContext context = new MatchContext(null, null, true);
- context.setParent(parent);
- FeatureExpression featureExpression = mr.getFeatureExpression(context, stream);
if (featureExpression == null) {
boolean b = checkType(annotation, stream, parent);
if (b) {
return true;
}
} else {
- boolean b = checkFeature(annotation, stream, parent);
- if (b) {
- return true;
+
+ if (featureExpression.getFeatures(new MatchContext(parent), stream) == null) {
+ // hotfix for flawed feature expressions
+ boolean b = checkType(annotation, stream, parent);
+ if (b) {
+ return true;
+ }
+ } else {
+
+ boolean b = checkFeature(annotation, stream, parent);
+ if (b) {
+ return true;
+ }
}
}
@@ -232,10 +244,9 @@ public class RutaTypeMatcher implements
private boolean checkFeature(AnnotationFS annotation, RutaStream stream, RutaBlock parent) {
MatchContext context = new MatchContext(annotation, null, null, true);
context.setParent(parent);
- FeatureExpression fe = mr.getFeatureExpression(context, stream);
- Feature feature = fe.getFeature(context, stream);
- if (fe instanceof FeatureMatchExpression) {
- FeatureMatchExpression fme = (FeatureMatchExpression) fe;
+ Feature feature = featureExpression.getFeature(context, stream);
+ if (featureExpression instanceof FeatureMatchExpression) {
+ FeatureMatchExpression fme = (FeatureMatchExpression) featureExpression;
boolean checkFeatureValue = fme.checkFeatureValue(annotation, context, stream);
if (checkFeatureValue) {
return true;
@@ -252,14 +263,25 @@ public class RutaTypeMatcher implements
@Override
public String toString() {
- return mr.toString();
+ IRutaExpression expression = getExpression();
+ if (expression != null) {
+ return expression.toString();
+ } else {
+ return "";
+ }
}
- public RutaExpression getExpression() {
- return mr;
+ @Override
+ public IRutaExpression getExpression() {
+ if (featureExpression != null) {
+ return featureExpression;
+ } else if (typeExpression != null) {
+ return typeExpression;
+ }
+ return null;
}
- protected Type getType(TypeExpression expression, RutaBlock parent, RutaStream stream) {
+ protected Type getType(ITypeExpression expression, RutaBlock parent, RutaStream stream) {
MatchContext context = new MatchContext(null, null, true);
context.setParent(parent);
Type type = expression.getType(context, stream);
@@ -270,19 +292,19 @@ public class RutaTypeMatcher implements
}
public long estimateAnchors(RutaBlock parent, RutaStream stream) {
- MatchContext context = new MatchContext(null, null, true);
- context.setParent(parent);
- TypeExpression typeExpression = mr.getTypeExpression(context, stream);
return stream.getHistogram(getType(typeExpression, parent, stream));
}
public List<Type> getTypes(RutaBlock parent, RutaStream stream) {
List<Type> result = new ArrayList<Type>(1);
- MatchContext context = new MatchContext(null, null, true);
- context.setParent(parent);
- TypeExpression typeExpression = mr.getTypeExpression(context, stream);
- Type type = getType(typeExpression, parent, stream);
- result.add(type);
+ if (typeExpression != null) {
+ Type type = getType(typeExpression, parent, stream);
+ result.add(type);
+ } else if (featureExpression != null) {
+ Type type = getType(featureExpression.getTypeExpr(new MatchContext(parent), stream), parent,
+ stream);
+ result.add(type);
+ }
return result;
}
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ExpressionVerbalizer.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ExpressionVerbalizer.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ExpressionVerbalizer.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ExpressionVerbalizer.java Fri Nov 13 18:09:27 2015
@@ -271,15 +271,7 @@ public class ExpressionVerbalizer {
}
public String verbalize(MatchReference expression) {
- String tail = "";
- String head = expression.getMatch();
- if (expression.getOp() != null) {
- tail += expression.getOp();
- if (expression.getArg() != null) {
- tail += verbalize(expression.getArg());
- }
- }
- return head + tail;
+ return expression.getMatch();
}
public String verbalize(FeatureExpression expression) {
Modified: uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java
URL: http://svn.apache.org/viewvc/uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java?rev=1714245&r1=1714244&r2=1714245&view=diff
==============================================================================
--- uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java (original)
+++ uima/ruta/branches/UIMA-4408/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java Fri Nov 13 18:09:27 2015
@@ -31,8 +31,6 @@ import org.apache.uima.ruta.RutaStatemen
import org.apache.uima.ruta.action.AbstractRutaAction;
import org.apache.uima.ruta.condition.AbstractRutaCondition;
import org.apache.uima.ruta.expression.IRutaExpression;
-import org.apache.uima.ruta.expression.MatchReference;
-import org.apache.uima.ruta.expression.RutaExpression;
import org.apache.uima.ruta.expression.number.INumberExpression;
import org.apache.uima.ruta.expression.string.IStringExpression;
import org.apache.uima.ruta.expression.type.TypeExpression;
@@ -138,19 +136,17 @@ public class ScriptVerbalizer {
RutaMatcher matcher = tmre.getMatcher();
// action-only rule
if (matcher instanceof RutaTypeMatcher) {
- RutaExpression expression = ((RutaTypeMatcher) matcher).getExpression();
- if (expression instanceof MatchReference) {
- MatchReference mr = (MatchReference) expression;
- if (mr.getMatch() == null) {
- Iterator<AbstractRutaAction> ait = actions.iterator();
- while (ait.hasNext()) {
- AbstractRutaAction each = ait.next();
- result.append(verbalizer.verbalize(each));
- if (ait.hasNext()) {
- result.append(",");
- }
+ IRutaExpression expression = ((RutaTypeMatcher) matcher).getExpression();
+ if(expression != null) {
+ result.append(verbalizer.verbalize(expression));
+ } else {
+ Iterator<AbstractRutaAction> ait = actions.iterator();
+ while (ait.hasNext()) {
+ AbstractRutaAction each = ait.next();
+ result.append(verbalizer.verbalize(each));
+ if (ait.hasNext()) {
+ result.append(",");
}
- return result.toString();
}
}
}