http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPPasswordSyncActions.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPPasswordSyncActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPPasswordSyncActions.java index fe1a8aa..992507b 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPPasswordSyncActions.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPPasswordSyncActions.java @@ -18,9 +18,9 @@ */ package org.apache.syncope.core.provisioning.java.sync; -import org.apache.syncope.common.lib.mod.AbstractSubjectMod; +import org.apache.syncope.common.lib.mod.AnyMod; import org.apache.syncope.common.lib.mod.UserMod; -import org.apache.syncope.common.lib.to.AbstractSubjectTO; +import org.apache.syncope.common.lib.to.AnyTO; import org.apache.syncope.common.lib.to.UserTO; import org.apache.syncope.common.lib.types.CipherAlgorithm; import org.apache.syncope.core.persistence.api.dao.UserDAO; @@ -53,7 +53,7 @@ public class LDAPPasswordSyncActions extends DefaultSyncActions { @Transactional(readOnly = true) @Override - public <T extends AbstractSubjectTO> SyncDelta beforeProvision( + public <T extends AnyTO> SyncDelta beforeProvision( final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T subject) throws JobExecutionException { @@ -68,7 +68,7 @@ public class LDAPPasswordSyncActions extends DefaultSyncActions { @Transactional(readOnly = true) @Override - public <T extends AbstractSubjectTO, K extends AbstractSubjectMod> SyncDelta beforeUpdate( + public <T extends AnyTO, K extends AnyMod> SyncDelta beforeUpdate( final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T subject, @@ -101,7 +101,7 @@ public class LDAPPasswordSyncActions extends DefaultSyncActions { @Transactional(readOnly = true) @Override - public <T extends AbstractSubjectTO> void after( + public <T extends AnyTO> void after( final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T subject,
http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/PushJobImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/PushJobImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/PushJobImpl.java index 7acc2ae..b13213a 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/PushJobImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/PushJobImpl.java @@ -22,21 +22,22 @@ import java.util.Collections; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.syncope.common.lib.SyncopeConstants; -import org.apache.syncope.common.lib.types.SubjectType; +import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.core.persistence.api.dao.GroupDAO; -import org.apache.syncope.core.persistence.api.dao.SubjectSearchDAO; 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.group.GMapping; -import org.apache.syncope.core.persistence.api.entity.group.Group; import org.apache.syncope.core.persistence.api.entity.task.PushTask; -import org.apache.syncope.core.persistence.api.entity.user.UMapping; import org.apache.syncope.core.persistence.api.entity.user.User; import org.apache.syncope.core.provisioning.api.Connector; import org.apache.syncope.core.provisioning.api.sync.ProvisioningProfile; import org.apache.syncope.core.provisioning.api.sync.PushActions; import org.apache.syncope.core.misc.spring.ApplicationContextProvider; import org.apache.syncope.core.misc.search.SearchCondConverter; +import org.apache.syncope.core.persistence.api.dao.AnyDAO; +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.entity.Any; +import org.apache.syncope.core.persistence.api.entity.resource.Provision; import org.apache.syncope.core.provisioning.api.job.PushJob; import org.apache.syncope.core.provisioning.api.sync.GroupPushResultHandler; import org.apache.syncope.core.provisioning.api.sync.UserPushResultHandler; @@ -65,7 +66,7 @@ public class PushJobImpl extends AbstractProvisioningJob<PushTask, PushActions> * Search DAO. */ @Autowired - private SubjectSearchDAO searchDAO; + private AnySearchDAO searchDAO; /** * Group DAO. @@ -73,28 +74,49 @@ public class PushJobImpl extends AbstractProvisioningJob<PushTask, PushActions> @Autowired private GroupDAO groupDAO; + @Autowired + private AnyObjectDAO anyObjectDAO; + + private AnyDAO<?> getAnyDAO(final AnyTypeKind anyTypeKind) { + AnyDAO<?> result; + switch (anyTypeKind) { + case USER: + result = userDAO; + break; + + case GROUP: + result = groupDAO; + break; + + case ANY_OBJECT: + default: + result = anyObjectDAO; + } + + return result; + } + @Override protected String executeWithSecurityContext( final PushTask pushTask, final Connector connector, - final UMapping uMapping, - final GMapping rMapping, final boolean dryRun) throws JobExecutionException { - LOG.debug("Execute synchronization (push) with resource {}", pushTask.getResource()); - final ProvisioningProfile<PushTask, PushActions> profile = new ProvisioningProfile<>(connector, pushTask); + LOG.debug("Executing push on {}", pushTask.getResource()); + + ProvisioningProfile<PushTask, PushActions> profile = new ProvisioningProfile<>(connector, pushTask); if (actions != null) { profile.getActions().addAll(actions); } profile.setDryRun(dryRun); profile.setResAct(null); - final UserPushResultHandler uhandler = + UserPushResultHandler uhandler = (UserPushResultHandler) ApplicationContextProvider.getApplicationContext().getBeanFactory(). createBean(UserPushResultHandlerImpl.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, false); uhandler.setProfile(profile); - final GroupPushResultHandler rhandler = + GroupPushResultHandler rhandler = (GroupPushResultHandler) ApplicationContextProvider.getApplicationContext().getBeanFactory(). createBean(GroupPushResultHandlerImpl.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, false); rhandler.setProfile(profile); @@ -105,43 +127,28 @@ public class PushJobImpl extends AbstractProvisioningJob<PushTask, PushActions> } } - if (uMapping != null) { - final int count = userDAO.count(SyncopeConstants.FULL_ADMIN_REALMS); - for (int page = 1; page <= (count / PAGE_SIZE) + 1; page++) { - final List<User> localUsers = StringUtils.isBlank(pushTask.getUserFilter()) - ? userDAO.findAll(SyncopeConstants.FULL_ADMIN_REALMS, page, PAGE_SIZE) - : searchDAO.<User>search(SyncopeConstants.FULL_ADMIN_REALMS, - SearchCondConverter.convert(pushTask.getUserFilter()), - Collections.<OrderByClause>emptyList(), SubjectType.USER); - - for (User localUser : localUsers) { - try { - // user propagation - uhandler.handle(localUser.getKey()); - } catch (Exception e) { - LOG.warn("Failure pushing user '{}' on '{}'", localUser, pushTask.getResource(), e); - throw new JobExecutionException("While pushing users on connector", e); - } - } - } - } - - if (rMapping != null) { - final int count = groupDAO.count(SyncopeConstants.FULL_ADMIN_REALMS); - for (int page = 1; page <= (count / PAGE_SIZE) + 1; page++) { - final List<Group> localGroups = StringUtils.isBlank(pushTask.getGroupFilter()) - ? groupDAO.findAll(SyncopeConstants.FULL_ADMIN_REALMS, page, PAGE_SIZE) - : searchDAO.<Group>search(SyncopeConstants.FULL_ADMIN_REALMS, - SearchCondConverter.convert(pushTask.getGroupFilter()), - Collections.<OrderByClause>emptyList(), SubjectType.GROUP); - - for (Group localGroup : localGroups) { - try { - // group propagation - rhandler.handle(localGroup.getKey()); - } catch (Exception e) { - LOG.warn("Failure pushing group '{}' on '{}'", localGroup, pushTask.getResource(), e); - throw new JobExecutionException("While pushing groups on connector", e); + for (Provision provision : pushTask.getResource().getProvisions()) { + if (provision.getMapping() != null) { + AnyDAO<?> anyDAO = getAnyDAO(provision.getAnyType().getKind()); + String filter = pushTask.getFilter(provision.getAnyType()) == null + ? null + : pushTask.getFilter(provision.getAnyType()).get(); + + int count = anyDAO.count(SyncopeConstants.FULL_ADMIN_REALMS); + for (int page = 1; page <= (count / PAGE_SIZE) + 1; page++) { + List<? extends Any<?, ?, ?>> localAnys = StringUtils.isBlank(filter) + ? anyDAO.findAll(SyncopeConstants.FULL_ADMIN_REALMS, page, PAGE_SIZE) + : searchDAO.<User>search(SyncopeConstants.FULL_ADMIN_REALMS, + SearchCondConverter.convert(filter), + Collections.<OrderByClause>emptyList(), provision.getAnyType().getKind()); + + for (Any<?, ?, ?> any : localAnys) { + try { + uhandler.handle(any.getKey()); + } catch (Exception e) { + LOG.warn("Failure pushing user '{}' on '{}'", any, pushTask.getResource(), e); + throw new JobExecutionException("While pushing users on connector", e); + } } } } @@ -153,10 +160,8 @@ public class PushJobImpl extends AbstractProvisioningJob<PushTask, PushActions> } } - final String result = createReport(profile.getResults(), pushTask.getResource().getSyncTraceLevel(), dryRun); - + String result = createReport(profile.getResults(), pushTask.getResource().getSyncTraceLevel(), dryRun); LOG.debug("Sync result: {}", result); - return result; } } http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobImpl.java index 54e5115..1e19d02 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncJobImpl.java @@ -23,20 +23,21 @@ import org.apache.commons.lang3.StringUtils; import org.apache.syncope.common.lib.mod.ReferenceMod; import org.apache.syncope.common.lib.mod.GroupMod; import org.apache.syncope.common.lib.types.SyncPolicySpec; -import org.apache.syncope.core.persistence.api.entity.ExternalResource; -import org.apache.syncope.core.persistence.api.entity.group.GMapping; import org.apache.syncope.core.persistence.api.entity.task.ProvisioningTask; import org.apache.syncope.core.persistence.api.entity.task.SyncTask; -import org.apache.syncope.core.persistence.api.entity.user.UMapping; import org.apache.syncope.core.provisioning.api.Connector; import org.apache.syncope.core.provisioning.api.sync.ProvisioningProfile; import org.apache.syncope.core.provisioning.api.sync.SyncActions; import org.apache.syncope.core.misc.spring.ApplicationContextProvider; +import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; +import org.apache.syncope.core.persistence.api.entity.resource.Provision; import org.apache.syncope.core.provisioning.api.job.SyncJob; +import org.apache.syncope.core.provisioning.api.sync.AnyObjectSyncResultHandler; import org.apache.syncope.core.provisioning.api.sync.GroupSyncResultHandler; import org.apache.syncope.core.provisioning.api.sync.UserSyncResultHandler; import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter; import org.identityconnectors.framework.common.objects.ObjectClass; +import org.identityconnectors.framework.common.objects.SyncResultsHandler; import org.identityconnectors.framework.common.objects.SyncToken; import org.quartz.JobExecutionException; import org.springframework.beans.factory.annotation.Autowired; @@ -57,7 +58,7 @@ public class SyncJobImpl extends AbstractProvisioningJob<SyncTask, SyncActions> private GroupWorkflowAdapter gwfAdapter; @Autowired - protected SyncUtils syncUtilities; + protected SyncUtils syncUtils; protected void setGroupOwners(final GroupSyncResultHandler rhandler) { for (Map.Entry<Long, String> entry : rhandler.getGroupOwnerMap().entrySet()) { @@ -68,24 +69,24 @@ public class SyncJobImpl extends AbstractProvisioningJob<SyncTask, SyncActions> groupMod.setGroupOwner(null); groupMod.setUserOwner(null); } else { - Long userId = syncUtilities.findMatchingAttributableKey( - ObjectClass.ACCOUNT, + Long userKey = syncUtils.findMatchingAnyKey( + anyTypeDAO.findUser(), entry.getValue(), rhandler.getProfile().getTask().getResource(), rhandler.getProfile().getConnector()); - if (userId == null) { - Long groupId = syncUtilities.findMatchingAttributableKey( - ObjectClass.GROUP, + if (userKey == null) { + Long groupKey = syncUtils.findMatchingAnyKey( + anyTypeDAO.findGroup(), entry.getValue(), rhandler.getProfile().getTask().getResource(), rhandler.getProfile().getConnector()); - if (groupId != null) { - groupMod.setGroupOwner(new ReferenceMod(groupId)); + if (groupKey != null) { + groupMod.setGroupOwner(new ReferenceMod(groupKey)); } } else { - groupMod.setUserOwner(new ReferenceMod(userId)); + groupMod.setUserOwner(new ReferenceMod(userKey)); } } @@ -97,11 +98,9 @@ public class SyncJobImpl extends AbstractProvisioningJob<SyncTask, SyncActions> protected String executeWithSecurityContext( final SyncTask syncTask, final Connector connector, - final UMapping uMapping, - final GMapping rMapping, final boolean dryRun) throws JobExecutionException { - LOG.debug("Execute synchronization with token {}", syncTask.getResource().getUsyncToken()); + LOG.debug("Executing sync on {}", syncTask.getResource()); ProvisioningProfile<SyncTask, SyncActions> profile = new ProvisioningProfile<>(connector, syncTask); if (actions != null) { @@ -110,6 +109,12 @@ public class SyncJobImpl extends AbstractProvisioningJob<SyncTask, SyncActions> profile.setDryRun(dryRun); profile.setResAct(getSyncPolicySpec(syncTask).getConflictResolutionAction()); + // Prepare handler for SyncDelta objects (any objects) + AnyObjectSyncResultHandler ahandler = + (AnyObjectSyncResultHandler) ApplicationContextProvider.getApplicationContext().getBeanFactory(). + createBean(AnyObjectSyncResultHandlerImpl.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, false); + ahandler.setProfile(profile); + // Prepare handler for SyncDelta objects (users) UserSyncResultHandler uhandler = (UserSyncResultHandler) ApplicationContextProvider.getApplicationContext().getBeanFactory(). @@ -117,10 +122,10 @@ public class SyncJobImpl extends AbstractProvisioningJob<SyncTask, SyncActions> uhandler.setProfile(profile); // Prepare handler for SyncDelta objects (groups) - GroupSyncResultHandler rhandler = + GroupSyncResultHandler ghandler = (GroupSyncResultHandler) ApplicationContextProvider.getApplicationContext().getBeanFactory(). createBean(GroupSyncResultHandlerImpl.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, false); - rhandler.setProfile(profile); + ghandler.setProfile(profile); if (actions != null && !profile.isDryRun()) { for (SyncActions action : actions) { @@ -129,47 +134,49 @@ public class SyncJobImpl extends AbstractProvisioningJob<SyncTask, SyncActions> } try { - SyncToken latestUSyncToken = null; - if (uMapping != null && !syncTask.isFullReconciliation()) { - latestUSyncToken = connector.getLatestSyncToken(ObjectClass.ACCOUNT); - } - SyncToken latestRSyncToken = null; - if (rMapping != null && !syncTask.isFullReconciliation()) { - latestRSyncToken = connector.getLatestSyncToken(ObjectClass.GROUP); - } - - if (syncTask.isFullReconciliation()) { - if (uMapping != null) { - connector.getAllObjects(ObjectClass.ACCOUNT, uhandler, - connector.getOperationOptions(uMapping.getItems())); - } - if (rMapping != null) { - connector.getAllObjects(ObjectClass.GROUP, rhandler, - connector.getOperationOptions(rMapping.getItems())); - } - } else { - if (uMapping != null) { - connector.sync(ObjectClass.ACCOUNT, syncTask.getResource().getUsyncToken(), uhandler, - connector.getOperationOptions(uMapping.getItems())); + for (Provision provision : syncTask.getResource().getProvisions()) { + SyncResultsHandler handler; + switch (provision.getAnyType().getKind()) { + case USER: + handler = uhandler; + break; + + case GROUP: + handler = ghandler; + break; + + case ANY_OBJECT: + default: + handler = ahandler; } - if (rMapping != null) { - connector.sync(ObjectClass.GROUP, syncTask.getResource().getRsyncToken(), rhandler, - connector.getOperationOptions(rMapping.getItems())); + + SyncToken latestSyncToken = null; + if (provision.getMapping() != null && !syncTask.isFullReconciliation()) { + latestSyncToken = connector.getLatestSyncToken(ObjectClass.ACCOUNT); } - } - if (!dryRun && !syncTask.isFullReconciliation()) { - try { - ExternalResource resource = resourceDAO.find(syncTask.getResource().getKey()); - if (uMapping != null) { - resource.setUsyncToken(latestUSyncToken); + if (syncTask.isFullReconciliation()) { + if (provision.getMapping() != null) { + connector.getAllObjects(provision.getObjectClass(), handler, + connector.getOperationOptions(provision.getMapping().getItems())); + } + } else { + if (provision.getMapping() != null) { + connector.sync(provision.getObjectClass(), provision.getSyncToken(), handler, + connector.getOperationOptions(provision.getMapping().getItems())); } - if (rMapping != null) { - resource.setRsyncToken(latestRSyncToken); + } + + if (!dryRun && !syncTask.isFullReconciliation()) { + try { + ExternalResource resource = resourceDAO.find(syncTask.getResource().getKey()); + if (provision.getMapping() != null) { + provision.setSyncToken(latestSyncToken); + } + resourceDAO.save(resource); + } catch (Exception e) { + throw new JobExecutionException("While updating SyncToken", e); } - resourceDAO.save(resource); - } catch (Exception e) { - throw new JobExecutionException("While updating SyncToken", e); } } } catch (Throwable t) { @@ -177,7 +184,7 @@ public class SyncJobImpl extends AbstractProvisioningJob<SyncTask, SyncActions> } try { - setGroupOwners(rhandler); + setGroupOwners(ghandler); } catch (Exception e) { LOG.error("While setting group owners", e); } http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java index 7dabe8f..e751522 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java @@ -25,29 +25,32 @@ import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.apache.syncope.common.lib.SyncopeConstants; -import org.apache.syncope.common.lib.types.AttributableType; +import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.MappingPurpose; -import org.apache.syncope.common.lib.types.SubjectType; import org.apache.syncope.common.lib.types.SyncPolicySpec; import org.apache.syncope.core.persistence.api.attrvalue.validation.ParsingValidationException; +import org.apache.syncope.core.persistence.api.dao.AnyDAO; +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.AnyTypeDAO; import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO; import org.apache.syncope.core.persistence.api.dao.PolicyDAO; import org.apache.syncope.core.persistence.api.dao.GroupDAO; -import org.apache.syncope.core.persistence.api.dao.SubjectDAO; -import org.apache.syncope.core.persistence.api.dao.SubjectSearchDAO; import org.apache.syncope.core.persistence.api.dao.UserDAO; +import org.apache.syncope.core.persistence.api.dao.search.AnyCond; import org.apache.syncope.core.persistence.api.dao.search.AttributeCond; 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.dao.search.SubjectCond; -import org.apache.syncope.core.persistence.api.entity.AttributableUtils; -import org.apache.syncope.core.persistence.api.entity.AttributableUtilsFactory; -import org.apache.syncope.core.persistence.api.entity.ExternalResource; -import org.apache.syncope.core.persistence.api.entity.MappingItem; +import org.apache.syncope.core.persistence.api.entity.Any; +import org.apache.syncope.core.persistence.api.entity.AnyType; +import org.apache.syncope.core.persistence.api.entity.AnyUtils; +import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory; import org.apache.syncope.core.persistence.api.entity.PlainAttrValue; import org.apache.syncope.core.persistence.api.entity.PlainSchema; -import org.apache.syncope.core.persistence.api.entity.Subject; import org.apache.syncope.core.persistence.api.entity.group.Group; +import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; +import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; +import org.apache.syncope.core.persistence.api.entity.resource.Provision; import org.apache.syncope.core.persistence.api.entity.task.ProvisioningTask; import org.apache.syncope.core.persistence.api.entity.user.User; import org.apache.syncope.core.provisioning.api.Connector; @@ -56,7 +59,6 @@ import org.identityconnectors.framework.common.objects.Attribute; import org.identityconnectors.framework.common.objects.AttributeUtil; import org.identityconnectors.framework.common.objects.ConnectorObject; import org.identityconnectors.framework.common.objects.Name; -import org.identityconnectors.framework.common.objects.ObjectClass; import org.identityconnectors.framework.common.objects.OperationalAttributes; import org.identityconnectors.framework.common.objects.filter.EqualsFilter; import org.slf4j.Logger; @@ -84,6 +86,15 @@ public class SyncUtils { @Autowired protected PlainSchemaDAO plainSchemaDAO; + @Autowired + protected AnyTypeDAO anyTypeDAO; + + /** + * Any Object DAO. + */ + @Autowired + protected AnyObjectDAO anyObjectDAO; + /** * User DAO. */ @@ -100,43 +111,49 @@ public class SyncUtils { * Search DAO. */ @Autowired - protected SubjectSearchDAO searchDAO; + protected AnySearchDAO searchDAO; @Autowired - protected AttributableUtilsFactory attrUtilsFactory; + protected AnyUtilsFactory anyUtilsFactory; - public Long findMatchingAttributableKey( - final ObjectClass oclass, + public Long findMatchingAnyKey( + final AnyType anyType, final String name, final ExternalResource resource, final Connector connector) { + Provision provision = resource.getProvision(anyType); + if (provision == null) { + return null; + } + Long result = null; - final AttributableUtils attrUtils = attrUtilsFactory.getInstance(oclass); + AnyUtils anyUtils = anyUtilsFactory.getInstance(anyType.getKind()); - final List<ConnectorObject> found = connector.search(oclass, + List<ConnectorObject> found = connector.search(provision.getObjectClass(), new EqualsFilter(new Name(name)), connector.getOperationOptions( - attrUtils.getMappingItems(resource, MappingPurpose.SYNCHRONIZATION))); + anyUtils.getMappingItems(provision, MappingPurpose.SYNCHRONIZATION))); if (found.isEmpty()) { - LOG.debug("No {} found on {} with __NAME__ {}", oclass, resource, name); + LOG.debug("No {} found on {} with __NAME__ {}", provision.getObjectClass(), resource, name); } else { if (found.size() > 1) { - LOG.warn("More than one {} found on {} with __NAME__ {} - taking first only", oclass, resource, name); + LOG.warn("More than one {} found on {} with __NAME__ {} - taking first only", + provision.getObjectClass(), resource, name); } ConnectorObject connObj = found.iterator().next(); try { - List<Long> subjectKeys = findExisting(connObj.getUid().getUidValue(), connObj, resource, attrUtils); - if (subjectKeys.isEmpty()) { - LOG.debug("No matching {} found for {}, aborting", attrUtils.getType(), connObj); + List<Long> anyKeys = findExisting(connObj.getUid().getUidValue(), connObj, provision, anyUtils); + if (anyKeys.isEmpty()) { + LOG.debug("No matching {} found for {}, aborting", anyUtils.getAnyTypeKind(), connObj); } else { - if (subjectKeys.size() > 1) { - LOG.warn("More than one {} found {} - taking first only", attrUtils.getType(), subjectKeys); + if (anyKeys.size() > 1) { + LOG.warn("More than one {} found {} - taking first only", anyUtils.getAnyTypeKind(), anyKeys); } - result = subjectKeys.iterator().next(); + result = anyKeys.iterator().next(); } } catch (IllegalArgumentException e) { LOG.warn(e.getMessage()); @@ -146,21 +163,26 @@ public class SyncUtils { return result; } - private SubjectDAO<?, ?, ?> getSubjectDAO(final MappingItem accountIdItem) { - return AttributableType.USER == accountIdItem.getIntMappingType().getAttributableType() ? userDAO : groupDAO; + private AnyDAO<?> getAnyDAO(final MappingItem accountIdItem) { + return AnyTypeKind.USER == accountIdItem.getIntMappingType().getAnyTypeKind() + ? userDAO + : AnyTypeKind.ANY_OBJECT == accountIdItem.getIntMappingType().getAnyTypeKind() + ? anyObjectDAO + : groupDAO; } - private List<Long> findByAccountIdItem( - final String uid, final ExternalResource resource, final AttributableUtils attrUtils) { - final List<Long> result = new ArrayList<>(); + private List<Long> findByConnObjectKeyItem( + final String uid, final Provision provision, final AnyUtils anyUtils) { - final MappingItem accountIdItem = attrUtils.getAccountIdItem(resource); - switch (accountIdItem.getIntMappingType()) { + List<Long> result = new ArrayList<>(); + + MappingItem connObjectKeyItem = anyUtils.getConnObjectKeyItem(provision); + switch (connObjectKeyItem.getIntMappingType()) { case UserPlainSchema: case GroupPlainSchema: - final PlainAttrValue value = attrUtils.newPlainAttrValue(); + final PlainAttrValue value = anyUtils.newPlainAttrValue(); - PlainSchema schema = plainSchemaDAO.find(accountIdItem.getIntAttrName(), attrUtils.plainSchemaClass()); + PlainSchema schema = plainSchemaDAO.find(connObjectKeyItem.getIntAttrName()); if (schema == null) { value.setStringValue(uid); } else { @@ -172,19 +194,18 @@ public class SyncUtils { } } - List<? extends Subject<?, ?, ?>> subjects = - getSubjectDAO(accountIdItem).findByAttrValue(accountIdItem.getIntAttrName(), value, attrUtils); - for (Subject<?, ?, ?> subject : subjects) { - result.add(subject.getKey()); + List<? extends Any<?, ?, ?>> anys = + getAnyDAO(connObjectKeyItem).findByAttrValue(connObjectKeyItem.getIntAttrName(), value); + for (Any<?, ?, ?> any : anys) { + result.add(any.getKey()); } break; case UserDerivedSchema: case GroupDerivedSchema: - subjects = getSubjectDAO(accountIdItem). - findByDerAttrValue(accountIdItem.getIntAttrName(), uid, attrUtils); - for (Subject<?, ?, ?> subject : subjects) { - result.add(subject.getKey()); + anys = getAnyDAO(connObjectKeyItem).findByDerAttrValue(connObjectKeyItem.getIntAttrName(), uid); + for (Any<?, ?, ?> any : anys) { + result.add(any.getKey()); } break; @@ -217,40 +238,40 @@ public class SyncUtils { break; default: - LOG.error("Invalid accountId type '{}'", accountIdItem.getIntMappingType()); + LOG.error("Invalid accountId type '{}'", connObjectKeyItem.getIntMappingType()); } return result; } - private List<Long> search(final SearchCond searchCond, final SubjectType type) { + private List<Long> search(final SearchCond searchCond, final AnyTypeKind type) { final List<Long> result = new ArrayList<>(); - List<Subject<?, ?, ?>> subjects = searchDAO.search( + List<Any<?, ?, ?>> anys = searchDAO.search( SyncopeConstants.FULL_ADMIN_REALMS, searchCond, Collections.<OrderByClause>emptyList(), type); - for (Subject<?, ?, ?> subject : subjects) { - result.add(subject.getKey()); + for (Any<?, ?, ?> any : anys) { + result.add(any.getKey()); } return result; } private List<Long> findByCorrelationRule( - final ConnectorObject connObj, final SyncCorrelationRule rule, final SubjectType type) { + final ConnectorObject connObj, final SyncCorrelationRule rule, final AnyTypeKind type) { return search(rule.getSearchCond(connObj), type); } - private List<Long> findByAttributableSearch( + private List<Long> findByAnySearch( final ConnectorObject connObj, final List<String> altSearchSchemas, - final ExternalResource resource, - final AttributableUtils attrUtils) { + final Provision provision, + final AnyUtils anyUtils) { // search for external attribute's name/value of each specified name - final Map<String, Attribute> extValues = new HashMap<>(); + Map<String, Attribute> extValues = new HashMap<>(); - for (MappingItem item : attrUtils.getMappingItems(resource, MappingPurpose.SYNCHRONIZATION)) { + for (MappingItem item : anyUtils.getMappingItems(provision, MappingPurpose.SYNCHRONIZATION)) { extValues.put(item.getIntAttrName(), connObj.getAttributeByName(item.getExtAttrName())); } @@ -285,7 +306,7 @@ public class SyncUtils { if ("key".equalsIgnoreCase(schema) || "username".equalsIgnoreCase(schema) || "name".equalsIgnoreCase(schema)) { - SubjectCond cond = new SubjectCond(); + AnyCond cond = new AnyCond(); cond.setSchema(schema); cond.setType(type); cond.setExpression(expression); @@ -305,24 +326,13 @@ public class SyncUtils { : SearchCond.getAndCond(searchCond, nodeCond); } - return search(searchCond, SubjectType.valueOf(attrUtils.getType().name())); + return search(searchCond, anyUtils.getAnyTypeKind()); } - private SyncCorrelationRule getCorrelationRule(final AttributableType type, final SyncPolicySpec policySpec) { - String clazz; - - switch (type) { - case USER: - clazz = policySpec.getUserJavaRule(); - break; - case GROUP: - clazz = policySpec.getGroupJavaRule(); - break; - case MEMBERSHIP: - case CONFIGURATION: - default: - clazz = null; - } + private SyncCorrelationRule getCorrelationRule(final Provision provision, final SyncPolicySpec policySpec) { + String clazz = policySpec.getItem(provision.getAnyType().getKey()) == null + ? null + : policySpec.getItem(provision.getAnyType().getKey()).getJavaRule(); SyncCorrelationRule res = null; @@ -337,22 +347,10 @@ public class SyncUtils { return res; } - private List<String> getAltSearchSchemas(final AttributableType type, final SyncPolicySpec policySpec) { - List<String> result = Collections.emptyList(); - - switch (type) { - case USER: - result = policySpec.getuAltSearchSchemas(); - break; - case GROUP: - result = policySpec.getrAltSearchSchemas(); - break; - case MEMBERSHIP: - case CONFIGURATION: - default: - } - - return result; + private List<String> getAltSearchSchemas(final Provision provision, final SyncPolicySpec policySpec) { + return policySpec.getItem(provision.getAnyType().getKey()) == null + ? Collections.<String>emptyList() + : policySpec.getItem(provision.getAnyType().getKey()).getAltSearchSchemas(); } /** @@ -360,33 +358,33 @@ public class SyncUtils { * * @param uid for finding by account id * @param connObj for finding by attribute value - * @param resource external resource - * @param attrUtils attributable util + * @param provision external resource + * @param anyUtils any util * @return list of matching users / groups */ public List<Long> findExisting( final String uid, final ConnectorObject connObj, - final ExternalResource resource, - final AttributableUtils attrUtils) { + final Provision provision, + final AnyUtils anyUtils) { SyncPolicySpec syncPolicySpec = null; - if (resource.getSyncPolicy() != null) { - syncPolicySpec = resource.getSyncPolicy().getSpecification(SyncPolicySpec.class); + if (provision.getResource().getSyncPolicy() != null) { + syncPolicySpec = provision.getResource().getSyncPolicy().getSpecification(SyncPolicySpec.class); } SyncCorrelationRule syncRule = null; List<String> altSearchSchemas = null; if (syncPolicySpec != null) { - syncRule = getCorrelationRule(attrUtils.getType(), syncPolicySpec); - altSearchSchemas = getAltSearchSchemas(attrUtils.getType(), syncPolicySpec); + syncRule = getCorrelationRule(provision, syncPolicySpec); + altSearchSchemas = getAltSearchSchemas(provision, syncPolicySpec); } return syncRule == null ? altSearchSchemas == null || altSearchSchemas.isEmpty() - ? findByAccountIdItem(uid, resource, attrUtils) - : findByAttributableSearch(connObj, altSearchSchemas, resource, attrUtils) - : findByCorrelationRule(connObj, syncRule, SubjectType.valueOf(attrUtils.getType().name())); + ? findByConnObjectKeyItem(uid, provision, anyUtils) + : findByAnySearch(connObj, altSearchSchemas, provision, anyUtils) + : findByCorrelationRule(connObj, syncRule, anyUtils.getAnyTypeKind()); } public Boolean readEnabled(final ConnectorObject connectorObject, final ProvisioningTask task) { http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/UserPushResultHandlerImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/UserPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/UserPushResultHandlerImpl.java index 87d72e6..dc1ea5a 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/UserPushResultHandlerImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/UserPushResultHandlerImpl.java @@ -22,15 +22,14 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.syncope.common.lib.mod.UserMod; -import org.apache.syncope.common.lib.to.AbstractSubjectTO; +import org.apache.syncope.common.lib.to.AnyTO; import org.apache.syncope.common.lib.to.UserTO; -import org.apache.syncope.common.lib.types.AttributableType; +import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.PropagationByResource; import org.apache.syncope.common.lib.types.ResourceOperation; -import org.apache.syncope.core.persistence.api.entity.AttributableUtils; -import org.apache.syncope.core.persistence.api.entity.Mapping; -import org.apache.syncope.core.persistence.api.entity.MappingItem; -import org.apache.syncope.core.persistence.api.entity.Subject; +import org.apache.syncope.core.persistence.api.entity.Any; +import org.apache.syncope.core.persistence.api.entity.AnyUtils; +import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; import org.apache.syncope.core.persistence.api.entity.user.User; import org.apache.syncope.core.provisioning.api.TimeoutException; import org.apache.syncope.core.provisioning.api.sync.UserPushResultHandler; @@ -41,31 +40,31 @@ import org.identityconnectors.framework.common.objects.Uid; public class UserPushResultHandlerImpl extends AbstractPushResultHandler implements UserPushResultHandler { @Override - protected AttributableUtils getAttributableUtils() { - return attrUtilsFactory.getInstance(AttributableType.USER); + protected AnyUtils getAnyUtils() { + return anyUtilsFactory.getInstance(AnyTypeKind.USER); } @Override - protected Subject<?, ?, ?> deprovision(final Subject<?, ?, ?> sbj) { - final UserTO before = userDataBinder.getUserTO(sbj.getKey()); + protected Any<?, ?, ?> deprovision(final Any<?, ?, ?> sbj) { + UserTO before = userDataBinder.getUserTO(sbj.getKey()); - final List<String> noPropResources = new ArrayList<>(before.getResources()); + List<String> noPropResources = new ArrayList<>(before.getResources()); noPropResources.remove(profile.getTask().getResource().getKey()); taskExecutor.execute(propagationManager.getUserDeleteTasks(before.getKey(), Collections.singleton(profile.getTask().getResource().getKey()), noPropResources)); - return userDAO.authFetch(before.getKey()); + return userDAO.authFind(before.getKey()); } @Override - protected Subject<?, ?, ?> provision(final Subject<?, ?, ?> sbj, final Boolean enabled) { - final UserTO before = userDataBinder.getUserTO(sbj.getKey()); + protected Any<?, ?, ?> provision(final Any<?, ?, ?> sbj, final Boolean enabled) { + UserTO before = userDataBinder.getUserTO(sbj.getKey()); - final List<String> noPropResources = new ArrayList<>(before.getResources()); + List<String> noPropResources = new ArrayList<>(before.getResources()); noPropResources.remove(profile.getTask().getResource().getKey()); - final PropagationByResource propByRes = new PropagationByResource(); + PropagationByResource propByRes = new PropagationByResource(); propByRes.add(ResourceOperation.CREATE, profile.getTask().getResource().getKey()); taskExecutor.execute(propagationManager.getUserCreateTasks( @@ -74,15 +73,14 @@ public class UserPushResultHandlerImpl extends AbstractPushResultHandler impleme propByRes, null, Collections.unmodifiableCollection(before.getVirAttrs()), - Collections.unmodifiableCollection(before.getMemberships()), noPropResources)); - return userDAO.authFetch(before.getKey()); + return userDAO.authFind(before.getKey()); } @Override - protected Subject<?, ?, ?> link(final Subject<?, ?, ?> sbj, final Boolean unlink) { - final UserMod userMod = new UserMod(); + protected Any<?, ?, ?> link(final Any<?, ?, ?> sbj, final Boolean unlink) { + UserMod userMod = new UserMod(); userMod.setKey(sbj.getKey()); if (unlink) { @@ -93,12 +91,12 @@ public class UserPushResultHandlerImpl extends AbstractPushResultHandler impleme uwfAdapter.update(userMod); - return userDAO.authFetch(userMod.getKey()); + return userDAO.authFind(userMod.getKey()); } @Override - protected Subject<?, ?, ?> unassign(final Subject<?, ?, ?> sbj) { - final UserMod userMod = new UserMod(); + protected Any<?, ?, ?> unassign(final Any<?, ?, ?> sbj) { + UserMod userMod = new UserMod(); userMod.setKey(sbj.getKey()); userMod.getResourcesToRemove().add(profile.getTask().getResource().getKey()); uwfAdapter.update(userMod); @@ -106,8 +104,8 @@ public class UserPushResultHandlerImpl extends AbstractPushResultHandler impleme } @Override - protected Subject<?, ?, ?> assign(final Subject<?, ?, ?> sbj, final Boolean enabled) { - final UserMod userMod = new UserMod(); + protected Any<?, ?, ?> assign(final Any<?, ?, ?> sbj, final Boolean enabled) { + UserMod userMod = new UserMod(); userMod.setKey(sbj.getKey()); userMod.getResourcesToAdd().add(profile.getTask().getResource().getKey()); uwfAdapter.update(userMod); @@ -115,12 +113,12 @@ public class UserPushResultHandlerImpl extends AbstractPushResultHandler impleme } @Override - protected String getName(final Subject<?, ?, ?> subject) { + protected String getName(final Any<?, ?, ?> subject) { return User.class.cast(subject).getUsername(); } @Override - protected AbstractSubjectTO getSubjectTO(final long key) { + protected AnyTO getAnyTO(final long key) { try { return userDataBinder.getUserTO(key); } catch (Exception e) { @@ -130,9 +128,9 @@ public class UserPushResultHandlerImpl extends AbstractPushResultHandler impleme } @Override - protected Subject<?, ?, ?> getSubject(final long key) { + protected Any<?, ?, ?> getAny(final long key) { try { - return userDAO.authFetch(key); + return userDAO.authFind(key); } catch (Exception e) { LOG.warn("Error retrieving user {}", key, e); return null; @@ -140,14 +138,13 @@ public class UserPushResultHandlerImpl extends AbstractPushResultHandler impleme } @Override - protected ConnectorObject getRemoteObject(final String accountId) { + protected ConnectorObject getRemoteObject(final String connObjectKey, final ObjectClass objectClass) { ConnectorObject obj = null; - try { - final Uid uid = new Uid(accountId); + Uid uid = new Uid(connObjectKey); obj = profile.getConnector().getObject( - ObjectClass.ACCOUNT, + objectClass, uid, profile.getConnector().getOperationOptions(Collections.<MappingItem>emptySet())); @@ -155,13 +152,9 @@ public class UserPushResultHandlerImpl extends AbstractPushResultHandler impleme LOG.debug("Request timeout", toe); throw toe; } catch (RuntimeException ignore) { - LOG.debug("While resolving {}", accountId, ignore); + LOG.debug("While resolving {}", connObjectKey, ignore); } - return obj; - } - @Override - protected Mapping<?> getMapping() { - return profile.getTask().getResource().getUmapping(); + return obj; } } http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/UserSyncResultHandlerImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/UserSyncResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/UserSyncResultHandlerImpl.java index d32a855..3e99286 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/UserSyncResultHandlerImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/UserSyncResultHandlerImpl.java @@ -21,13 +21,13 @@ package org.apache.syncope.core.provisioning.java.sync; import java.util.Collections; import java.util.List; import java.util.Map; -import org.apache.syncope.common.lib.mod.AbstractSubjectMod; +import org.apache.syncope.common.lib.mod.AnyMod; import org.apache.syncope.common.lib.mod.UserMod; -import org.apache.syncope.common.lib.to.AbstractSubjectTO; +import org.apache.syncope.common.lib.to.AnyTO; import org.apache.syncope.common.lib.to.PropagationStatus; import org.apache.syncope.common.lib.to.UserTO; -import org.apache.syncope.common.lib.types.AttributableType; -import org.apache.syncope.core.persistence.api.entity.AttributableUtils; +import org.apache.syncope.common.lib.types.AnyTypeKind; +import org.apache.syncope.core.persistence.api.entity.AnyUtils; import org.apache.syncope.core.provisioning.api.sync.ProvisioningResult; import org.apache.syncope.core.provisioning.api.sync.UserSyncResultHandler; import org.identityconnectors.framework.common.objects.SyncDelta; @@ -35,17 +35,17 @@ import org.identityconnectors.framework.common.objects.SyncDelta; public class UserSyncResultHandlerImpl extends AbstractSyncResultHandler implements UserSyncResultHandler { @Override - protected AttributableUtils getAttributableUtils() { - return attrUtilsFactory.getInstance(AttributableType.USER); + protected AnyUtils getAnyUtils() { + return anyUtilsFactory.getInstance(AnyTypeKind.USER); } @Override - protected String getName(final AbstractSubjectTO subjectTO) { + protected String getName(final AnyTO subjectTO) { return UserTO.class.cast(subjectTO).getUsername(); } @Override - protected AbstractSubjectTO getSubjectTO(final long key) { + protected AnyTO getAnyTO(final long key) { try { return userDataBinder.getUserTO(key); } catch (Exception e) { @@ -55,20 +55,7 @@ public class UserSyncResultHandlerImpl extends AbstractSyncResultHandler impleme } @Override - protected AbstractSubjectMod getSubjectMod( - final AbstractSubjectTO subjectTO, final SyncDelta delta) { - - return connObjectUtils.getAttributableMod(subjectTO.getKey(), - delta.getObject(), - subjectTO, - profile.getTask(), - getAttributableUtils()); - } - - @Override - protected AbstractSubjectTO doCreate( - final AbstractSubjectTO subjectTO, final SyncDelta delta, final ProvisioningResult result) { - + protected AnyTO doCreate(final AnyTO subjectTO, final SyncDelta delta, final ProvisioningResult result) { UserTO userTO = UserTO.class.cast(subjectTO); Boolean enabled = syncUtilities.readEnabled(delta.getObject(), profile.getTask()); @@ -81,8 +68,8 @@ public class UserSyncResultHandlerImpl extends AbstractSyncResultHandler impleme } @Override - protected AbstractSubjectTO doLink( - final AbstractSubjectTO before, + protected AnyTO doLink( + final AnyTO before, final ProvisioningResult result, final boolean unlink) { @@ -99,13 +86,13 @@ public class UserSyncResultHandlerImpl extends AbstractSyncResultHandler impleme } @Override - protected AbstractSubjectTO doUpdate( - final AbstractSubjectTO before, - final AbstractSubjectMod subjectMod, + protected AnyTO doUpdate( + final AnyTO before, + final AnyMod anyMod, final SyncDelta delta, final ProvisioningResult result) { - final UserMod userMod = UserMod.class.cast(subjectMod); + final UserMod userMod = UserMod.class.cast(anyMod); final Boolean enabled = syncUtilities.readEnabled(delta.getObject(), profile.getTask()); Map.Entry<Long, List<PropagationStatus>> updated = userProvisioningManager.update(userMod, before.getKey(), http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ConnectorManagerTest.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ConnectorManagerTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ConnectorManagerTest.java index 9ddc91d..138fee3 100644 --- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ConnectorManagerTest.java +++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ConnectorManagerTest.java @@ -18,12 +18,10 @@ */ package org.apache.syncope.core.provisioning.java; -import org.apache.syncope.core.provisioning.java.ConnectorManager; - import static org.junit.Assert.assertEquals; import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO; -import org.apache.syncope.core.persistence.api.entity.ExternalResource; +import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; import org.apache.syncope.core.provisioning.api.ConnIdBundleManager; import org.apache.syncope.core.provisioning.api.Connector; import org.apache.syncope.core.misc.spring.ApplicationContextProvider; http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderTest.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderTest.java index a8305a6..51245e4 100644 --- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderTest.java +++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderTest.java @@ -27,15 +27,17 @@ import java.util.HashSet; import java.util.Set; import org.apache.syncope.common.lib.to.MappingItemTO; import org.apache.syncope.common.lib.to.MappingTO; +import org.apache.syncope.common.lib.to.ProvisionTO; import org.apache.syncope.common.lib.to.ResourceTO; import org.apache.syncope.common.lib.types.IntMappingType; import org.apache.syncope.common.lib.types.MappingPurpose; import org.apache.syncope.common.lib.types.PropagationMode; +import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO; import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO; import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO; -import org.apache.syncope.core.persistence.api.entity.ExternalResource; -import org.apache.syncope.core.persistence.api.entity.MappingItem; -import org.apache.syncope.core.persistence.api.entity.user.UPlainSchema; +import org.apache.syncope.core.persistence.api.entity.PlainSchema; +import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; +import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; import org.apache.syncope.core.provisioning.api.data.ResourceDataBinder; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -45,6 +47,9 @@ import org.springframework.transaction.annotation.Transactional; public class ResourceDataBinderTest extends AbstractTest { @Autowired + private AnyTypeDAO anyTypeDAO; + + @Autowired private ExternalResourceDAO resourceDAO; @Autowired @@ -55,12 +60,14 @@ public class ResourceDataBinderTest extends AbstractTest { @Test public void issue42() { - UPlainSchema userId = plainSchemaDAO.find("userId", UPlainSchema.class); + PlainSchema userId = plainSchemaDAO.find("userId"); Set<MappingItem> beforeUserIdMappings = new HashSet<>(); for (ExternalResource res : resourceDAO.findAll()) { - if (res.getUmapping() != null) { - for (MappingItem mapItem : res.getUmapping().getItems()) { + if (res.getProvision(anyTypeDAO.findUser()) != null + && res.getProvision(anyTypeDAO.findUser()).getMapping() != null) { + + for (MappingItem mapItem : res.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) { if (userId.getKey().equals(mapItem.getIntAttrName())) { beforeUserIdMappings.add(mapItem); } @@ -74,8 +81,12 @@ public class ResourceDataBinderTest extends AbstractTest { resourceTO.setPropagationMode(PropagationMode.ONE_PHASE); resourceTO.setEnforceMandatoryCondition(true); + ProvisionTO provisionTO = new ProvisionTO(); + provisionTO.setAnyType("user"); + resourceTO.getProvisions().add(provisionTO); + MappingTO mapping = new MappingTO(); - resourceTO.setUmapping(mapping); + provisionTO.setMapping(mapping); MappingItemTO item = new MappingItemTO(); item.setIntAttrName("userId"); @@ -84,13 +95,13 @@ public class ResourceDataBinderTest extends AbstractTest { item.setAccountid(true); item.setMandatoryCondition("false"); item.setPurpose(MappingPurpose.BOTH); - mapping.setAccountIdItem(item); + mapping.setConnObjectKeyItem(item); ExternalResource resource = resourceDataBinder.create(resourceTO); resource = resourceDAO.save(resource); assertNotNull(resource); - assertNotNull(resource.getUmapping()); - assertEquals(1, resource.getUmapping().getItems().size()); + assertNotNull(resource.getProvision(anyTypeDAO.findUser()).getMapping()); + assertEquals(1, resource.getProvision(anyTypeDAO.findUser()).getMapping().getItems().size()); resourceDAO.flush(); @@ -98,12 +109,14 @@ public class ResourceDataBinderTest extends AbstractTest { assertNotNull(actual); assertEquals(resource, actual); - userId = plainSchemaDAO.find("userId", UPlainSchema.class); + userId = plainSchemaDAO.find("userId"); Set<MappingItem> afterUserIdMappings = new HashSet<>(); for (ExternalResource res : resourceDAO.findAll()) { - if (res.getUmapping() != null) { - for (MappingItem mapItem : res.getUmapping().getItems()) { + if (res.getProvision(anyTypeDAO.findUser()) != null + && res.getProvision(anyTypeDAO.findUser()).getMapping() != null) { + + for (MappingItem mapItem : res.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) { if (userId.getKey().equals(mapItem.getIntAttrName())) { afterUserIdMappings.add(mapItem); } http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/GroupServiceImpl.java ---------------------------------------------------------------------- diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/GroupServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/GroupServiceImpl.java index ee4825e..c8e42a1 100644 --- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/GroupServiceImpl.java +++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/GroupServiceImpl.java @@ -34,8 +34,8 @@ import org.apache.syncope.common.lib.types.ResourceAssociationActionType; import org.apache.syncope.common.lib.types.ResourceDeassociationActionType; import org.apache.syncope.common.lib.wrap.ResourceName; import org.apache.syncope.common.rest.api.CollectionWrapper; -import org.apache.syncope.common.rest.api.beans.SubjectListQuery; -import org.apache.syncope.common.rest.api.beans.SubjectSearchQuery; +import org.apache.syncope.common.rest.api.beans.AnyListQuery; +import org.apache.syncope.common.rest.api.beans.AnySearchQuery; import org.apache.syncope.common.rest.api.service.GroupService; import org.apache.syncope.core.logic.GroupLogic; import org.apache.syncope.core.persistence.api.dao.search.SearchCond; @@ -65,7 +65,7 @@ public class GroupServiceImpl extends AbstractServiceImpl implements GroupServic } @Override - public PagedResult<GroupTO> list(final SubjectListQuery listQuery) { + public PagedResult<GroupTO> list(final AnyListQuery listQuery) { CollectionUtils.transform(listQuery.getRealms(), new Transformer<String, String>() { @Override @@ -91,7 +91,7 @@ public class GroupServiceImpl extends AbstractServiceImpl implements GroupServic } @Override - public PagedResult<GroupTO> search(final SubjectSearchQuery searchQuery) { + public PagedResult<GroupTO> search(final AnySearchQuery searchQuery) { CollectionUtils.transform(searchQuery.getRealms(), new Transformer<String, String>() { @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceServiceImpl.java ---------------------------------------------------------------------- diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceServiceImpl.java index dfc4391..7ace502 100644 --- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceServiceImpl.java +++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceServiceImpl.java @@ -23,17 +23,18 @@ import java.util.Collections; import java.util.List; import java.util.Set; import javax.ws.rs.core.Response; -import org.apache.syncope.common.lib.to.AbstractAttributableTO; +import org.apache.syncope.common.lib.to.AnyTO; import org.apache.syncope.common.lib.to.BulkAction; import org.apache.syncope.common.lib.to.BulkActionResult; import org.apache.syncope.common.lib.to.ConnObjectTO; import org.apache.syncope.common.lib.to.ResourceTO; +import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.ResourceDeassociationActionType; -import org.apache.syncope.common.lib.types.SubjectType; -import org.apache.syncope.common.lib.wrap.SubjectKey; +import org.apache.syncope.common.lib.wrap.AnyKey; import org.apache.syncope.common.rest.api.RESTHeaders; import org.apache.syncope.common.rest.api.service.ResourceService; import org.apache.syncope.core.logic.AbstractResourceAssociator; +import org.apache.syncope.core.logic.AnyObjectLogic; import org.apache.syncope.core.logic.ResourceLogic; import org.apache.syncope.core.logic.GroupLogic; import org.apache.syncope.core.logic.UserLogic; @@ -47,6 +48,9 @@ public class ResourceServiceImpl extends AbstractServiceImpl implements Resource private ResourceLogic logic; @Autowired + private AnyObjectLogic anyObjectLogic; + + @Autowired private UserLogic userLogic; @Autowired @@ -83,8 +87,8 @@ public class ResourceServiceImpl extends AbstractServiceImpl implements Resource } @Override - public ConnObjectTO getConnectorObject(final String resourceKey, final SubjectType type, final Long key) { - return logic.getConnectorObject(resourceKey, type, key); + public ConnObjectTO readConnObject(final String resourceKey, final String anyTypeKey, final Long key) { + return logic.readConnObject(resourceKey, anyTypeKey, key); } @Override @@ -93,17 +97,20 @@ public class ResourceServiceImpl extends AbstractServiceImpl implements Resource } @Override - public BulkActionResult bulkDeassociation(final String resourceKey, final SubjectType subjectType, - final ResourceDeassociationActionType type, final List<SubjectKey> subjectKeys) { + public BulkActionResult bulkDeassociation( + final String resourceKey, final String anyTypeKey, final ResourceDeassociationActionType type, + final List<AnyKey> keys) { - AbstractResourceAssociator<? extends AbstractAttributableTO> associator = subjectType == SubjectType.USER + AbstractResourceAssociator<? extends AnyTO> associator = anyTypeKey.equalsIgnoreCase(AnyTypeKind.USER.name()) ? userLogic - : groupLogic; + : anyTypeKey.equalsIgnoreCase(AnyTypeKind.GROUP.name()) + ? groupLogic + : anyObjectLogic; - final BulkActionResult res = new BulkActionResult(); + BulkActionResult res = new BulkActionResult(); - for (SubjectKey key : subjectKeys) { - final Set<String> resources = Collections.singleton(resourceKey); + for (AnyKey key : keys) { + Set<String> resources = Collections.singleton(resourceKey); try { switch (type) { case DEPROVISION: @@ -123,7 +130,7 @@ public class ResourceServiceImpl extends AbstractServiceImpl implements Resource res.add(key, BulkActionResult.Status.SUCCESS); } catch (Exception e) { - LOG.warn("While executing {} on {} {}", type, subjectType, key.getElement(), e); + LOG.warn("While executing {} on {} {}", type, anyTypeKey, key.getElement(), e); res.add(key, BulkActionResult.Status.FAILURE); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java ---------------------------------------------------------------------- diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java index 3082c94..c8d2f26 100644 --- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java +++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java @@ -22,7 +22,6 @@ import java.net.URI; import java.util.List; import javax.ws.rs.core.Response; import org.apache.syncope.common.lib.to.AbstractSchemaTO; -import org.apache.syncope.common.lib.types.AttributableType; import org.apache.syncope.common.lib.types.SchemaType; import org.apache.syncope.common.rest.api.RESTHeaders; import org.apache.syncope.common.rest.api.service.SchemaService; @@ -37,10 +36,8 @@ public class SchemaServiceImpl extends AbstractServiceImpl implements SchemaServ private SchemaLogic logic; @Override - public <T extends AbstractSchemaTO> Response create(final AttributableType attrType, final SchemaType schemaType, - final T schemaTO) { - - T created = logic.create(attrType, schemaType, schemaTO); + public <T extends AbstractSchemaTO> Response create(final SchemaType schemaType, final T schemaTO) { + T created = logic.create(schemaType, schemaTO); URI location = uriInfo.getAbsolutePathBuilder().path(created.getKey()).build(); return Response.created(location). @@ -49,27 +46,25 @@ public class SchemaServiceImpl extends AbstractServiceImpl implements SchemaServ } @Override - public void delete(final AttributableType attrType, final SchemaType schemaType, final String schemaKey) { - logic.delete(attrType, schemaType, schemaKey); + public void delete(final SchemaType schemaType, final String schemaKey) { + logic.delete(schemaType, schemaKey); } @Override - public <T extends AbstractSchemaTO> List<T> list(final AttributableType attrType, final SchemaType schemaType) { - return logic.list(attrType, schemaType); + public <T extends AbstractSchemaTO> List<T> list(final SchemaType schemaType) { + return logic.list(schemaType); } @Override - public <T extends AbstractSchemaTO> T read(final AttributableType attrType, final SchemaType schemaType, - final String schemaKey) { - - return logic.read(attrType, schemaType, schemaKey); + public <T extends AbstractSchemaTO> T read(final SchemaType schemaType, final String schemaKey) { + return logic.read(schemaType, schemaKey); } @Override - public <T extends AbstractSchemaTO> void update(final AttributableType attrType, final SchemaType schemaType, - final String schemaKey, final T schemaTO) { + public <T extends AbstractSchemaTO> void update( + final SchemaType schemaType, final String schemaKey, final T schemaTO) { schemaTO.setKey(schemaKey); - logic.update(attrType, schemaType, schemaTO); + logic.update(schemaType, schemaTO); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/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 a758993..919cb0a 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 @@ -38,8 +38,8 @@ import org.apache.syncope.common.lib.types.ResourceDeassociationActionType; import org.apache.syncope.common.lib.wrap.ResourceName; import org.apache.syncope.common.rest.api.CollectionWrapper; import org.apache.syncope.common.rest.api.RESTHeaders; -import org.apache.syncope.common.rest.api.beans.SubjectListQuery; -import org.apache.syncope.common.rest.api.beans.SubjectSearchQuery; +import org.apache.syncope.common.rest.api.beans.AnyListQuery; +import org.apache.syncope.common.rest.api.beans.AnySearchQuery; import org.apache.syncope.common.rest.api.service.UserService; import org.apache.syncope.core.logic.UserLogic; import org.apache.syncope.core.persistence.api.dao.search.SearchCond; @@ -83,7 +83,7 @@ public class UserServiceImpl extends AbstractServiceImpl implements UserService } @Override - public PagedResult<UserTO> list(final SubjectListQuery listQuery) { + public PagedResult<UserTO> list(final AnyListQuery listQuery) { CollectionUtils.transform(listQuery.getRealms(), new Transformer<String, String>() { @Override @@ -109,7 +109,7 @@ public class UserServiceImpl extends AbstractServiceImpl implements UserService } @Override - public PagedResult<UserTO> search(final SubjectSearchQuery searchQuery) { + public PagedResult<UserTO> search(final AnySearchQuery searchQuery) { CollectionUtils.transform(searchQuery.getRealms(), new Transformer<String, String>() { @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/WorkflowServiceImpl.java ---------------------------------------------------------------------- diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/WorkflowServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/WorkflowServiceImpl.java index 30229a6..5b82db0 100644 --- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/WorkflowServiceImpl.java +++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/WorkflowServiceImpl.java @@ -23,7 +23,7 @@ import java.io.OutputStream; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; -import org.apache.syncope.common.lib.types.SubjectType; +import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.rest.api.RESTHeaders; import org.apache.syncope.common.rest.api.service.WorkflowService; import org.apache.syncope.core.logic.WorkflowLogic; @@ -37,7 +37,7 @@ public class WorkflowServiceImpl extends AbstractServiceImpl implements Workflow private WorkflowLogic logic; @Override - public Response exportDefinition(final SubjectType kind) { + public Response exportDefinition(final AnyTypeKind kind) { final MediaType accept = messageContext.getHttpHeaders().getAcceptableMediaTypes().contains(MediaType.APPLICATION_JSON_TYPE) ? MediaType.APPLICATION_JSON_TYPE @@ -47,8 +47,10 @@ public class WorkflowServiceImpl extends AbstractServiceImpl implements Workflow @Override public void write(final OutputStream os) throws IOException { - if (kind == SubjectType.USER) { + if (kind == AnyTypeKind.USER) { logic.exportUserDefinition(accept, os); + } else if (kind == AnyTypeKind.ANY_OBJECT) { + logic.exportAnyObjectDefinition(accept, os); } else { logic.exportGroupDefinition(accept, os); } @@ -61,13 +63,15 @@ public class WorkflowServiceImpl extends AbstractServiceImpl implements Workflow } @Override - public Response exportDiagram(final SubjectType kind) { + public Response exportDiagram(final AnyTypeKind kind) { StreamingOutput sout = new StreamingOutput() { @Override public void write(final OutputStream os) throws IOException { - if (kind == SubjectType.USER) { + if (kind == AnyTypeKind.USER) { logic.exportUserDiagram(os); + } else if (kind == AnyTypeKind.ANY_OBJECT) { + logic.exportAnyObjectDiagram(os); } else { logic.exportGroupDiagram(os); } @@ -80,14 +84,16 @@ public class WorkflowServiceImpl extends AbstractServiceImpl implements Workflow } @Override - public void importDefinition(final SubjectType kind, final String definition) { + public void importDefinition(final AnyTypeKind kind, final String definition) { final MediaType contentType = messageContext.getHttpHeaders().getMediaType().equals(MediaType.APPLICATION_JSON_TYPE) ? MediaType.APPLICATION_JSON_TYPE : MediaType.APPLICATION_XML_TYPE; - if (kind == SubjectType.USER) { + if (kind == AnyTypeKind.USER) { logic.importUserDefinition(contentType, definition); + } else if (kind == AnyTypeKind.ANY_OBJECT) { + logic.importAnyObjectDefinition(contentType, definition); } else { logic.importGroupDefinition(contentType, definition); } http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/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 4c89caf..938081f 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 @@ -439,7 +439,7 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter { @Override public WorkflowResult<Long> execute(final UserTO userTO, final String taskId) { - User user = userDAO.authFetch(userTO.getKey()); + User user = userDAO.authFind(userTO.getKey()); final Map<String, Object> variables = new HashMap<>(); variables.put(USER_TO, userTO); http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/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 506455f..caa8a05 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 @@ -30,8 +30,8 @@ import org.apache.commons.collections4.Transformer; import org.apache.syncope.common.lib.SyncopeConstants; 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.membership.Membership; import org.apache.syncope.core.persistence.api.entity.group.Group; +import org.apache.syncope.core.persistence.api.entity.user.UMembership; public class SyncopeUserQueryImpl implements UserQuery { @@ -152,10 +152,9 @@ public class SyncopeUserQueryImpl implements UserQuery { result = Collections.<User>emptyList(); } else { result = new ArrayList<>(); - List<Membership> memberships = groupDAO.findMemberships(group); - User user; - for (Membership membership : memberships) { - user = fromSyncopeUser(membership.getUser()); + List<UMembership> memberships = groupDAO.findUMemberships(group); + for (UMembership membership : memberships) { + User user = fromSyncopeUser(membership.getLeftEnd()); if (!result.contains(user)) { result.add(user); } http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java ---------------------------------------------------------------------- diff --git a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java new file mode 100644 index 0000000..4927388 --- /dev/null +++ b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java @@ -0,0 +1,61 @@ +/* + * 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.workflow.api; + +import org.apache.syncope.core.provisioning.api.WorkflowResult; +import org.apache.syncope.common.lib.mod.AnyObjectMod; +import org.apache.syncope.common.lib.to.AnyObjectTO; + +/** + * Interface for calling underlying workflow implementations. + */ +public interface AnyObjectWorkflowAdapter extends WorkflowAdapter { + + /** + * Create a anyObject. + * + * @param anyObjectTO anyObject to be created and whether to propagate it as active + * @return anyObject just created + */ + WorkflowResult<Long> create(AnyObjectTO anyObjectTO); + + /** + * Execute a task on a anyObject. + * + * @param anyObjectTO anyObject to be subject to task + * @param taskId to be executed + * @return anyObject just updated + */ + WorkflowResult<Long> execute(AnyObjectTO anyObjectTO, String taskId); + + /** + * Update a anyObject. + * + * @param anyObjectMod modification set to be performed + * @return anyObject just updated and propagations to be performed + */ + WorkflowResult<Long> update(AnyObjectMod anyObjectMod); + + /** + * Delete a anyObject. + * + * @param anyObjectKey anyObject to be deleted + */ + void delete(Long anyObjectKey); +} http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/WorkflowAdapter.java ---------------------------------------------------------------------- diff --git a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/WorkflowAdapter.java b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/WorkflowAdapter.java index 0c92d66..faf954a 100644 --- a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/WorkflowAdapter.java +++ b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/WorkflowAdapter.java @@ -21,7 +21,7 @@ package org.apache.syncope.core.workflow.api; import org.apache.syncope.core.provisioning.api.WorkflowResult; import java.io.OutputStream; import java.util.List; -import org.apache.syncope.common.lib.mod.AbstractAttributableMod; +import org.apache.syncope.common.lib.mod.AnyMod; import org.apache.syncope.common.lib.to.WorkflowFormTO; public interface WorkflowAdapter { @@ -79,7 +79,7 @@ public interface WorkflowAdapter { WorkflowFormTO getForm(String workflowId); /** - * Claim a form for a given user. + * Claim a form for a given object. * * @param taskId Workflow task to which the form is associated * @return updated form @@ -90,7 +90,7 @@ public interface WorkflowAdapter { * Submit a form. * * @param form to be submitted - * @return user updated by this form submit + * @return object updated by this form submit */ - WorkflowResult<? extends AbstractAttributableMod> submitForm(WorkflowFormTO form); + WorkflowResult<? extends AnyMod> submitForm(WorkflowFormTO form); } http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/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 30bfae6..97a8b1f 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 @@ -49,13 +49,13 @@ public abstract class AbstractGroupWorkflowAdapter implements GroupWorkflowAdapt @Override public WorkflowResult<Long> update(final GroupMod groupMod) { - return doUpdate(groupDAO.authFetch(groupMod.getKey()), groupMod); + return doUpdate(groupDAO.authFind(groupMod.getKey()), groupMod); } protected abstract void doDelete(Group group); @Override public void delete(final Long groupKey) { - doDelete(groupDAO.authFetch(groupKey)); + doDelete(groupDAO.authFind(groupKey)); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/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 b1c3b4a..fc75987 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 @@ -62,21 +62,21 @@ public abstract class AbstractUserWorkflowAdapter implements UserWorkflowAdapter @Override public WorkflowResult<Long> activate(final Long userKey, final String token) { - return doActivate(userDAO.authFetch(userKey), token); + return doActivate(userDAO.authFind(userKey), token); } protected abstract WorkflowResult<Pair<UserMod, Boolean>> doUpdate(User user, UserMod userMod); @Override public WorkflowResult<Pair<UserMod, Boolean>> update(final UserMod userMod) { - return doUpdate(userDAO.authFetch(userMod.getKey()), userMod); + return doUpdate(userDAO.authFind(userMod.getKey()), userMod); } protected abstract WorkflowResult<Long> doSuspend(User user); @Override public WorkflowResult<Long> suspend(final Long userKey) { - return suspend(userDAO.authFetch(userKey)); + return suspend(userDAO.authFind(userKey)); } @Override @@ -91,7 +91,7 @@ public abstract class AbstractUserWorkflowAdapter implements UserWorkflowAdapter @Override public WorkflowResult<Long> reactivate(final Long userKey) { - final User user = userDAO.authFetch(userKey); + final User user = userDAO.authFind(userKey); // reset failed logins user.setFailedLogins(0); @@ -106,20 +106,20 @@ public abstract class AbstractUserWorkflowAdapter implements UserWorkflowAdapter @Override public void requestPasswordReset(final Long userKey) { - doRequestPasswordReset(userDAO.authFetch(userKey)); + doRequestPasswordReset(userDAO.authFind(userKey)); } protected abstract void doConfirmPasswordReset(User user, String token, String password); @Override public void confirmPasswordReset(final Long userKey, final String token, final String password) { - doConfirmPasswordReset(userDAO.authFetch(userKey), token, password); + doConfirmPasswordReset(userDAO.authFind(userKey), token, password); } protected abstract void doDelete(User user); @Override public void delete(final Long userKey) { - doDelete(userDAO.authFetch(userKey)); + doDelete(userDAO.authFind(userKey)); } }
