IT-KIMI_SHI\SINOIT.KIMI
2018-12-07 50eb1d766c470dc6ff927199eaee934f972a8b70
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*************************************************************************
 * Copyright (C) Unpublished JiuDaoTech Software, Inc. All rights reserved.
 * JiuDaoTech Software, Inc., Confidential and Proprietary.
 * <p>
 * This software is subject to copyright protection
 * under the laws of the Public of China and other countries.
 * <p>
 * Unless otherwise explicitly stated, this software is provided
 * by JiuDaoTech "AS IS".
 *************************************************************************/
package service.system.impl;
 
import common.exception.app.AppRuntimeException;
import common.model.BaseModel;
import dao.BaseMapper;
import dao.mapper.system.SystemMetaDataMapper;
import model.system.SystemMetaData;
import model.system.SystemStatus;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.*;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.jdbc.ScriptRunner;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.support.JdbcUtils;
import org.springframework.stereotype.Service;
import service.system.SystemDetectedService;
 
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.Charset;
import java.sql.*;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
 
/**
 * @see service.system.SystemDetectedService
 */
@Service("systemDetectedService")
public class SystemDetectedServiceImpl implements SystemDetectedService {
 
    private static final Logger L = LoggerFactory.getLogger(SystemDetectedServiceImpl.class);
 
    private static final String NAME_SPACE = "com.jiudaotech.www";
    private static final String[] TABLE_TYPES = {"TABLE", "VIEW"};
 
    @Resource
    private BaseMapper<BaseModel> baseMapper;
 
    @Resource
    private SystemMetaDataMapper systemMetaDataMapper;
 
    @Override
    public SystemStatus checkSystemInitStatus(float appVersion) {
        Connection conn = baseMapper.getSqlSessionTemplate().getConnection();
        try {
            DatabaseMetaData metaData = conn.getMetaData();
            ResultSet tableRs = metaData.getTables(null, "%", "T_SYS_CORE_METADATA", TABLE_TYPES);
            if (!tableRs.next()) {
                return SystemStatus.NOT_INIT;
            } else {
                return SystemStatus.HAS_INIT;
            }
        } catch (SQLException e) {
            throw new AppRuntimeException(e);
        }
 
    }
 
    @Override
    public void initSystemCoreTables() {
        BaseModel model = new BaseModel();
        model.setStatmentId(NAME_SPACE + ".initSystemCoreTables");
        baseMapper.update(model);
    }
 
    @Override
    public void upgradeSystem(float currentVersion, float appVersion) {
 
        L.info("更新版本, Ver: {} -> Ver: {}", currentVersion, appVersion);
 
        String upgradeScriptFolder = "upgrade/";
        String updateMetaSql = "UPDATE T_SYS_CORE_METADATA SET VERSION=?, UPDATE_TIME=? WHERE ID=1";
 
        Connection conn = baseMapper.getSqlSessionTemplate().getConnection();
        PreparedStatement statement = null;
 
        // 支持跨版本, 多级升级(命名规范)
        final float v1 = currentVersion, v2 = appVersion;
        URL root = SystemDetectedServiceImpl.class.getClassLoader().getResource("upgrade/");
        IOFileFilter targetFilter = new AbstractFileFilter() {
            @Override
            public boolean accept(File file) {
                boolean accept = file.getName().startsWith("v") && file.isDirectory();
                if (accept) {
                    Float upgradeVersion = Float.valueOf(file.getName().replaceAll("v", ""));
                    accept = (upgradeVersion > v1 && upgradeVersion <= v2);
                }
                return accept;
            }
        };
        List<File> targetLists = FileFilterUtils.filterList(targetFilter,
                FileUtils.listFilesAndDirs(new File(root.getFile()), DirectoryFileFilter.INSTANCE, TrueFileFilter.INSTANCE));
        Collections.sort(targetLists);
        try {
            ScriptRunner runner = new ScriptRunner(conn);
            runner.setAutoCommit(false);
            runner.setSendFullScript(true);
            for (File target : targetLists) {
                Resources.setCharset(Charset.forName("UTF-8"));
                Collection<File> scripts = FileUtils.listFiles(target, new String[]{"sql"}, true);
                for (File f : scripts) {
                    runner.runScript(Resources.getResourceAsReader(upgradeScriptFolder + target.getName() + "/" + f.getName()));
                }
            }
            // 更新元数据表版本号
            conn.setAutoCommit(false);
            statement = conn.prepareStatement(updateMetaSql);
            statement.setString(1, Float.toString(appVersion));
            statement.setString(2, DateTime.now().toString("yyyyMMddHHmmss"));
            statement.execute();
            conn.commit();
        } catch (IOException | SQLException e) {
            try {
                if (conn != null) conn.rollback();
            } catch (SQLException ex) {
            }
            L.error("更新系统至Ver:{} 出错! {}", appVersion, e.getMessage());
        } finally {
            JdbcUtils.closeStatement(statement);
            JdbcUtils.closeConnection(conn);
        }
 
    }
 
    @Override
    public SystemMetaData querySystemMetaDataAsObject() {
        return systemMetaDataMapper.querySystemMetaDataAsObject();
    }
 
    @Override
    public SystemStatus checkQuartzInitStatus(float appVersion) {
        Connection conn = baseMapper.getSqlSessionTemplate().getConnection();
        try {
            DatabaseMetaData metaData = conn.getMetaData();
            ResultSet tableRs = metaData.getTables(null, "%", "QRTZ_TRIGGERS", TABLE_TYPES);
            if (!tableRs.next()) {
                return SystemStatus.NOT_INIT;
            } else {
                return SystemStatus.HAS_INIT;
            }
        } catch (SQLException e) {
            throw new AppRuntimeException(e);
        }
    }
 
    @Override
    public void initQuartzCoreTables() {
        BaseModel model = new BaseModel();
        model.setStatmentId(NAME_SPACE + ".initQuartzTables");
        baseMapper.update(model);
    }
}