Skip to content

Commit 42f05f8

Browse files
authored
feat(test-support): inMemory Builder and auditStore (#773)
1 parent 2235a03 commit 42f05f8

File tree

29 files changed

+710
-112
lines changed

29 files changed

+710
-112
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ plugins {
1616

1717
allprojects {
1818
group = "io.flamingock"
19-
version = "1.0.0-beta.6"
19+
version = "1.0.0-beta.7"
2020

2121
repositories {
2222
mavenCentral()
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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.internal.core.builder;
17+
18+
19+
import io.flamingock.internal.core.store.CommunityAuditStore;
20+
21+
public interface AuditStoreReceiver<RETURN_TYPE> {
22+
23+
RETURN_TYPE setAuditStore(CommunityAuditStore auditStore);
24+
}

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

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

18-
import io.flamingock.internal.core.plan.community.CommunityExecutionPlanner;
19-
import io.flamingock.internal.core.store.CommunityAuditStore;
20-
import io.flamingock.internal.core.configuration.core.CoreConfiguration;
18+
import io.flamingock.internal.common.core.context.Context;
2119
import io.flamingock.internal.core.configuration.community.CommunityConfiguration;
2220
import io.flamingock.internal.core.configuration.community.CommunityConfigurator;
23-
import io.flamingock.internal.common.core.context.Context;
21+
import io.flamingock.internal.core.configuration.core.CoreConfiguration;
2422
import io.flamingock.internal.core.plan.ExecutionPlanner;
23+
import io.flamingock.internal.core.plan.community.CommunityExecutionPlanner;
2524
import io.flamingock.internal.core.plugin.PluginManager;
25+
import io.flamingock.internal.core.store.CommunityAuditStore;
2626
import io.flamingock.internal.util.id.RunnerId;
2727

2828
public class CommunityChangeRunnerBuilder
2929
extends AbstractChangeRunnerBuilder<CommunityAuditStore, CommunityChangeRunnerBuilder>
30-
implements CommunityConfigurator<CommunityChangeRunnerBuilder> {
30+
implements CommunityConfigurator<CommunityChangeRunnerBuilder>,
31+
AuditStoreReceiver<CommunityChangeRunnerBuilder> {
3132

3233
private final CommunityConfiguration communityConfiguration;
3334

3435

3536
public CommunityChangeRunnerBuilder(CoreConfiguration coreConfiguration,
36-
CommunityConfiguration communityConfiguration,
37-
Context dependencyInjectableContext,
38-
PluginManager pluginManager) {
37+
CommunityConfiguration communityConfiguration,
38+
Context dependencyInjectableContext,
39+
PluginManager pluginManager) {
3940
super(coreConfiguration, dependencyInjectableContext, pluginManager);
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;
@@ -62,6 +72,7 @@ protected ExecutionPlanner buildExecutionPlanner(RunnerId runnerId) {
6272
.build();
6373
}
6474

75+
@Override
6576
public CommunityChangeRunnerBuilder setAuditStore(CommunityAuditStore auditStore) {
6677
this.auditStore = auditStore;
6778
return this;

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
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;
20+
import io.flamingock.internal.core.store.CommunityAuditStore;
1921

2022
public class BuilderAccessor {
2123

@@ -29,10 +31,17 @@ public AuditStore<?> getAuditStore(){
2931
return builder.auditStore;
3032
}
3133

32-
33-
public void run() {
34-
builder.build().run();
34+
public Runner build() {
35+
return builder.build();
3536
}
3637

3738

39+
public void overrideAuditStore(CommunityAuditStore auditStore) {
40+
if(!(builder instanceof AuditStoreReceiver)) {
41+
String message = String.format("Builder of type[%s] does not allow AuditStore override operation", builder.getClass().getSimpleName());
42+
throw new IllegalArgumentException(message);
43+
}
44+
45+
((AuditStoreReceiver<?>)builder).setAuditStore(auditStore);
46+
}
3847
}

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

Lines changed: 13 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,12 @@ 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.
81+
*
82+
* @return the built runner ready for execution
7983
*/
80-
public void run() {
81-
builderAccessor.run();
84+
public Runner build() {
85+
return builderAccessor.build();
8286
}
8387

8488
/**
@@ -89,4 +93,10 @@ public void run() {
8993
public List<AuditEntryDefinition> getPreconditions() {
9094
return Collections.unmodifiableList(preconditions);
9195
}
96+
97+
public void cleanUp() {
98+
if(builderAccessor.getAuditStore() instanceof InMemoryAuditStore) {
99+
((InMemoryAuditStore)builderAccessor.getAuditStore()).cleanUp();
100+
}
101+
}
92102
}
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+
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+
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+
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+
}

0 commit comments

Comments
 (0)