Skip to content

Commit

Permalink
[#651] Annotations: Change APIs to support multiple annotations
Browse files Browse the repository at this point in the history
  • Loading branch information
opatrascoiu committed Apr 9, 2024
1 parent 39e08cd commit 95491aa
Show file tree
Hide file tree
Showing 9 changed files with 71 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -399,18 +399,25 @@ public Type drgElementVariableFEELType(TDRGElement element, DMNContext context)
}

@Override
public String annotation(TDRGElement element, String description) {
if (StringUtils.isBlank(description)) {
return "\"\"";
}
try {
DMNContext context = this.makeGlobalContext(element);
Statement statement = this.expressionToNativeTransformer.literalExpressionToNative(element, description, context);
return statement.getText();
} catch (Exception e) {
LOGGER.warn(String.format("Cannot process description '%s' for element '%s'", description, element == null ? "" : element.getName()));
return String.format("\"%s\"", description.replaceAll("\"", "\\\\\""));
public List<String> annotations(TDRGElement element, List<String> annotationTexts) {
List<String> annotationStatements = new ArrayList<>();
DMNContext context = this.makeGlobalContext(element);
for (String annotationText : annotationTexts) {
try {
// Add rule annotation
if (StringUtils.isBlank(annotationText)) {
annotationStatements.add("\"\"");
} else {
Statement statement = this.expressionToNativeTransformer.literalExpressionToNative(element, annotationText, context);
annotationStatements.add(statement.getText());
}
} catch (Exception e) {
LOGGER.error(String.format("Cannot process annotation '%s' for element '%s'", annotationText, element == null ? "" : element.getName()));
// Add unevaluated annotation text
annotationStatements.add(String.format("\"%s\"", annotationText.replaceAll("\"", "\\\\\"")));
}
}
return annotationStatements;
}

@Override
Expand Down Expand Up @@ -1512,8 +1519,8 @@ public String aggregator(TDRGElement element, TDecisionTable decisionTable, TOut
}

@Override
public String annotation(TDRGElement element, TDecisionRule rule) {
return this.expressionToNativeTransformer.annotation(element, rule);
public List<String> annotations(TDRGElement element, TDecisionRule rule) {
return this.expressionToNativeTransformer.annotations(element, rule);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ public interface BasicDMNToNativeTransformer<T, C> {

Type drgElementVariableFEELType(TDRGElement element, DMNContext context);

String annotation(TDRGElement element, String description);
List<String> annotations(TDRGElement element, List<String> annotations);

List<Pair<String, Type>> drgElementTypeSignature(TDRGElement element, Function<Object, String> nameProducer);

Expand Down Expand Up @@ -416,7 +416,7 @@ public interface BasicDMNToNativeTransformer<T, C> {

String aggregator(TDRGElement element, TDecisionTable decisionTable, TOutputClause outputClause, String ruleOutputListVariable);

String annotation(TDRGElement element, TDecisionRule rule);
List<String> annotations(TDRGElement element, TDecisionRule rule);

String annotationEscapedText(TDecisionRule rule);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ String ruleOutputClassName(TDRGElement element) {
String qualifiedRuleOutputClassName(TDRGElement element) {
String clsName = this.dmnTransformer.upperCaseFirst(element.getName() + DECISION_RULE_OUTPUT_CLASS_SUFFIX);
String modelName = this.dmnModelRepository.getModelName(element);
String nativePackage = this.dmnTransformer.nativeModelPackageName(modelName);;
String nativePackage = this.dmnTransformer.nativeModelPackageName(modelName);
return this.dmnTransformer.qualifiedName(nativePackage, clsName);
}

Expand Down Expand Up @@ -400,9 +400,11 @@ String annotationEscapedText(TDecisionRule rule) {
return description == null ? "" : StringEscapeUtil.escapeInString(description);
}

String annotation(TDRGElement element, TDecisionRule rule) {
List<String> annotations(TDRGElement element, TDecisionRule rule) {
List<String> annotations = new ArrayList<>();
String description = rule.getDescription();
return this.dmnTransformer.annotation(element, description);
annotations.add(description);
return this.dmnTransformer.annotations(element, annotations);
}

String ruleAnnotationClassName() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,6 @@
output_.${transformer.outputClausePrioritySetter(drgElement, output, "${transformer.outputClausePriority(drgElement, rule.outputEntry[output_index], output_index)}")};
</#if>
</#list>

<@addAnnotation drgElement rule rule_index />
}

Expand Down Expand Up @@ -405,6 +404,11 @@
Annotations
-->
<#macro addAnnotation drgElement rule rule_index>
<#list transformer.annotations(drgElement, rule)>

// Add annotation
${transformer.annotationSetVariableName()}.addAnnotation("${drgElement.name}", ${rule_index}, ${transformer.annotation(drgElement, rule)});
<#items as annotation>
${transformer.annotationSetVariableName()}.addAnnotation("${drgElement.name}", ${rule_index}, ${annotation});
</#items>
</#list>
</#macro>
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,6 @@
output_.${transformer.outputClausePriorityVariableName(drgElement, output)} = ${transformer.outputClausePriority(drgElement, rule.outputEntry[output_index], output_index)}
</#if>
</#list>

<@addAnnotation drgElement rule rule_index />
}

Expand Down Expand Up @@ -307,6 +306,11 @@
Annotations
-->
<#macro addAnnotation drgElement rule rule_index>
<#list transformer.annotations(drgElement, rule)>

// Add annotation
${transformer.annotationSetVariableName()}.addAnnotation("${drgElement.name}", ${rule_index}, ${transformer.annotation(drgElement, rule)})
<#items as annotation>
${transformer.annotationSetVariableName()}.addAnnotation("${drgElement.name}", ${rule_index}, ${annotation})
</#items>
</#list>
</#macro>
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,6 @@
output_.${transformer.outputClausePriorityVariableName(drgElement, output)} = ${transformer.outputClausePriority(drgElement, rule.outputEntry[output_index], output_index)}
</#if>
</#list>

<@addAnnotation drgElement rule rule_index />

<@events.endRule drgElement rule_index "output_" />
Expand Down Expand Up @@ -314,6 +313,11 @@
Annotations
-->
<#macro addAnnotation drgElement rule rule_index>
<#list transformer.annotations(drgElement, rule)>

# Add annotation
${transformer.annotationSetVariableName()}.addAnnotation("${drgElement.name}", ${rule_index}, ${transformer.annotation(drgElement, rule)})
<#items as annotation>
${transformer.annotationSetVariableName()}.addAnnotation("${drgElement.name}", ${rule_index}, ${annotation})
</#items>
</#list>
</#macro>
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
import javax.xml.datatype.XMLGregorianCalendar;
import java.io.File;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
Expand Down Expand Up @@ -83,31 +85,33 @@ public void testLowerCaseFirst() {

@Test
public void testEmptyAnnotation() {
assertEquals("\"\"", this.dmnTransformer.annotation(null, (String) null));
assertEquals("\"\"", this.dmnTransformer.annotation(null, ""));
TDecision decision = this.dmnTransformer.getDMNModelRepository().findDecisionByRef(null, this.href);
assertEquals(Arrays.asList("\"\""), this.dmnTransformer.annotations(decision, Arrays.asList((String) null)));
assertEquals(Arrays.asList("\"\""), this.dmnTransformer.annotations(decision, Arrays.asList("")));
}

@Test
public void testAnnotationWithOneString() {
TDecision decision = this.dmnTransformer.getDMNModelRepository().findDecisionByRef(null, this.href);
assertEquals("string(\"plain text\")", this.dmnTransformer.annotation(decision, "string(\"plain text\")"));
assertEquals("string(((java.math.BigDecimal)(requestedProduct != null ? requestedProduct.getTerm() : null)))", this.dmnTransformer.annotation(decision, "string(RequestedProduct.Term)"));
assertEquals("string(\"\")", this.dmnTransformer.annotation(decision, "string(\"\")"));
assertEquals(Arrays.asList("string(\"plain text\")"), this.dmnTransformer.annotations(decision, Arrays.asList("string(\"plain text\")")));
assertEquals(Arrays.asList("string(((java.math.BigDecimal)(requestedProduct != null ? requestedProduct.getTerm() : null)))"), this.dmnTransformer.annotations(decision, Arrays.asList("string(RequestedProduct.Term)")));
assertEquals(Arrays.asList("string(\"\")"), this.dmnTransformer.annotations(decision,Arrays.asList( "string(\"\")")));
}

@Test
public void testAnnotationWithExpression() {
TDecision decision = this.dmnTransformer.getDMNModelRepository().findDecisionByRef(null, this.href);
assertEquals("string(numericAdd(((java.math.BigDecimal)(requestedProduct != null ? requestedProduct.getRate() : null)), number(\"2\")))", this.dmnTransformer.annotation(decision, "string(RequestedProduct.Rate + 2)"));
assertEquals(Arrays.asList("string(numericAdd(((java.math.BigDecimal)(requestedProduct != null ? requestedProduct.getRate() : null)), number(\"2\")))"), this.dmnTransformer.annotations(decision, Arrays.asList("string(RequestedProduct.Rate + 2)")));
}

@Test
public void testAnnotationWithSeveralStrings() {
TDecision decision = this.dmnTransformer.getDMNModelRepository().findDecisionByRef(null, this.href);
String expected = "stringAdd(stringAdd(stringAdd(stringAdd(string(\"Rate is \"), string(((java.math.BigDecimal)(requestedProduct != null ? requestedProduct.getRate() : null)))), " +
"string(\". And term is \")), string(((java.math.BigDecimal)(requestedProduct != null ? requestedProduct.getTerm() : null)))), string(\"!\"))";
assertEquals(expected, this.dmnTransformer.annotation(decision, "string(\"Rate is \") + string(RequestedProduct.Rate) + string(\". And term is \") + string(RequestedProduct.Term) + string(\"!\")"));
assertEquals("asList(string(\"\"), string(\"\"), string(\"\"))", this.dmnTransformer.annotation(decision, "[string(\"\"), string(\"\"), string(\"\")]"));
List<String> expected = Arrays.asList(
"stringAdd(stringAdd(stringAdd(stringAdd(string(\"Rate is \"), string(((java.math.BigDecimal)(requestedProduct != null ? requestedProduct.getRate() : null)))), " +
"string(\". And term is \")), string(((java.math.BigDecimal)(requestedProduct != null ? requestedProduct.getTerm() : null)))), string(\"!\"))");
assertEquals(expected, this.dmnTransformer.annotations(decision, Arrays.asList("string(\"Rate is \") + string(RequestedProduct.Rate) + string(\". And term is \") + string(RequestedProduct.Term) + string(\"!\")")));
assertEquals(Arrays.asList("asList(string(\"\"), string(\"\"), string(\"\"))"), this.dmnTransformer.annotations(decision, Arrays.asList("[string(\"\"), string(\"\"), string(\"\")]")));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,6 @@
output_.${transformer.outputClausePrioritySetter(drgElement, output, "${transformer.outputClausePriority(drgElement, rule.outputEntry[output_index], output_index)}")};
</#if>
</#list>

<@addAnnotation drgElement rule rule_index />
}

Expand Down Expand Up @@ -425,6 +424,11 @@
Annotations
-->
<#macro addAnnotation drgElement rule rule_index>
<#list transformer.annotations(drgElement, rule)>

// Add annotation
${transformer.annotationSetVariableName()}.addAnnotation("${drgElement.name}", ${rule_index}, ${transformer.annotation(drgElement, rule)});
<#items as annotation>
${transformer.annotationSetVariableName()}.addAnnotation("${drgElement.name}", ${rule_index}, ${annotation});
</#items>
</#list>
</#macro>
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,6 @@
output_.${transformer.outputClausePriorityVariableName(drgElement, output)} = ${transformer.outputClausePriority(drgElement, rule.outputEntry[output_index], output_index)}
</#if>
</#list>

<@addAnnotation drgElement rule rule_index />
}

Expand Down Expand Up @@ -400,6 +399,11 @@
Annotations
-->
<#macro addAnnotation drgElement rule rule_index>
<#list transformer.annotations(drgElement, rule)>

// Add annotation
${transformer.annotationSetVariableName()}.addAnnotation("${drgElement.name}", ${rule_index}, ${transformer.annotation(drgElement, rule)})
<#items as annotation>
${transformer.annotationSetVariableName()}.addAnnotation("${drgElement.name}", ${rule_index}, ${annotation})
</#items>
</#list>
</#macro>

0 comments on commit 95491aa

Please sign in to comment.