package org.insightech.er.editor.model.dbexport.testdata;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.insightech.er.editor.model.ERDiagram;
import org.insightech.er.editor.model.diagram_contents.element.node.table.ERTable;
import org.insightech.er.editor.model.diagram_contents.element.node.table.column.NormalColumn;
import org.insightech.er.editor.model.settings.export.ExportTestDataSetting;
import org.insightech.er.editor.model.testdata.DirectTestData;
import org.insightech.er.editor.model.testdata.RepeatTestData;
import org.insightech.er.editor.model.testdata.RepeatTestDataDef;
import org.insightech.er.editor.model.testdata.TableTestData;
import org.insightech.er.editor.model.testdata.TestData;
public abstract class TestDataCreator {
protected ERDiagram diagram;
protected ExportTestDataSetting exportTestDataSetting;
protected TestData testData;
protected Map<NormalColumn, List<String>> valueListMap;
public TestDataCreator() {
}
public void init(TestData testData) {
this.testData = testData;
this.valueListMap = new HashMap<NormalColumn, List<String>>();
}
public String getMergedRepeatTestDataValue(int count,
RepeatTestDataDef repeatTestDataDef, NormalColumn column) {
String modifiedValue = repeatTestDataDef.getModifiedValues().get(count);
if (modifiedValue != null) {
return modifiedValue;
} else {
String value = this.getRepeatTestDataValue(count,
repeatTestDataDef, column);
if (value == null) {
return "null";
}
return value;
}
}
public String getRepeatTestDataValue(int count,
RepeatTestDataDef repeatTestDataDef, NormalColumn column) {
if (repeatTestDataDef == null) {
return null;
}
String type = repeatTestDataDef.getType();
int repeatNum = repeatTestDataDef.getRepeatNum();
if (RepeatTestDataDef.TYPE_FORMAT.equals(type)) {
int from = repeatTestDataDef.getFrom();
int increment = repeatTestDataDef.getIncrement();
int to = repeatTestDataDef.getTo();
String template = repeatTestDataDef.getTemplate();
int no = from;
if (repeatNum != 0 && to - from + 1 != 0) {
no = from
+ (((count / repeatNum) * increment) % (to - from + 1));
}
String value = template.replaceAll("%", String.valueOf(no));
if (column.getType() != null && column.getType().isTimestamp()) {
SimpleDateFormat format1 = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss.SSS");
try {
value = format1.format(format1.parse(value));
} catch (ParseException e1) {
SimpleDateFormat format2 = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
try {
value = format2.format(format2.parse(value));
} catch (ParseException e2) {
SimpleDateFormat format3 = new SimpleDateFormat(
"yyyy-MM-dd");
try {
value = format3.format(format3.parse(value));
} catch (ParseException e3) {
}
}
}
}
return value;
} else if (RepeatTestDataDef.TYPE_FOREIGNKEY.equals(type)) {
NormalColumn referencedColumn = column.getFirstReferencedColumn();
if (referencedColumn == null) {
return null;
}
List<String> referencedValueList = this
.getValueList(referencedColumn);
if (referencedValueList.size() == 0) {
return null;
}
int index = (count / repeatNum) % referencedValueList.size();
return referencedValueList.get(index);
} else if (RepeatTestDataDef.TYPE_ENUM.equals(type)) {
String[] selects = repeatTestDataDef.getSelects();
if (selects.length == 0) {
return null;
}
return selects[(count / repeatNum) % selects.length];
}
return null;
}
private List<String> getValueList(NormalColumn column) {
List<String> valueList = this.valueListMap.get(column);
if (valueList == null) {
valueList = new ArrayList<String>();
ERTable table = (ERTable) column.getColumnHolder();
TableTestData tableTestData = this.testData.getTableTestDataMap()
.get(table);
if (tableTestData != null) {
DirectTestData directTestData = tableTestData
.getDirectTestData();
RepeatTestData repeatTestData = tableTestData
.getRepeatTestData();
if (this.testData.getExportOrder() == TestData.EXPORT_ORDER_DIRECT_TO_REPEAT) {
for (Map<NormalColumn, String> data : directTestData
.getDataList()) {
String value = data.get(column);
valueList.add(value);
}
for (int i = 0; i < repeatTestData.getTestDataNum(); i++) {
String value = this.getMergedRepeatTestDataValue(i,
repeatTestData.getDataDef(column), column);
valueList.add(value);
}
} else {
for (int i = 0; i < repeatTestData.getTestDataNum(); i++) {
String value = this.getRepeatTestDataValue(i,
repeatTestData.getDataDef(column), column);
valueList.add(value);
}
for (Map<NormalColumn, String> data : directTestData
.getDataList()) {
String value = data.get(column);
valueList.add(value);
}
}
}
}
return valueList;
}
final public void write(ExportTestDataSetting exportTestDataSetting,
ERDiagram diagram) throws IOException {
this.exportTestDataSetting = exportTestDataSetting;
this.diagram = diagram;
try {
this.openFile();
this.write();
} finally {
this.closeFile();
}
}
protected abstract void openFile() throws IOException;
protected void write() throws IOException {
for (Map.Entry<ERTable, TableTestData> entry : this.testData
.getTableTestDataMap().entrySet()) {
ERTable table = entry.getKey();
if (skipTable(table)) {
continue;
}
TableTestData tableTestData = entry.getValue();
DirectTestData directTestData = tableTestData.getDirectTestData();
RepeatTestData repeatTestData = tableTestData.getRepeatTestData();
this.writeTableHeader(diagram, table);
if (this.testData.getExportOrder() == TestData.EXPORT_ORDER_DIRECT_TO_REPEAT) {
for (Map<NormalColumn, String> data : directTestData
.getDataList()) {
this
.writeDirectTestData(table, data, diagram
.getDatabase());
}
this.writeRepeatTestData(table, repeatTestData, diagram
.getDatabase());
} else {
this.writeRepeatTestData(table, repeatTestData, diagram
.getDatabase());
for (Map<NormalColumn, String> data : directTestData
.getDataList()) {
this
.writeDirectTestData(table, data, diagram
.getDatabase());
}
}
this.writeTableFooter(table);
}
}
protected abstract boolean skipTable(ERTable table);
protected abstract void writeTableHeader(ERDiagram diagram, ERTable table);
protected abstract void writeTableFooter(ERTable table);
protected abstract void writeDirectTestData(ERTable table,
Map<NormalColumn, String> data, String database);
protected abstract void writeRepeatTestData(ERTable table,
RepeatTestData repeatTestData, String database);
protected abstract void closeFile() throws IOException;
}