Skip to content
Snippets Groups Projects
Commit 61125f37 authored by Jonas Blatt's avatar Jonas Blatt :ant:
Browse files

Merge branch 'develop' into 'master'

Develop

See merge request jonasblatt/ma-jonasblatt-dmn-verifier!124
parents 43f9636d 3ec1f7a2
No related branches found
Tags v0.9.14
No related merge requests found
Showing
with 514 additions and 86 deletions
......@@ -21,7 +21,7 @@
<artifactId>dmn-verifier-parent</artifactId>
<groupId>de.unikoblenz.fgbks</groupId>
<relativePath>../dmnverifierparent/pom.xml</relativePath>
<version>0.9.13</version>
<version>0.9.14</version>
</parent>
<properties>
......@@ -31,11 +31,6 @@
<dependencies>
<!-- camunda dmn -->
<dependency>
<groupId>org.camunda.bpm.dmn</groupId>
<artifactId>camunda-engine-dmn</artifactId>
<version>${version.camunda}</version>
</dependency>
<dependency>
<groupId>org.camunda.bpm.model</groupId>
<artifactId>camunda-dmn-model</artifactId>
......
package de.unikoblenz.fgbks.core.dmn.utils;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnDefinitions;
import java.util.List;
import org.camunda.bpm.dmn.engine.DmnDecision;
import org.camunda.bpm.model.dmn.DmnModelInstance;
/**
......@@ -10,33 +8,20 @@ import org.camunda.bpm.model.dmn.DmnModelInstance;
*/
public class DmnObjectContainer {
private final List<DmnDecision> dmnDecisions;
private final DmnModelInstance dmnModel;
private final VDmnDefinitions vDmnDefinitions;
/**
* Create a new Instance of the dmn object container.
*
* @param dmnDecisions the list of {@link DmnDecision}
* @param dmnModel the {@link DmnModelInstance}
* @param vDmnDefinitions the {@link VDmnDefinitions}
*/
public DmnObjectContainer(
List<DmnDecision> dmnDecisions, DmnModelInstance dmnModel, VDmnDefinitions vDmnDefinitions) {
this.dmnDecisions = dmnDecisions;
public DmnObjectContainer(DmnModelInstance dmnModel, VDmnDefinitions vDmnDefinitions) {
this.dmnModel = dmnModel;
this.vDmnDefinitions = vDmnDefinitions;
}
/**
* Get the list of dmn decisions.
*
* @return the list of {@link DmnDecision}
*/
public List<DmnDecision> getDmnDecisions() {
return dmnDecisions;
}
/**
* Get the dmn model.
*
......
......@@ -3,13 +3,10 @@ package de.unikoblenz.fgbks.core.dmn.utils;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnDefinitions;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.parser.SimpleVDmnParser;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Optional;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.apache.commons.io.IOUtils;
import org.camunda.bpm.dmn.engine.DmnDecision;
import org.camunda.bpm.dmn.engine.DmnEngineConfiguration;
import org.camunda.bpm.model.dmn.DmnModelInstance;
import org.camunda.bpm.model.dmn.impl.DmnParser;
......@@ -32,15 +29,11 @@ public class DmnService {
*/
public Optional<DmnObjectContainer> getDmnObjectContainerFromXml(String dmnXmlString) {
try {
List<DmnDecision> dmnDecisions =
DmnEngineConfiguration.createDefaultDmnEngineConfiguration()
.buildEngine()
.parseDecisions(IOUtils.toInputStream(dmnXmlString, Charset.defaultCharset()));
DmnModelInstance dmnModel =
new DmnParser()
.parseModelFromStream(IOUtils.toInputStream(dmnXmlString, Charset.defaultCharset()));
VDmnDefinitions vDmnDefinitions = simpleDmnParser.getVDmnDefinition(dmnModel);
return Optional.of(new DmnObjectContainer(dmnDecisions, dmnModel, vDmnDefinitions));
return Optional.of(new DmnObjectContainer(dmnModel, vDmnDefinitions));
} catch (Exception e) {
return Optional.empty();
}
......
......@@ -51,7 +51,7 @@ public class EmptyOutputVerifier extends AbstractVerifier {
.build())
.build())
.addToEntry(
WARNING, templateDecisionRule(outputValue.getVDmnRule()) + "Output value is empty.'");
WARNING, templateDecisionRule(outputValue.getVDmnRule()) + "Output value is empty.");
}
}
}
package de.unikoblenz.fgbks.core.dmn.verification.verifier.impl;
import static de.unikoblenz.fgbks.core.dmn.domain.vdmn.utils.VDmnFunctions.templateDecision;
import static de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntry.VerificationClassification.WARNING;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.DECISION;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionType.DELETE;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix.SHOW_DECISION;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnDecision;
import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntryElement;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.AbstractVerifier;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.DmnVerifier;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.types.MissingColumnVerification;
@DmnVerifier(verifierType = MissingColumnVerification.class)
public class MissingColumnVerifier extends AbstractVerifier {
@Override
protected void doVerification() {
for (VDmnDecision decision : dmnObjectContainer.getVDmnDefinition().getVDmnDecisions()) {
if (decision.getVDmnDecisionTable().getVDmnInputColumns().size() == 0) {
createResult(decision, "input");
} else if (decision.getVDmnDecisionTable().getVDmnInputColumns().size() == 0) {
createResult(decision, "input");
}
}
}
private void createResult(VDmnDecision decision, String outin) {
vreFactory
.addVerificationFix(
VerificationFix.getBuilder()
.withFixName("Delete decision")
.addAction(
Action.getBuilder()
.withActionScope(DECISION)
.withActionType(DELETE)
.addIdValue(decision.getDecisionId())
.build())
.build())
.addVerificationFix(SHOW_DECISION)
.addElement(VerificationResultEntryElement.create(decision))
.addToEntry(WARNING, templateDecision(decision) + "No " + outin + " column present.");
}
}
......@@ -5,6 +5,7 @@ import static de.unikoblenz.fgbks.core.dmn.domain.vdmn.utils.VDmnFunctions.getDe
import static de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntry.VerificationClassification.WARNING;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action.ACTION_SHOW_DECISION;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action.ACTION_SHOW_INPUT_DATA;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.DECISION;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.INPUT_COLUMN;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.INPUT_DATA;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.OUTPUT_COLUMN;
......@@ -79,7 +80,7 @@ public class MissingInputColumnVerifier extends AbstractVerifier {
if (inputDataNode.isInputData()) {
vreFactory.addVerificationFix(
VerificationFix.getBuilder()
.withFixName(new Name("Delete Input Data"))
.withFixName("Delete Input Data")
.addAction(
Action.getBuilder()
.addIdValue(inputDataNode.getId())
......@@ -87,13 +88,11 @@ public class MissingInputColumnVerifier extends AbstractVerifier {
.withActionScope(INPUT_DATA)
.build())
.build());
}
// Add action add input column
if (inputDataNode.isInputData()) {
// Add action add input column
vreFactory.addVerificationFix(
VerificationFix.getBuilder()
.withFixName(
new Name("Add Input Column " + inputDataNode.getName().get().getValue()))
"Add Input Column \"" + inputDataNode.getName().get().getValue() + "\"")
.addAction(
Action.getBuilder()
.withActionType(CREATE)
......@@ -106,13 +105,41 @@ public class MissingInputColumnVerifier extends AbstractVerifier {
} else {
for (VDmnOutputColumn outputColumn :
((VDmnDecision) inputDataNode).getVDmnDecisionTable().getVDmnOutputColumns()) {
if (outputColumn.getVDmnDecision().getVDmnDecisionTable().getVDmnOutputColumns().size()
== 1) {
vreFactory.addVerificationFix(
VerificationFix.getBuilder()
.withFixName("Delete decision")
.addAction(
Action.getBuilder()
.withActionScope(DECISION)
.withActionType(DELETE)
.addIdValue(outputColumn.getVDmnDecision().getDecisionId())
.build())
.build());
} else {
vreFactory.addVerificationFix(
VerificationFix.getBuilder()
.withFixName(
new Name(
"Delete Output Column \""
+ outputColumn.getName().orElse(NO_NAME).getValue())
+ "\"")
.addAction(
Action.getBuilder()
.withActionType(DELETE)
.withActionScope(OUTPUT_COLUMN)
.addIdValue(outputColumn.getVDmnDecision().getDecisionId())
.addIdValue(outputColumn.getOutputId())
.build())
.build());
}
if (outputColumn.getName().isPresent()) {
// add input Column
vreFactory.addVerificationFix(
VerificationFix.getBuilder()
.withFixName(
new Name("Add Input Column \"" + outputColumn.getName().get().getValue())
+ "\"")
"Add Input Column \"" + outputColumn.getName().get().getValue() + "\"")
.addAction(
Action.getBuilder()
.withActionType(CREATE)
......@@ -123,21 +150,6 @@ public class MissingInputColumnVerifier extends AbstractVerifier {
.build())
.build());
}
vreFactory.addVerificationFix(
VerificationFix.getBuilder()
.withFixName(
new Name(
"Delete Output Column \""
+ outputColumn.getName().orElse(NO_NAME).getValue())
+ "\"")
.addAction(
Action.getBuilder()
.withActionType(DELETE)
.withActionScope(OUTPUT_COLUMN)
.addIdValue(outputColumn.getVDmnDecision().getDecisionId())
.addIdValue(outputColumn.getOutputId())
.build())
.build());
}
}
......
......@@ -87,12 +87,11 @@ public class MissingInputDataVerifier extends AbstractVerifier {
vreFactory.addVerificationFix(
VerificationFix.getBuilder()
.withFixName(
new Name(
"Name \""
+ inputColumn.getName().get().getValue()
+ "\" the output column in decision \""
+ VDmnFunctions.getDecisionStringName(o.getVDmnDecision())
+ "\""))
"Name \""
+ inputColumn.getName().get().getValue()
+ "\" the output column in decision \""
+ VDmnFunctions.getDecisionStringName(o.getVDmnDecision())
+ "\"")
.addAction(
Action.getBuilder()
.withActionType(UPDATE)
......@@ -107,7 +106,7 @@ public class MissingInputDataVerifier extends AbstractVerifier {
if (inputColumn.getName().isPresent()) {
vreFactory.addVerificationFix(
VerificationFix.getBuilder()
.withFixName(new Name("New Data Input"))
.withFixName("New Data Input")
.addAction(
Action.getBuilder()
.withActionType(CREATE)
......@@ -125,19 +124,9 @@ public class MissingInputDataVerifier extends AbstractVerifier {
}
// Actions for renaming column
searchPossibleNames(inputColumn);
vreFactory
// Action for deleting column
.addVerificationFix(
VerificationFix.getBuilder()
.withFixName(new Name("Delete Column"))
.addAction(
Action.getBuilder()
.withActionType(DELETE)
.withActionScope(INPUT_COLUMN)
.addIdValue(inputColumn.getVDmnDecision().getDecisionId())
.addIdValue(inputColumn.getInputId())
.build())
.build());
// Actions for deleting the input column / decision
deleteColumnDecision(inputColumn);
// Add to result
vreFactory.addToEntry(
WARNING,
......@@ -146,13 +135,42 @@ public class MissingInputDataVerifier extends AbstractVerifier {
getColumnStringName(inputColumn));
}
private void deleteColumnDecision(VDmnInputColumn inputColumn) {
if (inputColumn.getVDmnDecision().getVDmnDecisionTable().getVDmnInputColumns().size() == 1) {
vreFactory.addVerificationFix(
VerificationFix.getBuilder()
.withFixName("Delete decision ")
.addAction(
Action.getBuilder()
.withActionScope(DECISION)
.withActionType(DELETE)
.addIdValue(inputColumn.getVDmnDecision().getDecisionId())
.build())
.build());
} else {
vreFactory
// Action for deleting column
.addVerificationFix(
VerificationFix.getBuilder()
.withFixName("Delete Column")
.addAction(
Action.getBuilder()
.withActionType(DELETE)
.withActionScope(INPUT_COLUMN)
.addIdValue(inputColumn.getVDmnDecision().getDecisionId())
.addIdValue(inputColumn.getInputId())
.build())
.build());
}
}
private void searchPossibleInputData(VDmnInputColumn inputColumn) {
for (VDmnInputData inputData : dmnObjectContainer.getVDmnDefinition().getVDmnInputData()) {
if (inputData.getName().isPresent()
&& inputData.getName().get().equals(inputColumn.getName().get())) {
vreFactory.addVerificationFix(
VerificationFix.getBuilder()
.withFixName(new Name("Connect to Input Data " + inputData.getName().get()))
.withFixName("Connect to Input Data " + inputData.getName().get())
.addAction(
Action.getBuilder()
.withActionType(UPDATE)
......@@ -181,9 +199,7 @@ public class MissingInputDataVerifier extends AbstractVerifier {
vreFactory.addVerificationFix(
VerificationFix.getBuilder()
.withFixName(
new Name(
"Connect to Decision "
+ getDecisionStringName(outputColumn.getVDmnDecision())))
"Connect to Decision " + getDecisionStringName(outputColumn.getVDmnDecision()))
.addAction(
Action.getBuilder()
.withActionType(UPDATE)
......
......@@ -78,7 +78,7 @@ public class MultipleInputDataVerifier extends AbstractVerifier {
.addToEntry(
VerificationClassification.WARNING,
templateDecision(inputColumn.getVDmnDecision())
+ "Input column \"%s\" has multiple input data node.",
+ "Input column \"%s\" has multiple input data nodes.",
getColumnStringName(inputColumn));
}
}
......
package de.unikoblenz.fgbks.core.dmn.verification.verifier.impl;
import static de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntry.VerificationClassification.ERROR;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action.ACTION_SHOW_INPUT_COLUMNS;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action.ACTION_SHOW_OUTPUT_COLUMNS;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.INPUT_COLUMN;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.OUTPUT_COLUMN;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionType.UPDATE;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix.DEFAULT_SHOW_NAME;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnDecision;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnInputColumn;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnOutputColumn;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.utils.VDmnFunctions;
import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntryElement;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.AbstractVerifier;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.DmnVerifier;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.types.WrongDataTypeVerification;
@DmnVerifier(verifierType = WrongDataTypeVerification.class)
public class WrongDataTypeVerifier extends AbstractVerifier {
@Override
protected void doVerification() {
for (VDmnDecision decision : dmnObjectContainer.getVDmnDefinition().getVDmnDecisions()) {
for (VDmnDecision nextDecision : decision.getInformationProvidingDecisions()) {
checkWrongDataTypes(decision, nextDecision);
}
}
}
private void checkWrongDataTypes(VDmnDecision decision, VDmnDecision nextDecision) {
for (VDmnOutputColumn outputColumn : decision.getVDmnDecisionTable().getVDmnOutputColumns()) {
for (VDmnInputColumn inputColumn :
nextDecision.getVDmnDecisionTable().getVDmnInputColumns()) {
if (outputColumn.getName().isPresent()
&& inputColumn.getName().isPresent()
&& outputColumn.getName().equals(inputColumn.getName())
&& outputColumn.getTypeRef() != inputColumn.getTypeRef()) {
if (inputColumn.getValues().size() == 0) {
vreFactory.addVerificationFix(
VerificationFix.getBuilder()
.withFixName(
"Set type of column \""
+ inputColumn.getName().get().getValue()
+ "\" to "
+ outputColumn.getTypeRef().getName())
.addAction(
Action.getBuilder()
.withActionType(UPDATE)
.withActionScope(INPUT_COLUMN)
.addIdValue(inputColumn.getVDmnDecision().getDecisionId())
.addIdValue(inputColumn.getInputId())
.addValue("typeRef", outputColumn.getTypeRef().getName())
.build())
.build());
}
if (outputColumn.getValues().size() == 0) {
vreFactory.addVerificationFix(
VerificationFix.getBuilder()
.withFixName(
"Set type of column \""
+ outputColumn.getName().get().getValue()
+ "\" to "
+ inputColumn.getTypeRef().getName())
.addAction(
Action.getBuilder()
.withActionType(UPDATE)
.withActionScope(OUTPUT_COLUMN)
.addIdValue(outputColumn.getVDmnDecision().getDecisionId())
.addIdValue(outputColumn.getOutputId())
.addValue("typeRef", inputColumn.getTypeRef().getName())
.build())
.build());
}
vreFactory
.addElement(VerificationResultEntryElement.create(inputColumn))
.addElement(VerificationResultEntryElement.create(outputColumn))
.addVerificationFix(
VerificationFix.getBuilder()
.withFixName(DEFAULT_SHOW_NAME)
.addAction(ACTION_SHOW_INPUT_COLUMNS)
.addAction(ACTION_SHOW_OUTPUT_COLUMNS)
.build())
.addToEntry(
ERROR,
VDmnFunctions.templateDecision(outputColumn.getVDmnDecision())
+ " & "
+ VDmnFunctions.templateDecision(inputColumn.getVDmnDecision())
+ "The columns %s have different data types.",
outputColumn.getName().get().getValue());
}
}
}
}
}
package de.unikoblenz.fgbks.core.dmn.verification.verifier.types;
import de.unikoblenz.fgbks.base.domain.Description;
import de.unikoblenz.fgbks.base.domain.Name;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.classification.ClassificationType;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.classification.DrdModelingLevelVerification;
import javax.validation.constraints.NotNull;
@Type
public class MissingColumnVerification extends AbstractVerificationType {
private static final MissingColumnVerification instance = new MissingColumnVerification();
private MissingColumnVerification() {
super(
new Name("MissingColumnVerification"),
new Name("Missing Column"),
new Description("Detection decision which has no input column or no output column."));
}
public static MissingColumnVerification getInstance() {
return instance;
}
@Override
public @NotNull ClassificationType getClassification() {
return DrdModelingLevelVerification.getInstance();
}
}
package de.unikoblenz.fgbks.core.dmn.verification.verifier.types;
import de.unikoblenz.fgbks.base.domain.Description;
import de.unikoblenz.fgbks.base.domain.Name;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.classification.ClassificationType;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.classification.DrdModelingLevelVerification;
import javax.validation.constraints.NotNull;
@Type
public class WrongDataTypeVerification extends AbstractVerificationType {
private static final WrongDataTypeVerification instance = new WrongDataTypeVerification();
private WrongDataTypeVerification() {
super(
new Name("WrongDataTypeVerification"),
new Name("Wrong Data Type"),
new Description(
"Detecting output columns and their connected input columns, "
+ "which have different data types."));
}
public static WrongDataTypeVerification getInstance() {
return instance;
}
@Override
public @NotNull ClassificationType getClassification() {
return DrdModelingLevelVerification.getInstance();
}
}
# Configuration file
quarkus.http.test-port=8089
# Quarkus cors settings
quarkus.http.cors=true
%dev.quarkus.http.cors.origins=http://localhost:8081,http://192.168.2.109:8081
......
package de.unikoblenz.fgbks.core.dmn.domain.vdmn.parser;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertTrue;
import de.unikoblenz.fgbks.base.domain.Name;
import de.unikoblenz.fgbks.core.dmn.domain.ids.DecisionId;
import de.unikoblenz.fgbks.core.dmn.domain.ids.DefinitionId;
import de.unikoblenz.fgbks.core.dmn.domain.ids.InputDataId;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnDecision;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnDefinitions;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnInputData;
import java.util.HashSet;
import java.util.Set;
import org.camunda.bpm.model.dmn.DmnModelInstance;
import org.camunda.bpm.model.dmn.impl.DmnParser;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
class SimpleVDmnParserTest {
static VDmnDefinitions definitions;
DefinitionId expectedDefinitionId = new DefinitionId("Definitions_0gh5io8");
@BeforeAll
static void initDMN() {
DmnModelInstance dmnModel =
new DmnParser()
.parseModelFromStream(
SimpleVDmnParserTest.class.getResourceAsStream("/testDMNParsing.dmn"));
DmnModelInstanceWrapper parser = new SimpleVDmnParser();
definitions = parser.getVDmnDefinition(dmnModel);
}
@Test
void testDefinitions() {
assertEquals(expectedDefinitionId, definitions.getDefinitionId());
}
@Test
void testInputData() {
Set<InputDataId> inputDataIds = new HashSet<>();
inputDataIds.add(new InputDataId("InputData_0ac32ne"));
inputDataIds.add(new InputDataId("InputData_0du6972"));
Set<Name> inputDataNames = new HashSet<>();
inputDataNames.add(new Name("a"));
inputDataNames.add(new Name("b"));
for (VDmnInputData inputData : definitions.getVDmnInputData()) {
assertSame(definitions, inputData.getVDmnDefinition());
assertTrue(inputDataIds.contains(inputData.getInputDataId()));
assertTrue(inputDataNames.contains(inputData.getName().get()));
inputDataIds.remove(inputData.getInputDataId());
inputDataNames.remove(inputData.getName().get());
assertTrue(inputData.isInputData());
assertFalse(inputData.isDecision());
assertEquals(1, inputData.getInformationProvidingDecisions().size());
assertSame(
definitions.getElementById(new DecisionId("Decision_0hsdxdj")),
inputData.getInformationProvidingDecisions().get(0));
}
assertTrue(inputDataIds.size() == 0);
assertTrue(inputDataNames.size() == 0);
}
@Test
void testDecisions() {
Set<DecisionId> decisionIds = new HashSet<>();
decisionIds.add(new DecisionId("Decision_0hsdxdj"));
decisionIds.add(new DecisionId("Decision_01e9iix"));
Set<Name> names = new HashSet<>();
names.add(new Name("Decision 1"));
names.add(new Name("Decision 2"));
for (VDmnDecision decision : definitions.getVDmnDecisions()) {
assertSame(definitions, decision.getVDmnDefinition());
assertSame(decision, decision.getVDmnDecisionTable().getVDmnDecision());
assertTrue(decisionIds.contains(decision.getDecisionId()));
assertTrue(names.contains(decision.getName().get()));
decisionIds.remove(decision.getDecisionId());
names.remove(decision.getName().get());
}
assertTrue(decisionIds.size() == 0);
assertTrue(names.size() == 0);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/DMN/20151101/dmn.xsd" xmlns:biodi="http://bpmn.io/schema/dmn/biodi/1.0" id="Definitions_0gh5io8" name="DRD" namespace="http://camunda.org/schema/1.0/dmn" exporter="Camunda Modeler" exporterVersion="3.4.1">
<decision id="Decision_0hsdxdj" name="Decision 1">
<extensionElements>
<biodi:bounds x="194" y="261" width="180" height="80" />
<biodi:edge source="InputData_0ac32ne">
<biodi:waypoints x="251" y="411" />
<biodi:waypoints x="234" y="341" />
</biodi:edge>
<biodi:edge source="InputData_0du6972">
<biodi:waypoints x="205" y="168" />
<biodi:waypoints x="222" y="261" />
</biodi:edge>
</extensionElements>
<informationRequirement>
<requiredInput href="#InputData_0ac32ne" />
</informationRequirement>
<informationRequirement>
<requiredInput href="#InputData_0du6972" />
</informationRequirement>
<decisionTable id="decisionTable_1">
<input id="input_1">
<inputExpression id="inputExpression_1" typeRef="string">
<text>a</text>
</inputExpression>
<inputValues id="UnaryTests_0k1w24s">
<text>"a"</text>
</inputValues>
</input>
<input id="InputClause_19p5q83">
<inputExpression id="LiteralExpression_1u19mpa" typeRef="integer">
<text>b</text>
</inputExpression>
</input>
<output id="output_1" name="c" typeRef="string" />
<rule id="DecisionRule_0sdhb7f">
<inputEntry id="UnaryTests_1brn0rw">
<text>"a"</text>
</inputEntry>
<inputEntry id="UnaryTests_0mwa2iy">
<text>=1</text>
</inputEntry>
<outputEntry id="LiteralExpression_193lyci">
<text>"b"</text>
</outputEntry>
</rule>
</decisionTable>
</decision>
<decision id="Decision_01e9iix" name="Decision 2">
<extensionElements>
<biodi:bounds x="489" y="255" width="180" height="80" />
<biodi:edge source="Decision_0hsdxdj">
<biodi:waypoints x="374" y="299" />
<biodi:waypoints x="489" y="297" />
</biodi:edge>
</extensionElements>
<informationRequirement>
<requiredDecision href="#Decision_0hsdxdj" />
</informationRequirement>
<decisionTable id="DecisionTable_1l97h31">
<input id="InputClause_11otk47">
<inputExpression id="LiteralExpression_164qrce" typeRef="string">
<text>c</text>
</inputExpression>
</input>
<output id="OutputClause_14n1p4d" name="d" typeRef="date" />
<rule id="DecisionRule_00a6zxf">
<inputEntry id="UnaryTests_0mw8zab">
<text>"x"</text>
</inputEntry>
<outputEntry id="LiteralExpression_14rcrq4">
<text>date and time("2019-11-09T00:00:00")</text>
</outputEntry>
</rule>
<rule id="DecisionRule_08hv5i9">
<inputEntry id="UnaryTests_11kseoe">
<text>"y"</text>
</inputEntry>
<outputEntry id="LiteralExpression_1nginnf">
<text>date and time("2019-11-10T00:00:00")</text>
</outputEntry>
</rule>
</decisionTable>
</decision>
<inputData id="InputData_0ac32ne" name="a">
<extensionElements>
<biodi:bounds x="194" y="411" width="125" height="45" />
</extensionElements>
</inputData>
<inputData id="InputData_0du6972" name="b">
<extensionElements>
<biodi:bounds x="138" y="123" width="125" height="45" />
</extensionElements>
</inputData>
</definitions>
......@@ -64,6 +64,18 @@ Detecting columns which has more than one input data (or output columns from dec
TODO
```
### Missing Column
- Type: [MissingColumnVerification](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/MissingColumnVerification.java)
- Verifier: [MissingInputDataVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingColumnVerifier.java)
#### Description
Detection decision which has no input columns or no output columns.
#### Algorithm
```
TODO
```
## Modeling Level Verification
- Classification: [ModelingLevelVerification](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/classification/ModelingLevelVerification.java)
......@@ -72,7 +84,7 @@ TODO
- Verifier: [PredefinedExistingValueVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PredefinedExistingValueVerifier.java)
#### Description
Detecting string values, which are not defined in the list of predefined values of the column.
Detecting string values which are not defined in the list of predefined values of the column.
#### Algorithm
```
......@@ -84,7 +96,7 @@ TODO
- Verifier: [PredefinedMissingValueVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PredefinedMissingValueVerifier.java)
#### Description
Detecting predefined string values of a column, which itself are not used in the column.
Detecting predefined string values of a column which itself are not used in the column.
#### Algorithm
```
......@@ -120,7 +132,19 @@ TODO
- Verifier: [EmptyOutputVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/EmptyOutputVerifier.java)
#### Description
Detection rules with an empty output values."
Detection rules with an empty output values.
#### Algorithm
```
TODO
```
### Wrong Data Type Verification
- Type: [WrongDataTypeVerification](/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/WrongDataTypeVerification.java)
- Verifier: [WrongDataTypeVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/WrongDataTypeVerifier.java)
#### Description
Detecting output columns and their connected input columns, which have different data types.
#### Algorithm
```
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>dmn-verifier-parent</artifactId>
<groupId>de.unikoblenz.fgbks</groupId>
<version>0.9.13</version>
<version>0.9.14</version>
<relativePath>../dmnverifierparent/pom.xml</relativePath>
</parent>
......
......@@ -284,9 +284,11 @@ function performVerificationFixDELETE(verificationEntry, fixAction) {
case 'INPUT_DATA':
deleteInputData(verificationEntry, fixAction);
break;
case 'DECISION':
deleteDecision(verificationEntry, fixAction);
break;
case 'INPUT_ENTRY':
case 'OUTPUT_ENTRY':
case 'DECISION':
default:
alert("ACTION undefined: " + fixAction.actionType + ' -> '
+ fixAction.actionScope);
......@@ -337,6 +339,22 @@ function deleteInputData(verificationEntry, fixAction) {
}
}
/**
*
* @param {VerificationEntry} verificationEntry
* @param {Action} fixAction
*/
function deleteDecision(verificationEntry, fixAction) {
openViewWithId(verificationEntry.elements[0].identifier['definitionId']);
let decision = getShapeWithId(
fixAction.actionValues['decisionId']);
if (decision) {
getCurrentModeler().removeShape(decision);
}
openViewWithId(verificationEntry.elements[0].identifier['definitionId']);
}
/**
*
* @param {VerificationEntry} verificationEntry
......@@ -374,7 +392,6 @@ function updateInputData(verificationEntry, fixAction) {
openViewWithId(verificationEntry.elements[0].identifier['definitionId']);
let inputData = getShapeWithId(fixAction.actionValues['inputDataId']);
if (fixAction.actionValues['decisionId']) {
const modeler = getCurrentModeler();
let decision = getShapeWithId(fixAction.actionValues['decisionId']);
getCurrentModeler().connect(inputData, decision,
{type: "dmn:InformationRequirement"})
......@@ -397,7 +414,6 @@ function updateDecision(verificationEntry, fixAction) {
if (fixAction.actionValues['targetDecisionId']) {
let targetDecision = getShapeWithId(
fixAction.actionValues['targetDecisionId']);
const modeler = getCurrentModeler();
getCurrentModeler().connect(decision, targetDecision,
{type: "dmn:InformationRequirement"})
}
......
......@@ -18,7 +18,7 @@
<packaging>pom</packaging>
<version>0.9.13</version>
<version>0.9.14</version>
<dependencyManagement>
<dependencies>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment