UNPKG

@xmobitea/gn-typescript-client

Version:

GearN Typescript Client SDK by XmobiTea (Pro)

276 lines (275 loc) 12.8 kB
import { GNFieldDataType, getGNObjectMetadata } from "./../entity/DataMember"; import { GNArray, GNData, GNHashtable } from "./../common/GNData"; class DataMemberFieldInfoTypeMapper { getGNEnhancedObjectFieldMetadata(cls) { let declaredFields; if (this.declaredFieldsMap.has(cls)) { declaredFields = this.declaredFieldsMap.get(cls); } else { let gnObjectMetadata = getGNObjectMetadata(cls); declaredFields = gnObjectMetadata != null ? gnObjectMetadata.fields : []; this.declaredFieldsMap.set(cls, declaredFields); } return declaredFields; } constructor() { this.declaredFieldsMap = new Map(); } } class DeserializeConverter { deserializeObject(gnHashtable, cls) { if (gnHashtable == null) return null; let declaredFields = this.dataMemberFieldInfoMapper.getGNEnhancedObjectFieldMetadata(cls); let answer = new cls(); declaredFields.forEach(declaredField => { let value = gnHashtable.getObject(declaredField.code); let typeOfValue = typeof value; if (declaredField.gnFieldType == GNFieldDataType.String) { if (value == null) answer[declaredField.name] = declaredField.defaultValue; else if (typeOfValue == "string") answer[declaredField.name] = value; } else if (declaredField.gnFieldType == GNFieldDataType.Boolean) { if (value == null) answer[declaredField.name] = declaredField.defaultValue; else if (typeOfValue == "boolean") answer[declaredField.name] = value; } else if (declaredField.gnFieldType == GNFieldDataType.GNHashtable) { if (value == null) { if (declaredField.defaultValue != null) { if (declaredField.cls == GNHashtable) answer[declaredField.name] = declaredField.defaultValue; else if (typeof declaredField.cls == "object") answer[declaredField.name] = declaredField.defaultValue.toData(); else answer[declaredField.name] = this.deserializeObject(declaredField.defaultValue, declaredField.cls); } } else { if (declaredField.cls == GNHashtable) answer[declaredField.name] = value; else if (typeof declaredField.cls == "object") answer[declaredField.name] = value.toData(); else answer[declaredField.name] = this.deserializeObject(value, declaredField.cls); } } else if (declaredField.gnFieldType == GNFieldDataType.GNArray) { if (value == null) { if (declaredField.defaultValue != null) { if (declaredField.cls == GNArray) answer[declaredField.name] = declaredField.defaultValue; else if (typeof declaredField.cls == "object") answer[declaredField.name] = declaredField.defaultValue.toData(); else answer[declaredField.name] = this.deserializeArray(declaredField.defaultValue, declaredField.cls); } } else { if (declaredField.cls == GNArray) answer[declaredField.name] = value; else if (typeof declaredField.cls == "object") answer[declaredField.name] = value.toData(); else answer[declaredField.name] = this.deserializeArray(value, declaredField.cls); } } else if (declaredField.gnFieldType == GNFieldDataType.Number) { if (value == null) answer[declaredField.name] = declaredField.defaultValue; else if (typeOfValue == "number") answer[declaredField.name] = value; } else { if (value == null) { if (declaredField.defaultValue != null) { if (declaredField.cls == Number) answer[declaredField.name] = declaredField.defaultValue; else if (declaredField.cls == String) answer[declaredField.name] = declaredField.defaultValue; else if (declaredField.cls == Boolean) answer[declaredField.name] = declaredField.defaultValue; else if (declaredField.cls == GNHashtable) answer[declaredField.name] = this.deserializeObject(declaredField.defaultValue, declaredField.cls); else if (declaredField.cls == GNArray) answer[declaredField.name] = this.deserializeArray(declaredField.defaultValue, declaredField.cls); else answer[declaredField.name] = declaredField.defaultValue; } } else { if (declaredField.cls == Number) answer[declaredField.name] = value; else if (declaredField.cls == String) answer[declaredField.name] = value; else if (declaredField.cls == Boolean) answer[declaredField.name] = value; else if (declaredField.cls == GNHashtable) answer[declaredField.name] = this.deserializeObject(value, declaredField.cls); else if (declaredField.cls == GNArray) answer[declaredField.name] = this.deserializeArray(value, declaredField.cls); else answer[declaredField.name] = value; } } }); return answer; } deserializeArray(gnArray, cls) { if (gnArray == null) return null; let answer = []; for (let i = 0; i < gnArray.count(); i++) { let value = gnArray.getObject(i); if (value == null) answer.push(null); else { let typeOfValue = typeof value; if (typeOfValue == "number") answer.push(value); else if (typeOfValue == "string") answer.push(value); else if (typeOfValue == "boolean") answer.push(value); else if (cls == GNArray) answer.push(value); else if (cls == GNData) answer.push(value); else if (typeOfValue == "object") { if (Array.isArray(value)) { answer.push(this.deserializeArray(gnArray.getGNArray(i), cls)); } else { answer.push(this.deserializeObject(gnArray.getGNHashtable(i), cls)); } } } } return answer; } constructor(dataMemberFieldInfoMapper) { this.dataMemberFieldInfoMapper = dataMemberFieldInfoMapper; } } class SerializeConverter { serializeObject(obj, cls) { if (obj == null) return null; let fieldInfos = this.dataMemberFieldInfoMapper.getGNEnhancedObjectFieldMetadata(cls); let answer = new GNHashtable(); fieldInfos.forEach((field) => { let dataMemberAnno = field; let value = obj[dataMemberAnno.name]; if (value == null) { if (!dataMemberAnno.isOptional) answer.add(dataMemberAnno.code, null); } else { let typeOfValue = typeof value; if (dataMemberAnno.gnFieldType == GNFieldDataType.String) { if (typeOfValue == "string") answer.add(dataMemberAnno.code, value); } else if (dataMemberAnno.gnFieldType == GNFieldDataType.Boolean) { if (typeOfValue == "boolean") answer.add(dataMemberAnno.code, value); } else if (dataMemberAnno.gnFieldType == GNFieldDataType.GNHashtable) { if (value instanceof GNHashtable) answer.add(dataMemberAnno.code, value); else if (typeOfValue === "object") { if (!Array.isArray(value)) answer.add(dataMemberAnno.code, this.serializeObject(value, dataMemberAnno.cls)); } } else if (dataMemberAnno.gnFieldType == GNFieldDataType.GNArray) { if (value instanceof GNArray) answer.add(dataMemberAnno.code, value); else if (typeOfValue === "object") { if (Array.isArray(value)) answer.add(dataMemberAnno.code, this.serializeArray(value, dataMemberAnno.cls)); } } else if (dataMemberAnno.gnFieldType == GNFieldDataType.Number) { if (typeOfValue == "number") answer.add(dataMemberAnno.code, value); } else { if (typeOfValue == "string") answer.add(dataMemberAnno.code, value); else if (typeOfValue == "boolean") answer.add(dataMemberAnno.code, value); else if (typeOfValue == "number") answer.add(dataMemberAnno.code, value); else if (value instanceof GNData) answer.add(dataMemberAnno.code, value); else if (typeOfValue == "object") { if (Array.isArray(value)) answer.add(dataMemberAnno.code, this.serializeArray(value, dataMemberAnno.cls)); else answer.add(dataMemberAnno.code, GNHashtable.builder().addAll(value).build()); } else answer.add(dataMemberAnno.code, this.serializeObject(value, dataMemberAnno.cls)); } } }); return answer; } serializeArray(objLst, cls) { if (objLst == null) return null; let answer = new GNArray(); for (let i = 0; i < objLst.length; i++) { let obj = objLst[i]; if (obj == null) answer.add(null); else { let typeOfValue = typeof obj; if (typeOfValue === "string") answer.add(obj); else if (typeOfValue === "boolean") answer.add(obj); else if (typeOfValue === "number") answer.add(obj); else if (obj instanceof GNData) answer.add(obj); else { if (typeOfValue === "object") { if (Array.isArray(obj)) answer.add(this.serializeArray(obj, cls)); else answer.add(this.serializeObject(obj, cls)); } } } } return answer; } constructor(dataMemberFieldInfoMapper) { this.dataMemberFieldInfoMapper = dataMemberFieldInfoMapper; } } export class ConverterService { static deserializeObject(gnHashtable, cls) { return ConverterService.deserializeConverter.deserializeObject(gnHashtable, cls); } static deserializeArray(gnArray, cls) { return ConverterService.deserializeConverter.deserializeArray(gnArray, cls); } static serializeObject(obj, cls) { return ConverterService.serializeConverter.serializeObject(obj, cls); } static serializeArray(objLst, cls) { return ConverterService.serializeConverter.serializeArray(objLst, cls); } static init() { let dataMemberFieldInfoMapper = new DataMemberFieldInfoTypeMapper(); ConverterService.serializeConverter = new SerializeConverter(dataMemberFieldInfoMapper); ConverterService.deserializeConverter = new DeserializeConverter(dataMemberFieldInfoMapper); } }