diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingInputDataVerifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingInputDataVerifier.java index 491fd0feab467a3413ca475ca69e5f80b4a6dc45..0d90d3ec16bf8105e256e85c91f40e184add653f 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingInputDataVerifier.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingInputDataVerifier.java @@ -19,12 +19,14 @@ import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnInputColumn; import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnInputData; import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnNode; 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.MissingInputDataVerification; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -44,6 +46,7 @@ public class MissingInputDataVerifier extends AbstractVerifier { } private void checkExistingInputData(VDmnInputColumn inputColumn, List<VDmnNode> inputNodes) { + List<VDmnOutputColumn> potentialNoNameOutputs = new ArrayList<>(); // if the inputColumn has no name, add the column if (inputColumn.getName().isPresent()) { Name inputColumnName = inputColumn.getName().get(); @@ -64,6 +67,12 @@ public class MissingInputDataVerifier extends AbstractVerifier { && outputColumn.getName().get().equals(inputColumnName)) { return; } + if (!outputColumn.getName().isPresent() + && (outputColumn.getTypeRef().equals(inputColumn.getTypeRef()) + || outputColumn.getValues().stream() + .allMatch(v -> v.getText().getValue().isEmpty()))) { + potentialNoNameOutputs.add(outputColumn); + } } } } @@ -72,6 +81,28 @@ public class MissingInputDataVerifier extends AbstractVerifier { vreFactory .addElement(VerificationResultEntryElement.create(inputColumn)) .addVerificationFix(SHOW_INPUT_COLUMNS); + // Actions for renaming output Column + potentialNoNameOutputs.forEach( + o -> + vreFactory.addVerificationFix( + VerificationFix.getBuilder() + .withFixName( + new Name( + "Name \"" + + inputColumn.getName().get().getValue() + + "\" the output column in decision \"" + + VDmnFunctions.getDecisionStringName(o.getVDmnDecision()) + + "\"")) + .addAction( + Action.getBuilder() + .withActionType(UPDATE) + .withActionScope(OUTPUT_COLUMN) + .addIdValue(o.getVDmnDecision().getDecisionId()) + .addIdValue(o.getOutputId()) + .addValue("name", inputColumn.getName().get().getValue()) + .addValue("typeRef", inputColumn.getTypeRef().getName()) + .build()) + .build())); // Action for creating input Data if (inputColumn.getName().isPresent()) { vreFactory.addVerificationFix( @@ -92,6 +123,8 @@ public class MissingInputDataVerifier extends AbstractVerifier { // Actions for creating output columns in connected decisions searchPossibleConnectedDecisions(inputColumn); } + // Actions for renaming column + searchPossibleNames(inputColumn); vreFactory // Action for deleting column .addVerificationFix( @@ -184,4 +217,58 @@ public class MissingInputDataVerifier extends AbstractVerifier { } } } + + private void searchPossibleNames(VDmnInputColumn inputColumn) { + List<Name> otherInputNames = + inputColumn.getVDmnDecisionTable().getVDmnInputColumns().stream() + .filter(c -> c.getName().isPresent()) + .map(c -> c.getName().get()) + .collect(Collectors.toList()); + if (!inputColumn.getName().isPresent()) { + for (VDmnNode node : inputColumn.getVDmnDecision().getVDmnInformationRequirements()) { + if (node.isInputData()) { + if (!otherInputNames.contains(node.getName().get())) { + vreFactory.addVerificationFix( + VerificationFix.getBuilder() + .withFixName("Name column \"" + node.getName().get().getValue() + "\"") + .addAction( + Action.getBuilder() + .withActionType(UPDATE) + .withActionScope(INPUT_COLUMN) + .addIdValue(inputColumn.getVDmnDecision().getDecisionId()) + .addIdValue(inputColumn.getInputId()) + .addValue("name", node.getName().get().getValue()) + .build()) + .build()); + } + } else { + for (VDmnOutputColumn outputColumn : + ((VDmnDecision) node).getVDmnDecisionTable().getVDmnOutputColumns()) { + if (outputColumn.getName().isPresent()) { + if (!otherInputNames.contains(outputColumn.getName().get())) { + if (outputColumn.getTypeRef().equals(inputColumn.getTypeRef()) + || inputColumn.getValues().stream() + .allMatch(c -> c.getText().getValue().isEmpty())) { + vreFactory.addVerificationFix( + VerificationFix.getBuilder() + .withFixName( + "Name column \"" + outputColumn.getName().get().getValue() + "\"") + .addAction( + Action.getBuilder() + .withActionType(UPDATE) + .withActionScope(INPUT_COLUMN) + .addIdValue(inputColumn.getVDmnDecision().getDecisionId()) + .addIdValue(inputColumn.getInputId()) + .addValue("name", outputColumn.getName().get().getValue()) + .addValue("typeRef", outputColumn.getTypeRef().getName()) + .build()) + .build()); + } + } + } + } + } + } + } + } } diff --git a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifierActions.js b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifierActions.js index 4e5648c0a2fcbfb045c0ee029265c54fdd834196..c5c08ea27d576101a057a1f8688e294a3a713827 100644 --- a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifierActions.js +++ b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifierActions.js @@ -424,6 +424,14 @@ function updateColumn(verificationEntry, fixAction, idName) { column.businessObject.inputExpression.text = fixAction.actionValues['name']; } } + if (fixAction.actionValues['typeRef']) { + if (idName === 'outputId') { + column.businessObject.typeRef = fixAction.actionValues['typeRef'].toLowerCase(); + } else { + column.businessObject.inputExpression.typeRef = fixAction.actionValues['typeRef'].toLowerCase(); + } + } + if (fixAction.actionValues['addPredVal'] || fixAction.actionValues['delPredVal']) { let inputVals = []; @@ -456,6 +464,7 @@ function updateColumn(verificationEntry, fixAction, idName) { getCurrentModeler().editAllowedValues(column.businessObject, inputVals); } } + openViewWithId(fixAction.actionValues['decisionId']); } // get a rule: