Repository: syncope Updated Branches: refs/heads/2_0_X 9637a7683 -> 7f1b22b5a refs/heads/master f696ca3c7 -> 9b7abc180
[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/7f1b22b5 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/7f1b22b5 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/7f1b22b5 Branch: refs/heads/2_0_X Commit: 7f1b22b5a45e096948867de26755300bdb971198 Parents: 9637a76 Author: Francesco Chicchiriccò <[email protected]> Authored: Sat May 20 14:08:11 2017 +0200 Committer: Francesco Chicchiriccò <[email protected]> Committed: Sat May 20 14:08:11 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/7f1b22b5/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/7f1b22b5/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/7f1b22b5/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/7f1b22b5/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/7f1b22b5/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/7f1b22b5/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/7f1b22b5/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/7f1b22b5/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/7f1b22b5/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/7f1b22b5/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/7f1b22b5/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/7f1b22b5/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);
