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/03/23 14:00:44 UTC

[syncope] branch 2_1_X updated (b773a07 -> 0a12315)

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

ilgrosso pushed a change to branch 2_1_X
in repository https://gitbox.apache.org/repos/asf/syncope.git.


    from b773a07  Enhance SearchConditionBuilder features
     new c2e661c  [SYNCOPE-1535] Extending to Push
     new 0a12315  [SYNCOPE-1508] PushActions

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../syncope/client/console/wizards/any/Groups.java |  2 +-
 .../console/implementations/MyPullActions.groovy   |  1 +
 .../console/implementations/MyPushActions.groovy   |  7 ++
 .../syncope/core/logic/ReconciliationLogic.java    |  2 +-
 .../apache/syncope/core/logic/ResourceLogic.java   |  2 +-
 .../provisioning/api/pushpull/PushActions.java     | 13 ++++
 .../core/provisioning/java/VirAttrHandlerImpl.java |  2 +
 .../java/pushpull/AbstractPushResultHandler.java   | 10 ++-
 .../java/pushpull/OutboundMatcher.java             | 25 ++++---
 .../java/pushpull/PullJobDelegate.java             |  8 +-
 .../java/pushpull/PushJobDelegate.java             | 85 +++++++++++++---------
 11 files changed, 99 insertions(+), 58 deletions(-)


[syncope] 01/02: [SYNCOPE-1535] Extending to Push

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit c2e661ca8316ac3d68c3be038269a431d0b68df7
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Mon Mar 23 12:03:27 2020 +0100

    [SYNCOPE-1535] Extending to Push
---
 .../java/pushpull/PullJobDelegate.java             |  5 +-
 .../java/pushpull/PushJobDelegate.java             | 85 +++++++++++++---------
 2 files changed, 52 insertions(+), 38 deletions(-)

diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
index 7d47b85..829a6b8 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
@@ -275,6 +275,7 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
             }
         }
 
+        // ...then provisions for any types
         ProvisionSorter provisionSorter = new DefaultProvisionSorter();
         if (pullTask.getResource().getProvisionSorter() != null) {
             try {
@@ -283,8 +284,7 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
                 LOG.error("While building {}", pullTask.getResource().getProvisionSorter(), e);
             }
         }
