Skip to content

Commit 8c9e174

Browse files
authored
feat: springboot management mode (#769)
1 parent bf03c95 commit 8c9e174

File tree

17 files changed

+220
-371
lines changed

17 files changed

+220
-371
lines changed

core/flamingock-core-api/src/main/java/io/flamingock/api/SetupType.java

Lines changed: 0 additions & 20 deletions
This file was deleted.

core/flamingock-core-api/src/main/java/io/flamingock/api/annotations/EnableFlamingock.java

Lines changed: 2 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,15 @@
1515
*/
1616
package io.flamingock.api.annotations;
1717

18-
import io.flamingock.api.SetupType;
19-
2018
import java.lang.annotation.ElementType;
2119
import java.lang.annotation.Retention;
2220
import java.lang.annotation.RetentionPolicy;
2321
import java.lang.annotation.Target;
2422

2523
/**
26-
* Core annotation for configuring Flamingock setup execution and framework integration.
24+
* Core annotation for configuring Flamingock pipeline execution.
2725
* This annotation must be placed on a class to enable Flamingock processing and define
28-
* how the pipeline should be configured and applied.
26+
* how the pipeline should be configured.
2927
*
3028
* <h2>Pipeline Configuration</h2>
3129
*
@@ -55,48 +53,6 @@
5553
* }
5654
* </pre>
5755
*
58-
* <h2>Framework Integration Setup</h2>
59-
*
60-
* The {@link #setup()} field controls how Flamingock integrates with application frameworks:
61-
*
62-
* <h3>DEFAULT Setup (Automatic Integration)</h3>
63-
* In framework environments like Spring Boot, Flamingock automatically registers and configures
64-
* the Flamingock runner bean based on configuration properties and annotation settings.
65-
* In standalone applications, behaves the same as BUILDER setup.
66-
*
67-
* <pre>
68-
* &#64;EnableFlamingock(
69-
* setup = SetupType.DEFAULT, // Default value - automatic framework integration
70-
* stages = { &#64;Stage(location = "com.example.migrations") }
71-
* )
72-
* &#64;Configuration
73-
* public class FlamingockConfig {
74-
* // Spring Boot will automatically create and configure the Flamingock runner
75-
* // No manual bean configuration required
76-
* }
77-
* </pre>
78-
*
79-
* <h3>BUILDER Setup (Manual Configuration)</h3>
80-
* Disables automatic framework integration, requiring manual Flamingock runner configuration.
81-
* Useful when you need full control over the Flamingock setup process.
82-
*
83-
* <pre>
84-
* &#64;EnableFlamingock(
85-
* setup = SetupType.BUILDER, // Manual configuration required
86-
* stages = { &#64;Stage(location = "com.example.migrations") }
87-
* )
88-
* &#64;Configuration
89-
* public class FlamingockConfig {
90-
*
91-
* &#64;Bean
92-
* public Flamingock flamingock(MongoTemplate mongoTemplate) {
93-
* return FlamingockFactory.cloudBuilder()
94-
* .setAuditStore(new MongoDBSyncAuditStore())
95-
* .buildRunner();
96-
* }
97-
* }
98-
* </pre>
99-
*
10056
* <h2>Validation Rules</h2>
10157
* <ul>
10258
* <li>Either {@link #configFile()} OR {@link #stages()} must be specified (mutually exclusive)</li>
@@ -107,7 +63,6 @@
10763
*
10864
* @since 1.0
10965
* @see Stage
110-
* @see SetupType
11166
*/
11267
@Target(ElementType.TYPE)
11368
@Retention(RetentionPolicy.RUNTIME)
@@ -165,51 +120,6 @@
165120
*/
166121
String configFile() default "";
167122

168-
/**
169-
* Controls how Flamingock integrates with application frameworks.
170-
*
171-
* <p><b>DEFAULT</b> - Automatic framework integration:
172-
* <ul>
173-
* <li>In Spring Boot: Flamingock automatically registers and configures the runner bean</li>
174-
* <li>In standalone applications: Behaves the same as BUILDER</li>
175-
* <li>Configuration is derived from application properties and annotation settings</li>
176-
* </ul>
177-
*
178-
* <p><b>BUILDER</b> - Manual configuration required:
179-
* <ul>
180-
* <li>Framework integration is disabled</li>
181-
* <li>Developer must manually create and configure Flamingock beans</li>
182-
* <li>Provides full control over the setup process</li>
183-
* </ul>
184-
*
185-
* <p>Example with automatic setup (DEFAULT):
186-
* <pre>
187-
* &#64;EnableFlamingock(setup = SetupType.DEFAULT) // or omit for default
188-
* &#64;Configuration
189-
* public class Config {
190-
* // Spring Boot auto-configures Flamingock
191-
* }
192-
* </pre>
193-
*
194-
* <p>Example with manual setup (BUILDER):
195-
* <pre>
196-
* &#64;EnableFlamingock(setup = SetupType.BUILDER)
197-
* &#64;Configuration
198-
* public class Config {
199-
* &#64;Bean
200-
* public Flamingock flamingock(AuditStore auditStore) {
201-
* return FlamingockFactory.cloudBuilder()
202-
* .setAuditStore(auditStore)
203-
* .buildRunner();
204-
* }
205-
* }
206-
* </pre>
207-
*
208-
* @return the setup type for framework integration
209-
* @see SetupType
210-
*/
211-
SetupType setup() default SetupType.DEFAULT;
212-
213123
/**
214124
* If true, the annotation processor will validate that all code-based changes
215125
* (classes annotated with @Change) are mapped to some stage. When unmapped changes

core/flamingock-core-commons/src/main/java/io/flamingock/internal/common/core/metadata/FlamingockMetadata.java

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,13 @@
2020
public class FlamingockMetadata {
2121

2222
private PreviewPipeline pipeline;
23-
private String setup;
2423
private String configFile;
2524

2625
public FlamingockMetadata() {
2726
}
2827

29-
public FlamingockMetadata(PreviewPipeline pipeline, String setup, String configFile) {
28+
public FlamingockMetadata(PreviewPipeline pipeline, String configFile) {
3029
this.pipeline = pipeline;
31-
this.setup = setup;
3230
this.configFile = configFile;
3331
}
3432

@@ -40,14 +38,6 @@ public void setPipeline(PreviewPipeline pipeline) {
4038
this.pipeline = pipeline;
4139
}
4240

43-
public String getSetup() {
44-
return setup;
45-
}
46-
47-
public void setSetup(String setup) {
48-
this.setup = setup;
49-
}
50-
5141
public String getPipelineFile() {
5242
return configFile;
5343
}
@@ -59,8 +49,7 @@ public void setPipelineFile(String configFile) {
5949
@Override
6050
public String toString() {
6151
return "FlamingockMetadata{" + "pipeline=" + pipeline +
62-
", setup='" + setup + '\'' +
6352
", configFile='" + configFile + '\'' +
6453
'}';
6554
}
66-
}
55+
}

core/flamingock-processor/src/main/java/io/flamingock/core/processor/FlamingockAnnotationProcessor.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,9 +220,8 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
220220
validateAllChangesAreMappedToStages(standardChangesMapByPackage, pipeline, flamingockAnnotation.strictStageMapping());
221221

222222
Serializer serializer = new Serializer(processingEnv, logger);
223-
String setup = flamingockAnnotation.setup().toString();
224223
String configFile = flamingockAnnotation.configFile();
225-
FlamingockMetadata flamingockMetadata = new FlamingockMetadata(pipeline, setup, configFile);
224+
FlamingockMetadata flamingockMetadata = new FlamingockMetadata(pipeline, configFile);
226225
serializer.serializeFullPipeline(flamingockMetadata);
227226

228227
// Generate summary - count all changes from the final pipeline (code-based + template-based)

core/flamingock-processor/src/test/java/io/flamingock/core/processor/PipelinePreProcessorTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,6 @@ public EnableFlamingock build() {
513513
return new EnableFlamingock() {
514514
@Override public Stage[] stages() { return stages; }
515515
@Override public String configFile() { return configFile; }
516-
@Override public io.flamingock.api.SetupType setup() { return io.flamingock.api.SetupType.DEFAULT; }
517516

518517
@Override
519518
public boolean strictStageMapping() {

platform-plugins/flamingock-springboot-integration/src/main/java/io/flamingock/springboot/ConditionalOnFlamingockEnabled.java

Lines changed: 0 additions & 31 deletions
This file was deleted.

platform-plugins/flamingock-springboot-integration/src/main/java/io/flamingock/springboot/FlamingockAutoConfiguration.java

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,62 +19,94 @@
1919
import io.flamingock.internal.core.builder.FlamingockFactory;
2020
import io.flamingock.internal.core.builder.AbstractChangeRunnerBuilder;
2121
import io.flamingock.internal.core.store.CommunityAuditStore;
22-
import io.flamingock.internal.core.runner.RunnerBuilder;
23-
import io.flamingock.internal.util.Constants;
2422
import org.springframework.beans.factory.InitializingBean;
2523
import org.springframework.beans.factory.annotation.Autowired;
26-
import org.springframework.beans.factory.annotation.Value;
2724
import org.springframework.boot.ApplicationRunner;
2825
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2926
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
30-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3127
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3228
import org.springframework.context.ApplicationContext;
3329
import org.springframework.context.ApplicationEventPublisher;
3430
import org.springframework.context.annotation.Bean;
3531
import org.springframework.context.annotation.Configuration;
36-
import org.springframework.context.annotation.Profile;
3732

3833
import java.util.List;
3934

35+
/**
36+
* Spring Boot auto-configuration for Flamingock.
37+
*
38+
* <p>The configuration behavior is controlled by the {@code flamingock.management-mode} property:</p>
39+
* <ul>
40+
* <li>{@code APPLICATION_RUNNER} (default) - Spring creates, builds, and executes the runner as an ApplicationRunner</li>
41+
* <li>{@code INITIALIZING_BEAN} - Spring creates, builds, and executes the runner as an InitializingBean</li>
42+
* <li>{@code DEFERRED} - Spring creates the builder; the application controls execution</li>
43+
* <li>{@code UNMANAGED} - No beans are created; the application manages everything</li>
44+
* </ul>
45+
*/
4046
@Configuration
4147
@ConditionalOnClass(name = "org.springframework.boot.SpringApplication")
42-
@ConditionalOnFlamingockEnabled
48+
@ConditionalOnExpression("!'${flamingock.management-mode:APPLICATION_RUNNER}'.toUpperCase().equals('UNMANAGED')")
4349
@EnableConfigurationProperties(SpringbootProperties.class)
4450
public class FlamingockAutoConfiguration {
4551

52+
/**
53+
* Creates an ApplicationRunner that builds and executes Flamingock at application startup.
54+
* Only created when management-mode is APPLICATION_RUNNER (the default).
55+
*/
4656
@Bean("flamingock-runner")
47-
@Profile(Constants.NON_CLI_PROFILE)
48-
@ConditionalOnExpression("'${flamingock.runner-type:ApplicationRunner}'.toLowerCase().equals('applicationrunner')")
49-
public ApplicationRunner applicationRunner(RunnerBuilder runnerBuilder,
50-
@Value("${flamingock.autorun:true}") boolean autoRun) {
51-
return SpringbootUtil.toApplicationRunner(runnerBuilder, autoRun);
57+
@ConditionalOnExpression("'${flamingock.management-mode:APPLICATION_RUNNER}'.toUpperCase().equals('APPLICATION_RUNNER')")
58+
public ApplicationRunner applicationRunner(SpringbootProperties configurationProperties,
59+
ApplicationContext springContext,
60+
ApplicationEventPublisher applicationEventPublisher,
61+
@Autowired(required = false) CommunityAuditStore auditStore,
62+
List<TargetSystem> targetSystems) {
63+
AbstractChangeRunnerBuilder<?, ?> builder = createBuilder(
64+
configurationProperties, springContext, applicationEventPublisher, auditStore, targetSystems);
65+
return SpringbootUtil.toApplicationRunner(builder);
5266
}
5367

68+
/**
69+
* Creates an InitializingBean that builds and executes Flamingock during bean initialization.
70+
* Only created when management-mode is INITIALIZING_BEAN.
71+
*/
5472
@Bean("flamingock-runner")
55-
@Profile(Constants.NON_CLI_PROFILE)
56-
@ConditionalOnExpression("'${flamingock.runner-type:null}'.toLowerCase().equals('initializingbean')")
57-
public InitializingBean initializingBeanRunner(RunnerBuilder runnerBuilder,
58-
@Value("${flamingock.autorun:true}") boolean autoRun) {
59-
return SpringbootUtil.toInitializingBean(runnerBuilder, autoRun);
73+
@ConditionalOnExpression("'${flamingock.management-mode:APPLICATION_RUNNER}'.toUpperCase().equals('INITIALIZING_BEAN')")
74+
public InitializingBean initializingBeanRunner(SpringbootProperties configurationProperties,
75+
ApplicationContext springContext,
76+
ApplicationEventPublisher applicationEventPublisher,
77+
@Autowired(required = false) CommunityAuditStore auditStore,
78+
List<TargetSystem> targetSystems) {
79+
AbstractChangeRunnerBuilder<?, ?> builder = createBuilder(
80+
configurationProperties, springContext, applicationEventPublisher, auditStore, targetSystems);
81+
return SpringbootUtil.toInitializingBean(builder);
6082
}
6183

84+
/**
85+
* Exposes the Flamingock builder for manual control over execution.
86+
* Only created when management-mode is DEFERRED.
87+
*/
6288
@Bean("flamingock-builder")
63-
@Profile(Constants.NON_CLI_PROFILE)
64-
@ConditionalOnMissingBean(RunnerBuilder.class)
65-
public AbstractChangeRunnerBuilder<?,?> flamingockBuilder(SpringbootProperties configurationProperties,
66-
ApplicationContext springContext,
67-
ApplicationEventPublisher applicationEventPublisher,
68-
@Autowired(required = false) CommunityAuditStore auditStore,
69-
List<TargetSystem> targetSystems) {
89+
@ConditionalOnExpression("'${flamingock.management-mode:APPLICATION_RUNNER}'.toUpperCase().equals('DEFERRED')")
90+
public AbstractChangeRunnerBuilder<?, ?> flamingockBuilder(SpringbootProperties configurationProperties,
91+
ApplicationContext springContext,
92+
ApplicationEventPublisher applicationEventPublisher,
93+
@Autowired(required = false) CommunityAuditStore auditStore,
94+
List<TargetSystem> targetSystems) {
95+
return createBuilder(configurationProperties, springContext, applicationEventPublisher, auditStore, targetSystems);
96+
}
7097

71-
AbstractChangeRunnerBuilder<?,?> builder = FlamingockFactory.getEditionAwareBuilder(
98+
private AbstractChangeRunnerBuilder<?, ?> createBuilder(SpringbootProperties configurationProperties,
99+
ApplicationContext springContext,
100+
ApplicationEventPublisher applicationEventPublisher,
101+
CommunityAuditStore auditStore,
102+
List<TargetSystem> targetSystems) {
103+
AbstractChangeRunnerBuilder<?, ?> builder = FlamingockFactory.getEditionAwareBuilder(
72104
configurationProperties.getCoreConfiguration(),
73105
configurationProperties.getCloudProperties(),
74106
configurationProperties.getLocalConfiguration(),
75107
auditStore
76108
)
77-
.addDependency(SpringRunnerType.class, configurationProperties.getRunnerType())
109+
.addDependency(SpringbootManagementMode.class, configurationProperties.getManagementMode())
78110
.addDependency(ApplicationContext.class, springContext)
79111
.addDependency(ApplicationEventPublisher.class, applicationEventPublisher);
80112

@@ -83,6 +115,5 @@ public AbstractChangeRunnerBuilder<?,?> flamingockBuilder(SpringbootProperties c
83115
}
84116

85117
return builder;
86-
87118
}
88119
}

0 commit comments

Comments
 (0)