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())
}
}