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 2019/10/24 09:45:56 UTC

[syncope] 02/02: [SYNCOPE-957] Reverting changes to Actions classes, as transactional support for Functions is troublesome

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 1a99144a90a7d11ff520cf7f9ee1004feda976f4
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Thu Oct 24 10:34:57 2019 +0200

    [SYNCOPE-957] Reverting changes to Actions classes, as transactional support for Functions is troublesome
---
 .../console/implementations/MyLogicActions.groovy  | 53 +++++-------------
 .../console/implementations/MyPullActions.groovy   | 11 ++--
 .../console/implementations/MyPushActions.groovy   |  2 +-
 .../syncope/core/logic/AbstractAnyLogic.java       | 44 +++++++--------
 .../core/provisioning/api/LogicActions.java        | 25 +++++----
 .../provisioning/api/pushpull/PullActions.java     |  8 +--
 .../java/pushpull/AbstractPullResultHandler.java   |  9 ++--
 .../pushpull/DefaultRealmPullResultHandler.java    |  9 ++--
 .../syncope/core/logic/oidc/OIDCUserManager.java   | 29 +++++-----
 .../core/provisioning/api/OIDCProviderActions.java | 17 +++---
 .../syncope/core/logic/saml2/SAML2UserManager.java | 29 +++++-----
 .../core/provisioning/api/SAML2IdPActions.java     | 17 +++---
 .../test/resources/DoubleValueLogicActions.groovy  | 63 ++++++++++------------
 13 files changed, 126 insertions(+), 190 deletions(-)

diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyLogicActions.groovy b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyLogicActions.groovy
index 8cef253..abdb3a4 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyLogicActions.groovy
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyLogicActions.groovy
@@ -17,68 +17,41 @@
  * under the License.
  */
 import groovy.transform.CompileStatic
-import java.util.List
-import java.util.function.Function
 import org.apache.syncope.common.lib.request.AnyCR;
 import org.apache.syncope.common.lib.request.AnyUR;
