/* * Copyright 2011 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.simulation.fluent.test.impl; import java.util.HashMap; import java.util.Map; import org.drools.core.util.MVELSafeHelper; import org.hamcrest.Matcher; import org.kie.internal.command.Context; import org.kie.internal.fluent.test.ReflectiveMatcher; import org.kie.internal.fluent.test.ReflectiveMatcherAssert; import org.mvel2.MVEL; import org.mvel2.ParserContext; public class ReflectiveMatcherAssertImpl implements ReflectiveMatcherAssert { private String actual; private String text; private ReflectiveMatcherImpl matcher; private ReflectiveMatcherFactory factory; public ReflectiveMatcherAssertImpl() { } public ReflectiveMatcherAssertImpl(String text, ReflectiveMatcherFactory factory) { this.text = text; this.factory = factory; } public ReflectiveMatcherAssertImpl(String actual, ReflectiveMatcher matcher, ReflectiveMatcherFactory factory) { this.actual = actual; this.matcher = ( ReflectiveMatcherImpl ) matcher; this.factory = factory; } public String getActual() { return actual; } public void setActual(String actual) { this.actual = actual; } public ReflectiveMatcher getMatcher() { return matcher; } public void setReflectiveMatcher(ReflectiveMatcher matcher) { this.matcher = ( ReflectiveMatcherImpl ) matcher; } public <T> Matcher<T> build(Class<T> cls) { return null; } public void eval(Context context) { StringBuilder sbuilder = new StringBuilder(); for( String str : factory.getStaticImports() ) { sbuilder.append( "import_static " ); sbuilder.append( str ); sbuilder.append( ";\n" ); } sbuilder.append( "assertThat(" ); if ( text != null ) { sbuilder.append( text ); } else { sbuilder.append( actual ); sbuilder.append( ", " ); matcher.build( sbuilder ); } sbuilder.append( ")" ); sbuilder.append( ";\n" ); ParserContext pctx = new ParserContext(); //pctx.setStrongTyping( true ); String t = sbuilder.toString(); //System.out.println( t ); ParserContext parserCtx = new ParserContext( ); MVEL.compileExpression( t, parserCtx ); Map<String, Class> inputs = parserCtx.getInputs(); Map<String, Object> vars = new HashMap<String, Object>(); for ( String name : inputs.keySet() ) { vars.put( name, context.get( name ) ); } try { Object o = MVEL.compileExpression( sbuilder.toString(), pctx ); MVELSafeHelper.getEvaluator().executeExpression( o, vars ); } catch( Exception e ) { // Try and unwrapp to the hamcrest assertion error if we can, else rethrwo the original mvel error Throwable unwrapped = e.getCause(); if ( unwrapped != null && unwrapped.getCause() != null ) { unwrapped = unwrapped.getCause(); } if ( unwrapped instanceof AssertionError) { throw (AssertionError)e.getCause().getCause(); } else if ( e instanceof RuntimeException ){ throw (RuntimeException) e; } } } }