http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractSyncResultHandler.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractSyncResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractSyncResultHandler.java index b3a73df..b854921 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractSyncResultHandler.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractSyncResultHandler.java @@ -22,20 +22,21 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.commons.lang3.exception.ExceptionUtils; -import org.apache.syncope.common.lib.mod.AbstractSubjectMod; -import org.apache.syncope.common.lib.to.AbstractSubjectTO; +import org.apache.syncope.common.lib.mod.AnyMod; +import org.apache.syncope.common.lib.to.AnyTO; import org.apache.syncope.common.lib.types.AuditElements; import org.apache.syncope.common.lib.types.AuditElements.Result; import org.apache.syncope.common.lib.types.MatchingRule; import org.apache.syncope.common.lib.types.ResourceOperation; import org.apache.syncope.common.lib.types.UnmatchingRule; import org.apache.syncope.core.persistence.api.dao.NotFoundException; -import org.apache.syncope.core.persistence.api.entity.AttributableUtils; import org.apache.syncope.core.persistence.api.entity.task.SyncTask; -import org.apache.syncope.core.provisioning.api.AttributableTransformer; import org.apache.syncope.core.provisioning.api.propagation.PropagationException; import org.apache.syncope.core.provisioning.api.sync.SyncActions; import org.apache.syncope.core.misc.security.UnauthorizedException; +import org.apache.syncope.core.persistence.api.entity.AnyUtils; +import org.apache.syncope.core.persistence.api.entity.resource.Provision; +import org.apache.syncope.core.provisioning.api.AnyTransformer; import org.apache.syncope.core.provisioning.api.sync.IgnoreProvisionException; import org.apache.syncope.core.provisioning.api.sync.ProvisioningResult; import org.apache.syncope.core.provisioning.api.sync.SyncopeSyncResultHandler; @@ -51,19 +52,15 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan protected SyncUtils syncUtilities; @Autowired - protected AttributableTransformer attrTransformer; + protected AnyTransformer anyTransformer; - protected abstract String getName(AbstractSubjectTO subjectTO); + protected abstract String getName(AnyTO anyTO); - protected abstract AbstractSubjectMod getSubjectMod(AbstractSubjectTO subjectTO, SyncDelta delta); + protected abstract AnyTO doCreate(AnyTO anyTO, SyncDelta delta, ProvisioningResult result); - protected abstract AbstractSubjectTO doCreate( - AbstractSubjectTO subjectTO, SyncDelta delta, ProvisioningResult result); + protected abstract AnyTO doLink(AnyTO before, ProvisioningResult result, boolean unlink); - protected abstract AbstractSubjectTO doLink(AbstractSubjectTO before, ProvisioningResult result, boolean unlink); - - protected abstract AbstractSubjectTO doUpdate(AbstractSubjectTO before, AbstractSubjectMod subjectMod, - SyncDelta delta, ProvisioningResult result); + protected abstract AnyTO doUpdate(AnyTO before, AnyMod anyMod, SyncDelta delta, ProvisioningResult result); protected abstract void doDeprovision(Long key, boolean unlink); @@ -71,13 +68,21 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan @Override public boolean handle(final SyncDelta delta) { + Provision provision = null; try { - doHandle(delta); + provision = profile.getTask().getResource().getProvision(delta.getObject().getObjectClass()); + if (provision == null) { + throw new JobExecutionException("No provision found on " + profile.getTask().getResource() + " for " + + delta.getObject().getObjectClass()); + } + + doHandle(delta, provision); return true; } catch (IgnoreProvisionException e) { ProvisioningResult result = new ProvisioningResult(); result.setOperation(ResourceOperation.NONE); - result.setSubjectType(getAttributableUtils().getType()); + result.setAnyType(provision == null + ? getAnyUtils().getAnyTypeKind().name() : provision.getAnyType().getKey()); result.setStatus(ProvisioningResult.Status.IGNORE); result.setKey(0L); result.setName(delta.getObject().getName().getNameValue()); @@ -91,7 +96,8 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan } } - protected List<ProvisioningResult> assign(final SyncDelta delta, final AttributableUtils attrUtils) + protected List<ProvisioningResult> assign( + final SyncDelta delta, final Provision provision, final AnyUtils anyUtils) throws JobExecutionException { if (!profile.getTask().isPerformCreate()) { @@ -99,18 +105,17 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan return Collections.<ProvisioningResult>emptyList(); } - final AbstractSubjectTO subjectTO = - connObjectUtils.getSubjectTO(delta.getObject(), profile.getTask(), attrUtils); + AnyTO anyTO = connObjectUtils.getAnyTO(delta.getObject(), profile.getTask(), provision, anyUtils); - subjectTO.getResources().add(profile.getTask().getResource().getKey()); + anyTO.getResources().add(profile.getTask().getResource().getKey()); final ProvisioningResult result = new ProvisioningResult(); result.setOperation(ResourceOperation.CREATE); - result.setSubjectType(attrUtils.getType()); + result.setAnyType(provision.getAnyType().getKey()); result.setStatus(ProvisioningResult.Status.SUCCESS); // Attributable transformation (if configured) - AbstractSubjectTO transformed = attrTransformer.transform(subjectTO); + AnyTO transformed = anyTransformer.transform(anyTO); LOG.debug("Transformed: {}", transformed); result.setName(getName(transformed)); @@ -123,13 +128,14 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan actionedDelta = action.beforeAssign(this.getProfile(), actionedDelta, transformed); } - create(transformed, actionedDelta, attrUtils, UnmatchingRule.toEventName(UnmatchingRule.ASSIGN), result); + create(transformed, actionedDelta, UnmatchingRule.toEventName(UnmatchingRule.ASSIGN), result); } return Collections.singletonList(result); } - protected List<ProvisioningResult> provision(final SyncDelta delta, final AttributableUtils attrUtils) + protected List<ProvisioningResult> provision( + final SyncDelta delta, final Provision provision, final AnyUtils anyUtils) throws JobExecutionException { if (!profile.getTask().isPerformCreate()) { @@ -137,16 +143,15 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan return Collections.<ProvisioningResult>emptyList(); } - final AbstractSubjectTO subjectTO = - connObjectUtils.getSubjectTO(delta.getObject(), profile.getTask(), attrUtils); + AnyTO anyTO = connObjectUtils.getAnyTO(delta.getObject(), profile.getTask(), provision, anyUtils); // Attributable transformation (if configured) - AbstractSubjectTO transformed = attrTransformer.transform(subjectTO); + AnyTO transformed = anyTransformer.transform(anyTO); LOG.debug("Transformed: {}", transformed); final ProvisioningResult result = new ProvisioningResult(); result.setOperation(ResourceOperation.CREATE); - result.setSubjectType(attrUtils.getType()); + result.setAnyType(provision.getAnyType().getKey()); result.setStatus(ProvisioningResult.Status.SUCCESS); result.setName(getName(transformed)); @@ -159,16 +164,15 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan actionedDelta = action.beforeProvision(this.getProfile(), actionedDelta, transformed); } - create(transformed, actionedDelta, attrUtils, UnmatchingRule.toEventName(UnmatchingRule.PROVISION), result); + create(transformed, actionedDelta, UnmatchingRule.toEventName(UnmatchingRule.PROVISION), result); } return Collections.<ProvisioningResult>singletonList(result); } private void create( - final AbstractSubjectTO subjectTO, + final AnyTO anyTO, final SyncDelta delta, - final AttributableUtils attrUtils, final String operation, final ProvisioningResult result) throws JobExecutionException { @@ -177,7 +181,7 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan Result resultStatus; try { - AbstractSubjectTO actual = doCreate(subjectTO, delta, result); + AnyTO actual = doCreate(anyTO, delta, result); result.setName(getName(actual)); output = actual; resultStatus = Result.SUCCESS; @@ -190,7 +194,7 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan } catch (PropagationException e) { // A propagation failure doesn't imply a synchronization failure. // The propagation exception status will be reported into the propagation task execution. - LOG.error("Could not propagate {} {}", attrUtils.getType(), delta.getUid().getUidValue(), e); + LOG.error("Could not propagate {} {}", anyTO.getType(), delta.getUid().getUidValue(), e); output = e; resultStatus = Result.FAILURE; @@ -200,7 +204,7 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan } catch (Exception e) { result.setStatus(ProvisioningResult.Status.FAILURE); result.setMessage(ExceptionUtils.getRootCauseMessage(e)); - LOG.error("Could not create {} {} ", attrUtils.getType(), delta.getUid().getUidValue(), e); + LOG.error("Could not create {} {} ", anyTO.getType(), delta.getUid().getUidValue(), e); output = e; resultStatus = Result.FAILURE; @@ -212,32 +216,32 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan audit(operation, resultStatus, null, output, delta); } - protected List<ProvisioningResult> update(final SyncDelta delta, final List<Long> subjects, - final AttributableUtils attrUtils) throws JobExecutionException { + protected List<ProvisioningResult> update(final SyncDelta delta, final List<Long> anys, + final Provision provision) throws JobExecutionException { if (!profile.getTask().isPerformUpdate()) { LOG.debug("SyncTask not configured for update"); return Collections.<ProvisioningResult>emptyList(); } - LOG.debug("About to update {}", subjects); + LOG.debug("About to update {}", anys); List<ProvisioningResult> results = new ArrayList<>(); SyncDelta workingDelta = delta; - for (Long key : subjects) { + for (Long key : anys) { LOG.debug("About to update {}", key); - final ProvisioningResult result = new ProvisioningResult(); + ProvisioningResult result = new ProvisioningResult(); result.setOperation(ResourceOperation.UPDATE); - result.setSubjectType(attrUtils.getType()); + result.setAnyType(provision.getAnyType().getKey()); result.setStatus(ProvisioningResult.Status.SUCCESS); result.setKey(key); - AbstractSubjectTO before = getSubjectTO(key); + AnyTO before = getAnyTO(key); if (before == null) { result.setStatus(ProvisioningResult.Status.FAILURE); - result.setMessage(String.format("Subject '%s(%d)' not found", attrUtils.getType().name(), key)); + result.setMessage(String.format("Any '%s(%d)' not found", provision.getAnyType().getKey(), key)); } else { result.setName(getName(before)); } @@ -250,17 +254,23 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan output = null; } else { try { - AbstractSubjectMod subjectMod = getSubjectMod(before, workingDelta); + AnyMod anyMod = connObjectUtils.getAnyMod( + before.getKey(), + workingDelta.getObject(), + before, + profile.getTask(), + provision, + getAnyUtils()); // Attribute value transformation (if configured) - AbstractSubjectMod actual = attrTransformer.transform(subjectMod); + AnyMod actual = anyTransformer.transform(anyMod); LOG.debug("Transformed: {}", actual); for (SyncActions action : profile.getActions()) { - workingDelta = action.beforeUpdate(this.getProfile(), workingDelta, before, subjectMod); + workingDelta = action.beforeUpdate(this.getProfile(), workingDelta, before, anyMod); } - final AbstractSubjectTO updated = doUpdate(before, subjectMod, workingDelta, result); + final AnyTO updated = doUpdate(before, anyMod, workingDelta, result); for (SyncActions action : profile.getActions()) { action.after(this.getProfile(), workingDelta, updated, result); @@ -269,14 +279,14 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan output = updated; resultStatus = Result.SUCCESS; result.setName(getName(updated)); - LOG.debug("{} {} successfully updated", attrUtils.getType(), key); + LOG.debug("{} {} successfully updated", provision.getAnyType().getKey(), key); } catch (IgnoreProvisionException e) { throw e; } catch (PropagationException e) { // A propagation failure doesn't imply a synchronization failure. // The propagation exception status will be reported into the propagation task execution. LOG.error("Could not propagate {} {}", - attrUtils.getType(), workingDelta.getUid().getUidValue(), e); + provision.getAnyType().getKey(), workingDelta.getUid().getUidValue(), e); output = e; resultStatus = Result.FAILURE; @@ -287,7 +297,7 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan result.setStatus(ProvisioningResult.Status.FAILURE); result.setMessage(ExceptionUtils.getRootCauseMessage(e)); LOG.error("Could not update {} {}", - attrUtils.getType(), workingDelta.getUid().getUidValue(), e); + provision.getAnyType().getKey(), workingDelta.getUid().getUidValue(), e); output = e; resultStatus = Result.FAILURE; @@ -305,8 +315,8 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan protected List<ProvisioningResult> deprovision( final SyncDelta delta, - final List<Long> subjects, - final AttributableUtils attrUtils, + final List<Long> anys, + final Provision provision, final boolean unlink) throws JobExecutionException { @@ -315,11 +325,11 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan return Collections.<ProvisioningResult>emptyList(); } - LOG.debug("About to update {}", subjects); + LOG.debug("About to update {}", anys); final List<ProvisioningResult> updResults = new ArrayList<>(); - for (Long id : subjects) { + for (Long id : anys) { LOG.debug("About to unassign resource {}", id); Object output; @@ -327,15 +337,15 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan final ProvisioningResult result = new ProvisioningResult(); result.setOperation(ResourceOperation.DELETE); - result.setSubjectType(attrUtils.getType()); + result.setAnyType(provision.getAnyType().getKey()); result.setStatus(ProvisioningResult.Status.SUCCESS); result.setKey(id); - final AbstractSubjectTO before = getSubjectTO(id); + final AnyTO before = getAnyTO(id); if (before == null) { result.setStatus(ProvisioningResult.Status.FAILURE); - result.setMessage(String.format("Subject '%s(%d)' not found", attrUtils.getType().name(), id)); + result.setMessage(String.format("Any '%s(%d)' not found", provision.getAnyType().getKey(), id)); } if (!profile.isDryRun()) { @@ -357,20 +367,21 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan } doDeprovision(id, unlink); - output = getSubjectTO(id); + output = getAnyTO(id); for (SyncActions action : profile.getActions()) { - action.after(this.getProfile(), delta, AbstractSubjectTO.class.cast(output), result); + action.after(this.getProfile(), delta, AnyTO.class.cast(output), result); } resultStatus = Result.SUCCESS; - LOG.debug("{} {} successfully updated", attrUtils.getType(), id); + LOG.debug("{} {} successfully updated", provision.getAnyType().getKey(), id); } catch (IgnoreProvisionException e) { throw e; } catch (PropagationException e) { // A propagation failure doesn't imply a synchronization failure. // The propagation exception status will be reported into the propagation task execution. - LOG.error("Could not propagate {} {}", attrUtils.getType(), delta.getUid().getUidValue(), e); + LOG.error("Could not propagate {} {}", + provision.getAnyType().getKey(), delta.getUid().getUidValue(), e); output = e; resultStatus = Result.FAILURE; @@ -380,7 +391,8 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan } catch (Exception e) { result.setStatus(ProvisioningResult.Status.FAILURE); result.setMessage(ExceptionUtils.getRootCauseMessage(e)); - LOG.error("Could not update {} {}", attrUtils.getType(), delta.getUid().getUidValue(), e); + LOG.error("Could not update {} {}", + provision.getAnyType().getKey(), delta.getUid().getUidValue(), e); output = e; resultStatus = Result.FAILURE; @@ -401,8 +413,8 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan protected List<ProvisioningResult> link( final SyncDelta delta, - final List<Long> subjects, - final AttributableUtils attrUtils, + final List<Long> anys, + final Provision provision, final boolean unlink) throws JobExecutionException { @@ -411,27 +423,27 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan return Collections.<ProvisioningResult>emptyList(); } - LOG.debug("About to update {}", subjects); + LOG.debug("About to update {}", anys); final List<ProvisioningResult> updResults = new ArrayList<>(); - for (Long id : subjects) { + for (Long id : anys) { LOG.debug("About to unassign resource {}", id); Object output; Result resultStatus; - final ProvisioningResult result = new ProvisioningResult(); + ProvisioningResult result = new ProvisioningResult(); result.setOperation(ResourceOperation.NONE); - result.setSubjectType(attrUtils.getType()); + result.setAnyType(provision.getAnyType().getKey()); result.setStatus(ProvisioningResult.Status.SUCCESS); result.setKey(id); - final AbstractSubjectTO before = getSubjectTO(id); + final AnyTO before = getAnyTO(id); if (before == null) { result.setStatus(ProvisioningResult.Status.FAILURE); - result.setMessage(String.format("Subject '%s(%d)' not found", attrUtils.getType().name(), id)); + result.setMessage(String.format("Any '%s(%d)' not found", provision.getAnyType().getKey(), id)); } if (!profile.isDryRun()) { @@ -455,17 +467,18 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan output = doLink(before, result, unlink); for (SyncActions action : profile.getActions()) { - action.after(this.getProfile(), delta, AbstractSubjectTO.class.cast(output), result); + action.after(this.getProfile(), delta, AnyTO.class.cast(output), result); } resultStatus = Result.SUCCESS; - LOG.debug("{} {} successfully updated", attrUtils.getType(), id); + LOG.debug("{} {} successfully updated", provision.getAnyType().getKey(), id); } catch (IgnoreProvisionException e) { throw e; } catch (PropagationException e) { // A propagation failure doesn't imply a synchronization failure. // The propagation exception status will be reported into the propagation task execution. - LOG.error("Could not propagate {} {}", attrUtils.getType(), delta.getUid().getUidValue(), e); + LOG.error("Could not propagate {} {}", + provision.getAnyType().getKey(), delta.getUid().getUidValue(), e); output = e; resultStatus = Result.FAILURE; @@ -475,7 +488,8 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan } catch (Exception e) { result.setStatus(ProvisioningResult.Status.FAILURE); result.setMessage(ExceptionUtils.getRootCauseMessage(e)); - LOG.error("Could not update {} {}", attrUtils.getType(), delta.getUid().getUidValue(), e); + LOG.error("Could not update {} {}", + provision.getAnyType().getKey(), delta.getUid().getUidValue(), e); output = e; resultStatus = Result.FAILURE; @@ -494,7 +508,9 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan } protected List<ProvisioningResult> delete( - final SyncDelta delta, final List<Long> subjects, final AttributableUtils attrUtils) + final SyncDelta delta, + final List<Long> anys, + final Provision provision) throws JobExecutionException { if (!profile.getTask().isPerformDelete()) { @@ -502,25 +518,25 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan return Collections.<ProvisioningResult>emptyList(); } - LOG.debug("About to delete {}", subjects); + LOG.debug("About to delete {}", anys); List<ProvisioningResult> delResults = new ArrayList<>(); SyncDelta workingDelta = delta; - for (Long id : subjects) { + for (Long id : anys) { Object output; Result resultStatus = Result.FAILURE; - AbstractSubjectTO before = null; + AnyTO before = null; final ProvisioningResult result = new ProvisioningResult(); try { - before = getSubjectTO(id); + before = getAnyTO(id); result.setKey(id); result.setName(getName(before)); result.setOperation(ResourceOperation.DELETE); - result.setSubjectType(attrUtils.getType()); + result.setAnyType(provision.getAnyType().getKey()); result.setStatus(ProvisioningResult.Status.SUCCESS); if (!profile.isDryRun()) { @@ -541,7 +557,7 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan } catch (Exception e) { result.setStatus(ProvisioningResult.Status.FAILURE); result.setMessage(ExceptionUtils.getRootCauseMessage(e)); - LOG.error("Could not delete {} {}", attrUtils.getType(), id, e); + LOG.error("Could not delete {} {}", provision.getAnyType().getKey(), id, e); output = e; for (SyncActions action : profile.getActions()) { @@ -554,21 +570,24 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan delResults.add(result); } catch (NotFoundException e) { - LOG.error("Could not find {} {}", attrUtils.getType(), id, e); + LOG.error("Could not find {} {}", provision.getAnyType().getKey(), id, e); } catch (UnauthorizedException e) { - LOG.error("Not allowed to read {} {}", attrUtils.getType(), id, e); + LOG.error("Not allowed to read {} {}", provision.getAnyType().getKey(), id, e); } catch (Exception e) { - LOG.error("Could not delete {} {}", attrUtils.getType(), id, e); + LOG.error("Could not delete {} {}", provision.getAnyType().getKey(), id, e); } } return delResults; } - private List<ProvisioningResult> ignore(final SyncDelta delta, final AttributableUtils attrUtils, - final boolean matching) throws JobExecutionException { + private List<ProvisioningResult> ignore( + final SyncDelta delta, + final Provision provision, + final boolean matching) + throws JobExecutionException { - LOG.debug("Subject to ignore {}", delta.getObject().getUid().getUidValue()); + LOG.debug("Any to ignore {}", delta.getObject().getUid().getUidValue()); final List<ProvisioningResult> ignoreResults = new ArrayList<>(); final ProvisioningResult result = new ProvisioningResult(); @@ -576,7 +595,7 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan result.setKey(null); result.setName(delta.getObject().getUid().getUidValue()); result.setOperation(ResourceOperation.NONE); - result.setSubjectType(attrUtils.getType()); + result.setAnyType(provision.getAnyType().getKey()); result.setStatus(ProvisioningResult.Status.SUCCESS); ignoreResults.add(result); @@ -590,89 +609,92 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan } /** - * Look into SyncDelta and take necessary profile.getActions() (create / update / delete) on user(s)/group(s). + * Look into SyncDelta and take necessary profile.getActions() (create / update / delete) on any object(s). * * @param delta returned by the underlying profile.getConnector() + * @param provision provisioning info * @throws JobExecutionException in case of synchronization failure. */ - protected void doHandle(final SyncDelta delta) + protected void doHandle(final SyncDelta delta, final Provision provision) throws JobExecutionException { - final AttributableUtils attrUtils = getAttributableUtils(); + AnyUtils anyUtils = getAnyUtils(); LOG.debug("Process {} for {} as {}", delta.getDeltaType(), delta.getUid().getUidValue(), delta.getObject().getObjectClass()); - final String uid = delta.getPreviousUid() == null + String uid = delta.getPreviousUid() == null ? delta.getUid().getUidValue() : delta.getPreviousUid().getUidValue(); try { - List<Long> subjectKeys = syncUtilities.findExisting( - uid, delta.getObject(), profile.getTask().getResource(), attrUtils); + List<Long> anyKeys = syncUtilities.findExisting(uid, delta.getObject(), provision, anyUtils); - if (subjectKeys.size() > 1) { + if (anyKeys.size() > 1) { switch (profile.getResAct()) { case IGNORE: - throw new IllegalStateException("More than one match " + subjectKeys); + throw new IllegalStateException("More than one match " + anyKeys); case FIRSTMATCH: - subjectKeys = subjectKeys.subList(0, 1); + anyKeys = anyKeys.subList(0, 1); break; case LASTMATCH: - subjectKeys = subjectKeys.subList(subjectKeys.size() - 1, subjectKeys.size()); + anyKeys = anyKeys.subList(anyKeys.size() - 1, anyKeys.size()); break; default: - // keep subjectIds as is + // keep anyIds as is } } if (SyncDeltaType.CREATE_OR_UPDATE == delta.getDeltaType()) { - if (subjectKeys.isEmpty()) { + if (anyKeys.isEmpty()) { switch (profile.getTask().getUnmatchingRule()) { case ASSIGN: - profile.getResults().addAll(assign(delta, attrUtils)); + profile.getResults().addAll(assign(delta, provision, anyUtils)); break; + case PROVISION: - profile.getResults().addAll(provision(delta, attrUtils)); + profile.getResults().addAll(provision(delta, provision, anyUtils)); break; + case IGNORE: - profile.getResults().addAll(ignore(delta, attrUtils, false)); + profile.getResults().addAll(ignore(delta, provision, false)); break; + default: // do nothing } } else { switch (profile.getTask().getMatchingRule()) { case UPDATE: - profile.getResults().addAll(update(delta, subjectKeys, attrUtils)); + profile.getResults().addAll(update(delta, anyKeys, provision)); break; case DEPROVISION: - profile.getResults().addAll(deprovision(delta, subjectKeys, attrUtils, false)); + profile.getResults().addAll(deprovision(delta, anyKeys, provision, false)); break; case UNASSIGN: - profile.getResults().addAll(deprovision(delta, subjectKeys, attrUtils, true)); + profile.getResults().addAll(deprovision(delta, anyKeys, provision, true)); break; case LINK: - profile.getResults().addAll(link(delta, subjectKeys, attrUtils, false)); + profile.getResults().addAll(link(delta, anyKeys, provision, false)); break; case UNLINK: - profile.getResults().addAll(link(delta, subjectKeys, attrUtils, true)); + profile.getResults().addAll(link(delta, anyKeys, provision, true)); break; case IGNORE: - profile.getResults().addAll(ignore(delta, attrUtils, true)); + profile.getResults().addAll(ignore(delta, provision, true)); break; default: // do nothing } } } else if (SyncDeltaType.DELETE == delta.getDeltaType()) { - if (subjectKeys.isEmpty()) { + if (anyKeys.isEmpty()) { LOG.debug("No match found for deletion"); } else { - profile.getResults().addAll(delete(delta, subjectKeys, attrUtils)); + profile.getResults().addAll(delete(delta, anyKeys, provision)); } } } catch (IllegalStateException | IllegalArgumentException e) { @@ -688,7 +710,7 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan final Object... input) { notificationManager.createTasks(AuditElements.EventCategoryType.SYNCHRONIZATION, - getAttributableUtils().getType().name().toLowerCase(), + getAnyUtils().getAnyTypeKind().name().toLowerCase(), profile.getTask().getResource().getKey(), event, result, @@ -697,7 +719,7 @@ public abstract class AbstractSyncResultHandler extends AbstractSyncopeResultHan input); auditManager.audit(AuditElements.EventCategoryType.SYNCHRONIZATION, - getAttributableUtils().getType().name().toLowerCase(), + getAnyUtils().getAnyTypeKind().name().toLowerCase(), profile.getTask().getResource().getKey(), event, 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/AbstractSyncopeResultHandler.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractSyncopeResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractSyncopeResultHandler.java index 28c3885..fccecc4 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractSyncopeResultHandler.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AbstractSyncopeResultHandler.java @@ -18,10 +18,9 @@ */ package org.apache.syncope.core.provisioning.java.sync; -import org.apache.syncope.common.lib.to.AbstractSubjectTO; +import org.apache.syncope.common.lib.to.AnyTO; 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.AttributableUtilsFactory; import org.apache.syncope.core.persistence.api.entity.task.ProvisioningTask; import org.apache.syncope.core.provisioning.api.GroupProvisioningManager; import org.apache.syncope.core.provisioning.api.data.GroupDataBinder; @@ -34,8 +33,13 @@ import org.apache.syncope.core.provisioning.api.sync.ProvisioningProfile; import org.apache.syncope.core.provisioning.api.sync.SyncopeResultHandler; import org.apache.syncope.core.misc.AuditManager; import org.apache.syncope.core.misc.ConnObjectUtils; -import org.apache.syncope.core.persistence.api.entity.AttributableUtils; +import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO; +import org.apache.syncope.core.persistence.api.entity.AnyUtils; +import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory; +import org.apache.syncope.core.provisioning.api.AnyObjectProvisioningManager; +import org.apache.syncope.core.provisioning.api.data.AnyObjectDataBinder; import org.apache.syncope.core.provisioning.api.notification.NotificationManager; +import org.apache.syncope.core.workflow.api.AnyObjectWorkflowAdapter; import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter; import org.apache.syncope.core.workflow.api.UserWorkflowAdapter; import org.slf4j.Logger; @@ -51,6 +55,9 @@ public abstract class AbstractSyncopeResultHandler<T extends ProvisioningTask, A protected static final Logger LOG = LoggerFactory.getLogger(AbstractSyncopeResultHandler.class); @Autowired + protected AnyObjectDAO anyObjectDAO; + + @Autowired protected UserDAO userDAO; @Autowired @@ -86,6 +93,8 @@ public abstract class AbstractSyncopeResultHandler<T extends ProvisioningTask, A @Autowired protected PropagationTaskExecutor taskExecutor; + protected AnyObjectWorkflowAdapter awfAdapter; + /** * User workflow adapter. */ @@ -99,28 +108,34 @@ public abstract class AbstractSyncopeResultHandler<T extends ProvisioningTask, A protected GroupWorkflowAdapter gwfAdapter; @Autowired + protected AnyObjectDataBinder anyObjectDataBinder; + + @Autowired protected UserDataBinder userDataBinder; @Autowired protected GroupDataBinder groupDataBinder; @Autowired + protected AnyObjectProvisioningManager anyObjectProvisioningManager; + + @Autowired protected UserProvisioningManager userProvisioningManager; @Autowired protected GroupProvisioningManager groupProvisioningManager; @Autowired - protected AttributableUtilsFactory attrUtilsFactory; + protected AnyUtilsFactory anyUtilsFactory; /** * Sync profile. */ protected ProvisioningProfile<T, A> profile; - protected abstract AttributableUtils getAttributableUtils(); + protected abstract AnyUtils getAnyUtils(); - protected abstract AbstractSubjectTO getSubjectTO(long key); + protected abstract AnyTO getAnyTO(long key); @Override public void setProfile(final ProvisioningProfile<T, A> profile) { http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AnyObjectPushResultHandlerImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AnyObjectPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AnyObjectPushResultHandlerImpl.java new file mode 100644 index 0000000..fcfb537 --- /dev/null +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AnyObjectPushResultHandlerImpl.java @@ -0,0 +1,157 @@ +/* + * 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.provisioning.java.sync; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.apache.commons.lang3.StringUtils; +import org.apache.syncope.common.lib.mod.AnyObjectMod; +import org.apache.syncope.common.lib.to.AnyTO; +import org.apache.syncope.common.lib.to.AnyObjectTO; +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.Any; +import org.apache.syncope.core.persistence.api.entity.AnyUtils; +import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject; +import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; +import org.apache.syncope.core.provisioning.api.TimeoutException; +import org.apache.syncope.core.provisioning.api.sync.AnyObjectPushResultHandler; +import org.identityconnectors.framework.common.objects.ConnectorObject; +import org.identityconnectors.framework.common.objects.ObjectClass; +import org.identityconnectors.framework.common.objects.Uid; + +public class AnyObjectPushResultHandlerImpl extends AbstractPushResultHandler implements AnyObjectPushResultHandler { + + @Override + protected AnyUtils getAnyUtils() { + return anyUtilsFactory.getInstance(AnyTypeKind.GROUP); + } + + @Override + protected Any<?, ?, ?> deprovision(final Any<?, ?, ?> sbj) { + AnyObjectTO before = anyObjectDataBinder.getAnyObjectTO(AnyObject.class.cast(sbj)); + + List<String> noPropResources = new ArrayList<>(before.getResources()); + noPropResources.remove(profile.getTask().getResource().getKey()); + + taskExecutor.execute(propagationManager.getAnyObjectDeleteTasks(before.getKey(), noPropResources)); + + return anyObjectDAO.authFind(before.getKey()); + } + + @Override + protected Any<?, ?, ?> provision(final Any<?, ?, ?> sbj, final Boolean enabled) { + AnyObjectTO before = anyObjectDataBinder.getAnyObjectTO(AnyObject.class.cast(sbj)); + + List<String> noPropResources = new ArrayList<>(before.getResources()); + noPropResources.remove(profile.getTask().getResource().getKey()); + + PropagationByResource propByRes = new PropagationByResource(); + propByRes.add(ResourceOperation.CREATE, profile.getTask().getResource().getKey()); + + taskExecutor.execute(propagationManager.getAnyObjectCreateTasks( + before.getKey(), + Collections.unmodifiableCollection(before.getVirAttrs()), + propByRes, + noPropResources)); + + return anyObjectDAO.authFind(before.getKey()); + } + + @Override + protected Any<?, ?, ?> link(final Any<?, ?, ?> sbj, final Boolean unlink) { + AnyObjectMod anyObjectMod = new AnyObjectMod(); + anyObjectMod.setKey(sbj.getKey()); + + if (unlink) { + anyObjectMod.getResourcesToRemove().add(profile.getTask().getResource().getKey()); + } else { + anyObjectMod.getResourcesToAdd().add(profile.getTask().getResource().getKey()); + } + + awfAdapter.update(anyObjectMod); + + return anyObjectDAO.authFind(sbj.getKey()); + } + + @Override + protected Any<?, ?, ?> unassign(final Any<?, ?, ?> sbj) { + AnyObjectMod anyObjectMod = new AnyObjectMod(); + anyObjectMod.setKey(sbj.getKey()); + anyObjectMod.getResourcesToRemove().add(profile.getTask().getResource().getKey()); + awfAdapter.update(anyObjectMod); + return deprovision(sbj); + } + + @Override + protected Any<?, ?, ?> assign(final Any<?, ?, ?> sbj, final Boolean enabled) { + AnyObjectMod anyObjectMod = new AnyObjectMod(); + anyObjectMod.setKey(sbj.getKey()); + anyObjectMod.getResourcesToAdd().add(profile.getTask().getResource().getKey()); + awfAdapter.update(anyObjectMod); + return provision(sbj, enabled); + } + + @Override + protected String getName(final Any<?, ?, ?> subject) { + return StringUtils.EMPTY; + } + + @Override + protected AnyTO getAnyTO(final long key) { + try { + return anyObjectDataBinder.getAnyObjectTO(key); + } catch (Exception e) { + LOG.warn("Error retrieving user {}", key, e); + return null; + } + } + + @Override + protected Any<?, ?, ?> getAny(final long key) { + try { + return anyObjectDAO.authFind(key); + } catch (Exception e) { + LOG.warn("Error retrieving anyObject {}", key, e); + return null; + } + } + + @Override + protected ConnectorObject getRemoteObject(final String connObjectKey, final ObjectClass objectClass) { + ConnectorObject obj = null; + try { + Uid uid = new Uid(connObjectKey); + + obj = profile.getConnector().getObject( + objectClass, + uid, + profile.getConnector().getOperationOptions(Collections.<MappingItem>emptySet())); + } catch (TimeoutException toe) { + LOG.debug("Request timeout", toe); + throw toe; + } catch (RuntimeException ignore) { + LOG.debug("While resolving {}", connObjectKey, ignore); + } + + 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/AnyObjectSyncResultHandlerImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AnyObjectSyncResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AnyObjectSyncResultHandlerImpl.java new file mode 100644 index 0000000..2b4b667 --- /dev/null +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/AnyObjectSyncResultHandlerImpl.java @@ -0,0 +1,132 @@ +/* + * 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.provisioning.java.sync; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.apache.syncope.common.lib.mod.AnyMod; +import org.apache.syncope.common.lib.mod.AnyObjectMod; +import org.apache.syncope.common.lib.to.AnyTO; +import org.apache.syncope.common.lib.to.PropagationStatus; +import org.apache.syncope.common.lib.to.AnyObjectTO; +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.AnyObjectSyncResultHandler; +import org.identityconnectors.framework.common.objects.SyncDelta; + +public class AnyObjectSyncResultHandlerImpl extends AbstractSyncResultHandler implements AnyObjectSyncResultHandler { + + @Override + protected AnyUtils getAnyUtils() { + return anyUtilsFactory.getInstance(AnyTypeKind.ANY_OBJECT); + } + + @Override + protected String getName(final AnyTO anyTO) { + return StringUtils.EMPTY; + } + + @Override + protected AnyTO getAnyTO(final long key) { + try { + return anyObjectDataBinder.getAnyObjectTO(key); + } catch (Exception e) { + LOG.warn("Error retrieving anyObject {}", key, e); + return null; + } + } + + @Override + protected AnyTO doCreate(final AnyTO anyTO, final SyncDelta delta, final ProvisioningResult result) { + AnyObjectTO anyObjectTO = AnyObjectTO.class.cast(anyTO); + + Map.Entry<Long, List<PropagationStatus>> created = anyObjectProvisioningManager.create( + anyObjectTO, Collections.singleton(profile.getTask().getResource().getKey())); + + anyObjectTO = anyObjectDataBinder.getAnyObjectTO(created.getKey()); + + result.setKey(created.getKey()); + result.setName(getName(anyTO)); + + return anyObjectTO; + } + + @Override + protected AnyTO doLink( + final AnyTO before, + final ProvisioningResult result, + final boolean unlink) { + + AnyObjectMod anyObjectMod = new AnyObjectMod(); + anyObjectMod.setKey(before.getKey()); + + if (unlink) { + anyObjectMod.getResourcesToRemove().add(profile.getTask().getResource().getKey()); + } else { + anyObjectMod.getResourcesToAdd().add(profile.getTask().getResource().getKey()); + } + + return anyObjectDataBinder.getAnyObjectTO(awfAdapter.update(anyObjectMod).getResult()); + } + + @Override + protected AnyTO doUpdate( + final AnyTO before, + final AnyMod anyMod, + final SyncDelta delta, + final ProvisioningResult result) { + + AnyObjectMod anyObjectMod = AnyObjectMod.class.cast(anyMod); + + Map.Entry<Long, List<PropagationStatus>> updated = anyObjectProvisioningManager.update(anyObjectMod); + + AnyObjectTO after = anyObjectDataBinder.getAnyObjectTO(updated.getKey()); + result.setName(getName(after)); + return after; + } + + @Override + protected void doDeprovision(final Long key, final boolean unlink) { + taskExecutor.execute(propagationManager.getAnyObjectDeleteTasks( + key, profile.getTask().getResource().getKey())); + + if (unlink) { + AnyObjectMod anyObjectMod = new AnyObjectMod(); + anyObjectMod.setKey(key); + anyObjectMod.getResourcesToRemove().add(profile.getTask().getResource().getKey()); + } + } + + @Override + protected void doDelete(final Long key) { + try { + taskExecutor.execute(propagationManager.getAnyObjectDeleteTasks( + key, profile.getTask().getResource().getKey())); + } catch (Exception e) { + // A propagation failure doesn't imply a synchronization failure. + // The propagation exception status will be reported into the propagation task execution. + LOG.error("Could not propagate anyObject " + key, e); + } + + anyObjectProvisioningManager.delete(key); + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java index 2b3ca02..5615876 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DBPasswordSyncActions.java @@ -20,9 +20,9 @@ package org.apache.syncope.core.provisioning.java.sync; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Predicate; -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.common.lib.types.ConnConfProperty; @@ -59,13 +59,13 @@ public class DBPasswordSyncActions 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 { + final T any) throws JobExecutionException { - if (subject instanceof UserTO) { - String password = ((UserTO) subject).getPassword(); + if (any instanceof UserTO) { + String password = ((UserTO) any).getPassword(); parseEncodedPassword(password, profile.getConnector()); } @@ -74,14 +74,14 @@ public class DBPasswordSyncActions 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, - final K subjectMod) throws JobExecutionException { + final T any, + final K anyMod) throws JobExecutionException { - if (subjectMod instanceof UserMod) { - String modPassword = ((UserMod) subjectMod).getPassword(); + if (anyMod instanceof UserMod) { + String modPassword = ((UserMod) anyMod).getPassword(); parseEncodedPassword(modPassword, profile.getConnector()); } @@ -123,14 +123,14 @@ public class DBPasswordSyncActions 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, + final T any, final ProvisioningResult result) throws JobExecutionException { - if (subject instanceof UserTO && encodedPassword != null && cipher != null) { - User syncopeUser = userDAO.find(subject.getKey()); + if (any instanceof UserTO && encodedPassword != null && cipher != null) { + User syncopeUser = userDAO.find(any.getKey()); if (syncopeUser != null) { syncopeUser.setEncodedPassword(encodedPassword.toUpperCase(), cipher); } http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultPushActions.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultPushActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultPushActions.java index fa5f843..14da889 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultPushActions.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultPushActions.java @@ -18,7 +18,7 @@ */ package org.apache.syncope.core.provisioning.java.sync; -import org.apache.syncope.core.persistence.api.entity.Subject; +import org.apache.syncope.core.persistence.api.entity.Any; import org.apache.syncope.core.provisioning.api.sync.PushActions; import org.apache.syncope.core.provisioning.api.sync.ProvisioningProfile; import org.apache.syncope.core.provisioning.api.sync.ProvisioningResult; @@ -34,58 +34,58 @@ public abstract class DefaultPushActions implements PushActions { } @Override - public <T extends Subject<?, ?, ?>> T beforeAssign(final ProvisioningProfile<?, ?> profile, final T subject) + public <T extends Any<?, ?, ?>> T beforeAssign(final ProvisioningProfile<?, ?> profile, final T any) throws JobExecutionException { - return subject; + return any; } @Override - public <T extends Subject<?, ?, ?>> T beforeProvision(final ProvisioningProfile<?, ?> profile, final T subject) + public <T extends Any<?, ?, ?>> T beforeProvision(final ProvisioningProfile<?, ?> profile, final T any) throws JobExecutionException { - return subject; + return any; } @Override - public <T extends Subject<?, ?, ?>> T beforeLink(final ProvisioningProfile<?, ?> profile, final T subject) + public <T extends Any<?, ?, ?>> T beforeLink(final ProvisioningProfile<?, ?> profile, final T any) throws JobExecutionException { - return subject; + return any; } @Override - public <T extends Subject<?, ?, ?>> T beforeUnassign(final ProvisioningProfile<?, ?> profile, final T subject) + public <T extends Any<?, ?, ?>> T beforeUnassign(final ProvisioningProfile<?, ?> profile, final T any) throws JobExecutionException { - return subject; + return any; } @Override - public <T extends Subject<?, ?, ?>> T beforeDeprovision(final ProvisioningProfile<?, ?> profile, final T subject) + public <T extends Any<?, ?, ?>> T beforeDeprovision(final ProvisioningProfile<?, ?> profile, final T any) throws JobExecutionException { - return subject; + return any; } @Override - public <T extends Subject<?, ?, ?>> T beforeUnlink(final ProvisioningProfile<?, ?> profile, final T subject) + public <T extends Any<?, ?, ?>> T beforeUnlink(final ProvisioningProfile<?, ?> profile, final T any) throws JobExecutionException { - return subject; + return any; } @Override - public <T extends Subject<?, ?, ?>> void onError( - final ProvisioningProfile<?, ?> profile, final T subject, final ProvisioningResult result, + public <T extends Any<?, ?, ?>> void onError( + final ProvisioningProfile<?, ?> profile, final T any, final ProvisioningResult result, final Exception error) throws JobExecutionException { // do nothing } @Override - public <T extends Subject<?, ?, ?>> void after( - final ProvisioningProfile<?, ?> profile, final T subject, final ProvisioningResult result) + public <T extends Any<?, ?, ?>> void after( + final ProvisioningProfile<?, ?> profile, final T any, final ProvisioningResult result) throws JobExecutionException { // do nothing http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultSyncActions.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultSyncActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultSyncActions.java index 8f3432a..29d7662 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultSyncActions.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/DefaultSyncActions.java @@ -18,8 +18,8 @@ */ package org.apache.syncope.core.provisioning.java.sync; -import org.apache.syncope.common.lib.mod.AbstractSubjectMod; -import org.apache.syncope.common.lib.to.AbstractSubjectTO; +import org.apache.syncope.common.lib.mod.AnyMod; +import org.apache.syncope.common.lib.to.AnyTO; import org.apache.syncope.core.provisioning.api.sync.SyncActions; import org.apache.syncope.core.provisioning.api.sync.ProvisioningProfile; import org.apache.syncope.core.provisioning.api.sync.ProvisioningResult; @@ -36,66 +36,66 @@ public abstract class DefaultSyncActions implements SyncActions { } @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, - final K subjectMod) throws JobExecutionException { + final T any, + final K anyMod) throws JobExecutionException { return delta; } @Override - public <T extends AbstractSubjectTO> SyncDelta beforeDelete( - final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T subject) + public <T extends AnyTO> SyncDelta beforeDelete( + final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any) throws JobExecutionException { return delta; } @Override - public <T extends AbstractSubjectTO> SyncDelta beforeAssign( - final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T subject) + public <T extends AnyTO> SyncDelta beforeAssign( + final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any) throws JobExecutionException { return delta; } @Override - public <T extends AbstractSubjectTO> SyncDelta beforeProvision( - final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T subject) + public <T extends AnyTO> SyncDelta beforeProvision( + final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any) throws JobExecutionException { return delta; } @Override - public <T extends AbstractSubjectTO> SyncDelta beforeLink( - final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T subject) + public <T extends AnyTO> SyncDelta beforeLink( + final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any) throws JobExecutionException { return delta; } @Override - public <T extends AbstractSubjectTO> SyncDelta beforeUnassign( - final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T subject) + public <T extends AnyTO> SyncDelta beforeUnassign( + final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any) throws JobExecutionException { return delta; } @Override - public <T extends AbstractSubjectTO> SyncDelta beforeDeprovision( - final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T subject) + public <T extends AnyTO> SyncDelta beforeDeprovision( + final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any) throws JobExecutionException { return delta; } @Override - public <T extends AbstractSubjectTO> SyncDelta beforeUnlink( - final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T subject) + public <T extends AnyTO> SyncDelta beforeUnlink( + final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any) throws JobExecutionException { return delta; @@ -108,8 +108,8 @@ public abstract class DefaultSyncActions implements SyncActions { } @Override - public <T extends AbstractSubjectTO> void after( - final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T subject, + public <T extends AnyTO> void after( + final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final T any, final ProvisioningResult result) throws JobExecutionException { } http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/GroupPushResultHandlerImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/GroupPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/GroupPushResultHandlerImpl.java index c38e5d6..38ae900 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/GroupPushResultHandlerImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/GroupPushResultHandlerImpl.java @@ -22,16 +22,15 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.syncope.common.lib.mod.GroupMod; -import org.apache.syncope.common.lib.to.AbstractSubjectTO; +import org.apache.syncope.common.lib.to.AnyTO; import org.apache.syncope.common.lib.to.GroupTO; -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.group.Group; +import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; import org.apache.syncope.core.provisioning.api.TimeoutException; import org.apache.syncope.core.provisioning.api.sync.GroupPushResultHandler; import org.identityconnectors.framework.common.objects.ConnectorObject; @@ -41,30 +40,30 @@ import org.identityconnectors.framework.common.objects.Uid; public class GroupPushResultHandlerImpl extends AbstractPushResultHandler implements GroupPushResultHandler { @Override - protected AttributableUtils getAttributableUtils() { - return attrUtilsFactory.getInstance(AttributableType.GROUP); + protected AnyUtils getAnyUtils() { + return anyUtilsFactory.getInstance(AnyTypeKind.GROUP); } @Override - protected Subject<?, ?, ?> deprovision(final Subject<?, ?, ?> sbj) { - final GroupTO before = groupDataBinder.getGroupTO(Group.class.cast(sbj)); + protected Any<?, ?, ?> deprovision(final Any<?, ?, ?> sbj) { + GroupTO before = groupDataBinder.getGroupTO(Group.class.cast(sbj)); - final List<String> noPropResources = new ArrayList<>(before.getResources()); + List<String> noPropResources = new ArrayList<>(before.getResources()); noPropResources.remove(profile.getTask().getResource().getKey()); taskExecutor.execute(propagationManager.getGroupDeleteTasks(before.getKey(), noPropResources)); - return groupDAO.authFetch(before.getKey()); + return groupDAO.authFind(before.getKey()); } @Override - protected Subject<?, ?, ?> provision(final Subject<?, ?, ?> sbj, final Boolean enabled) { - final GroupTO before = groupDataBinder.getGroupTO(Group.class.cast(sbj)); + protected Any<?, ?, ?> provision(final Any<?, ?, ?> sbj, final Boolean enabled) { + GroupTO before = groupDataBinder.getGroupTO(Group.class.cast(sbj)); - 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.getGroupCreateTasks( @@ -73,12 +72,12 @@ public class GroupPushResultHandlerImpl extends AbstractPushResultHandler implem propByRes, noPropResources)); - return groupDAO.authFetch(before.getKey()); + return groupDAO.authFind(before.getKey()); } @Override - protected Subject<?, ?, ?> link(final Subject<?, ?, ?> sbj, final Boolean unlink) { - final GroupMod groupMod = new GroupMod(); + protected Any<?, ?, ?> link(final Any<?, ?, ?> sbj, final Boolean unlink) { + GroupMod groupMod = new GroupMod(); groupMod.setKey(sbj.getKey()); if (unlink) { @@ -89,12 +88,12 @@ public class GroupPushResultHandlerImpl extends AbstractPushResultHandler implem gwfAdapter.update(groupMod); - return groupDAO.authFetch(sbj.getKey()); + return groupDAO.authFind(sbj.getKey()); } @Override - protected Subject<?, ?, ?> unassign(final Subject<?, ?, ?> sbj) { - final GroupMod groupMod = new GroupMod(); + protected Any<?, ?, ?> unassign(final Any<?, ?, ?> sbj) { + GroupMod groupMod = new GroupMod(); groupMod.setKey(sbj.getKey()); groupMod.getResourcesToRemove().add(profile.getTask().getResource().getKey()); gwfAdapter.update(groupMod); @@ -102,8 +101,8 @@ public class GroupPushResultHandlerImpl extends AbstractPushResultHandler implem } @Override - protected Subject<?, ?, ?> assign(final Subject<?, ?, ?> sbj, final Boolean enabled) { - final GroupMod groupMod = new GroupMod(); + protected Any<?, ?, ?> assign(final Any<?, ?, ?> sbj, final Boolean enabled) { + GroupMod groupMod = new GroupMod(); groupMod.setKey(sbj.getKey()); groupMod.getResourcesToAdd().add(profile.getTask().getResource().getKey()); gwfAdapter.update(groupMod); @@ -111,12 +110,12 @@ public class GroupPushResultHandlerImpl extends AbstractPushResultHandler implem } @Override - protected String getName(final Subject<?, ?, ?> subject) { + protected String getName(final Any<?, ?, ?> subject) { return Group.class.cast(subject).getName(); } @Override - protected AbstractSubjectTO getSubjectTO(final long key) { + protected AnyTO getAnyTO(final long key) { try { return groupDataBinder.getGroupTO(key); } catch (Exception e) { @@ -126,9 +125,9 @@ public class GroupPushResultHandlerImpl extends AbstractPushResultHandler implem } @Override - protected Subject<?, ?, ?> getSubject(final long key) { + protected Any<?, ?, ?> getAny(final long key) { try { - return groupDAO.authFetch(key); + return groupDAO.authFind(key); } catch (Exception e) { LOG.warn("Error retrieving group {}", key, e); return null; @@ -136,27 +135,22 @@ public class GroupPushResultHandlerImpl extends AbstractPushResultHandler implem } @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.GROUP, + objectClass, uid, profile.getConnector().getOperationOptions(Collections.<MappingItem>emptySet())); } catch (TimeoutException toe) { 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().getGmapping(); + 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/GroupSyncResultHandlerImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/GroupSyncResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/GroupSyncResultHandlerImpl.java index 1ce0357..f6218ce 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/GroupSyncResultHandlerImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/GroupSyncResultHandlerImpl.java @@ -22,15 +22,14 @@ import java.util.Collections; import java.util.HashMap; 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.AttrMod; import org.apache.syncope.common.lib.mod.GroupMod; -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.GroupTO; -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.GroupSyncResultHandler; import org.identityconnectors.framework.common.objects.SyncDelta; @@ -45,17 +44,17 @@ public class GroupSyncResultHandlerImpl extends AbstractSyncResultHandler implem } @Override - protected AttributableUtils getAttributableUtils() { - return attrUtilsFactory.getInstance(AttributableType.GROUP); + protected AnyUtils getAnyUtils() { + return anyUtilsFactory.getInstance(AnyTypeKind.GROUP); } @Override - protected String getName(final AbstractSubjectTO subjectTO) { - return GroupTO.class.cast(subjectTO).getName(); + protected String getName(final AnyTO anyTO) { + return GroupTO.class.cast(anyTO).getName(); } @Override - protected AbstractSubjectTO getSubjectTO(final long key) { + protected AnyTO getAnyTO(final long key) { try { return groupDataBinder.getGroupTO(key); } catch (Exception e) { @@ -65,20 +64,8 @@ public class GroupSyncResultHandlerImpl extends AbstractSyncResultHandler implem } @Override - protected AbstractSubjectMod getSubjectMod(final AbstractSubjectTO subjectTO, final SyncDelta delta) { - return connObjectUtils.getAttributableMod( - subjectTO.getKey(), - delta.getObject(), - subjectTO, - profile.getTask(), - attrUtilsFactory.getInstance(AttributableType.GROUP)); - } - - @Override - protected AbstractSubjectTO doCreate( - final AbstractSubjectTO subjectTO, final SyncDelta delta, final ProvisioningResult result) { - - GroupTO groupTO = GroupTO.class.cast(subjectTO); + protected AnyTO doCreate(final AnyTO anyTO, final SyncDelta delta, final ProvisioningResult result) { + GroupTO groupTO = GroupTO.class.cast(anyTO); Map.Entry<Long, List<PropagationStatus>> created = groupProvisioningManager.create(groupTO, groupOwnerMap, Collections.singleton(profile.getTask().getResource().getKey())); @@ -86,18 +73,18 @@ public class GroupSyncResultHandlerImpl extends AbstractSyncResultHandler implem groupTO = groupDataBinder.getGroupTO(created.getKey()); result.setKey(created.getKey()); - result.setName(getName(subjectTO)); + result.setName(getName(anyTO)); return groupTO; } @Override - protected AbstractSubjectTO doLink( - final AbstractSubjectTO before, + protected AnyTO doLink( + final AnyTO before, final ProvisioningResult result, final boolean unlink) { - final GroupMod groupMod = new GroupMod(); + GroupMod groupMod = new GroupMod(); groupMod.setKey(before.getKey()); if (unlink) { @@ -110,13 +97,13 @@ public class GroupSyncResultHandlerImpl extends AbstractSyncResultHandler implem } @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) { - GroupMod groupMod = GroupMod.class.cast(subjectMod); + GroupMod groupMod = GroupMod.class.cast(anyMod); Map.Entry<Long, List<PropagationStatus>> updated = groupProvisioningManager.update(groupMod); @@ -139,28 +126,26 @@ public class GroupSyncResultHandlerImpl extends AbstractSyncResultHandler implem } @Override - protected void doDeprovision(final Long id, final boolean unlink) { - taskExecutor.execute( - propagationManager.getGroupDeleteTasks(id, profile.getTask().getResource().getKey())); + protected void doDeprovision(final Long key, final boolean unlink) { + taskExecutor.execute(propagationManager.getGroupDeleteTasks(key, profile.getTask().getResource().getKey())); if (unlink) { - final UserMod userMod = new UserMod(); - userMod.setKey(id); - userMod.getResourcesToRemove().add(profile.getTask().getResource().getKey()); + GroupMod groupMod = new GroupMod(); + groupMod.setKey(key); + groupMod.getResourcesToRemove().add(profile.getTask().getResource().getKey()); } } @Override - protected void doDelete(final Long id) { + protected void doDelete(final Long key) { try { - taskExecutor.execute( - propagationManager.getGroupDeleteTasks(id, profile.getTask().getResource().getKey())); + taskExecutor.execute(propagationManager.getGroupDeleteTasks(key, profile.getTask().getResource().getKey())); } catch (Exception e) { // A propagation failure doesn't imply a synchronization failure. // The propagation exception status will be reported into the propagation task execution. - LOG.error("Could not propagate user " + id, e); + LOG.error("Could not propagate group " + key, e); } - groupProvisioningManager.delete(id); + groupProvisioningManager.delete(key); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java index fc68ec0..fb2f9a4 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/LDAPMembershipSyncActions.java @@ -25,17 +25,14 @@ import java.util.Map; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Predicate; import org.apache.commons.lang3.tuple.Pair; -import org.apache.syncope.common.lib.mod.AbstractSubjectMod; -import org.apache.syncope.common.lib.mod.MembershipMod; +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.GroupTO; import org.apache.syncope.common.lib.types.AuditElements; import org.apache.syncope.common.lib.types.AuditElements.Result; import org.apache.syncope.common.lib.types.ConnConfProperty; import org.apache.syncope.core.persistence.api.dao.GroupDAO; -import org.apache.syncope.core.persistence.api.entity.ExternalResource; -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.task.PropagationTask; import org.apache.syncope.core.persistence.api.entity.task.ProvisioningTask; @@ -48,6 +45,9 @@ import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecu import org.apache.syncope.core.provisioning.api.sync.ProvisioningProfile; import org.apache.syncope.core.provisioning.api.sync.ProvisioningResult; import org.apache.syncope.core.misc.AuditManager; +import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO; +import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; +import org.apache.syncope.core.persistence.api.entity.user.UMembership; import org.apache.syncope.core.provisioning.api.notification.NotificationManager; import org.apache.syncope.core.workflow.api.UserWorkflowAdapter; import org.identityconnectors.framework.common.objects.Attribute; @@ -70,6 +70,9 @@ public class LDAPMembershipSyncActions extends DefaultSyncActions { protected static final Logger LOG = LoggerFactory.getLogger(LDAPMembershipSyncActions.class); @Autowired + protected AnyTypeDAO anyTypeDAO; + + @Autowired protected GroupDAO groupDAO; @Autowired @@ -88,7 +91,7 @@ public class LDAPMembershipSyncActions extends DefaultSyncActions { private AuditManager auditManager; @Autowired - private SyncUtils syncUtilities; + private SyncUtils syncUtils; protected Map<Long, Long> membersBeforeGroupUpdate = Collections.<Long, Long>emptyMap(); @@ -122,24 +125,24 @@ public class LDAPMembershipSyncActions extends DefaultSyncActions { * {@inheritDoc} */ @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, final K subjectMod) throws JobExecutionException { + final SyncDelta delta, final T any, final K anyMod) throws JobExecutionException { - if (subject instanceof GroupTO) { + if (any instanceof GroupTO) { // search for all users assigned to given group - Group group = groupDAO.find(subject.getKey()); + Group group = groupDAO.find(any.getKey()); if (group != null) { - List<Membership> membs = groupDAO.findMemberships(group); + List<UMembership> membs = groupDAO.findUMemberships(group); // save memberships before group update takes place membersBeforeGroupUpdate = new HashMap<>(membs.size()); - for (Membership memb : membs) { - membersBeforeGroupUpdate.put(memb.getUser().getKey(), memb.getKey()); + for (UMembership memb : membs) { + membersBeforeGroupUpdate.put(memb.getLeftEnd().getKey(), memb.getKey()); } } } - return super.beforeUpdate(profile, delta, subject, subjectMod); + return super.beforeUpdate(profile, delta, any, anyMod); } /** @@ -156,10 +159,7 @@ public class LDAPMembershipSyncActions extends DefaultSyncActions { membersBeforeGroupUpdate.remove(userKey); } else { userMod.setKey(userKey); - - MembershipMod membershipMod = new MembershipMod(); - membershipMod.setGroup(groupTO.getKey()); - userMod.getMembershipsToAdd().add(membershipMod); + userMod.getMembershipsToAdd().add(groupTO.getKey()); } return userMod; @@ -256,16 +256,16 @@ public class LDAPMembershipSyncActions extends DefaultSyncActions { * @throws JobExecutionException if anything goes wrong */ protected void synchronizeMemberships( - final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final GroupTO groupTO) throws - JobExecutionException { + final ProvisioningProfile<?, ?> profile, final SyncDelta delta, final GroupTO groupTO) + throws JobExecutionException { - final ProvisioningTask task = profile.getTask(); - final ExternalResource resource = task.getResource(); - final Connector connector = profile.getConnector(); + ProvisioningTask task = profile.getTask(); + ExternalResource resource = task.getResource(); + Connector connector = profile.getConnector(); for (Object membValue : getMembAttrValues(delta, connector)) { - Long userKey = syncUtilities.findMatchingAttributableKey( - ObjectClass.ACCOUNT, + Long userKey = syncUtils.findMatchingAnyKey( + anyTypeDAO.findUser(), membValue.toString(), profile.getTask().getResource(), profile.getConnector()); @@ -289,20 +289,23 @@ public class LDAPMembershipSyncActions extends DefaultSyncActions { * {@inheritDoc} */ @Override - public <T extends AbstractSubjectTO> void after( + public <T extends AnyTO> void after( final ProvisioningProfile<?, ?> profile, final SyncDelta delta, - final T subject, + final T any, final ProvisioningResult result) throws JobExecutionException { if (!(profile.getTask() instanceof SyncTask)) { return; } - if (!(subject instanceof GroupTO) || profile.getTask().getResource().getUmapping() == null) { - super.after(profile, delta, subject, result); + if (!(any instanceof GroupTO) + || profile.getTask().getResource().getProvision(anyTypeDAO.findUser()) == null + || profile.getTask().getResource().getProvision(anyTypeDAO.findUser()).getMapping() == null) { + + super.after(profile, delta, any, result); } else { - synchronizeMemberships(profile, delta, (GroupTO) subject); + synchronizeMemberships(profile, delta, (GroupTO) any); } } }
