You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2017/05/20 12:08:42 UTC

[2/2] syncope git commit: [SYNCOPE-1086] Providing specific method to fetch only creationDate / lastChangeDate in order to build ETag

[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/9b7abc18
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/9b7abc18
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/9b7abc18

Branch: refs/heads/master
Commit: 9b7abc1804ec2dc21084528333f24489f441d12c
Parents: f696ca3
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Sat May 20 14:08:11 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Sat May 20 14:08:24 2017 +0200

----------------------------------------------------------------------
 .../syncope/core/logic/AbstractAnyLogic.java    |  3 +++
 .../syncope/core/logic/AnyObjectLogic.java      | 17 +++++++++++++
 .../apache/syncope/core/logic/GroupLogic.java   | 11 +++++++++
 .../apache/syncope/core/logic/UserLogic.java    | 12 ++++++++++
 .../core/persistence/api/dao/AnyDAO.java        |  3 +++
 .../persistence/jpa/dao/AbstractAnyDAO.java     | 19 +++++++++++++++
 .../persistence/jpa/dao/JPAAnyObjectDAO.java    | 16 +++++++++----
 .../core/persistence/jpa/dao/JPAGroupDAO.java   |  6 +++++
 .../core/persistence/jpa/dao/JPAUserDAO.java    |  6 +++++
 .../core/persistence/jpa/inner/UserTest.java    |  2 ++
 .../rest/cxf/service/AbstractAnyService.java    | 25 +++++++++-----------
 .../core/rest/cxf/service/UserServiceImpl.java  |  6 ++---
 12 files changed, 104 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/9b7abc18/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java
index 9d57524..003058f 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.logic;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -223,6 +224,8 @@ public abstract class AbstractAnyLogic<TO extends AnyTO, P extends AnyPatch> ext
         }
     }
 
+    public abstract Date findLastChange(String key);
+    
     public abstract TO read(String key);
 
     public abstract int count(String realm);

http://git-wip-us.apache.org/repos/asf/syncope/blob/9b7abc18/core/logic/src/main/java/org/apache/syncope/core/logic/AnyObjectLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyObjectLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyObjectLogic.java
index efd263d..c4ee237 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyObjectLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyObjectLogic.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.logic;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 import java.util.Set;
 import org.apache.commons.collections4.CollectionUtils;
@@ -38,7 +39,9 @@ import org.apache.syncope.common.lib.types.AnyEntitlement;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.PatchOperation;
+import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
+import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
 import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
