@Override public Map<String, List<String>> getAttributes() { if (updated != null) return updated.getAttributes(); return cached.getAttributes(); }
@Override public Long getCreatedTimestamp() { // get from cached always as it is immutable return cached.getCreatedTimestamp(); }
@Override public List<UserCredentialValueModel> getCredentialsDirectly() { if (updated != null) return updated.getCredentialsDirectly(); return cached.getCredentials(); }
private void removeUser(CachedUser cachedUser) { String realm = cachedUser.getRealm(); usernameLookup.remove(realm, cachedUser.getUsername()); if (cachedUser.getEmail() != null) { emailLookup.remove(realm, cachedUser.getEmail()); } }
@CacheEntriesEvicted public void userEvicted(CacheEntriesEvictedEvent<String, CachedUser> event) { for (CachedUser user : event.getEntries().values()) { removeUser(user); log.tracev("User evicted realm={0}, id={1}, username={2}", user.getRealm(), user.getId(), user.getUsername()); } }
@CacheEntryCreated public void userCreated(CacheEntryCreatedEvent<String, CachedUser> event) { if (!event.isPre()) { CachedUser user; // Try optimized version if available if (isNewInfinispan) { user = event.getValue(); } else { String userId = event.getKey(); user = event.getCache().get(userId); } if (user != null) { String realm = user.getRealm(); usernameLookup.put(realm, user.getUsername(), user.getId()); if (user.getEmail() != null) { emailLookup.put(realm, user.getEmail(), user.getId()); } log.tracev("User added realm={0}, id={1}, username={2}", realm, user.getId(), user.getUsername()); } } }
@Override public UserModel getUserByUsername(String username, RealmModel realm) { username = username.toLowerCase(); if (!cache.isEnabled()) return getDelegate().getUserByUsername(username, realm); if (realmInvalidations.contains(realm.getId())) { return getDelegate().getUserByUsername(username, realm); } CachedUser cached = cache.getCachedUserByUsername(realm.getId(), username); if (cached == null) { UserModel model = getDelegate().getUserByUsername(username, realm); if (model == null) return null; if (managedUsers.containsKey(model.getId())) return managedUsers.get(model.getId()); if (userInvalidations.containsKey(model.getId())) return model; cached = new CachedUser(realm, model); cache.addCachedUser(realm.getId(), cached); } else if (userInvalidations.containsKey(cached.getId())) { return getDelegate().getUserById(cached.getId(), realm); } else if (managedUsers.containsKey(cached.getId())) { return managedUsers.get(cached.getId()); } UserAdapter adapter = new UserAdapter(cached, this, session, realm); managedUsers.put(cached.getId(), adapter); return adapter; }
@Override public boolean isMemberOf(GroupModel group) { if (updated != null) return updated.isMemberOf(group); if (cached.getGroups().contains(group.getId())) return true; Set<GroupModel> roles = getGroups(); return KeycloakModelUtils.isMember(roles, group); }
@Override public String getFirstName() { if (updated != null) return updated.getFirstName(); return cached.getFirstName(); }
@Override public String getFederationLink() { if (updated != null) return updated.getFederationLink(); return cached.getFederationLink(); }
@Override public String getLastName() { if (updated != null) return updated.getLastName(); return cached.getLastName(); }
@Override public String getEmail() { if (updated != null) return updated.getEmail(); return cached.getEmail(); }
@Override public UserModel getUserById(String id, RealmModel realm) { if (!cache.isEnabled()) return getDelegate().getUserById(id, realm); if (isRegisteredForInvalidation(realm, id)) { return getDelegate().getUserById(id, realm); } CachedUser cached = cache.getCachedUser(realm.getId(), id); if (cached == null) { UserModel model = getDelegate().getUserById(id, realm); if (model == null) return null; if (managedUsers.containsKey(id)) return managedUsers.get(id); if (userInvalidations.containsKey(id)) return model; cached = new CachedUser(realm, model); cache.addCachedUser(realm.getId(), cached); } else if (managedUsers.containsKey(id)) { return managedUsers.get(id); } UserAdapter adapter = new UserAdapter(cached, this, session, realm); managedUsers.put(id, adapter); return adapter; }
@CacheEntryRemoved public void userRemoved(CacheEntryRemovedEvent<String, CachedUser> event) { if (event.isPre()) { CachedUser user = event.getValue(); if (user != null) { removeUser(user); log.tracev("User invalidated realm={0}, id={1}, username={2}", user.getRealm(), user.getId(), user.getUsername()); } } }
@Override public UserModel getUserByEmail(String email, RealmModel realm) { if (email == null) return null; email = email.toLowerCase(); if (!cache.isEnabled()) return getDelegate().getUserByEmail(email, realm); if (realmInvalidations.contains(realm.getId())) { return getDelegate().getUserByEmail(email, realm); } CachedUser cached = cache.getCachedUserByEmail(realm.getId(), email); if (cached == null) { UserModel model = getDelegate().getUserByEmail(email, realm); if (model == null) return null; if (userInvalidations.containsKey(model.getId())) return model; cached = new CachedUser(realm, model); cache.addCachedUser(realm.getId(), cached); } else if (userInvalidations.containsKey(cached.getId())) { return getDelegate().getUserByEmail(email, realm); } else if (managedUsers.containsKey(cached.getId())) { return managedUsers.get(cached.getId()); } UserAdapter adapter = new UserAdapter(cached, this, session, realm); managedUsers.put(cached.getId(), adapter); return adapter; }
@Override public String getId() { if (updated != null) return updated.getId(); return cached.getId(); }
@Override public Set<GroupModel> getGroups() { if (updated != null) return updated.getGroups(); Set<GroupModel> groups = new HashSet<GroupModel>(); for (String id : cached.getGroups()) { GroupModel groupModel = keycloakSession.realms().getGroupById(id, realm); if (groupModel == null) { // chance that role was removed, so just delete to persistence and get user invalidated getDelegateForUpdate(); return updated.getGroups(); } groups.add(groupModel); } return groups; }
@CacheEntryInvalidated public void userInvalidated(CacheEntryInvalidatedEvent<String, CachedUser> event) { if (event.isPre()) { CachedUser user = event.getValue(); if (user != null) { removeUser(user); log.tracev("User invalidated realm={0}, id={1}, username={2}", user.getRealm(), user.getId(), user.getUsername()); } } }
@Override public List<String> getAttribute(String name) { if (updated != null) return updated.getAttribute(name); List<String> result = cached.getAttributes().get(name); return (result == null) ? Collections.<String>emptyList() : result; }