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 4e0da173b9b3325918a612cb03dfd857b4c5de62..1644bccc892314a89f0d4313cd2e13dc0a175ac3 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 @@ -11,6 +11,10 @@ import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnNode; import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnOutputColumn; import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntry.VerificationClassification; 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.ActionScope; +import de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionType; +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; @@ -58,11 +62,34 @@ public class MissingInputDataVerifier extends AbstractVerifier { // no input data found yet -> add column to results vreFactory .addElement(VerificationResultEntryElement.create(inputColumn)) - .addVerificationFix(SHOW_INPUT_COLUMNS) - .addToEntry( - VerificationClassification.WARNING, - templateDecision(inputColumn.getDmnDecision()) - + "Input column \"%s\" has no input data node.", - getColumnStringName(inputColumn)); + .addVerificationFix(SHOW_INPUT_COLUMNS); + // Action for creating input Data + if (inputColumn.getName().isPresent()) { + vreFactory.addVerificationFix( + VerificationFix.getBuilder() + .withFixName(new Name("Add Data Input")) + .addAction( + Action.getBuilder() + .withActionType(ActionType.CREATE) + .withActionScope(ActionScope.INPUT_DATA) + .addValue("name", inputColumn.getName().get().getValue()) + .build()) + .build()); + } + // Action for deleting column + vreFactory.addVerificationFix( + VerificationFix.getBuilder() + .withFixName(new Name("Delete Column")) + .addAction( + Action.getBuilder() + .withActionType(ActionType.DELETE) + .withActionScope(ActionScope.INPUT_COLUMN) + .build()) + .build()); + vreFactory.addToEntry( + VerificationClassification.WARNING, + templateDecision(inputColumn.getDmnDecision()) + + "Input column \"%s\" has no input data node.", + getColumnStringName(inputColumn)); } } 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 7d9df23a9c73fe4db4a18c91fc9f56d023ed6a7f..8c05d667e76dbf1abc8a98ee86144dcf0043d792 100644 --- a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifierActions.js +++ b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifierActions.js @@ -5,6 +5,10 @@ function getCurrentModeler() { return dmnModeler.getActiveViewer().get("modeling"); } +function getShapeWithId(id) { + return getCurrentModeler()._canvas._elementRegistry.get(id); +} + /** * * @param {VerificationEntry} verificationEntry @@ -159,19 +163,60 @@ function performVerificationFixCREATE(verificationEntry, fixAction) { case 'RULE': createRule(verificationEntry, fixAction); break; + case 'INPUT_DATA': + createInputData(verificationEntry, fixAction); + break; case 'INPUT_ENTRY': case 'OUTPUT_ENTRY': - case 'INPUT_DATA': case 'INPUT_COLUMN': case 'OUTPUT_COLUMN': case 'DECISION_TABLE': case 'DECISION': default: - alert("ACTION undefined: " + fix.actions[i].actionType + ' -> ' - + fix.actions[i].actionScope); + alert("ACTION undefined: " + fixAction.actionType + ' -> ' + + fixAction.actionScope); } } +/** + * + * @param {VerificationEntry} verificationEntry + * @param {Action} fixAction + */ +function createRule(verificationEntry, fixAction) { + openViewWithId(verificationEntry.elements[0].identifier['decisionId']); + const modeler = getCurrentModeler(); + const rule = modeler.addRow({type: "dmn:DecisionRule"}); + const {cells} = rule; + for (const [key, value] of Object.entries(fixAction.actionValues)) { + let cell = getCellByColId(key, cells); + if (cell) { + modeler.editCell(getCellByColId(key, cells), value); + } + } +} + +/** + * + * @param {VerificationEntry} verificationEntry + * @param {Action} fixAction + */ +function createInputData(verificationEntry, fixAction) { + // getCurrentModeler().createShape(getCurrentModeler()._elementFactory.createDrdElement('shape', {type:'dmn:InputData'}), {x:0,y:0}, dmnModeler._definitions) + openViewWithId(verificationEntry.elements[0].identifier['definitionId']); + let decision = getShapeWithId( + verificationEntry.elements[0].identifier['decisionId']); + const modeler = getCurrentModeler(); + const shape = modeler._elementFactory.createDrdElement('shape', + {type: 'dmn:InputData'}); + let inputData = modeler.appendShape(decision, shape, + {x: decision.x - 150, y: decision.y + 40}, + getShapeWithId(verificationEntry.elements[0].identifier['definitionId']), + {attach: false, connection: {type: "dmn:InformationRequirement"}}); + inputData.businessObject.name = fixAction.actionValues['name']; + openViewWithId(verificationEntry.elements[0].identifier['definitionId']); +} + /** * * @param {VerificationEntry} verificationEntry @@ -190,26 +235,8 @@ function performVerificationFixDELETE(verificationEntry, fixAction) { case 'DECISION_TABLE': case 'DECISION': default: - alert("ACTION undefined: " + fix.actions[i].actionType + ' -> ' - + fix.actions[i].actionScope); - } -} - -/** - * - * @param {VerificationEntry} verificationEntry - * @param {Action} fixAction - */ -function createRule(verificationEntry, fixAction) { - openViewWithId(verificationEntry.elements[0].identifier['decisionId']); - const modeler = getCurrentModeler(); - const rule = modeler.addRow({type: "dmn:DecisionRule"}); - const {cells} = rule; - for (const [key, value] of Object.entries(fixAction.actionValues)) { - let cell = getCellByColId(key, cells); - if (cell) { - modeler.editCell(getCellByColId(key, cells), value); - } + alert("ACTION undefined: " + fixAction.actionType + ' -> ' + + fixAction.actionScope); } }