2150b43a653f05d2ad5cc5946ed7af2ea3407432
[utils] / security / impl / src / main / java / org / wamblee / usermgt / jpa / JpaGroupSet.java
1 /*
2  * Copyright 2005-2010 the original author or authors.
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.wamblee.usermgt.jpa;
17
18 import java.util.List;
19 import java.util.Set;
20 import java.util.TreeSet;
21
22 import javax.persistence.EntityManager;
23 import javax.persistence.TypedQuery;
24
25 import org.wamblee.persistence.JpaMergeSupport;
26 import org.wamblee.usermgt.Group;
27 import org.wamblee.usermgt.GroupSet;
28
29 /**
30  * Group set backed by the database.
31  * 
32  * @author Erik Brakkee
33  */
34 public class JpaGroupSet implements GroupSet {
35
36     private EntityManager em;
37
38     public JpaGroupSet(EntityManager aEm) {
39         em = aEm;
40     }
41
42     @Override
43     public boolean add(Group aGroup) {
44         assert aGroup.getPrimaryKey() == null;
45         if (contains(aGroup)) {
46             return false;
47         }
48         em.persist(aGroup);
49         return true;
50     }
51
52     @Override
53     public boolean contains(Group aGroup) {
54         return find(aGroup.getName()) != null;
55     }
56
57     @Override
58     public Group find(String aName) {
59         TypedQuery<Group> query = em.createNamedQuery(Group.QUERY_FIND_BY_NAME,
60             Group.class);
61         query.setParameter(Group.NAME_PARAM, aName);
62         List<Group> groups = query.getResultList();
63         if (groups.size() > 1) {
64             throw new RuntimeException(
65                 "More than one group with the same name '" + aName + "'");
66         }
67
68         if (groups.size() == 0) {
69             return null;
70         }
71         return groups.get(0);
72     }
73
74     @Override
75     public void groupModified(Group aGroup) {
76         assert aGroup.getPrimaryKey() != null;
77         Group merged = em.merge(aGroup);
78         // Need to flush so that version of the merged instance is updated so we
79         // can use
80         // the updated version in the original group passed in. That allows the
81         // same
82         // group object to continue to be used as a detached object.
83         em.flush();
84         JpaMergeSupport.merge(merged, aGroup);
85     }
86
87     @Override
88     public Set<Group> list() {
89         List<Group> groups = em.createNamedQuery(Group.QUERY_ALL_GROUPS,
90             Group.class).getResultList();
91         Set<Group> res = new TreeSet<Group>(groups);
92         return res;
93     }
94
95     @Override
96     public boolean remove(Group aGroup) {
97         Group group = find(aGroup.getName());
98         if (group == null) {
99             return false;
100         }
101         em.remove(group);
102         return true;
103     }
104
105     @Override
106     public int size() {
107         Long res = (Long) em.createNamedQuery(Group.QUERY_COUNT_GROUPS)
108             .getSingleResult();
109         return res.intValue();
110     }
111 }