OSDN Git Service

track
[luz/luz.git] / src / com / lavans / luz2 / lremote / selector / SelectorFactory.java
1 package com.lavans.luz2.lremote.selector;\r
2 \r
3 \r
4 import java.lang.reflect.Constructor;\r
5 import java.util.Collections;\r
6 import java.util.HashMap;\r
7 import java.util.Map;\r
8 \r
9 import org.apache.commons.logging.Log;\r
10 import org.apache.commons.logging.LogFactory;\r
11 \r
12 import com.lavans.luz2.lremote.annotation.LRemote;\r
13 import com.lavans.luz2.lremote.connector.ConnectManager;\r
14 import com.lavans.luz2.lremote.node.RemoteNodeGroup;\r
15 import com.lavans.luz2.lremote.selector.impl.GroupSelector;\r
16 import com.lavans.luz2.lremote.selector.impl.OrderedSelector;\r
17 import com.lavans.luz2.lremote.selector.impl.OthersSelector;\r
18 \r
19 /**\r
20  * Selector factory class.\r
21  * Selector is instanced for each RemoteNodeGroup and it is stateful.\r
22  * SelectorFactory caches all instance of selector.\r
23  *\r
24  * @author dobashi\r
25  *\r
26  */\r
27 public class SelectorFactory {\r
28         /** logger */\r
29         private static Log logger = LogFactory.getLog(ConnectManager.class.getName());\r
30 \r
31         /** Cache of all selector instance */\r
32         private static Map<Class<? extends Selector>, Map<RemoteNodeGroup, Selector>> selectorMap = Collections.synchronizedMap(new HashMap<Class<? extends Selector>, Map<RemoteNodeGroup,Selector>>());\r
33 \r
34         /**\r
35          * Get selector.\r
36          *\r
37          * @param lremote\r
38          * @param group\r
39          * @return\r
40          */\r
41         public static Selector getSelector(LRemote lremote, RemoteNodeGroup group){\r
42                 // connect condition\r
43                 LRemote.Selector lremoteSelector = lremote.selector();\r
44 \r
45                 // search selector class\r
46                 Class<? extends Selector> selectorClass = null;\r
47                 switch (lremoteSelector){\r
48                         case ORDERED:\r
49                                 selectorClass = OrderedSelector.class;\r
50                                 break;\r
51                         case GROUP:\r
52                                 selectorClass = GroupSelector.class;\r
53                                 break;\r
54                         case OTHERS:\r
55                                 selectorClass = OthersSelector.class;\r
56                                 break;\r
57                         default:\r
58                                 // TODO from String\r
59                 }\r
60 \r
61                 // check class is valid\r
62                 // throw NoSuchSelectorException?\r
63                 if(selectorClass == null){\r
64                         return null;\r
65                 }\r
66 \r
67                 // Search groupMap for this class.\r
68                 Map<RemoteNodeGroup, Selector> groupMap = selectorMap.get(selectorClass);\r
69                 if(groupMap==null){\r
70                         // create new one\r
71                         groupMap = Collections.synchronizedMap(new HashMap<RemoteNodeGroup, Selector>());\r
72                         selectorMap.put(selectorClass, groupMap);\r
73                 }\r
74 \r
75                 // Search selector instance for this group.\r
76                 Selector selector = groupMap.get(group);\r
77                 if(selector==null){\r
78                         try {\r
79                                 Constructor<? extends Selector> constructor = selectorClass.getConstructor(RemoteNodeGroup.class);\r
80                                 selector = constructor.newInstance(group);\r
81                                 // save cache to map\r
82                                 groupMap.put(group, selector);\r
83                         } catch (Exception e) {\r
84                                 logger.error("", e);\r
85                         }\r
86                 }\r
87 \r
88                 return selector;\r
89         }\r
90 }\r