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<DataWriter> 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<PackageItem> 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<PackageItem> 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<PackageItem> 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<PackageItem> 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);
|
}
|
}
|