--- /dev/null
+package com.lavans.luz2.lremote.service;\r
+\r
+import java.util.Collections;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import net.sf.cglib.proxy.Enhancer;\r
+\r
+import com.lavans.luz2.lremote.intercetor.RemoteInterceptor;\r
+import com.lavans.luz2.util.BeanManager;\r
+\r
+/**\r
+ * Service Manager Implementation for XML file(default).\r
+ * @author dobashi\r
+ *\r
+ */\r
+public class ServiceManagerXml implements ServiceManager{\r
+ /** logger */\r
+ //private static final Log logger = LogFactory.getLog(ServiceManagerXml.class);\r
+ /** singleton instance */\r
+ private static ServiceManager instance = new ServiceManagerXml();\r
+\r
+ /** cache of all service */\r
+ private Map<String, Object> serviceMap = Collections.synchronizedMap(new HashMap<String, Object>());\r
+\r
+ /**\r
+ * constructor\r
+ */\r
+ public static ServiceManager getInstance(){\r
+ return instance;\r
+ }\r
+\r
+ private ServiceManagerXml(){\r
+ init();\r
+ }\r
+\r
+ /** initialize */\r
+ public void init(){\r
+ }\r
+\r
+ public Object getService(String group, String id) {\r
+ return getService(BeanManager.toFullId(group, id));\r
+ }\r
+ public Object getService(String id) {\r
+ // search from cache\r
+ Object service = serviceMap.get(id);\r
+ // If service is found, return cache.\r
+ if(service!=null){\r
+ return service;\r
+ }\r
+\r
+ // If the service is not cached then create new one.\r
+ Class<? extends Object> clazz = BeanManager.getBeanClass(id);\r
+\r
+ // intercept by CGLIB\r
+ Enhancer enhancer = new Enhancer();\r
+ enhancer.setSuperclass(clazz);\r
+ enhancer.setCallback(new RemoteInterceptor());\r
+ service = enhancer.create();\r
+ serviceMap.put(id, service);\r
+\r
+ return service;\r
+ }\r
+\r
+ /**\r
+ * Get for local. Never set Interceptor. This methos equals to BeanManager.\r
+ */\r
+ public Object getServiceLocal(String group, String id) {\r
+ return BeanManager.getBean(group, id);\r
+ }\r
+ public Object getServiceLocal(String id) {\r
+ return BeanManager.getBean(id);\r
+ }\r
+\r
+}\r