package nebula.lang;
import java.io.StringReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.antlr.runtime.RecognitionException;
class BootstrapTypeLoader extends TypeLoader {
private BootstrapTypeLoader() {
super(null);
init();
}
private static final TypeLoader loader = new BootstrapTypeLoader();
public static TypeLoader getInstance() {
return loader;
}
public static Type ROOT;
public static Type BASIC;
public static Type BOOLEAN;
public static Type STRING;
public static Type TEXT;
public static Type LONG;
public static Type DECIMAL;
public static Type DATE;
public static Type TIME;
public static Type DATETIME;
public static Type TIMESTAMP;
{
TypeImp typeRoot = new TypeImp(this, TypeImp.ROOT_TYPE);
ROOT = typeRoot;
TypeImp basicType = new TypeImp(this, TypeStandalone.Basic.name(), ROOT, TypeStandalone.Abstract);
BASIC = basicType;
// TypeImp number = new TypeImp(this, "Number", basicType, RawTypes.Long);
TypeImp typeBoolean = new TypeImp(this, RawTypes.Boolean.name(), BASIC, RawTypes.Boolean);
typeBoolean.attrs.put("FormatType", "numeric");
typeBoolean.attrs.put("Precision", 10L);
typeBoolean.attrs.put("Scale", 2L);
typeBoolean.attrs.put("FormatType", "checkbox");
BOOLEAN = typeBoolean;
TypeImp typeLong = new TypeImp(this, RawTypes.Long.name(), BASIC, RawTypes.Long);
typeLong.attrs.put("FormatType", "numeric");
typeLong.attrs.put("Precision", 10L);
typeLong.attrs.put("Scale", 2L);
LONG = typeLong;
TypeImp decimal = new TypeImp(this, RawTypes.Decimal.name(), BASIC, RawTypes.Decimal);
decimal.attrs.put("FormatType", "numeric");
decimal.attrs.put("Precision", 10L);
decimal.attrs.put("Scale", 2L);
decimal.attrs.put("Precision", 10L);
decimal.attrs.put("Scale", 2L);
DECIMAL = decimal;
TypeImp string = new TypeImp(this, RawTypes.String.name(), BASIC, RawTypes.String);
string.attrs.put("FormatType", "text");
string.attrs.put("MaxLength", 60L);
STRING = string;
TypeImp text = new TypeImp(this, RawTypes.Text.name(), BASIC, RawTypes.Text);
text.attrs.put("FormatType", "textarea");
text.attrs.put("MaxLength", 1024L);
TEXT = text;
TypeImp date = new TypeImp(this, RawTypes.Date.name(), BASIC, RawTypes.Date);
date.attrs.put("FormatType", "date");
date.attrs.put("FormatString", "YYYY-MM-DD");
DATE = date;
TypeImp time = new TypeImp(this, RawTypes.Time.name(), BASIC, RawTypes.Time);
time.attrs.put("FormatType", "time");
time.attrs.put("FormatString", "HH:mm:ss");
TIME = time;
TypeImp datetime = new TypeImp(this, RawTypes.Datetime.name(), BASIC, RawTypes.Datetime);
datetime.attrs.put("FormatType", "datetime");
datetime.attrs.put("FormatString", "YYYY-MM-DD HH:mm:ss");
DATETIME = datetime;
TypeImp timestamp = new TypeImp(this, RawTypes.Timestamp.name(), basicType, RawTypes.Timestamp);
timestamp.attrs.put("FormatType", "timestamp");
timestamp.attrs.put("FormatString", "YYYY-MM-DD HH:mm:ss.S");
TIMESTAMP = timestamp;
}
private void init() {
List<TypeImp> typeList = new ArrayList<TypeImp>();
typeList.add((TypeImp)ROOT);
typeList.add((TypeImp)BASIC);
typeList.add((TypeImp)BOOLEAN);
typeList.add((TypeImp)LONG);
typeList.add((TypeImp)DECIMAL);
typeList.add((TypeImp)STRING);
typeList.add((TypeImp)TEXT);
typeList.add((TypeImp)DATE);
typeList.add((TypeImp)TIME);
typeList.add((TypeImp)DATETIME);
typeList.add((TypeImp)TIMESTAMP);
TypeImp master = new TypeImp(this, TypeStandalone.Master.name(), ROOT, TypeStandalone.Abstract);
master.attrs.put("Layout", "Basic");
TypeImp transaction = new TypeImp(this, TypeStandalone.Transaction.name(), ROOT, TypeStandalone.Abstract);
transaction.attrs.put("Layout", "Basic");
TypeImp flow = new TypeImp(this, TypeStandalone.Flow.name(), ROOT, TypeStandalone.Abstract);
flow.attrs.put("Layout", "Flow");
TypeImp mixin = new TypeImp(this, TypeStandalone.Mixin.name(), ROOT, TypeStandalone.Abstract);
TypeImp number = new TypeImp(this, "Number", LONG);
number.nameAlias= new Aliases("数字");
TypeImp name = new TypeImp(this, "Name", STRING);
name.nameAlias= new Aliases("名称");
name.attrs.put("MaxLength", 60L);
name.attrs.put("ShouldBeLeader", "ShouldBeLeader");
TypeImp attr = new TypeImp(this, "Attr", STRING);
attr.attrs.put("SP", "Attr");
attr.attrs.put("MaxLength", 60L);
typeList.add(master);
typeList.add(transaction);
typeList.add(flow);
typeList.add(mixin);
typeList.add(attr);
typeList.add(name);
typeList.add(number);
long lastModified = System.currentTimeMillis();
for (TypeImp type : typeList) {
type.lastModified = lastModified;
}
this.types.addAll(typeList);
//@formatter:off
String strAttributes = "" +
"type Attribute{\n" +
" !Name;\n" +
" Values[1..1000]{\n" +
" Name;\n" +
" ?ReferName Name;\n" +
" };\n" +
"};\n";
//@formatter:on
try {
this.defineNebula(new StringReader(strAttributes));
} catch (RecognitionException e) {
log.error("RecognitionException", e);
throw new RuntimeException(e);
}
Type typeAttribute = this.findType("Attribute");
typeAttribute.getAttrs().put("Layout", "Compact");
//@formatter:off
String typeDefine = "" +
"type Type{\n" +
" !Name;\n" +
" ?ResidedType Type;\n" +
" %SuperType Type;\n" +
" Standalone Attr;\n" +
" Fields[]{\n" +
" !Name;\n" +
" Importance Attr;\n" +
" Refer Attr;\n" +
" Type Type;\n" +
" Array Boolean;\n" +
" ?RangeFrom Long;\n" +
" ?RangeTo Long;\n" +
" };\n" +
"};\n";
//@formatter:on
try {
this.defineNebula(new StringReader(typeDefine));
} catch (RecognitionException e) {
log.error("RecognitionException", e);
throw new RuntimeException(e);
}
}
@Override
public Type findType(String name) {
return this.types.get(name);
}
@Override
protected URL loadClassData(String name) {
log.error("UnsupportedOperationException : URL loadClassData(" + name + ")");
throw new UnsupportedOperationException("URL loadClassData(" + name + ")");
}
}