Skip to content

Commit 7eddb36

Browse files
committed
new base
1 parent 13b659b commit 7eddb36

File tree

7 files changed

+257
-75
lines changed

7 files changed

+257
-75
lines changed

common/src/main/java/xyz/jpenilla/squaremap/common/config/Config.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import java.util.ArrayList;
44
import java.util.List;
5+
import java.util.Locale;
56
import org.spongepowered.configurate.NodePath;
67
import org.spongepowered.configurate.transformation.ConfigurationTransformation;
8+
import xyz.jpenilla.squaremap.common.Logging;
79

810
@SuppressWarnings("unused")
911
public final class Config extends AbstractConfig {
@@ -114,6 +116,21 @@ private static void progressLogging() {
114116
PROGRESS_LOGGING_INTERVAL = config.getInt("settings.render-progress-logging.interval-seconds", 1);
115117
}
116118

119+
public static DataStorageType STORAGE_TYPE;
120+
121+
private static void storage() {
122+
try {
123+
STORAGE_TYPE = DataStorageType.valueOf(
124+
config.getString("settings.storage.type", "flatfile").toUpperCase(Locale.ROOT)
125+
);
126+
} catch (IllegalArgumentException e) {
127+
Logging.logger().error("Invalid storage type '"
128+
+ config.getString("settings.storage.type", "flatfile")
129+
+ "', falling back to flatfile.");
130+
STORAGE_TYPE = DataStorageType.FLATFILE;
131+
}
132+
}
133+
117134
public static Config config() {
118135
return config;
119136
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package xyz.jpenilla.squaremap.common.config;
2+
3+
public enum DataStorageType {
4+
FLATFILE
5+
}

common/src/main/java/xyz/jpenilla/squaremap/common/data/MapWorldInternal.java

Lines changed: 10 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,8 @@
11
package xyz.jpenilla.squaremap.common.data;
22

3-
import com.google.gson.Gson;
4-
import com.google.gson.GsonBuilder;
5-
import com.google.gson.JsonIOException;
6-
import com.google.gson.JsonSyntaxException;
7-
import com.google.gson.reflect.TypeToken;
8-
import java.io.BufferedReader;
9-
import java.io.IOException;
10-
import java.lang.reflect.Type;
11-
import java.nio.file.Files;
123
import java.nio.file.Path;
134
import java.util.HashMap;
145
import java.util.Iterator;
15-
import java.util.LinkedHashMap;
16-
import java.util.List;
176
import java.util.Map;
187
import java.util.Set;
198
import java.util.concurrent.ConcurrentHashMap;
@@ -32,33 +21,25 @@
3221
import xyz.jpenilla.squaremap.api.Registry;
3322
import xyz.jpenilla.squaremap.api.WorldIdentifier;
3423
import xyz.jpenilla.squaremap.common.LayerRegistry;
35-
import xyz.jpenilla.squaremap.common.Logging;
36-
import xyz.jpenilla.squaremap.common.SquaremapCommon;
3724
import xyz.jpenilla.squaremap.common.config.WorldAdvanced;
3825
import xyz.jpenilla.squaremap.common.config.WorldConfig;
26+
import xyz.jpenilla.squaremap.common.data.storage.AdditionalParameters;
27+
import xyz.jpenilla.squaremap.common.data.storage.DataStorageHolder;
3928
import xyz.jpenilla.squaremap.common.layer.SpawnIconProvider;
4029
import xyz.jpenilla.squaremap.common.layer.WorldBorderProvider;
4130
import xyz.jpenilla.squaremap.common.task.render.AbstractRender;
4231
import xyz.jpenilla.squaremap.common.task.render.BackgroundRender;
4332
import xyz.jpenilla.squaremap.common.task.render.FullRender;
4433
import xyz.jpenilla.squaremap.common.util.Colors;
4534
import xyz.jpenilla.squaremap.common.util.FileUtil;
46-
import xyz.jpenilla.squaremap.common.util.RecordTypeAdapterFactory;
4735
import xyz.jpenilla.squaremap.common.util.Util;
4836
import xyz.jpenilla.squaremap.common.visibilitylimit.VisibilityLimitImpl;
4937

5038
@DefaultQualifier(NonNull.class)
5139
public abstract class MapWorldInternal implements MapWorld {
52-
private static final String DIRTY_CHUNKS_FILE_NAME = "dirty_chunks.json";
53-
private static final String RENDER_PROGRESS_FILE_NAME = "resume_render.json";
54-
private static final Gson GSON = new GsonBuilder()
55-
.registerTypeAdapterFactory(new RecordTypeAdapterFactory())
56-
.enableComplexMapKeySerialization()
57-
.create();
5840
private static final Map<WorldIdentifier, LayerRegistry> LAYER_REGISTRIES = new HashMap<>();
5941

6042
private final ServerLevel level;
61-
private final Path dataPath;
6243
private final Path tilesPath;
6344
private final ExecutorService imageIOexecutor;
6445
private final ScheduledExecutorService executor;
@@ -90,17 +71,6 @@ protected MapWorldInternal(final ServerLevel level) {
9071
this.blockColors = new BlockColors(this);
9172
this.levelBiomeColorData = LevelBiomeColorData.create(this);
9273

93-
this.dataPath = SquaremapCommon.instance().platform().dataDirectory().resolve("data").resolve(
94-
Util.levelWebName(this.level)
95-
);
96-
try {
97-
if (!Files.exists(this.dataPath)) {
98-
Files.createDirectories(this.dataPath);
99-
}
100-
} catch (final IOException e) {
101-
throw this.failedToCreateDataDirectory(e);
102-
}
103-
10474
this.tilesPath = FileUtil.getAndCreateTilesDirectory(this.serverLevel());
10575

10676
this.startBackgroundRender();
@@ -124,53 +94,22 @@ protected MapWorldInternal(final ServerLevel level) {
12494
}
12595

12696
public @Nullable Map<RegionCoordinate, Boolean> getRenderProgress() {
127-
try {
128-
final Path file = this.dataPath.resolve(RENDER_PROGRESS_FILE_NAME);
129-
if (Files.isRegularFile(file)) {
130-
final Type type = new TypeToken<LinkedHashMap<RegionCoordinate, Boolean>>() {
131-
}.getType();
132-
try (final BufferedReader reader = Files.newBufferedReader(file)) {
133-
return GSON.fromJson(reader, type);
134-
}
135-
}
136-
} catch (JsonIOException | JsonSyntaxException | IOException e) {
137-
Logging.logger().warn("Failed to deserialize render progress for world '{}'", this.identifier().asString(), e);
138-
}
139-
return null;
97+
return DataStorageHolder.getDataStorage().getRenderProgress(
98+
this.identifier(),
99+
new AdditionalParameters().put("levelWebName", Util.levelWebName(this.level))
100+
).join();
140101
}
141102

142103
public void saveRenderProgress(Map<RegionCoordinate, Boolean> regions) {
143-
try {
144-
Files.writeString(this.dataPath.resolve(RENDER_PROGRESS_FILE_NAME), GSON.toJson(regions));
145-
} catch (IOException e) {
146-
Logging.logger().warn("Failed to serialize render progress for world '{}'", this.identifier().asString(), e);
147-
}
104+
DataStorageHolder.getDataStorage().storeRenderProgress(this.identifier(), regions, new AdditionalParameters().put("levelWebName", Util.levelWebName(this.level)));
148105
}
149106

150107
private void serializeDirtyChunks() {
151-
try {
152-
Files.writeString(this.dataPath.resolve(DIRTY_CHUNKS_FILE_NAME), GSON.toJson(this.modifiedChunks));
153-
} catch (IOException e) {
154-
Logging.logger().warn("Failed to serialize dirty chunks for world '{}'", this.identifier().asString(), e);
155-
}
108+
DataStorageHolder.getDataStorage().storeDirtyChunks(this.identifier(), this.modifiedChunks, new AdditionalParameters().put("levelWebName", Util.levelWebName(this.level)));
156109
}
157110

158111
private void deserializeDirtyChunks() {
159-
try {
160-
final Path file = this.dataPath.resolve(DIRTY_CHUNKS_FILE_NAME);
161-
if (Files.isRegularFile(file)) {
162-
try (final BufferedReader reader = Files.newBufferedReader(file)) {
163-
this.modifiedChunks.addAll(
164-
GSON.fromJson(
165-
reader,
166-
TypeToken.getParameterized(List.class, ChunkCoordinate.class).getType()
167-
)
168-
);
169-
}
170-
}
171-
} catch (JsonIOException | JsonSyntaxException | IOException e) {
172-
Logging.logger().warn("Failed to deserialize dirty chunks for world '{}'", this.identifier().asString(), e);
173-
}
112+
this.modifiedChunks.addAll(DataStorageHolder.getDataStorage().getDirtyChunks(this.identifier(), new AdditionalParameters().put("levelWebName", Util.levelWebName(this.level))).join());
174113
}
175114

176115
private void startBackgroundRender() {
@@ -255,11 +194,7 @@ public void pauseRenders(boolean pauseRenders) {
255194
}
256195

257196
public void finishedRender() {
258-
try {
259-
Files.deleteIfExists(this.dataPath.resolve(RENDER_PROGRESS_FILE_NAME));
260-
} catch (IOException e) {
261-
Logging.logger().warn("Failed to delete render progress data for world '{}'", this.identifier().asString(), e);
262-
}
197+
DataStorageHolder.getDataStorage().deleteRenderProgress(this.identifier(), new AdditionalParameters().put("levelWebName", Util.levelWebName(this.level)));
263198
}
264199

265200
public void stopRender() {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package xyz.jpenilla.squaremap.common.data.storage;
2+
3+
import java.util.Map;
4+
import java.util.Optional;
5+
import java.util.concurrent.ConcurrentHashMap;
6+
import org.checkerframework.checker.nullness.qual.NonNull;
7+
import org.checkerframework.framework.qual.DefaultQualifier;
8+
9+
@DefaultQualifier(NonNull.class)
10+
public final class AdditionalParameters {
11+
12+
private final Map<String, Object> parameters = new ConcurrentHashMap<>();
13+
14+
public AdditionalParameters put(String key, Object value) {
15+
this.parameters.put(key, value);
16+
return this;
17+
}
18+
19+
public Optional<Object> get(String key) {
20+
return Optional.ofNullable(parameters.get(key));
21+
}
22+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package xyz.jpenilla.squaremap.common.data.storage;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
import java.util.Set;
6+
import java.util.concurrent.CompletableFuture;
7+
import org.checkerframework.checker.nullness.qual.NonNull;
8+
import org.checkerframework.framework.qual.DefaultQualifier;
9+
import xyz.jpenilla.squaremap.api.WorldIdentifier;
10+
import xyz.jpenilla.squaremap.common.data.ChunkCoordinate;
11+
import xyz.jpenilla.squaremap.common.data.RegionCoordinate;
12+
13+
@DefaultQualifier(NonNull.class)
14+
public interface DataStorage {
15+
16+
void storeDirtyChunks(WorldIdentifier world, Set<ChunkCoordinate> dirtyChunkCoordinates, AdditionalParameters parameters);
17+
18+
CompletableFuture<Set<ChunkCoordinate>> getDirtyChunks(WorldIdentifier world, AdditionalParameters parameters);
19+
20+
void storeRenderProgress(WorldIdentifier world, Map<RegionCoordinate, Boolean> renderProgress, AdditionalParameters parameters);
21+
22+
CompletableFuture<Map<RegionCoordinate, Boolean>> getRenderProgress(WorldIdentifier world, AdditionalParameters parameters);
23+
24+
void deleteRenderProgress(WorldIdentifier world, AdditionalParameters parameters);
25+
26+
void updateMarkers(WorldIdentifier world, List<Map<String, Object>> layers, AdditionalParameters parameters);
27+
28+
void updateWorldSettings(WorldIdentifier world, Map<String, Object> settings, AdditionalParameters parameters);
29+
30+
void updateGlobalSettings(WorldIdentifier world, Map<String, Object> settings, AdditionalParameters parameters);
31+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package xyz.jpenilla.squaremap.common.data.storage;
2+
3+
import xyz.jpenilla.squaremap.common.config.Config;
4+
5+
public class DataStorageHolder {
6+
7+
private static DataStorage dataStorage;
8+
9+
public static DataStorage getDataStorage() {
10+
if (dataStorage == null) {
11+
switch (Config.STORAGE_TYPE) {
12+
case FLATFILE -> dataStorage = new FlatfileDataStorage();
13+
}
14+
}
15+
return dataStorage;
16+
}
17+
18+
}

0 commit comments

Comments
 (0)