P15GEN2\59518
2024-05-29 d4210c7c4b04abde20037ea8aa0f54ef8a2649aa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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();
    }
 
}