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
package com.walker.infrastructure.arguments;
 
import java.util.concurrent.ConcurrentHashMap;
 
import com.walker.infrastructure.arguments.support.XmlArgumentsManager;
import com.walker.infrastructure.utils.StringUtils;
 
public abstract class ArgumentsManagerFactory {
 
//    private static final Object lock = new Object();
    
    private static final ConcurrentHashMap<String, ArgumentsManager> existArgumentsManagers = 
            new ConcurrentHashMap<String, ArgumentsManager>(2);
    
    /**
     * 创建xml方式配置的可变参数管理器对象。</p>
     * 系统会管理创建的所有'配置管理器',可以通过文件名来引用。</br>
     * 
     * 通常在系统初始化过程中来通过此方法创建对象。</br>
     * 如果配置文件在外部存放,filename必须是绝对路径,classpath = false
     * @param filename 文件名,支持文件名在类路径中或绝对路径。
     * @param classpath 配置文件是否用的classpath方式
     * @return
     */
    public static final ArgumentsManager createXmlArgumentsManager(String filename, boolean classpath){
        assert (StringUtils.isNotEmpty(filename));
        ArgumentsManager exist = existArgumentsManagers.get(filename);
        if(exist != null)
            throw new ArgumentsException("已经存在配置管理器,无法重复创建: " + filename);
        
        XmlArgumentsManager xmlArgumentsManager = new XmlArgumentsManager();
        if(classpath){
            xmlArgumentsManager.setClasspathFileName(filename);
        } else
            xmlArgumentsManager.setFileSystemFileName(filename);
        try {
            xmlArgumentsManager.afterPropertiesSet();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new ArgumentsException("初始化ArgumentManager失败: " + filename, e);
        }
        existArgumentsManagers.put(filename, xmlArgumentsManager);
        
        return xmlArgumentsManager;
    }
    
    public static final ArgumentsManager getArgumentsManager(String filename){
        ArgumentsManager exist = existArgumentsManagers.get(filename);
        if(exist == null)
            throw new ArgumentsException("not found argumentsManager:" + filename);
        return exist;
    }
    
    /**
     * 系统终止时,销毁所有已经创建的管理器。
     */
    public static final void destroy(){
        for(ArgumentsManager am : existArgumentsManagers.values()){
            try{
                am.destroy();
            } catch(Exception ex){
//                ex.printStackTrace();
                throw new ArgumentsException("销毁ArgumentsManager失败: " + am.toString(), ex);
            }
        }
    }
}