From 482e981c36a2a6ab4ef620243d70f17a986d18e6 Mon Sep 17 00:00:00 2001 From: George Date: Sun, 7 Jun 2026 14:03:55 +0100 Subject: [PATCH] Consolidate persistence service contract --- .../core/services/CoreServices.java | 1 - .../core/simulation/PersistenceService.java | 39 ------------------- .../core/simulation/SimulationManager.java | 1 + .../simulation/SimulationManagerTest.java | 11 ++++-- .../testing/LongRunSimulationTest.java | 20 ++++++---- 5 files changed, 22 insertions(+), 50 deletions(-) delete mode 100644 src/main/java/com/livingworld/core/simulation/PersistenceService.java diff --git a/src/main/java/com/livingworld/core/services/CoreServices.java b/src/main/java/com/livingworld/core/services/CoreServices.java index cc2e8ca..d2796fe 100644 --- a/src/main/java/com/livingworld/core/services/CoreServices.java +++ b/src/main/java/com/livingworld/core/services/CoreServices.java @@ -1,6 +1,5 @@ package com.livingworld.core.services; -import com.livingworld.core.simulation.PersistenceService; import com.livingworld.core.simulation.RegionManager; import com.livingworld.core.simulation.SimulationManager; import com.livingworld.events.LivingWorldEventBus; diff --git a/src/main/java/com/livingworld/core/simulation/PersistenceService.java b/src/main/java/com/livingworld/core/simulation/PersistenceService.java deleted file mode 100644 index 91cf469..0000000 --- a/src/main/java/com/livingworld/core/simulation/PersistenceService.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.livingworld.core.simulation; - -import java.util.Optional; - -import com.livingworld.regions.Region; -import com.livingworld.regions.RegionCoordinate; - -/** - * Handles region persistence (save/load) and migration support. - * - *

TODO (Milestone 8): Implement actual file or database I/O, - * platform-specific save paths, and schema versioning.

- */ -public interface PersistenceService { - - /** - * Saves a region to persistent storage. - * - * @param region the region to save (must not be null) - */ - void save(Region region); - - /** - * Loads a region from persistent storage. - * - * @param coordinate the region coordinate to load (must not be null) - * @return an optional containing the loaded region if found, otherwise empty - */ - Optional load(RegionCoordinate coordinate); - - /** - * Returns whether this persistence service supports data migration. - * - *

TODO: Implement schema version detection and migration logic.

- * - * @return true if migration is supported - */ - boolean supportsMigration(); -} diff --git a/src/main/java/com/livingworld/core/simulation/SimulationManager.java b/src/main/java/com/livingworld/core/simulation/SimulationManager.java index a51d2a2..19a4534 100644 --- a/src/main/java/com/livingworld/core/simulation/SimulationManager.java +++ b/src/main/java/com/livingworld/core/simulation/SimulationManager.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import com.livingworld.core.services.PersistenceService; import com.livingworld.core.services.TimeService; import com.livingworld.debug.DiagnosticCategory; import com.livingworld.debug.LivingWorldLogger; diff --git a/src/test/java/com/livingworld/core/simulation/SimulationManagerTest.java b/src/test/java/com/livingworld/core/simulation/SimulationManagerTest.java index f48fe0e..7a8502a 100644 --- a/src/test/java/com/livingworld/core/simulation/SimulationManagerTest.java +++ b/src/test/java/com/livingworld/core/simulation/SimulationManagerTest.java @@ -17,6 +17,7 @@ import java.util.Set; import org.junit.jupiter.api.Test; import com.livingworld.config.SimulationConfig; +import com.livingworld.core.services.PersistenceService; import com.livingworld.core.services.TimeService; import com.livingworld.data.serialization.PersistenceReader; import com.livingworld.data.serialization.PersistenceWriter; @@ -240,9 +241,13 @@ class SimulationManagerTest { } private static final class TestPersistenceService implements PersistenceService { - @Override public void save(Region region) {} - @Override public Optional load(RegionCoordinate coordinate) { return Optional.empty(); } - @Override public boolean supportsMigration() { return false; } + @Override public void markRegionDirty(Region region) { region.markDirty(); } + @Override public void saveDirtyRegions() {} + @Override public void saveRegion(Region region) {} + @Override public Optional loadRegion(RegionCoordinate coordinate) { + return Optional.empty(); + } + @Override public void flushAll() {} } private static final class TestProfiler implements SimulationProfiler { diff --git a/src/test/java/com/livingworld/testing/LongRunSimulationTest.java b/src/test/java/com/livingworld/testing/LongRunSimulationTest.java index f4626ab..948f19c 100644 --- a/src/test/java/com/livingworld/testing/LongRunSimulationTest.java +++ b/src/test/java/com/livingworld/testing/LongRunSimulationTest.java @@ -5,9 +5,9 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import com.livingworld.config.SimulationConfig; +import com.livingworld.core.services.PersistenceService; import com.livingworld.core.services.ServiceRegistry; import com.livingworld.core.simulation.DefaultTimeService; -import com.livingworld.core.simulation.PersistenceService; import com.livingworld.core.simulation.RegionManager; import com.livingworld.core.simulation.RegionUpdateJob; import com.livingworld.core.simulation.SimulationManager; @@ -174,11 +174,12 @@ class LongRunSimulationTest { this.regions = regions; } - private void saveDirtyRegions() { + @Override + public void saveDirtyRegions() { maxDirtyObserved = Math.max(maxDirtyObserved, countDirtyRegions()); regions.stream() .filter(Region::isDirty) - .forEach(this::save); + .forEach(this::saveRegion); } private int countDirtyRegions() { @@ -194,20 +195,25 @@ class LongRunSimulationTest { } @Override - public void save(Region region) { + public void markRegionDirty(Region region) { + region.markDirty(); + } + + @Override + public void saveRegion(Region region) { savedRegions.put(region.getCoordinate(), region); region.clearDirty(); saveCount++; } @Override - public Optional load(RegionCoordinate coordinate) { + public Optional loadRegion(RegionCoordinate coordinate) { return Optional.ofNullable(savedRegions.get(coordinate)); } @Override - public boolean supportsMigration() { - return false; + public void flushAll() { + saveDirtyRegions(); } } }