package org.drools.chance.rule.constraint.core.evaluators; import org.drools.base.mvel.MVELCompilationUnit; import org.drools.chance.degree.Degree; import org.drools.common.InternalWorkingMemory; import org.drools.reteoo.LeftTuple; import org.drools.rule.Declaration; import org.drools.rule.MVELDialectRuntimeData; import org.drools.rule.constraint.MvelConditionEvaluator; import org.mvel2.MVEL; import org.mvel2.ParserConfiguration; import org.mvel2.ParserContext; import org.mvel2.compiler.ExecutableStatement; import org.mvel2.integration.VariableResolverFactory; import java.util.Map; import static org.drools.rule.constraint.EvaluatorHelper.valuesAsMap; public class ImperfectMvelConditionEvaluator extends MvelConditionEvaluator { public ImperfectMvelConditionEvaluator(ParserConfiguration configuration, String expression, Declaration[] declarations,String conditionClass) { super(configuration, expression, declarations,conditionClass); } public ImperfectMvelConditionEvaluator(MVELCompilationUnit compilationUnit, ParserConfiguration parserConfiguration, ExecutableStatement executableStatement, Declaration[] declarations, String conditionClass) { super(compilationUnit, parserConfiguration, executableStatement, declarations, conditionClass); } public Degree match(Object object, InternalWorkingMemory workingMemory, LeftTuple leftTuple) { return match(executableStatement, object, workingMemory, leftTuple); } public Degree match(ExecutableStatement statement, Object object, InternalWorkingMemory workingMemory, LeftTuple leftTuple) { if (compilationUnit == null) { Map<String, Object> vars = valuesAsMap(object, workingMemory, leftTuple, declarations); return match(statement, object, vars); } VariableResolverFactory factory = compilationUnit.createFactory(); compilationUnit.updateFactory( null, null, object, leftTuple, null, workingMemory, workingMemory.getGlobalResolver(), factory ); org.drools.rule.Package pkg = workingMemory.getRuleBase().getPackage( "MAIN" ); if ( pkg != null ) { MVELDialectRuntimeData data = (MVELDialectRuntimeData) pkg.getDialectRuntimeRegistry().getDialectData("mvel"); factory.setNextFactory( data.getFunctionFactory() ); } return (Degree) MVEL.executeExpression(statement, object, factory); } private Degree match(ExecutableStatement statement, Object object, Map<String, Object> vars) { return vars == null ? (Degree)MVEL.executeExpression(statement, object) : (Degree)MVEL.executeExpression(statement, object, vars); } }