Repository: syncope
Updated Branches:
  refs/heads/1_2_X 64308b004 -> 4a69793e7


[SYNCOPE-1086] Providing specific method to fetch only creationDate / 
lastChangeDate in order to build ETag


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/4a69793e
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/4a69793e
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/4a69793e

Branch: refs/heads/1_2_X
Commit: 4a69793e712dc6c539c9dfa72b80c128c721fe3a
Parents: 64308b0
Author: Francesco Chicchiriccò <[email protected]>
Authored: Sat May 20 15:23:58 2017 +0200
Committer: Francesco Chicchiriccò <[email protected]>
Committed: Sat May 20 15:23:58 2017 +0200

----------------------------------------------------------------------
 .../core/persistence/dao/SubjectDAO.java        |  3 +++
 .../dao/impl/AbstractSubjectDAOImpl.java        | 19 ++++++++++++++
 .../core/persistence/dao/impl/RoleDAOImpl.java  |  6 +++++
 .../core/persistence/dao/impl/UserDAOImpl.java  |  6 +++++
 .../core/rest/controller/RoleController.java    |  9 +++++++
 .../core/rest/controller/UserController.java    | 10 ++++++++
 .../syncope/core/services/RoleServiceImpl.java  | 22 +++++++----------
 .../syncope/core/services/UserServiceImpl.java  | 26 +++++++++-----------
 8 files changed, 73 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/4a69793e/core/src/main/java/org/apache/syncope/core/persistence/dao/SubjectDAO.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/syncope/core/persistence/dao/SubjectDAO.java 
b/core/src/main/java/org/apache/syncope/core/persistence/dao/SubjectDAO.java
index 1ef3721..fc53b5d 100644
--- a/core/src/main/java/org/apache/syncope/core/persistence/dao/SubjectDAO.java
+++ b/core/src/main/java/org/apache/syncope/core/persistence/dao/SubjectDAO.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.persistence.dao;
 
+import java.util.Date;
 import java.util.List;
 
 import org.apache.syncope.core.persistence.beans.AbstractAttrValue;
