package foundation.version_doc; import foundation.dao.Filter; import foundation.dao.IFileWriter; import foundation.dao.IVersionIndex; import foundation.dao.bizlogic.IVersionProvider; import foundation.data.entity.Entity; import foundation.data.object.DataObject; import foundation.persist.NamedSQL; public class VersionCenter extends IVersionProvider { private static VersionCenter instance; private VersionBucket versionBucket; private VersionCenter() { versionBucket = VersionBucket.getInstance(); } public static synchronized VersionCenter getInstance() { if (instance == null) { instance = new VersionCenter(); } return instance; } @Override public boolean isVersionActive(String dataName) { VersionMeta meta = versionBucket.get(dataName); if (meta == null) { return false; } return meta.isVersionActive(); } @Override public IVersionIndex getIndex(String dataName, String dataId, String applyId) throws Exception { VersionMeta meta = versionBucket.get(dataName); if (meta == null) { return null; } boolean versionActive = meta.isVersionActive(); if (!versionActive) { return null; } String tableName = meta.getIndexTableName(); DataObject dataObject = DataObject.getInstance(tableName); Filter filter = new Filter("data_id", dataId).add("apply_id", applyId); Entity entity = dataObject.getTableEntity(filter); if (entity == null) { //1. 获取临时版本号 VersionCode versionNo = new VersionCode(tableName, dataId, applyId); versionNo.nextTempValue(); //2. 获取文件路径 String path = VersionFileRepository.getFilePath(dataName, dataId, versionNo.getCode()); //3. 保存文件索引到数据库 entity = dataObject.createTableEntity(true); entity.set("data_name", dataName); entity.set("data_id", dataId); entity.set("apply_Id", applyId); entity.set("version_code", versionNo.getCode()); entity.set("version_no", versionNo.getNo()); entity.set("is_temp", true); entity.set("path", path); dataObject.insertEntity(entity); } VersionIndex result = new VersionIndex(meta); result.load(entity); return result; } @Override public String activateVersion(String dataName, String dataId, String applyId) throws Exception { IVersionIndex index = getIndex(dataName, dataId, applyId); //1. 如果没有版本管理或已经是正式版本,退出 if (index == null || index.isStandard()) { return null; } //2. 得到 code 的 next value String tableName = index.getIndexTableName(); VersionCode versionCode = new VersionCode(tableName, dataId, applyId); versionCode.nextStandardValue(); //3. 设置版本号 NamedSQL namedSQL = NamedSQL.getInstance("setStandardVersionNo"); namedSQL.setTableName(tableName); namedSQL.setParam("dataId", dataId); namedSQL.setParam("applyId", applyId); namedSQL.setParam("versionCode", versionCode.getCode()); namedSQL.setParam("versionNo", versionCode.getNo()); namedSQL.execute(); //4. 根据正式版本号为文件重新命名 IFileWriter fileWriter = index.getFileWriter(); fileWriter.rename(); //5. 返回版本号 return versionCode.getCode(); } public void deleteVersion(String dataName, String dataId, String applyId) throws Exception { VersionMeta meta = versionBucket.get(dataName); if (meta == null) { return; } boolean versionActive = meta.isVersionActive(); if (!versionActive) { return; } NamedSQL namedSQL = NamedSQL.getInstance("deleteOneVersion"); namedSQL.setTableName(meta.getIndexTableName()); namedSQL.setParam("dataId", dataId); namedSQL.setParam("applyId", applyId); namedSQL.execute(); } }