[SYNCOPE-1182] Get rid of GetApiOp
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/f533b2f7 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/f533b2f7 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/f533b2f7 Branch: refs/heads/master Commit: f533b2f73b1e9e2f039e3c393e24c75e0b4dd394 Parents: aee4cea Author: Francesco Chicchiriccò <ilgro...@apache.org> Authored: Tue Aug 1 15:42:04 2017 +0200 Committer: Francesco Chicchiriccò <ilgro...@apache.org> Committed: Tue Aug 1 15:42:15 2017 +0200 ---------------------------------------------------------------------- .../syncope/core/logic/ResourceLogic.java | 6 ++- .../core/provisioning/api/Connector.java | 4 +- .../provisioning/java/AsyncConnectorFacade.java | 16 +++++- .../provisioning/java/ConnectorFacadeProxy.java | 56 +++++++++++--------- .../provisioning/java/VirAttrHandlerImpl.java | 17 +++--- .../job/report/ReconciliationReportlet.java | 5 +- .../AbstractPropagationTaskExecutor.java | 9 ++-- .../pushpull/AbstractPushResultHandler.java | 38 ++++++++----- .../pushpull/RealmPushResultHandlerImpl.java | 40 +++++++++----- .../src/test/resources/rest/SearchScript.groovy | 5 +- .../src/test/resources/rest/SyncScript.groovy | 1 + 11 files changed, 126 insertions(+), 71 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/f533b2f7/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java ---------------------------------------------------------------------- diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java index 4593b77..3f2ff75 100644 --- a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java +++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java @@ -69,6 +69,7 @@ import org.apache.syncope.core.provisioning.java.utils.MappingUtils; import org.apache.syncope.core.spring.security.AuthContextUtils; import org.apache.syncope.core.spring.security.DelegatedAdministrationException; import org.identityconnectors.framework.common.objects.Attribute; +import org.identityconnectors.framework.common.objects.AttributeBuilder; import org.identityconnectors.framework.common.objects.AttributeUtil; import org.identityconnectors.framework.common.objects.ConnectorObject; import org.identityconnectors.framework.common.objects.Name; @@ -344,8 +345,9 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> { // 4. read from the underlying connector Connector connector = connFactory.getConnector(init.getLeft()); - ConnectorObject connectorObject = connector.getObject(init.getRight().getObjectClass(), - new Uid(connObjectKeyValue), + ConnectorObject connectorObject = connector.getObject( + init.getRight().getObjectClass(), + AttributeBuilder.build(connObjectKeyItem.getExtAttrName(), connObjectKeyValue), MappingUtils.buildOperationOptions(mapItems)); if (connectorObject == null) { throw new NotFoundException( http://git-wip-us.apache.org/repos/asf/syncope/blob/f533b2f7/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/Connector.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/Connector.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/Connector.java index 694ab30..324c1d9 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/Connector.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/Connector.java @@ -140,11 +140,11 @@ public interface Connector { * Get remote object. * * @param objectClass ConnId's object class - * @param uid ConnId's Uid + * @param connObjectKey ConnId's key attribute * @param options ConnId's OperationOptions * @return ConnId's connector object for given uid */ - ConnectorObject getObject(ObjectClass objectClass, Uid uid, OperationOptions options); + ConnectorObject getObject(ObjectClass objectClass, Attribute connObjectKey, OperationOptions options); /** * Search for remote objects. http://git-wip-us.apache.org/repos/asf/syncope/blob/f533b2f7/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AsyncConnectorFacade.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AsyncConnectorFacade.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AsyncConnectorFacade.java index 83a38eb..a655fc4 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AsyncConnectorFacade.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/AsyncConnectorFacade.java @@ -28,8 +28,10 @@ import org.identityconnectors.framework.common.objects.ConnectorObject; import org.identityconnectors.framework.common.objects.ObjectClass; import org.identityconnectors.framework.common.objects.ObjectClassInfo; import org.identityconnectors.framework.common.objects.OperationOptions; +import org.identityconnectors.framework.common.objects.ResultsHandler; import org.identityconnectors.framework.common.objects.SyncToken; import org.identityconnectors.framework.common.objects.Uid; +import org.identityconnectors.framework.common.objects.filter.FilterBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; @@ -98,10 +100,20 @@ public class AsyncConnectorFacade { public Future<ConnectorObject> getObject( final ConnectorFacade connector, final ObjectClass objectClass, - final Uid uid, + final Attribute connObjectKey, final OperationOptions options) { - return new AsyncResult<>(connector.getObject(objectClass, uid, options)); + final ConnectorObject[] objects = new ConnectorObject[1]; + connector.search(objectClass, FilterBuilder.equalTo(connObjectKey), new ResultsHandler() { + + @Override + public boolean handle(final ConnectorObject connectorObject) { + objects[0] = connectorObject; + return false; + } + }, options); + + return new AsyncResult<>(objects[0]); } @Async http://git-wip-us.apache.org/repos/asf/syncope/blob/f533b2f7/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java index 8184c5d..2b42e91 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java @@ -303,32 +303,6 @@ public class ConnectorFacadeProxy implements Connector { return result; } - @Override - public ConnectorObject getObject(final ObjectClass objectClass, final Uid uid, final OperationOptions options) { - Future<ConnectorObject> future = null; - - if (connInstance.getCapabilities().contains(ConnectorCapability.SEARCH)) { - future = asyncFacade.getObject(connector, objectClass, uid, options); - } else { - LOG.info("Search was attempted, although the connector only has these capabilities: {}. No action.", - connInstance.getCapabilities()); - } - - try { - return future == null ? null : future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS); - } catch (java.util.concurrent.TimeoutException e) { - future.cancel(true); - throw new TimeoutException("Request timeout"); - } catch (Exception e) { - LOG.error("Connector request execution failure", e); - if (e.getCause() instanceof RuntimeException) { - throw (RuntimeException) e.getCause(); - } else { - throw new IllegalArgumentException(e.getCause()); - } - } - } - @Transactional @Override public void fullReconciliation( @@ -417,6 +391,36 @@ public class ConnectorFacadeProxy implements Connector { } @Override + public ConnectorObject getObject( + final ObjectClass objectClass, + final Attribute connObjectKey, + final OperationOptions options) { + + Future<ConnectorObject> future = null; + + if (connInstance.getCapabilities().contains(ConnectorCapability.SEARCH)) { + future = asyncFacade.getObject(connector, objectClass, connObjectKey, options); + } else { + LOG.info("Search was attempted, although the connector only has these capabilities: {}. No action.", + connInstance.getCapabilities()); + } + + try { + return future == null ? null : future.get(connInstance.getConnRequestTimeout(), TimeUnit.SECONDS); + } catch (java.util.concurrent.TimeoutException e) { + future.cancel(true); + throw new TimeoutException("Request timeout"); + } catch (Exception e) { + LOG.error("Connector request execution failure", e); + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } else { + throw new IllegalArgumentException(e.getCause()); + } + } + } + + @Override public void search( final ObjectClass objectClass, final Filter filter, http://git-wip-us.apache.org/repos/asf/syncope/blob/f533b2f7/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java index b4090d8..a074848 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java @@ -25,7 +25,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.collections4.ListUtils; -import org.apache.commons.lang3.StringUtils; import org.apache.syncope.core.persistence.api.entity.Any; import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory; import org.apache.syncope.core.persistence.api.entity.Membership; @@ -41,8 +40,8 @@ import org.apache.syncope.core.provisioning.api.cache.VirAttrCache; import org.apache.syncope.core.provisioning.api.cache.VirAttrCacheValue; import org.apache.syncope.core.provisioning.java.utils.MappingUtils; import org.identityconnectors.framework.common.objects.Attribute; +import org.identityconnectors.framework.common.objects.AttributeBuilder; import org.identityconnectors.framework.common.objects.ConnectorObject; -import org.identityconnectors.framework.common.objects.Uid; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -99,25 +98,29 @@ public class VirAttrHandlerImpl implements VirAttrHandler { for (Map.Entry<Provision, Set<VirSchema>> entry : toRead.entrySet()) { LOG.debug("About to read from {}: {}", entry.getKey(), entry.getValue()); - String connObjectKey = MappingUtils.getConnObjectKeyItem(entry.getKey()) == null + MappingItem connObjectKeyItem = MappingUtils.getConnObjectKeyItem(entry.getKey()); + String connObjectKeyValue = connObjectKeyItem == null ? null : mappingManager.getConnObjectKeyValue(any, entry.getKey()); - if (StringUtils.isBlank(connObjectKey)) { + if (connObjectKeyItem == null) { LOG.error("No ConnObjectKey found for {}, ignoring...", entry.getKey()); } else { Set<MappingItem> linkingMappingItems = new HashSet<>(); + linkingMappingItems.add(connObjectKeyItem); for (VirSchema schema : entry.getValue()) { linkingMappingItems.add(schema.asLinkingMappingItem()); } Connector connector = connFactory.getConnector(entry.getKey().getResource()); try { - ConnectorObject connectorObject = connector.getObject(entry.getKey().getObjectClass(), - new Uid(connObjectKey), + ConnectorObject connectorObject = connector.getObject( + entry.getKey().getObjectClass(), + AttributeBuilder.build(connObjectKeyItem.getExtAttrName(), connObjectKeyValue), MappingUtils.buildOperationOptions(linkingMappingItems.iterator())); if (connectorObject == null) { - LOG.debug("No read from {} about {}", entry.getKey(), connObjectKey); + LOG.debug("No read from {} with filter '{} == {}'", + entry.getKey(), connObjectKeyItem.getExtAttrName(), connObjectKeyValue); } else { for (VirSchema schema : entry.getValue()) { Attribute attr = connectorObject.getAttributeByName(schema.getExtAttrName()); http://git-wip-us.apache.org/repos/asf/syncope/blob/f533b2f7/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReconciliationReportlet.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReconciliationReportlet.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReconciliationReportlet.java index f39ee1c..0328e62 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReconciliationReportlet.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReconciliationReportlet.java @@ -296,8 +296,9 @@ public class ReconciliationReportlet extends AbstractReportlet { if (provision != null && connObjectKeyItem != null && StringUtils.isNotBlank(connObjectKeyValue)) { // 1. read from the underlying connector Connector connector = connFactory.getConnector(resource); - ConnectorObject connectorObject = connector.getObject(provision.getObjectClass(), - new Uid(connObjectKeyValue), + ConnectorObject connectorObject = connector.getObject( + provision.getObjectClass(), + AttributeBuilder.build(connObjectKeyItem.getExtAttrName(), connObjectKeyValue), MappingUtils.buildOperationOptions(provision.getMapping().getItems().iterator())); if (connectorObject == null) { http://git-wip-us.apache.org/repos/asf/syncope/blob/f533b2f7/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java index b24c85c..762c78b 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java @@ -67,6 +67,7 @@ import org.apache.syncope.core.provisioning.api.propagation.PropagationException import org.apache.syncope.core.provisioning.java.utils.MappingUtils; import org.identityconnectors.framework.common.exceptions.ConnectorException; import org.identityconnectors.framework.common.objects.Attribute; +import org.identityconnectors.framework.common.objects.AttributeBuilder; import org.identityconnectors.framework.common.objects.AttributeUtil; import org.identityconnectors.framework.common.objects.ConnectorObject; import org.identityconnectors.framework.common.objects.ConnectorObjectBuilder; @@ -607,8 +608,10 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask ConnectorObject obj = null; try { - obj = connector.getObject(new ObjectClass(task.getObjectClassName()), - new Uid(connObjectKey), + obj = connector.getObject( + new ObjectClass(task.getObjectClassName()), + AttributeBuilder.build( + MappingUtils.getConnObjectKeyItem(provision).getExtAttrName(), connObjectKey), MappingUtils.buildOperationOptions(IteratorUtils.chainedIterator( MappingUtils.getPropagationItems(provision).iterator(), linkingMappingItems.iterator()))); @@ -655,7 +658,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask ConnectorObject obj = null; try { obj = connector.getObject(new ObjectClass(task.getObjectClassName()), - new Uid(connObjectKey), + AttributeBuilder.build(orgUnit.getConnObjectKeyItem().getExtAttrName(), connObjectKey), MappingUtils.buildOperationOptions(MappingUtils.getPropagationItems(orgUnit).iterator())); } catch (TimeoutException toe) { LOG.debug("Request timeout", toe); http://git-wip-us.apache.org/repos/asf/syncope/blob/f533b2f7/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java index 772c42a..7fbfe4e 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java @@ -21,10 +21,10 @@ package org.apache.syncope.core.provisioning.java.pushpull; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.IteratorUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.syncope.common.lib.patch.AnyPatch; import org.apache.syncope.common.lib.patch.StringPatchItem; @@ -45,6 +45,7 @@ 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.group.Group; +import org.apache.syncope.core.persistence.api.entity.resource.Item; import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; import org.apache.syncope.core.persistence.api.entity.resource.Provision; import org.apache.syncope.core.provisioning.api.AuditManager; @@ -58,9 +59,9 @@ import org.apache.syncope.core.provisioning.api.pushpull.SyncopePushResultHandle import org.apache.syncope.core.provisioning.api.utils.EntityUtils; 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.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; @@ -198,19 +199,23 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan provision(any, enabled, result); } - protected ConnectorObject getRemoteObject(final String connObjectKey, final ObjectClass objectClass) { + protected ConnectorObject getRemoteObject( + final ObjectClass objectClass, + final String connObjectKey, + final String connObjectKeyValue, + final Iterator<? extends Item> iterator) { + ConnectorObject obj = null; try { - Uid uid = new Uid(connObjectKey); - - obj = profile.getConnector().getObject(objectClass, - uid, - MappingUtils.buildOperationOptions(IteratorUtils.<MappingItem>emptyIterator())); + obj = profile.getConnector().getObject( + objectClass, + AttributeBuilder.build(connObjectKey, connObjectKeyValue), + MappingUtils.buildOperationOptions(iterator)); } catch (TimeoutException toe) { LOG.debug("Request timeout", toe); throw toe; } catch (RuntimeException ignore) { - LOG.debug("While resolving {}", connObjectKey, ignore); + LOG.debug("While resolving {}", connObjectKeyValue, ignore); } return obj; @@ -262,9 +267,14 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan // Try to read remote object BEFORE any actual operation Provision provision = profile.getTask().getResource().getProvision(any.getType()); - String connObjecKey = mappingManager.getConnObjectKeyValue(any, provision); + MappingItem connObjectKey = MappingUtils.getConnObjectKeyItem(provision); + String connObjecKeyValue = mappingManager.getConnObjectKeyValue(any, provision); - ConnectorObject beforeObj = getRemoteObject(connObjecKey, provision.getObjectClass()); + ConnectorObject beforeObj = getRemoteObject( + provision.getObjectClass(), + connObjectKey.getExtAttrName(), + connObjecKeyValue, + provision.getMapping().getItems().iterator()); Boolean status = profile.getTask().isSyncStatus() ? enabled : null; @@ -429,7 +439,11 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan result.setStatus(ProvisioningReport.Status.SUCCESS); } resultStatus = AuditElements.Result.SUCCESS; - output = getRemoteObject(connObjecKey, provision.getObjectClass()); + output = getRemoteObject( + provision.getObjectClass(), + connObjectKey.getExtAttrName(), + connObjecKeyValue, + provision.getMapping().getItems().iterator()); } catch (IgnoreProvisionException e) { throw e; } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/syncope/blob/f533b2f7/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 104276e..4becdad 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 @@ -20,9 +20,9 @@ package org.apache.syncope.core.provisioning.java.pushpull; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; 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; @@ -33,8 +33,9 @@ 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.Item; 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.task.PushTask; import org.apache.syncope.core.provisioning.api.MappingManager; import org.apache.syncope.core.provisioning.api.TimeoutException; @@ -46,9 +47,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.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; @@ -157,19 +158,23 @@ public class RealmPushResultHandlerImpl provision(update(realmTO, result), result); } - protected ConnectorObject getRemoteObject(final String connObjectKey, final ObjectClass objectClass) { + protected ConnectorObject getRemoteObject( + final ObjectClass objectClass, + final String connObjectKey, + final String connObjectKeyValue, + final Iterator<? extends Item> iterator) { + ConnectorObject obj = null; try { - Uid uid = new Uid(connObjectKey); - - obj = profile.getConnector().getObject(objectClass, - uid, - MappingUtils.buildOperationOptions(IteratorUtils.<MappingItem>emptyIterator())); + obj = profile.getConnector().getObject( + objectClass, + AttributeBuilder.build(connObjectKey, connObjectKeyValue), + MappingUtils.buildOperationOptions(iterator)); } catch (TimeoutException toe) { LOG.debug("Request timeout", toe); throw toe; } catch (RuntimeException ignore) { - LOG.debug("While resolving {}", connObjectKey, ignore); + LOG.debug("While resolving {}", connObjectKeyValue, ignore); } return obj; @@ -190,9 +195,14 @@ public class RealmPushResultHandlerImpl // Try to read remote object BEFORE any actual operation OrgUnit orgUnit = profile.getTask().getResource().getOrgUnit(); - String connObjecKey = mappingManager.getConnObjectKeyValue(realm, orgUnit); + OrgUnitItem connObjectKey = orgUnit.getConnObjectKeyItem(); + String connObjecKeyValue = mappingManager.getConnObjectKeyValue(realm, orgUnit); - ConnectorObject beforeObj = getRemoteObject(connObjecKey, orgUnit.getObjectClass()); + ConnectorObject beforeObj = getRemoteObject( + orgUnit.getObjectClass(), + connObjectKey.getExtAttrName(), + connObjecKeyValue, + orgUnit.getItems().iterator()); if (profile.isDryRun()) { if (beforeObj == null) { @@ -362,7 +372,11 @@ public class RealmPushResultHandlerImpl result.setStatus(ProvisioningReport.Status.SUCCESS); } resultStatus = AuditElements.Result.SUCCESS; - output = getRemoteObject(connObjecKey, orgUnit.getObjectClass()); + output = getRemoteObject( + orgUnit.getObjectClass(), + connObjectKey.getExtAttrName(), + connObjecKeyValue, + orgUnit.getItems().iterator()); } catch (IgnoreProvisionException e) { throw e; } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/syncope/blob/f533b2f7/fit/core-reference/src/test/resources/rest/SearchScript.groovy ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/resources/rest/SearchScript.groovy b/fit/core-reference/src/test/resources/rest/SearchScript.groovy index c4fe900..118da8a 100644 --- a/fit/core-reference/src/test/resources/rest/SearchScript.groovy +++ b/fit/core-reference/src/test/resources/rest/SearchScript.groovy @@ -53,10 +53,11 @@ def buildConnectorObject(node) { return [ __UID__:node.get("key").textValue(), __NAME__:node.get("key").textValue(), + key:node.get("key").textValue(), username:node.get("username").textValue(), password:node.has("password") && node.get("password").textValue() != null - ? new GuardedString(node.get("password").textValue().toCharArray()) - : null, + ? new GuardedString(node.get("password").textValue().toCharArray()) + : null, firstName:node.get("firstName").textValue(), surname:node.get("surname").textValue(), email:node.get("email").textValue() http://git-wip-us.apache.org/repos/asf/syncope/blob/f533b2f7/fit/core-reference/src/test/resources/rest/SyncScript.groovy ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/resources/rest/SyncScript.groovy b/fit/core-reference/src/test/resources/rest/SyncScript.groovy index a15636c..1676a01 100644 --- a/fit/core-reference/src/test/resources/rest/SyncScript.groovy +++ b/fit/core-reference/src/test/resources/rest/SyncScript.groovy @@ -54,6 +54,7 @@ def buildConnectorObject(node) { return [ __UID__:node.get("key").textValue(), __NAME__:node.get("key").textValue(), + key:node.get("key").textValue(), username:node.get("username").textValue(), password:new GuardedString(node.get("password").textValue().toCharArray()), firstName:node.get("firstName").textValue(),