public RuleConditionElement build(final RuleBuildContext context,
final BaseDescr descr,
final Pattern prefixPattern) {
boolean typesafe = context.isTypesafe();
// it must be an EvalDescr
final EvalDescr evalDescr = (EvalDescr) descr;
try {
MVELDialect dialect = (MVELDialect) context.getDialect( context.getDialect().getId() );
Map<String, Declaration> decls = context.getDeclarationResolver().getDeclarations(context.getRule());
AnalysisResult analysis = context.getDialect().analyzeExpression( context,
evalDescr,
evalDescr.getContent(),
new BoundIdentifiers(context.getDeclarationResolver().getDeclarationClasses( decls ),
context.getPackageBuilder().getGlobals() ) );
final BoundIdentifiers usedIdentifiers = analysis.getBoundIdentifiers();
int i = usedIdentifiers.getDeclrClasses().keySet().size();
Declaration[] previousDeclarations = new Declaration[i];
i = 0;
for ( String id : usedIdentifiers.getDeclrClasses().keySet() ) {
previousDeclarations[i++] = decls.get( id );
}
Arrays.sort( previousDeclarations, SortDeclarations.instance );
MVELCompilationUnit unit = dialect.getMVELCompilationUnit( (String) evalDescr.getContent(),
analysis,
previousDeclarations,
null,
null,
context,
"drools",
KnowledgeHelper.class,
false );
final EvalCondition eval = new EvalCondition( previousDeclarations );
MVELEvalExpression expr = new MVELEvalExpression( unit,
dialect.getId() );
eval.setEvalExpression( KiePolicyHelper.isPolicyEnabled() ? new SafeEvalExpression(expr) : expr );
MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( "mvel" );
data.addCompileable( eval,
expr );
expr.compile( data );
return eval;
} catch ( final Exception e ) {
copyErrorLocation(e, evalDescr);
context.addError( new DescrBuildError( context.getParentDescr(),
evalDescr,
e,
"Unable to build expression for 'eval':" + e.getMessage() + " '" + evalDescr.getContent() + "'" ) );
return null;
} finally {
context.setTypesafe( typesafe );
}
}