package foundation.dao; import java.util.List; import foundation.dao.version.PackageChange; import foundation.data.entity.Entity; import foundation.data.entity.EntitySet; import foundation.data.entity.EntityTree; import foundation.data.meta.property.MetaCode; import foundation.data.meta.property.MetaType; import foundation.data.meta.property.PropertysRuntime; import foundation.handler.IMessageReporter; import foundation.handler.LetterWriter; import foundation.handler.ResultPool; import foundation.json.IJSONProvider; import foundation.json.JSONWriter; import foundation.token.IOnlineUser; public class DataWriter extends LetterWriter implements IMessageReporter { protected static ThreadLocal localInstance; private Domain domain; private DataPackage dataPackage; private ResultPool resultPool; public DataWriter(ResultPool resultPool, Domain domain) { this.resultPool = resultPool; this.domain = domain; resultPool.setLetterWriter(this); } public synchronized void reportOneAlertValidation(String message) { resultPool.reportOneAlertValidation(message); } public synchronized void reportOneRejectValidation(String message) { resultPool.reportOneRejectValidation(message); } public synchronized void reportOneMessage(String step, String message) { resultPool.reportOneMessage(step, message); } public synchronized void reportOneError(String step, String error) { resultPool.reportOneError(step, error); } @Override public synchronized void reportExistsError(String step, String dataTitle, IJSONProvider errorSet) { resultPool.reportExistsError(step, dataTitle, errorSet); } @Override public void write(JSONWriter writer) { //1. write meta writeMeta(writer); //2. write data writeData(writer); //3. write host writeHostMeta(writer); //4. write host writeHost(writer); //5. write change writeChange(writer); } private void writeMeta(JSONWriter writer) { if (dataPackage == null) { return; } if ((domain == null) || (MetaType.None == domain.getMetaType())) { return; } //1. 创建 meta code MetaCode metaCode = new MetaCode(); metaCode.setScene(domain.getScene()); metaCode.setType(domain.getMetaType()); IOnlineUser user = IOnlineUser.getInstance(); metaCode.setUser(user); //2. 打印 writer.beginObject("meta"); writeDataPackageMetas(writer, metaCode); writer.endObject(); } private void writeDataPackageMetas(JSONWriter writer, MetaCode metaCode) { if (dataPackage == null) { return; } //1. 如果是带点操作符的Partial类型,需要根据原始PackageMeta打印 if (domain.isPartial()) { PackageItem packageItem = dataPackage.getMaster(); writeOneItemMeta(writer, packageItem, metaCode); return; } //2. 打印 Master PackageItem master = dataPackage.getMaster(); writeOneItemMeta(writer, master, metaCode); //3. 打印 Slaves metaCode.setType(MetaType.Unknow); List slaves = dataPackage.getSlaveItems(); for (PackageItem packageItem: slaves) { writeOneItemMeta(writer, packageItem, metaCode); } } private void writeData(JSONWriter writer) { if (dataPackage == null && isContainsDataItem()) { return; } writer.beginObject("data"); if (dataPackage == null) { writer.endObject(); return; } PackagePrintType printType = dataPackage.getResultPrintType(); //1. 如果需要批量输出Master if (PackagePrintType.BatchMaster == printType) { PackageItem master = dataPackage.getMaster(); //1.1 输出数据 EntitySet entitySet = master.getEntitySet(DataSource.Result); writeEntitySet(writer, "entitySet", entitySet); //1.2 输出Page Page page = dataPackage.getPage(); if (page != null) { writePage(writer, "page", page); } writer.endObject(); return; } //2. 如果需要输出完整的Package if (PackagePrintType.Package == printType) { //2.1 输出Master PackageItem master = dataPackage.getMaster(); if (master != null) { Entity entity = master.getEntity(DataSource.Result); if (entity != null && !entity.isEmpty()) { writeEntity(writer, master.getName(), entity); } } //2.2 输出Slaves List slaves = dataPackage.getSlaveItems(); for (PackageItem packageItem: slaves) { writeOnePackageItem(writer, packageItem); } writer.endObject(); return; } } private void writeHostMeta(JSONWriter writer) { if ((domain == null) || (MetaType.None == domain.getMetaType()) || (dataPackage == null)) { return; } //1. 如果是批量输出,不输出 Host meta PackagePrintType printType = dataPackage.getResultPrintType(); if (PackagePrintType.BatchMaster == printType) { return; } //2. 如果Host为空,输出Null DataPackage host = dataPackage.getHost(); if (host == null) { writer.writeNull("host_meta"); return; } //3. 打印 host meta MetaCode metaCode = new MetaCode(); metaCode.setScene(domain.getScene()); writer.beginObject("host_meta"); PackageItem master = host.getMaster(); writeOneItemMeta(writer, master, metaCode); List slaves = host.getSlaveItems(); metaCode.setType(MetaType.Unknow); for (PackageItem packageItem: slaves) { writeOneItemMeta(writer, packageItem, metaCode); } writer.endObject(); } private void writeHost(JSONWriter writer) { if (dataPackage == null) { return; } //1. 如果是批量输出,不输出Host PackagePrintType printType = dataPackage.getResultPrintType(); if (PackagePrintType.BatchMaster == printType) { return; } //2. 如果Host为空,输出Null DataPackage host = dataPackage.getHost(); if (host == null) { writer.writeNull("host"); return; } //3. 输出完整的Host writer.beginObject("host"); //3.1 输出Host.Master PackageItem master = host.getMaster(); if (master != null) { Entity entity = master.getEntity(DataSource.Result); if (entity == null || entity.isEmpty()) { writer.writeNull(master.getName()); } else { writeEntity(writer, master.getName(), entity); } } //3.2 输出Host.Slaves List slaves = host.getSlaveItems(); for (PackageItem packageItem: slaves) { writeOnePackageItem(writer, packageItem); } writer.endObject(); } private void writeChange(JSONWriter writer) { if (dataPackage == null) { return; } //1. 如果是批量输出,不输出Host PackagePrintType printType = dataPackage.getResultPrintType(); if (PackagePrintType.BatchMaster == printType) { return; } //2. 如果change为空,输出Null PackageChange change = dataPackage.getChange(); if (change == null) { DataPackage host = dataPackage.getHost(); if (host == null) { return; } change = host.getChange(); } if (change == null) { writer.writeNull("change"); return; } //3. 输出完整的change change.writeJSON(writer); } private void writeOnePackageItem(JSONWriter writer, PackageItem packageItem) { PackageItemType type = packageItem.getType(); if (PackageItemType.Master == type) { Entity entity = packageItem.getEntity(DataSource.Result); writeEntity(writer, packageItem.getName(), entity); } else if (PackageItemType.Branch == type && !packageItem.isLasyLoad()) { Entity entity = packageItem.getEntity(DataSource.Result); writeEntity(writer, packageItem.getName(), entity); } else if (PackageItemType.Detail == type && !packageItem.isLasyLoad()) { EntitySet entitySet = packageItem.getEntitySet(DataSource.Result); writeEntitySet(writer, packageItem.getName(), entitySet); } } private void writeEntity(JSONWriter writer, String name, Entity entity) { //1. if (entity == null) { writer.writeNull(name); return; } //2. writer.beginObject(name); entity.writeJSONBody(writer); writer.endObject(); } private void writeEntitySet(JSONWriter writer, String name, EntitySet entitySet) { //1. if (entitySet == null) { writer.writeNull(name); return; } //2. writer.beginArray(name); if (entitySet instanceof EntityTree) { ((EntityTree)entitySet).writeJSONBody(writer); } else { entitySet.writeJSONBody(writer); } writer.endArray(); } private void writePage(JSONWriter writer, String name, Page page) { //1. if (page == null) { writer.writeNull(name); } //2. writer.beginObject(name); page.writeJSONBody(writer); writer.endObject(); } private void writeOneItemMeta(JSONWriter writer, PackageItem packageItem, MetaCode metaCode) { //1. 检查MetaCode MetaType metaType = metaCode.getType(); if (MetaType.Unknow == metaType) { PackageItemType type = packageItem.getType(); metaType = (PackageItemType.Detail == type) ? MetaType.List : MetaType.Form; metaCode.setType(metaType); } metaCode.setDataObject(packageItem.getDataObject()); //2. PropertysRuntime propertyMetas = PropertysRuntime.getInstance(metaCode); writer.beginObject(packageItem.getName()); //2. ObjectName、TableName writer.write("objectname", packageItem.getDataObject().getDataName()); writer.write("tablename", packageItem.getDataObject().getTableName()); //3. 打印package item 自身信息 packageItem.writeJSONBody(writer); //4. 打印字段数据 writer.beginArray("fields"); if (propertyMetas != null) { propertyMetas.writeJSON(writer); } writer.endArray(); writer.endObject(); } @Override public void free() { } public void setDataPackage(DataPackage dataPackage) { this.dataPackage = dataPackage; } public DataPackage getDataPackage() { return dataPackage; } public ResultPool getResultPool() { return resultPool; } public boolean isSuccess() { return resultPool.isSuccess(); } public void setSuccess(boolean success) { resultPool.setSuccess(success); } }