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:41 UTC
[1/2] syncope git commit: [SYNCOPE-1086] Providing specific method to
fetch only creationDate / lastChangeDate in order to build ETag
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ò <il...@apache.org>
Authored: Sat May 20 14:08:11 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
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);
[2/2] syncope git commit: [SYNCOPE-1086] Providing specific method to
fetch only creationDate / lastChangeDate in order to build ETag
Posted by il...@apache.org.
[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);