
com.isuwang.dapeng.remoting.fake.json.TBaseBeanSerializer Maven / Gradle / Ivy
The newest version!
package com.isuwang.dapeng.remoting.fake.json;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.isuwang.dapeng.core.metadata.*;
import com.isuwang.org.apache.thrift.TException;
import com.isuwang.org.apache.thrift.protocol.*;
import java.math.BigDecimal;
import java.nio.ByteBuffer;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 基础序列化
*
* @author craneding
* @date 15/4/26
*/
public abstract class TBaseBeanSerializer implements TBeanSerializer {
protected void writeField(Service service, DataType dataType, TProtocol oprot, Object value) throws TException {
final boolean isJsonElement = value instanceof JsonElement;
final JsonElement jsonElement = isJsonElement ? (JsonElement) value : null;
switch (dataType.getKind()) {
case VOID:
break;
case BOOLEAN:
oprot.writeBool(isJsonElement ? jsonElement.getAsBoolean() : Boolean.valueOf(value.toString()));
break;
case BYTE:
oprot.writeByte(isJsonElement ? jsonElement.getAsByte() : Byte.valueOf(value.toString()));
break;
case SHORT:
oprot.writeI16(isJsonElement ? jsonElement.getAsShort() : Short.valueOf(value.toString()));
break;
case INTEGER:
oprot.writeI32(isJsonElement ? jsonElement.getAsInt() : Integer.valueOf(value.toString()));
break;
case LONG:
oprot.writeI64(isJsonElement ? jsonElement.getAsLong() : Long.valueOf(value.toString()));
break;
case DOUBLE:
oprot.writeDouble(isJsonElement ? jsonElement.getAsDouble() : Double.valueOf(value.toString()));
break;
case STRING:
oprot.writeString(value instanceof JsonObject ? value.toString() : (isJsonElement ? jsonElement.getAsString() : value.toString()));
break;
case BINARY:
String tmp = value instanceof JsonObject ? value.toString() : (isJsonElement ? jsonElement.getAsString() : value.toString());
oprot.writeBinary(ByteBuffer.wrap(tmp.getBytes()));
break;
case DATE:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
Long time = 0L;
try {
if (isJsonElement)
time = sdf.parse(jsonElement.getAsString()).getTime();
else
time = sdf.parse(value.toString()).getTime();
} catch (ParseException e) {
}
oprot.writeI64(time);
break;
case BIGDECIMAL:
String bigDecimal = isJsonElement ? jsonElement.getAsBigDecimal().toString() : new BigDecimal((String) value).toString();
oprot.writeString(bigDecimal);
break;
case MAP: {
JsonObject jsonObject = jsonElement.getAsJsonObject();
int size = jsonObject.entrySet().size();
if (size >= 0) {
oprot.writeMapBegin(new TMap(dataType2Byte(dataType.keyType), dataType2Byte(dataType.valueType), size));
for (Map.Entry entry : jsonObject.entrySet()) {
String key = entry.getKey();
Object obj = entry.getValue();
writeField(service, dataType.keyType, oprot, key);
writeField(service, dataType.valueType, oprot, obj);
}
oprot.writeMapEnd();
}
}
break;
case LIST: {
if (jsonElement.isJsonArray()) {
JsonArray jsonArray = jsonElement.getAsJsonArray();
int size = jsonArray.size();
if (size >= 0) {
oprot.writeListBegin(new TList(dataType2Byte(dataType.getValueType()), size));
for (int i = 0; i < size; i++) {
writeField(service, dataType.getValueType(), oprot, jsonArray.get(i));
}
oprot.writeListEnd();
}
} else if (jsonElement instanceof JsonObject) {
Set> entries = ((JsonObject) jsonElement).entrySet();
if (!entries.isEmpty()) {
oprot.writeListBegin(new TList(dataType2Byte(dataType.getValueType()), entries.size()));
for (Map.Entry entry : entries) {
writeField(service, dataType.getValueType(), oprot, entry.getValue());
}
oprot.writeListEnd();
}
} else {
throw new TException(value + " is must be List");
}
}
break;
case SET: {
if (jsonElement.isJsonArray()) {
JsonArray jsonArray = jsonElement.getAsJsonArray();
int size = jsonArray.size();
if (size >= 0) {
oprot.writeSetBegin(new TSet(dataType2Byte(dataType.getValueType()), size));
for (int i = 0; i < size; i++) {
writeField(service, dataType.getValueType(), oprot, jsonArray.get(i));
}
oprot.writeListEnd();
}
} else if (jsonElement instanceof JsonObject) {
Set> entries = ((JsonObject) jsonElement).entrySet();
if (!entries.isEmpty()) {
oprot.writeSetBegin(new TSet(dataType2Byte(dataType.getValueType()), entries.size()));
for (Map.Entry entry : entries) {
writeField(service, dataType.getValueType(), oprot, entry.getValue());
}
oprot.writeListEnd();
}
} else {
throw new TException(value + " is must be Set");
}
}
break;
case ENUM:
TEnum tEnum = findEnum(dataType.getQualifiedName(), service);
oprot.writeI32(findEnumItemValue(tEnum, jsonElement.getAsString()));
break;
case STRUCT:
Struct struct = findStruct(dataType.getQualifiedName(), service);
if (struct == null)
throw new TException("not fund " + dataType.getQualifiedName() + " in request(" + service.getName() + ")");
oprot.writeStructBegin(new TStruct(struct.getName()));
Set> entries = jsonElement.getAsJsonObject().entrySet();
if (entries != null) {
for (Map.Entry entry : entries) {
Field field1 = findField(entry.getKey(), struct);
if (field1 == null)
throw new TException("not fund " + entry.getKey() + " in request(" + struct.getName() + ")");
oprot.writeFieldBegin(new TField(field1.getName(), dataType2Byte(field1.getDataType()), (short) field1.getTag()));
if (field1.isOptional()) {
if (!entry.getValue().toString().equals("{}")) {
if (entry.getValue() instanceof JsonPrimitive)
writeField(service, field1.getDataType(), oprot, entry.getValue());
else if (entry.getValue() instanceof JsonObject) {
if (field1.getDataType().getKind() == DataType.KIND.STRUCT)
writeField(service, field1.getDataType(), oprot, entry.getValue().getAsJsonObject());
else
writeField(service, field1.getDataType(), oprot, entry.getValue().getAsJsonObject().get("value"));
} else if (entry.getValue() instanceof JsonElement) {
writeField(service, field1.getDataType(), oprot, entry.getValue());
}
}
} else
writeField(service, field1.getDataType(), oprot, entry.getValue());
oprot.writeFieldEnd();
}
}
oprot.writeFieldStop();
oprot.writeStructEnd();
break;
}
}
protected Integer findEnumItemValue(TEnum tEnum, String label) {
List enumItems = tEnum.getEnumItems();
for (TEnum.EnumItem enumItem : enumItems) {
if (enumItem.getLabel().equals(label))
return enumItem.getValue();
}
for (TEnum.EnumItem enumItem : enumItems) {
if (String.valueOf(enumItem.getValue()).equals(label))
return enumItem.getValue();
}
return null;
}
protected String findEnumItemLabel(TEnum tEnum, Integer value) {
Integer enumValue = null;
List enumItems = tEnum.getEnumItems();
for (TEnum.EnumItem enumItem : enumItems) {
if (enumItem.getValue() == value)
return enumItem.getLabel();
}
return null;
}
protected TEnum findEnum(String qualifiedName, Service service) {
List enumDefinitions = service.getEnumDefinitions();
for (TEnum enumDefinition : enumDefinitions) {
if ((enumDefinition.getNamespace() + "." + enumDefinition.getName()).equals(qualifiedName))
return enumDefinition;
}
return null;
}
protected Struct findStruct(String qualifiedName, Service service) {
List structDefinitions = service.getStructDefinitions();
for (Struct structDefinition : structDefinitions) {
if ((structDefinition.getNamespace() + "." + structDefinition.getName()).equals(qualifiedName))
return structDefinition;
}
return null;
}
protected Method findMethod(String methodName, Service service) {
List methods = service.getMethods();
for (Method method : methods) {
if (method.getName().equals(methodName))
return method;
}
return null;
}
protected Field findField(String fieldName, Struct struct) {
List fields = struct.getFields();
for (Field field : fields) {
if (field.getName().equals(fieldName))
return field;
}
return null;
}
protected Field findField(int tag, Struct struct) {
List fields = struct.getFields();
for (Field field : fields) {
if (field.getTag() == tag)
return field;
}
return null;
}
public byte dataType2Byte(DataType type) {
switch (type.kind) {
case BOOLEAN:
return TType.BOOL;
case BYTE:
return TType.BYTE;
case DOUBLE:
return TType.DOUBLE;
case SHORT:
return TType.I16;
case INTEGER:
return TType.I32;
case LONG:
return TType.I64;
case STRING:
return TType.STRING;
case STRUCT:
return TType.STRUCT;
case MAP:
return TType.MAP;
case SET:
return TType.SET;
case LIST:
return TType.LIST;
case ENUM:
return TType.I32;
case VOID:
return TType.VOID;
case DATE:
return TType.I64;
case BIGDECIMAL:
return TType.STRING;
case BINARY:
return TType.STRING;
default:
break;
}
return TType.STOP;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy