1 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 ; 25 import java.util.HashMap ; 26 import java.util.Collections ; 27 28 public class UserCache implements RepositoryListener { 29 private Map users = Collections.synchronizedMap(new HashMap ()); 30 private Map usersByLogin = Collections.synchronizedMap(new HashMap ()); 31 private Map roles = Collections.synchronizedMap(new HashMap ()); 32 private Map rolesByName = Collections.synchronizedMap(new HashMap ()); 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 key = new Long (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 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 (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 key = new Long (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 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 (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 (id)); 99 if (user != null && user.getUpdateCount() == updateCount) 100 return; 101 if (user != null) { 102 users.remove(new Long (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 (id)); 109 if (role != null && role.getUpdateCount() == updateCount) 110 return; 111 112 users.clear(); 114 usersByLogin.clear(); 115 if (role != null) { 116 roles.remove(new Long (role.getId())); 117 rolesByName.remove(role.getName()); 118 } 119 } 120 } 121 } 123 124 public void variantEvent(DocumentVariantEventType eventType, long documentId, long branchId, long languageId, long updateCount) { 125 } 127 } 128 | Popular Tags |