Project

General

Profile

Download (9.07 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.api.service;
10

    
11
import java.util.ArrayList;
12
import java.util.HashMap;
13
import java.util.Iterator;
14
import java.util.List;
15
import java.util.Map;
16
import java.util.Set;
17
import java.util.UUID;
18

    
19
import org.hibernate.criterion.Criterion;
20
import org.springframework.beans.factory.annotation.Autowired;
21
import org.springframework.security.access.prepost.PreAuthorize;
22
import org.springframework.security.core.GrantedAuthority;
23
import org.springframework.stereotype.Service;
24
import org.springframework.transaction.annotation.Transactional;
25
import org.springframework.util.Assert;
26

    
27
import eu.etaxonomy.cdm.model.permission.GrantedAuthorityImpl;
28
import eu.etaxonomy.cdm.model.permission.Group;
29
import eu.etaxonomy.cdm.model.permission.User;
30
import eu.etaxonomy.cdm.persistence.dao.permission.IGrantedAuthorityDao;
31
import eu.etaxonomy.cdm.persistence.dao.permission.IGroupDao;
32
import eu.etaxonomy.cdm.persistence.dao.permission.IUserDao;
33
import eu.etaxonomy.cdm.persistence.dto.MergeResult;
34
import eu.etaxonomy.cdm.persistence.query.MatchMode;
35
import eu.etaxonomy.cdm.persistence.query.OrderHint;
36

    
37
/**
38
 * @author n.hoffmann
39
 * @since Mar 9, 2011
40
 */
41
@Service
42
@Transactional(readOnly = true)
43
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER_MANAGER')")
44
public class GroupServiceImpl extends ServiceBase<Group,IGroupDao> implements IGroupService {
45

    
46
    private IUserDao userDao;
47

    
48
    private IGrantedAuthorityDao grantedAuthorityDao;
49

    
50
    @Override
51
    public List<String> findAllGroups() {
52
        return dao.listNames(null,null);
53
    }
54

    
55
    @Override
56
    public List<String> findUsersInGroup(String groupName) {
57
        Assert.hasText(groupName, "Parameter 'groupName' must not be empty.");
58
        Group group = dao.findGroupByName(groupName);
59

    
60
        List<String> users = dao.listMembers(group, null, null);
61

    
62
        return users;
63
    }
64

    
65
    @Override
66
    public boolean groupExists(String groupName) {
67
        Assert.hasText(groupName, "Parameter 'groupName' must not be empty.");
68
        Group group = dao.findGroupByName(groupName);
69
        return group != null;
70
    }
71

    
72
    @Override
73
    public Group findGroup(String groupName) {
74
        Assert.hasText(groupName, "Parameter 'groupname' must not be empty.");
75
        Group group = dao.findGroupByName(groupName);
76
        return group;
77
    }
78

    
79
    @Override
80
    @Transactional(readOnly=false)
81
    public void deleteGroup(String groupUUID) {
82
        Assert.notNull(groupUUID, "Parameter 'groupUUID' must not be empty.");
83

    
84
        Group group = dao.findByUuid(UUID.fromString(groupUUID));
85
        Iterator<User> it = group.getMembers().iterator();
86
        group.getMembers().clear();
87
//        while (it.hasNext()){
88
//            it.remove();
89
//        }
90
        dao.delete(group);
91

    
92
    }
93

    
94
    @Override
95
    @Transactional(readOnly=false)
96
    public void renameGroup(String oldName, String newName) {
97
        Assert.hasText(oldName, "Parameter 'oldName' must not be empty.");
98
        Assert.hasText(newName, "Parameter 'newName' must not be empty.");
99

    
100
        Group group = dao.findGroupByName(oldName);
101

    
102
        group.setName(newName);
103
        dao.update(group);
104
    }
105

    
106
    @Override
107
    @Transactional(readOnly=false)
108
    public void addUserToGroup(String username, String groupName) {
109
        Assert.hasText(username, "Parameter 'username' must not be empty.");
110
        Assert.hasText(groupName, "Parameter 'groupName' must not be empty.");
111

    
112
        Group group = dao.findGroupByName(groupName);
113
        User user = userDao.findUserByUsername(username);
114

    
115
        if(group != null && user != null){
116
            if(group.addMember(user)) {
117
                dao.update(group);
118
            }
119
        }
120
    }
121

    
122
    @Override
123
    @Transactional(readOnly=false)
124
    public void removeUserFromGroup(String username, String groupName) {
125
        Assert.hasText(username, "Parameter 'username' must not be empty.");
126
        Assert.hasText(groupName, "Parameter 'groupName' must not be empty.");
127

    
128
        Group group = dao.findGroupByName(groupName);
129
        User user = userDao.findUserByUsername(username);
130

    
131
        if(group != null && user != null){
132
            if(group.removeMember(user)){
133
                dao.update(group);
134
            }
135
        }
136
    }
137

    
138
    @Override
139
    public List<GrantedAuthority> findGroupAuthorities(String groupName) {
140
        Assert.hasText(groupName, "Parameter 'groupName' must not be empty.");
141
        Group group = dao.findGroupByName(groupName);
142

    
143
        if (group != null){
144
            return new ArrayList<>(group.getGrantedAuthorities());
145
        }
146

    
147
        return new ArrayList<>();
148
    }
149

    
150
    @Override
151
    @Transactional(readOnly=false)
152
    public void addGroupAuthority(String groupName, GrantedAuthority authority) {
153
        Assert.hasText(groupName, "Parameter 'groupName' must not be empty.");
154
        Assert.notNull(authority, "Parameter 'authority' must not be empty.");
155

    
156
        Group group = dao.findGroupByName(groupName);
157

    
158
        if (group != null){
159
            if(group.getGrantedAuthorities().add(authority)){
160
                dao.update(group);
161
            }
162
        }
163
    }
164

    
165
    @Override
166
    @Transactional(readOnly=false)
167
    public void removeGroupAuthority(String groupName,
168
            GrantedAuthority authority) {
169
        Assert.hasText(groupName, "Parameter 'groupName' must not be empty.");
170
        Assert.notNull(authority, "Parameter 'authority' must not be empty.");
171

    
172
        Group group = dao.findGroupByName(groupName);
173

    
174
        if(group != null){
175
            if(group.getGrantedAuthorities().remove(authority)) {
176
                dao.update(group);
177
            }
178
        }
179
    }
180

    
181
    @Override
182
    @Autowired
183
    protected void setDao(IGroupDao dao) {
184
        this.dao = dao;
185
    }
186

    
187
    @Autowired
188
    public void setUserDao(IUserDao userDao){
189
        this.userDao = userDao;
190
    }
191

    
192
    @Autowired
193
    public void setGrantedAuthorityDao(IGrantedAuthorityDao grantedAuthorityDao){
194
        this.grantedAuthorityDao = grantedAuthorityDao;
195
    }
196

    
197

    
198
    @Override
199
    @Transactional(readOnly = true)
200
    public List<Group> listByName(String queryString,MatchMode matchmode, List<Criterion> criteria, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
201
         long numberOfResults = dao.countByName(queryString, matchmode, criteria);
202

    
203
         List<Group> results = new ArrayList<>();
204
         if(numberOfResults > 0) {
205
                results = dao.findByName(queryString, matchmode, criteria, pageSize, pageNumber, orderHints, propertyPaths);
206
         }
207
         return results;
208
    }
209

    
210
    @Override
211
    @Transactional(readOnly=false)
212
    public void createGroup(String groupName, List<GrantedAuthority> authorities) {
213
        Assert.hasText(groupName, "Parameter 'groupName' must not be empty.");
214
        Assert.notNull(authorities, "Parameter 'authorities' must not be empty.");
215

    
216
        Group newGroup = Group.NewInstance(groupName);
217
        for (GrantedAuthority grantedAuthority: authorities){
218
            newGroup.addGrantedAuthority(grantedAuthority);
219
        }
220
        saveGroup(newGroup);
221
    }
222

    
223
    @Override
224
    @Transactional(readOnly=false)
225
    @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER_MANAGER')")
226
    public UUID saveGroup(Group group) {
227
        return dao.save(group).getUuid();
228
    }
229

    
230
    @Override
231
    @Transactional(readOnly=false)
232
    public DeleteResult delete(UUID groupUUID ){
233

    
234
       String groupUUIDString = groupUUID.toString();
235
       Group group = dao.findByUuid(groupUUID);
236
       //org.springframework.security.provisioning.GroupManager#deleteGroup needs a string argument
237
       this.deleteGroup(groupUUIDString);
238
       DeleteResult result = new DeleteResult();
239
       result.addDeletedObject(group);
240
        //there is no feedback from the deleteGroup method...
241
        return result;
242
    }
243

    
244
    @Override
245
    @Transactional(readOnly = false)
246
    public MergeResult<Group> merge(Group newInstance, boolean returnTransientEntity) {
247

    
248
        Set<GrantedAuthority> newAuthorities = newInstance.getGrantedAuthorities();
249
        Map<GrantedAuthority, GrantedAuthority> mapOfAlreadyExistingAuthorities = new HashMap<GrantedAuthority, GrantedAuthority>();
250
        GrantedAuthorityImpl alreadyInDB;
251
        for (GrantedAuthority authority: newAuthorities){
252
            if (authority instanceof GrantedAuthorityImpl){
253
                alreadyInDB = grantedAuthorityDao.findAuthorityString(authority.getAuthority());
254
                if (alreadyInDB != null){
255
                    if (alreadyInDB.getId() != ((GrantedAuthorityImpl)authority).getId()){
256
                        mapOfAlreadyExistingAuthorities.put(authority,alreadyInDB);
257
                    }
258
                }
259
            }
260
        }
261
        for (GrantedAuthority authority : mapOfAlreadyExistingAuthorities.keySet()){
262
            newInstance.removeGrantedAuthority(authority);
263
            newInstance.addGrantedAuthority(mapOfAlreadyExistingAuthorities.get(authority));
264
        }
265

    
266
        return dao.merge(newInstance, returnTransientEntity);
267
    }
268
}
(18-18/95)