[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(),

Reply via email to