package fitnesse.slimTables; import java.util.HashMap; import java.util.Map; import fitnesse.responders.run.slimResponder.SlimTestContext; import fitnesse.slimTables.SlimTable.Disgracer; public class SlimTableFactory { private boolean doesNotHaveColon(String tableType) { return tableType.indexOf(":") == -1; } private boolean beginsWith(String tableType, String typeCode) { return tableType.toUpperCase().startsWith(typeCode.toUpperCase()); } private Map<String, String> tableTypeArrays = new HashMap<String, String>(); public SlimTable makeSlimTable(Table table, String tableId, SlimTestContext slimTestContext) { String tableType = getFullTableName(table.getCellContents(0, 0)); if (beginsWith(tableType, "dt:") || beginsWith(tableType, "decision:")) return new DecisionTable(table, tableId, slimTestContext); else if (beginsWith(tableType, "ordered query:")) return new OrderedQueryTable(table, tableId, slimTestContext); else if (beginsWith(tableType, "subset query:")) return new SubsetQueryTable(table, tableId, slimTestContext); else if (beginsWith(tableType, "query:")) return new QueryTable(table, tableId, slimTestContext); else if (beginsWith(tableType, "table:")) return new TableTable(table, tableId, slimTestContext); else if (tableType.equalsIgnoreCase("script")) return new ScriptTable(table, tableId, slimTestContext); else if (tableType.equalsIgnoreCase("scenario")) return new ScenarioTable(table, tableId, slimTestContext); else if (tableType.equalsIgnoreCase("comment")) return null; else if (tableType.equalsIgnoreCase("import")) return new ImportTable(table, tableId, slimTestContext); else if (tableType.equalsIgnoreCase("library")) return new LibraryTable(table, tableId, slimTestContext); else if (tableType.equalsIgnoreCase("define table type")) { parseDefineTableTypeTable(table); return null; } else if (doesNotHaveColon(tableType)) return new DecisionTable(table, tableId, slimTestContext); return new SlimErrorTable(table, tableId, slimTestContext); } private String getFullTableName(String tableName) { if (tableName.contains(":")) { return tableName; } //check for a table type defined in a table type definition String disgracedName = Disgracer.disgraceClassName(tableName); if (tableTypeArrays.containsKey(disgracedName)) { return tableTypeArrays.get(disgracedName) + ":" + tableName; } return tableName; } private SlimTable parseDefineTableTypeTable(Table table) { for (int rowIndex = 1; rowIndex < table.getRowCount(); rowIndex++) parseDefineTableTypeRow(table, rowIndex); return null; } private void parseDefineTableTypeRow(Table table, int rowIndex) { if (table.getColumnCountInRow(rowIndex) >= 2) { String fixtureName = table.getCellContents(0, rowIndex); String fixture = Disgracer.disgraceClassName(fixtureName); String tableSpecifier = table.getCellContents(1, rowIndex).toLowerCase(); tableTypeArrays.put(fixture, makeTableType(tableSpecifier)); } } private String makeTableType(String tableSpecifier) { String tableType = tableSpecifier.replace(':', ' '); if (tableType.startsWith("as")) tableType = tableType.substring(2); return tableType.trim(); } }