use of org.kie.dmn.api.core.ast.DecisionNode in project drools by kiegroup.
the class DMNRuntimeImpl method createResult.
private DMNResultImpl createResult(DMNModel model, DMNContext context) {
DMNResultImpl result = new DMNResultImpl(model);
result.setContext(context.clone());
for (DecisionNode decision : model.getDecisions()) {
result.setDecisionResult(decision.getId(), new DMNDecisionResultImpl(decision.getId(), decision.getName()));
}
return result;
}
use of org.kie.dmn.api.core.ast.DecisionNode in project drools by kiegroup.
the class DMNScenarioRunnerHelperTest method commonExtractResultMetadata.
public void commonExtractResultMetadata(List<DMNMessage> messages) {
Set<DecisionNode> decisions = new HashSet<>();
IntStream.range(0, 5).forEach(index -> decisions.add(createDecisionMock("decision" + index)));
when(dmnModelMock.getDecisions()).thenReturn(decisions);
List<DMNDecisionResult> decisionResults = new ArrayList<>();
decisionResults.add(createDecisionResultMock("decision2", true, messages));
decisionResults.add(createDecisionResultMock("decision3", false, messages));
when(dmnResultMock.getDecisionResults()).thenReturn(decisionResults);
ScenarioWithIndex scenarioWithIndex = new ScenarioWithIndex(1, scenario1);
ScenarioResultMetadata scenarioResultMetadata = runnerHelper.extractResultMetadata(requestContextMock, scenarioWithIndex);
assertEquals(scenarioWithIndex, scenarioResultMetadata.getScenarioWithIndex());
assertEquals(5, scenarioResultMetadata.getAvailable().size());
assertTrue(scenarioResultMetadata.getAvailable().contains("decision1"));
assertEquals(1, scenarioResultMetadata.getExecuted().size());
assertTrue(scenarioResultMetadata.getExecuted().contains("decision2"));
assertFalse(scenarioResultMetadata.getExecuted().contains("decision3"));
final List<AuditLogLine> auditLogLines = scenarioResultMetadata.getAuditLogLines();
assertNotNull(auditLogLines);
if (messages == null) {
assertEquals(decisionResults.size(), auditLogLines.size());
for (int i = 0; i < decisionResults.size(); i++) {
commonCheckAuditLogLine(auditLogLines.get(i), decisionResults.get(i).getDecisionName(), decisionResults.get(i).getEvaluationStatus().name(), null);
}
} else {
List<String> expectedDecisions = Arrays.asList("decision2", "decision3");
List<String> expectedResults = Arrays.asList(DecisionEvaluationStatus.SUCCEEDED.toString(), DecisionEvaluationStatus.FAILED.toString());
int expectedLines = messages.size() * expectedDecisions.size();
assertEquals(expectedLines, auditLogLines.size());
for (int i = 0; i < auditLogLines.size(); i++) {
int messagesIndex = i < messages.size() ? i : i - messages.size();
String decisionName = i < messages.size() ? expectedDecisions.get(0) : expectedDecisions.get(1);
String expectedResultName = i < messages.size() ? expectedResults.get(0) : expectedResults.get(1);
commonCheckAuditLogLine(auditLogLines.get(i), decisionName, expectedResultName, messages.get(messagesIndex).getLevel().name() + ": " + messages.get(messagesIndex).getText());
}
}
}
use of org.kie.dmn.api.core.ast.DecisionNode in project drools by kiegroup.
the class DMNRuntimeImpl method evaluateAll.
@Override
public DMNResult evaluateAll(DMNModel model, DMNContext context) {
Objects.requireNonNull(model, () -> MsgUtil.createMessage(Msg.PARAM_CANNOT_BE_NULL, "model"));
Objects.requireNonNull(context, () -> MsgUtil.createMessage(Msg.PARAM_CANNOT_BE_NULL, "context"));
boolean performRuntimeTypeCheck = performRuntimeTypeCheck(model);
DMNResultImpl result = createResult(model, context);
DMNRuntimeEventManagerUtils.fireBeforeEvaluateAll(eventManager, model, result);
// the engine should evaluate all Decisions belonging to the "local" model namespace, not imported decision explicitly.
Set<DecisionNode> decisions = model.getDecisions().stream().filter(d -> d.getModelNamespace().equals(model.getNamespace())).collect(Collectors.toSet());
for (DecisionNode decision : decisions) {
evaluateDecision(context, result, decision, performRuntimeTypeCheck);
}
DMNRuntimeEventManagerUtils.fireAfterEvaluateAll(eventManager, model, result);
return result;
}
use of org.kie.dmn.api.core.ast.DecisionNode in project drools by kiegroup.
the class DMNRuntimeImpl method evaluateDecision.
private boolean evaluateDecision(DMNContext context, DMNResultImpl result, DecisionNode d, boolean typeCheck) {
DecisionNodeImpl decision = (DecisionNodeImpl) d;
String decisionId = d.getModelNamespace().equals(result.getModel().getNamespace()) ? decision.getId() : decision.getModelNamespace() + "#" + decision.getId();
if (isNodeValueDefined(result, decision, decision)) {
// already resolved
return true;
} else {
// check if the decision was already evaluated before and returned error
DMNDecisionResult.DecisionEvaluationStatus status = Optional.ofNullable(result.getDecisionResultById(decisionId)).map(DMNDecisionResult::getEvaluationStatus).orElse(// it might be an imported Decision.
DMNDecisionResult.DecisionEvaluationStatus.NOT_EVALUATED);
if (FAILED == status || SKIPPED == status || EVALUATING == status) {
return false;
}
}
BeforeEvaluateDecisionEvent beforeEvaluateDecisionEvent = null;
try {
beforeEvaluateDecisionEvent = DMNRuntimeEventManagerUtils.fireBeforeEvaluateDecision(eventManager, decision, result);
boolean missingInput = false;
DMNDecisionResultImpl dr = (DMNDecisionResultImpl) result.getDecisionResultById(decisionId);
if (dr == null) {
// an imported Decision now evaluated, requires the creation of the decision result:
String decisionResultName = d.getName();
Optional<String> importAliasFor = ((DMNModelImpl) result.getModel()).getImportAliasFor(d.getModelNamespace(), d.getModelName());
if (importAliasFor.isPresent()) {
decisionResultName = importAliasFor.get() + "." + d.getName();
}
dr = new DMNDecisionResultImpl(decisionId, decisionResultName);
if (importAliasFor.isPresent()) {
// otherwise is a transitive, skipped and not to be added to the results:
result.addDecisionResult(dr);
}
}
dr.setEvaluationStatus(DMNDecisionResult.DecisionEvaluationStatus.EVALUATING);
for (DMNNode dep : decision.getDependencies().values()) {
try {
if (typeCheck && !checkDependencyValueIsValid(dep, result)) {
missingInput = true;
DMNMessage message = MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, ((DMNBaseNode) dep).getSource(), result, null, null, Msg.ERROR_EVAL_NODE_DEP_WRONG_TYPE, getIdentifier(decision), getDependencyIdentifier(decision, dep), MsgUtil.clipString(Objects.toString(result.getContext().get(dep.getName())), 50), ((DMNBaseNode) dep).getType());
reportFailure(dr, message, DMNDecisionResult.DecisionEvaluationStatus.SKIPPED);
}
} catch (Exception e) {
MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, ((DMNBaseNode) dep).getSource(), result, e, null, Msg.ERROR_CHECKING_ALLOWED_VALUES, getDependencyIdentifier(decision, dep), e.getMessage());
}
if (!isNodeValueDefined(result, decision, dep)) {
boolean walkingIntoScope = walkIntoImportScope(result, decision, dep);
if (dep instanceof DecisionNode) {
if (!evaluateDecision(context, result, (DecisionNode) dep, typeCheck)) {
missingInput = true;
DMNMessage message = MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, decision.getSource(), result, null, null, Msg.UNABLE_TO_EVALUATE_DECISION_REQ_DEP, getIdentifier(decision), getDependencyIdentifier(decision, dep));
reportFailure(dr, message, DMNDecisionResult.DecisionEvaluationStatus.SKIPPED);
}
} else if (dep instanceof BusinessKnowledgeModelNode) {
evaluateBKM(context, result, (BusinessKnowledgeModelNode) dep, typeCheck);
} else if (dep instanceof DecisionServiceNode) {
evaluateDecisionService(context, result, (DecisionServiceNode) dep, typeCheck);
} else {
missingInput = true;
DMNMessage message = MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, decision.getSource(), result, null, null, Msg.REQ_DEP_NOT_FOUND_FOR_NODE, getDependencyIdentifier(decision, dep), getIdentifier(decision));
reportFailure(dr, message, DMNDecisionResult.DecisionEvaluationStatus.SKIPPED);
}
if (walkingIntoScope) {
result.getContext().popScope();
}
}
}
if (missingInput) {
return false;
}
if (decision.getEvaluator() == null) {
DMNMessage message = MsgUtil.reportMessage(logger, DMNMessage.Severity.WARN, decision.getSource(), result, null, null, Msg.MISSING_EXPRESSION_FOR_DECISION, getIdentifier(decision));
reportFailure(dr, message, DMNDecisionResult.DecisionEvaluationStatus.SKIPPED);
return false;
}
try {
EvaluatorResult er = decision.getEvaluator().evaluate(this, result);
if (er.getResultType() == EvaluatorResult.ResultType.SUCCESS) {
Object value = er.getResult();
if (!decision.getResultType().isCollection() && value instanceof Collection && ((Collection) value).size() == 1) {
// spec defines that "a=[a]", i.e., singleton collections should be treated as the single element
// and vice-versa
value = ((Collection) value).toArray()[0];
}
try {
if (typeCheck && !d.getResultType().isAssignableValue(value)) {
DMNMessage message = MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, decision.getSource(), result, null, null, Msg.ERROR_EVAL_NODE_RESULT_WRONG_TYPE, getIdentifier(decision), decision.getResultType(), value);
reportFailure(dr, message, DMNDecisionResult.DecisionEvaluationStatus.FAILED);
return false;
}
} catch (Exception e) {
MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, decision.getSource(), result, e, null, Msg.ERROR_CHECKING_ALLOWED_VALUES, getIdentifier(decision), e.getMessage());
return false;
}
result.getContext().set(decision.getDecision().getVariable().getName(), value);
dr.setResult(value);
dr.setEvaluationStatus(DMNDecisionResult.DecisionEvaluationStatus.SUCCEEDED);
} else {
dr.setEvaluationStatus(DMNDecisionResult.DecisionEvaluationStatus.FAILED);
return false;
}
} catch (Throwable t) {
DMNMessage message = MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, decision.getSource(), result, t, null, Msg.ERROR_EVAL_DECISION_NODE, getIdentifier(decision), t.getMessage());
reportFailure(dr, message, DMNDecisionResult.DecisionEvaluationStatus.FAILED);
}
return true;
} finally {
DMNRuntimeEventManagerUtils.fireAfterEvaluateDecision(eventManager, decision, result, beforeEvaluateDecisionEvent);
}
}
use of org.kie.dmn.api.core.ast.DecisionNode in project drools by kiegroup.
the class DMNTypeSafeTypeGenerator method processTypes.
public DMNTypeSafeTypeGenerator processTypes() {
Set<InputDataNode> inputs = dmnModel.getInputs();
DMNInputSetType inputSetType = new DMNInputSetType(index, codeGenConfig);
for (InputDataNode i : inputs) {
inputSetType.addField(i.getName(), i.getType());
}
inputSetType.initFields();
inputSetType.setJavadoc(postfixToJavadoc(new StringBuilder("A representation of all the InputData and other DRG Requirement of the whole DMN '").append(dmnModel.getName()).append("' inputs.").toString(), dmnModel));
types.add(inputSetType);
Set<DecisionNode> decisions = dmnModel.getDecisions();
Collection<DecisionServiceNode> decisionServices = dmnModel.getDecisionServices();
Set<BusinessKnowledgeModelNode> bkms = dmnModel.getBusinessKnowledgeModels();
DMNOutputSetType outputSetType = new DMNOutputSetType(index, codeGenConfig);
for (InputDataNode i : inputs) {
// OutputSet also contains inputs
outputSetType.addField(i.getName(), i.getType());
}
for (DecisionNode d : decisions) {
outputSetType.addField(d.getName(), d.getResultType());
}
for (DecisionServiceNode ds : decisionServices) {
outputSetType.addField(ds.getName(), dmnModel.getTypeRegistry().unknown());
}
for (BusinessKnowledgeModelNode bkm : bkms) {
outputSetType.addField(bkm.getName(), dmnModel.getTypeRegistry().unknown());
}
outputSetType.initFields();
outputSetType.setJavadoc(postfixToJavadoc(new StringBuilder("A representation of all the OutputData of the whole DMN '").append(dmnModel.getName()).append("' outputs.").toString(), dmnModel));
types.add(outputSetType);
for (DMNType type : index.typesToGenerateByNS(dmnModel.getNamespace())) {
// this generator shall only be concerned with the types belonging to this generator dmnModel.
DMNDeclaredType dmnDeclaredType = new DMNDeclaredType(index, type, codeGenConfig);
dmnDeclaredType.setJavadoc(postfixToJavadoc(new StringBuilder("A representation of the DMN defined ItemDefinition type '").append(type.getName()).append("'.").toString(), dmnModel));
types.add(dmnDeclaredType);
}
return this;
}
Aggregations