@@ -27,6 +28,8 @@ import org.apache.syncope.core.util.AttributableUtil;
 
 public interface SubjectDAO extends DAO {
 
+    Date findLastChange(Long id);
+
     <T extends AbstractSubject> List<T> findByAttrValue(String schemaName,
             AbstractAttrValue attrValue, AttributableUtil attrUtil);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/4a69793e/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AbstractSubjectDAOImpl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AbstractSubjectDAOImpl.java
 
b/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AbstractSubjectDAOImpl.java
index ae2fe05..baf691d 100644
--- 
a/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AbstractSubjectDAOImpl.java
+++ 
b/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AbstractSubjectDAOImpl.java
@@ -22,6 +22,7 @@ import java.io.StringReader;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -53,6 +54,24 @@ public abstract class AbstractSubjectDAOImpl extends 
AbstractDAOImpl implements
     @Autowired
     protected DerSchemaDAO derSchemaDAO;
 
+    protected Date findLastChange(final Long id, final String table) {
+        Query query = entityManager.createNativeQuery(
+                "SELECT creationDate, lastChangeDate FROM " + table + " WHERE 
id=?");
+        query.setParameter(1, id);
+
+        @SuppressWarnings("unchecked")
+        List<Object[]> result = query.getResultList();
+
+        Date creationDate = null;
+        Date lastChangeDate = null;
+        if (!result.isEmpty()) {
+            creationDate = (Date) result.get(0)[0];
+            lastChangeDate = (Date) result.get(0)[1];
+        }
+
+        return lastChangeDate == null ? creationDate : lastChangeDate;
+    }
+
     /**
      * Split an attribute value recurring on provided literals/tokens.
      *

http://git-wip-us.apache.org/repos/asf/syncope/blob/4a69793e/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/RoleDAOImpl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/RoleDAOImpl.java
 
b/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/RoleDAOImpl.java
index 15d4a7a..0257778 100644
--- 
a/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/RoleDAOImpl.java
+++ 
b/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/RoleDAOImpl.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.persistence.dao.impl;
 import java.util.AbstractMap;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -86,6 +87,11 @@ public class RoleDAOImpl extends AbstractSubjectDAOImpl 
implements RoleDAO {
     @Autowired
     private EntitlementDAO entitlementDAO;
 
+    @Override
+    public Date findLastChange(final Long id) {
+        return findLastChange(id, "SyncopeRole");
+    }
+
     @SuppressWarnings("unchecked")
     @Override
     protected <T extends AbstractAttributable> T findInternal(final Long id) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/4a69793e/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/UserDAOImpl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/UserDAOImpl.java
 
b/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/UserDAOImpl.java
index f6ada46..2026e9b 100644
--- 
a/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/UserDAOImpl.java
+++ 
b/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/UserDAOImpl.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.persistence.dao.impl;
 
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 import java.util.Set;
 import javax.persistence.NoResultException;
@@ -54,6 +55,11 @@ public class UserDAOImpl extends AbstractSubjectDAOImpl 
implements UserDAO {
     @Autowired
     private RoleDAO roleDAO;
 
+    @Override
+    public Date findLastChange(final Long id) {
+        return findLastChange(id, "SyncopeUser");
+    }
+
     @SuppressWarnings("unchecked")
     @Override
     protected <T extends AbstractAttributable> T findInternal(final Long id) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/4a69793e/core/src/main/java/org/apache/syncope/core/rest/controller/RoleController.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/syncope/core/rest/controller/RoleController.java
 
b/core/src/main/java/org/apache/syncope/core/rest/controller/RoleController.java
index 1cecdba..03d7c4b 100644
--- 
a/core/src/main/java/org/apache/syncope/core/rest/controller/RoleController.java
+++ 
b/core/src/main/java/org/apache/syncope/core/rest/controller/RoleController.java
@@ -115,6 +115,15 @@ public class RoleController extends 
AbstractSubjectController<RoleTO, RoleMod> {
     @Resource(name = "anonymousUser")
     protected String anonymousUser;
 
+    @Transactional(readOnly = true)
+    public Date findLastChange(final Long id) {
+        Date etag = roleDAO.findLastChange(id);
+        if (etag == null) {
+            throw new NotFoundException("Role " + id);
+        }
+        return etag;
+    }
+
     @PreAuthorize("hasAnyRole('ROLE_READ', 
T(org.apache.syncope.common.SyncopeConstants).ANONYMOUS_ENTITLEMENT)")
     @Transactional(readOnly = true)
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/4a69793e/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java
 
b/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java
index 93a6859..9cc4adc 100644
--- 
a/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java
+++ 
b/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java
@@ -23,6 +23,7 @@ import java.security.AccessControlException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -129,6 +130,15 @@ public class UserController extends 
AbstractSubjectController<UserTO, UserMod> {
         return binder.getUserTO(username).getId();
     }
 
+    @Transactional(readOnly = true)
+    public Date findLastChange(final Long id) {
+        Date etag = userDAO.findLastChange(id);
+        if (etag == null) {
+            throw new NotFoundException("User " + id);
+        }
+        return etag;
+    }
+
     @PreAuthorize("hasRole('USER_LIST')")
     @Transactional(readOnly = true, rollbackFor = { Throwable.class })
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/4a69793e/core/src/main/java/org/apache/syncope/core/services/RoleServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/syncope/core/services/RoleServiceImpl.java 
b/core/src/main/java/org/apache/syncope/core/services/RoleServiceImpl.java
index ccabf39..cbcdd64 100644
--- a/core/src/main/java/org/apache/syncope/core/services/RoleServiceImpl.java
+++ b/core/src/main/java/org/apache/syncope/core/services/RoleServiceImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.services;
 
+import java.util.Date;
 import java.util.List;
 
 import javax.ws.rs.core.Response;
@@ -30,7 +31,6 @@ import org.apache.syncope.common.to.PropagationStatus;
 import org.apache.syncope.common.wrap.ResourceName;
 import org.apache.syncope.common.to.RoleTO;
 import org.apache.syncope.common.to.TaskExecTO;
-import org.apache.syncope.common.to.UserTO;
 import org.apache.syncope.common.types.ResourceAssociationActionType;
 import org.apache.syncope.common.types.ResourceDeassociationActionType;
 import org.apache.syncope.common.util.CollectionWrapper;
@@ -62,9 +62,8 @@ public class RoleServiceImpl extends AbstractServiceImpl 
implements RoleService
 
     @Override
     public Response delete(final Long roleId) {
-        RoleTO role = controller.read(roleId);
-
-        checkETag(role.getETagValue());
+        Date etagDate = controller.findLastChange(roleId);
+        checkETag(String.valueOf(etagDate.getTime()));
 
         RoleTO deleted = controller.delete(roleId);
         return modificationResponse(deleted);
@@ -141,9 +140,8 @@ public class RoleServiceImpl extends AbstractServiceImpl 
implements RoleService
 
     @Override
     public Response update(final Long roleId, final RoleMod roleMod) {
-        RoleTO role = controller.read(roleId);
-
-        checkETag(role.getETagValue());
+        Date etagDate = controller.findLastChange(roleId);
+        checkETag(String.valueOf(etagDate.getTime()));
 
         roleMod.setId(roleId);
         RoleTO updated = controller.update(roleMod);
@@ -154,9 +152,8 @@ public class RoleServiceImpl extends AbstractServiceImpl 
implements RoleService
     public Response bulkDeassociation(
             final Long roleId, final ResourceDeassociationActionType type, 
final List<ResourceName> resourceNames) {
 
-        RoleTO role = controller.read(roleId);
-
-        checkETag(role.getETagValue());
+        Date etagDate = controller.findLastChange(roleId);
+        checkETag(String.valueOf(etagDate.getTime()));
 
         RoleTO updated;
         switch (type) {
@@ -197,9 +194,8 @@ public class RoleServiceImpl extends AbstractServiceImpl 
implements RoleService
     public Response bulkAssociation(
             final Long roleId, final ResourceAssociationActionType type, final 
List<ResourceName> resourceNames) {
 
-        RoleTO role = controller.read(roleId);
-
-        checkETag(role.getETagValue());
+        Date etagDate = controller.findLastChange(roleId);
+        checkETag(String.valueOf(etagDate.getTime()));
 
         RoleTO updated;
         switch (type) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/4a69793e/core/src/main/java/org/apache/syncope/core/services/UserServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/syncope/core/services/UserServiceImpl.java 
b/core/src/main/java/org/apache/syncope/core/services/UserServiceImpl.java
index 7cd2ad7..1b33eaf 100644
--- a/core/src/main/java/org/apache/syncope/core/services/UserServiceImpl.java
+++ b/core/src/main/java/org/apache/syncope/core/services/UserServiceImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.services;
 
+import java.util.Date;
 import java.util.List;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
@@ -69,9 +70,8 @@ public class UserServiceImpl extends AbstractServiceImpl 
implements UserService
 
     @Override
     public Response delete(final Long userId) {
-        UserTO user = controller.read(userId);
-
-        checkETag(user.getETagValue());
+        Date etagDate = controller.findLastChange(userId);
+        checkETag(String.valueOf(etagDate.getTime()));
 
         UserTO deleted = controller.delete(userId);
         return modificationResponse(deleted);
@@ -132,9 +132,8 @@ public class UserServiceImpl extends AbstractServiceImpl 
implements UserService
 
     @Override
     public Response update(final Long userId, final UserMod userMod) {
-        UserTO user = controller.read(userId);
-
-        checkETag(user.getETagValue());
+        Date etagDate = controller.findLastChange(userId);
+        checkETag(String.valueOf(etagDate.getTime()));
 
         userMod.setId(userId);
         UserTO updated = controller.update(userMod);
@@ -143,9 +142,8 @@ public class UserServiceImpl extends AbstractServiceImpl 
implements UserService
 
     @Override
     public Response status(final Long userId, final StatusMod statusMod) {
-        UserTO user = controller.read(userId);
-
-        checkETag(user.getETagValue());
+        Date etagDate = controller.findLastChange(userId);
+        checkETag(String.valueOf(etagDate.getTime()));
 
         statusMod.setId(userId);
         UserTO updated = controller.status(statusMod);
@@ -156,9 +154,8 @@ public class UserServiceImpl extends AbstractServiceImpl 
implements UserService
     public Response bulkDeassociation(
             final Long userId, final ResourceDeassociationActionType type, 
final List<ResourceName> resourceNames) {
 
-        final UserTO user = controller.read(userId);
-
-        checkETag(user.getETagValue());
+        Date etagDate = controller.findLastChange(userId);
+        checkETag(String.valueOf(etagDate.getTime()));
 
         UserTO updated;
         switch (type) {
@@ -199,9 +196,8 @@ public class UserServiceImpl extends AbstractServiceImpl 
implements UserService
     public Response bulkAssociation(
             final Long userId, final ResourceAssociationActionType type, final 
ResourceAssociationMod associationMod) {
 
-        final UserTO user = controller.read(userId);
-
-        checkETag(user.getETagValue());
+        Date etagDate = controller.findLastChange(userId);
+        checkETag(String.valueOf(etagDate.getTime()));
 
         UserTO updated;
         switch (type) {

Reply via email to