blob: 0c48ff09f49bacaf7b3e406e3e8dbb859299e532 [file] [log] [blame]
/*
* 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.verbalize;
import java.util.Iterator;
import org.apache.commons.lang3.StringUtils;
import org.apache.uima.cas.CAS;
import org.apache.uima.ruta.expression.AnnotationTypeExpression;
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.annotation.AnnotationAddressExpression;
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.bool.BooleanFeatureExpression;
import org.apache.uima.ruta.expression.bool.BooleanListVariableExpression;
import org.apache.uima.ruta.expression.bool.BooleanNumberExpression;
import org.apache.uima.ruta.expression.bool.BooleanTypeExpression;
import org.apache.uima.ruta.expression.bool.BooleanVariableExpression;
import org.apache.uima.ruta.expression.bool.IBooleanExpression;
import org.apache.uima.ruta.expression.bool.SimpleBooleanExpression;
import org.apache.uima.ruta.expression.bool.SimpleBooleanListExpression;
import org.apache.uima.ruta.expression.feature.FeatureExpression;
import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
import org.apache.uima.ruta.expression.feature.GenericFeatureExpression;
import org.apache.uima.ruta.expression.feature.SimpleFeatureExpression;
import org.apache.uima.ruta.expression.list.ListExpression;
import org.apache.uima.ruta.expression.list.UntypedListExpression;
import org.apache.uima.ruta.expression.number.ComposedNumberExpression;
import org.apache.uima.ruta.expression.number.INumberExpression;
import org.apache.uima.ruta.expression.number.NegativeNumberExpression;
import org.apache.uima.ruta.expression.number.NumberFeatureExpression;
import org.apache.uima.ruta.expression.number.NumberListVariableExpression;
import org.apache.uima.ruta.expression.number.NumberVariableExpression;
import org.apache.uima.ruta.expression.number.SimpleNumberExpression;
import org.apache.uima.ruta.expression.number.SimpleNumberListExpression;
import org.apache.uima.ruta.expression.resource.ReferenceWordListExpression;
import org.apache.uima.ruta.expression.resource.ReferenceWordTableExpression;
import org.apache.uima.ruta.expression.resource.WordListExpression;
import org.apache.uima.ruta.expression.resource.WordTableExpression;
import org.apache.uima.ruta.expression.string.ComposedStringExpression;
import org.apache.uima.ruta.expression.string.IStringExpression;
import org.apache.uima.ruta.expression.string.LiteralStringExpression;
import org.apache.uima.ruta.expression.string.SimpleStringExpression;
import org.apache.uima.ruta.expression.string.SimpleStringListExpression;
import org.apache.uima.ruta.expression.string.StringFeatureExpression;
import org.apache.uima.ruta.expression.string.StringListVariableExpression;
import org.apache.uima.ruta.expression.string.StringVariableExpression;
import org.apache.uima.ruta.expression.type.ITypeExpression;
import org.apache.uima.ruta.expression.type.SimpleTypeExpression;
import org.apache.uima.ruta.expression.type.SimpleTypeListExpression;
import org.apache.uima.ruta.expression.type.TypeListVariableExpression;
import org.apache.uima.ruta.expression.type.TypeVariableExpression;
public class ExpressionVerbalizer {
private RutaVerbalizer verbalizer;
public ExpressionVerbalizer(RutaVerbalizer verbalizer) {
super();
this.verbalizer = verbalizer;
}
public String verbalize(IRutaExpression expression) {
if (expression instanceof GenericFeatureExpression) {
return verbalize(((GenericFeatureExpression) expression).getFeatureExpression());
} else if (expression instanceof AnnotationTypeExpression) {
return verbalize((AnnotationTypeExpression) expression);
} else if (expression instanceof IAnnotationExpression) {
return verbalize((IAnnotationExpression) expression);
} else if (expression instanceof ITypeExpression) {
return verbalize((ITypeExpression) expression);
} else if (expression instanceof IBooleanExpression) {
return verbalize((IBooleanExpression) expression);
} else if (expression instanceof INumberExpression) {
return verbalize((INumberExpression) expression);
} else if (expression instanceof WordListExpression) {
return verbalize((WordListExpression) expression);
} else if (expression instanceof WordTableExpression) {
return verbalize((WordTableExpression) expression);
} else if (expression instanceof ListExpression<?>) {
return verbalize((ListExpression<?>) expression);
} else if (expression instanceof FeatureMatchExpression) {
return verbalize((FeatureMatchExpression) expression);
} else if (expression instanceof FeatureExpression) {
return verbalize((FeatureExpression) expression);
} else if (expression instanceof IStringExpression) {
return verbalize((IStringExpression) expression);
} else if (expression instanceof MatchReference) {
return verbalize((MatchReference) expression);
} else if(expression instanceof NullExpression) {
return "null";
}
return expression.getClass().getSimpleName();
}
public String verbalize(WordTableExpression expression) {
if (expression instanceof ReferenceWordTableExpression) {
ReferenceWordTableExpression e = (ReferenceWordTableExpression) expression;
return e.getRef();
}
return expression.getClass().getSimpleName();
}
public String verbalize(WordListExpression expression) {
if (expression instanceof ReferenceWordListExpression) {
ReferenceWordListExpression e = (ReferenceWordListExpression) expression;
return e.getRef();
}
return expression.getClass().getSimpleName();
}
public String verbalize(ListExpression<?> expression) {
if (expression instanceof SimpleBooleanListExpression) {
SimpleBooleanListExpression e = (SimpleBooleanListExpression) expression;
return "{" + verbalizer.verbalizeExpressionList(e.getList()) + "}";
} else if (expression instanceof BooleanListVariableExpression) {
BooleanListVariableExpression e = (BooleanListVariableExpression) expression;
return e.getVar();
} else if (expression instanceof SimpleNumberListExpression) {
SimpleNumberListExpression e = (SimpleNumberListExpression) expression;
return "{" + verbalizer.verbalizeExpressionList(e.getList()) + "}";
} else if (expression instanceof NumberListVariableExpression) {
NumberListVariableExpression e = (NumberListVariableExpression) expression;
return e.getVar();
} else if (expression instanceof SimpleStringListExpression) {
SimpleStringListExpression e = (SimpleStringListExpression) expression;
return "{" + verbalizer.verbalizeExpressionList(e.getList()) + "}";
} else if (expression instanceof StringListVariableExpression) {
StringListVariableExpression e = (StringListVariableExpression) expression;
return e.getVar();
} else if (expression instanceof SimpleTypeListExpression) {
SimpleTypeListExpression e = (SimpleTypeListExpression) expression;
return "{" + verbalizer.verbalizeExpressionList(e.getList()) + "}";
} else if (expression instanceof TypeListVariableExpression) {
TypeListVariableExpression e = (TypeListVariableExpression) expression;
return e.getVar();
} else if (expression instanceof UntypedListExpression) {
UntypedListExpression e = (UntypedListExpression) expression;
return "{" + verbalizer.verbalizeExpressionList(e.getList()) + "}";
}
return expression.getClass().getSimpleName();
}
public String verbalize(INumberExpression expression) {
if (expression == null) {
return "";
} else if (expression instanceof NegativeNumberExpression) {
NegativeNumberExpression e = (NegativeNumberExpression) expression;
return "-(" + e.getExpression() + ")";
} else if (expression instanceof NumberVariableExpression) {
NumberVariableExpression e = (NumberVariableExpression) expression;
return e.getVar();
} else if (expression instanceof SimpleNumberExpression) {
SimpleNumberExpression e = (SimpleNumberExpression) expression;
return e.getNumber().toString();
} else if (expression instanceof ComposedNumberExpression) {
ComposedNumberExpression e = (ComposedNumberExpression) expression;
INumberExpression ne = e.getExpressions().get(0);
if (ne == null) {
return "";
}
StringBuilder result = new StringBuilder(verbalize(ne));
for (int i = 0; i < e.getOperators().size(); i++) {
result.append(" " + e.getOperators().get(i) + " ");
if (e.getExpressions().size() > i + 1) {
result.append(verbalize(e.getExpressions().get(i + 1)));
}
}
return result.toString();
} else if (expression instanceof NumberFeatureExpression) {
return verbalize(((NumberFeatureExpression) expression).getFe());
}
return expression.getClass().getSimpleName();
}
public String verbalize(IBooleanExpression expression) {
if (expression == null) {
return "";
} else if (expression instanceof BooleanNumberExpression) {
BooleanNumberExpression e = (BooleanNumberExpression) expression;
return verbalize(e.getFristExpression()) + " " + e.getOperator() + " "
+ verbalize(e.getSecondExpression());
} else if (expression instanceof BooleanTypeExpression) {
BooleanTypeExpression e = (BooleanTypeExpression) expression;
return verbalize(e.getFristExpression()) + " " + e.getOperator() + " "
+ verbalize(e.getSecondExpression());
} else if (expression instanceof BooleanVariableExpression) {
BooleanVariableExpression e = (BooleanVariableExpression) expression;
return e.getVar();
} else if (expression instanceof SimpleBooleanExpression) {
SimpleBooleanExpression e = (SimpleBooleanExpression) expression;
return e.getPrimitiveValue() ? "true" : "false";
} else if (expression instanceof BooleanFeatureExpression) {
return verbalize(((BooleanFeatureExpression) expression).getFe());
}
return expression.getClass().getSimpleName();
}
@SuppressWarnings("rawtypes")
public String verbalize(IStringExpression expression) {
if (expression == null) {
return "";
} else if (expression instanceof INumberExpression) {
return verbalize((INumberExpression) expression);
} else if (expression instanceof ITypeExpression) {
return verbalize((ITypeExpression) expression);
} else if (expression instanceof IBooleanExpression) {
return verbalize((IBooleanExpression) expression);
} else if (expression instanceof ListExpression) {
return verbalize((ListExpression) expression);
} else if (expression instanceof LiteralStringExpression) {
return verbalize((LiteralStringExpression) expression);
} else if (expression instanceof StringFeatureExpression) {
return verbalize(((StringFeatureExpression) expression).getFe());
}
return expression.getClass().getSimpleName();
}
public String verbalize(LiteralStringExpression expression) {
if (expression == null) {
return "";
} else if (expression instanceof ComposedStringExpression) {
ComposedStringExpression e = (ComposedStringExpression) expression;
StringBuilder sb = new StringBuilder();
Iterator<IStringExpression> it = e.getExpressions().iterator();
while (it.hasNext()) {
IStringExpression each = it.next();
sb.append(verbalize(each));
if (it.hasNext()) {
sb.append(" + ");
}
}
return sb.toString();
} else if (expression instanceof StringVariableExpression) {
StringVariableExpression e = (StringVariableExpression) expression;
return e.getVar();
} else if (expression instanceof SimpleStringExpression) {
SimpleStringExpression e = (SimpleStringExpression) expression;
return "\"" + e.getValue() + "\"";
}
return expression.getClass().getSimpleName();
}
public String verbalize(ITypeExpression expression) {
if (expression == null) {
return null;
}
if (expression instanceof SimpleTypeExpression) {
SimpleTypeExpression e = (SimpleTypeExpression) expression;
String type = e.getTypeString();
int indexOf = type.lastIndexOf(".");
if (indexOf != -1) {
type = type.substring(indexOf + 1, type.length());
}
if (type.equals("DocumentAnnotation")) {
type = "Document";
}
return type;
} else if (expression instanceof TypeVariableExpression) {
TypeVariableExpression e = (TypeVariableExpression) expression;
return e.getVar();
}
return expression.getClass().getSimpleName();
}
public String verbalize(IAnnotationExpression expression) {
if (expression == null) {
return null;
}
if (expression instanceof AnnotationAddressExpression) {
AnnotationAddressExpression e = (AnnotationAddressExpression) expression;
return "$" + e.getAddress();
} else if (expression instanceof AnnotationVariableExpression) {
AnnotationVariableExpression e = (AnnotationVariableExpression) expression;
return e.getVar();
} else if (expression instanceof AnnotationLabelExpression) {
AnnotationLabelExpression e = (AnnotationLabelExpression) expression;
return e.getLabel();
}
return expression.getClass().getSimpleName();
}
public String verbalize(MatchReference expression) {
String match = expression.getMatch();
if(match == null) {
String string = expression.toString();
if(StringUtils.equals(string, CAS.TYPE_NAME_DOCUMENT_ANNOTATION)) {
return "Document";
} else {
return string;
}
}
if(expression.getArgument() != null) {
return match + expression.getComparator() + verbalizer.verbalize(expression.getArgument());
}
return match;
}
public String verbalize(AnnotationTypeExpression expression) {
return verbalize(expression.getReference());
}
public String verbalize(FeatureExpression expression) {
StringBuilder sb = new StringBuilder();
if (expression instanceof SimpleFeatureExpression) {
SimpleFeatureExpression sfe = (SimpleFeatureExpression) expression;
sb.append(sfe.getMatchReference().getMatch());
} else if(expression instanceof NullExpression) {
sb.append("null");
}
return sb.toString();
}
public String verbalize(FeatureMatchExpression expression) {
return verbalize((FeatureExpression) expression) + expression.getOp()
+ verbalize(expression.getArg());
}
}