View Javadoc

1   package net.sf.crispy.server;
2   
3   import java.util.Hashtable;
4   import java.util.Map;
5   
6   import net.sf.crispy.InvocationException;
7   
8   /**
9    * 
10   * Container for the service implementation. This is a mapping from service-interface plus 
11   * a key (e.g. user key or sessionId) to the service-implementation.
12   * The service instance exist multiple (per key). They service implementation must not be Thread safe.
13   * 
14   * @author Linke
15   *
16   * @since 1.1.0
17   */
18  public class MultiServiceContainerImpl {
19  	
20  	private Map services = new Hashtable();
21  	private Map registerServices = new Hashtable();
22  	private ServiceCreator serviceCreator = null;
23  	
24  	
25  	public void setServiceCreator(ServiceCreator pvServiceCreator) {
26  		serviceCreator = pvServiceCreator;
27  	}
28  	public ServiceCreator getServiceCreator() {
29  		if (serviceCreator == null) {
30  			serviceCreator = new ServiceCreatorDefaultImpl();
31  		}
32  		return serviceCreator;
33  	}
34  		
35  	public void registerService(String pvServiceInterfaceName, String pvServiceImplName) {
36  		registerServices.put(pvServiceInterfaceName, pvServiceImplName);
37  	}
38  	
39  	public String getRegisterServiceByServiceInterfaceName(String pvServiceInterfaceName) {
40  		return (String) registerServices.get(pvServiceInterfaceName);
41  	}
42  
43  	public String removeRegisterServiceByServiceInterfaceName(String pvServiceInterfaceName) {
44  		return (String) registerServices.remove(pvServiceInterfaceName);
45  	}
46  
47  	public int getRegisterServiceSize() {
48  		return registerServices.size();
49  	}
50  
51  	/**
52  	 * Find the service impl.
53  	 * 
54  	 * @param pvKey Is the key in a map.
55  	 * @param pvServiceInterfaceName Is the key for the service impl in a map.
56  	 * @return The service impl or <code>null</code>.
57  	 */
58  	public Object getService(Object pvKey, String pvServiceInterfaceName) throws Exception {
59  		Map lvServiceMap = (Map) services.get(pvKey);
60  		if (lvServiceMap != null) {
61  			Object lvObject = lvServiceMap.get(pvServiceInterfaceName);
62  			if (lvObject != null) {
63  				return lvObject;
64  			} else {
65  				return getServiceImplAndRegisterThisServiceImpl(pvServiceInterfaceName, lvServiceMap);
66  			}
67  		} else {
68  			lvServiceMap = new Hashtable();
69  			Object lvServiceImpl = getServiceImplAndRegisterThisServiceImpl(pvServiceInterfaceName, lvServiceMap);
70  			services.put(pvKey, lvServiceMap);
71  			return lvServiceImpl;
72  		}
73  	}
74  	
75  	private Object getServiceImplAndRegisterThisServiceImpl(final String pvServiceInterfaceName, final Map pvServiceMap) throws Exception {
76  		String lvServiceImplName = getRegisterServiceByServiceInterfaceName(pvServiceInterfaceName);
77  		if (lvServiceImplName == null) {
78  			throw new InvocationException("With the name: " + pvServiceInterfaceName + " is no service register.");
79  		} else {
80  			Object lvServiceImpl = getServiceCreator().createService(pvServiceInterfaceName, lvServiceImplName);
81  			pvServiceMap.put(pvServiceInterfaceName, lvServiceImpl);
82  			return lvServiceImpl;
83  		}
84  	}
85  
86  
87  	/**
88  	 * Remove the service from the container.
89  	 * 
90  	 * @param pvKey Is the key in a map.
91  	 * @param pvServiceInterfaceName Is the key for the service impl in a map.
92  	 */
93  	public void removeService(Object pvKey, String pvServiceInterfaceName) {
94  		Map lvServiceMap = (Map) services.get(pvKey);
95  		if (lvServiceMap != null) {
96  			lvServiceMap.remove(pvServiceInterfaceName);
97  			if (lvServiceMap.size() == 0) {
98  				services.remove(pvKey);
99  			}
100 		}
101 	}
102 
103 	/**
104 	 * Remove all service by a key.
105 	 * 
106 	 * @param pvKey The key to removed services.
107 	 */
108 	public void removeAllServices(Object pvKey) {
109 		services.remove(pvKey);	
110 	}
111 	
112 	/**
113 	 * Get the size of services for a key.
114 	 * @param pvKey search key
115 	 * @return size of services for a key
116 	 */
117 	public int getServiceSize(Object pvKey) {
118 		Map lvServiceMap = (Map) services.get(pvKey);
119 		if (lvServiceMap != null) {
120 			return lvServiceMap.size();
121 		} else {
122 			return 0;
123 		}		
124 	}
125 
126 	/**
127 	 * Size of services in the container.
128 	 * @return Size of services.
129 	 */
130 	public int getKeySize() {
131 		return services.size();
132 	}
133 
134 
135 
136 }