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 2020/04/17 16:11:23 UTC

[syncope] 02/02: [SYNCOPE-1508] Ensuring PropagationActions#moreAttrsToGet is invoked during Push

This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git

commit 1d4d8c697711fa03c1f9f9f3021346a20f4bb2f5
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Fri Apr 17 17:58:17 2020 +0200

    [SYNCOPE-1508] Ensuring PropagationActions#moreAttrsToGet is invoked during Push
---
 .../implementations/MyPropagationActions.groovy      |  5 +++--
 .../api/propagation/PropagationActions.java          |  5 +++--
 .../propagation/AbstractPropagationTaskExecutor.java |  4 ++--
 .../java/pushpull/AbstractPushResultHandler.java     |  2 +-
 .../java/pushpull/DefaultUserPushResultHandler.java  |  4 ++--
 .../provisioning/java/pushpull/OutboundMatcher.java  | 20 +++++++++++++++++---
 6 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPropagationActions.groovy b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPropagationActions.groovy
index f0156eb..4ac88eb 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPropagationActions.groovy
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPropagationActions.groovy
@@ -18,6 +18,7 @@
  * under the License.
  */
 import groovy.transform.CompileStatic
+import java.util.Optional
 import java.util.Set
 import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit
 import org.apache.syncope.core.persistence.api.entity.resource.Provision
