KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > de > webman > acl > resolver > ResolverFactory


1 package de.webman.acl.resolver;
2
3 import java.util.Enumeration JavaDoc;
4 import java.util.Hashtable JavaDoc;
5 import com.teamkonzept.lib.ConfigurationManager;
6 import com.teamkonzept.lib.TKException;
7 import de.webman.acl.Login;
8
9 /**
10  * Simple factory for resolver objects. The resolver object is created
11  * and cached the first time it is requested. Thus, subsequent requests
12  * are served by the cache.
13  * <P>
14  * The factory is free to choose the <CODE>Resolver</CODE> implementation.
15  * At this time, only <CODE>SequentialResolver</CODE> is used.
16  *
17  * @version 1.0
18  * @since 1.0
19  * @author &copy; 2001 Webman AG
20  */

21 public class ResolverFactory
22 {
23
24     // $Header: /cvsroot/webman-cms/source/webman/de/webman/acl/resolver/ResolverFactory.java,v 1.1 2001/08/20 08:25:09 mischa Exp $
25

26     // Constants
27

28     /**
29      * Singleton instance.
30      */

31     private static ResolverFactory SINGLETON = null;
32
33
34     // Attributes
35

36     /**
37      * Internal sequential resolver cache.
38      */

39     private Hashtable JavaDoc sequentials = null;
40
41     /**
42      * Internal sequential resolver cache.
43      */

44     private Hashtable JavaDoc generics = null;
45
46
47     // Constructors
48

49     /**
50      * Inhibits instantiation from outside.
51      */

52     private ResolverFactory ()
53     {
54         // Create different caches for both kinds of resolvers.
55
this.sequentials = new Hashtable JavaDoc();
56         this.generics = new Hashtable JavaDoc();
57     }
58
59
60     // Instance
61

62     /**
63      * Returns the singleton instance of the factory.
64      *
65      * @return the singleton instance of the factory.
66      */

67     public static synchronized final ResolverFactory getInstance ()
68     {
69         if (SINGLETON == null)
70         {
71             SINGLETON = new ResolverFactory();
72         }
73
74         return SINGLETON;
75     }
76
77
78     // Resolver and Checker access
79

80     /**
81      * Returns a resolver for the given login object.
82      *
83      * @param login the login object.
84      * @return a resolver for the given login object.
85      * @exception com.teamkonzept.lib.TKException if an error occured during resolver creation.
86      */

87     public final Resolver getResolver (Login login)
88         throws TKException
89     {
90         // Cache lookup.
91
Resolver resolver = (Resolver) sequentials.get(login.getID());
92
93         if (resolver == null)
94         {
95             // Create sequential resolver.
96
resolver = new SequentialResolver(login);
97
98             // Configure sequential resolver.
99
resolver.configurationChanged();
100
101             // Register sequential resolver.
102
register(resolver);
103
104             // Cache sequential resolver.
105
sequentials.put(login.getID(), resolver);
106         }
107
108         return resolver;
109     }
110
111 // Cascading resolver access
112

113     /**
114      * Returns an additional resolver for the requesting resolver.
115      *
116      * @param requester the requesting resolver.
117      * @return an additional resolver for the requesting resolver.
118      * @exception com.teamkonzept.lib.TKException if an error occured during resolver creation.
119      */

120     protected final Resolver getResolver (Resolver requester)
121         throws TKException
122     {
123         // Cache lookup.
124
Resolver resolver = (Resolver) generics.get(requester.getLogin().getID());
125
126         if (resolver == null)
127         {
128             // Create generic resolver.
129
resolver = new GenericResolver(requester.getLogin());
130
131             // Configure generic resolver.
132
resolver.configurationChanged();
133
134             // Register generic resolver.
135
register(resolver);
136
137             // Cache generic resolver.
138
generics.put(requester.getLogin().getID(), resolver);
139         }
140
141         return resolver;
142     }
143
144
145     /**
146      * Returns a checker for the given login object.
147      *
148      * @param login the login object.
149      * @return a checker for the given login object.
150      * @exception com.teamkonzept.lib.TKException if an error occured during resolver creation.
151      */

152     public final Checker getChecker (Login login)
153         throws TKException
154     {
155         return (Checker) getResolver(login);
156     }
157
158     /**
159      * Removes the resolver for the given login object from the cache.
160      *
161      * @param login the login object.
162      */

163     public final void removeResolver (Login login)
164     {
165         // Remove sequential resolver from cache and deregister it.
166
deregister((Resolver) sequentials.remove(login.getID()));
167
168         // Remove generic resolver from cache and deregister it.
169
deregister((Resolver) generics.remove(login.getID()));
170     }
171
172     /**
173      * Removes all resolvers from the cache.
174      */

175     public final void removeResolvers ()
176     {
177         // Get all sequential resolvers.
178
Enumeration JavaDoc iterator = sequentials.elements();
179
180         // Deregister all sequential resolvers.
181
while (iterator.hasMoreElements())
182         {
183             deregister((Resolver) iterator.nextElement());
184         }
185
186         // Clear sequential resolver cache.
187
sequentials.clear();
188
189         // Get all generic resolvers.
190
iterator = generics.elements();
191
192         // Deregister all generic resolvers.
193
while (iterator.hasMoreElements())
194         {
195             deregister((Resolver) iterator.nextElement());
196         }
197
198         // Clear generic resolver cache.
199
generics.clear();
200     }
201     
202
203     // Convenvience methods
204

205     /**
206      * Registers the given resolver with the configuration manager.
207      *
208      * @param resolver the resolver.
209      */

210     private void register (Resolver resolver)
211     {
212         ConfigurationManager.getInstance()
213                             .registerConfigurationListener(resolver,
214                                                            Resolver.PROPERTY_GROUP_NAME);
215     }
216
217     /**
218      * Deregisters the given resolver with the configuration manager.
219      *
220      * @param resolver the resolver.
221      */

222     private void deregister (Resolver resolver)
223     {
224         ConfigurationManager.getInstance()
225                             .deregisterConfigurationListener(resolver,
226                                                              Resolver.PROPERTY_GROUP_NAME);
227     }
228
229 }
230
Popular Tags