package org.drools.template; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.drools.template.parser.Column; import org.drools.template.parser.DefaultTemplateContainer; import org.drools.template.parser.TemplateContainer; import junit.framework.TestCase; public class DataProviderCompilerIntegrationTest extends TestCase { private static final StringBuffer EXPECTED_RULES = new StringBuffer(); static { String head = "package org.drools.decisiontable;\n#generated from Decision Table\nglobal FeeResult result;\n\n"; String rule3_a = "rule \"Fee Schedule_3\"\n\tagenda-group \"STANDARD\"\n\twhen\n\t\tFeeEvent(productType == \"SBLC\",\n"; String rule3_b = "\t\t\tactivityType == \"ISS\",\n\t\t\tfeeType == \"Telex\",\n\n\n\t\t\tamount < 30000,\n\t\t\tccy == \"YEN\"\n\t\t)\n"; String rule3_then = "\tthen\n\t\tresult.setSchedule(new FeeSchedule(\"62\", \"STANDARD\", 45));\nend\n\n"; String rule2_a = "rule \"Fee Schedule_2\"\n\tagenda-group \"STANDARD\"\n\twhen\n\t\tFeeEvent(productType == \"SBLC\",\n"; String rule2_b = "\t\t\tactivityType == \"ISS\",\n\t\t\tfeeType == \"Postage\",\n\n\n\n\t\t\tccy == \"YEN\"\n\t\t)\n"; String rule2_then = "\tthen\n\t\tresult.setSchedule(new FeeSchedule(\"12\", \"STANDARD\", 40));\nend\n\n"; String rule1_a = "rule \"Fee Schedule_1\"\n\tagenda-group \"STANDARD\"\n\twhen\n\t\tFeeEvent(productType == \"SBLC\",\n"; String rule1_b = "\t\t\tactivityType == \"ISS\",\n\t\t\tfeeType == \"Commission\",\n\n\t\t\tentityBranch == \"Entity Branch 1\",\n\n\t\t\tccy == \"YEN\"\n\t\t)\n"; String rule1_then = "\tthen\n\t\tresult.setSchedule(new FeeSchedule(\"15\", \"STANDARD\", 1600));\nend\n\n"; String rule0_a = "rule \"Fee Schedule_0\"\n\tagenda-group \"STANDARD\"\n\twhen\n\t\tFeeEvent(productType == \"SBLC\",\n"; String rule0_b = "\t\t\tactivityType == \"ISS\",\n\t\t\tfeeType == \"Commission\",\n\t\t\ttxParty == \"Party 1\",\n\n\n\t\t\tccy == \"USD\"\n\t\t)\n"; String rule0_then = "\tthen\n\t\tresult.setSchedule(new FeeSchedule(\"1\", \"STANDARD\", 750));\nend\n\n\n"; EXPECTED_RULES.append( head ); EXPECTED_RULES.append( rule3_a ).append( rule3_b ).append( rule3_then ); EXPECTED_RULES.append( rule2_a ).append( rule2_b ).append( rule2_then ); EXPECTED_RULES.append( rule1_a ).append( rule1_b ).append( rule1_then ); EXPECTED_RULES.append( rule0_a ).append( rule0_b ).append( rule0_then ); } private class TestDataProvider implements DataProvider { private Iterator<String[]> iterator; TestDataProvider(List<String[]> rows) { this.iterator = rows.iterator(); } public boolean hasNext() { return iterator.hasNext(); } public String[] next() { return iterator.next(); } } private ArrayList<String[]> rows = new ArrayList<String[]>(); public void setUp(){ rows.add( new String[]{ "1", "STANDARD", "FLAT", null, "SBLC", "ISS", "Commission", "Party 1", "USD", null, "750", "dummy"} ); rows.add( new String[]{ "15", "STANDARD", "FLAT", "Entity Branch 1", "SBLC", "ISS", "Commission", null, "YEN", null, "1600", "dummy" } ); rows.add( new String[]{ "12", "STANDARD", "FLAT", null, "SBLC", "ISS", "Postage", null, "YEN", null, "40", "dummy" } ); rows.add( new String[]{ "62", "STANDARD", "FLAT", null, "SBLC", "ISS", "Telex", null, "YEN", "< 30000", "45", "dummy" } ); } public void testCompiler() throws Exception { TestDataProvider tdp = new TestDataProvider( rows ); final DataProviderCompiler converter = new DataProviderCompiler(); final String drl = converter.compile( tdp, "/templates/rule_template_1.drl" ); System.out.println( drl ); assertEquals( EXPECTED_RULES.toString(), drl ); } public void testCompilerMaps() throws Exception { Collection<Map<String,Object>> maps = new ArrayList<Map<String,Object>>(); final ObjectDataCompiler converter = new ObjectDataCompiler(); InputStream templateStream = this.getClass().getResourceAsStream( "/templates/rule_template_1.drl" ); TemplateContainer tc = new DefaultTemplateContainer( templateStream ); Column[] columns = tc.getColumns(); for( String[] row: rows ){ Map<String,Object> map = new HashMap<String,Object>(); for( int icol = 0; icol < columns.length; icol++ ){ Object value = row[icol]; if( value != null ){ map.put( columns[icol].getName(), value ); } } maps.add( map ); } templateStream = this.getClass().getResourceAsStream( "/templates/rule_template_1.drl" ); final String drl = converter.compile( maps, templateStream ); System.out.println( drl ); assertEquals( EXPECTED_RULES.toString(), drl ); } public static class OBJ { private final String FEE_SCHEDULE_ID; private final String FEE_SCHEDULE_TYPE; private final String FEE_MODE_TYPE; private final String ENTITY_BRANCH; private final String PRODUCT_TYPE; private final String ACTIVITY_TYPE; public final String FEE_TYPE; public final String OWNING_PARTY; public final String CCY; public final String LC_AMOUNT; public final String AMOUNT; OBJ( String[] vals ){ FEE_SCHEDULE_ID = vals[0]; FEE_SCHEDULE_TYPE = vals[1]; FEE_MODE_TYPE = vals[2]; ENTITY_BRANCH = vals[3]; PRODUCT_TYPE = vals[4]; ACTIVITY_TYPE = vals[5]; FEE_TYPE = vals[6]; OWNING_PARTY = vals[7]; CCY = vals[8]; LC_AMOUNT = vals[9]; AMOUNT = vals[10]; } public String getFEE_SCHEDULE_ID() { return FEE_SCHEDULE_ID; } public String getFEE_SCHEDULE_TYPE() { return FEE_SCHEDULE_TYPE; } public String getFEE_MODE_TYPE() { return FEE_MODE_TYPE; } public String ENTITY_BRANCH() { return ENTITY_BRANCH; } public String PRODUCT_TYPE() { return PRODUCT_TYPE; } public String ACTIVITY_TYPE() { return ACTIVITY_TYPE; } } public void testCompilerObjs() throws Exception { Collection<Object> objs = new ArrayList<Object>(); final ObjectDataCompiler converter = new ObjectDataCompiler(); final InputStream templateStream = this.getClass().getResourceAsStream( "/templates/rule_template_1.drl" ); for( String[] row: rows ){ OBJ obj = new OBJ( row ); objs.add( obj ); } final String drl = converter.compile( objs, templateStream ); System.out.println( drl ); assertEquals( EXPECTED_RULES.toString(), drl ); } }