package org.drools.runtime.pipeline.impl;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import org.drools.runtime.pipeline.Expression;
import org.drools.runtime.pipeline.PipelineContext;
import org.drools.runtime.pipeline.Receiver;
import org.mvel2.MVEL;
import org.mvel2.ParserContext;
import org.mvel2.compiler.ExpressionCompiler;

public class MvelExpression extends BaseEmitter
    implements
    Expression,
    Receiver {
    private Serializable expr;

    public MvelExpression(String text) {
        final ParserContext parserContext = new ParserContext();
        parserContext.setStrictTypeEnforcement( false );

        ExpressionCompiler compiler = new ExpressionCompiler( text );
        this.expr = compiler.compile( parserContext );
    }

    public void receive(Object object,
                       PipelineContext context) {
        Object result = null;
        try {
            Map<String, Object> vars = new HashMap<String, Object>(1);
            vars.put( "context", context );
            result = MVEL.executeExpression( this.expr,
                                    object,
                                    vars );
        } catch ( Exception e ) {
            handleException( this,
                             object,
                             e );
        }
        emit( result,
              context );
    }

}
