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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package com.walker.cache;
 
import com.walker.cache.tree.CacheTree;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
 
/**
 * 应用系统缓存管理器默认实现
 * @author shikeying
 *
 */
public final class SimpleCacheManager {
 
    private static final transient Logger logger = LoggerFactory.getLogger(SimpleCacheManager.class);
 
    private static boolean initialized = false;
 
    private static final Object lock = new Object();
 
    private static final Map<Class<?>, CacheProvider<?>> cacheProvidersMap = new ConcurrentHashMap<Class<?>, CacheProvider<?>>();
    // 2023-01-04 能通过 CacheProvider.getProviderName() 获取到缓存对象
    private static final Map<String, CacheProvider<?>> cacheProvidersNameMap = new ConcurrentHashMap<String, CacheProvider<?>>();
 
    private SimpleCacheManager(){}
 
//    /**
//     * 返回系统配置参数缓存对象提供者
//     * @return
//     */
//    @SuppressWarnings("unchecked")
//    public static final CacheProvider<PreferenceEntity> getPreferenceCacheProvider(){
//        CacheProvider<?> cp = cacheProvidersMap.get(PreferenceEntity.class);
//        if(cp == null) return null;
//        if(cp.getProviderType() == PreferenceEntity.class){
//            return (CacheProvider<PreferenceEntity>)cp;
//        } else
//            throw new RuntimeException("preferenceCache must be type of " + PreferenceEntity.class.getName());
//    }
 
    /**
     * 根据缓存对象提供者名字,返回缓存对象。
     * @param cacheProviderName
     * @return
     * @date 2023-01-04
     */
    public static final CacheProvider<?> getCacheProvider(String cacheProviderName){
        CacheProvider<?> cp = cacheProvidersNameMap.get(cacheProviderName);
        if(cp == null)
            throw new NullPointerException("not found cacheProvider: " + cacheProviderName);
        return cp;
    }
 
    /**
     * 返回缓存提供者
     * @param clazz 对应实体类型,如:<code>PreferenceEntity.class</code>
     * @return
     */
    @SuppressWarnings("unchecked")
    public static final <T> CacheProvider<T> getCacheProvider(Class<T> clazz){
        CacheProvider<?> cp = cacheProvidersMap.get(clazz);
        if(cp == null)
            throw new NullPointerException("not found cacheProvider: " + clazz.getName());
        return (CacheProvider<T>)cp;
    }
 
    /**
     * 返回缓存树提供者对象
     * @param clazz 对应实体类型,如:<code>CodeEntity.class</code>
     * @return
     */
    @SuppressWarnings("unchecked")
    public static final <T> CacheTree<T> getCacheTreeProvider(Class<T> clazz){
        CacheProvider<?> cp = getCacheProvider(clazz);
        if(CacheTree.class.isAssignableFrom(cp.getClass())){
            return (CacheTree<T>)cp;
        }
        throw new UnsupportedOperationException(clazz.getName() + " is not a CacheTree!");
    }
 
    /**
     * 返回系统定义的所有缓存对象。如果不存返回<code>null</code>
     * @return
     */
    @Deprecated
    public static final Collection<CacheProvider<?>> getCacheProviders(){
        if(cacheProvidersMap.size() == 0)
            return null;
        return cacheProvidersMap.values();
    }
 
    /**
     * 获得所有缓存提供者对象集合,该方法替代:{@linkplain SimpleCacheManager#getCacheProviders()}
     * @return
     * @date 2023-08-27
     */
    public static final List<CacheProvider<?>> getCacheProviderList(){
        List<CacheProvider<?>> data = new ArrayList<>();
        for(CacheProvider<?> cp : cacheProvidersNameMap.values()){
            data.add(cp);
        }
        return data;
    }
 
    public void setCacheProviders(List<CacheProvider<?>> cacheProviders){
        if(cacheProviders == null) return;
        if(!initialized){
            synchronized (lock) {
                try{
                    // 在这里初始化所有缓存对象
                    for(CacheProvider<?> cp : cacheProviders){
//                        registeredCaches.put(cp.getProviderName(), cp.getCache());
                        cacheProvidersMap.put(cp.getProviderType(), cp);
                        cacheProvidersNameMap.put(cp.getProviderName(), cp);
                    }
                    initialized = true;
 
                } catch(Throwable cause){
                    throw new Error("初始化系统缓存失败。", cause);
                }
            }
        }
    }
 
    /**
     * 向缓存管理器中添加(注册)一个缓存对象
     * @param cacheProvider
     * @return 注册成功返回<code>true</code>
     */
    public static final boolean addCacheProvider(CacheProvider<?> cacheProvider){
        assert (cacheProvider != null);
//        CacheProvider<?> cache = cacheProvidersMap.get(cacheProvider.getProviderType());
        if(!cacheProvidersMap.containsKey(cacheProvider.getProviderType())){
            cacheProvidersMap.put(cacheProvider.getProviderType(), cacheProvider);
            cacheProvidersNameMap.put(cacheProvider.getProviderName(), cacheProvider);
            return true;
        } else {
//            throw new IllegalStateException("cache already exist, can't add repeatly: " + cacheProvider.getProviderName());
            cacheProvidersNameMap.put(cacheProvider.getProviderName(), cacheProvider);
            logger.debug("已经存在了缓存对象,不能重复注册: " + cacheProvider.getProviderType() + ", cacheName=" + cacheProvider.getProviderName());
            return false;
        }
    }
}