package detective.core.dsl.table; import groovy.lang.Closure; import groovy.lang.GroovyObjectSupport; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.codehaus.groovy.runtime.GroovyCategorySupport; import detective.core.Parameters; import detective.core.dsl.DslException; import detective.core.dsl.builder.ShareDataAwardDelegate; import detective.core.runner.PropertyToStringDelegate; public class TableParser { static ThreadLocal<List<Row>> context = new ThreadLocal<List<Row>>(); public static Row or(Object self, Object arg) { return appendRow(self, arg); } public static Row or(Integer self, Integer arg) { return appendRow(self, arg); } public static Row or(Integer self, Number arg) { return appendRow(self, arg); } public static Row or(Boolean self, Boolean arg) { return appendRow(self, arg); } public static Row appendRow(Object value, Object nextValue) { Row row = new Row(value); context.get().add(row); return row.or(nextValue); } public static List<Row> asListOfRows(Parameters existsParameters, Closure<?> tableData) { context.set(new ArrayList<Row>()); tableData.setDelegate(new ShareDataAwardDelegate(existsParameters)); tableData.setResolveStrategy(Closure.DELEGATE_FIRST); GroovyCategorySupport.use(TableParser.class, tableData); List<Row> rows = context.get(); if (rows.size() <= 1) throw new DslException("table requires at least 2 rows, first row for column names, the rest for the data."); if (rows.size() > 0){ for (int i = 0; i < rows.size(); i++){ rows.get(i).setRowHeader(rows.get(0)); } } rows.remove(0); return rows; } }