1 package com.lavans.luz2.util;
\r
3 import java.util.Map;
\r
4 import java.util.concurrent.ConcurrentHashMap;
\r
6 import javax.xml.xpath.XPathExpressionException;
\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
14 import com.lavans.luz2.commons.StringUtils;
\r
17 * Service Manager Implementation for XML file(default).
\r
21 public class BeanManager {
\r
23 private static final Log logger = LogFactory.getLog(BeanManager.class);
\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
30 private BeanManager(){
\r
38 public static void load(String filename){
\r
39 //packageNameMap.clear();
\r
41 Config config = Config.getInstance(filename);
\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
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
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
70 beanMap.put(bean.id, bean);
\r
72 } catch (XPathExpressionException e) {
\r
73 logger.error("Unable to find /lremote/service_base_path");
\r
78 * get bean class. パッケージ指定有り
\r
83 public static Class<? extends Object> getBeanClass(String group, String id){
\r
84 return getBeanClass(toFullId(group, id));
\r
88 * beanのreflectionクラスを返す。
\r
92 public static Class<? extends Object> getBeanClass(String id) {
\r
93 // Get FQDN bean info
\r
94 BeanInfo bean = getBeanInfo(id);
\r
96 return bean.getClazz();
\r
100 * get bean instance. パッケージ指定有り
\r
105 public static Object getBean(String group, String id){
\r
106 return getBean(toFullId(group, id));
\r
110 * beanのsingletonインスタンスを返す
\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
119 // now support only singleton
\r
120 return (T)bean.getInstance();
\r
123 * beanのsingletonインスタンスを返す
\r
127 public static Object getBean(String id) {
\r
128 // Get FQDN bean info
\r
129 BeanInfo bean = getBeanInfo(id);
\r
131 // now support only singleton
\r
132 return bean.getInstance();
\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
143 private static BeanInfo getBeanInfo(String id) {
\r
144 // Get FQDN bean info
\r
145 BeanInfo bean = beanMap.get(id);
\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
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
165 public String className;
\r
166 public String initMethod;
\r
167 private Class<? extends Object> clazz=null;
\r
168 private Object instance=null;
\r
170 * Classクラスを返す。一度読み込んだらキャッシュして再利用。
\r
173 public Class<? extends Object> getClazz(){
\r
178 // load from ClassLoader
\r
180 clazz = Class.forName(className);
\r
181 } catch (ClassNotFoundException e) {
\r
182 logger.error("bean class is not found["+ className +"]", e);
\r
188 * instanceを返す。一度読み込んだらキャッシュして再利用。
\r
191 public Object getInstance(){
\r
192 if(instance!=null){
\r
196 // load from ClassLoader
\r
198 instance = getClazz().newInstance();
\r
199 } catch (Exception e) {
\r
200 logger.error("Bean instance cannot created ["+ className +"]", e);
\r
203 if(!StringUtils.isEmpty(initMethod)){
\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
215 * override toString().
\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