diff --git a/core/flamingock-core-commons/src/main/java/io/flamingock/internal/common/core/preview/TemplatePreviewChange.java b/core/flamingock-core-commons/src/main/java/io/flamingock/internal/common/core/preview/TemplatePreviewChange.java index b961a06a8..97756aa88 100644 --- a/core/flamingock-core-commons/src/main/java/io/flamingock/internal/common/core/preview/TemplatePreviewChange.java +++ b/core/flamingock-core-commons/src/main/java/io/flamingock/internal/common/core/preview/TemplatePreviewChange.java @@ -27,6 +27,7 @@ public class TemplatePreviewChange extends AbstractPreviewTask { private Object configuration; private Object apply; private Object rollback; + private Object steps; public TemplatePreviewChange() {} @@ -44,6 +45,7 @@ public TemplatePreviewChange(String fileName, Object configuration, Object apply, Object rollback, + Object steps, TargetSystemDescriptor targetSystem, RecoveryDescriptor recovery) { super(id, order, author, templateName, runAlways, transactional, system, targetSystem, recovery, false); @@ -52,6 +54,7 @@ public TemplatePreviewChange(String fileName, this.configuration = configuration; this.apply = apply; this.rollback = rollback; + this.steps = steps; } public String getFileName() { @@ -98,12 +101,21 @@ public void setRollback(Object rollback) { this.rollback = rollback; } + public Object getSteps() { + return steps; + } + + public void setSteps(Object steps) { + this.steps = steps; + } + @Override public String toString() { return "TemplatePreviewChange{" + "profiles=" + profiles + ", configuration=" + configuration + ", apply=" + apply + ", rollback=" + rollback + + ", steps=" + steps + ", id='" + id + '\'' + ", order='" + order + '\'' + ", author='" + author + '\'' + diff --git a/core/flamingock-core-commons/src/main/java/io/flamingock/internal/common/core/preview/builder/TemplatePreviewTaskBuilder.java b/core/flamingock-core-commons/src/main/java/io/flamingock/internal/common/core/preview/builder/TemplatePreviewTaskBuilder.java index 6334f05c9..c4542b78c 100644 --- a/core/flamingock-core-commons/src/main/java/io/flamingock/internal/common/core/preview/builder/TemplatePreviewTaskBuilder.java +++ b/core/flamingock-core-commons/src/main/java/io/flamingock/internal/common/core/preview/builder/TemplatePreviewTaskBuilder.java @@ -40,6 +40,7 @@ class TemplatePreviewTaskBuilder implements PreviewTaskBuilder changeTemplateInstance = (ChangeTemplate) instance; changeTemplateInstance.setTransactional(descriptor.isTransactional()); + changeTemplateInstance.setChangeId(descriptor.getId()); setExecutionData(executionRuntime, changeTemplateInstance, "Configuration"); setExecutionData(executionRuntime, changeTemplateInstance, "ApplyPayload"); setExecutionData(executionRuntime, changeTemplateInstance, "RollbackPayload"); + setStepsPayloadIfPresent(executionRuntime, changeTemplateInstance); executionRuntime.executeMethodWithInjectedDependencies(instance, method); } catch (Throwable ex) { throw new ChangeExecutionException(ex.getMessage(), this.getId(), ex); @@ -100,6 +102,33 @@ private Method getSetterMethod(Class changeTemplateClass, String methodName) } + /** + * Sets the steps payload on the template if the template supports it and steps data is present. + * This method uses reflection to call setStepsPayload if the template has such a method. + * Templates that don't support steps will simply not have this method called. + */ + private void setStepsPayloadIfPresent(ExecutionRuntime executionRuntime, + ChangeTemplate instance) { + Object stepsData = descriptor.getSteps(); + if (stepsData == null) { + return; + } + + Method setStepsMethod = Arrays.stream(instance.getClass().getMethods()) + .filter(m -> "setStepsPayload".equals(m.getName())) + .filter(m -> m.getParameterCount() == 1) + .findFirst() + .orElse(null); + + if (setStepsMethod != null) { + logger.debug("Setting steps payload for change[{}]", descriptor.getId()); + executionRuntime.executeMethodWithParameters(instance, setStepsMethod, stepsData); + } else { + logger.warn("Template[{}] has steps defined but doesn't support setStepsPayload method", + instance.getClass().getSimpleName()); + } + } + diff --git a/core/flamingock-core/src/main/java/io/flamingock/internal/core/task/loaded/TemplateLoadedChange.java b/core/flamingock-core/src/main/java/io/flamingock/internal/core/task/loaded/TemplateLoadedChange.java index 4bb077be4..c30e84a07 100644 --- a/core/flamingock-core/src/main/java/io/flamingock/internal/core/task/loaded/TemplateLoadedChange.java +++ b/core/flamingock-core/src/main/java/io/flamingock/internal/core/task/loaded/TemplateLoadedChange.java @@ -35,6 +35,7 @@ public class TemplateLoadedChange extends AbstractLoadedChange { private final Object configuration; private final Object apply; private final Object rollback; + private final Object steps; TemplateLoadedChange(String changeFileName, String id, @@ -49,6 +50,7 @@ public class TemplateLoadedChange extends AbstractLoadedChange { Object configuration, Object apply, Object rollback, + Object steps, TargetSystemDescriptor targetSystem, RecoveryDescriptor recovery) { super(changeFileName, id, order, author, templateClass, constructor, runAlways, transactional, systemTask, targetSystem, recovery, false); @@ -57,6 +59,7 @@ public class TemplateLoadedChange extends AbstractLoadedChange { this.configuration = configuration; this.apply = apply; this.rollback = rollback; + this.steps = steps; } public Object getConfiguration() { @@ -71,6 +74,10 @@ public Object getRollback() { return rollback; } + public Object getSteps() { + return steps; + } + public List getProfiles() { return profiles; } diff --git a/core/flamingock-core/src/main/java/io/flamingock/internal/core/task/loaded/TemplateLoadedTaskBuilder.java b/core/flamingock-core/src/main/java/io/flamingock/internal/core/task/loaded/TemplateLoadedTaskBuilder.java index 6e850de35..dd0776896 100644 --- a/core/flamingock-core/src/main/java/io/flamingock/internal/core/task/loaded/TemplateLoadedTaskBuilder.java +++ b/core/flamingock-core/src/main/java/io/flamingock/internal/core/task/loaded/TemplateLoadedTaskBuilder.java @@ -45,6 +45,7 @@ public class TemplateLoadedTaskBuilder implements LoadedTaskBuilder