OSDN Git Service

i
[luz/luz.git] / luz2 / src / test / com / lavans / luz2 / util2 / InstanceManager.java
1 /* $Id: InstanceManager.java 415 2011-07-28 23:07:08Z dobashi $\r
2  * created: 2005/09/30\r
3  */\r
4 package test.com.lavans.luz2.util2;\r
5 \r
6 import java.lang.reflect.Constructor;\r
7 import java.util.HashMap;\r
8 import java.util.Map;\r
9 \r
10 import javax.xml.xpath.XPathExpressionException;\r
11 \r
12 import org.apache.commons.logging.Log;\r
13 import org.apache.commons.logging.LogFactory;\r
14 import org.w3c.dom.Element;\r
15 import org.w3c.dom.Node;\r
16 import org.w3c.dom.NodeList;\r
17 \r
18 import com.lavans.luz2.util.Config;\r
19 \r
20 /**\r
21  * @deprecated\r
22  * @author dobashi\r
23  */\r
24 public class InstanceManager {\r
25         /** ロガー。debug用 */\r
26         private static Log logger = LogFactory.getLog(InstanceManager.class);\r
27 \r
28         private static Config config = Config.getInstance("luz.xml");\r
29         private static String SERVICE_ROOT ="instance_manager";\r
30         private static String BEAN = "bean";\r
31         private static String ID = "id";\r
32         private static String CLASS = "class";\r
33         private static String SCOPE = "scope";\r
34 \r
35         /** idとクラス名を保管 */\r
36         private static Map<String, Bean> beanMap = new HashMap<String, Bean>();\r
37 \r
38         static{\r
39                 init();\r
40         }\r
41         /**\r
42          * 初期化。\r
43          * 設定ファイルを読み込む。\r
44          *\r
45          */\r
46         public static void init(){\r
47                 NodeList list=null;\r
48                 try {\r
49                         list = config.getNodeList(SERVICE_ROOT);\r
50                 } catch (XPathExpressionException e) {\r
51                 }\r
52 \r
53                 // 指定無しの場合はなにもしない。\r
54                 if(list==null){\r
55                         return;\r
56                 }\r
57 \r
58                 // rootノード(=Midget)\r
59                 // 各設定情報を取得\r
60                 for(int i=0; i<list.getLength(); i++){\r
61                         Node node = list.item(i);\r
62 //                      System.out.println(node.getNodeName());\r
63                         // テキストノードは無視\r
64 //                      if((node.getNodeType()==Node.TEXT_NODE) ||\r
65 //                         (node.getNodeType()==Node.COMMENT_NODE) ){\r
66 //                              continue;\r
67 //                      }\r
68 \r
69                         if(node.getNodeName().equals(BEAN)){\r
70                                 Element ele = (Element)node;\r
71                                 Bean bean = new Bean();\r
72                                 bean.id = ele.getAttribute(ID);\r
73                                 bean.className = ele.getAttribute(CLASS);\r
74                                 bean.scope = ele.getAttribute(SCOPE);\r
75 \r
76                                 beanMap.put(bean.id, bean);\r
77                         }else{\r
78                                 logger.info("無効な設定項目["+ node.getNodeName() +"]");\r
79                         }\r
80                 }\r
81         }\r
82 \r
83         /**\r
84          * 個別指定のサービスクラス名を返す。\r
85          * 未指定なら引数で渡されたクラス名でインスタンス化する。\r
86          * 失敗した場合はnull。\r
87          * クラス名をFQDNで渡す。\r
88          *\r
89          * @author dobashi\r
90          */\r
91         public static <T> T getInstance(Class<T> clazz){\r
92                 return getInstance(clazz.getName(), clazz);\r
93         }\r
94         public static <T> T getInstance(String id){\r
95                 return getInstance(id, null);\r
96         }\r
97         public static <T> T getInstance(String id, Class<T> clazz){\r
98                 Bean bean = beanMap.get(id);\r
99                 // 指定されたIDで取れない場合のデフォルト\r
100                 if(bean==null && clazz!=null){\r
101                         // class型指定ありならfullクラス名\r
102                         bean = beanMap.get(clazz.getName());\r
103                         // デフォルトのimplを探す\r
104                         if(bean==null){\r
105                                 String pkgNname = clazz.getName().substring(0, clazz.getName().lastIndexOf('.'));\r
106 //                              String className = pkgNname+".impl."+clazz.getSimpleName()+"Impl";\r
107                                 String className = clazz.getName();\r
108                                 bean = new Bean();\r
109                                 bean.id = id;\r
110                                 bean.className = className;\r
111                         }\r
112                         if(bean!=null){\r
113                                 beanMap.put(id, bean);\r
114                         }\r
115                 }\r
116                 try {\r
117                         // prototypeなら毎回新規作成\r
118                         if(bean.scope.equals("prototype")){\r
119                                 Class<?> newClazz =  Class.forName(bean.className);\r
120                                 Constructor<?> constructor = newClazz.getDeclaredConstructor(new Class[]{});\r
121                                 //constructor.setAccessible(true);      //コンストラクタのアクセス権設定(singleton対策)\r
122                                 return (T)constructor.newInstance((Object[])null);\r
123                         }else{\r
124                                 // デフォルトはsingleton\r
125                                 if(bean.object==null){\r
126                                         Class<?> newClazz =  Class.forName(bean.className);\r
127                                         Constructor<?> constructor = newClazz.getDeclaredConstructor(new Class[]{});\r
128                                         constructor.setAccessible(true);        //コンストラクタのアクセス権設定(singleton対策)\r
129                                         bean.object = constructor.newInstance((Object[])null);\r
130                                 }\r
131                                 return (T)bean.object;\r
132                         }\r
133                 } catch (Exception e) {\r
134                         logger.error("初期化に失敗。cayen.xmlのinstance_manager設定を見直してください。", e);\r
135                         return null;\r
136                 }\r
137         }\r
138         private static class Bean {\r
139                 String id;\r
140                 String className;\r
141                 String scope="singleton";\r
142                 Object object;\r
143                 public Bean(){}\r
144         }\r
145 \r
146 }\r