package nebula.data.json; import java.util.List; import nebula.data.Entity; import nebula.lang.Aliases; import nebula.lang.Field; import nebula.lang.Type; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.JsonParser; import util.InheritHashMap; public class TypeSerializer extends DefaultFieldSerializer<Type> implements JsonDataHelper<Type> { final DefaultTypeAdapter<List<Field>> fieldListDataDealer; public TypeSerializer() { this(null, null); } public TypeSerializer(String fieldName, String frontName) { super(fieldName, frontName); fieldListDataDealer = new ListJsonDataDealer<Field>(new FieldJsonDataDealer()); } @Override public void input(JsonParser in, Entity parent, Type now) throws Exception { throw new UnsupportedOperationException(" Type readFrom(JsonParser in, String name) throws Exception"); } @Override public void inputWithoutCheck(JsonParser in, Entity parent) throws Exception { throw new UnsupportedOperationException(" Type readFrom(JsonParser in, String name) throws Exception"); } @Override public void output(JsonGenerator out, Type value) throws Exception { Type type = (Type) value; out.writeStartObject(); out.writeStringField("Name", type.getName()); if (type.getSuperType() != null) { out.writeStringField("SuperType", type.getSuperType().getName()); } out.writeStringField("Standalone", type.getStandalone().name()); out.writeFieldName("Fields"); fieldListDataDealer.writeTo(null, type.getFields(), out); Aliases n = type.getNameAlias(); out.writeFieldName("NameAlias"); out.writeStartObject(); for (String k : n.alias.keySet()) { out.writeStringField(k, n.alias.get(k).toString()); } out.writeEndObject(); out.writeFieldName("Attrs"); out.writeStartObject(); InheritHashMap p = type.getAttrs(); for (String k : p.getNames()) { out.writeStringField(k, p.get(k).toString()); } out.writeEndObject(); out.writeBooleanField("Mutable", type.isMutable()); out.writeStringField("Code", type.getCode()); out.writeEndObject(); } @Override public Type readFrom(Type d, JsonParser in) { throw new UnsupportedOperationException(" Type readFrom(JsonParser in, String name) throws Exception"); } @Override public void stringifyTo(Type d, JsonGenerator o) { try { output(o, d); } catch (Exception e) { throw new RuntimeException(e); } } } class FieldJsonDataDealer extends DefaultTypeAdapter<Field> { public FieldJsonDataDealer() { } @Override public void writeTo(String xxx, Object value, JsonGenerator out) throws Exception { Field field = (Field) value; out.writeStartObject(); out.writeStringField("Name", field.getName()); out.writeBooleanField("Key", field.isKey()); out.writeBooleanField("Unique", field.isKey()); out.writeBooleanField("Core", field.isCore()); out.writeBooleanField("Array", field.isArray()); out.writeStringField("TypeName", field.getType().getName()); out.writeStringField("Refer", field.getRefer().name()); Aliases n = field.getNameAlias(); out.writeFieldName("NameAlias"); out.writeStartObject(); for (String k : n.alias.keySet()) { out.writeStringField(k, n.alias.get(k).toString()); } out.writeEndObject(); out.writeObjectFieldStart("Attrs"); InheritHashMap p = field.getAttrs(); for (String k : p.getNames()) { out.writeStringField(k, p.get(k).toString()); } out.writeEndObject(); out.writeEndObject(); } @Override public Field readFrom(JsonParser in, String name) throws Exception { return null; } }