2 * Copyright 2005 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.usermgt.hibernate;
18 import org.hibernate.SessionFactory;
20 import org.springframework.orm.hibernate3.HibernateTemplate;
22 import org.wamblee.cache.Cache;
24 import org.wamblee.persistence.hibernate.HibernateSupport;
26 import org.wamblee.security.encryption.MessageDigester;
28 import org.wamblee.usermgt.AbstractUserSet;
29 import org.wamblee.usermgt.Group;
30 import org.wamblee.usermgt.NameValidator;
31 import org.wamblee.usermgt.User;
33 import java.util.List;
35 import java.util.TreeSet;
39 * User set backed by the database.
41 * @author Erik Brakkee
43 public class HibernateUserSet extends AbstractUserSet {
47 private static final String QUERY_FIND_BY_NAME = "findUserByName";
52 private static final String QUERY_FIND_BY_GROUP_NAME = "findUserByGroupName";
57 private static final String PARAM_NAME = "name";
62 private static final String QUERY_COUNT_USERS = "countUsers";
65 * Cache of users. Every user in the cache has its password
66 * validator and encoder set.
68 private Cache<String, User> cache;
71 * Spring hibernate support.
73 private HibernateSupport hibernateSupport;
76 * Constructs a user set backed by the database.
77 * @param aCache User cache to use.
79 public HibernateUserSet(Cache<String, User> aCache,
80 NameValidator aPasswordValidator, MessageDigester aPasswordEncoder) {
81 super(aPasswordValidator, aPasswordEncoder);
83 hibernateSupport = new HibernateSupport();
87 * Sets the session factory.
89 * @param aFactory Session factory.
91 public void setSessionFactory(SessionFactory aFactory) {
92 hibernateSupport.setSessionFactory(aFactory);
96 * Gets the hibernate template.
98 * @return Hibernate template.
100 private HibernateTemplate getHibernateTemplate() {
101 return hibernateSupport.getHibernateTemplate();
107 * @see org.wamblee.usermgt.UserSet#userModified(org.wamblee.usermgt.User)
112 * @param aUser DOCUMENT ME!
114 public void userModified(User aUser) {
115 assert aUser.getPrimaryKey() != null;
116 hibernateSupport.merge(aUser);
117 cache.remove(aUser.getName());
118 setPasswordInfo(aUser);
119 cache.put(aUser.getName(), new User(aUser));
125 * @see org.wamblee.usermgt.UserSet#find(java.lang.String)
130 * @param aName DOCUMENT ME!
132 * @return DOCUMENT ME!
134 * @throws RuntimeException DOCUMENT ME!
136 public User find(String aName) {
137 User user = cache.get(aName);
143 List result = getHibernateTemplate()
144 .findByNamedQueryAndNamedParam(QUERY_FIND_BY_NAME, PARAM_NAME, aName);
146 if (result.size() > 1) {
147 throw new RuntimeException(
148 "Implementation problem, more than one user with the same name!");
151 if (result.size() == 0) {
155 user = (User) result.get(0);
156 setPasswordInfo(user);
157 cache.put(aName, user);
159 return new User(user);
165 * @see org.wamblee.usermgt.UserSet#contains(org.wamblee.usermgt.User)
170 * @param aUser DOCUMENT ME!
172 * @return DOCUMENT ME!
174 public boolean contains(User aUser) {
175 return find(aUser.getName()) != null;
181 * @see org.wamblee.usermgt.UserSet#add(org.wamblee.usermgt.User)
186 * @param aUser DOCUMENT ME!
188 * @return DOCUMENT ME!
190 public boolean add(User aUser) {
191 assert aUser.getPrimaryKey() == null;
193 if (contains(aUser)) {
197 getHibernateTemplate().saveOrUpdate(aUser);
198 setPasswordInfo(aUser);
199 cache.put(aUser.getName(), aUser);
207 * @see org.wamblee.usermgt.UserSet#remove(org.wamblee.usermgt.User)
212 * @param aUser DOCUMENT ME!
214 * @return DOCUMENT ME!
216 public boolean remove(User aUser) {
217 assert aUser.getPrimaryKey() != null;
219 if (!contains(aUser)) {
223 User user = (User) getHibernateTemplate().merge(aUser);
224 getHibernateTemplate().delete(user);
225 aUser.setPersistedVersion(-1);
226 aUser.setPrimaryKey(null);
227 cache.remove(aUser.getName());
235 * @see org.wamblee.usermgt.UserSet#list()
240 * @return DOCUMENT ME!
242 public Set<User> list() {
243 Set<User> users = new TreeSet<User>();
244 List<User> list = getHibernateTemplate().loadAll(User.class);
246 for (User user : list) {
247 setPasswordInfo(user);
248 users.add(new User(user));
257 * @see org.wamblee.usermgt.UserSet#list(org.wamblee.usermgt.Group)
262 * @param aGroup DOCUMENT ME!
264 * @return DOCUMENT ME!
266 public Set<User> list(Group aGroup) {
267 Set<User> users = new TreeSet<User>();
268 List<User> list = getHibernateTemplate()
269 .findByNamedQueryAndNamedParam(QUERY_FIND_BY_GROUP_NAME,
270 PARAM_NAME, aGroup.getName());
272 for (User user : list) {
273 setPasswordInfo(user);
274 users.add(new User(user));
281 * @see org.wamblee.usermgt.UserSet#size()
286 * @return DOCUMENT ME!
289 Long result = (Long) getHibernateTemplate()
290 .findByNamedQuery(QUERY_COUNT_USERS).get(0);
292 return result.intValue();