@@ -30,12 +31,12 @@ import org.identityconnectors.framework.common.objects.ConnectorObject
 class MyPropagationActions implements PropagationActions {
   
   @Override
-  Set<String> moreAttrsToGet(PropagationTask task, OrgUnit orgUnit) {
+  Set<String> moreAttrsToGet(Optional<PropagationTask> task, OrgUnit orgUnit) {
     return Set.of();
   }
 
   @Override
-  Set<String> moreAttrsToGet(PropagationTask task, Provision provision) {
+  Set<String> moreAttrsToGet(Optional<PropagationTask> task, Provision provision) {
     return Set.of();
   }
 
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationActions.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationActions.java
index 9f4c40f..a7bd704 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationActions.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationActions.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.provisioning.api.propagation;
 
+import java.util.Optional;
 import java.util.Set;
 import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
@@ -34,7 +35,7 @@ public interface PropagationActions {
      * @param orgUnit Realm provisioning information
      * @return additional attributes to include in the result from the underlying connector
      */
-    default Set<String> moreAttrsToGet(PropagationTask task, OrgUnit orgUnit) {
+    default Set<String> moreAttrsToGet(Optional<PropagationTask> task, OrgUnit orgUnit) {
         return Set.of();
     }
 
@@ -45,7 +46,7 @@ public interface PropagationActions {
      * @param provision Any provisioning information
      * @return additional attributes to include in the result from the underlying connector
      */
-    default Set<String> moreAttrsToGet(PropagationTask task, Provision provision) {
+    default Set<String> moreAttrsToGet(Optional<PropagationTask> task, Provision provision) {
         return Set.of();
     }
 
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 71c639f..0aabd5f 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
@@ -399,7 +399,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
             provision = task.getResource().getProvision(new ObjectClass(task.getObjectClassName())).orElse(null);
             orgUnit = task.getResource().getOrgUnit();
 
-            if (taskInfo.getBeforeObj() == null) {
+            if (taskInfo.getBeforeObj() == null || !taskInfo.getBeforeObj().isPresent()) {
                 // Try to read remote object BEFORE any actual operation
                 beforeObj = provision == null && orgUnit == null
                         ? null
@@ -693,7 +693,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
                 : task.getOldConnObjectKey();
 
         Set<String> moreAttrsToGet = new HashSet<>();
-        actions.forEach(action -> moreAttrsToGet.addAll(action.moreAttrsToGet(task, orgUnit)));
+        actions.forEach(action -> moreAttrsToGet.addAll(action.moreAttrsToGet(Optional.of(task), orgUnit)));
 
         ConnectorObject obj = null;
         Optional<? extends OrgUnitItem> connObjectKeyItem = orgUnit.getConnObjectKeyItem();
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 a0105be..3c0e13b 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
@@ -165,7 +165,7 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
                 before.getVirAttrs(),
                 noPropResources);
         if (!taskInfos.isEmpty()) {
-            taskInfos.get(0).setBeforeObj(Optional.ofNullable(null));
+            taskInfos.get(0).setBeforeObj(Optional.empty());
             PropagationReporter reporter = new DefaultPropagationReporter();
             taskExecutor.execute(taskInfos.get(0), reporter, adminUser);
             reportPropagation(result, reporter);
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultUserPushResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultUserPushResultHandler.java
index 3de89eb..0479822 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultUserPushResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultUserPushResultHandler.java
@@ -372,7 +372,7 @@ public class DefaultUserPushResultHandler extends AbstractPushResultHandler impl
                 null,
                 null);
         if (!taskInfos.isEmpty()) {
-            taskInfos.get(0).setBeforeObj(Optional.ofNullable(null));
+            taskInfos.get(0).setBeforeObj(Optional.empty());
             PropagationReporter reporter = new DefaultPropagationReporter();
             taskExecutor.execute(taskInfos.get(0), reporter, adminUser);
             reportPropagation(result, reporter);
@@ -399,7 +399,7 @@ public class DefaultUserPushResultHandler extends AbstractPushResultHandler impl
                         propByLinkedAccount,
                         ""));
         if (!taskInfos.isEmpty()) {
-            taskInfos.get(0).setBeforeObj(Optional.ofNullable(null));
+            taskInfos.get(0).setBeforeObj(Optional.empty());
             PropagationReporter reporter = new DefaultPropagationReporter();
             taskExecutor.execute(taskInfos.get(0), reporter, adminUser);
             reportPropagation(result, reporter);
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/OutboundMatcher.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/OutboundMatcher.java
index f899bcd..4536fca 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/OutboundMatcher.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/OutboundMatcher.java
@@ -110,7 +110,7 @@ public class OutboundMatcher {
         }
 
         Set<String> moreAttrsToGet = new HashSet<>();
-        actions.forEach(action -> moreAttrsToGet.addAll(action.moreAttrsToGet(task, provision)));
+        actions.forEach(action -> moreAttrsToGet.addAll(action.moreAttrsToGet(Optional.of(task), provision)));
 
         List<ConnectorObject> result = new ArrayList<>();
         try {
@@ -150,6 +150,20 @@ public class OutboundMatcher {
             final Optional<String[]> moreAttrsToGet,
             final LinkingMappingItem... linkingItems) {
 
+        Set<String> matgFromPropagationActions = new HashSet<>();
+        provision.getResource().getPropagationActions().forEach(impl -> {
+            try {
+                matgFromPropagationActions.addAll(
+                        ImplementationManager.<PropagationActions>build(impl).
+                                moreAttrsToGet(Optional.empty(), provision));
+            } catch (Exception e) {
+                LOG.error("While building {}", impl, e);
+            }
+        });
+        Optional<String[]> effectiveMATG = Optional.of(Stream.concat(
+                moreAttrsToGet.map(Stream::of).orElse(Stream.empty()),
+                matgFromPropagationActions.stream()).toArray(String[]::new));
+
         Optional<PushCorrelationRule> rule = rule(provision);
 
         List<ConnectorObject> result = new ArrayList<>();
@@ -159,7 +173,7 @@ public class OutboundMatcher {
                         connector,
                         rule.get().getFilter(any, provision),
                         provision,
-                        moreAttrsToGet,
+                        effectiveMATG,
                         ArrayUtils.isEmpty(linkingItems)
                         ? Optional.empty() : Optional.of(List.of(linkingItems))));
             } else {
@@ -172,7 +186,7 @@ public class OutboundMatcher {
                             connObjectKeyItem.get(),
                             connObjectKeyValue.get(),
                             provision,
-                            moreAttrsToGet,
+                            effectiveMATG,
                             ArrayUtils.isEmpty(linkingItems)
                             ? Optional.empty() : Optional.of(List.of(linkingItems))).
                             ifPresent(result::add);