merge for groups has to check for existing and changed authorities before merge the...
authorKatja Luther <k.luther@bgbm.org>
Thu, 2 Feb 2017 12:53:16 +0000 (13:53 +0100)
committerKatja Luther <k.luther@bgbm.org>
Thu, 2 Feb 2017 12:53:16 +0000 (13:53 +0100)
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/GroupServiceImpl.java

index 2b34547722e1ec5b15af325a5a1fb9726c4862e5..348cadbdaec34dbd5aecffcec5949ae866cedb06 100644 (file)
 package eu.etaxonomy.cdm.api.service;
 
 import java.util.ArrayList;
 package eu.etaxonomy.cdm.api.service;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.UUID;
 
 import org.hibernate.criterion.Criterion;
 import java.util.UUID;
 
 import org.hibernate.criterion.Criterion;
@@ -21,10 +24,13 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
 
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
 
+import eu.etaxonomy.cdm.model.common.GrantedAuthorityImpl;
 import eu.etaxonomy.cdm.model.common.Group;
 import eu.etaxonomy.cdm.model.common.User;
 import eu.etaxonomy.cdm.model.common.Group;
 import eu.etaxonomy.cdm.model.common.User;
+import eu.etaxonomy.cdm.persistence.dao.common.IGrantedAuthorityDao;
 import eu.etaxonomy.cdm.persistence.dao.common.IGroupDao;
 import eu.etaxonomy.cdm.persistence.dao.common.IUserDao;
 import eu.etaxonomy.cdm.persistence.dao.common.IGroupDao;
 import eu.etaxonomy.cdm.persistence.dao.common.IUserDao;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.cdm.persistence.query.MatchMode;
 import eu.etaxonomy.cdm.persistence.query.OrderHint;
 
 import eu.etaxonomy.cdm.persistence.query.MatchMode;
 import eu.etaxonomy.cdm.persistence.query.OrderHint;
 
@@ -39,6 +45,8 @@ public class GroupServiceImpl extends ServiceBase<Group,IGroupDao> implements IG
 
     protected IUserDao userDao;
 
 
     protected IUserDao userDao;
 
+    protected IGrantedAuthorityDao grantedAuthorityDao;
+
     @Override
     public List<String> findAllGroups() {
         return dao.listNames(null,null);
     @Override
     public List<String> findAllGroups() {
         return dao.listNames(null,null);
@@ -167,6 +175,12 @@ public class GroupServiceImpl extends ServiceBase<Group,IGroupDao> implements IG
         this.userDao = userDao;
     }
 
         this.userDao = userDao;
     }
 
+    @Autowired
+    public void setGrantedAuthorityDao(IGrantedAuthorityDao grantedAuthorityDao){
+        this.grantedAuthorityDao = grantedAuthorityDao;
+    }
+
+
     @Override
     @Transactional(readOnly = true)
     public List<Group> listByName(String queryString,MatchMode matchmode, List<Criterion> criteria, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
     @Override
     @Transactional(readOnly = true)
     public List<Group> listByName(String queryString,MatchMode matchmode, List<Criterion> criteria, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
@@ -210,4 +224,28 @@ public class GroupServiceImpl extends ServiceBase<Group,IGroupDao> implements IG
         return new DeleteResult();
     }
 
         return new DeleteResult();
     }
 
+    @Override
+    @Transactional(readOnly = false)
+    public MergeResult<Group> merge(Group newInstance, boolean returnTransientEntity) {
+
+        Set<GrantedAuthority> newAuthorities = newInstance.getGrantedAuthorities();
+        Map<GrantedAuthority, GrantedAuthority> mapOfAlreadyExistingAuthorities = new HashMap<GrantedAuthority, GrantedAuthority>();
+        GrantedAuthorityImpl alreadyInDB;
+        for (GrantedAuthority authority: newAuthorities){
+            if (authority instanceof GrantedAuthorityImpl){
+                alreadyInDB = grantedAuthorityDao.findAuthorityString(authority.getAuthority());
+                if (alreadyInDB != null){
+                    if (alreadyInDB.getId() != ((GrantedAuthorityImpl)authority).getId()){
+                        mapOfAlreadyExistingAuthorities.put(authority,alreadyInDB);
+                    }
+                }
+            }
+        }
+        for (GrantedAuthority authority : mapOfAlreadyExistingAuthorities.keySet()){
+            newInstance.removeGrantedAuthority(authority);
+            newInstance.addGrantedAuthority(mapOfAlreadyExistingAuthorities.get(authority));
+        }
+
+        return dao.merge(newInstance, returnTransientEntity);
+    }
 }
 }