package org.drools.lang; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import junit.framework.TestCase; import org.antlr.runtime.ANTLRStringStream; import org.antlr.runtime.CharStream; import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.tree.CommonTreeNodeStream; import org.drools.base.evaluators.MatchesEvaluatorsDefinition; import org.drools.base.evaluators.SetEvaluatorsDefinition; import org.drools.lang.descr.FieldConstraintDescr; import org.drools.lang.descr.PatternDescr; public class MVELDumperTest extends TestCase { private MVELDumper dumper; protected void setUp() throws Exception { super.setUp(); // configure operators new SetEvaluatorsDefinition(); new MatchesEvaluatorsDefinition(); dumper = new MVELDumper(); } protected void tearDown() throws Exception { super.tearDown(); } public void testDump() throws Exception { String input = "Cheese( price > 10 && < 20 || == $val || == 30 )"; String expected = "( ( price > 10 && price < 20 ) || price == $val || price == 30 )" ; PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input); FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 ); String result = dumper.dump( fieldDescr ); assertEquals( expected, result ); } public void testDumpMatches() throws Exception { String input = "Cheese( type.toString matches \"something\\swith\\tsingle escapes\" )"; String expected = "type.toString ~= \"something\\swith\\tsingle escapes\"" ; PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input); FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 ); String result = dumper.dump( fieldDescr ); assertEquals( expected, result ); } public void testDumpMatches2() throws Exception { String input = "Cheese( type.toString matches 'something\\swith\\tsingle escapes' )"; String expected = "type.toString ~= \"something\\swith\\tsingle escapes\"" ; PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input); FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 ); String result = dumper.dump( fieldDescr ); assertEquals( expected, result ); } public void testDumpMatches3() throws Exception { String input = "Map( this[\"content\"] matches \"hello ;=\" )"; String expected = "this[\"content\"] ~= \"hello ;=\"" ; PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input); FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 ); String result = dumper.dump( fieldDescr ); assertEquals( expected, result ); } public void testDumpWithDateAttr() throws Exception { String input = "Person( son.birthDate == \"01-jan-2000\" )"; String expected = "son.birthDate == org.drools.util.DateUtils.parseDate( \"01-jan-2000\" )" ; PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input); FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 ); String result = dumper.dump( fieldDescr, true ); assertEquals( expected, result ); } private Object parse(String parserRuleName, String treeRuleName, final String text) throws Exception { return newParser(parserRuleName, treeRuleName, newCharStream(text)); } private CharStream newCharStream(final String text) { return new ANTLRStringStream(text); } private Object newParser(String parserRuleName, String treeRuleName, final CharStream charStream) { return execTreeParser(parserRuleName, treeRuleName, charStream); } public Object execTreeParser(String testRuleName, String testTreeRuleName, CharStream charStream) { Object treeRuleReturn = null; try { DRLLexer lexer = new DRLLexer(charStream); CommonTokenStream tokens = new CommonTokenStream(lexer); DRLParser parser = new DRLParser(tokens); parser.setTreeAdaptor(new DroolsTreeAdaptor()); /** Use Reflection to get rule method from parser */ Method ruleName = Class.forName("org.drools.lang.DRLParser") .getMethod(testRuleName); /** Invoke grammar rule, and get the return value */ Object ruleReturn = ruleName.invoke(parser); if (!parser.hasErrors()){ Class _return = Class.forName("org.drools.lang.DRLParser" + "$" + testRuleName + "_return"); Method returnName = _return.getMethod("getTree"); DroolsTree tree = (DroolsTree) returnName.invoke(ruleReturn); // Walk resulting tree; create tree nodes stream first CommonTreeNodeStream nodes = new CommonTreeNodeStream(tree); // AST nodes have payload that point into token stream nodes.setTokenStream(tokens); // Create a tree walker attached to the nodes stream DescrBuilderTree walker = new DescrBuilderTree(nodes); /** Invoke the tree rule, and store the return value if there is */ Method treeRuleName = Class.forName( "org.drools.lang.DescrBuilderTree").getMethod( testTreeRuleName); treeRuleReturn = treeRuleName.invoke(walker); } if (treeRuleReturn != null) { /** If return object is instanceof AST, get the toStringTree */ if (treeRuleReturn.toString().indexOf( testTreeRuleName + "_return") > 0) { try { // NullPointerException may happen here... Class _treeReturn = Class .forName("org.drools.lang.DescrBuilderTree" + "$" + testTreeRuleName + "_return"); Field[] fields = _treeReturn.getDeclaredFields(); for (Field field : fields) { if (field.getType().getName().contains( "org.drools.lang.descr.")) { return field.get(treeRuleReturn); } } } catch (Exception e) { System.err.println(e); } } } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return treeRuleReturn; } }