package typeimport;
import java.util.Arrays;
import java.util.List;
import typeimport.DefaultImporter.Field;
import nebula.lang.TypeStandalone;
import com.google.common.collect.Lists;
interface Rule {
//
public Rule with(String... strings);
// 所在数据表
public Rule inTable(String tablenames);
// 数据类型
public Rule typeOf(DBColumnType... dbTypes);
// 字段长度
public Rule length(int length);
public Rule skip();
public Rule defaultValue(String... values);
public Actions then();
}
interface Actions {
public Actions useMatchedNameAsTypeName();
public Actions useMatchedNameAsFieldName();
public Actions setAsMaster();
public Actions setAsTransaction();
public Actions setReferTo(String typename);
public Actions setNullable();
public Rule setTypeName(String type);
}
interface Action {
Field apply(Field input, String match, String... params);
}
class RuleBuilder implements Rule, Actions {
DBColumnType[] dbTypes;
MatchPattern[] ruleTypes;
String[] defaultValues;
String[] with;
int length;
String tableName = null;
final List<Action> actions;
public RuleBuilder() {
this.actions = Lists.newCopyOnWriteArrayList();
}
public RuleBuilder(MatchPattern... ruleTypes) {
this.actions = Lists.newCopyOnWriteArrayList();
this.ruleTypes = ruleTypes;
}
public Rule inTable(String tablename) {
this.tableName = tablename;
return this;
}
public Rule with(String... strings) {
List<String> ss = Lists.newArrayList();
for (String string : strings) {
String[] instr = string.split(" ");
for (String string2 : instr) {
if (string2.length() == 0) continue;
ss.add(string2);
}
}
this.with = ss.toArray(new String[0]);
return this;
}
@Override
public Rule typeOf(DBColumnType... dbTypes) {
this.dbTypes = dbTypes;
return this;
}
@Override
public Rule setTypeName(String type) {
this.actions.add(new SetDbType(type));
return this;
}
@Override
public Actions useMatchedNameAsTypeName() {
this.actions.add(new UseMatchedNameAsTypeName());
return this;
}
@Override
public Actions useMatchedNameAsFieldName() {
this.actions.add(new UseMatchedNameAsFieldName());
return this;
}
@Override
public Actions setAsMaster() {
this.actions.add(new SetStandalone(TypeStandalone.Master));
return this;
}
@Override
public Actions setAsTransaction() {
this.actions.add(new SetStandalone(TypeStandalone.Transaction));
return this;
}
@Override
public Rule skip() {
this.actions.add(new SkipField());
return this;
}
@Override
public Actions setNullable() {
this.actions.add(new NullableField());
return this;
}
@Override
public Actions setReferTo(String typename) {
this.actions.add(new SetReferTo(typename));
return null;
}
class SetStandalone implements Action {
final TypeStandalone standalone;
SetStandalone(TypeStandalone standalone) {
this.standalone = standalone;
}
@Override
public DefaultImporter.Field apply(Field input, String match, String... params) {
input.resideType.standalone = this.standalone;
return input;
}
}
class UseMatchedNameAsTypeName implements Action {
@Override
public DefaultImporter.Field apply(Field input, String match, String... params) {
input.resultTypeName = match;
input.comment = input.comment + "\tset Type Name with Matched Name\t" + match;
return input;
}
}
class SetReferTo implements Action {
final String typename;
SetReferTo(String typename) {
this.typename = typename;
}
@Override
public DefaultImporter.Field apply(Field input, String match, String... params) {
if (input.name.toUpperCase().endsWith("_ID")) {
input.name = input.name.substring(0, input.name.length() - 3);
}
input.resultTypeName = typename; // Type Name
input.isForeignKey = true;
input.foreignKeyTable = typename;// Raw Table Name
input.comment = input.comment + "\tset Type as foreign key \t" + typename;
return input;
}
}
class UseMatchedNameAsFieldName implements Action {
@Override
public DefaultImporter.Field apply(Field input, String match, String... params) {
input.resultName = match;
input.comment = input.comment + "\tset Field Name with Matched Name\t" + match;
return input;
}
}
class SetDbType implements Action {
final String typename;
SetDbType(String typename) {
this.typename = typename;
}
@Override
public DefaultImporter.Field apply(Field input, String match, String... params) {
input.resultTypeName = typename;
input.comment = input.comment + "\tset type\t" + typename;
return input;
}
}
class SkipField implements Action {
@Override
public DefaultImporter.Field apply(Field input, String match, String... params) {
input.skip = true;
input.comment = input.comment + "\tskip";
return input;
}
}
class NullableField implements Action {
@Override
public DefaultImporter.Field apply(Field input, String match, String... params) {
input.nullable = true;
input.comment = input.comment + "\tskip";
return input;
}
}
@Override
public String toString() {
return "RuleBuilder [dbTypes=" + Arrays.toString(dbTypes) + ", ruleTypes=" + Arrays.toString(ruleTypes) + ", with=" + Arrays.toString(with)
+ ", tableName=" + tableName + ", actions=" + actions + "]";
}
@Override
public Rule length(int length) {
this.length = length;
return this;
}
@Override
public Rule defaultValue(String... values) {
this.defaultValues = values;
return this;
}
@Override
public Actions then() {
return this;
}
}