use of org.kie.dmn.core.ast.BusinessKnowledgeModelNodeImpl in project drools by kiegroup.
the class BusinessKnowledgeModelCompiler method compileNode.
@Override
public void compileNode(DRGElement de, DMNCompilerImpl compiler, DMNModelImpl model) {
BusinessKnowledgeModel bkm = (BusinessKnowledgeModel) de;
BusinessKnowledgeModelNodeImpl bkmn = new BusinessKnowledgeModelNodeImpl(bkm);
DMNType type = null;
DMNType fnType = null;
if (bkm.getVariable() == null) {
DMNCompilerHelper.reportMissingVariable(model, de, bkm, Msg.MISSING_VARIABLE_FOR_BKM);
return;
}
DMNCompilerHelper.checkVariableName(model, bkm, bkm.getName());
if (bkm.getVariable().getTypeRef() != null) {
// variable must be present, otherwise error was already reported above.
type = compiler.resolveTypeRef(model, bkm, bkm.getVariable(), bkm.getVariable().getTypeRef());
if (type instanceof SimpleFnTypeImpl) {
fnType = type;
type = ((SimpleFnTypeImpl) type).getReturnType();
}
// consistency checks
if (bkm.getEncapsulatedLogic() != null && bkm.getEncapsulatedLogic().getTypeRef() != null) {
DMNType bkmELType = compiler.resolveTypeRef(model, bkm, bkm.getEncapsulatedLogic(), bkm.getEncapsulatedLogic().getTypeRef());
if (!areSameDMNType(fnType != null ? fnType : type, bkmELType)) {
MsgUtil.reportMessage(LOG, DMNMessage.Severity.WARN, bkm.getEncapsulatedLogic(), model, null, null, Msg.VARIABLE_TYPE_MISMATCH_FOR_BKM_EL, bkm.getEncapsulatedLogic().getTypeRef(), bkm.getVariable().getTypeRef());
}
}
if (fnType == null && bkm.getEncapsulatedLogic() != null && bkm.getEncapsulatedLogic().getExpression() != null && bkm.getEncapsulatedLogic().getExpression().getTypeRef() != null) {
// if fnType != null, this is already taken care of DROOLS-6488 in method checkFnConsistency, further below.
DMNType elExprType = compiler.resolveTypeRef(model, bkm, bkm.getEncapsulatedLogic().getExpression(), bkm.getEncapsulatedLogic().getExpression().getTypeRef());
if (!areSameDMNType(type, elExprType)) {
MsgUtil.reportMessage(LOG, DMNMessage.Severity.WARN, bkm.getEncapsulatedLogic(), model, null, null, Msg.VARIABLE_TYPE_MISMATCH_FOR_BKM_EL_BODY, bkm.getEncapsulatedLogic().getExpression().getTypeRef(), type.getName());
}
}
} else if (bkm.getVariable().getTypeRef() == null && bkm.getEncapsulatedLogic().getExpression() != null && bkm.getEncapsulatedLogic().getExpression().getTypeRef() != null) {
type = compiler.resolveTypeRef(model, bkm, bkm.getEncapsulatedLogic().getExpression(), bkm.getEncapsulatedLogic().getExpression().getTypeRef());
} else {
// for now the call bellow will return type UNKNOWN
type = compiler.resolveTypeRef(model, bkm, bkm, null);
}
bkmn.setType(fnType);
bkmn.setResultType(type);
model.addBusinessKnowledgeModel(bkmn);
}
use of org.kie.dmn.core.ast.BusinessKnowledgeModelNodeImpl in project drools by kiegroup.
the class BusinessKnowledgeModelCompiler method compileEvaluator.
@Override
public void compileEvaluator(DMNNode node, DMNCompilerImpl compiler, DMNCompilerContext ctx, DMNModelImpl model) {
BusinessKnowledgeModelNodeImpl bkmi = (BusinessKnowledgeModelNodeImpl) node;
compiler.linkRequirements(model, bkmi);
ctx.enterFrame();
try {
loadInCtx(bkmi, ctx, model);
// to allow recursive call from inside a BKM node, a variable for self must be available for the compiler context:
ctx.setVariable(bkmi.getName(), bkmi.getResultType());
FunctionDefinition funcDef = bkmi.getBusinessKnowledModel().getEncapsulatedLogic();
if (bkmi.getType() != null && funcDef != null) {
checkFnConsistency(model, bkmi, bkmi.getType(), funcDef);
}
DMNExpressionEvaluator exprEvaluator = compiler.getEvaluatorCompiler().compileExpression(ctx, model, bkmi, bkmi.getName(), funcDef);
bkmi.setEvaluator(exprEvaluator);
} finally {
ctx.exitFrame();
}
}
Aggregations