-import org.apache.syncope.common.lib.to.AnyTO
-import org.apache.syncope.common.lib.to.PropagationStatus
+import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.core.provisioning.api.LogicActions
 
 @CompileStatic
 class MyLogicActions implements LogicActions {
   
   @Override
-  <C extends AnyCR> Function<C, C> beforeCreate() {
-    Function function = { 
-      C input ->
-      return input;        
-    }
-    return function;
+  <C extends AnyCR> C beforeCreate(C input) {
+    return input;
   }
 
   @Override
-  <A extends AnyTO> Function<A, A> afterCreate(List<PropagationStatus> statuses) {
-    Function function = { 
-      A input ->
-      return input;        
-    }
-    return function;
+  <A extends AnyTO> A afterCreate(A input) {
+    return input;
   }
 
   @Override
-  <U extends AnyUR> Function<U, U> beforeUpdate() {
-    Function function = { 
-      U input ->
-      return input;        
-    }
-    return function;
+  <U extends AnyUR> U beforeUpdate(U input) {
+    return input;
   }
 
   @Override
-  <A extends AnyTO> Function<A, A> afterUpdate(List<PropagationStatus> statuses) {
-    Function function = { 
-      A input ->
-      return input;        
-    }
-    return function;
+  <A extends AnyTO> A afterUpdate(A input) {
+    return input;
   }
 
   @Override
-  <A extends AnyTO> Function<A, A> beforeDelete() {
-    Function function = { 
-      A input ->
-      return input;        
-    }
-    return function;
+  <A extends AnyTO> A beforeDelete(A input) {
+    return input;
   }
 
   @Override
-  <A extends AnyTO> Function<A, A> afterDelete(List<PropagationStatus> statuses) {
-    Function function = { 
-      A input ->
-      return input;        
-    }
-    return function;
+  <A extends AnyTO> A afterDelete(A input) {
+    return input;
   }
 }
\ No newline at end of file
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPullActions.groovy b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPullActions.groovy
index 7a8b765..ce039eb 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPullActions.groovy
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPullActions.groovy
@@ -29,18 +29,13 @@ import org.apache.syncope.core.provisioning.api.pushpull.ProvisioningReport
 import org.apache.syncope.core.provisioning.api.pushpull.PullActions
 import org.identityconnectors.framework.common.objects.SyncDelta
 import org.quartz.JobExecutionException
-import java.util.function.Function
 
 @CompileStatic
 class MyPullActions implements PullActions {
   
   @Override
-  Function<SyncDelta, SyncDelta> preprocess(ProvisioningProfile<?, ?> profile) {
-    Function function = { 
-      SyncDelta delta ->
-      return delta;        
-    }
-    return function;
+  SyncDelta preprocess(ProvisioningProfile profile, SyncDelta delta) {
+    return delta;
   }
   
   @Override
@@ -142,4 +137,4 @@ class MyPullActions implements PullActions {
 
     return null;
   }
-}
+}
\ No newline at end of file
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPushActions.groovy b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPushActions.groovy
index dad4206..0828f03 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPushActions.groovy
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPushActions.groovy
@@ -109,4 +109,4 @@ class MyPushActions implements PushActions {
 
     // do nothing
   }
-}
+}
\ No newline at end of file
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java
index 365801d..3b045ff 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java
@@ -22,7 +22,6 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.function.Function;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.request.AnyCR;
@@ -114,11 +113,9 @@ public abstract class AbstractAnyLogic<TO extends AnyTO, C extends AnyCR, U exte
         templateUtils.apply(anyCR, realm.getTemplate(anyType));
 
         List<LogicActions> actions = getActions(realm);
-
-        anyCR = (C) actions.stream().
-                map(action -> action.beforeCreate()).
-                reduce(Function.identity(), Function::andThen).
-                apply(anyCR);
+        for (LogicActions action : actions) {
+            anyCR = action.beforeCreate(anyCR);
+        }
 
         LOG.debug("Input: {}\nOutput: {}\n", input, anyCR);
 
@@ -137,10 +134,9 @@ public abstract class AbstractAnyLogic<TO extends AnyTO, C extends AnyCR, U exte
         U update = input;
 
         List<LogicActions> actions = getActions(realm);
-        update = (U) actions.stream().
-                map(action -> action.beforeUpdate()).
-                reduce(Function.identity(), Function::andThen).
-                apply(update);
+        for (LogicActions action : actions) {
+            update = action.beforeUpdate(update);
+        }
 
         LOG.debug("Input: {}\nOutput: {}\n", input, update);
 
@@ -159,10 +155,9 @@ public abstract class AbstractAnyLogic<TO extends AnyTO, C extends AnyCR, U exte
         TO any = input;
 
         List<LogicActions> actions = getActions(realm);
-        any = (TO) actions.stream().
-                map(action -> action.beforeDelete()).
-                reduce(Function.identity(), Function::andThen).
-                apply(any);
+        for (LogicActions action : actions) {
+            any = action.beforeDelete(any);
+        }
 
         LOG.debug("Input: {}\nOutput: {}\n", input, any);
 
@@ -175,10 +170,9 @@ public abstract class AbstractAnyLogic<TO extends AnyTO, C extends AnyCR, U exte
 
         TO any = input;
 
-        any = (TO) actions.stream().
-                map(action -> action.afterCreate(statuses)).
-                reduce(Function.identity(), Function::andThen).
-                apply(any);
+        for (LogicActions action : actions) {
+            any = action.afterCreate(any, statuses);
+        }
 
         ProvisioningResult<TO> result = new ProvisioningResult<>();
         result.setEntity(any);
@@ -207,10 +201,9 @@ public abstract class AbstractAnyLogic<TO extends AnyTO, C extends AnyCR, U exte
 
         TO any = input;
 
-        any = (TO) actions.stream().
-                map(action -> action.afterUpdate(statuses)).
-                reduce(Function.identity(), Function::andThen).
-                apply(any);
+        for (LogicActions action : actions) {
+            any = action.afterUpdate(any, statuses);
+        }
 
         ProvisioningResult<TO> result = new ProvisioningResult<>();
         result.setEntity(any);
@@ -225,10 +218,9 @@ public abstract class AbstractAnyLogic<TO extends AnyTO, C extends AnyCR, U exte
 
         TO any = input;
 
-        any = (TO) actions.stream().
-                map(action -> action.afterDelete(statuses)).
-                reduce(Function.identity(), Function::andThen).
-                apply(any);
+        for (LogicActions action : actions) {
+            any = action.afterDelete(any, statuses);
+        }
 
         ProvisioningResult<TO> result = new ProvisioningResult<>();
         result.setEntity(any);
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/LogicActions.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/LogicActions.java
index e2a2f65..5c5b766 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/LogicActions.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/LogicActions.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.core.provisioning.api;
 
 import java.util.List;
-import java.util.function.Function;
 import org.apache.syncope.common.lib.request.AnyCR;
 import org.apache.syncope.common.lib.request.AnyUR;
 import org.apache.syncope.common.lib.to.AnyTO;
@@ -30,27 +29,27 @@ import org.apache.syncope.common.lib.to.PropagationStatus;
  */
 public interface LogicActions {
 
-    default <C extends AnyCR> Function<C, C> beforeCreate() {
-        return Function.identity();
+    default <C extends AnyCR> C beforeCreate(C input) {
+        return input;
     }
 
-    default <A extends AnyTO> Function<A, A> afterCreate(List<PropagationStatus> statuses) {
-        return Function.identity();
+    default <A extends AnyTO> A afterCreate(A input, List<PropagationStatus> statuses) {
+        return input;
     }
 
-    default <U extends AnyUR> Function<U, U> beforeUpdate() {
-        return Function.identity();
+    default <U extends AnyUR> U beforeUpdate(U input) {
+        return input;
     }
 
-    default <A extends AnyTO> Function<A, A> afterUpdate(List<PropagationStatus> statuses) {
-        return Function.identity();
+    default <A extends AnyTO> A afterUpdate(A input, List<PropagationStatus> statuses) {
+        return input;
     }
 
-    default <A extends AnyTO> Function<A, A> beforeDelete() {
-        return Function.identity();
+    default <A extends AnyTO> A beforeDelete(A input) {
+        return input;
     }
 
-    default <A extends AnyTO> Function<A, A> afterDelete(List<PropagationStatus> statuses) {
-        return Function.identity();
+    default <A extends AnyTO> A afterDelete(A input, List<PropagationStatus> statuses) {
+        return input;
     }
 }
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/PullActions.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/PullActions.java
index 03690bd..a9e93ca 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/PullActions.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/PullActions.java
@@ -20,7 +20,6 @@ package org.apache.syncope.core.provisioning.api.pushpull;
 
 import org.apache.syncope.common.lib.request.AnyCR;
 import org.apache.syncope.common.lib.request.AnyUR;
-import java.util.function.Function;
 import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.LinkedAccountTO;
 import org.apache.syncope.common.lib.to.RealmTO;
@@ -38,10 +37,11 @@ public interface PullActions extends ProvisioningActions {
      * Pre-process the pull information received by the underlying connector, before any internal activity occurs.
      *
      * @param profile profile of the pull being executed.
-     * @return pull information, possibly altered
+     * @param delta retrieved pull information
+     * @return pull information, possibly altered.
      */
-    default Function<SyncDelta, SyncDelta> preprocess(ProvisioningProfile<?, ?> profile) {
-        return Function.identity();
+    default SyncDelta preprocess(ProvisioningProfile<?, ?> profile, SyncDelta delta) {
+        return delta;
     }
 
     /**
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
index 7afe3a5..15ec686 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
@@ -22,7 +22,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.syncope.common.lib.AnyOperations;
@@ -848,10 +847,10 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
         LOG.debug("Process {} for {} as {}",
                 delta.getDeltaType(), delta.getUid().getUidValue(), delta.getObject().getObjectClass());
 
-        SyncDelta finalDelta = profile.getActions().stream().
-                map(action -> action.preprocess(profile)).
-                reduce(Function.identity(), Function::andThen).
-                apply(delta);
+        SyncDelta finalDelta = delta;
+        for (PullActions action : profile.getActions()) {
+            finalDelta = action.preprocess(profile, finalDelta);
+        }
 
         LOG.debug("Transformed {} for {} as {}",
                 finalDelta.getDeltaType(), finalDelta.getUid().getUidValue(), finalDelta.getObject().getObjectClass());
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java
index 6cdf297..1c5250d 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultRealmPullResultHandler.java
@@ -21,7 +21,6 @@ package org.apache.syncope.core.provisioning.java.pushpull;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
-import java.util.function.Function;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
@@ -630,10 +629,10 @@ public class DefaultRealmPullResultHandler
         LOG.debug("Process {} for {} as {}",
                 delta.getDeltaType(), delta.getUid().getUidValue(), delta.getObject().getObjectClass());
 
-        SyncDelta finalDelta = profile.getActions().stream().
-                map(action -> action.preprocess(profile)).
-                reduce(Function.identity(), Function::andThen).
-                apply(delta);
+        SyncDelta finalDelta = delta;
+        for (PullActions action : profile.getActions()) {
+            finalDelta = action.preprocess(profile, finalDelta);
+        }
 
         LOG.debug("Transformed {} for {} as {}",
                 finalDelta.getDeltaType(), finalDelta.getUid().getUidValue(), finalDelta.getObject().getObjectClass());
diff --git a/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/oidc/OIDCUserManager.java b/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/oidc/OIDCUserManager.java
index ae03541..dd9c0f0 100644
--- a/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/oidc/OIDCUserManager.java
+++ b/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/oidc/OIDCUserManager.java
@@ -23,7 +23,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.tuple.Pair;
@@ -242,10 +241,9 @@ public class OIDCUserManager {
         }
 
         List<OIDCProviderActions> actions = getActions(op);
-        userCR = actions.stream().
-                map(action -> action.beforeCreate(responseTO)).
-                reduce(Function.identity(), Function::andThen).
-                apply(userCR);
+        for (OIDCProviderActions action : actions) {
+            userCR = action.beforeCreate(userCR, responseTO);
+        }
 
         UserTO userTO = new UserTO();
         fill(op, responseTO, userTO);
@@ -261,10 +259,9 @@ public class OIDCUserManager {
         Pair<String, List<PropagationStatus>> created = provisioningManager.create(userCR, false);
         userTO = binder.getUserTO(created.getKey());
 
-        userTO = actions.stream().
-                map(action -> action.afterCreate(responseTO)).
-                reduce(Function.identity(), Function::andThen).
-                apply(userTO);
+        for (OIDCProviderActions action : actions) {
+            userTO = action.afterCreate(userTO, responseTO);
+        }
 
         return userTO.getUsername();
     }
@@ -279,18 +276,16 @@ public class OIDCUserManager {
         UserUR userUR = AnyOperations.diff(userTO, original, true);
 
         List<OIDCProviderActions> actions = getActions(op);
-        userUR = actions.stream().
-                map(action -> action.beforeUpdate(responseTO)).
-                reduce(Function.identity(), Function::andThen).
-                apply(userUR);
+        for (OIDCProviderActions action : actions) {
+            userUR = action.beforeUpdate(userUR, responseTO);
+        }
 
         Pair<UserUR, List<PropagationStatus>> updated = provisioningManager.update(userUR, false);
         userTO = binder.getUserTO(updated.getLeft().getKey());
 
-        userTO = actions.stream().
-                map(action -> action.afterUpdate(responseTO)).
-                reduce(Function.identity(), Function::andThen).
-                apply(userTO);
+        for (OIDCProviderActions action : actions) {
+            userTO = action.afterUpdate(userTO, responseTO);
+        }
 
         return userTO.getUsername();
     }
diff --git a/ext/oidcclient/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/OIDCProviderActions.java b/ext/oidcclient/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/OIDCProviderActions.java
index 4828fbb..6a08e70 100644
--- a/ext/oidcclient/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/OIDCProviderActions.java
+++ b/ext/oidcclient/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/OIDCProviderActions.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.core.provisioning.api;
 
-import java.util.function.Function;
 import org.apache.syncope.common.lib.request.UserCR;
 import org.apache.syncope.common.lib.request.UserUR;
 import org.apache.syncope.common.lib.to.OIDCLoginResponseTO;
@@ -26,19 +25,19 @@ import org.apache.syncope.common.lib.to.UserTO;
 
 public interface OIDCProviderActions {
 
-    default Function<UserCR, UserCR> beforeCreate(OIDCLoginResponseTO loginResponse) {
-        return Function.identity();
+    default UserCR beforeCreate(UserCR input, OIDCLoginResponseTO loginResponse) {
+        return input;
     }
 
-    default Function<UserTO, UserTO> afterCreate(OIDCLoginResponseTO loginResponse) {
-        return Function.identity();
+    default UserTO afterCreate(UserTO input, OIDCLoginResponseTO loginResponse) {
+        return input;
     }
 
-    default Function<UserUR, UserUR> beforeUpdate(OIDCLoginResponseTO loginResponse) {
-        return Function.identity();
+    default UserUR beforeUpdate(UserUR input, OIDCLoginResponseTO loginResponse) {
+        return input;
     }
 
-    default Function<UserTO, UserTO> afterUpdate(OIDCLoginResponseTO loginResponse) {
-        return Function.identity();
+    default UserTO afterUpdate(UserTO input, OIDCLoginResponseTO loginResponse) {
+        return input;
     }
 }
diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java
index 0dea98c..0a6b857 100644
--- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java
+++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java
@@ -23,7 +23,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.tuple.Pair;
@@ -260,10 +259,9 @@ public class SAML2UserManager {
         }
 
         List<SAML2IdPActions> actions = getActions(idp);
-        userCR = actions.stream().
-                map(action -> action.beforeCreate(responseTO)).
-                reduce(Function.identity(), Function::andThen).
-                apply(userCR);
+        for (SAML2IdPActions action : actions) {
+            userCR = action.beforeCreate(userCR, responseTO);
+        }
 
         UserTO userTO = new UserTO();
         fill(idp.getKey(), responseTO, userTO);
@@ -279,10 +277,9 @@ public class SAML2UserManager {
         Pair<String, List<PropagationStatus>> created = provisioningManager.create(userCR, false);
         userTO = binder.getUserTO(created.getKey());
 
-        userTO = actions.stream().
-                map(action -> action.afterCreate(responseTO)).
-                reduce(Function.identity(), Function::andThen).
-                apply(userTO);
+        for (SAML2IdPActions action : actions) {
+            userTO = action.afterCreate(userTO, responseTO);
+        }
 
         return userTO.getUsername();
     }
@@ -297,18 +294,16 @@ public class SAML2UserManager {
         UserUR userUR = AnyOperations.diff(userTO, original, true);
 
         List<SAML2IdPActions> actions = getActions(idp);
-        userUR = actions.stream().
-                map(action -> action.beforeUpdate(responseTO)).
-                reduce(Function.identity(), Function::andThen).
-                apply(userUR);
+        for (SAML2IdPActions action : actions) {
+            userUR = action.beforeUpdate(userUR, responseTO);
+        }
 
         Pair<UserUR, List<PropagationStatus>> updated = provisioningManager.update(userUR, false);
         userTO = binder.getUserTO(updated.getLeft().getKey());
 
-        userTO = actions.stream().
-                map(action -> action.afterUpdate(responseTO)).
-                reduce(Function.identity(), Function::andThen).
-                apply(userTO);
+        for (SAML2IdPActions action : actions) {
+            userTO = action.afterUpdate(userTO, responseTO);
+        }
 
         return userTO.getUsername();
     }
diff --git a/ext/saml2sp/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/SAML2IdPActions.java b/ext/saml2sp/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/SAML2IdPActions.java
index 9948e63..dddc6dc 100644
--- a/ext/saml2sp/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/SAML2IdPActions.java
+++ b/ext/saml2sp/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/SAML2IdPActions.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.core.provisioning.api;
 
-import java.util.function.Function;
 import org.apache.syncope.common.lib.request.UserCR;
 import org.apache.syncope.common.lib.request.UserUR;
 import org.apache.syncope.common.lib.to.SAML2LoginResponseTO;
@@ -26,19 +25,19 @@ import org.apache.syncope.common.lib.to.UserTO;
 
 public interface SAML2IdPActions {
 
-    default Function<UserCR, UserCR> beforeCreate(SAML2LoginResponseTO loginResponse) {
-        return Function.identity();
+    default UserCR beforeCreate(UserCR input, SAML2LoginResponseTO loginResponse) {
+        return input;
     }
 
-    default Function<UserTO, UserTO> afterCreate(SAML2LoginResponseTO loginResponse) {
-        return Function.identity();
+    default UserTO afterCreate(UserTO input, SAML2LoginResponseTO loginResponse) {
+        return input;
     }
 
-    default Function<UserUR, UserUR> beforeUpdate(SAML2LoginResponseTO loginResponse) {
-        return Function.identity();
+    default UserUR beforeUpdate(UserUR input, SAML2LoginResponseTO loginResponse) {
+        return input;
     }
 
-    default Function<UserTO, UserTO> afterUpdate(SAML2LoginResponseTO loginResponse) {
-        return Function.identity();
+    default UserTO afterUpdate(UserTO input, SAML2LoginResponseTO loginResponse) {
+        return input;
     }
 }
diff --git a/fit/core-reference/src/test/resources/DoubleValueLogicActions.groovy b/fit/core-reference/src/test/resources/DoubleValueLogicActions.groovy
index 6d19408..720eeca 100644
--- a/fit/core-reference/src/test/resources/DoubleValueLogicActions.groovy
+++ b/fit/core-reference/src/test/resources/DoubleValueLogicActions.groovy
@@ -22,7 +22,6 @@ import org.apache.syncope.common.lib.Attr
 import org.apache.syncope.common.lib.request.AnyCR
 import org.apache.syncope.common.lib.request.AnyUR
 import org.apache.syncope.common.lib.request.AttrPatch
-import java.util.function.Function
 import org.apache.syncope.core.provisioning.api.LogicActions
 
 /**
@@ -34,50 +33,42 @@ class DoubleValueLogicActions implements LogicActions {
   private static final String NAME = "makeItDouble";
 
   @Override
-  <C extends AnyCR> Function<C, C> beforeCreate() {
-    Function function = { 
-      C input ->
-      for (Attr attr : input.getPlainAttrs()) {
-        if (NAME.equals(attr.getSchema())) {
-          List<String> values = new ArrayList<String>(attr.getValues().size());
-          for (String value : attr.getValues()) {
-            try {
-              values.add(String.valueOf(2 * Long.parseLong(value)));
-            } catch (NumberFormatException e) {
-              // ignore
-            }
+  <C extends AnyCR> C beforeCreate(final C input) {
+    for (Attr attr : input.getPlainAttrs()) {
+      if (NAME.equals(attr.getSchema())) {
+        List<String> values = new ArrayList<String>(attr.getValues().size());
+        for (String value : attr.getValues()) {
+          try {
+            values.add(String.valueOf(2 * Long.parseLong(value)));
+          } catch (NumberFormatException e) {
+            // ignore
           }
-          attr.getValues().clear();
-          attr.getValues().addAll(values);
         }
+        attr.getValues().clear();
+        attr.getValues().addAll(values);
       }
-
-      return input;        
     }
-    return function;
+
+    return input;
   }
 
   @Override
-  <R extends AnyUR> Function<R, R> beforeUpdate() {
-    Function function = { 
-      R input ->
-      for (AttrPatch patch : input.getPlainAttrs()) {
-        if (NAME.equals(patch.getAttr().getSchema())) {
-          List<String> values = new ArrayList<String>(patch.getAttr().getValues().size());
-          for (String value : patch.getAttr().getValues()) {
-            try {
-              values.add(String.valueOf(2 * Long.parseLong(value)));
-            } catch (NumberFormatException e) {
-              // ignore
-            }
+  <R extends AnyUR> R beforeUpdate(final R input) {
+    for (AttrPatch patch : input.getPlainAttrs()) {
+      if (NAME.equals(patch.getAttr().getSchema())) {
+        List<String> values = new ArrayList<String>(patch.getAttr().getValues().size());
+        for (String value : patch.getAttr().getValues()) {
+          try {
+            values.add(String.valueOf(2 * Long.parseLong(value)));
+          } catch (NumberFormatException e) {
+            // ignore
           }
-          patch.getAttr().getValues().clear();
-          patch.getAttr().getValues().addAll(values);
         }
+        patch.getAttr().getValues().clear();
+        patch.getAttr().getValues().addAll(values);
       }
-
-      return input;
     }
-    return function;
+
+    return input;
   }
-}
+}
\ No newline at end of file