You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2017/08/01 13:42:23 UTC
[1/2] syncope git commit: [SYNCOPE-1182] Get rid of GetApiOp
Repository: syncope
Updated Branches:
refs/heads/2_0_X 39314d046 -> bf35449ca
refs/heads/master aee4cea0f -> f533b2f73
[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/bf35449c
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/bf35449c
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/bf35449c
Branch: refs/heads/2_0_X
Commit: bf35449ca00082ad5fecad7230c0db39257d922f
Parents: 39314d0
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Tue Aug 1 15:42:04 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Tue Aug 1 15:42:04 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/bf35449c/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/bf35449c/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/bf35449c/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/bf35449c/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/bf35449c/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/bf35449c/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/bf35449c/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/bf35449c/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/bf35449c/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/bf35449c/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/bf35449c/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(),
[2/2] syncope git commit: [SYNCOPE-1182] Get rid of GetApiOp
Posted by il...@apache.org.
[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ò <il...@apache.org>
Authored: Tue Aug 1 15:42:04 2017 +0200
Committer: Francesco Chicchiriccò <il...@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(),