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) {
