KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > outerj > daisy > repository > commonimpl > user > UserCache


1 /*
2  * Copyright 2004 Outerthought bvba and Schaubroeck nv
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package org.outerj.daisy.repository.commonimpl.user;
17
18 import org.outerj.daisy.repository.user.User;
19 import org.outerj.daisy.repository.RepositoryListener;
20 import org.outerj.daisy.repository.RepositoryEventType;
21 import org.outerj.daisy.repository.RepositoryException;
22 import org.outerj.daisy.repository.DocumentVariantEventType;
23
24 import java.util.Map JavaDoc;
25 import java.util.HashMap JavaDoc;
26 import java.util.Collections JavaDoc;
27
28 public class UserCache implements RepositoryListener {
29     private Map JavaDoc users = Collections.synchronizedMap(new HashMap JavaDoc());
30     private Map JavaDoc usersByLogin = Collections.synchronizedMap(new HashMap JavaDoc());
31     private Map JavaDoc roles = Collections.synchronizedMap(new HashMap JavaDoc());
32     private Map JavaDoc rolesByName = Collections.synchronizedMap(new HashMap JavaDoc());
33     private org.outerj.daisy.repository.commonimpl.AuthenticatedUser systemUser;
34     private UserManagementStrategy userManagementStrategy;
35
36     public UserCache(UserManagementStrategy userManagementStrategy, org.outerj.daisy.repository.commonimpl.AuthenticatedUser systemUser) {
37         this.systemUser = systemUser;
38         this.userManagementStrategy = userManagementStrategy;
39     }
40
41     public UserImpl getUser(long userId) throws RepositoryException {
42         Long JavaDoc key = new Long JavaDoc(userId);
43         UserImpl user = (UserImpl)users.get(key);
44         if (user == null) {
45             user = userManagementStrategy.getUser(userId, systemUser);
46             user.makeReadOnly();
47             synchronized (this) {
48                 users.put(key, user);
49                 usersByLogin.put(user.getLogin(), user);
50             }
51         }
52         return user;
53     }
54
55     public UserImpl getUser(String JavaDoc login) throws RepositoryException {
56         UserImpl user = (UserImpl)usersByLogin.get(login);
57         if (user == null) {
58             user = userManagementStrategy.getUser(login, systemUser);
59             user.makeReadOnly();
60             synchronized (this) {
61                 users.put(new Long JavaDoc(user.getId()), user);
62                 usersByLogin.put(user.getLogin(), user);
63             }
64         }
65         return user;
66     }
67
68     public RoleImpl getRole(long roleId) throws RepositoryException {
69         Long JavaDoc key = new Long JavaDoc(roleId);
70         RoleImpl role = (RoleImpl)roles.get(key);
71         if (role == null) {
72             role = userManagementStrategy.getRole(roleId, systemUser);
73             role.makeReadOnly();
74             synchronized (this) {
75                 roles.put(key, role);
76                 rolesByName.put(role.getName(), role);
77             }
78         }
79         return role;
80     }
81
82     public RoleImpl getRole(String JavaDoc roleName) throws RepositoryException {
83         RoleImpl role = (RoleImpl)rolesByName.get(roleName);
84         if (role == null) {
85             role = userManagementStrategy.getRole(roleName, systemUser);
86             role.makeReadOnly();
87             synchronized (this) {
88                 roles.put(new Long JavaDoc(role.getId()), role);
89                 rolesByName.put(roleName, role);
90             }
91         }
92         return role;
93     }
94
95     public void repositoryEvent(RepositoryEventType eventType, long id, long updateCount) {
96         if (eventType == RepositoryEventType.USER_UPDATED || eventType == RepositoryEventType.USER_DELETED) {
97             synchronized (this) {
98                 User user = (User)users.get(new Long JavaDoc(id));
99                 if (user != null && user.getUpdateCount() == updateCount)
100                     return;
101                 if (user != null) {
102                     users.remove(new Long JavaDoc(id));
103                     usersByLogin.remove(user.getLogin());
104                 }
105             }
106         } else if (eventType == RepositoryEventType.ROLE_UPDATED || eventType == RepositoryEventType.ROLE_DELETED) {
107             synchronized (this) {
108                 RoleImpl role = (RoleImpl)roles.get(new Long JavaDoc(id));
109                 if (role != null && role.getUpdateCount() == updateCount)
110                     return;
111
112                 // roles can belong to various users, just clear entire user cache
113
users.clear();
114                 usersByLogin.clear();
115                 if (role != null) {
116                     roles.remove(new Long JavaDoc(role.getId()));
117                     rolesByName.remove(role.getName());
118                 }
119             }
120         }
121         // Note: upon role or user creation, we don't need to do anything.
122
}
123
124     public void variantEvent(DocumentVariantEventType eventType, long documentId, long branchId, long languageId, long updateCount) {
125         // do nothing
126
}
127 }
128
Popular Tags