Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 61046200CD8 for ; Tue, 18 Jul 2017 12:22:49 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 5FA20166A57; Tue, 18 Jul 2017 10:22:49 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id EF129166A5C for ; Tue, 18 Jul 2017 12:22:46 +0200 (CEST) Received: (qmail 38971 invoked by uid 500); 18 Jul 2017 10:22:46 -0000 Mailing-List: contact commits-help@syncope.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@syncope.apache.org Delivered-To: mailing list commits@syncope.apache.org Received: (qmail 38800 invoked by uid 99); 18 Jul 2017 10:22:46 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 18 Jul 2017 10:22:46 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 1BDCCDFA6C; Tue, 18 Jul 2017 10:22:45 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: ilgrosso@apache.org To: commits@syncope.apache.org Date: Tue, 18 Jul 2017 10:22:51 -0000 Message-Id: In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [08/12] syncope git commit: [SYNCOPE-1164] Realm provisioning now features complete mapping, as Anys archived-at: Tue, 18 Jul 2017 10:22:49 -0000 http://git-wip-us.apache.org/repos/asf/syncope/blob/eebca673/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPullResultHandlerImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPullResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPullResultHandlerImpl.java index fc711ca..c4be4e2 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPullResultHandlerImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPullResultHandlerImpl.java @@ -18,14 +18,10 @@ */ package org.apache.syncope.core.provisioning.java.pushpull; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.IterableUtils; -import org.apache.commons.collections4.Predicate; -import org.apache.commons.jexl3.JexlContext; -import org.apache.commons.jexl3.MapContext; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.to.RealmTO; @@ -47,14 +43,13 @@ import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit; import org.apache.syncope.core.persistence.api.entity.task.PropagationTask; import org.apache.syncope.core.persistence.api.entity.task.PullTask; import org.apache.syncope.core.provisioning.api.propagation.PropagationException; -import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter; import org.apache.syncope.core.provisioning.api.pushpull.IgnoreProvisionException; import org.apache.syncope.core.provisioning.api.pushpull.ProvisioningReport; import org.apache.syncope.core.provisioning.api.pushpull.PullActions; import org.apache.syncope.core.provisioning.api.pushpull.SyncopePullExecutor; import org.apache.syncope.core.provisioning.api.pushpull.SyncopePullResultHandler; -import org.apache.syncope.core.provisioning.java.jexl.JexlUtils; -import org.identityconnectors.framework.common.objects.Attribute; +import org.apache.syncope.core.provisioning.java.utils.ConnObjectUtils; +import org.apache.syncope.core.spring.security.DelegatedAdministrationException; import org.identityconnectors.framework.common.objects.SyncDelta; import org.identityconnectors.framework.common.objects.SyncDeltaType; import org.quartz.JobExecutionException; @@ -67,6 +62,12 @@ public class RealmPullResultHandlerImpl implements SyncopePullResultHandler { @Autowired + private PullUtils pullUtils; + + @Autowired + private ConnObjectUtils connObjectUtils; + + @Autowired private AnySearchDAO searchDAO; private SyncopePullExecutor executor; @@ -125,24 +126,32 @@ public class RealmPullResultHandlerImpl } } - private ProvisioningReport assign(final SyncDelta delta, final String name) throws JobExecutionException { + private List assign(final SyncDelta delta, final OrgUnit orgUnit) throws JobExecutionException { if (!profile.getTask().isPerformCreate()) { LOG.debug("PullTask not configured for create"); - return null; + finalize(UnmatchingRule.toEventName(UnmatchingRule.ASSIGN), Result.SUCCESS, null, null, delta); + return Collections.emptyList(); } - RealmTO realmTO = new RealmTO(); - realmTO.setName(name); + RealmTO realmTO = connObjectUtils.getRealmTO(delta.getObject(), profile.getTask(), orgUnit); + if (realmTO.getFullPath() == null) { + if (realmTO.getParent() == null) { + realmTO.setParent(profile.getTask().getDestinatioRealm().getFullPath()); + } + + realmTO.setFullPath(realmTO.getParent() + "/" + realmTO.getName()); + } realmTO.getResources().add(profile.getTask().getResource().getKey()); ProvisioningReport result = new ProvisioningReport(); result.setOperation(ResourceOperation.CREATE); result.setAnyType(REALM_TYPE); result.setStatus(ProvisioningReport.Status.SUCCESS); - result.setName(profile.getTask().getDestinatioRealm().getFullPath() + "/" + name); + result.setName(realmTO.getFullPath()); if (profile.isDryRun()) { result.setKey(null); + finalize(UnmatchingRule.toEventName(UnmatchingRule.ASSIGN), Result.SUCCESS, null, null, delta); } else { SyncDelta actionedDelta = delta; for (PullActions action : profile.getActions()) { @@ -152,27 +161,36 @@ public class RealmPullResultHandlerImpl create(realmTO, actionedDelta, UnmatchingRule.toEventName(UnmatchingRule.ASSIGN), result); } - return result; + return Collections.singletonList(result); } - private ProvisioningReport provision(final SyncDelta delta, final String name) throws JobExecutionException { + private List provision(final SyncDelta delta, final OrgUnit orgUnit) + throws JobExecutionException { + if (!profile.getTask().isPerformCreate()) { LOG.debug("PullTask not configured for create"); - return null; + finalize(UnmatchingRule.toEventName(UnmatchingRule.PROVISION), Result.SUCCESS, null, null, delta); + return Collections.emptyList(); } - RealmTO realmTO = new RealmTO(); - realmTO.setName(name); - realmTO.getResources().add(profile.getTask().getResource().getKey()); + RealmTO realmTO = connObjectUtils.getRealmTO(delta.getObject(), profile.getTask(), orgUnit); + if (realmTO.getFullPath() == null) { + if (realmTO.getParent() == null) { + realmTO.setParent(profile.getTask().getDestinatioRealm().getFullPath()); + } + + realmTO.setFullPath(realmTO.getParent() + "/" + realmTO.getName()); + } ProvisioningReport result = new ProvisioningReport(); result.setOperation(ResourceOperation.CREATE); result.setAnyType(REALM_TYPE); result.setStatus(ProvisioningReport.Status.SUCCESS); - result.setName(profile.getTask().getDestinatioRealm().getFullPath() + "/" + name); + result.setName(realmTO.getFullPath()); if (profile.isDryRun()) { result.setKey(null); + finalize(UnmatchingRule.toEventName(UnmatchingRule.PROVISION), Result.SUCCESS, null, null, delta); } else { SyncDelta actionedDelta = delta; for (PullActions action : profile.getActions()) { @@ -182,7 +200,7 @@ public class RealmPullResultHandlerImpl create(realmTO, actionedDelta, UnmatchingRule.toEventName(UnmatchingRule.PROVISION), result); } - return result; + return Collections.singletonList(result); } private void throwIgnoreProvisionException(final SyncDelta delta, final Exception exception) @@ -255,293 +273,378 @@ public class RealmPullResultHandlerImpl finalize(operation, resultStatus, null, output, delta); } - private ProvisioningReport update(final SyncDelta delta, final Realm realm, final String name) + private List update(final SyncDelta delta, final List keys) throws JobExecutionException { if (!profile.getTask().isPerformUpdate()) { LOG.debug("PullTask not configured for update"); - return null; + finalize(MatchingRule.toEventName(MatchingRule.UPDATE), Result.SUCCESS, null, null, delta); + return Collections.emptyList(); } - LOG.debug("About to update {}", realm); - - RealmTO before = binder.getRealmTO(realm, true); - - ProvisioningReport result = new ProvisioningReport(); - result.setOperation(ResourceOperation.UPDATE); - result.setAnyType(REALM_TYPE); - result.setStatus(ProvisioningReport.Status.SUCCESS); - result.setKey(realm.getKey()); + LOG.debug("About to update {}", keys); - Result resultStatus; - Object output; - if (!profile.isDryRun()) { - try { - before.setName(name); + List results = new ArrayList<>(); - PropagationByResource propByRes = binder.update(realm, before); - Realm updated = realmDAO.save(realm); + SyncDelta workingDelta = delta; + for (String key : keys) { + LOG.debug("About to update {}", key); - List tasks = propagationManager.createTasks(updated, propByRes, null); - PropagationReporter propagationReporter = taskExecutor.execute(tasks, false); + ProvisioningReport result = new ProvisioningReport(); + result.setOperation(ResourceOperation.UPDATE); + result.setAnyType(REALM_TYPE); + result.setStatus(ProvisioningReport.Status.SUCCESS); + result.setKey(key); - output = updated; - resultStatus = Result.SUCCESS; - result.setName(updated.getFullPath()); + Realm realm = realmDAO.find(key); + RealmTO before = binder.getRealmTO(realm, true); + if (before == null) { + result.setStatus(ProvisioningReport.Status.FAILURE); + result.setMessage(String.format("Realm '%s' not found", key)); + } else { + result.setName(before.getFullPath()); + } - LOG.debug("{} successfully updated", updated); - } catch (PropagationException e) { - // A propagation failure doesn't imply a pull failure. - // The propagation exception status will be reported into the propagation task execution. - LOG.error("Could not propagate Realm {}", delta.getUid().getUidValue(), e); - output = e; - resultStatus = Result.FAILURE; - } catch (Exception e) { - throwIgnoreProvisionException(delta, e); + if (!profile.isDryRun()) { + Result resultStatus; + Object output; - result.setStatus(ProvisioningReport.Status.FAILURE); - result.setMessage(ExceptionUtils.getRootCauseMessage(e)); - LOG.error("Could not update Realm {}", delta.getUid().getUidValue(), e); - output = e; - resultStatus = Result.FAILURE; + if (before == null) { + resultStatus = Result.FAILURE; + output = null; + } else { + try { + for (PullActions action : profile.getActions()) { + workingDelta = action.beforeUpdate(profile, workingDelta, before, null); + } + + PropagationByResource propByRes = binder.update(realm, before); + realm = realmDAO.save(realm); + RealmTO updated = binder.getRealmTO(realm, true); + + List tasks = propagationManager.createTasks(realm, propByRes, null); + taskExecutor.execute(tasks, false); + + for (PullActions action : profile.getActions()) { + action.after(profile, workingDelta, updated, result); + } + + output = updated; + resultStatus = Result.SUCCESS; + result.setName(updated.getFullPath()); + + LOG.debug("{} successfully updated", updated); + } catch (PropagationException e) { + // A propagation failure doesn't imply a pull failure. + // The propagation exception status will be reported into the propagation task execution. + LOG.error("Could not propagate Realm {}", workingDelta.getUid().getUidValue(), e); + output = e; + resultStatus = Result.FAILURE; + } catch (Exception e) { + throwIgnoreProvisionException(workingDelta, e); + + result.setStatus(ProvisioningReport.Status.FAILURE); + result.setMessage(ExceptionUtils.getRootCauseMessage(e)); + LOG.error("Could not update Realm {}", workingDelta.getUid().getUidValue(), e); + output = e; + resultStatus = Result.FAILURE; + } + } + finalize(MatchingRule.toEventName(MatchingRule.UPDATE), resultStatus, before, output, workingDelta); } - finalize(MatchingRule.toEventName(MatchingRule.UPDATE), resultStatus, before, output, delta); + results.add(result); } - return result; + return results; } - private ProvisioningReport deprovision(final SyncDelta delta, final Realm realm, final boolean unlink) + private List deprovision(final SyncDelta delta, final List keys, final boolean unlink) throws JobExecutionException { if (!profile.getTask().isPerformUpdate()) { LOG.debug("PullTask not configured for update"); - return null; + finalize(unlink + ? MatchingRule.toEventName(MatchingRule.UNASSIGN) + : MatchingRule.toEventName(MatchingRule.DEPROVISION), Result.SUCCESS, null, null, delta); + return Collections.emptyList(); } - LOG.debug("About to deprovision {}", realm); + LOG.debug("About to deprovision {}", keys); - ProvisioningReport result = new ProvisioningReport(); - result.setOperation(ResourceOperation.DELETE); - result.setAnyType(REALM_TYPE); - result.setStatus(ProvisioningReport.Status.SUCCESS); - result.setKey(realm.getKey()); + final List results = new ArrayList<>(); - RealmTO before = binder.getRealmTO(realm, true); + SyncDelta workingDelta = delta; + for (String key : keys) { + LOG.debug("About to unassign resource {}", key); - Object output; - Result resultStatus; - if (!profile.isDryRun()) { - result.setName(realm.getFullPath()); + ProvisioningReport result = new ProvisioningReport(); + result.setOperation(ResourceOperation.DELETE); + result.setAnyType(REALM_TYPE); + result.setStatus(ProvisioningReport.Status.SUCCESS); + result.setKey(key); - try { - if (unlink) { - for (PullActions action : profile.getActions()) { - action.beforeUnassign(profile, delta, before); - } - } else { - for (PullActions action : profile.getActions()) { - action.beforeDeprovision(profile, delta, before); - } - } + Realm realm = realmDAO.find(key); + RealmTO before = binder.getRealmTO(realm, true); + if (before == null) { + result.setStatus(ProvisioningReport.Status.FAILURE); + result.setMessage(String.format("Realm '%s' not found", key)); + } else { + result.setName(before.getFullPath()); + } - PropagationByResource propByRes = new PropagationByResource(); - propByRes.add(ResourceOperation.DELETE, profile.getTask().getResource().getKey()); - taskExecutor.execute(propagationManager.createTasks(realm, propByRes, null), false); + if (!profile.isDryRun()) { + Object output; + Result resultStatus; - if (unlink) { - realm.getResources().remove(profile.getTask().getResource()); - output = binder.getRealmTO(realmDAO.save(realm), true); + if (before == null) { + resultStatus = Result.FAILURE; + output = null; } else { - output = binder.getRealmTO(realm, true); - } - - for (PullActions action : profile.getActions()) { - action.after(profile, delta, RealmTO.class.cast(output), result); + try { + if (unlink) { + for (PullActions action : profile.getActions()) { + workingDelta = action.beforeUnassign(profile, workingDelta, before); + } + } else { + for (PullActions action : profile.getActions()) { + workingDelta = action.beforeDeprovision(profile, workingDelta, before); + } + } + + PropagationByResource propByRes = new PropagationByResource(); + propByRes.add(ResourceOperation.DELETE, profile.getTask().getResource().getKey()); + taskExecutor.execute(propagationManager.createTasks(realm, propByRes, null), false); + + if (unlink) { + realm.getResources().remove(profile.getTask().getResource()); + output = binder.getRealmTO(realmDAO.save(realm), true); + } else { + output = binder.getRealmTO(realm, true); + } + + for (PullActions action : profile.getActions()) { + action.after(profile, workingDelta, RealmTO.class.cast(output), result); + } + + resultStatus = Result.SUCCESS; + + LOG.debug("{} successfully updated", realm); + } catch (PropagationException e) { + // A propagation failure doesn't imply a pull failure. + // The propagation exception status will be reported into the propagation task execution. + LOG.error("Could not propagate Realm {}", workingDelta.getUid().getUidValue(), e); + output = e; + resultStatus = Result.FAILURE; + } catch (Exception e) { + throwIgnoreProvisionException(workingDelta, e); + + result.setStatus(ProvisioningReport.Status.FAILURE); + result.setMessage(ExceptionUtils.getRootCauseMessage(e)); + LOG.error("Could not update Realm {}", delta.getUid().getUidValue(), e); + output = e; + resultStatus = Result.FAILURE; + } } - - resultStatus = Result.SUCCESS; - - LOG.debug("{} successfully updated", realm); - } catch (PropagationException e) { - // A propagation failure doesn't imply a pull failure. - // The propagation exception status will be reported into the propagation task execution. - LOG.error("Could not propagate Realm {}", delta.getUid().getUidValue(), e); - output = e; - resultStatus = Result.FAILURE; - } catch (Exception e) { - throwIgnoreProvisionException(delta, e); - - result.setStatus(ProvisioningReport.Status.FAILURE); - result.setMessage(ExceptionUtils.getRootCauseMessage(e)); - LOG.error("Could not update Realm {}", delta.getUid().getUidValue(), e); - output = e; - resultStatus = Result.FAILURE; + finalize(unlink + ? MatchingRule.toEventName(MatchingRule.UNASSIGN) + : MatchingRule.toEventName(MatchingRule.DEPROVISION), resultStatus, before, output, delta); } - - finalize(unlink - ? MatchingRule.toEventName(MatchingRule.UNASSIGN) - : MatchingRule.toEventName(MatchingRule.DEPROVISION), resultStatus, before, output, delta); + results.add(result); } - return result; + return results; } - private ProvisioningReport link(final SyncDelta delta, final Realm realm, final boolean unlink) + private List link(final SyncDelta delta, final List keys, final boolean unlink) throws JobExecutionException { if (!profile.getTask().isPerformUpdate()) { LOG.debug("PullTask not configured for update"); - return null; + finalize(unlink + ? MatchingRule.toEventName(MatchingRule.UNLINK) + : MatchingRule.toEventName(MatchingRule.LINK), Result.SUCCESS, null, null, delta); + return Collections.emptyList(); } - LOG.debug("About to link {}", realm); + LOG.debug("About to link {}", keys); - ProvisioningReport result = new ProvisioningReport(); - result.setOperation(ResourceOperation.NONE); - result.setAnyType(REALM_TYPE); - result.setStatus(ProvisioningReport.Status.SUCCESS); - result.setKey(realm.getKey()); + final List results = new ArrayList<>(); - RealmTO before = binder.getRealmTO(realm, true); + SyncDelta workingDelta = delta; + for (String key : keys) { + LOG.debug("About to unassign resource {}", key); - Object output; - Result resultStatus; - if (!profile.isDryRun()) { - result.setName(realm.getFullPath()); + ProvisioningReport result = new ProvisioningReport(); + result.setOperation(ResourceOperation.NONE); + result.setAnyType(REALM_TYPE); + result.setStatus(ProvisioningReport.Status.SUCCESS); + result.setKey(key); - try { - if (unlink) { - for (PullActions action : profile.getActions()) { - action.beforeUnlink(profile, delta, before); - } - } else { - for (PullActions action : profile.getActions()) { - action.beforeLink(profile, delta, before); - } - } + Realm realm = realmDAO.find(key); + RealmTO before = binder.getRealmTO(realm, true); + if (before == null) { + result.setStatus(ProvisioningReport.Status.FAILURE); + result.setMessage(String.format("Realm '%s' not found", key)); + } else { + result.setName(before.getFullPath()); + } - if (unlink) { - realm.getResources().remove(profile.getTask().getResource()); + Object output; + Result resultStatus; + if (!profile.isDryRun()) { + if (before == null) { + resultStatus = Result.FAILURE; + output = null; } else { - realm.add(profile.getTask().getResource()); - } - output = update(delta, realm, realm.getName()); - - for (PullActions action : profile.getActions()) { - action.after(profile, delta, RealmTO.class.cast(output), result); + try { + if (unlink) { + for (PullActions action : profile.getActions()) { + workingDelta = action.beforeUnlink(profile, workingDelta, before); + } + } else { + for (PullActions action : profile.getActions()) { + workingDelta = action.beforeLink(profile, workingDelta, before); + } + } + + if (unlink) { + realm.getResources().remove(profile.getTask().getResource()); + } else { + realm.add(profile.getTask().getResource()); + } + output = update(workingDelta, Collections.singletonList(key)); + + for (PullActions action : profile.getActions()) { + action.after(profile, workingDelta, RealmTO.class.cast(output), result); + } + + resultStatus = Result.SUCCESS; + + LOG.debug("{} successfully updated", realm); + } catch (PropagationException e) { + // A propagation failure doesn't imply a pull failure. + // The propagation exception status will be reported into the propagation task execution. + LOG.error("Could not propagate Realm {}", workingDelta.getUid().getUidValue(), e); + output = e; + resultStatus = Result.FAILURE; + } catch (Exception e) { + throwIgnoreProvisionException(workingDelta, e); + + result.setStatus(ProvisioningReport.Status.FAILURE); + result.setMessage(ExceptionUtils.getRootCauseMessage(e)); + LOG.error("Could not update Realm {}", workingDelta.getUid().getUidValue(), e); + output = e; + resultStatus = Result.FAILURE; + } } - - resultStatus = Result.SUCCESS; - - LOG.debug("{} successfully updated", realm); - } catch (PropagationException e) { - // A propagation failure doesn't imply a pull failure. - // The propagation exception status will be reported into the propagation task execution. - LOG.error("Could not propagate Realm {}", delta.getUid().getUidValue(), e); - output = e; - resultStatus = Result.FAILURE; - } catch (Exception e) { - throwIgnoreProvisionException(delta, e); - - result.setStatus(ProvisioningReport.Status.FAILURE); - result.setMessage(ExceptionUtils.getRootCauseMessage(e)); - LOG.error("Could not update Realm {}", delta.getUid().getUidValue(), e); - output = e; - resultStatus = Result.FAILURE; + finalize(unlink + ? MatchingRule.toEventName(MatchingRule.UNLINK) + : MatchingRule.toEventName(MatchingRule.LINK), resultStatus, before, output, workingDelta); } - - finalize(unlink - ? MatchingRule.toEventName(MatchingRule.UNLINK) - : MatchingRule.toEventName(MatchingRule.LINK), resultStatus, before, output, delta); + results.add(result); } - return result; + return results; } - private ProvisioningReport delete(final SyncDelta delta, final Realm realm) + private List delete(final SyncDelta delta, final List keys) throws JobExecutionException { if (!profile.getTask().isPerformDelete()) { LOG.debug("PullTask not configured for delete"); - return null; + finalize(ResourceOperation.DELETE.name().toLowerCase(), Result.SUCCESS, null, null, delta); + return Collections.emptyList(); } - LOG.debug("About to delete {}", realm); + LOG.debug("About to delete {}", keys); - SyncDelta workingDelta = delta; - Object output; - Result resultStatus = Result.FAILURE; + List results = new ArrayList<>(); - ProvisioningReport result = new ProvisioningReport(); - - try { - RealmTO before = binder.getRealmTO(realm, true); + SyncDelta workingDelta = delta; + for (String key : keys) { + Object output; + Result resultStatus = Result.FAILURE; - result.setKey(realm.getKey()); - result.setName(realm.getFullPath()); - result.setOperation(ResourceOperation.DELETE); - result.setAnyType(REALM_TYPE); - result.setStatus(ProvisioningReport.Status.SUCCESS); + ProvisioningReport result = new ProvisioningReport(); - if (!profile.isDryRun()) { - for (PullActions action : profile.getActions()) { - workingDelta = action.beforeDelete(profile, workingDelta, before); + try { + result.setKey(key); + result.setOperation(ResourceOperation.DELETE); + result.setAnyType(REALM_TYPE); + result.setStatus(ProvisioningReport.Status.SUCCESS); + + Realm realm = realmDAO.find(key); + RealmTO before = binder.getRealmTO(realm, true); + if (before == null) { + result.setStatus(ProvisioningReport.Status.FAILURE); + result.setMessage(String.format("Realm '%s' not found", key)); + } else { + result.setName(before.getFullPath()); } - try { - if (!realmDAO.findChildren(realm).isEmpty()) { - throw SyncopeClientException.build(ClientExceptionType.HasChildren); - } - - Set adminRealms = Collections.singleton(realm.getFullPath()); - AnyCond keyCond = new AnyCond(AttributeCond.Type.ISNOTNULL); - keyCond.setSchema("key"); - SearchCond allMatchingCond = SearchCond.getLeafCond(keyCond); - int users = searchDAO.count(adminRealms, allMatchingCond, AnyTypeKind.USER); - int groups = searchDAO.count(adminRealms, allMatchingCond, AnyTypeKind.GROUP); - int anyObjects = searchDAO.count(adminRealms, allMatchingCond, AnyTypeKind.ANY_OBJECT); - - if (users + groups + anyObjects > 0) { - SyncopeClientException containedAnys = SyncopeClientException.build( - ClientExceptionType.AssociatedAnys); - containedAnys.getElements().add(users + " user(s)"); - containedAnys.getElements().add(groups + " group(s)"); - containedAnys.getElements().add(anyObjects + " anyObject(s)"); - throw containedAnys; + if (!profile.isDryRun()) { + for (PullActions action : profile.getActions()) { + workingDelta = action.beforeDelete(profile, workingDelta, before); } - PropagationByResource propByRes = new PropagationByResource(); - for (String resource : realm.getResourceKeys()) { - propByRes.add(ResourceOperation.DELETE, resource); + try { + if (!realmDAO.findChildren(realm).isEmpty()) { + throw SyncopeClientException.build(ClientExceptionType.HasChildren); + } + + Set adminRealms = Collections.singleton(realm.getFullPath()); + AnyCond keyCond = new AnyCond(AttributeCond.Type.ISNOTNULL); + keyCond.setSchema("key"); + SearchCond allMatchingCond = SearchCond.getLeafCond(keyCond); + int users = searchDAO.count(adminRealms, allMatchingCond, AnyTypeKind.USER); + int groups = searchDAO.count(adminRealms, allMatchingCond, AnyTypeKind.GROUP); + int anyObjects = searchDAO.count(adminRealms, allMatchingCond, AnyTypeKind.ANY_OBJECT); + + if (users + groups + anyObjects > 0) { + SyncopeClientException containedAnys = SyncopeClientException.build( + ClientExceptionType.AssociatedAnys); + containedAnys.getElements().add(users + " user(s)"); + containedAnys.getElements().add(groups + " group(s)"); + containedAnys.getElements().add(anyObjects + " anyObject(s)"); + throw containedAnys; + } + + PropagationByResource propByRes = new PropagationByResource(); + for (String resource : realm.getResourceKeys()) { + propByRes.add(ResourceOperation.DELETE, resource); + } + List tasks = propagationManager.createTasks(realm, propByRes, null); + taskExecutor.execute(tasks, false); + + realmDAO.delete(realm); + + output = null; + resultStatus = Result.SUCCESS; + + for (PullActions action : profile.getActions()) { + action.after(profile, workingDelta, before, result); + } + } catch (Exception e) { + throwIgnoreProvisionException(workingDelta, e); + + result.setStatus(ProvisioningReport.Status.FAILURE); + result.setMessage(ExceptionUtils.getRootCauseMessage(e)); + LOG.error("Could not delete {}", realm, e); + output = e; } - List tasks = propagationManager.createTasks(realm, propByRes, null); - PropagationReporter propagationReporter = taskExecutor.execute(tasks, false); - - realmDAO.delete(realm); - output = null; - resultStatus = Result.SUCCESS; - - for (PullActions action : profile.getActions()) { - action.after(profile, workingDelta, before, result); - } - } catch (Exception e) { - throwIgnoreProvisionException(delta, e); - - result.setStatus(ProvisioningReport.Status.FAILURE); - result.setMessage(ExceptionUtils.getRootCauseMessage(e)); - LOG.error("Could not delete {}", realm, e); - output = e; + finalize(ResourceOperation.DELETE.name().toLowerCase(), resultStatus, before, output, workingDelta); } - finalize(ResourceOperation.DELETE.name().toLowerCase(), resultStatus, before, output, workingDelta); + results.add(result); + } catch (DelegatedAdministrationException e) { + LOG.error("Not allowed to read Realm {}", key, e); + } catch (Exception e) { + LOG.error("Could not delete Realm {}", key, e); } - } catch (Exception e) { - LOG.error("Could not delete {}", realm, e); } - return result; + return results; } private ProvisioningReport ignore( @@ -572,43 +675,46 @@ public class RealmPullResultHandlerImpl LOG.debug("Process {} for {} as {}", delta.getDeltaType(), delta.getUid().getUidValue(), delta.getObject().getObjectClass()); - Realm realm = IterableUtils.find(realmDAO.findAll(), new Predicate() { + String uid = delta.getPreviousUid() == null + ? delta.getUid().getUidValue() + : delta.getPreviousUid().getUidValue(); - @Override - public boolean evaluate(final Realm realm) { - JexlContext jexlContext = new MapContext(); - JexlUtils.addFieldsToContext(realm, jexlContext); - String evalConnObjectLink = JexlUtils.evaluate(orgUnit.getConnObjectLink(), jexlContext); - - return delta.getObject().getName().getNameValue().equals(evalConnObjectLink); - } - }); + List keys = pullUtils.findExisting(uid, delta.getObject(), orgUnit); LOG.debug("Match found for {} as {}: {}", - delta.getObject().getName().getNameValue(), delta.getObject().getObjectClass(), realm); + delta.getUid().getUidValue(), delta.getObject().getObjectClass(), keys); - String realmName = delta.getUid().getUidValue(); - Attribute nameAttr = delta.getObject().getAttributeByName(orgUnit.getExtAttrName()); - if (nameAttr != null && nameAttr.getValue() != null && !nameAttr.getValue().isEmpty()) { - realmName = nameAttr.getValue().get(0).toString(); + if (keys.size() > 1) { + switch (profile.getResAct()) { + case IGNORE: + throw new IllegalStateException("More than one match " + keys); + + case FIRSTMATCH: + keys = keys.subList(0, 1); + break; + + case LASTMATCH: + keys = keys.subList(keys.size() - 1, keys.size()); + break; + + default: + // keep keys unmodified + } } try { if (SyncDeltaType.CREATE_OR_UPDATE == delta.getDeltaType()) { - if (realm == null) { + if (keys.isEmpty()) { switch (profile.getTask().getUnmatchingRule()) { case ASSIGN: - CollectionUtils.addIgnoreNull( - profile.getResults(), assign(delta, realmName)); + profile.getResults().addAll(assign(delta, orgUnit)); break; case PROVISION: - CollectionUtils.addIgnoreNull( - profile.getResults(), provision(delta, realmName)); + profile.getResults().addAll(provision(delta, orgUnit)); break; case IGNORE: - CollectionUtils.addIgnoreNull( - profile.getResults(), ignore(delta, false)); + profile.getResults().add(ignore(delta, false)); break; default: @@ -617,32 +723,27 @@ public class RealmPullResultHandlerImpl } else { switch (profile.getTask().getMatchingRule()) { case UPDATE: - CollectionUtils.addIgnoreNull( - profile.getResults(), update(delta, realm, realmName)); + profile.getResults().addAll(update(delta, keys)); break; case DEPROVISION: - CollectionUtils.addIgnoreNull( - profile.getResults(), deprovision(delta, realm, false)); + profile.getResults().addAll(deprovision(delta, keys, false)); break; case UNASSIGN: - CollectionUtils.addIgnoreNull( - profile.getResults(), deprovision(delta, realm, true)); + profile.getResults().addAll(deprovision(delta, keys, true)); break; case LINK: - CollectionUtils.addIgnoreNull( - profile.getResults(), link(delta, realm, false)); + profile.getResults().addAll(link(delta, keys, false)); break; case UNLINK: - CollectionUtils.addIgnoreNull( - profile.getResults(), link(delta, realm, true)); + profile.getResults().addAll(link(delta, keys, true)); break; case IGNORE: - CollectionUtils.addIgnoreNull(profile.getResults(), ignore(delta, true)); + profile.getResults().add(ignore(delta, true)); break; default: @@ -650,10 +751,11 @@ public class RealmPullResultHandlerImpl } } } else if (SyncDeltaType.DELETE == delta.getDeltaType()) { - if (realm == null) { + if (keys.isEmpty()) { + finalize(ResourceOperation.DELETE.name().toLowerCase(), Result.SUCCESS, null, null, delta); LOG.debug("No match found for deletion"); } else { - CollectionUtils.addIgnoreNull(profile.getResults(), delete(delta, realm)); + profile.getResults().addAll(delete(delta, keys)); } } } catch (IllegalStateException | IllegalArgumentException e) { http://git-wip-us.apache.org/repos/asf/syncope/blob/eebca673/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java index f028b38..104276e 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.commons.collections4.IteratorUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.syncope.common.lib.to.RealmTO; import org.apache.syncope.common.lib.types.AuditElements; @@ -32,9 +33,10 @@ import org.apache.syncope.core.provisioning.api.PropagationByResource; import org.apache.syncope.common.lib.types.ResourceOperation; import org.apache.syncope.common.lib.types.UnmatchingRule; import org.apache.syncope.core.persistence.api.entity.Realm; +import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit; import org.apache.syncope.core.persistence.api.entity.task.PushTask; -import org.apache.syncope.core.provisioning.api.Connector; +import org.apache.syncope.core.provisioning.api.MappingManager; import org.apache.syncope.core.provisioning.api.TimeoutException; import org.apache.syncope.core.provisioning.api.event.AfterHandlingEvent; import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter; @@ -44,10 +46,9 @@ import org.apache.syncope.core.provisioning.api.pushpull.PushActions; import org.apache.syncope.core.provisioning.api.pushpull.SyncopePushResultHandler; import org.apache.syncope.core.provisioning.java.job.AfterHandlingJob; import org.apache.syncope.core.provisioning.java.utils.MappingUtils; -import org.identityconnectors.framework.common.objects.AttributeBuilder; import org.identityconnectors.framework.common.objects.ConnectorObject; -import org.identityconnectors.framework.common.objects.ResultsHandler; -import org.identityconnectors.framework.common.objects.filter.EqualsFilter; +import org.identityconnectors.framework.common.objects.ObjectClass; +import org.identityconnectors.framework.common.objects.Uid; import org.quartz.JobExecutionException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.quartz.SchedulerFactoryBean; @@ -59,7 +60,10 @@ public class RealmPushResultHandlerImpl implements SyncopePushResultHandler { @Autowired - protected SchedulerFactoryBean scheduler; + private MappingManager mappingManager; + + @Autowired + private SchedulerFactoryBean scheduler; @Transactional(propagation = Propagation.REQUIRES_NEW) @Override @@ -153,39 +157,22 @@ public class RealmPushResultHandlerImpl provision(update(realmTO, result), result); } - /** - * Get remote object for given realm . - * - * @param connector connector facade proxy. - * @param task current propagation task. - * @param orgUnit orgUnit - * @return remote connector object. - */ - private ConnectorObject getRemoteObject( - final String realmName, - final Connector connector, - final OrgUnit orgUnit) { - - final ConnectorObject[] obj = new ConnectorObject[1]; + protected ConnectorObject getRemoteObject(final String connObjectKey, final ObjectClass objectClass) { + ConnectorObject obj = null; try { - connector.search(orgUnit.getObjectClass(), - new EqualsFilter(AttributeBuilder.build(orgUnit.getExtAttrName(), realmName)), - new ResultsHandler() { - - @Override - public boolean handle(final ConnectorObject connectorObject) { - obj[0] = connectorObject; - return false; - } - }, MappingUtils.buildOperationOptions(orgUnit)); + Uid uid = new Uid(connObjectKey); + + obj = profile.getConnector().getObject(objectClass, + uid, + MappingUtils.buildOperationOptions(IteratorUtils.emptyIterator())); } catch (TimeoutException toe) { LOG.debug("Request timeout", toe); throw toe; } catch (RuntimeException ignore) { - LOG.debug("While resolving {}", realmName, ignore); + LOG.debug("While resolving {}", connObjectKey, ignore); } - return obj[0]; + return obj; } private void doHandle(final Realm realm) throws JobExecutionException { @@ -202,10 +189,10 @@ public class RealmPushResultHandlerImpl Result resultStatus = null; // Try to read remote object BEFORE any actual operation - ConnectorObject beforeObj = getRemoteObject( - realm.getName(), - profile.getConnector(), - profile.getTask().getResource().getOrgUnit()); + OrgUnit orgUnit = profile.getTask().getResource().getOrgUnit(); + String connObjecKey = mappingManager.getConnObjectKeyValue(realm, orgUnit); + + ConnectorObject beforeObj = getRemoteObject(connObjecKey, orgUnit.getObjectClass()); if (profile.isDryRun()) { if (beforeObj == null) { @@ -375,10 +362,7 @@ public class RealmPushResultHandlerImpl result.setStatus(ProvisioningReport.Status.SUCCESS); } resultStatus = AuditElements.Result.SUCCESS; - output = getRemoteObject( - realm.getName(), - profile.getConnector(), - profile.getTask().getResource().getOrgUnit()); + output = getRemoteObject(connObjecKey, orgUnit.getObjectClass()); } catch (IgnoreProvisionException e) { throw e; } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/syncope/blob/eebca673/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/ConnObjectUtils.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/ConnObjectUtils.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/ConnObjectUtils.java index be35d61..249e488 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/ConnObjectUtils.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/ConnObjectUtils.java @@ -29,6 +29,7 @@ import org.apache.syncope.common.lib.to.AnyTO; import org.apache.syncope.common.lib.to.AttrTO; import org.apache.syncope.common.lib.to.ConnObjectTO; import org.apache.syncope.common.lib.to.GroupTO; +import org.apache.syncope.common.lib.to.RealmTO; import org.apache.syncope.common.lib.to.UserTO; import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO; import org.apache.syncope.core.persistence.api.dao.UserDAO; @@ -41,6 +42,8 @@ import org.apache.syncope.core.spring.security.PasswordGenerator; import org.apache.syncope.core.spring.security.SecureRandomUtils; import org.apache.syncope.core.persistence.api.dao.RealmDAO; import org.apache.syncope.core.persistence.api.entity.Realm; +import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit; +import org.apache.syncope.core.persistence.api.entity.resource.OrgUnitItem; import org.apache.syncope.core.persistence.api.entity.resource.Provision; import org.apache.syncope.core.persistence.api.entity.task.PullTask; import org.apache.syncope.core.provisioning.api.MappingManager; @@ -159,6 +162,16 @@ public class ConnObjectUtils { return anyTO; } + public RealmTO getRealmTO(final ConnectorObject obj, final PullTask task, final OrgUnit orgUnit) { + RealmTO realmTO = new RealmTO(); + + for (OrgUnitItem item : MappingUtils.getPullItems(orgUnit)) { + mappingManager.setIntValues(item, obj.getAttributeByName(item.getExtAttrName()), realmTO); + } + + return realmTO; + } + /** * Build {@link AnyPatch} out of connector object attributes and schema mapping. * @@ -255,7 +268,7 @@ public class ConnObjectUtils { // 1. fill with data from connector object anyTO.setRealm(pullTask.getDestinatioRealm().getFullPath()); - for (MappingItem item : MappingUtils.getPullMappingItems(provision)) { + for (MappingItem item : MappingUtils.getPullItems(provision)) { mappingManager.setIntValues(item, obj.getAttributeByName(item.getExtAttrName()), anyTO, anyUtils); } http://git-wip-us.apache.org/repos/asf/syncope/blob/eebca673/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/MappingUtils.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/MappingUtils.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/MappingUtils.java index e719a38..2c71f37 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/MappingUtils.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/MappingUtils.java @@ -19,25 +19,27 @@ package org.apache.syncope.core.provisioning.java.utils; import java.util.ArrayList; -import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.collections4.Predicate; import org.apache.commons.jexl3.JexlContext; import org.apache.commons.jexl3.MapContext; import org.apache.commons.lang3.ClassUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.syncope.common.lib.to.MappingItemTO; +import org.apache.syncope.common.lib.to.ItemTO; import org.apache.syncope.common.lib.types.MappingPurpose; import org.apache.syncope.core.persistence.api.entity.Any; +import org.apache.syncope.core.persistence.api.entity.Realm; +import org.apache.syncope.core.persistence.api.entity.resource.Item; import org.apache.syncope.core.persistence.api.entity.resource.Mapping; import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit; +import org.apache.syncope.core.persistence.api.entity.resource.OrgUnitItem; import org.apache.syncope.core.persistence.api.entity.resource.Provision; -import org.apache.syncope.core.provisioning.api.data.JEXLMappingItemTransformer; -import org.apache.syncope.core.provisioning.api.data.MappingItemTransformer; -import org.apache.syncope.core.provisioning.java.data.JEXLMappingItemTransformerImpl; +import org.apache.syncope.core.provisioning.java.data.JEXLItemTransformerImpl; import org.apache.syncope.core.provisioning.java.jexl.JexlUtils; import org.apache.syncope.core.spring.ApplicationContextProvider; import org.identityconnectors.framework.common.objects.Name; @@ -48,6 +50,8 @@ import org.identityconnectors.framework.common.objects.Uid; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.apache.syncope.core.provisioning.api.data.ItemTransformer; +import org.apache.syncope.core.provisioning.api.data.JEXLItemTransformer; public final class MappingUtils { @@ -64,67 +68,68 @@ public final class MappingUtils { : mapping.getConnObjectKeyItem(); } - private static List getMappingItems(final Provision provision, final MappingPurpose purpose) { - List items = Collections.emptyList(); - if (provision != null) { - items = provision.getMapping().getItems(); - } + public static List getPropagationItems(final Provision provision) { + return ListUtils.select(provision.getMapping().getItems(), new Predicate() { - List result = new ArrayList<>(); - - switch (purpose) { - case PULL: - for (MappingItem item : items) { - if (MappingPurpose.PROPAGATION != item.getPurpose() - && MappingPurpose.NONE != item.getPurpose()) { - - result.add(item); - } - } - break; - - case PROPAGATION: - for (MappingItem item : items) { - if (MappingPurpose.PULL != item.getPurpose() - && MappingPurpose.NONE != item.getPurpose()) { - - result.add(item); - } - } - break; - - case BOTH: - for (MappingItem item : items) { - if (MappingPurpose.NONE != item.getPurpose()) { - result.add(item); - } - } - break; - - case NONE: - for (MappingItem item : items) { - if (MappingPurpose.NONE == item.getPurpose()) { - result.add(item); - } - } - break; - - default: - } + @Override + public boolean evaluate(final MappingItem item) { + return item.getPurpose() == MappingPurpose.PROPAGATION || item.getPurpose() == MappingPurpose.BOTH; + } + }); + } - return result; + public static List getPullItems(final Provision provision) { + return ListUtils.select(provision.getMapping().getItems(), new Predicate() { + + @Override + public boolean evaluate(final MappingItem item) { + return item.getPurpose() == MappingPurpose.PULL || item.getPurpose() == MappingPurpose.BOTH; + } + }); } - public static List getPropagationMappingItems(final Provision provision) { - return getMappingItems(provision, MappingPurpose.PROPAGATION); + public static List getPropagationItems(final OrgUnit orgUnit) { + return ListUtils.select(orgUnit.getItems(), new Predicate() { + + @Override + public boolean evaluate(final OrgUnitItem item) { + return item.getPurpose() == MappingPurpose.PROPAGATION || item.getPurpose() == MappingPurpose.BOTH; + } + }); } - public static List getPullMappingItems(final Provision provision) { - return getMappingItems(provision, MappingPurpose.PULL); + public static List getPullItems(final OrgUnit orgUnit) { + return ListUtils.select(orgUnit.getItems(), new Predicate() { + + @Override + public boolean evaluate(final OrgUnitItem item) { + return item.getPurpose() == MappingPurpose.PULL || item.getPurpose() == MappingPurpose.BOTH; + } + }); + } + + private static Name evaluateNAME(final String evalConnObjectLink, final String connObjectKey) { + // If connObjectLink evaluates to an empty string, just use the provided connObjectKey as Name(), + // otherwise evaluated connObjectLink expression is taken as Name(). + Name name; + if (StringUtils.isBlank(evalConnObjectLink)) { + // add connObjectKey as __NAME__ attribute ... + LOG.debug("Add connObjectKey [{}] as __NAME__", connObjectKey); + name = new Name(connObjectKey); + } else { + LOG.debug("Add connObjectLink [{}] as __NAME__", evalConnObjectLink); + name = new Name(evalConnObjectLink); + + // connObjectKey not propagated: it will be used to set the value for __UID__ attribute + LOG.debug("connObjectKey will be used just as __UID__ attribute"); + } + + return name; } /** - * Build __NAME__ for propagation. First look if there ia a defined connObjectLink for the given resource (and in + * Build __NAME__ for propagation. + * First look if there is a defined connObjectLink for the given resource (and in * this case evaluate as JEXL); otherwise, take given connObjectKey. * * @param any given any object @@ -151,36 +156,51 @@ public final class MappingUtils { evalConnObjectLink = JexlUtils.evaluate(connObjectLink, jexlContext); } - // If connObjectLink evaluates to an empty string, just use the provided connObjectKey as Name(), - // otherwise evaluated connObjectLink expression is taken as Name(). - Name name; - if (StringUtils.isBlank(evalConnObjectLink)) { - // add connObjectKey as __NAME__ attribute ... - LOG.debug("Add connObjectKey [{}] as __NAME__", connObjectKey); - name = new Name(connObjectKey); - } else { - LOG.debug("Add connObjectLink [{}] as __NAME__", evalConnObjectLink); - name = new Name(evalConnObjectLink); + return evaluateNAME(evalConnObjectLink, connObjectKey); + } - // connObjectKey not propagated: it will be used to set the value for __UID__ attribute - LOG.debug("connObjectKey will be used just as __UID__ attribute"); + /** + * Build __NAME__ for propagation. + * First look if there is a defined connObjectLink for the given resource (and in + * this case evaluate as JEXL); otherwise, take given connObjectKey. + * + * @param realm given any object + * @param orgUnit external resource + * @param connObjectKey connector object key + * @return the value to be propagated as __NAME__ + */ + public static Name evaluateNAME(final Realm realm, final OrgUnit orgUnit, final String connObjectKey) { + if (StringUtils.isBlank(connObjectKey)) { + // LOG error but avoid to throw exception: leave it to the external resource + LOG.error("Missing ConnObjectKey for '{}': ", orgUnit.getResource()); } - return name; + // Evaluate connObjectKey expression + String connObjectLink = orgUnit == null + ? null + : orgUnit.getConnObjectLink(); + String evalConnObjectLink = null; + if (StringUtils.isNotBlank(connObjectLink)) { + JexlContext jexlContext = new MapContext(); + JexlUtils.addFieldsToContext(realm, jexlContext); + evalConnObjectLink = JexlUtils.evaluate(connObjectLink, jexlContext); + } + + return evaluateNAME(evalConnObjectLink, connObjectKey); } - private static List getMappingItemTransformers( + private static List getMappingItemTransformers( final String propagationJEXLTransformer, final String pullJEXLTransformer, final List mappingItemTransformerClassNames) { - List result = new ArrayList<>(); + List result = new ArrayList<>(); // First consider the JEXL transformation expressions if (StringUtils.isNotBlank(propagationJEXLTransformer) || StringUtils.isNotBlank(pullJEXLTransformer)) { - JEXLMappingItemTransformer jexlTransformer = - (JEXLMappingItemTransformer) ApplicationContextProvider.getBeanFactory(). - createBean(JEXLMappingItemTransformerImpl.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, + JEXLItemTransformer jexlTransformer = + (JEXLItemTransformer) ApplicationContextProvider.getBeanFactory(). + createBean(JEXLItemTransformerImpl.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, false); jexlTransformer.setPropagationJEXL(propagationJEXLTransformer); @@ -193,7 +213,7 @@ public final class MappingUtils { try { Class transformerClass = ClassUtils.getClass(className); - result.add((MappingItemTransformer) ApplicationContextProvider.getBeanFactory(). + result.add((ItemTransformer) ApplicationContextProvider.getBeanFactory(). createBean(transformerClass, AbstractBeanDefinition.AUTOWIRE_BY_NAME, false)); } catch (Exception e) { LOG.error("Could not instantiate {}, ignoring...", className, e); @@ -203,28 +223,28 @@ public final class MappingUtils { return result; } - public static List getMappingItemTransformers(final MappingItemTO mappingItem) { + public static List getItemTransformers(final ItemTO item) { return getMappingItemTransformers( - mappingItem.getPropagationJEXLTransformer(), - mappingItem.getPullJEXLTransformer(), - mappingItem.getMappingItemTransformerClassNames()); + item.getPropagationJEXLTransformer(), + item.getPullJEXLTransformer(), + item.getTransformerClassNames()); } - public static List getMappingItemTransformers(final MappingItem mappingItem) { + public static List getItemTransformers(final Item item) { return getMappingItemTransformers( - mappingItem.getPropagationJEXLTransformer(), - mappingItem.getPullJEXLTransformer(), - mappingItem.getMappingItemTransformerClassNames()); + item.getPropagationJEXLTransformer(), + item.getPullJEXLTransformer(), + item.getTransformerClassNames()); } /** * Build options for requesting all mapped connector attributes. * - * @param mapItems mapping items + * @param iterator items * @return options for requesting all mapped connector attributes * @see OperationOptions */ - public static OperationOptions buildOperationOptions(final Iterator mapItems) { + public static OperationOptions buildOperationOptions(final Iterator iterator) { OperationOptionsBuilder builder = new OperationOptionsBuilder(); Set attrsToGet = new HashSet<>(); @@ -232,10 +252,10 @@ public final class MappingUtils { attrsToGet.add(Uid.NAME); attrsToGet.add(OperationalAttributes.ENABLE_NAME); - while (mapItems.hasNext()) { - MappingItem mapItem = mapItems.next(); - if (mapItem.getPurpose() != MappingPurpose.NONE) { - attrsToGet.add(mapItem.getExtAttrName()); + while (iterator.hasNext()) { + Item item = iterator.next(); + if (item.getPurpose() != MappingPurpose.NONE) { + attrsToGet.add(item.getExtAttrName()); } } @@ -246,17 +266,6 @@ public final class MappingUtils { } /** - * Build options for requesting connector attributes for the given orgUnit. - * - * @param orgUnit orgUnit - * @return options for requesting connector attributes for the given orgUnit - * @see OperationOptions - */ - public static OperationOptions buildOperationOptions(final OrgUnit orgUnit) { - return new OperationOptionsBuilder().setAttributesToGet(Name.NAME, Uid.NAME, orgUnit.getExtAttrName()).build(); - } - - /** * Private default constructor, for static-only classes. */ private MappingUtils() { http://git-wip-us.apache.org/repos/asf/syncope/blob/eebca673/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ResourceDataBinderTest.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ResourceDataBinderTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ResourceDataBinderTest.java index 714dcff..bc7329a 100644 --- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ResourceDataBinderTest.java +++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ResourceDataBinderTest.java @@ -28,7 +28,7 @@ import java.util.Set; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Transformer; import org.apache.syncope.common.lib.SyncopeConstants; -import org.apache.syncope.common.lib.to.MappingItemTO; +import org.apache.syncope.common.lib.to.ItemTO; import org.apache.syncope.common.lib.to.MappingTO; import org.apache.syncope.common.lib.to.ProvisionTO; import org.apache.syncope.common.lib.to.ResourceTO; @@ -122,7 +122,7 @@ public class ResourceDataBinderTest extends AbstractTest { MappingTO mapping = new MappingTO(); provisionTO.setMapping(mapping); - MappingItemTO item = new MappingItemTO(); + ItemTO item = new ItemTO(); item.setIntAttrName("userId"); item.setExtAttrName("campo1"); item.setConnObjectKey(true); http://git-wip-us.apache.org/repos/asf/syncope/blob/eebca673/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/wizards/SAML2IdPMappingPanel.java ---------------------------------------------------------------------- diff --git a/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/wizards/SAML2IdPMappingPanel.java b/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/wizards/SAML2IdPMappingPanel.java index 2597f42..8ea1671 100644 --- a/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/wizards/SAML2IdPMappingPanel.java +++ b/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/wizards/SAML2IdPMappingPanel.java @@ -23,9 +23,9 @@ import java.util.Collections; import java.util.List; import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel; import org.apache.syncope.client.console.wizards.resources.JEXLTransformersTogglePanel; -import org.apache.syncope.client.console.wizards.resources.MappingItemTransformersTogglePanel; +import org.apache.syncope.client.console.wizards.resources.ItemTransformersTogglePanel; import org.apache.syncope.common.lib.to.AnyTypeClassTO; -import org.apache.syncope.common.lib.to.MappingItemTO; +import org.apache.syncope.common.lib.to.ItemTO; import org.apache.syncope.common.lib.to.SAML2IdPTO; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.MappingPurpose; @@ -40,13 +40,13 @@ public class SAML2IdPMappingPanel extends AbstractMappingPanel { public SAML2IdPMappingPanel( final String id, final SAML2IdPTO idpTO, - final MappingItemTransformersTogglePanel mapItemTransformers, + final ItemTransformersTogglePanel mapItemTransformers, final JEXLTransformersTogglePanel jexlTransformers) { super(id, mapItemTransformers, jexlTransformers, - new ListModel(idpTO.getMappingItems()), + new ListModel(idpTO.getMappingItems()), true, true, MappingPurpose.NONE); http://git-wip-us.apache.org/repos/asf/syncope/blob/eebca673/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/wizards/SAML2IdPWizardBuilder.java ---------------------------------------------------------------------- diff --git a/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/wizards/SAML2IdPWizardBuilder.java b/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/wizards/SAML2IdPWizardBuilder.java index d824807..aa9ea0f 100644 --- a/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/wizards/SAML2IdPWizardBuilder.java +++ b/ext/saml2sp/client-console/src/main/java/org/apache/syncope/client/console/wizards/SAML2IdPWizardBuilder.java @@ -32,8 +32,8 @@ import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownCho import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel; import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel; import org.apache.syncope.client.console.wizards.resources.JEXLTransformersTogglePanel; -import org.apache.syncope.client.console.wizards.resources.MappingItemTransformersTogglePanel; -import org.apache.syncope.common.lib.to.MappingItemTO; +import org.apache.syncope.client.console.wizards.resources.ItemTransformersTogglePanel; +import org.apache.syncope.common.lib.to.ItemTO; import org.apache.syncope.common.lib.to.SAML2IdPTO; import org.apache.syncope.common.lib.types.SAML2BindingType; import org.apache.wicket.Component; @@ -68,8 +68,8 @@ public class SAML2IdPWizardBuilder extends AjaxWizardBuilder { Mapping mapping = new Mapping(modelObject); mapping.setOutputMarkupId(true); - MappingItemTransformersTogglePanel mapItemTransformers = - new MappingItemTransformersTogglePanel(mapping, pageRef); + ItemTransformersTogglePanel mapItemTransformers = + new ItemTransformersTogglePanel(mapping, pageRef); addOuterObject(mapItemTransformers); JEXLTransformersTogglePanel jexlTransformers = new JEXLTransformersTogglePanel(mapping, pageRef); addOuterObject(jexlTransformers); @@ -133,10 +133,10 @@ public class SAML2IdPWizardBuilder extends AjaxWizardBuilder { @Override protected Serializable onApplyInternal(final SAML2IdPTO modelObject) { long connObjectKeyCount = IterableUtils.countMatches( - modelObject.getMappingItems(), new Predicate() { + modelObject.getMappingItems(), new Predicate() { @Override - public boolean evaluate(final MappingItemTO item) { + public boolean evaluate(final ItemTO item) { return item.isConnObjectKey(); } }); http://git-wip-us.apache.org/repos/asf/syncope/blob/eebca673/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java ---------------------------------------------------------------------- diff --git a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java index 109af15..089908e 100644 --- a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java +++ b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java @@ -51,7 +51,7 @@ public class SAML2IdPTO extends AbstractBaseBean implements EntityTO { private boolean logoutSupported; - private final List mappingItems = new ArrayList<>(); + private final List mappingItems = new ArrayList<>(); @Override public String getKey() { @@ -112,24 +112,24 @@ public class SAML2IdPTO extends AbstractBaseBean implements EntityTO { this.logoutSupported = logoutSupported; } - public MappingItemTO getConnObjectKeyItem() { - return IterableUtils.find(getMappingItems(), new Predicate() { + public ItemTO getConnObjectKeyItem() { + return IterableUtils.find(getMappingItems(), new Predicate() { @Override - public boolean evaluate(final MappingItemTO item) { + public boolean evaluate(final ItemTO item) { return item.isConnObjectKey(); } }); } - protected boolean addConnObjectKeyItem(final MappingItemTO connObjectItem) { + protected boolean addConnObjectKeyItem(final ItemTO connObjectItem) { connObjectItem.setMandatoryCondition("true"); connObjectItem.setConnObjectKey(true); return this.add(connObjectItem); } - public boolean setConnObjectKeyItem(final MappingItemTO connObjectKeyItem) { + public boolean setConnObjectKeyItem(final ItemTO connObjectKeyItem) { return connObjectKeyItem == null ? remove(getConnObjectKeyItem()) : addConnObjectKeyItem(connObjectKeyItem); @@ -138,15 +138,15 @@ public class SAML2IdPTO extends AbstractBaseBean implements EntityTO { @XmlElementWrapper(name = "mappingItems") @XmlElement(name = "mappingItem") @JsonProperty("mappingItems") - public List getMappingItems() { + public List getMappingItems() { return mappingItems; } - public boolean add(final MappingItemTO item) { + public boolean add(final ItemTO item) { return item == null ? false : this.mappingItems.contains(item) || this.mappingItems.add(item); } - public boolean remove(final MappingItemTO item) { + public boolean remove(final ItemTO item) { return this.mappingItems.remove(item); } http://git-wip-us.apache.org/repos/asf/syncope/blob/eebca673/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2IdPLogic.java ---------------------------------------------------------------------- diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2IdPLogic.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2IdPLogic.java index bbd170d..f86b633 100644 --- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2IdPLogic.java +++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2IdPLogic.java @@ -30,7 +30,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Transformer; import org.apache.commons.lang3.ArrayUtils; import org.apache.syncope.common.lib.SyncopeClientException; -import org.apache.syncope.common.lib.to.MappingItemTO; +import org.apache.syncope.common.lib.to.ItemTO; import org.apache.syncope.common.lib.to.SAML2IdPTO; import org.apache.syncope.common.lib.types.ClientExceptionType; import org.apache.syncope.common.lib.types.SAML2BindingType; @@ -154,7 +154,7 @@ public class SAML2IdPLogic extends AbstractSAML2Logic { idpTO.setMetadata(Base64.getEncoder().encodeToString(baos.toByteArray())); } - MappingItemTO connObjectKeyItem = new MappingItemTO(); + ItemTO connObjectKeyItem = new ItemTO(); connObjectKeyItem.setIntAttrName("username"); connObjectKeyItem.setExtAttrName("NameID"); idpTO.setConnObjectKeyItem(connObjectKeyItem); http://git-wip-us.apache.org/repos/asf/syncope/blob/eebca673/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java ---------------------------------------------------------------------- diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java index 91e9ff0..59d6c2c 100644 --- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java +++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java @@ -43,7 +43,7 @@ import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.to.AttrTO; import org.apache.syncope.common.lib.to.SAML2RequestTO; import org.apache.syncope.common.lib.to.SAML2LoginResponseTO; -import org.apache.syncope.common.lib.to.MappingItemTO; +import org.apache.syncope.common.lib.to.ItemTO; import org.apache.syncope.common.lib.to.SAML2ReceivedResponseTO; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.ClientExceptionType; @@ -66,7 +66,6 @@ import org.apache.syncope.core.persistence.api.entity.user.UPlainAttrValue; import org.apache.syncope.core.persistence.api.entity.user.User; import org.apache.syncope.core.provisioning.api.IntAttrName; import org.apache.syncope.core.provisioning.api.data.AccessTokenDataBinder; -import org.apache.syncope.core.provisioning.api.data.MappingItemTransformer; import org.apache.syncope.core.provisioning.api.utils.EntityUtils; import org.apache.syncope.core.provisioning.java.IntAttrNameParser; import org.apache.syncope.core.provisioning.java.utils.MappingUtils; @@ -119,6 +118,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.stereotype.Component; +import org.apache.syncope.core.provisioning.api.data.ItemTransformer; @Component public class SAML2SPLogic extends AbstractSAML2Logic { @@ -340,11 +340,11 @@ public class SAML2SPLogic extends AbstractSAML2Logic { return requestTO; } - private List findMatchingUser(final String keyValue, final MappingItemTO connObjectKeyItem) { + private List findMatchingUser(final String keyValue, final ItemTO connObjectKeyItem) { List result = new ArrayList<>(); String transformed = keyValue; - for (MappingItemTransformer transformer : MappingUtils.getMappingItemTransformers(connObjectKeyItem)) { + for (ItemTransformer transformer : MappingUtils.getItemTransformers(connObjectKeyItem)) { List output = transformer.beforePull( null, null, http://git-wip-us.apache.org/repos/asf/syncope/blob/eebca673/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2IdPCache.java ---------------------------------------------------------------------- diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2IdPCache.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2IdPCache.java index a5ab6c3..ed244d0 100644 --- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2IdPCache.java +++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2IdPCache.java @@ -28,7 +28,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; import net.shibboleth.utilities.java.support.xml.XMLParserException; -import org.apache.syncope.common.lib.to.MappingItemTO; +import org.apache.syncope.common.lib.to.ItemTO; import org.apache.syncope.common.lib.types.SAML2BindingType; import org.apache.syncope.core.logic.init.SAML2SPLoader; import org.apache.syncope.core.persistence.api.entity.SAML2IdP; @@ -66,7 +66,7 @@ public class SAML2IdPCache { public SAML2IdPEntity put( final EntityDescriptor entityDescriptor, - final MappingItemTO connObjectKeyItem, + final ItemTO connObjectKeyItem, final boolean useDeflateEncoding, final SAML2BindingType bindingType) throws CertificateException, IOException, KeyStoreException, NoSuchAlgorithmException { http://git-wip-us.apache.org/repos/asf/syncope/blob/eebca673/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2IdPEntity.java ---------------------------------------------------------------------- diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2IdPEntity.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2IdPEntity.java index 6b75472..c060e58 100644 --- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2IdPEntity.java +++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2IdPEntity.java @@ -31,7 +31,7 @@ import java.util.Base64; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.syncope.common.lib.to.MappingItemTO; +import org.apache.syncope.common.lib.to.ItemTO; import org.apache.syncope.common.lib.types.SAML2BindingType; import org.opensaml.saml.common.xml.SAMLConstants; import org.opensaml.saml.saml2.metadata.Endpoint; @@ -55,7 +55,7 @@ public class SAML2IdPEntity { private SAML2BindingType bindingType; - private MappingItemTO connObjectKeyItem; + private ItemTO connObjectKeyItem; private final Map ssoBindings = new HashMap<>(); @@ -67,7 +67,7 @@ public class SAML2IdPEntity { public SAML2IdPEntity( final EntityDescriptor entityDescriptor, - final MappingItemTO connObjectKeyItem, + final ItemTO connObjectKeyItem, final boolean useDeflateEncoding, final SAML2BindingType bindingType, final String keyPass) @@ -142,11 +142,11 @@ public class SAML2IdPEntity { this.bindingType = bindingType; } - public MappingItemTO getConnObjectKeyItem() { + public ItemTO getConnObjectKeyItem() { return connObjectKeyItem; } - public void setConnObjectKeyItem(final MappingItemTO connObjectKeyItem) { + public void setConnObjectKeyItem(final ItemTO connObjectKeyItem) { this.connObjectKeyItem = connObjectKeyItem; } http://git-wip-us.apache.org/repos/asf/syncope/blob/eebca673/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/SAML2IdPValidator.java ---------------------------------------------------------------------- diff --git a/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/SAML2IdPValidator.java b/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/SAML2IdPValidator.java index 9869500..3e80bed 100644 --- a/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/SAML2IdPValidator.java +++ b/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/SAML2IdPValidator.java @@ -24,7 +24,7 @@ import org.apache.commons.collections4.Predicate; import org.apache.syncope.common.lib.types.EntityViolationType; import org.apache.syncope.core.persistence.api.entity.SAML2IdP; import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; -import org.apache.syncope.core.provisioning.api.data.MappingItemTransformer; +import org.apache.syncope.core.provisioning.api.data.ItemTransformer; public class SAML2IdPValidator extends AbstractValidator { @@ -61,12 +61,12 @@ public class SAML2IdPValidator extends AbstractValidator actionsClass = null; boolean isAssignable = false; try { actionsClass = Class.forName(className); - isAssignable = MappingItemTransformer.class.isAssignableFrom(actionsClass); + isAssignable = ItemTransformer.class.isAssignableFrom(actionsClass); } catch (Exception e) { LOG.error("Invalid MappingItemTransformer specified: {}", className, e); } http://git-wip-us.apache.org/repos/asf/syncope/blob/eebca673/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java b/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java index 5eba217..f9f16ab 100644 --- a/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java +++ b/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java @@ -22,7 +22,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.syncope.common.lib.SyncopeClientCompositeException; import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.to.AnyTypeClassTO; -import org.apache.syncope.common.lib.to.MappingItemTO; +import org.apache.syncope.common.lib.to.ItemTO; import org.apache.syncope.common.lib.to.SAML2IdPTO; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.ClientExceptionType; @@ -87,10 +87,10 @@ public class SAML2IdPDataBinderImpl implements SAML2IdPDataBinder { SyncopeClientException requiredValuesMissing = SyncopeClientException.build( ClientExceptionType.RequiredValuesMissing); - for (MappingItemTO itemTO : idpTO.getMappingItems()) { + for (ItemTO itemTO : idpTO.getMappingItems()) { if (itemTO == null) { - LOG.error("Null {}", MappingItemTO.class.getSimpleName()); - invalidMapping.getElements().add("Null " + MappingItemTO.class.getSimpleName()); + LOG.error("Null {}", ItemTO.class.getSimpleName()); + invalidMapping.getElements().add("Null " + ItemTO.class.getSimpleName()); } else if (itemTO.getIntAttrName() == null) { requiredValuesMissing.getElements().add("intAttrName"); scce.addException(requiredValuesMissing); @@ -194,7 +194,7 @@ public class SAML2IdPDataBinderImpl implements SAML2IdPDataBinder { private void populateMappingTO(final SAML2IdP idp, final SAML2IdPTO idpTO) { for (MappingItem item : idp.getMappingItems()) { - MappingItemTO itemTO = new MappingItemTO(); + ItemTO itemTO = new ItemTO(); itemTO.setKey(item.getKey()); BeanUtils.copyProperties(item, itemTO, MAPPINGITEM_IGNORE_PROPERTIES); itemTO.setPurpose(MappingPurpose.NONE);