@@ -59,6 +62,9 @@ import org.springframework.transaction.annotation.Transactional;
 public class AnyObjectLogic extends AbstractAnyLogic<AnyObjectTO, AnyObjectPatch> {
 
     @Autowired
+    protected AnyObjectDAO anyObjectDAO;
+
+    @Autowired
     protected AnySearchDAO searchDAO;
 
     @Autowired
@@ -69,6 +75,17 @@ public class AnyObjectLogic extends AbstractAnyLogic<AnyObjectTO, AnyObjectPatch
 
     @Transactional(readOnly = true)
     @Override
+    public Date findLastChange(final String key) {
+        Date etag = anyObjectDAO.findLastChange(key);
+        if (etag == null) {
+            throw new NotFoundException("AnyObject " + key);
+        }
+
+        return etag;
+    }
+
+    @Transactional(readOnly = true)
+    @Override
     public AnyObjectTO read(final String key) {
         return binder.getAnyObjectTO(key);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9b7abc18/core/logic/src/main/java/org/apache/syncope/core/logic/GroupLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/GroupLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/GroupLogic.java
index a460d0c..c59907c 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/GroupLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/GroupLogic.java
@@ -130,6 +130,17 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupPatch> {
         }
     }
 
+    @Transactional(readOnly = true)
+    @Override
+    public Date findLastChange(final String key) {
+        Date etag = groupDAO.findLastChange(key);
+        if (etag == null) {
+            throw new NotFoundException("Group " + key);
+        }
+
+        return etag;
+    }
+
     @PreAuthorize("hasRole('" + StandardEntitlement.GROUP_READ + "')")
     @Transactional(readOnly = true)
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/9b7abc18/core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
index 22e8ccf..1672cfd 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
@@ -22,6 +22,7 @@ import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 import java.util.Set;
 import org.apache.commons.collections4.CollectionUtils;
@@ -86,6 +87,17 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserPatch> {
     @Autowired
     protected SyncopeLogic syncopeLogic;
 
+    @Transactional(readOnly = true)
+    @Override
+    public Date findLastChange(final String key) {
+        Date etag = userDAO.findLastChange(key);
+        if (etag == null) {
+            throw new NotFoundException("User " + key);
+        }
+
+        return etag;
+    }
+
     @PreAuthorize("hasRole('" + StandardEntitlement.USER_SEARCH + "')")
     @Transactional(readOnly = true)
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/9b7abc18/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java
index 44c0c8c..979e39b 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.persistence.api.dao;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Set;
 import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
@@ -30,6 +31,8 @@ public interface AnyDAO<A extends Any<?>> extends DAO<A> {
 
     int DEFAULT_PAGE_SIZE = 10;
 
+    Date findLastChange(String key);
+
     A authFind(String key);
 
     A find(String key);

http://git-wip-us.apache.org/repos/asf/syncope/blob/9b7abc18/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
index f348a06..0c4fdcb 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -119,6 +120,24 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
         return anyUtils;
     }
 
+    protected Date findLastChange(final String key, final String table) {
+        Query query = entityManager().createNativeQuery(
+                "SELECT creationDate, lastChangeDate FROM " + table + " WHERE id=?");
+        query.setParameter(1, key);
+
+        @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;
+    }
+
     protected abstract void securityChecks(A any);
 
     @Transactional(readOnly = true)

http://git-wip-us.apache.org/repos/asf/syncope/blob/9b7abc18/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
index c22112f..4a7e490 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.persistence.jpa.dao;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -91,6 +92,16 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj
     }
 
     @Override
+    protected AnyUtils init() {
+        return new JPAAnyUtilsFactory().getInstance(AnyTypeKind.ANY_OBJECT);
+    }
+
+    @Override
+    public Date findLastChange(final String key) {
+        return findLastChange(key, JPAAnyObject.TABLE);
+    }
+
+    @Override
     public Map<AnyType, Integer> countByType() {
         Query query = entityManager().createQuery(
                 "SELECT e.type, COUNT(e) AS countByType FROM  " + JPAAnyObject.class.getSimpleName() + " e "
@@ -124,11 +135,6 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj
     }
 
     @Override
-    protected AnyUtils init() {
-        return new JPAAnyUtilsFactory().getInstance(AnyTypeKind.ANY_OBJECT);
-    }
-
-    @Override
     protected void securityChecks(final AnyObject anyObject) {
         Set<String> authRealms = AuthContextUtils.getAuthorizations().get(
                 AnyEntitlement.READ.getFor(anyObject.getType().getKey()));

http://git-wip-us.apache.org/repos/asf/syncope/blob/9b7abc18/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
index f7da117..e727572 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.jpa.dao;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -121,6 +122,11 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
     }
 
     @Override
+    public Date findLastChange(final String key) {
+        return findLastChange(key, JPAGroup.TABLE);
+    }
+
+    @Override
     public int count() {
         Query query = entityManager().createQuery(
                 "SELECT COUNT(e) FROM  " + JPAGroup.class.getSimpleName() + " e");

http://git-wip-us.apache.org/repos/asf/syncope/blob/9b7abc18/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
index bea305a..292b69b 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.persistence.jpa.dao;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -133,6 +134,11 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
     }
 
     @Override
+    public Date findLastChange(final String key) {
+        return findLastChange(key, JPAUser.TABLE);
+    }
+
+    @Override
     public int count() {
         Query query = entityManager().createQuery(
                 "SELECT COUNT(e) FROM  " + JPAUser.class.getSimpleName() + " e");

http://git-wip-us.apache.org/repos/asf/syncope/blob/9b7abc18/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
index 9988f5a..101e2b5 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
@@ -169,6 +169,8 @@ public class UserTest extends AbstractTest {
         User actual = userDAO.save(user);
         assertNotNull("expected save to work", actual);
         assertEquals(1, actual.getPasswordHistory().size());
+        assertNotNull(userDAO.findLastChange(actual.getKey()));
+        assertEquals(actual.getLastChangeDate(), userDAO.findLastChange(actual.getKey()));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/syncope/blob/9b7abc18/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractAnyService.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractAnyService.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractAnyService.java
index 7a19af1..7a66c3d 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractAnyService.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractAnyService.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.rest.cxf.service;
 
+import java.util.Date;
 import java.util.Set;
 import javax.ws.rs.BadRequestException;
 import javax.ws.rs.core.Response;
@@ -152,9 +153,8 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
 
     @Override
     public Response update(final P anyPatch) {
-        TO any = getAnyLogic().read(anyPatch.getKey());
-
-        checkETag(any.getETagValue());
+        Date etagDate = getAnyLogic().findLastChange(anyPatch.getKey());
+        checkETag(String.valueOf(etagDate.getTime()));
 
         ProvisioningResult<TO> updated = getAnyLogic().update(anyPatch, isNullPriorityAsync());
         return modificationResponse(updated);
@@ -209,9 +209,8 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
 
     @Override
     public Response delete(final String key) {
-        TO group = getAnyLogic().read(key);
-
-        checkETag(group.getETagValue());
+        Date etagDate = getAnyLogic().findLastChange(key);
+        checkETag(String.valueOf(etagDate.getTime()));
 
         ProvisioningResult<TO> deleted = getAnyLogic().delete(key, isNullPriorityAsync());
         return modificationResponse(deleted);
@@ -219,9 +218,8 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
 
     @Override
     public Response deassociate(final DeassociationPatch patch) {
-        TO any = getAnyLogic().read(patch.getKey());
-
-        checkETag(any.getETagValue());
+        Date etagDate = getAnyLogic().findLastChange(patch.getKey());
+        checkETag(String.valueOf(etagDate.getTime()));
 
         ProvisioningResult<TO> updated;
         switch (patch.getAction()) {
@@ -264,9 +262,8 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
 
     @Override
     public Response associate(final AssociationPatch patch) {
-        TO any = getAnyLogic().read(patch.getKey());
-
-        checkETag(any.getETagValue());
+        Date etagDate = getAnyLogic().findLastChange(patch.getKey());
+        checkETag(String.valueOf(etagDate.getTime()));
 
         ProvisioningResult<TO> updated;
         switch (patch.getAction()) {
@@ -371,7 +368,7 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
                         try {
                             result.getResults().put(
                                     ((UserLogic) logic).
-                                    status(statusPatch, isNullPriorityAsync()).getEntity().getKey(),
+                                            status(statusPatch, isNullPriorityAsync()).getEntity().getKey(),
                                     BulkActionResult.Status.SUCCESS);
                         } catch (Exception e) {
                             LOG.error("Error performing suspend for user {}", key, e);
@@ -394,7 +391,7 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
                         try {
                             result.getResults().put(
                                     ((UserLogic) logic).
-                                    status(statusPatch, isNullPriorityAsync()).getEntity().getKey(),
+                                            status(statusPatch, isNullPriorityAsync()).getEntity().getKey(),
                                     BulkActionResult.Status.SUCCESS);
                         } catch (Exception e) {
                             LOG.error("Error performing reactivate for user {}", key, e);

http://git-wip-us.apache.org/repos/asf/syncope/blob/9b7abc18/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserServiceImpl.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserServiceImpl.java
index fe33390..b8a6feb 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserServiceImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.rest.cxf.service;
 
+import java.util.Date;
 import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.patch.StatusPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
@@ -55,9 +56,8 @@ public class UserServiceImpl extends AbstractAnyService<UserTO, UserPatch> imple
 
     @Override
     public Response status(final StatusPatch statusPatch) {
-        UserTO user = logic.read(statusPatch.getKey());
-
-        checkETag(user.getETagValue());
+        Date etagDate = getAnyLogic().findLastChange(statusPatch.getKey());
+        checkETag(String.valueOf(etagDate.getTime()));
 
         ProvisioningResult<UserTO> updated = logic.status(statusPatch, isNullPriorityAsync());
         return modificationResponse(updated);