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/08 11:40:22 UTC
[7/8] syncope git commit: [SYNCOPE-1077] Extension provided,
not enabled by default in fit/core-reference (profile available)
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/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 15a9d3f..54423b8 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
@@ -40,6 +40,7 @@ import org.apache.syncope.core.persistence.api.search.SearchCondConverter;
import org.apache.syncope.core.spring.security.AuthContextUtils;
import org.apache.syncope.core.spring.security.DelegatedAdministrationException;
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.PlainAttrDAO;
import org.apache.syncope.core.persistence.api.dao.search.AssignableCond;
@@ -59,7 +60,11 @@ import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAMembership;
import org.apache.syncope.core.persistence.jpa.entity.group.JPATypeExtension;
import org.apache.syncope.core.persistence.jpa.entity.user.JPAUMembership;
import org.apache.syncope.core.spring.ApplicationContextProvider;
+import org.apache.syncope.core.spring.event.AnyCreatedUpdatedEvent;
+import org.apache.syncope.core.spring.event.AnyDeletedEvent;
+import org.springframework.aop.support.AopUtils;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@@ -69,9 +74,11 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
@Autowired
private PlainAttrDAO plainAttrDAO;
+ private UserDAO userDAO;
+
private AnyObjectDAO anyObjectDAO;
- private UserDAO userDAO;
+ private AnySearchDAO jpaAnySearchDAO;
private UserDAO userDAO() {
synchronized (this) {
@@ -91,6 +98,20 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
return anyObjectDAO;
}
+ private AnySearchDAO jpaAnySearchDAO() {
+ synchronized (this) {
+ if (jpaAnySearchDAO == null) {
+ if (AopUtils.getTargetClass(searchDAO()).equals(JPAAnySearchDAO.class)) {
+ jpaAnySearchDAO = searchDAO();
+ } else {
+ jpaAnySearchDAO = (AnySearchDAO) ApplicationContextProvider.getBeanFactory().
+ createBean(JPAAnySearchDAO.class, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true);
+ }
+ }
+ }
+ return jpaAnySearchDAO;
+ }
+
@Override
protected AnyUtils init() {
return new JPAAnyUtilsFactory().getInstance(AnyTypeKind.GROUP);
@@ -204,8 +225,8 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
@Override
public List<AMembership> findAMemberships(final Group group) {
TypedQuery<AMembership> query = entityManager().createQuery(
- "SELECT e FROM " + JPAAMembership.class.getSimpleName()
- + " e WHERE e.rightEnd=:group", AMembership.class);
+ "SELECT e FROM " + JPAAMembership.class.getSimpleName() + " e WHERE e.rightEnd=:group",
+ AMembership.class);
query.setParameter("group", group);
return query.getResultList();
@@ -214,13 +235,23 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
@Override
public List<UMembership> findUMemberships(final Group group) {
TypedQuery<UMembership> query = entityManager().createQuery(
- "SELECT e FROM " + JPAUMembership.class.getSimpleName()
- + " e WHERE e.rightEnd=:group", UMembership.class);
+ "SELECT e FROM " + JPAUMembership.class.getSimpleName() + " e WHERE e.rightEnd=:group",
+ UMembership.class);
query.setParameter("group", group);
return query.getResultList();
}
+ @Override
+ public List<Group> findAll(final int page, final int itemsPerPage) {
+ TypedQuery<Group> query = entityManager().createQuery(
+ "SELECT e FROM " + JPAGroup.class.getSimpleName() + " e", Group.class);
+ query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
+ query.setMaxResults(itemsPerPage);
+
+ return query.getResultList();
+ }
+
private SearchCond buildDynMembershipCond(final String baseCondFIQL, final Realm groupRealm) {
AssignableCond cond = new AssignableCond();
cond.setRealmFullPath(groupRealm.getFullPath());
@@ -232,6 +263,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
@Override
public Group save(final Group group) {
Group merged = super.save(group);
+ publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, merged));
// refresh dynaminc memberships
if (merged.getUDynMembership() != null) {
@@ -242,6 +274,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
merged.getUDynMembership().getMembers().clear();
for (User user : matching) {
merged.getUDynMembership().add(user);
+ publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, user));
}
}
for (ADynGroupMembership memb : merged.getADynMemberships()) {
@@ -252,6 +285,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
memb.getMembers().clear();
for (AnyObject anyObject : matching) {
memb.add(anyObject);
+ publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, anyObject));
}
}
@@ -272,6 +306,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
}
anyObjectDAO().save(leftEnd);
+ publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, leftEnd));
}
for (UMembership membership : findUMemberships(group)) {
User leftEnd = membership.getLeftEnd();
@@ -285,9 +320,11 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
}
userDAO().save(leftEnd);
+ publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, leftEnd));
}
entityManager().remove(group);
+ publisher.publishEvent(new AnyDeletedEvent(this, AnyTypeKind.GROUP, group.getKey()));
}
@Override
@@ -300,35 +337,74 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
return query.getResultList();
}
+ private List<Group> findWithADynMemberships(final int page, final int itemsPerPage) {
+ TypedQuery<Group> query = entityManager().createQuery(
+ "SELECT e FROM " + JPAGroup.class.getSimpleName() + " e WHERE e.aDynMemberships IS NOT EMPTY",
+ Group.class);
+ query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
+ query.setMaxResults(itemsPerPage);
+
+ return query.getResultList();
+ }
+
@Transactional
@Override
public void refreshDynMemberships(final AnyObject anyObject) {
- for (Group group : findAll()) {
- for (ADynGroupMembership memb : group.getADynMemberships()) {
- if (searchDAO().matches(
- anyObject,
- buildDynMembershipCond(memb.getFIQLCond(), group.getRealm()))) {
-
- memb.add(anyObject);
- } else {
- memb.getMembers().remove(anyObject);
+ Query countQuery = entityManager().createQuery(
+ "SELECT COUNT(e) FROM " + JPAGroup.class.getSimpleName() + " e WHERE e.aDynMemberships IS NOT EMPTY");
+ int count = ((Number) countQuery.getSingleResult()).intValue();
+
+ for (int page = 1; page <= (count / DEFAULT_PAGE_SIZE) + 1; page++) {
+ for (Group group : findWithADynMemberships(page, DEFAULT_PAGE_SIZE)) {
+ if (!group.getADynMemberships().isEmpty()) {
+ for (ADynGroupMembership memb : group.getADynMemberships()) {
+ if (jpaAnySearchDAO().matches(
+ anyObject,
+ buildDynMembershipCond(memb.getFIQLCond(), group.getRealm()))) {
+
+ memb.add(anyObject);
+ publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group));
+ } else {
+ memb.getMembers().remove(anyObject);
+ publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group));
+ }
+ }
}
}
}
+
+ }
+
+ private List<Group> findWithUDynMemberships(final int page, final int itemsPerPage) {
+ TypedQuery<Group> query = entityManager().createQuery(
+ "SELECT e FROM " + JPAGroup.class.getSimpleName() + " e WHERE e.uDynMembership IS NOT NULL",
+ Group.class);
+ query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
+ query.setMaxResults(itemsPerPage);
+
+ return query.getResultList();
}
@Transactional
@Override
public void refreshDynMemberships(final User user) {
- for (Group group : findAll()) {
- if (group.getUDynMembership() != null) {
- if (searchDAO().matches(
- user,
- buildDynMembershipCond(group.getUDynMembership().getFIQLCond(), group.getRealm()))) {
-
- group.getUDynMembership().add(user);
- } else {
- group.getUDynMembership().getMembers().remove(user);
+ Query countQuery = entityManager().createQuery(
+ "SELECT COUNT(e) FROM " + JPAGroup.class.getSimpleName() + " e WHERE e.uDynMembership IS NOT NULL");
+ int count = ((Number) countQuery.getSingleResult()).intValue();
+
+ for (int page = 1; page <= (count / DEFAULT_PAGE_SIZE) + 1; page++) {
+ for (Group group : findWithUDynMemberships(page, DEFAULT_PAGE_SIZE)) {
+ if (group.getUDynMembership() != null) {
+ if (jpaAnySearchDAO().matches(
+ user,
+ buildDynMembershipCond(group.getUDynMembership().getFIQLCond(), group.getRealm()))) {
+
+ group.getUDynMembership().add(user);
+ publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group));
+ } else {
+ group.getUDynMembership().getMembers().remove(user);
+ publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group));
+ }
}
}
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
index dbf4f66..a5cabbb 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
@@ -31,12 +31,18 @@ import org.apache.syncope.core.persistence.api.entity.user.User;
import org.apache.syncope.core.persistence.jpa.entity.JPARole;
import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
import org.apache.syncope.core.spring.ApplicationContextProvider;
+import org.apache.syncope.core.spring.event.AnyCreatedUpdatedEvent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository
public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO {
+ @Autowired
+ private ApplicationEventPublisher publisher;
+
private AnySearchDAO searchDAO;
private AnySearchDAO searchDAO() {
@@ -85,6 +91,7 @@ public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO {
role.getDynMembership().getMembers().clear();
for (User user : matchingUsers) {
role.getDynMembership().add(user);
+ publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, user));
}
}
@@ -99,6 +106,7 @@ public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO {
for (User user : query.getResultList()) {
user.getRoles().remove(role);
+ publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, user));
}
entityManager().remove(role);
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/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 3dff783..a6b4383 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
@@ -76,6 +76,8 @@ import org.apache.syncope.core.persistence.jpa.entity.user.JPADynRoleMembership;
import org.apache.syncope.core.persistence.jpa.entity.user.JPAUDynGroupMembership;
import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
+import org.apache.syncope.core.spring.event.AnyCreatedUpdatedEvent;
+import org.apache.syncope.core.spring.event.AnyDeletedEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.stereotype.Repository;
@@ -270,6 +272,16 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
return policies;
}
+ @Override
+ public List<User> findAll(final int page, final int itemsPerPage) {
+ TypedQuery<User> query = entityManager().createQuery(
+ "SELECT e FROM " + JPAUser.class.getSimpleName() + " e", User.class);
+ query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
+ query.setMaxResults(itemsPerPage);
+
+ return query.getResultList();
+ }
+
private List<AccountPolicy> getAccountPolicies(final User user) {
List<AccountPolicy> policies = new ArrayList<>();
@@ -430,6 +442,8 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
throw e;
}
+ publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, merged));
+
roleDAO.refreshDynMemberships(merged);
groupDAO().refreshDynMemberships(merged);
@@ -451,6 +465,7 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
}
entityManager().remove(user);
+ publisher.publishEvent(new AnyDeletedEvent(this, AnyTypeKind.USER, user.getKey()));
}
@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
@@ -561,7 +576,7 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
@Override
- public Collection<String> findAllResourceNames(final String key) {
+ public Collection<String> findAllResourceKeys(final String key) {
return CollectionUtils.collect(findAllResources(authFind(key)), EntityUtils.keyTransformer());
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/persistence-jpa/src/main/resources/persistence.properties
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/resources/persistence.properties b/core/persistence-jpa/src/main/resources/persistence.properties
index 5aa696c..7f2f6f6 100644
--- a/core/persistence-jpa/src/main/resources/persistence.properties
+++ b/core/persistence-jpa/src/main/resources/persistence.properties
@@ -15,3 +15,4 @@
# specific language governing permissions and limitations
# under the License.
content.directory=${conf.directory}
+any.search.dao=org.apache.syncope.core.persistence.jpa.dao.JPAAnySearchDAO
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/persistence-jpa/src/main/resources/persistenceContext.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/resources/persistenceContext.xml b/core/persistence-jpa/src/main/resources/persistenceContext.xml
index 4d12fa1..50153a4 100644
--- a/core/persistence-jpa/src/main/resources/persistenceContext.xml
+++ b/core/persistence-jpa/src/main/resources/persistenceContext.xml
@@ -30,6 +30,7 @@ under the License.
<context:annotation-config/>
<context:component-scan base-package="org.apache.syncope.core.persistence.jpa"/>
+ <bean class="${any.search.dao}"/>
<bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java
index cc324c6..3f4d48a 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java
@@ -47,7 +47,7 @@ public class AnyObjectTest extends AbstractTest {
@Test
public void findAll() {
- List<AnyObject> list = anyObjectDAO.findAll();
+ List<AnyObject> list = anyObjectDAO.findAll(1, 100);
assertFalse(list.isEmpty());
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java
index 2d7e0ce..c3ef956 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java
@@ -47,7 +47,7 @@ public class GroupTest extends AbstractTest {
@Test
public void findAll() {
- List<Group> list = groupDAO.findAll();
+ List<Group> list = groupDAO.findAll(1, 100);
assertEquals("did not get expected number of groups ", 16, list.size());
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/MultitenancyTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/MultitenancyTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/MultitenancyTest.java
index 78dd527..80077a7 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/MultitenancyTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/MultitenancyTest.java
@@ -95,7 +95,7 @@ public class MultitenancyTest extends AbstractTest {
@Test
public void createUser() {
assertNull(realmDAO.getRoot().getPasswordPolicy());
- assertTrue(userDAO.findAll().isEmpty());
+ assertTrue(userDAO.findAll(1, 100).isEmpty());
User user = entityFactory.newEntity(User.class);
user.setRealm(realmDAO.getRoot());
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/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 730a6c2..9988f5a 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
@@ -26,7 +26,6 @@ import static org.junit.Assert.fail;
import java.util.Collections;
import java.util.Date;
import java.util.List;
-import java.util.UUID;
import org.apache.syncope.common.lib.SyncopeConstants;
import org.apache.syncope.common.lib.types.CipherAlgorithm;
import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
@@ -56,7 +55,7 @@ public class UserTest extends AbstractTest {
@Test
public void findAll() {
- List<User> list = userDAO.findAll();
+ List<User> list = userDAO.findAll(1, 100);
assertEquals("did not get expected number of users", 5, list.size());
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
index 17c45ba..f91aa7e 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
@@ -22,9 +22,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.syncope.common.lib.types.StandardEntitlement;
import org.apache.syncope.core.persistence.api.dao.GroupDAO;
@@ -60,8 +58,7 @@ public class AnySearchTest extends AbstractTest {
@Test
public void issueSYNCOPE95() {
- Set<Group> groups = new HashSet<>(groupDAO.findAll());
- for (Group group : groups) {
+ for (Group group : groupDAO.findAll(1, 100)) {
groupDAO.delete(group.getKey());
}
groupDAO.flush();
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
index 0f915ea..ede95f7 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
@@ -82,9 +82,6 @@ public class UserTest extends AbstractTest {
public void delete() {
List<UMembership> memberships = groupDAO.findUMemberships(groupDAO.findByName("managingDirector"));
assertFalse(memberships.isEmpty());
- List<URelationship> relationships = anyObjectDAO.findURelationships(
- anyObjectDAO.find("fc6dbc3a-6c07-4965-8781-921e7401a4a5"));
- assertFalse(relationships.isEmpty());
userDAO.delete("c9b2dec2-00a7-4855-97c0-d854842b4b24");
@@ -97,9 +94,6 @@ public class UserTest extends AbstractTest {
memberships = groupDAO.findUMemberships(groupDAO.findByName("managingDirector"));
assertTrue(memberships.isEmpty());
- relationships = anyObjectDAO.findURelationships(
- anyObjectDAO.find("fc6dbc3a-6c07-4965-8781-921e7401a4a5"));
- assertTrue(relationships.isEmpty());
}
@Test
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
index 780cd49..ad966de 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
@@ -176,7 +176,7 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
AnyTypeKind.ANY_OBJECT,
key,
propByRes,
- CollectionUtils.removeAll(anyObjectDAO.findAllResourceNames(key), resources));
+ CollectionUtils.removeAll(anyObjectDAO.findAllResourceKeys(key), resources));
PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
return propagationReporter.getStatuses();
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java
index ae1090f..df9881da 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java
@@ -36,13 +36,13 @@ import org.apache.syncope.common.lib.to.UserTO;
import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.syncope.common.lib.types.PatchOperation;
import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
import org.apache.syncope.core.persistence.api.entity.user.User;
import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
import org.apache.syncope.core.provisioning.api.WorkflowResult;
import org.apache.syncope.core.provisioning.api.PropagationByResource;
import org.apache.syncope.common.lib.types.ResourceOperation;
import org.apache.syncope.common.lib.types.StatusPatchType;
+import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
@@ -192,7 +192,7 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
final String key, final Set<String> excludedResources, final boolean nullPriorityAsync) {
PropagationByResource propByRes = new PropagationByResource();
- propByRes.set(ResourceOperation.DELETE, userDAO.findAllResourceNames(key));
+ propByRes.set(ResourceOperation.DELETE, userDAO.findAllResourceKeys(key));
// Note here that we can only notify about "delete", not any other
// task defined in workflow process definition: this because this
@@ -344,7 +344,7 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
AnyTypeKind.USER,
key,
propByRes,
- CollectionUtils.removeAll(userDAO.findAllResourceNames(key), resources));
+ CollectionUtils.removeAll(userDAO.findAllResourceKeys(key), resources));
PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
return propagationReporter.getStatuses();
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ExpiredAccessTokenCleanup.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ExpiredAccessTokenCleanup.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ExpiredAccessTokenCleanup.java
index 1e4ac03..0a8566c 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ExpiredAccessTokenCleanup.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ExpiredAccessTokenCleanup.java
@@ -34,9 +34,7 @@ public class ExpiredAccessTokenCleanup extends AbstractSchedTaskJobDelegate {
LOG.debug("Successfully deleted {} expired access tokens", deleted);
}
- return (dryRun
- ? "DRY "
- : "") + "RUNNING";
+ return "SUCCESS";
}
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/IdentityRecertification.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/IdentityRecertification.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/IdentityRecertification.java
index 36e59a2..8b3f4e5 100755
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/IdentityRecertification.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/IdentityRecertification.java
@@ -18,13 +18,10 @@
*/
package org.apache.syncope.core.provisioning.java.job;
-import java.util.Collections;
-import java.util.Date;
import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.syncope.core.persistence.api.dao.AnyDAO;
import org.apache.syncope.core.persistence.api.dao.ConfDAO;
import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttr;
import org.apache.syncope.core.persistence.api.entity.task.TaskExec;
import org.apache.syncope.core.persistence.api.entity.user.User;
@@ -36,8 +33,6 @@ public class IdentityRecertification extends AbstractSchedTaskJobDelegate {
private static final String RECERTIFICATION_TIME = "identity.recertification.day.interval";
- private static final int PAGE_SIZE = 10;
-
@Autowired
private ConfDAO confDAO;
@@ -65,27 +60,22 @@ public class IdentityRecertification extends AbstractSchedTaskJobDelegate {
}
}
- protected boolean isToBeRecertified(final User user) {
- Date lastCertificationDate = user.getLastRecertification();
+ protected boolean isToBeRecertified(final User user, final long now) {
+ if (!user.isSuspended()
+ && (user.getLastRecertification() == null
+ || user.getLastRecertification().getTime() + recertificationTime < now)) {
- if (lastCertificationDate != null) {
- if (lastCertificationDate.getTime() + recertificationTime < System.currentTimeMillis()) {
- LOG.debug("{} is to be recertified", user);
- return true;
- } else {
- LOG.debug("{} do not need to be recertified", user);
- return false;
- }
+ LOG.debug("{} is to be recertified", user);
+ return true;
}
- return true;
+ LOG.debug("{} does not need to be recertified", user);
+ return false;
}
@Override
protected String doExecute(final boolean dryRun) throws JobExecutionException {
- LOG.info("IdentityRecertification {} running [SchedTask {}]", (dryRun
- ? "dry "
- : ""), task.getKey());
+ LOG.info("IdentityRecertification {} running [SchedTask {}]", dryRun ? "dry " : "", task.getKey());
init();
if (recertificationTime == -1) {
@@ -93,13 +83,16 @@ public class IdentityRecertification extends AbstractSchedTaskJobDelegate {
return ("IDENTITY RECERTIFICATION DISABLED");
}
- for (int page = 1; page <= (userDAO.count() / PAGE_SIZE) + 1; page++) {
- for (User user : userDAO.findAll(
- SyncopeConstants.FULL_ADMIN_REALMS, page, PAGE_SIZE, Collections.<OrderByClause>emptyList())) {
+ if (dryRun) {
+ return "DRY RUN";
+ }
+ long now = System.currentTimeMillis();
+ for (int page = 1; page <= (userDAO.count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
+ for (User user : userDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE)) {
LOG.debug("Processing user: {}", user.getUsername());
- if (StringUtils.isNotBlank(user.getWorkflowId()) && isToBeRecertified(user) && !dryRun) {
+ if (StringUtils.isNotBlank(user.getWorkflowId()) && isToBeRecertified(user, now)) {
uwfAdapter.requestCertify(user);
} else {
LOG.warn("Workflow for {} is null or empty", user);
@@ -107,9 +100,7 @@ public class IdentityRecertification extends AbstractSchedTaskJobDelegate {
}
}
- return (dryRun
- ? "DRY "
- : "") + "RUNNING";
+ return "SUCCESS";
}
@Override
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
index 54c53c2..5464276 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
@@ -312,7 +312,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
switch (task.getAnyTypeKind()) {
case USER:
try {
- resources = userDAO.findAllResourceNames(task.getEntityKey());
+ resources = userDAO.findAllResourceKeys(task.getEntityKey());
} catch (Exception e) {
LOG.error("Could not read user {}", task.getEntityKey(), e);
}
@@ -329,7 +329,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
case ANY_OBJECT:
default:
try {
- resources = anyObjectDAO.findAllResourceNames(task.getEntityKey());
+ resources = anyObjectDAO.findAllResourceKeys(task.getEntityKey());
} catch (Exception e) {
LOG.error("Could not read any object {}", task.getEntityKey(), e);
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java
index b3035a1..f1ec799 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java
@@ -229,7 +229,7 @@ public class PropagationManagerImpl implements PropagationManager {
origPropByRes.merge(wfResult.getPropByRes());
Set<String> pwdResourceNames = new HashSet<>(userPatch.getPassword().getResources());
- Collection<String> currentResourceNames = userDAO.findAllResourceNames(userPatch.getKey());
+ Collection<String> currentResourceNames = userDAO.findAllResourceKeys(userPatch.getKey());
pwdResourceNames.retainAll(currentResourceNames);
PropagationByResource pwdPropByRes = new PropagationByResource();
pwdPropByRes.addAll(ResourceOperation.UPDATE, pwdResourceNames);
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
index 8e18ab5..7c3bbe3 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
@@ -33,6 +33,7 @@ import org.apache.syncope.core.persistence.api.dao.GroupDAO;
import org.apache.syncope.core.persistence.api.dao.RealmDAO;
import org.apache.syncope.core.persistence.api.dao.UserDAO;
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.Any;
import org.apache.syncope.core.persistence.api.entity.Realm;
import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
@@ -51,8 +52,6 @@ import org.springframework.beans.factory.support.AbstractBeanDefinition;
public class PushJobDelegate extends AbstractProvisioningJobDelegate<PushTask> {
- private static final int PAGE_SIZE = 1000;
-
/**
* User DAO.
*/
@@ -201,15 +200,21 @@ public class PushJobDelegate extends AbstractProvisioningJobDelegate<PushTask> {
? null
: pushTask.getFilter(provision.getAnyType()).getFIQLCond();
if (StringUtils.isBlank(filter)) {
- doHandle(anyDAO.findAll(), handler, pushTask.getResource());
+ for (int page = 1; page <= (anyDAO.count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
+ doHandle(anyDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE), handler, pushTask.getResource());
+ }
} else {
- int count = anyDAO.count(SyncopeConstants.FULL_ADMIN_REALMS);
- for (int page = 1; page <= (count / PAGE_SIZE) + 1; page++) {
+ SearchCond cond = SearchCondConverter.convert(filter);
+ int count = searchDAO.count(
+ SyncopeConstants.FULL_ADMIN_REALMS,
+ cond,
+ provision.getAnyType().getKind());
+ for (int page = 1; page <= (count / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
List<? extends Any<?>> anys = searchDAO.search(
SyncopeConstants.FULL_ADMIN_REALMS,
- SearchCondConverter.convert(filter),
+ cond,
page,
- PAGE_SIZE,
+ AnyDAO.DEFAULT_PAGE_SIZE,
Collections.<OrderByClause>emptyList(),
provision.getAnyType().getKind());
doHandle(anys, handler, pushTask.getResource());
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/spring/src/main/java/org/apache/syncope/core/spring/event/AnyCreatedUpdatedEvent.java
----------------------------------------------------------------------
diff --git a/core/spring/src/main/java/org/apache/syncope/core/spring/event/AnyCreatedUpdatedEvent.java b/core/spring/src/main/java/org/apache/syncope/core/spring/event/AnyCreatedUpdatedEvent.java
new file mode 100644
index 0000000..c252744
--- /dev/null
+++ b/core/spring/src/main/java/org/apache/syncope/core/spring/event/AnyCreatedUpdatedEvent.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.spring.event;
+
+import org.apache.syncope.core.persistence.api.entity.Any;
+import org.springframework.context.ApplicationEvent;
+
+public class AnyCreatedUpdatedEvent<A extends Any<?>> extends ApplicationEvent {
+
+ private static final long serialVersionUID = -781747175059834365L;
+
+ private final A any;
+
+ public AnyCreatedUpdatedEvent(final Object source, final A any) {
+ super(source);
+ this.any = any;
+ }
+
+ public A getAny() {
+ return any;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/spring/src/main/java/org/apache/syncope/core/spring/event/AnyDeletedEvent.java
----------------------------------------------------------------------
diff --git a/core/spring/src/main/java/org/apache/syncope/core/spring/event/AnyDeletedEvent.java b/core/spring/src/main/java/org/apache/syncope/core/spring/event/AnyDeletedEvent.java
new file mode 100644
index 0000000..bd180de
--- /dev/null
+++ b/core/spring/src/main/java/org/apache/syncope/core/spring/event/AnyDeletedEvent.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.spring.event;
+
+import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.springframework.context.ApplicationEvent;
+
+public class AnyDeletedEvent extends ApplicationEvent {
+
+ private final AnyTypeKind anyTypeKind;
+
+ private final String anyKey;
+
+ public AnyDeletedEvent(final Object source, final AnyTypeKind anyTypeKind, final String anyKey) {
+ super(source);
+ this.anyTypeKind = anyTypeKind;
+ this.anyKey = anyKey;
+ }
+
+ public AnyTypeKind getAnyTypeKind() {
+ return anyTypeKind;
+ }
+
+ public String getAnyKey() {
+ return anyKey;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/workflow-activiti/pom.xml
----------------------------------------------------------------------
diff --git a/core/workflow-activiti/pom.xml b/core/workflow-activiti/pom.xml
index 2ad6c38..753b4e9 100644
--- a/core/workflow-activiti/pom.xml
+++ b/core/workflow-activiti/pom.xml
@@ -74,11 +74,6 @@ under the License.
<artifactId>syncope-core-workflow-java</artifactId>
<version>${project.version}</version>
</dependency>
- <dependency>
- <groupId>org.apache.syncope.core</groupId>
- <artifactId>syncope-core-spring</artifactId>
- <version>${project.version}</version>
- </dependency>
</dependencies>
<build>
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java
index 8fbec72..732d6dd 100644
--- a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java
+++ b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java
@@ -216,21 +216,12 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
}
@Override
- public WorkflowResult<Pair<String, Boolean>> create(final UserTO userTO, final boolean disablePwdPolicyCheck,
+ protected WorkflowResult<Pair<String, Boolean>> doCreate(
+ final UserTO userTO,
+ final boolean disablePwdPolicyCheck,
+ final Boolean enabled,
final boolean storePassword) {
- return create(userTO, disablePwdPolicyCheck, null, storePassword);
- }
-
- @Override
- public WorkflowResult<Pair<String, Boolean>> create(final UserTO userTO, final boolean storePassword) {
- return create(userTO, false, storePassword);
- }
-
- @Override
- public WorkflowResult<Pair<String, Boolean>> create(final UserTO userTO, final boolean disablePwdPolicyCheck,
- final Boolean enabled, final boolean storePassword) {
-
Map<String, Object> variables = new HashMap<>();
variables.put(WF_EXECUTOR, AuthContextUtils.getUsername());
variables.put(USER_TO, userTO);
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeGroupQueryImpl.java
----------------------------------------------------------------------
diff --git a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeGroupQueryImpl.java b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeGroupQueryImpl.java
index 46d82a3..992e3d1 100644
--- a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeGroupQueryImpl.java
+++ b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeGroupQueryImpl.java
@@ -27,6 +27,7 @@ import org.activiti.engine.identity.GroupQuery;
import org.activiti.engine.impl.persistence.entity.GroupEntity;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Transformer;
+import org.apache.syncope.core.persistence.api.dao.AnyDAO;
import org.apache.syncope.core.persistence.api.dao.GroupDAO;
public class SyncopeGroupQueryImpl implements GroupQuery {
@@ -111,15 +112,17 @@ public class SyncopeGroupQueryImpl implements GroupQuery {
}
}
if (result == null) {
- result = CollectionUtils.collect(groupDAO.findAll(),
- new Transformer<org.apache.syncope.core.persistence.api.entity.group.Group, Group>() {
-
- @Override
- public Group transform(final org.apache.syncope.core.persistence.api.entity.group.Group user) {
- return fromSyncopeGroup(user);
- }
-
- }, new ArrayList<Group>());
+ result = new ArrayList<>();
+ for (int page = 1; page <= (groupDAO.count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
+ CollectionUtils.collect(groupDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE),
+ new Transformer<org.apache.syncope.core.persistence.api.entity.group.Group, Group>() {
+
+ @Override
+ public Group transform(final org.apache.syncope.core.persistence.api.entity.group.Group group) {
+ return fromSyncopeGroup(group);
+ }
+ }, result);
+ }
}
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeUserQueryImpl.java
----------------------------------------------------------------------
diff --git a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeUserQueryImpl.java b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeUserQueryImpl.java
index dd10566..b7fa2e9 100644
--- a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeUserQueryImpl.java
+++ b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeUserQueryImpl.java
@@ -27,6 +27,7 @@ import org.activiti.engine.identity.UserQuery;
import org.activiti.engine.impl.persistence.entity.UserEntity;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Transformer;
+import org.apache.syncope.core.persistence.api.dao.AnyDAO;
import org.apache.syncope.core.persistence.api.dao.GroupDAO;
import org.apache.syncope.core.persistence.api.dao.UserDAO;
import org.apache.syncope.core.persistence.api.entity.group.Group;
@@ -156,15 +157,17 @@ public class SyncopeUserQueryImpl implements UserQuery {
}
// THIS CAN BE *VERY* DANGEROUS
if (result == null) {
- result = CollectionUtils.collect(userDAO.findAll(),
- new Transformer<org.apache.syncope.core.persistence.api.entity.user.User, User>() {
-
- @Override
- public User transform(final org.apache.syncope.core.persistence.api.entity.user.User user) {
- return fromSyncopeUser(user);
- }
-
- }, new ArrayList<User>());
+ result = new ArrayList<>();
+ for (int page = 1; page <= (userDAO.count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
+ CollectionUtils.collect(userDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE),
+ new Transformer<org.apache.syncope.core.persistence.api.entity.user.User, User>() {
+
+ @Override
+ public User transform(final org.apache.syncope.core.persistence.api.entity.user.User user) {
+ return fromSyncopeUser(user);
+ }
+ }, result);
+ }
}
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/workflow-java/pom.xml
----------------------------------------------------------------------
diff --git a/core/workflow-java/pom.xml b/core/workflow-java/pom.xml
index 3d5004b..3b1d75d 100644
--- a/core/workflow-java/pom.xml
+++ b/core/workflow-java/pom.xml
@@ -52,6 +52,11 @@ under the License.
<artifactId>syncope-core-workflow-api</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.syncope.core</groupId>
+ <artifactId>syncope-core-spring</artifactId>
+ <version>${project.version}</version>
+ </dependency>
</dependencies>
<build>
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
index df35de5..232470a 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
@@ -19,6 +19,7 @@
package org.apache.syncope.core.workflow.java;
import org.apache.syncope.common.lib.patch.AnyObjectPatch;
+import org.apache.syncope.common.lib.to.AnyObjectTO;
import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
import org.apache.syncope.core.persistence.api.entity.EntityFactory;
import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
@@ -48,6 +49,13 @@ public abstract class AbstractAnyObjectWorkflowAdapter
return null;
}
+ protected abstract WorkflowResult<String> doCreate(AnyObjectTO anyObjectTO);
+
+ @Override
+ public WorkflowResult<String> create(final AnyObjectTO anyObjectTO) {
+ return doCreate(anyObjectTO);
+ }
+
protected abstract WorkflowResult<String> doUpdate(AnyObject anyObject, AnyObjectPatch anyObjectPatch);
@Override
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
index 7b1fd3e..0689b94 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
@@ -19,6 +19,7 @@
package org.apache.syncope.core.workflow.java;
import org.apache.syncope.common.lib.patch.GroupPatch;
+import org.apache.syncope.common.lib.to.GroupTO;
import org.apache.syncope.core.persistence.api.dao.GroupDAO;
import org.apache.syncope.core.persistence.api.entity.EntityFactory;
import org.apache.syncope.core.persistence.api.entity.group.Group;
@@ -47,6 +48,13 @@ public abstract class AbstractGroupWorkflowAdapter implements GroupWorkflowAdapt
return null;
}
+ protected abstract WorkflowResult<String> doCreate(GroupTO groupTO);
+
+ @Override
+ public WorkflowResult<String> create(final GroupTO groupTO) {
+ return doCreate(groupTO);
+ }
+
protected abstract WorkflowResult<String> doUpdate(Group group, GroupPatch groupPatch);
@Override
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractUserWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractUserWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractUserWorkflowAdapter.java
index 48c6d60..d112934 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractUserWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractUserWorkflowAdapter.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.workflow.java;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.syncope.common.lib.patch.UserPatch;
+import org.apache.syncope.common.lib.to.UserTO;
import org.apache.syncope.core.persistence.api.dao.UserDAO;
import org.apache.syncope.core.persistence.api.entity.EntityFactory;
import org.apache.syncope.core.persistence.api.entity.user.User;
@@ -50,12 +51,12 @@ public abstract class AbstractUserWorkflowAdapter implements UserWorkflowAdapter
@Autowired
protected EntityFactory entityFactory;
- public static String encrypt(final String clear) {
+ protected String encrypt(final String clear) {
byte[] encryptedBytes = EncryptorFactory.getInstance().getDefaultEncryptor().encrypt(clear.getBytes());
return Base64.encode(encryptedBytes);
}
- public static String decrypt(final String crypted) {
+ protected String decrypt(final String crypted) {
byte[] decryptedBytes = EncryptorFactory.getInstance().getDefaultEncryptor().decrypt(Base64.decode(crypted));
return new String(decryptedBytes);
}
@@ -65,6 +66,31 @@ public abstract class AbstractUserWorkflowAdapter implements UserWorkflowAdapter
return null;
}
+ @Override
+ public WorkflowResult<Pair<String, Boolean>> create(final UserTO userTO, final boolean disablePwdPolicyCheck,
+ final boolean storePassword) {
+
+ return create(userTO, disablePwdPolicyCheck, null, storePassword);
+ }
+
+ @Override
+ public WorkflowResult<Pair<String, Boolean>> create(final UserTO userTO, final boolean storePassword) {
+ return create(userTO, false, storePassword);
+ }
+
+ protected abstract WorkflowResult<Pair<String, Boolean>> doCreate(
+ UserTO userTO, boolean disablePwdPolicyCheck, Boolean enabled, boolean storePassword);
+
+ @Override
+ public WorkflowResult<Pair<String, Boolean>> create(
+ final UserTO userTO,
+ final boolean disablePwdPolicyCheck,
+ final Boolean enabled,
+ final boolean storePassword) {
+
+ return doCreate(userTO, disablePwdPolicyCheck, enabled, storePassword);
+ }
+
protected abstract WorkflowResult<String> doActivate(User user, String token);
@Override
@@ -148,7 +174,7 @@ public abstract class AbstractUserWorkflowAdapter implements UserWorkflowAdapter
protected abstract void doDelete(User user);
@Override
- public void delete(final String key) {
- doDelete(userDAO.authFind(key));
+ public void delete(final String userKey) {
+ doDelete(userDAO.authFind(userKey));
}
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
index b3a7c48..8852aa0 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
@@ -38,7 +38,7 @@ import org.apache.syncope.core.workflow.api.WorkflowException;
public class DefaultAnyObjectWorkflowAdapter extends AbstractAnyObjectWorkflowAdapter {
@Override
- public WorkflowResult<String> create(final AnyObjectTO anyObjectTO) {
+ protected WorkflowResult<String> doCreate(final AnyObjectTO anyObjectTO) {
AnyObject anyObject = entityFactory.newEntity(AnyObject.class);
dataBinder.create(anyObject, anyObjectTO);
anyObject = anyObjectDAO.save(anyObject);
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
index a0282dc..f5c9837 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
@@ -38,7 +38,7 @@ import org.apache.syncope.core.workflow.api.WorkflowException;
public class DefaultGroupWorkflowAdapter extends AbstractGroupWorkflowAdapter {
@Override
- public WorkflowResult<String> create(final GroupTO groupTO) {
+ protected WorkflowResult<String> doCreate(final GroupTO groupTO) {
Group group = entityFactory.newEntity(Group.class);
dataBinder.create(group, groupTO);
group = groupDAO.save(group);
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
index 7b66170..b94930b 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
@@ -48,21 +48,12 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
private ConfDAO confDAO;
@Override
- public WorkflowResult<Pair<String, Boolean>> create(final UserTO userTO, final boolean storePassword) {
- return create(userTO, false, true);
- }
-
- @Override
- public WorkflowResult<Pair<String, Boolean>> create(final UserTO userTO, final boolean disablePwdPolicyCheck,
+ protected WorkflowResult<Pair<String, Boolean>> doCreate(
+ final UserTO userTO,
+ final boolean disablePwdPolicyCheck,
+ final Boolean enabled,
final boolean storePassword) {
- return create(userTO, disablePwdPolicyCheck, null, storePassword);
- }
-
- @Override
- public WorkflowResult<Pair<String, Boolean>> create(final UserTO userTO, final boolean disablePwdPolicyCheck,
- final Boolean enabled, final boolean storePassword) {
-
User user = entityFactory.newEntity(User.class);
dataBinder.create(user, userTO, storePassword);
@@ -195,7 +186,7 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
@Override
public WorkflowResult<String> requestCertify(final User user) {
- throw new UnsupportedOperationException("Not supported.");
+ throw new WorkflowException(new UnsupportedOperationException("Not supported."));
}
@Override
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeleteProducer.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeleteProducer.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeleteProducer.java
index 7ced13d..3578461 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeleteProducer.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeleteProducer.java
@@ -63,7 +63,7 @@ public class DeleteProducer extends AbstractProducer {
switch (getAnyTypeKind()) {
case USER:
PropagationByResource propByRes = new PropagationByResource();
- propByRes.set(ResourceOperation.DELETE, userDAO.findAllResourceNames(key));
+ propByRes.set(ResourceOperation.DELETE, userDAO.findAllResourceKeys(key));
// Note here that we can only notify about "delete", not any other
// task defined in workflow process definition: this because this
// information could only be available after uwfAdapter.delete(), which
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeprovisionProducer.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeprovisionProducer.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeprovisionProducer.java
index b5d5d04..5b20d11 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeprovisionProducer.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeprovisionProducer.java
@@ -71,7 +71,7 @@ public class DeprovisionProducer extends AbstractProducer {
AnyTypeKind.USER,
key,
propByRes,
- CollectionUtils.removeAll(userDAO.findAllResourceNames(key), resources));
+ CollectionUtils.removeAll(userDAO.findAllResourceKeys(key), resources));
propagationReporter = getPropagationTaskExecutor().execute(tasks, nullPriorityAsync);
exchange.getOut().setBody(propagationReporter.getStatuses());
break;
@@ -93,7 +93,7 @@ public class DeprovisionProducer extends AbstractProducer {
AnyTypeKind.ANY_OBJECT,
key,
propByRes,
- CollectionUtils.removeAll(anyObjectDAO.findAllResourceNames(key), resources));
+ CollectionUtils.removeAll(anyObjectDAO.findAllResourceKeys(key), resources));
propagationReporter = getPropagationTaskExecutor().execute(tasks, nullPriorityAsync);
exchange.getOut().setBody(propagationReporter.getStatuses());
break;
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/ext/elasticsearch/client-elasticsearch/pom.xml
----------------------------------------------------------------------
diff --git a/ext/elasticsearch/client-elasticsearch/pom.xml b/ext/elasticsearch/client-elasticsearch/pom.xml
new file mode 100644
index 0000000..48d7f1c
--- /dev/null
+++ b/ext/elasticsearch/client-elasticsearch/pom.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.syncope.ext</groupId>
+ <artifactId>syncope-ext-elasticsearch</artifactId>
+ <version>2.0.4-SNAPSHOT</version>
+ </parent>
+
+ <name>Apache Syncope Ext: Elasticsearch Client</name>
+ <description>Apache Syncope Ext: Elasticsearch Client</description>
+ <groupId>org.apache.syncope.ext.elasticsearch</groupId>
+ <artifactId>syncope-ext-elasticsearch-client</artifactId>
+ <packaging>jar</packaging>
+
+ <properties>
+ <rootpom.basedir>${basedir}/../../..</rootpom.basedir>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.syncope.core</groupId>
+ <artifactId>syncope-core-spring</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.elasticsearch.client</groupId>
+ <artifactId>transport</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-checkstyle-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+</project>
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchClientFactoryBean.java
----------------------------------------------------------------------
diff --git a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchClientFactoryBean.java b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchClientFactoryBean.java
new file mode 100644
index 0000000..e4a30f9
--- /dev/null
+++ b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchClientFactoryBean.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.ext.elasticsearch.client;
+
+import java.net.InetAddress;
+import java.util.Map;
+import org.elasticsearch.client.Client;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.common.transport.InetSocketTransportAddress;
+import org.elasticsearch.transport.client.PreBuiltTransportClient;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.FactoryBean;
+
+/**
+ * Spring {@link FactoryBean} for getting the Elasticsearch's {@link Client} singleton instance.
+ */
+public class ElasticsearchClientFactoryBean implements FactoryBean<Client>, DisposableBean {
+
+ private Map<String, Object> settings;
+
+ private Map<String, Integer> addresses;
+
+ private Client client;
+
+ public void setSettings(final Map<String, Object> settings) {
+ this.settings = settings;
+ }
+
+ public void setAddresses(final Map<String, Integer> addresses) {
+ this.addresses = addresses;
+ }
+
+ @Override
+ public Client getObject() throws Exception {
+ synchronized (this) {
+ if (client == null) {
+ PreBuiltTransportClient tClient = new PreBuiltTransportClient(Settings.builder().put(settings).build());
+
+ for (Map.Entry<String, Integer> entry : addresses.entrySet()) {
+ tClient.addTransportAddress(
+ new InetSocketTransportAddress(InetAddress.getByName(entry.getKey()), entry.getValue()));
+ }
+
+ client = tClient;
+ }
+ }
+ return client;
+ }
+
+ @Override
+ public Class<?> getObjectType() {
+ return Client.class;
+ }
+
+ @Override
+ public boolean isSingleton() {
+ return true;
+ }
+
+ @Override
+ public void destroy() throws Exception {
+ if (client != null) {
+ client.close();
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchIndexManager.java
----------------------------------------------------------------------
diff --git a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchIndexManager.java b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchIndexManager.java
new file mode 100644
index 0000000..3e20acd
--- /dev/null
+++ b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchIndexManager.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.ext.elasticsearch.client;
+
+import java.io.IOException;
+import org.apache.syncope.core.persistence.api.entity.Any;
+import org.apache.syncope.core.spring.event.AnyCreatedUpdatedEvent;
+import org.apache.syncope.core.spring.event.AnyDeletedEvent;
+import org.apache.syncope.core.spring.security.AuthContextUtils;
+import org.elasticsearch.action.delete.DeleteResponse;
+import org.elasticsearch.action.get.GetResponse;
+import org.elasticsearch.action.index.IndexResponse;
+import org.elasticsearch.action.support.WriteRequest;
+import org.elasticsearch.action.update.UpdateResponse;
+import org.elasticsearch.client.Client;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.event.TransactionalEventListener;
+
+/**
+ * Listen to any create / update and delete in order to keep the Elastsicsearch indexes consistent.
+ */
+public class ElasticsearchIndexManager {
+
+ private static final Logger LOG = LoggerFactory.getLogger(ElasticsearchIndexManager.class);
+
+ @Autowired
+ private Client client;
+
+ @Autowired
+ private ElasticsearchUtils elasticsearchUtils;
+
+ @TransactionalEventListener
+ public void after(final AnyCreatedUpdatedEvent<Any<?>> event) throws IOException {
+ GetResponse getResponse = client.prepareGet(AuthContextUtils.getDomain().toLowerCase(),
+ event.getAny().getType().getKind().name(),
+ event.getAny().getKey()).
+ get();
+ if (getResponse.isExists()) {
+ LOG.debug("About to update index for {}", event.getAny());
+
+ UpdateResponse response = client.prepareUpdate(
+ AuthContextUtils.getDomain().toLowerCase(),
+ event.getAny().getType().getKind().name(),
+ event.getAny().getKey()).
+ setDoc(elasticsearchUtils.builder(event.getAny())).
+ setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE).
+ get();
+ LOG.debug("Index successfully updated for {}: {}", event.getAny(), response);
+ } else {
+ LOG.debug("About to create index for {}", event.getAny());
+
+ IndexResponse response = client.prepareIndex(
+ AuthContextUtils.getDomain().toLowerCase(),
+ event.getAny().getType().getKind().name(),
+ event.getAny().getKey()).
+ setSource(elasticsearchUtils.builder(event.getAny())).
+ setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE).
+ get();
+
+ LOG.debug("Index successfully created for {}: {}", event.getAny(), response);
+ }
+ }
+
+ @TransactionalEventListener
+ public void after(final AnyDeletedEvent event) {
+ LOG.debug("About to delete index for {}[{}]", event.getAnyTypeKind(), event.getAnyKey());
+
+ DeleteResponse response = client.prepareDelete(
+ AuthContextUtils.getDomain().toLowerCase(),
+ event.getAnyTypeKind().name(),
+ event.getAnyKey()).
+ setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE).
+ get();
+
+ LOG.debug("Index successfully deleted for {}[{}]: {}", event.getAnyTypeKind(), event.getAnyKey(), response);
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/02123044/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
----------------------------------------------------------------------
diff --git a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
new file mode 100644
index 0000000..572ef37
--- /dev/null
+++ b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
@@ -0,0 +1,194 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.ext.elasticsearch.client;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Transformer;
+import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
+import org.apache.syncope.core.persistence.api.dao.GroupDAO;
+import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.entity.Any;
+import org.apache.syncope.core.persistence.api.entity.PlainAttr;
+import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
+import org.apache.syncope.core.persistence.api.entity.Role;
+import org.apache.syncope.core.persistence.api.entity.anyobject.ADynGroupMembership;
+import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
+import org.apache.syncope.core.persistence.api.entity.anyobject.ARelationship;
+import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
+import org.apache.syncope.core.persistence.api.entity.group.Group;
+import org.apache.syncope.core.persistence.api.entity.user.UDynGroupMembership;
+import org.apache.syncope.core.persistence.api.entity.user.UMembership;
+import org.apache.syncope.core.persistence.api.entity.user.URelationship;
+import org.apache.syncope.core.persistence.api.entity.user.User;
+import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
+import org.elasticsearch.common.xcontent.XContentBuilder;
+import org.elasticsearch.common.xcontent.XContentFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Utility methods for usage with Elasticsearch.
+ */
+public class ElasticsearchUtils {
+
+ @Autowired
+ private UserDAO userDAO;
+
+ @Autowired
+ private GroupDAO groupDAO;
+
+ @Autowired
+ private AnyObjectDAO anyObjectDAO;
+
+ private int indexMaxResultWindow = 10000;
+
+ public void setIndexMaxResultWindow(final int indexMaxResultWindow) {
+ this.indexMaxResultWindow = indexMaxResultWindow;
+ }
+
+ public int getIndexMaxResultWindow() {
+ return indexMaxResultWindow;
+ }
+
+ /**
+ * Returns the builder specialized with content from the provided any.
+ *
+ * @param any user, group or any object to index
+ * @return builder specialized with content from the provided any
+ * @throws IOException in case of errors
+ */
+ @Transactional
+ public XContentBuilder builder(final Any<?> any) throws IOException {
+ XContentBuilder builder = XContentFactory.jsonBuilder().
+ startObject().
+ field("id", any.getKey()).
+ field("realm", any.getRealm().getFullPath()).
+ field("anyType", any.getType().getKey()).
+ field("creationDate", any.getCreationDate()).
+ field("creator", any.getCreator()).
+ field("lastChangeDate", any.getLastChangeDate()).
+ field("lastModified", any.getLastModifier()).
+ field("status", any.getStatus()).
+ field("resources",
+ any instanceof User
+ ? userDAO.findAllResourceKeys(any.getKey())
+ : any instanceof AnyObject
+ ? anyObjectDAO.findAllResourceKeys(any.getKey())
+ : any.getResourceKeys());
+
+ if (any instanceof AnyObject) {
+ AnyObject anyObject = ((AnyObject) any);
+ builder = builder.field("name", anyObject.getName());
+
+ List<Object> memberships = new ArrayList<Object>(anyObjectDAO.findAllGroupKeys(anyObject));
+ builder = builder.field("memberships", memberships);
+
+ List<Object> relationships = new ArrayList<>();
+ List<Object> relationshipTypes = new ArrayList<>();
+ for (ARelationship relationship : anyObjectDAO.findAllARelationships(anyObject)) {
+ relationships.add(relationship.getRightEnd().getKey());
+ relationshipTypes.add(relationship.getType().getKey());
+ }
+ builder = builder.field("relationships", relationships);
+ builder = builder.field("relationshipTypes", relationshipTypes);
+ } else if (any instanceof Group) {
+ Group group = ((Group) any);
+ builder = builder.field("name", group.getName());
+ if (group.getUserOwner() != null) {
+ builder = builder.field("userOwner", group.getUserOwner().getKey());
+ }
+ if (group.getGroupOwner() != null) {
+ builder = builder.field("groupOwner", group.getGroupOwner().getKey());
+ }
+
+ List<Object> members = CollectionUtils.collect(groupDAO.findUMemberships(group),
+ new Transformer<UMembership, Object>() {
+
+ @Override
+ public Object transform(final UMembership input) {
+ return input.getLeftEnd().getKey();
+ }
+ }, new ArrayList<>());
+ UDynGroupMembership udynmembership = group.getUDynMembership();
+ if (udynmembership != null) {
+ CollectionUtils.collect(udynmembership.getMembers(), EntityUtils.keyTransformer(), members);
+ }
+ CollectionUtils.collect(groupDAO.findAMemberships(group),
+ new Transformer<AMembership, Object>() {
+
+ @Override
+ public Object transform(final AMembership input) {
+ return input.getLeftEnd().getKey();
+ }
+ }, members);
+ for (ADynGroupMembership adynmembership : group.getADynMemberships()) {
+ CollectionUtils.collect(adynmembership.getMembers(), EntityUtils.keyTransformer(), members);
+ }
+ builder = builder.field("members", members);
+ } else if (any instanceof User) {
+ User user = ((User) any);
+ builder = builder.
+ field("username", user.getUsername()).
+ field("lastLoginDate", user.getLastLoginDate()).
+ field("lastRecertification", user.getLastRecertification()).
+ field("lastRecertificator", user.getLastRecertificator());
+
+ List<Object> roles = CollectionUtils.collect(userDAO.findAllRoles(user),
+ EntityUtils.<Role>keyTransformer(), new ArrayList<>());
+ builder = builder.field("roles", roles);
+
+ List<Object> memberships = new ArrayList<Object>(userDAO.findAllGroupKeys(user));
+ builder = builder.field("memberships", memberships);
+
+ List<Object> relationships = new ArrayList<>();
+ Set<Object> relationshipTypes = new HashSet<>();
+ for (URelationship relationship : user.getRelationships()) {
+ relationships.add(relationship.getRightEnd().getKey());
+ relationshipTypes.add(relationship.getType().getKey());
+ }
+ builder = builder.field("relationships", relationships);
+ builder = builder.field("relationshipTypes", relationshipTypes);
+ }
+
+ for (PlainAttr<?> plainAttr : any.getPlainAttrs()) {
+ List<Object> values = CollectionUtils.collect(plainAttr.getValues(),
+ new Transformer<PlainAttrValue, Object>() {
+
+ @Override
+ public Object transform(final PlainAttrValue input) {
+ return input.getValue();
+ }
+ }, new ArrayList<>(plainAttr.getValues().size()));
+ if (plainAttr.getUniqueValue() != null) {
+ values.add(plainAttr.getUniqueValue().getValue());
+ }
+
+ builder = builder.field(plainAttr.getSchema().getKey(), values);
+ }
+
+ builder = builder.endObject();
+
+ return builder;
+ }
+}