Skip to content

Commit 87d1064

Browse files
committed
refactor: default operation responsibility and AbstractPipelineTraverseOperation for apply and evaluate operations
1 parent d4fb6cc commit 87d1064

File tree

11 files changed

+130
-87
lines changed

11 files changed

+130
-87
lines changed

core/flamingock-core/src/main/java/io/flamingock/internal/core/builder/AbstractChangeRunnerBuilder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import io.flamingock.internal.core.context.SimpleContext;
3232
import io.flamingock.internal.core.external.store.AuditStore;
3333
import io.flamingock.internal.core.external.store.audit.AuditPersistence;
34+
import io.flamingock.internal.core.operation.OperationResolver;
3435
import io.flamingock.internal.core.plan.ExecutionPlanner;
3536
import io.flamingock.internal.core.event.CompositeEventPublisher;
3637
import io.flamingock.internal.core.event.EventPublisher;
@@ -43,7 +44,6 @@
4344
import io.flamingock.internal.core.event.model.IStageFailedEvent;
4445
import io.flamingock.internal.core.event.model.IStageIgnoredEvent;
4546
import io.flamingock.internal.core.event.model.IStageStartedEvent;
46-
import io.flamingock.internal.core.operation.OperationFactory;
4747
import io.flamingock.internal.core.operation.RunnableOperation;
4848
import io.flamingock.internal.core.pipeline.loaded.LoadedPipeline;
4949
import io.flamingock.internal.core.plugin.Plugin;
@@ -213,7 +213,7 @@ public final Runner build() {
213213

214214
FlamingockArguments flamingockArgs = FlamingockArguments.parse(applicationArgs);
215215

216-
OperationFactory operationFactory = new OperationFactory(
216+
OperationResolver operationResolver = new OperationResolver(
217217
runnerId,
218218
flamingockArgs,
219219
pipeline,
@@ -227,7 +227,7 @@ public final Runner build() {
227227
coreConfiguration.isThrowExceptionIfCannotObtainLock(),
228228
persistence.getCloser()
229229
);
230-
RunnableOperation<?, ?> operation = operationFactory.getOperation();
230+
RunnableOperation<?, ?> operation = operationResolver.getOperation();
231231

232232
return new RunnerFactory(runnerId, flamingockArgs, operation, persistence.getCloser()).create();
233233
}

core/flamingock-core/src/main/java/io/flamingock/internal/core/builder/args/FlamingockArguments.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ private FlamingockArguments(boolean cliMode,
5353

5454
public static FlamingockArguments parse(String[] args) {
5555
if (args == null || args.length == 0) {
56-
return new FlamingockArguments(false, OperationType.EXECUTE_APPLY, false, null, Collections.emptyMap());
56+
return new FlamingockArguments(false, null, false, null, Collections.emptyMap());
5757
}
5858

5959
boolean cliMode = false;
@@ -150,8 +150,8 @@ public boolean isCliMode() {
150150
return cliMode;
151151
}
152152

153-
public OperationType getOperation() {
154-
return operation;
153+
public Optional<OperationType> getOperation() {
154+
return Optional.ofNullable(operation);
155155
}
156156

157157
public boolean isOperationProvided() {

core/flamingock-core/src/main/java/io/flamingock/internal/core/builder/runner/RunnerFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ private Runner createCliRunner() {
6060
.map(outputFile -> (ResponseChannel) new FileResponseChannel(outputFile, JsonObjectMapper.DEFAULT_INSTANCE))
6161
.orElseGet(NoOpResponseChannel::new);
6262

63-
return new CliRunner(operation, finalizer, channel, flamingockArgs.getOperation());
63+
return new CliRunner(operation, finalizer, channel, flamingockArgs.getOperation().get());
6464
}
6565

6666
private Runner createDefaultRunner() {

core/flamingock-core/src/main/java/io/flamingock/internal/core/operation/execute/ExecuteOperation.java renamed to core/flamingock-core/src/main/java/io/flamingock/internal/core/operation/AbstractPipelineTraverseOperation.java

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package io.flamingock.internal.core.operation.execute;
16+
package io.flamingock.internal.core.operation;
1717

1818
import io.flamingock.internal.common.core.error.FlamingockException;
1919
import io.flamingock.internal.common.core.error.PendingChangesException;
@@ -27,8 +27,8 @@
2727
import io.flamingock.internal.core.event.model.impl.StageCompletedEvent;
2828
import io.flamingock.internal.core.event.model.impl.StageFailedEvent;
2929
import io.flamingock.internal.core.event.model.impl.StageStartedEvent;
30-
import io.flamingock.internal.core.operation.Operation;
31-
import io.flamingock.internal.core.operation.OperationException;
30+
import io.flamingock.internal.core.operation.execute.ExecuteArgs;
31+
import io.flamingock.internal.core.operation.execute.ExecuteResult;
3232
import io.flamingock.internal.core.operation.result.ExecutionResultBuilder;
3333
import io.flamingock.internal.core.pipeline.execution.ExecutableStage;
3434
import io.flamingock.internal.core.pipeline.execution.ExecutionContext;
@@ -49,9 +49,9 @@
4949
import java.util.List;
5050

5151
/**
52-
* Executes the pipeline and returns structured result data.
52+
* Common execution flow for Apply and Validate operations
5353
*/
54-
public class ExecuteOperation implements Operation<ExecuteArgs, ExecuteResult> {
54+
public abstract class AbstractPipelineTraverseOperation implements Operation<ExecuteArgs, ExecuteResult> {
5555

5656
private static final Logger logger = FlamingockLoggerFactory.getLogger("PipelineRunner");
5757

@@ -69,13 +69,13 @@ public class ExecuteOperation implements Operation<ExecuteArgs, ExecuteResult> {
6969

7070
protected final Runnable finalizer;
7171

72-
public ExecuteOperation(RunnerId runnerId,
73-
ExecutionPlanner executionPlanner,
74-
StageExecutor stageExecutor,
75-
OrphanExecutionContext orphanExecutionContext,
76-
EventPublisher eventPublisher,
77-
boolean throwExceptionIfCannotObtainLock,
78-
Runnable finalizer) {
72+
public AbstractPipelineTraverseOperation(RunnerId runnerId,
73+
ExecutionPlanner executionPlanner,
74+
StageExecutor stageExecutor,
75+
OrphanExecutionContext orphanExecutionContext,
76+
EventPublisher eventPublisher,
77+
boolean throwExceptionIfCannotObtainLock,
78+
Runnable finalizer) {
7979
this.runnerId = runnerId;
8080
this.executionPlanner = executionPlanner;
8181
this.stageExecutor = stageExecutor;
@@ -85,23 +85,6 @@ public ExecuteOperation(RunnerId runnerId,
8585
this.finalizer = finalizer;
8686
}
8787

88-
89-
@Override
90-
public ExecuteResult execute(ExecuteArgs args) {
91-
ExecuteResponseData result;
92-
try {
93-
result = this.execute(args.getPipeline(), false);
94-
} catch (OperationException operationException) {
95-
result = operationException.getResult();
96-
throw operationException;
97-
} catch (Throwable throwable) {
98-
throw processAndGetFlamingockException(throwable, null);
99-
} finally {
100-
finalizer.run();
101-
}
102-
return new ExecuteResult(result);
103-
}
104-
10588
private static List<AbstractLoadedStage> validateAndGetExecutableStages(LoadedPipeline pipeline) {
10689
pipeline.validate();
10790
List<AbstractLoadedStage> stages = new ArrayList<>();
@@ -193,7 +176,7 @@ private StageResult startStage(String executionId, Lock lock, ExecutableStage ex
193176
return executionOutput.getResult();
194177
}
195178

196-
private FlamingockException processAndGetFlamingockException(Throwable exception, ExecutionResultBuilder resultBuilder) throws FlamingockException {
179+
protected FlamingockException processAndGetFlamingockException(Throwable exception, ExecutionResultBuilder resultBuilder) throws FlamingockException {
197180
FlamingockException flamingockException;
198181
if (exception instanceof OperationException) {
199182
OperationException pipelineException = (OperationException) exception;
@@ -212,5 +195,4 @@ private FlamingockException processAndGetFlamingockException(Throwable exception
212195
eventPublisher.publish(new PipelineFailedEvent(flamingockException));
213196
return flamingockException;
214197
}
215-
216198
}

core/flamingock-core/src/main/java/io/flamingock/internal/core/operation/OperationFactory.java renamed to core/flamingock-core/src/main/java/io/flamingock/internal/core/operation/OperationResolver.java

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,14 @@
2929
import io.flamingock.internal.core.operation.audit.AuditListArgs;
3030
import io.flamingock.internal.core.operation.audit.AuditListOperation;
3131
import io.flamingock.internal.core.operation.audit.AuditListResult;
32-
import io.flamingock.internal.core.operation.execute.ExecuteArgs;
33-
import io.flamingock.internal.core.operation.execute.ExecuteOperation;
34-
import io.flamingock.internal.core.operation.execute.ExecuteResult;
35-
import io.flamingock.internal.core.operation.execute.ValidateOperation;
32+
import io.flamingock.internal.core.operation.execute.*;
3633
import io.flamingock.internal.core.operation.issue.IssueGetArgs;
3734
import io.flamingock.internal.core.operation.issue.IssueGetOperation;
3835
import io.flamingock.internal.core.operation.issue.IssueGetResult;
3936
import io.flamingock.internal.core.operation.issue.IssueListArgs;
4037
import io.flamingock.internal.core.operation.issue.IssueListOperation;
4138
import io.flamingock.internal.core.operation.issue.IssueListResult;
39+
import io.flamingock.internal.core.operation.validate.ValidateOperation;
4240
import io.flamingock.internal.core.pipeline.execution.OrphanExecutionContext;
4341
import io.flamingock.internal.core.pipeline.execution.StageExecutor;
4442
import io.flamingock.internal.core.pipeline.loaded.LoadedPipeline;
@@ -48,7 +46,7 @@
4846

4947
import java.util.Set;
5048

51-
public class OperationFactory {
49+
public class OperationResolver {
5250

5351
private static final String ARG_HISTORY = "flamingock.audit.history";
5452
private static final String ARG_SINCE = "flamingock.audit.since";
@@ -70,7 +68,7 @@ public class OperationFactory {
7068
private final boolean isThrowExceptionIfCannotObtainLock;
7169
private final Runnable finalizer;
7270

73-
public OperationFactory(RunnerId runnerId,
71+
public OperationResolver(RunnerId runnerId,
7472
FlamingockArguments flamingockArgs,
7573
LoadedPipeline pipeline,
7674
AuditPersistence persistence,
@@ -97,13 +95,12 @@ public OperationFactory(RunnerId runnerId,
9795
}
9896

9997
public RunnableOperation<?, ?> getOperation() {
100-
OperationType operationType = flamingockArgs.getOperation();
101-
if (operationType == OperationType.EXECUTE_APPLY && coreConfiguration.isValidationOnly() && !flamingockArgs.isCliMode()) {
102-
operationType = OperationType.VALIDATE;
103-
}
98+
OperationType operationType = flamingockArgs.getOperation().orElse(
99+
coreConfiguration.isValidationOnly() ? OperationType.VALIDATE : OperationType.EXECUTE_APPLY
100+
);
104101
switch (operationType) {
105102
case EXECUTE_APPLY:
106-
return getExecuteOperation();
103+
return getExecuteApplyOperation();
107104
case VALIDATE:
108105
return getValidateOperation();
109106
case AUDIT_LIST:
@@ -148,17 +145,17 @@ private RunnableOperation<IssueGetArgs, IssueGetResult> getIssueGetOperation() {
148145
return new RunnableOperation<>(issueGetOperation, new IssueGetArgs(changeId, guidance));
149146
}
150147

151-
private RunnableOperation<ExecuteArgs, ExecuteResult> getExecuteOperation() {
148+
private RunnableOperation<ExecuteArgs, ExecuteResult> getExecuteApplyOperation() {
152149
final StageExecutor stageExecutor = new StageExecutor(dependencyContext, nonGuardedTypes, persistence, targetSystemManager, null);
153-
ExecuteOperation executeOperation = new ExecuteOperation(
154-
runnerId,
155-
executionPlanner,
156-
stageExecutor,
157-
buildExecutionContext(coreConfiguration),
158-
eventPublisher,
159-
isThrowExceptionIfCannotObtainLock,
160-
finalizer);
161-
return new RunnableOperation<>(executeOperation, new ExecuteArgs(pipeline));
150+
ExecuteApplyOperation executeApplyOperation = new ExecuteApplyOperation(
151+
runnerId,
152+
executionPlanner,
153+
stageExecutor,
154+
buildExecutionContext(coreConfiguration),
155+
eventPublisher,
156+
isThrowExceptionIfCannotObtainLock,
157+
finalizer);
158+
return new RunnableOperation<>(executeApplyOperation, new ExecuteArgs(pipeline));
162159
}
163160

164161
private RunnableOperation<ExecuteArgs, ExecuteResult> getValidateOperation() {
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright 2026 Flamingock (https://www.flamingock.io)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.flamingock.internal.core.operation.execute;
17+
18+
import io.flamingock.internal.common.core.response.data.ExecuteResponseData;
19+
import io.flamingock.internal.core.event.EventPublisher;
20+
import io.flamingock.internal.core.operation.AbstractPipelineTraverseOperation;
21+
import io.flamingock.internal.core.operation.OperationException;
22+
import io.flamingock.internal.core.pipeline.execution.*;
23+
import io.flamingock.internal.core.plan.ExecutionPlanner;
24+
import io.flamingock.internal.util.id.RunnerId;
25+
26+
/**
27+
* Executes the pipeline and returns structured result data.
28+
*/
29+
public class ExecuteApplyOperation extends AbstractPipelineTraverseOperation {
30+
31+
public ExecuteApplyOperation(RunnerId runnerId,
32+
ExecutionPlanner executionPlanner,
33+
StageExecutor stageExecutor,
34+
OrphanExecutionContext orphanExecutionContext,
35+
EventPublisher eventPublisher,
36+
boolean throwExceptionIfCannotObtainLock,
37+
Runnable finalizer) {
38+
super(runnerId, executionPlanner, stageExecutor, orphanExecutionContext, eventPublisher, throwExceptionIfCannotObtainLock, finalizer);
39+
}
40+
41+
@Override
42+
public ExecuteResult execute(ExecuteArgs args) {
43+
ExecuteResponseData result;
44+
try {
45+
result = this.execute(args.getPipeline(), false);
46+
} catch (OperationException operationException) {
47+
result = operationException.getResult();
48+
throw operationException;
49+
} catch (Throwable throwable) {
50+
throw processAndGetFlamingockException(throwable, null);
51+
} finally {
52+
finalizer.run();
53+
}
54+
return new ExecuteResult(result);
55+
}
56+
}

core/flamingock-core/src/main/java/io/flamingock/internal/core/operation/execute/ValidateOperation.java renamed to core/flamingock-core/src/main/java/io/flamingock/internal/core/operation/validate/ValidateOperation.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,15 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package io.flamingock.internal.core.operation.execute;
16+
package io.flamingock.internal.core.operation.validate;
1717

1818
import io.flamingock.internal.common.core.error.FlamingockException;
1919
import io.flamingock.internal.common.core.error.PendingChangesException;
2020
import io.flamingock.internal.common.core.response.data.ExecuteResponseData;
2121
import io.flamingock.internal.core.event.EventPublisher;
22+
import io.flamingock.internal.core.operation.AbstractPipelineTraverseOperation;
23+
import io.flamingock.internal.core.operation.execute.ExecuteArgs;
24+
import io.flamingock.internal.core.operation.execute.ExecuteResult;
2225
import io.flamingock.internal.core.pipeline.execution.OrphanExecutionContext;
2326
import io.flamingock.internal.core.pipeline.execution.StageExecutor;
2427
import io.flamingock.internal.core.plan.ExecutionPlanner;
@@ -28,7 +31,7 @@
2831
* Validates the pipeline without executing any changes.
2932
* If pending changes exist, throws {@link PendingChangesException}.
3033
*/
31-
public class ValidateOperation extends ExecuteOperation {
34+
public class ValidateOperation extends AbstractPipelineTraverseOperation {
3235

3336
public ValidateOperation(RunnerId runnerId,
3437
ExecutionPlanner executionPlanner,

0 commit comments

Comments
 (0)