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( "mvel" );

            Map<String, Declaration> decls = context.getDeclarationResolver().getDeclarations(context.getRule());
            
            AnalysisResult analysis = context.getDialect().analyzeExpression( context,
                                                                              evalDescr,
                                                                              evalDescr.getContent(),
                                                                              new BoundIdentifiers( DeclarationScopeResolver.getDeclarationClasses( decls ),
                                                                                                    context ) );

            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,
                                                                       MVELCompilationUnit.Scope.EXPRESSION );
            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, context.getRule() );
            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 );
        }
    }
public RuleConditionElement build ( final RuleBuildContext context , final BaseDescr descr , final Pattern prefixPattern ) { boolean typesafe = context . isTypesafe ( ) ; final EvalDescr evalDescr = ( EvalDescr ) descr ; try { MVELDialect dialect = ( MVELDialect ) context . getDialect ( "mvel" ) ; Map < String , Declaration > decls = context . getDeclarationResolver ( ) . getDeclarations ( context . getRule ( ) ) ; AnalysisResult analysis = context . getDialect ( ) . analyzeExpression ( context , evalDescr , evalDescr . getContent ( ) , new BoundIdentifiers ( DeclarationScopeResolver . getDeclarationClasses ( decls ) , context ) ) ; 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 , MVELCompilationUnit . Scope . EXPRESSION ) ; 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 , context . getRule ( ) ) ; 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 ) ; } }
Builds and returns an Eval Conditional Element

@param context The current build context
@param descr The Eval Descriptor to build the eval conditional element from

@return the Eval Conditional Element