Skip to content

Commit a45663c

Browse files
committed
refactor: inMemory support
1 parent 2235a03 commit a45663c

File tree

23 files changed

+623
-76
lines changed

23 files changed

+623
-76
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package io.flamingock.internal.core.builder;
1717

1818
import io.flamingock.internal.core.plan.community.CommunityExecutionPlanner;
19+
import io.flamingock.internal.core.store.AuditStore;
1920
import io.flamingock.internal.core.store.CommunityAuditStore;
2021
import io.flamingock.internal.core.configuration.core.CoreConfiguration;
2122
import io.flamingock.internal.core.configuration.community.CommunityConfiguration;
@@ -40,6 +41,15 @@ public CommunityChangeRunnerBuilder(CoreConfiguration coreConfiguration,
4041
this.communityConfiguration = communityConfiguration;
4142
}
4243

44+
public CommunityChangeRunnerBuilder(CoreConfiguration coreConfiguration,
45+
CommunityConfiguration communityConfiguration,
46+
Context dependencyInjectableContext,
47+
PluginManager pluginManager,
48+
CommunityAuditStore auditStore) {
49+
super(coreConfiguration, dependencyInjectableContext, pluginManager, auditStore);
50+
this.communityConfiguration = communityConfiguration;
51+
}
52+
4353
@Override
4454
protected CommunityChangeRunnerBuilder getSelf() {
4555
return this;

core/flamingock-test-support/src/main/java/io/flamingock/internal/core/builder/BuilderAccessor.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.flamingock.internal.core.builder;
1717

18+
import io.flamingock.internal.core.runner.Runner;
1819
import io.flamingock.internal.core.store.AuditStore;
1920

2021
public class BuilderAccessor {
@@ -29,9 +30,8 @@ public AuditStore<?> getAuditStore(){
2930
return builder.auditStore;
3031
}
3132

32-
33-
public void run() {
34-
builder.build().run();
33+
public Runner build() {
34+
return builder.build();
3535
}
3636

3737

core/flamingock-test-support/src/main/java/io/flamingock/support/context/TestContext.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
import io.flamingock.internal.common.core.audit.AuditReader;
1919
import io.flamingock.internal.common.core.audit.AuditWriter;
2020
import io.flamingock.internal.core.builder.BuilderAccessor;
21+
import io.flamingock.internal.core.runner.Runner;
2122
import io.flamingock.support.domain.AuditEntryDefinition;
23+
import io.flamingock.support.inmemory.InMemoryAuditStore;
2224

2325
import java.util.ArrayList;
2426
import java.util.Collections;
@@ -75,10 +77,10 @@ public AuditWriter getAuditWriter() {
7577
}
7678

7779
/**
78-
* Runs the change runner by building and executing it.
80+
* Returns the change runner by building it from the builder.
7981
*/
80-
public void run() {
81-
builderAccessor.run();
82+
public Runner build() {
83+
return builderAccessor.build();
8284
}
8385

8486
/**
@@ -89,4 +91,10 @@ public void run() {
8991
public List<AuditEntryDefinition> getPreconditions() {
9092
return Collections.unmodifiableList(preconditions);
9193
}
94+
95+
public void cleanUp() {
96+
if(builderAccessor.getAuditStore() instanceof InMemoryAuditStore) {
97+
((InMemoryAuditStore)builderAccessor.getAuditStore()).cleanUp();
98+
}
99+
}
92100
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright 2025 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.support.inmemory;
17+
18+
import io.flamingock.internal.common.core.audit.AuditEntry;
19+
import io.flamingock.internal.core.store.audit.community.CommunityAuditPersistence;
20+
import io.flamingock.internal.util.Result;
21+
22+
import java.util.List;
23+
24+
public class InMemoryAuditPersistence implements CommunityAuditPersistence {
25+
26+
private final InMemoryAuditWriter auditWriter;
27+
private final InMemoyAuditReader auditReader;
28+
29+
public InMemoryAuditPersistence(InMemoryAuditStorage auditStorage) {
30+
this.auditWriter = new InMemoryAuditWriter(auditStorage);
31+
this.auditReader = new InMemoyAuditReader(auditStorage);
32+
}
33+
34+
@Override
35+
public List<AuditEntry> getAuditHistory() {
36+
return auditReader.getAuditHistory();
37+
}
38+
39+
@Override
40+
public Result writeEntry(AuditEntry auditEntry) {
41+
return auditWriter.writeEntry(auditEntry);
42+
}
43+
}

utils/test-util/src/main/java/io/flamingock/core/kit/inmemory/InMemoryAuditStorage.java renamed to core/flamingock-test-support/src/main/java/io/flamingock/support/inmemory/InMemoryAuditStorage.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package io.flamingock.core.kit.inmemory;
16+
package io.flamingock.support.inmemory;
1717

18-
import io.flamingock.core.kit.audit.AuditStorage;
1918
import io.flamingock.internal.common.core.audit.AuditEntry;
2019

2120
import java.util.ArrayList;
@@ -35,11 +34,9 @@
3534
* InMemoryAuditStorage storage = new InMemoryAuditStorage();
3635
* AuditTestHelper helper = new AuditTestHelper(storage);
3736
* }</pre>
38-
*
39-
* <p><strong>For other storage implementations:</strong> Use this as a reference
40-
* when implementing AuditStorage for MongoDB, DynamoDB, etc.</p>
37+
*
4138
*/
42-
public class InMemoryAuditStorage implements AuditStorage {
39+
public class InMemoryAuditStorage {
4340

4441
private final List<AuditEntry> auditEntries = new ArrayList<>();
4542

utils/test-util/src/main/java/io/flamingock/core/kit/inmemory/InMemoryTestAuditStore.java renamed to core/flamingock-test-support/src/main/java/io/flamingock/support/inmemory/InMemoryAuditStore.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,27 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package io.flamingock.core.kit.inmemory;
16+
package io.flamingock.support.inmemory;
1717

1818
import io.flamingock.internal.common.core.context.ContextResolver;
19-
import io.flamingock.internal.core.store.lock.community.CommunityLockService;
2019
import io.flamingock.internal.core.store.CommunityAuditStore;
20+
import io.flamingock.internal.core.store.lock.community.CommunityLockService;
2121
import io.flamingock.internal.util.id.RunnerId;
2222

23-
public class InMemoryTestAuditStore implements CommunityAuditStore {
23+
public class InMemoryAuditStore implements CommunityAuditStore {
2424

2525
private final InMemoryAuditStorage auditStorage;
2626
private final InMemoryLockStorage lockStorage;
27-
private InMemoryTestAuditPersistence persistence;
27+
private InMemoryAuditPersistence persistence;
2828
private RunnerId runnerId;
2929

30-
public InMemoryTestAuditStore(InMemoryAuditStorage auditStorage, InMemoryLockStorage lockStorage) {
31-
this.auditStorage = auditStorage;
32-
this.lockStorage = lockStorage;
30+
public static InMemoryAuditStore create() {
31+
return new InMemoryAuditStore();
32+
}
33+
34+
private InMemoryAuditStore() {
35+
this.auditStorage = new InMemoryAuditStorage();
36+
this.lockStorage = new InMemoryLockStorage();
3337

3438
}
3539

@@ -38,12 +42,12 @@ public void initialize(ContextResolver contextResolver) {
3842
// Extract required components from context
3943
runnerId = contextResolver.getRequiredDependencyValue(RunnerId.class);
4044
// Create the test audit persistence with domain-separated storage
41-
this.persistence = new InMemoryTestAuditPersistence(auditStorage);
45+
this.persistence = new InMemoryAuditPersistence(auditStorage);
4246
}
4347

4448

4549
@Override
46-
public InMemoryTestAuditPersistence getPersistence() {
50+
public InMemoryAuditPersistence getPersistence() {
4751
if (persistence == null) {
4852
throw new IllegalStateException("AuditStore not initialized - call initialize first");
4953
}
@@ -54,4 +58,9 @@ public InMemoryTestAuditPersistence getPersistence() {
5458
public CommunityLockService getLockService() {
5559
return new InMemoryLockService(lockStorage, runnerId);
5660
}
61+
62+
public void cleanUp() {
63+
auditStorage.clear();
64+
lockStorage.clear();
65+
}
5766
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/*
2+
* Copyright 2025 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.support.inmemory;
17+
18+
import io.flamingock.internal.common.core.audit.AuditEntry;
19+
import io.flamingock.internal.core.store.audit.LifecycleAuditWriter;
20+
import io.flamingock.internal.core.store.audit.domain.ExecutionAuditContextBundle;
21+
import io.flamingock.internal.core.store.audit.domain.RollbackAuditContextBundle;
22+
import io.flamingock.internal.core.store.audit.domain.StartExecutionAuditContextBundle;
23+
import io.flamingock.internal.util.Result;
24+
25+
public class InMemoryAuditWriter implements LifecycleAuditWriter {
26+
27+
private final InMemoryAuditStorage auditStorage;
28+
29+
public InMemoryAuditWriter(InMemoryAuditStorage auditStorage) {
30+
this.auditStorage = auditStorage;
31+
}
32+
33+
@Override
34+
public Result writeStartExecution(StartExecutionAuditContextBundle auditContextBundle) {
35+
try {
36+
AuditEntry auditEntry = auditContextBundle.toAuditEntry();
37+
return writeEntry(auditEntry);
38+
} catch (Exception e) {
39+
return new Result.Error(e);
40+
}
41+
}
42+
43+
@Override
44+
public Result writeExecution(ExecutionAuditContextBundle auditContextBundle) {
45+
try {
46+
AuditEntry auditEntry = auditContextBundle.toAuditEntry();
47+
return writeEntry(auditEntry);
48+
} catch (Exception e) {
49+
return new Result.Error(e);
50+
}
51+
}
52+
53+
@Override
54+
public Result writeRollback(RollbackAuditContextBundle auditContextBundle) {
55+
try {
56+
AuditEntry auditEntry = auditContextBundle.toAuditEntry();
57+
return writeEntry(auditEntry);
58+
} catch (Exception e) {
59+
return new Result.Error(e);
60+
}
61+
}
62+
63+
/**
64+
* Write an audit entry to the storage
65+
*/
66+
public Result writeEntry(AuditEntry auditEntry) {
67+
try {
68+
auditStorage.addAuditEntry(auditEntry);
69+
return Result.OK();
70+
} catch (Exception e) {
71+
return new Result.Error(e);
72+
}
73+
}
74+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
* Copyright 2025 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.support.inmemory;
17+
18+
import io.flamingock.internal.common.core.context.Context;
19+
import io.flamingock.internal.core.builder.CommunityChangeRunnerBuilder;
20+
import io.flamingock.internal.core.configuration.community.CommunityConfiguration;
21+
import io.flamingock.internal.core.configuration.core.CoreConfiguration;
22+
import io.flamingock.internal.core.context.SimpleContext;
23+
import io.flamingock.internal.core.plugin.DefaultPluginManager;
24+
import io.flamingock.internal.core.plugin.PluginManager;
25+
26+
/**
27+
* Specialized Flamingock builder for testing purposes.
28+
*
29+
* <p>This builder extends CommunityFlamingockBuilder and is pre-configured with test-specific
30+
* settings and drivers. It's created by TestKit implementations and provides the same API
31+
* as production builders but optimized for testing scenarios.</p>
32+
*
33+
* <p><strong>Usage:</strong></p>
34+
* <pre>{@code
35+
* TestFlamingockBuilder builder = testKit.createBuilder();
36+
*
37+
* // Configure for testing (common settings)
38+
* builder.addTargetSystem(new DefaultTargetSystem("test-system"));
39+
*
40+
* // Build and run
41+
* builder.build().run();
42+
* }</pre>
43+
*
44+
* <p>Typically used through TestKit.createBuilder() rather than directly instantiated.</p>
45+
*/
46+
public class InMemoryFlamingockBuilder extends CommunityChangeRunnerBuilder {
47+
48+
49+
public static InMemoryFlamingockBuilder create() {
50+
return new InMemoryFlamingockBuilder(
51+
new CoreConfiguration(),
52+
new CommunityConfiguration(),
53+
new SimpleContext(),
54+
new DefaultPluginManager(),
55+
InMemoryAuditStore.create()
56+
);
57+
}
58+
59+
private InMemoryFlamingockBuilder(CoreConfiguration coreConfiguration,
60+
CommunityConfiguration communityConfiguration,
61+
Context dependencyInjectableContext,
62+
PluginManager pluginManager,
63+
InMemoryAuditStore auditStore) {
64+
super(coreConfiguration, communityConfiguration, dependencyInjectableContext, pluginManager, auditStore);
65+
this.auditStore = auditStore;
66+
}
67+
68+
@Override
69+
protected InMemoryFlamingockBuilder getSelf() {
70+
return this;
71+
}
72+
73+
public InMemoryAuditStore getAuditStore() {
74+
return (InMemoryAuditStore) auditStore;
75+
}
76+
}

utils/test-util/src/main/java/io/flamingock/core/kit/inmemory/InMemoryLockService.java renamed to core/flamingock-test-support/src/main/java/io/flamingock/support/inmemory/InMemoryLockService.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,20 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package io.flamingock.core.kit.inmemory;
16+
package io.flamingock.support.inmemory;
1717

18-
import io.flamingock.core.kit.lock.LockStorage;
19-
import io.flamingock.internal.core.store.lock.community.CommunityLockService;
2018
import io.flamingock.internal.core.store.lock.LockAcquisition;
2119
import io.flamingock.internal.core.store.lock.LockKey;
2220
import io.flamingock.internal.core.store.lock.LockServiceException;
21+
import io.flamingock.internal.core.store.lock.community.CommunityLockService;
2322
import io.flamingock.internal.util.id.RunnerId;
2423

2524
public class InMemoryLockService implements CommunityLockService {
2625

27-
private final LockStorage lockStorage;
26+
private final InMemoryLockStorage lockStorage;
2827
private final RunnerId instanceId;
2928

30-
public InMemoryLockService(LockStorage lockStorage, RunnerId instanceId) {
29+
public InMemoryLockService(InMemoryLockStorage lockStorage, RunnerId instanceId) {
3130
this.lockStorage = lockStorage;
3231
this.instanceId = instanceId;
3332
}

0 commit comments

Comments
 (0)