2 * Copyright 2005-2010 the original author or authors.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org.wamblee.security.authentication.jpa;
18 import java.util.List;
20 import java.util.TreeSet;
22 import javax.persistence.EntityManager;
23 import javax.persistence.NoResultException;
24 import javax.persistence.TypedQuery;
26 import org.wamblee.cache.Cache;
27 import org.wamblee.persistence.JpaMergeSupport;
28 import org.wamblee.security.authentication.AbstractUserSet;
29 import org.wamblee.security.authentication.Group;
30 import org.wamblee.security.authentication.MessageDigester;
31 import org.wamblee.security.authentication.NameValidator;
32 import org.wamblee.security.authentication.User;
35 * User set backed by the database.
37 * @author Erik Brakkee
39 public class JpaUserSet extends AbstractUserSet {
42 * Cache of users. Every user in the cache has its password validator and
45 private Cache<String, User> cache;
47 private EntityManager entityManager;
50 * Constructs a user set backed by the database.
55 public JpaUserSet(Cache<String, User> aCache,
56 NameValidator aPasswordValidator, MessageDigester aPasswordEncoder,
57 EntityManager aEntityManager) {
58 super(aPasswordValidator, aPasswordEncoder);
60 entityManager = aEntityManager;
64 public void userModified(User aUser) {
65 assert aUser.getPrimaryKey() != null;
66 User merged = entityManager.merge(aUser);
67 // Need to flush the entity manager to make sure the version is updated.
68 entityManager.flush();
69 JpaMergeSupport.merge(merged, aUser);
70 cache.remove(aUser.getName());
71 setPasswordInfo(aUser);
72 cache.put(aUser.getName(), new User(aUser));
76 public User find(String aName) {
77 User user = cache.get(aName);
83 TypedQuery<User> query = entityManager.createNamedQuery(
84 User.QUERY_FIND_BY_NAME, User.class);
85 query.setParameter(User.NAME_PARAM, aName);
87 user = query.getSingleResult();
88 setPasswordInfo(user);
89 cache.put(aName, user);
91 } catch (NoResultException e) {
97 public boolean contains(User aUser) {
98 return find(aUser.getName()) != null;
102 public boolean add(User aUser) {
103 assert aUser.getPrimaryKey() == null;
105 if (contains(aUser)) {
109 entityManager.persist(aUser);
110 entityManager.flush(); // to make sure the version is updated.
111 setPasswordInfo(aUser);
112 cache.put(aUser.getName(), aUser);
118 public boolean remove(User aUser) {
119 if (!contains(aUser)) {
123 User user = entityManager.merge(aUser);
124 entityManager.remove(user);
125 cache.remove(aUser.getName());
131 public Set<User> list() {
132 Set<User> users = new TreeSet<User>();
133 List<User> list = entityManager.createNamedQuery(User.QUERY_ALL_USERS,
134 User.class).getResultList();
136 for (User user : list) {
137 setPasswordInfo(user);
145 public Set<User> list(Group aGroup) {
146 Set<User> users = new TreeSet<User>();
147 TypedQuery<User> query = entityManager.createNamedQuery(
148 User.QUERY_FIND_BY_GROUP_NAME, User.class);
149 query.setParameter(User.NAME_PARAM, aGroup.getName());
151 List<User> list = query.getResultList();
153 for (User user : users) {
154 setPasswordInfo(user);
162 Long result = entityManager.createNamedQuery(User.QUERY_COUNT_USERS,
163 Long.class).getSingleResult();
164 return result.intValue();
168 public void clearCache() {