package foundation.dao; import java.util.ArrayList; import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import foundation.action.ActionContext; import foundation.dao.bizlogic.IActionProvider; import foundation.data.entity.Entity; import foundation.data.meta.property.MetaType; import foundation.data.object.DataObject; import foundation.data.rule.exists.ExistsValidator; import foundation.json.JSONReader; import foundation.json.JType; import foundation.util.Util; public class DataPipe implements IActionProvider { protected static Logger logger; private static DataPipe instance; static { logger = LogManager.getLogger(DataPipe.class); } private DataPipe() { } public static synchronized DataPipe getInstance() { if (instance == null) { instance = new DataPipe(); } return instance; } @Override public void exec(ActionContext meta, String method) throws Exception { OperatorCode code = meta.getOperatorCode(); if (OperatorCode.GetBatch == code) { processGetBatch(meta); } else if (OperatorCode.GetTree == code) { processGetTree(meta); } else if (OperatorCode.NewOne == code) { processNewOne(meta); } else if (OperatorCode.GetOne == code) { processGetOne(meta); } else if (OperatorCode.Save == code) { processSaveOne(meta); } else if (OperatorCode.UniqueSave == code) { processSaveUniqueOne(meta); } else if (OperatorCode.Clone == code) { processClone(meta); } else if (OperatorCode.Activate == code) { processActivateOne(meta); } else if (OperatorCode.Fallback == code) { processFallbackOne(meta); } else if (OperatorCode.Alter == code) { processAlter(meta); } else if (OperatorCode.Delete == code) { processDeleteOne(meta); } else if (OperatorCode.lockRecord == code) { lockRecord(meta); } else if (OperatorCode.GetTotalCnt == code) { processTotalCnt(meta); } else if (OperatorCode.GetSummary == code) { processSummary(meta); } } public void processGetBatch(ActionContext meta) throws Exception { DataPackage dataPackage = meta.getDataPackage(); //1. load filter page order from JSON dataPackage.loadFilterPageOrderByFromJSON(); //2. load data package from persist dataPackage.loadBatchDataFromDB(); dataPackage.setResultData(DataSource.DB); //3. set data to letter DataWriter dataWriter = meta.getDataWriter(); dataWriter.setDataPackage(dataPackage); } private void processGetTree(ActionContext meta) throws Exception { DataPackage dataPackage = meta.getDataPackage(); //1. load filter page order from JSON dataPackage.loadFilterPageOrderByFromJSON(); //2. load data package from persist dataPackage.loadTreeDataFromDB(); dataPackage.setResultData(DataSource.DB); //3. set data to letter DataWriter dataWriter = meta.getDataWriter(); dataWriter.setDataPackage(dataPackage); } public void processNewOne(ActionContext meta) throws Exception { DataPackage dataPackage = meta.getDataPackage(); //1. 默认返回 meta Domain domain = meta.getDataReader().getDomain(); domain.setMetaType(MetaType.Form); //2. create default data dataPackage.createDefaultOneData(); dataPackage.setResultData(DataSource.New); //3. set data to letter DataWriter dataWriter = meta.getDataWriter(); dataWriter.setDataPackage(dataPackage); } public void processGetOne(ActionContext meta) throws Exception { DataPackage dataPackage = meta.getDataPackage(); //1. load id from JSON dataPackage.loadFilterFromJSON(); //2. load data package from DB or cached dataPackage.loadOneDataFromPersist(); dataPackage.setResultData(DataSource.DB); //3. set data to letter DataWriter dataWriter = meta.getDataWriter(); dataWriter.setDataPackage(dataPackage); } public void processSaveOne(ActionContext context) throws Exception { DataReader dataReader = context.getDataReader(); DataWriter dataWriter = context.getDataWriter(); DataPackage dataPackage = context.getDataPackage(); //1. load data from JSON dataPackage.loadDataFromRequest(); //2. validate dataPackage.execValidateRules(dataWriter); //3. save data to persist(包含数据本身和 Host) dataPackage.saveOneDataToPersist(dataReader, dataWriter); //4. 如果是insert,要将master id 回写到domain里面 writeBackMasterId(dataReader, dataPackage.getMasterId()); //5. set data to letter dataWriter.setDataPackage(dataPackage); } public void processSaveUniqueOne(ActionContext context) throws Exception { DataReader dataReader = context.getDataReader(); DataWriter dataWriter = context.getDataWriter(); DataPackage dataPackage = context.getDataPackage(); //1. load data from JSON dataPackage.loadDataFromRequest(); //2. validate dataPackage.execValidateRules(dataWriter); ExistsValidator existsValidator = new ExistsValidator(); boolean existsEntity = existsValidator.checkExists(dataPackage, context); if (existsEntity) { return; } //3. save data to persist(包含数据本身和 Host) dataPackage.saveOneDataToPersist(dataReader, dataWriter); //4. 如果是insert,要将master id 回写到domain里面 writeBackMasterId(dataReader, dataPackage.getMasterId()); //5. set data to letter dataWriter.setDataPackage(dataPackage); } public void processClone(ActionContext context) throws Exception { DataReader dataReader = context.getDataReader(); DataWriter dataWriter = context.getDataWriter(); DataPackage dataPackage = context.getDataPackage(); dataPackage.loadOneDataFromDB(); //1. 如果是单条克隆 if (!dataPackage.isEmpty(DataSource.DB)) { DataPackage target = dataPackage.cloneOneData(DataSource.DB); target.saveOneDataToDB(DataSource.New, dataReader, dataWriter); target.setResultData(DataSource.New); dataWriter.setDataPackage(target); return; } //2. 如果是多条克隆 JSONReader reader = dataReader.getReader("id", JType.Array); if (reader != null) { List ids = reader.getStringList(); List result = new ArrayList(); for (String id: ids) { dataPackage.setMasterId(id); dataPackage.loadOneDataFromDB(); DataPackage target = dataPackage.cloneOneData(DataSource.DB); target.saveOneDataToDB(DataSource.New); result.add(target.getMasterId()); } dataWriter.addValue(result); return; } } public void processActivateOne(ActionContext meta) throws Exception { DataPackage dataPackage = meta.getDataPackage(); //1. load id from JSON dataPackage.loadDataIdFromRequest(); //2. activate data from persist dataPackage.loadHostIdFromDB(); //3. activate data from persist DataPackage host = dataPackage.getHost(); if (host == null) { host = dataPackage; } host.activateOneData(); //4. set data to letter DataWriter dataWriter = meta.getDataWriter(); dataWriter.setDataPackage(dataPackage); } public void processFallbackOne(ActionContext meta) throws Exception { DataPackage dataPackage = meta.getDataPackage(); //1. load id from JSON dataPackage.loadDataIdFromRequest(); //2. fallback data from persist DataPackage host = dataPackage.getHost(); if (host == null) { host = dataPackage; } host.fallbackOneData(); //3. set data to letter DataWriter dataWriter = meta.getDataWriter(); dataWriter.setDataPackage(dataPackage); } public void processAlter(ActionContext meta) throws Exception { String dataName = meta.getDataName(); DataPackage dataPackage = meta.getDataPackage(); //1. load id from JSON dataPackage.loadDataFromRequest(); dataPackage.loadFilterPageOrderByFromJSON(); Entity entity = dataPackage.getItemEntity(dataName, DataSource.Request); Filter filter = dataPackage.getFilter(); DataObject dataObject = dataPackage.getDataObject(dataName); //2. udpate data from persist dataObject.updateByEntity(entity, filter); DataWriter dataWriter = meta.getDataWriter(); dataWriter.setDataPackage(dataPackage); } public void processDeleteOne(ActionContext meta) throws Exception { DataPackage dataPackage = meta.getDataPackage(); //1. load id from JSON dataPackage.loadDataIdFromRequest(); //2. delete data from persist dataPackage.deleteOneDataFromDB(); //3. set data to letter DataWriter dataWriter = meta.getDataWriter(); dataWriter.setDataPackage(dataPackage); } private void lockRecord(ActionContext meta) throws Exception { DataPackage dataPackage = meta.getDataPackage(); //1. load id from JSON dataPackage.loadDataIdFromRequest(); //2. delete data from persist dataPackage.lockMasterRecord(); } public void processTotalCnt(ActionContext meta) throws Exception { DataReader dataReader = meta.getDataReader(); DataPackage dataPackage = meta.getDataPackage(); //1. load filter page order from JSON dataPackage.loadFilterFromJSON(); //2. load data package from persist String dataName = dataReader.getDecodeString("dataName", ""); if (Util.isEmpty(dataName)) { logger.error("dataName为空,无法执行processTotalCnt"); return; } DataObject dataObject = dataPackage.getDataObject(dataName); Filter filter = dataPackage.filter; int count = dataObject.getCount(filter, dataReader.getUser()); //3. set data DataWriter dataWriter = meta.getDataWriter(); dataWriter.addValue(count); } private void processSummary(ActionContext meta) throws Exception { DataReader dataReader = meta.getDataReader(); DataPackage dataPackage = meta.getDataPackage(); List fields = dataReader.getStringList("sum"); SummaryFields sum = SummaryFields.getInstance(fields); //1. load filter page order from JSON dataPackage.loadFilterFromJSON(); dataPackage.loadUserLineFilter(); //2. load data package from persist String dataName = dataReader.getDecodeString("dataName", ""); if (Util.isEmpty(dataName)) { logger.error("dataName为空,无法执行processSummary"); return; } DataObject dataObject = dataPackage.getDataObject(dataName); Filter filter = dataPackage.filter; Entity entity = dataObject.getSummary(sum.getValue(), filter, dataReader.getUser()); //3. set data DataWriter dataWriter = meta.getDataWriter(); dataWriter.addValue(entity); } private void writeBackMasterId(DataReader dataReader, String masterId) throws Exception { Domain domain = dataReader.getDomain(); if (domain == null) { return; } if (domain.isEmptyId()) { domain.setId(masterId); } } @Override public void test(ActionContext context, String method) throws Exception { } }