OSDN Git Service

i
[luz/luz.git] / luz2 / src / com / lavans / luz2 / util / BeanManager.java
1 package com.lavans.luz2.util;\r
2 \r
3 import java.util.Map;\r
4 import java.util.concurrent.ConcurrentHashMap;\r
5 \r
6 import javax.xml.xpath.XPathExpressionException;\r
7 \r
8 import org.apache.commons.logging.Log;\r
9 import org.apache.commons.logging.LogFactory;\r
10 import org.w3c.dom.Element;\r
11 import org.w3c.dom.Node;\r
12 import org.w3c.dom.NodeList;\r
13 \r
14 import com.lavans.luz2.commons.StringUtils;\r
15 \r
16 /**\r
17  * Service Manager Implementation for XML file(default).\r
18  * @author dobashi\r
19  *\r
20  */\r
21 public class BeanManager {\r
22         /** logger */\r
23         private static final Log logger = LogFactory.getLog(BeanManager.class);\r
24 \r
25         /**  */\r
26         private static Map<String, String> packageNameMap = new ConcurrentHashMap<String, String>();\r
27         /** cache of all service */\r
28         private static Map<String, BeanInfo> beanMap =  new ConcurrentHashMap<String, BeanInfo>();\r
29 \r
30         private BeanManager(){\r
31         }\r
32 \r
33         static{\r
34                 load("luz2.xml");\r
35         }\r
36 \r
37         /** initialize */\r
38         public static void load(String filename){\r
39                 //packageNameMap.clear();\r
40                 beanMap.clear();\r
41                 Config config = Config.getInstance(filename);\r
42                 try {\r
43                         // package map\r
44                         NodeList packageList = config.getNodeList("/root/beans");\r
45                         for(int i=0; i<packageList.getLength(); i++){\r
46                                 Element node = (Element)packageList.item(i);\r
47                                 String group = node.getAttribute("group");\r
48                                 String packageName = node.getAttribute("package");\r
49                                 packageNameMap.put(group, packageName);\r
50                         }\r
51 \r
52                         // bean map\r
53                         NodeList nodeList = config.getNodeList("//bean");\r
54                         for(int i=0; i<nodeList.getLength(); i++){\r
55                                 Element node = (Element)nodeList.item(i);\r
56                                 Node parent = node.getParentNode();\r
57                                 BeanInfo bean = new BeanInfo();\r
58                                 bean.id = node.getAttribute("id");\r
59                                 bean.className = node.getAttribute("class");\r
60                                 // beanのgroup指定なら\r
61                                 if(parent.getNodeName().equals("beans")){\r
62                                         bean.group = node.getAttribute("group");\r
63                                         bean.packageName = node.getAttribute("package");\r
64                                         // add package info to id & className\r
65                                         if(!StringUtils.isEmpty(bean.packageName)){\r
66                                                 bean.id        = bean.packageName +"."+ bean.id;\r
67                                                 bean.className = bean.packageName +"."+ bean.className;\r
68                                         }\r
69                                 }\r
70                                 beanMap.put(bean.id, bean);\r
71                         }\r
72                 } catch (XPathExpressionException e) {\r
73                         logger.error("Unable to find /lremote/service_base_path");\r
74                 }\r
75         }\r
76 \r
77         /**\r
78          * get bean class. パッケージ指定有り\r
79          * @param name\r
80          * @param id\r
81          * @return\r
82          */\r
83         public static Class<? extends Object> getBeanClass(String group, String id){\r
84                 return getBeanClass(toFullId(group, id));\r
85         }\r
86 \r
87         /**\r
88          * beanのreflectionクラスを返す。\r
89          * @param id\r
90          * @return\r
91          */\r
92         public static Class<? extends Object> getBeanClass(String id) {\r
93                 // Get FQDN bean info\r
94                 BeanInfo bean = getBeanInfo(id);\r
95 \r
96                 return bean.getClazz();\r
97         }\r
98 \r
99         /**\r
100          * get bean instance. パッケージ指定有り\r
101          * @param name\r
102          * @param id\r
103          * @return\r
104          */\r
105         public static Object getBean(String group, String id){\r
106                 return getBean(toFullId(group, id));\r
107         }\r
108 \r
109         /**\r
110          * beanのsingletonインスタンスを返す\r
111          * @param id\r
112          * @return\r
113          */\r
114         @SuppressWarnings("unchecked")\r
115         public static <T> T getBean(Class<T> clazz) {\r
116                 // Get FQDN bean info\r
117                 BeanInfo bean = getBeanInfo(clazz.getName());\r
118 \r
119                 // now support only singleton\r
120                 return (T)bean.getInstance();\r
121         }\r
122         /**\r
123          * beanのsingletonインスタンスを返す\r
124          * @param id\r
125          * @return\r
126          */\r
127         public static Object getBean(String id) {\r
128                 // Get FQDN bean info\r
129                 BeanInfo bean = getBeanInfo(id);\r
130 \r
131                 // now support only singleton\r
132                 return bean.getInstance();\r
133         }\r
134 \r
135         public static String toFullId(String group, String id){\r
136                 String packageName = packageNameMap.get(group);\r
137                 if(!StringUtils.isEmpty(packageName)){\r
138                         id = packageName+"."+id;\r
139                 }\r
140                 return id;\r
141         }\r
142 \r
143         private static BeanInfo getBeanInfo(String id) {\r
144                 // Get FQDN bean info\r
145                 BeanInfo bean = beanMap.get(id);\r
146                 if(bean==null){\r
147                         // if id is not defined in config file then id is className\r
148                         bean = new BeanInfo();\r
149                         bean.id=bean.className=id;\r
150                         beanMap.put(id, bean);\r
151                 }\r
152                 return bean;\r
153         }\r
154 \r
155 }\r
156 \r
157 class BeanInfo{\r
158         /** logger */\r
159         private static final Log logger = LogFactory.getLog(BeanInfo.class);\r
160         /** parent group info */\r
161         public String group;\r
162         public String packageName;\r
163         /** bean info */\r
164         public String id;\r
165         public String className;\r
166         public String initMethod;\r
167         private Class<? extends Object> clazz=null;\r
168         private Object instance=null;\r
169         /**\r
170          * Classクラスを返す。一度読み込んだらキャッシュして再利用。\r
171          * @return\r
172          */\r
173         public Class<? extends Object> getClazz(){\r
174                 if(clazz!=null){\r
175                         return clazz;\r
176                 }\r
177 \r
178                 // load from ClassLoader\r
179                 try {\r
180                         clazz = Class.forName(className);\r
181                 } catch (ClassNotFoundException e) {\r
182                         logger.error("bean class is not found["+ className +"]", e);\r
183                 }\r
184 \r
185                 return clazz;\r
186         }\r
187         /**\r
188          * instanceを返す。一度読み込んだらキャッシュして再利用。\r
189          * @return\r
190          */\r
191         public Object getInstance(){\r
192                 if(instance!=null){\r
193                         return instance;\r
194                 }\r
195 \r
196                 // load from ClassLoader\r
197                 try {\r
198                         instance = getClazz().newInstance();\r
199                 } catch (Exception e) {\r
200                         logger.error("Bean instance cannot created ["+ className +"]", e);\r
201                 }\r
202 \r
203                 if(!StringUtils.isEmpty(initMethod)){\r
204                         try {\r
205                                 clazz.getMethod(initMethod, (Class<?>[])null).invoke(instance, (Object[])null);\r
206                         } catch (Exception e) {\r
207                                 logger.error("init method call error ["+ className +"#"+ initMethod +"()]", e);\r
208                         }\r
209                 }\r
210 \r
211                 return instance;\r
212         }\r
213 \r
214         /**\r
215          * override toString().\r
216          */\r
217         @Override\r
218         public String toString() {\r
219                 return "BeanInfo [group=" + group + ", packageName=" + packageName\r
220                                 + ", id=" + id + ", className=" + className + ", initMethod="\r
221                                 + initMethod + ", clazz=" + clazz + ", instance=" + instance\r
222                                 + "]";\r
223         }\r
224 }\r
225 \r