shikeying
2024-01-11 3b67e947e36133e2a40eb2737b15ea375e157ea0
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
package com.walker.store.strategy;
 
import com.walker.connector.Address;
import com.walker.store.MetaDataEngine;
import com.walker.store.Repository;
import com.walker.store.StoreStrategy;
import com.walker.store.repo.DatabaseRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import java.util.List;
 
/**
 * 基于数据库的存储策略实现
 * @author shikeying
 * @date 2015年12月16日
 *
 */
public abstract class DatabaseStoreStrategy implements StoreStrategy {
 
    protected transient final Logger logger = LoggerFactory.getLogger(getClass());
    
    protected DatabaseRepository repository = null;
    
    private MetaDataEngine metaDataEngine = null;
    
    private String storeId;
    
    private List<Address> defineAddressList = null;
    private int defineAddressSize = 0; // 定义的存储资源库中包含的地址数量
    
    protected String defineDbName = null; // 采集时定义的数据库名字
    
    public String getStoreId() {
        return storeId;
    }
 
    public void setStoreId(String storeId) {
        this.storeId = storeId;
    }
 
    @Override
    public MetaDataEngine getMetaDataEngine() {
        return metaDataEngine;
    }
 
    @Override
    public void setMetaDataEngine(MetaDataEngine metaDataEngine) {
        this.metaDataEngine = metaDataEngine;
    }
 
    /**
     * 事先根据配置,设置需要的资源库,后续策略实现需要该数据。</p>
     * 最初设想自动创建数据库,但感觉实际操作中风险过大,还是提前准备好。
     * @param repository
     */
    @Override
    public void setRepository(Repository repository) {
        if(repository != null && repository instanceof DatabaseRepository){
            this.repository = (DatabaseRepository)repository;
            defineAddressList = this.repository.getAddressList();
            if(defineAddressList != null){
                this.defineAddressSize = defineAddressList.size();
            }
            defineDbName = repository.getDefineName();
            logger.debug("设置了资源库:" + defineDbName);
            return;
        }
        throw new IllegalArgumentException("设置资源库对象出错:可能为空或者类型不匹配:" + repository);
    }
    
    @Override
    public List<Address> getDefineAddressList(){
//        return repository.getAddressList();
        return defineAddressList;
    }
    
    @Override
    public int getDefineAddressSize(){
        return this.defineAddressSize;
    }
    
    /**
     * 获得经过策略挑选的数据库信息,如果业务只配置了一个则无需计算
     * @param parameter 业务传递的参数
     * @return
     */
    public synchronized Address getDatabaseAddress(Object parameter){
        if(repository == null){
            throw new IllegalArgumentException("repository is required!");
        }
        List<Address> addresses = repository.getAddressList();
        if(addresses == null || addresses.size() == 0){
            throw new IllegalArgumentException("repository对象中未配置数据库信息!");
        }
        
        return this.doQueryAddress(this.storeId, addresses, parameter);
    }
    
    /**
     * 获得策略计算的表名
     * @param address 选择的数据库地址信息
     * @param srcTable 业务提供的表名
     * @param parameter 业务传递的参数
     * @return
     */
    public String getTableName(Address address, String srcTable, Object parameter){
//        if(address == null){
//            throw new IllegalArgumentException("计算表名策略中,未发现数据库地址信息,address = null!");
//        }
        return this.doQueryTableName(address, srcTable, parameter);
    } 
    
    /**
     * 查询需要使用的数据库信息,由子类实现。如果就提供了一个库,则该方法不会被调用。
     * @param addresses
     * @param parameter
     * @return
     */
    protected abstract Address doQueryAddress(String storeId, List<Address> addresses, Object parameter);
    
    /**
     * 查询需要使用的表名字,由子类实现具体选择表名的过程。
     * @param address
     * @param parameter
     * @return
     */
    protected abstract String doQueryTableName(Address address, String srcTable, Object parameter);
}