-        // ...then provisions for any types
-        SyncopePullResultHandler handler;
+
         GroupPullResultHandler ghandler = buildGroupHandler();
         for (Provision provision : pullTask.getResource().getProvisions().stream().
                 filter(provision -> provision.getMapping() != null).sorted(provisionSorter).
@@ -292,6 +292,7 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
 
             status.set("Pulling " + provision.getObjectClass().getObjectClassValue());
 
+            SyncopePullResultHandler handler;
             switch (provision.getAnyType().getKind()) {
                 case USER:
                     handler = buildUserHandler();
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
index 603008f..25f20cd 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
@@ -24,6 +24,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.MutablePair;
 import org.apache.syncope.common.lib.SyncopeConstants;
@@ -47,6 +48,7 @@ import org.apache.syncope.core.persistence.api.entity.task.PushTaskAnyFilter;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.api.search.SearchCondVisitor;
 import org.apache.syncope.core.provisioning.api.Connector;
+import org.apache.syncope.core.provisioning.api.ProvisionSorter;
 import org.apache.syncope.core.provisioning.api.pushpull.AnyObjectPushResultHandler;
 import org.apache.syncope.core.provisioning.api.pushpull.GroupPushResultHandler;
 import org.apache.syncope.core.provisioning.api.pushpull.ProvisioningProfile;
@@ -54,6 +56,7 @@ import org.apache.syncope.core.provisioning.api.pushpull.PushActions;
 import org.apache.syncope.core.provisioning.api.pushpull.RealmPushResultHandler;
 import org.apache.syncope.core.provisioning.api.pushpull.SyncopePushResultHandler;
 import org.apache.syncope.core.provisioning.api.pushpull.UserPushResultHandler;
+import org.apache.syncope.core.provisioning.java.DefaultProvisionSorter;
 import org.apache.syncope.core.spring.ImplementationManager;
 import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -204,49 +207,59 @@ public class PushJobDelegate extends AbstractProvisioningJobDelegate<PushTask> {
         }
 
         // ...then provisions for any types
-        for (Provision provision : pushTask.getResource().getProvisions()) {
-            if (provision.getMapping() != null) {
-                status.set("Pushing " + provision.getAnyType().getKey());
+        ProvisionSorter provisionSorter = new DefaultProvisionSorter();
+        if (pushTask.getResource().getProvisionSorter() != null) {
+            try {
+                provisionSorter = ImplementationManager.build(pushTask.getResource().getProvisionSorter());
+            } catch (Exception e) {
+                LOG.error("While building {}", pushTask.getResource().getProvisionSorter(), e);
+            }
+        }
 
-                AnyDAO<?> anyDAO = anyUtilsFactory.getInstance(provision.getAnyType().getKind()).dao();
+        for (Provision provision : pushTask.getResource().getProvisions().stream().
+                filter(provision -> provision.getMapping() != null).sorted(provisionSorter).
+                collect(Collectors.toList())) {
 
-                SyncopePushResultHandler handler;
-                switch (provision.getAnyType().getKind()) {
-                    case USER:
-                        handler = buildUserHandler();
-                        break;
+            status.set("Pushing " + provision.getAnyType().getKey());
 
-                    case GROUP:
-                        handler = buildGroupHandler();
-                        break;
+            AnyDAO<?> anyDAO = anyUtilsFactory.getInstance(provision.getAnyType().getKind()).dao();
 
-                    case ANY_OBJECT:
-                    default:
-                        handler = buildAnyObjectHandler();
-                }
-                handler.setProfile(profile);
-
-                Optional<? extends PushTaskAnyFilter> anyFilter = pushTask.getFilter(provision.getAnyType());
-                String filter = anyFilter.isPresent()
-                        ? anyFilter.get().getFIQLCond()
-                        : null;
-                SearchCond cond = StringUtils.isBlank(filter)
-                        ? anyDAO.getAllMatchingCond()
-                        : SearchCondConverter.convert(searchCondVisitor, filter);
-                int count = searchDAO.count(
+            SyncopePushResultHandler handler;
+            switch (provision.getAnyType().getKind()) {
+                case USER:
+                    handler = buildUserHandler();
+                    break;
+
+                case GROUP:
+                    handler = buildGroupHandler();
+                    break;
+
+                case ANY_OBJECT:
+                default:
+                    handler = buildAnyObjectHandler();
+            }
+            handler.setProfile(profile);
+
+            Optional<? extends PushTaskAnyFilter> anyFilter = pushTask.getFilter(provision.getAnyType());
+            String filter = anyFilter.isPresent()
+                    ? anyFilter.get().getFIQLCond()
+                    : null;
+            SearchCond cond = StringUtils.isBlank(filter)
+                    ? anyDAO.getAllMatchingCond()
+                    : SearchCondConverter.convert(searchCondVisitor, filter);
+            int count = searchDAO.count(
+                    Collections.singleton(profile.getTask().getSourceRealm().getFullPath()),
+                    cond,
+                    provision.getAnyType().getKind());
+            for (int page = 1; page <= (count / AnyDAO.DEFAULT_PAGE_SIZE) + 1 && !interrupt; page++) {
+                List<? extends Any<?>> anys = searchDAO.search(
                         Collections.singleton(profile.getTask().getSourceRealm().getFullPath()),
                         cond,
+                        page,
+                        AnyDAO.DEFAULT_PAGE_SIZE,
+                        Collections.<OrderByClause>emptyList(),
                         provision.getAnyType().getKind());
-                for (int page = 1; page <= (count / AnyDAO.DEFAULT_PAGE_SIZE) + 1 && !interrupt; page++) {
-                    List<? extends Any<?>> anys = searchDAO.search(
-                            Collections.singleton(profile.getTask().getSourceRealm().getFullPath()),
-                            cond,
-                            page,
-                            AnyDAO.DEFAULT_PAGE_SIZE,
-                            Collections.<OrderByClause>emptyList(),
-                            provision.getAnyType().getKind());
-                    doHandle(anys, handler, pushTask.getResource());
-                }
+                doHandle(anys, handler, pushTask.getResource());
             }
         }
 


[syncope] 02/02: [SYNCOPE-1508] PushActions

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 0a1231562950dd0e11203015ca7614dd0115c694
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Mon Mar 23 13:17:59 2020 +0100

    [SYNCOPE-1508] PushActions
---
 .../syncope/client/console/wizards/any/Groups.java |  2 +-
 .../console/implementations/MyPullActions.groovy   |  1 +
 .../console/implementations/MyPushActions.groovy   |  7 ++++++
 .../syncope/core/logic/ReconciliationLogic.java    |  2 +-
 .../apache/syncope/core/logic/ResourceLogic.java   |  2 +-
 .../provisioning/api/pushpull/PushActions.java     | 13 +++++++++++
 .../core/provisioning/java/VirAttrHandlerImpl.java |  2 ++
 .../java/pushpull/AbstractPushResultHandler.java   | 10 +++++++--
 .../java/pushpull/OutboundMatcher.java             | 25 +++++++++++-----------
 .../java/pushpull/PullJobDelegate.java             |  3 ---
 10 files changed, 47 insertions(+), 20 deletions(-)

diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
index dd94e98..7dd86c4 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
@@ -135,7 +135,7 @@ public class Groups extends AbstractGroups {
                             : groupRestClient.search(
                                     anyTO.getRealm(),
                                     SyncopeClient.getGroupSearchConditionBuilder().
-                                            isAssignable().and().is("name").equalTo(filter).query(),
+                                            isAssignable().and().is("name").equalToIgnoreCase(filter).query(),
                                     1, Constants.MAX_GROUP_LIST_SIZE,
                                     new SortParam<>("name", true),
                                     null)).stream().map(input -> {
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPullActions.groovy b/client/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPullActions.groovy
index b438461..c7aa21e 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPullActions.groovy
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPullActions.groovy
@@ -18,6 +18,7 @@
  */
 import groovy.transform.CompileStatic
 import java.util.Collections
+import java.util.Set
 import org.apache.syncope.common.lib.patch.AnyPatch
 import org.apache.syncope.common.lib.to.EntityTO
 import org.apache.syncope.common.lib.to.ProvisioningReport
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPushActions.groovy b/client/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPushActions.groovy
index 0828f03..07bbffe 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPushActions.groovy
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPushActions.groovy
@@ -18,6 +18,8 @@
  * under the License.
  */
 import groovy.transform.CompileStatic
+import java.util.Collections
+import java.util.Set
 import org.apache.syncope.core.persistence.api.entity.Entity
 import org.apache.syncope.core.provisioning.api.pushpull.ProvisioningProfile
 import org.apache.syncope.core.provisioning.api.pushpull.ProvisioningReport
@@ -27,6 +29,11 @@ import org.quartz.JobExecutionException
 @CompileStatic
 class MyPushActions implements PushActions {
   
+  @Override
+  Set<String> moreAttrsToGet(ProvisioningProfile profile, Entity entity) {
+    return Collections.emptySet();
+  }
+
   @Override 
   Entity beforeAssign(
     ProvisioningProfile profile,
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java
index cd060a6..5658302 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java
@@ -256,7 +256,7 @@ public class ReconciliationLogic extends AbstractTransactionalLogic<EntityTO> {
             status.setOnSyncope(getOnSyncope(any, connObjectKeyItem, provision));
 
             List<ConnectorObject> connObjs = outboundMatcher.match(
-                    connFactory.getConnector(provision.getResource()), any, provision);
+                    connFactory.getConnector(provision.getResource()), any, provision, Optional.empty());
             if (!connObjs.isEmpty()) {
                 status.setOnResource(ConnObjectUtils.getConnObjectTO(connObjs.get(0).getAttributes()));
 
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 ba0946c..7fc2f08 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
@@ -322,7 +322,7 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
 
         // 2. find on resource
         List<ConnectorObject> connObjs = outboundMatcher.match(
-                connFactory.getConnector(provision.getResource()), any, provision);
+                connFactory.getConnector(provision.getResource()), any, provision, Optional.empty());
         if (connObjs.isEmpty()) {
             throw new NotFoundException(
                     "Object " + any + " with class " + provision.getObjectClass()
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/PushActions.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/PushActions.java
index 642d591..aed56ef 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/PushActions.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/PushActions.java
@@ -18,6 +18,8 @@
  */
 package org.apache.syncope.core.provisioning.api.pushpull;
 
+import java.util.Collections;
+import java.util.Set;
 import org.apache.syncope.common.lib.to.ProvisioningReport;
 import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.quartz.JobExecutionException;
@@ -29,6 +31,17 @@ import org.quartz.JobExecutionException;
 public interface PushActions extends ProvisioningActions {
 
     /**
+     * Return additional attributes to include in the result from the underlying connector.
+     *
+     * @param profile profile of the pull being executed.
+     * @param entity entity
+     * @return additional attributes to include in the result from the underlying connector
+     */
+    default Set<String> moreAttrsToGet(ProvisioningProfile<?, ?> profile, Entity entity) {
+        return Collections.emptySet();
+    }
+
+    /**
      * Action to be executed before to assign (link &amp; provision) a pushed entity to the resource.
      *
      * @param profile profile of the push being executed.
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 cc15730..1ba471e 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
@@ -23,6 +23,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Stream;
 import org.apache.syncope.core.persistence.api.dao.AllowedSchemas;
@@ -122,6 +123,7 @@ public class VirAttrHandlerImpl implements VirAttrHandler {
                     connFactory.getConnector(provision.getResource()),
                     any,
                     provision,
+                    Optional.empty(),
                     schemasToRead.stream().map(VirSchema::asLinkingMappingItem).toArray(LinkingMappingItem[]::new)).
                     forEach(connObj -> schemasToRead.forEach(schema -> {
 
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 de3e6a6..5e39b28 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
@@ -20,9 +20,11 @@ package org.apache.syncope.core.provisioning.java.pushpull;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.exception.ExceptionUtils;
@@ -255,7 +257,10 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
                 any.getType().getKind(), any.getKey(), profile.getTask().getResource());
 
         // Try to read remote object BEFORE any actual operation
-        List<ConnectorObject> connObjs = outboundMatcher.match(profile.getConnector(), any, provision);
+        Set<String> moreAttrsToGet = new HashSet<>();
+        profile.getActions().forEach(action -> moreAttrsToGet.addAll(action.moreAttrsToGet(profile, provision)));
+        List<ConnectorObject> connObjs = outboundMatcher.match(
+                profile.getConnector(), any, provision, Optional.of(moreAttrsToGet.toArray(new String[0])));
         LOG.debug("Match(es) found for {} as {}: {}", any, provision.getObjectClass(), connObjs);
 
         if (connObjs.size() > 1) {
@@ -448,7 +453,8 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
 
                 if (notificationsAvailable || auditRequested) {
                     resultStatus = AuditElements.Result.SUCCESS;
-                    output = outboundMatcher.match(profile.getConnector(), any, provision);
+                    output = outboundMatcher.match(
+                            profile.getConnector(), any, provision, Optional.of(moreAttrsToGet.toArray(new String[0])));
                 }
             } catch (IgnoreProvisionException e) {
                 throw e;
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 41637c6..efdca3a 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
@@ -120,16 +120,16 @@ public class OutboundMatcher {
                         connector,
                         rule.get().getFilter(any, provision),
                         provision,
-                        Optional.empty(),
-                        Optional.of(moreAttrsToGet.toArray(new String[0]))));
+                        Optional.of(moreAttrsToGet.toArray(new String[0])),
+                        Optional.empty()));
             } else {
                 MappingUtils.getConnObjectKeyItem(provision).ifPresent(connObjectKeyItem -> matchByConnObjectKeyValue(
                         connector,
                         connObjectKeyItem,
                         connObjectKeyValue,
                         provision,
-                        Optional.empty(),
-                        Optional.of(moreAttrsToGet.toArray(new String[0]))).
+                        Optional.of(moreAttrsToGet.toArray(new String[0])),
+                        Optional.empty()).
                         ifPresent(result::add));
             }
         } catch (RuntimeException e) {
@@ -148,6 +148,7 @@ public class OutboundMatcher {
             final Connector connector,
             final Any<?> any,
             final Provision provision,
+            final Optional<String[]> moreAttrsToGet,
             final LinkingMappingItem... linkingItems) {
 
         Optional<PushCorrelationRule> rule = rule(provision);
@@ -159,9 +160,9 @@ public class OutboundMatcher {
                         connector,
                         rule.get().getFilter(any, provision),
                         provision,
+                        moreAttrsToGet,
                         ArrayUtils.isEmpty(linkingItems)
-                        ? Optional.empty() : Optional.of(Arrays.asList(linkingItems)),
-                        Optional.empty()));
+                        ? Optional.empty() : Optional.of(Arrays.asList(linkingItems))));
             } else {
                 Optional<? extends MappingItem> connObjectKeyItem = MappingUtils.getConnObjectKeyItem(provision);
                 Optional<String> connObjectKeyValue = mappingManager.getConnObjectKeyValue(any, provision);
@@ -172,9 +173,9 @@ public class OutboundMatcher {
                             connObjectKeyItem.get(),
                             connObjectKeyValue.get(),
                             provision,
+                            moreAttrsToGet,
                             ArrayUtils.isEmpty(linkingItems)
-                            ? Optional.empty() : Optional.of(Arrays.asList(linkingItems)),
-                            Optional.empty()).
+                            ? Optional.empty() : Optional.of(Arrays.asList(linkingItems))).
                             ifPresent(result::add);
                 }
             }
@@ -193,8 +194,8 @@ public class OutboundMatcher {
             final Connector connector,
             final Filter filter,
             final Provision provision,
-            final Optional<Collection<LinkingMappingItem>> linkingItems,
-            final Optional<String[]> moreAttrsToGet) {
+            final Optional<String[]> moreAttrsToGet,
+            final Optional<Collection<LinkingMappingItem>> linkingItems) {
 
         Stream<MappingItem> items = Stream.concat(
                 provision.getMapping().getItems().stream(),
@@ -233,8 +234,8 @@ public class OutboundMatcher {
             final MappingItem connObjectKeyItem,
             final String connObjectKeyValue,
             final Provision provision,
-            final Optional<Collection<LinkingMappingItem>> linkingItems,
-            final Optional<String[]> moreAttrsToGet) {
+            final Optional<String[]> moreAttrsToGet,
+            final Optional<Collection<LinkingMappingItem>> linkingItems) {
 
         Stream<MappingItem> items = Stream.concat(
                 provision.getMapping().getItems().stream(),
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
index 829a6b8..9e7ff24 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
@@ -227,7 +227,6 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
 
             Set<String> moreAttrsToGet = new HashSet<>();
             actions.forEach(action -> moreAttrsToGet.addAll(action.moreAttrsToGet(profile, orgUnit)));
-
             OperationOptions options = MappingUtils.buildOperationOptions(
                     MappingUtils.getPullItems(orgUnit.getItems().stream()), moreAttrsToGet.toArray(new String[0]));
 
@@ -312,11 +311,9 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
             try {
                 Set<String> moreAttrsToGet = new HashSet<>();
                 actions.forEach(action -> moreAttrsToGet.addAll(action.moreAttrsToGet(profile, provision)));
-
                 Stream<? extends Item> mapItems = Stream.concat(
                         MappingUtils.getPullItems(provision.getMapping().getItems().stream()),
                         virSchemaDAO.findByProvision(provision).stream().map(VirSchema::asLinkingMappingItem));
-
                 OperationOptions options = MappingUtils.buildOperationOptions(
                         mapItems, moreAttrsToGet.toArray(new String[0]));