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


The following commit(s) were added to refs/heads/master by this push:
     new 26945aba23 [SYNCOPE-1892] Macro: from pipe to context
26945aba23 is described below

commit 26945aba23db21d176800c7b676960c032cfe1a9
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Tue Jul 22 09:41:11 2025 +0200

    [SYNCOPE-1892] Macro: from pipe to context
---
 .../console/implementations/MyCommand.groovy       |  4 ++--
 .../console/implementations/MyMacroActions.groovy  |  8 ++++---
 .../syncope/common/lib/command/CommandArgs.java    | 25 ++++----------------
 .../core/provisioning/api/macro/Command.java       |  7 +++++-
 .../core/provisioning/api/macro/MacroActions.java  |  7 +++---
 .../provisioning/java/job/MacroJobDelegate.java    | 27 +++++++++++-----------
 .../syncope/fit/core/reference/TestCommand.java    |  1 -
 .../src/test/resources/GroovyCommand.groovy        |  4 ++--
 8 files changed, 37 insertions(+), 46 deletions(-)

diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyCommand.groovy
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyCommand.groovy
index e9625f72da..792f1a64da 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyCommand.groovy
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyCommand.groovy
@@ -24,7 +24,7 @@ import org.apache.syncope.core.provisioning.api.macro.Command
 class MyCommand implements Command<CommandArgs> {
 
   @Override
-  CommandArgs.Result run(CommandArgs args) {
-    return new CommandArgs.Result("SUCCESS")    
+  Result run(CommandArgs args) {
+    return new Result("SUCCESS")
   }
 }
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyMacroActions.groovy
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyMacroActions.groovy
index fa9e2d6c77..7225982dc3 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyMacroActions.groovy
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyMacroActions.groovy
@@ -17,6 +17,7 @@
  * under the License.
  */
 import groovy.transform.CompileStatic
+import java.io.Serializable
 import java.util.Map
 import java.util.Optional
 import jakarta.validation.ValidationException
@@ -24,6 +25,7 @@ import org.apache.syncope.common.lib.command.CommandArgs
 import org.apache.syncope.common.lib.form.SyncopeForm
 import org.apache.syncope.core.provisioning.api.macro.Command
 import org.apache.syncope.core.provisioning.api.macro.MacroActions
+import org.apache.syncope.core.provisioning.api.macro.Command.Result
 
 @CompileStatic
 class MyMacroActions implements MacroActions {
@@ -43,7 +45,7 @@ class MyMacroActions implements MacroActions {
   }
 
   @Override
-  void beforeAll() {
+  void beforeAll(Map<String, Serializable> ctx) {
   }
 
   @Override
@@ -51,11 +53,11 @@ class MyMacroActions implements MacroActions {
   }
 
   @Override
-  void afterCommand(Command<CommandArgs> command, CommandArgs args, 
CommandArgs.Result result) {
+  void afterCommand(Command<CommandArgs> command, CommandArgs args, Result 
result) {
   }
 
   @Override
-  StringBuilder afterAll(StringBuilder output) {
+  StringBuilder afterAll(Map<String, Serializable> ctx, StringBuilder output) {
     return output
   }
 }
diff --git 
a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/command/CommandArgs.java
 
b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/command/CommandArgs.java
index cdc95fdfad..de808397af 100644
--- 
a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/command/CommandArgs.java
+++ 
b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/command/CommandArgs.java
@@ -23,8 +23,6 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import java.io.Serializable;
 import java.util.Map;
 import java.util.Optional;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.cxf.common.util.CollectionUtils;
 import org.apache.syncope.common.lib.BaseBean;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, 
property = "_class")
@@ -32,27 +30,14 @@ public class CommandArgs implements BaseBean {
 
     private static final long serialVersionUID = -85050010490462751L;
 
-    public record Result(String message, Map<String, Serializable> values) 
implements Serializable {
-
-        public static final Result EMPTY = new Result(StringUtils.EMPTY, 
Map.of());
-
-        public Result(final String message) {
-            this(message, Map.of());
-        }
-
-        public boolean isEmpty() {
-            return StringUtils.isBlank(message) && 
CollectionUtils.isEmpty(values);
-        }
-    }
-
     @JsonIgnore
-    private Result pipe;
+    private Map<String, Serializable> ctx;
 
-    public final Optional<Result> getPipe() {
-        return Optional.ofNullable(pipe);
+    public final Map<String, Serializable> getCtx() {
+        return Optional.ofNullable(ctx).orElseGet(Map::of);
     }
 
-    public final void setPipe(final Result pipe) {
-        this.pipe = pipe;
+    public final void setCtx(final Map<String, Serializable> ctx) {
+        this.ctx = ctx;
     }
 }
diff --git 
a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/macro/Command.java
 
b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/macro/Command.java
index 3a35474381..ef06e8abee 100644
--- 
a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/macro/Command.java
+++ 
b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/macro/Command.java
@@ -18,11 +18,16 @@
  */
 package org.apache.syncope.core.provisioning.api.macro;
 
+import java.io.Serializable;
+import java.util.Map;
 import org.apache.syncope.common.lib.command.CommandArgs;
-import org.apache.syncope.common.lib.command.CommandArgs.Result;
 
 @FunctionalInterface
 public interface Command<A extends CommandArgs> {
 
+    record Result(String message, Map<String, Serializable> values) implements 
Serializable {
+
+    }
+
     Result run(A args);
 }
diff --git 
a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/macro/MacroActions.java
 
b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/macro/MacroActions.java
index f48a3bc6d5..eda66d30e5 100644
--- 
a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/macro/MacroActions.java
+++ 
b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/macro/MacroActions.java
@@ -19,11 +19,12 @@
 package org.apache.syncope.core.provisioning.api.macro;
 
 import jakarta.validation.ValidationException;
+import java.io.Serializable;
 import java.util.Map;
 import java.util.Optional;
 import org.apache.syncope.common.lib.command.CommandArgs;
-import org.apache.syncope.common.lib.command.CommandArgs.Result;
 import org.apache.syncope.common.lib.form.SyncopeForm;
+import org.apache.syncope.core.provisioning.api.macro.Command.Result;
 
 /**
  * Interface for actions to be performed during macro execution.
@@ -42,7 +43,7 @@ public interface MacroActions {
         // does nothing by default
     }
 
-    default void beforeAll() {
+    default void beforeAll(Map<String, Serializable> ctx) {
         // does nothing by default
     }
 
@@ -54,7 +55,7 @@ public interface MacroActions {
         // does nothing by default
     }
 
-    default StringBuilder afterAll(StringBuilder output) {
+    default StringBuilder afterAll(Map<String, Serializable> ctx, 
StringBuilder output) {
         return output;
     }
 }
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/MacroJobDelegate.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/MacroJobDelegate.java
index ffcb5d3768..628bde58a2 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/MacroJobDelegate.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/MacroJobDelegate.java
@@ -22,6 +22,7 @@ import jakarta.annotation.Resource;
 import jakarta.validation.ConstraintViolation;
 import jakarta.validation.ValidationException;
 import jakarta.validation.Validator;
+import java.io.Serializable;
 import java.time.format.DateTimeParseException;
 import java.util.ArrayList;
 import java.util.Base64;
@@ -186,9 +187,10 @@ public class MacroJobDelegate extends 
AbstractSchedTaskJobDelegate<MacroTask> {
         return vars.isEmpty() ? Optional.empty() : Optional.of(new 
MapContext(vars));
     }
 
-    protected String run(
+    protected void run(
             final List<Pair<Command<CommandArgs>, CommandArgs>> commands,
             final Optional<MacroActions> actions,
+            final Map<String, Serializable> ctx,
             final StringBuilder output,
             final boolean dryRun)
             throws JobExecutionException {
@@ -198,8 +200,6 @@ public class MacroJobDelegate extends 
AbstractSchedTaskJobDelegate<MacroTask> {
 
                     Mutable<Pair<String, Throwable>> error = new 
MutableObject<>();
 
-                    Mutable<CommandArgs.Result> prevCmdResult = new 
MutableObject<>(CommandArgs.Result.EMPTY);
-
                     for (int i = 0; i < commands.size() && error.get() == 
null; i++) {
                         Pair<Command<CommandArgs>, CommandArgs> command = 
commands.get(i);
 
@@ -209,13 +209,13 @@ public class MacroJobDelegate extends 
AbstractSchedTaskJobDelegate<MacroTask> {
                                     append(args).append("\n");
 
                             if (!dryRun) {
-                                
command.getRight().setPipe(prevCmdResult.get());
+                                command.getRight().setCtx(ctx);
 
                                 actions.ifPresent(a -> a.beforeCommand(
                                         command.getLeft(), 
command.getRight()));
 
-                                CommandArgs.Result cmdResult = 
command.getLeft().run(command.getRight());
-                                prevCmdResult.setValue(cmdResult);
+                                Command.Result cmdResult = 
command.getLeft().run(command.getRight());
+                                ctx.putAll(cmdResult.values());
 
                                 actions.ifPresent(a -> a.afterCommand(
                                         command.getLeft(), command.getRight(), 
cmdResult));
@@ -249,8 +249,6 @@ public class MacroJobDelegate extends 
AbstractSchedTaskJobDelegate<MacroTask> {
         }
 
         output.append("COMPLETED");
-
-        return actions.filter(a -> !dryRun).map(a -> 
a.afterAll(output)).orElse(output).toString();
     }
 
     @SuppressWarnings("unchecked")
@@ -275,9 +273,9 @@ public class MacroJobDelegate extends 
AbstractSchedTaskJobDelegate<MacroTask> {
         SyncopeForm macroTaskForm = (SyncopeForm) 
context.getData().get(MACRO_TASK_FORM_JOBDETAIL_KEY);
         Optional<JexlContext> jexlContext = check(macroTaskForm, actions, 
output);
 
-        if (!context.isDryRun()) {
-            actions.ifPresent(MacroActions::beforeAll);
-        }
+        Map<String, Serializable> ctx = new HashMap<>();
+
+        actions.filter(a -> !context.isDryRun()).ifPresent(a -> 
a.beforeAll(ctx));
 
         List<Pair<Command<CommandArgs>, CommandArgs>> commands = new 
ArrayList<>();
         for (MacroTaskCommand command : task.getCommands()) {
@@ -301,14 +299,14 @@ public class MacroJobDelegate extends 
AbstractSchedTaskJobDelegate<MacroTask> {
             } else {
                 args = command.getArgs();
 
-                jexlContext.ifPresent(ctx -> ReflectionUtils.doWithFields(
+                jexlContext.ifPresent(jc -> ReflectionUtils.doWithFields(
                         args.getClass(),
                         field -> {
                             if (String.class.equals(field.getType())) {
                                 field.setAccessible(true);
                                 Object value = field.get(args);
                                 if (value instanceof final String s) {
-                                    field.set(args, 
JexlUtils.evaluateTemplate(s, ctx));
+                                    field.set(args, 
JexlUtils.evaluateTemplate(s, jc));
                                 }
                             }
                         },
@@ -329,7 +327,8 @@ public class MacroJobDelegate extends 
AbstractSchedTaskJobDelegate<MacroTask> {
             commands.add(Pair.of(runnable, args));
         }
 
-        return run(commands, actions, output, context.isDryRun());
+        run(commands, actions, ctx, output, context.isDryRun());
+        return actions.filter(a -> !context.isDryRun()).map(a -> 
a.afterAll(ctx, output)).orElse(output).toString();
     }
 
     @Override
diff --git 
a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestCommand.java
 
b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestCommand.java
index 1e8f6b4003..a43bb8f095 100644
--- 
a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestCommand.java
+++ 
b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestCommand.java
@@ -22,7 +22,6 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import org.apache.syncope.common.lib.Attr;
-import org.apache.syncope.common.lib.command.CommandArgs.Result;
 import org.apache.syncope.common.lib.request.AnyObjectCR;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.RealmTO;
diff --git a/fit/core-reference/src/test/resources/GroovyCommand.groovy 
b/fit/core-reference/src/test/resources/GroovyCommand.groovy
index c092833b68..b9b3654866 100644
--- a/fit/core-reference/src/test/resources/GroovyCommand.groovy
+++ b/fit/core-reference/src/test/resources/GroovyCommand.groovy
@@ -28,7 +28,7 @@ class GroovyCommand implements Command<CommandArgs> {
   SyncopeLogic logic;
 
   @Override
-  CommandArgs.Result run(CommandArgs args) {
-    return new CommandArgs.Result("" + logic.isPwdResetAllowed())    
+  Result run(CommandArgs args) {
+    return new Result("" + logic.isPwdResetAllowed())
   }
 }

Reply via email to