1 package org.itracker.persistence.dao;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.Collection;
6 import java.util.HashMap;
7 import java.util.HashSet;
8 import java.util.Iterator;
9 import java.util.List;
10 import java.util.Map;
11 import java.util.Set;
12
13 import org.hibernate.Criteria;
14 import org.hibernate.HibernateException;
15 import org.hibernate.Query;
16 import org.hibernate.criterion.DetachedCriteria;
17 import org.hibernate.criterion.Expression;
18 import org.hibernate.criterion.Order;
19 import org.hibernate.criterion.Restrictions;
20 import org.itracker.model.Permission;
21 import org.itracker.model.PermissionType;
22 import org.itracker.model.User;
23
24
25
26
27 public class UserDAOImpl extends BaseHibernateDAOImpl<User> implements UserDAO {
28
29 public User findByPrimaryKey(Integer userId) {
30 User user;
31
32 try {
33 user = (User)getSession().get(User.class, userId);
34 } catch (HibernateException ex) {
35 throw convertHibernateAccessException(ex);
36 }
37 return user;
38 }
39
40 public User findByLogin(String login) {
41 User user;
42
43 try {
44 Query query = getSession().getNamedQuery("UserByLoginQuery");
45 query.setString("login", login);
46 user = (User)query.uniqueResult();
47 } catch (HibernateException ex) {
48 throw convertHibernateAccessException(ex);
49 }
50 return user;
51 }
52
53 @SuppressWarnings("unchecked")
54 public List<User> findAll() {
55 List<User> users;
56
57 try {
58 Query query = getSession().getNamedQuery("UsersAllQuery");
59 users = query.list();
60 } catch (HibernateException ex) {
61 throw convertHibernateAccessException(ex);
62 }
63 return users;
64 }
65
66 @SuppressWarnings("unchecked")
67 public List<User> findActive() {
68 List<User> users;
69
70 try {
71 Query query = getSession().getNamedQuery("UsersActiveQuery");
72 users = query.list();
73 } catch (HibernateException ex) {
74 throw convertHibernateAccessException(ex);
75 }
76 return users;
77 }
78
79 @SuppressWarnings("unchecked")
80 public List<User> findByStatus(int status) {
81 List<User> users;
82
83 try {
84 Query query = getSession().getNamedQuery("UsersByStatusQuery");
85 query.setInteger("userStatus", status);
86 users = query.list();
87 } catch (HibernateException ex) {
88 throw convertHibernateAccessException(ex);
89 }
90 return users;
91 }
92
93 @SuppressWarnings("unchecked")
94 public List<User> findSuperUsers() {
95 List<User> users;
96
97 try {
98 Query query = getSession().getNamedQuery("UsersSuperQuery");
99 users = query.list();
100 } catch (HibernateException ex) {
101 throw convertHibernateAccessException(ex);
102 }
103 return users;
104 }
105
106 @SuppressWarnings("unchecked")
107 public List<User> findByRegistrationType(int registrationType) {
108 List<User> users;
109
110 try {
111 Query query = getSession().getNamedQuery("UsersByRegistrationTypeQuery");
112 query.setInteger("registrationType", registrationType);
113 users = query.list();
114 } catch (HibernateException ex) {
115 throw convertHibernateAccessException(ex);
116 }
117 return users;
118 }
119
120
121
122
123
124
125
126
127
128
129
130 @SuppressWarnings("unchecked")
131 public Map<Integer, Set<PermissionType>> getUsersMapOfProjectsAndPermissionTypes(User user) {
132
133
134 final Map<Integer, Set<PermissionType>> permissionsByProjectId =
135 new HashMap<Integer, Set<PermissionType>>();
136
137 try {
138
139 User userBean = (User) getSession().load(User.class, user.getId());
140
141 Criteria criteria = getSession().createCriteria(Permission.class);
142 criteria.add( Expression.eq ("user" , userBean) );
143 criteria.addOrder( Order.asc( "project" ));
144
145 List<Permission> permissionsList = criteria.list();
146
147 for (int i = 0; i < permissionsList.size(); i++) {
148 Permission permission = permissionsList.get(i);
149
150
151 final Integer projectId = (permission.getProject() == null)
152 ? null : permission.getProject().getId();
153
154 Set<PermissionType> projectPermissions = permissionsByProjectId.get(projectId);
155
156 if (projectPermissions == null) {
157
158 projectPermissions = new HashSet<PermissionType>();
159 permissionsByProjectId.put(projectId, projectPermissions);
160 }
161
162 PermissionType permissionType = PermissionType.fromCode(permission.getPermissionType());
163 projectPermissions.add(permissionType);
164 }
165 } catch (HibernateException ex) {
166 throw convertHibernateAccessException(ex);
167 }
168 return permissionsByProjectId;
169 }
170
171 @SuppressWarnings("unchecked")
172 public List<User> findUsersForProjectByAllPermissionTypeList(Integer projectID, Integer[] permissionTypes) {
173
174 List<User> users = new ArrayList<User>();
175
176 try {
177
178 DetachedCriteria userCriteria = DetachedCriteria.forClass(User.class);
179 userCriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
180 DetachedCriteria permissionCriteria = userCriteria.createCriteria("permissions");
181 permissionCriteria.add(Restrictions.in("permissionType", permissionTypes));
182 permissionCriteria.add(Restrictions.eq("project.id", projectID));
183
184 List<User> userList = userCriteria.getExecutableCriteria(getSession()).list();
185
186 for (User user : userList) {
187 if( isSamePermission( user.getPermissions(), permissionTypes)) {
188 users.add(user);
189 }
190 }
191
192 } catch (HibernateException ex) {
193 throw convertHibernateAccessException(ex);
194 }
195
196 return users;
197
198 }
199
200 private boolean isSamePermission(Collection<Permission> permissions, Integer[] permissionTypes) {
201
202 boolean retVal = true;
203
204 if( permissions.size() != permissionTypes.length ) {
205 return false;
206 }
207
208 Iterator<Permission> permsIt = permissions.iterator();
209 while (permsIt.hasNext()) {
210
211 boolean found = false;
212 Permission permission = permsIt.next();
213
214
215 Iterator<Integer> pTypesIt = Arrays.asList(permissionTypes).iterator();
216 while (pTypesIt.hasNext()) {
217
218 if (pTypesIt.next().equals(permission.getPermissionType())) {
219 found = true;
220 break;
221 }
222 }
223
224 if( !found ) {
225 retVal = false;
226 break;
227 }
228
229 }
230
231 return retVal;
232
233 }
234
235 }