1 package com.lavans.luz2.lremote.selector;
\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
9 import org.apache.commons.logging.Log;
\r
10 import org.apache.commons.logging.LogFactory;
\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
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
27 public class SelectorFactory {
\r
29 private static Log logger = LogFactory.getLog(ConnectManager.class.getName());
\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
41 public static Selector getSelector(LRemote lremote, RemoteNodeGroup group){
\r
42 // connect condition
\r
43 LRemote.Selector lremoteSelector = lremote.selector();
\r
45 // search selector class
\r
46 Class<? extends Selector> selectorClass = null;
\r
47 switch (lremoteSelector){
\r
49 selectorClass = OrderedSelector.class;
\r
52 selectorClass = GroupSelector.class;
\r
55 selectorClass = OthersSelector.class;
\r
61 // check class is valid
\r
62 // throw NoSuchSelectorException?
\r
63 if(selectorClass == null){
\r
67 // Search groupMap for this class.
\r
68 Map<RemoteNodeGroup, Selector> groupMap = selectorMap.get(selectorClass);
\r
71 groupMap = Collections.synchronizedMap(new HashMap<RemoteNodeGroup, Selector>());
\r
72 selectorMap.put(selectorClass, groupMap);
\r
75 // Search selector instance for this group.
\r
76 Selector selector = groupMap.get(group);
\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