Skip to content

Commit 49e956e

Browse files
committed
Refactor Map-Storage to be more modular in preparation for SQL-storage
1 parent 3608c05 commit 49e956e

File tree

19 files changed

+600
-235
lines changed

19 files changed

+600
-235
lines changed

BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/BlueMapService.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import de.bluecolored.bluemap.core.mca.MCAWorld;
3636
import de.bluecolored.bluemap.core.resourcepack.ParseResourceException;
3737
import de.bluecolored.bluemap.core.resourcepack.ResourcePack;
38+
import de.bluecolored.bluemap.core.storage.FileStorage;
39+
import de.bluecolored.bluemap.core.storage.Storage;
3840
import de.bluecolored.bluemap.core.world.World;
3941
import org.apache.commons.io.FileUtils;
4042

@@ -164,11 +166,16 @@ private synchronized void loadWorldsAndMaps() throws IOException, InterruptedExc
164166
}
165167
}
166168

169+
Storage storage = new FileStorage(
170+
getRenderConfig().getWebRoot().toPath().resolve("data"),
171+
mapConfig.getCompression()
172+
);
173+
167174
BmMap map = new BmMap(
168175
id,
169176
name,
170177
world,
171-
getRenderConfig().getWebRoot().toPath().resolve("data").resolve(id),
178+
storage,
172179
getResourcePack(),
173180
mapConfig
174181
);

BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/render/RenderAPIImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import de.bluecolored.bluemap.common.rendermanager.MapUpdateTask;
3636
import de.bluecolored.bluemap.common.rendermanager.RenderManager;
3737
import de.bluecolored.bluemap.common.rendermanager.WorldRegionRenderTask;
38-
import de.bluecolored.bluemap.core.map.BmMap;
3938
import de.bluecolored.bluemap.core.world.Grid;
4039

4140
import java.io.IOException;
@@ -96,7 +95,7 @@ public boolean scheduleMapUpdateTask(BlueMapMap map, Collection<Vector2i> region
9695
@Override
9796
public boolean scheduleMapPurgeTask(BlueMapMap map) throws IOException {
9897
BlueMapMapImpl cmap = castMap(map);
99-
return renderManager.scheduleRenderTask(new MapPurgeTask(cmap.getMapType()));
98+
return renderManager.scheduleRenderTask(MapPurgeTask.create(cmap.getMapType()));
10099
}
101100

102101
@Override

BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/Commands.java

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
import de.bluecolored.bluemap.core.world.World;
6565

6666
import java.io.IOException;
67-
import java.nio.file.Files;
6867
import java.nio.file.Path;
6968
import java.util.*;
7069
import java.util.function.Function;
@@ -810,41 +809,33 @@ public int purgeCommand(CommandContext<S> context) {
810809
CommandSource source = commandSourceInterface.apply(context.getSource());
811810

812811
// parse map argument
813-
String mapId = context.getArgument("map", String.class);
812+
String mapString = context.getArgument("map", String.class);
813+
BmMap map = parseMap(mapString).orElse(null);
814+
815+
if (map == null) {
816+
source.sendMessage(Text.of(TextColor.RED, "There is no ", helper.mapHelperHover(), " with this name: ", TextColor.WHITE, mapString));
817+
return 0;
818+
}
814819

815820
new Thread(() -> {
816821
try {
817-
Path mapFolder = plugin.getRenderConfig().getWebRoot().toPath().resolve("data").resolve(mapId);
818-
if (!Files.isDirectory(mapFolder)) {
819-
source.sendMessage(Text.of(TextColor.RED, "There is no map-data to purge for the map-id '" + mapId + "'!"));
820-
return;
821-
}
822-
823-
Optional<BmMap> optMap = parseMap(mapId);
824-
825822
// delete map
826-
MapPurgeTask purgeTask;
827-
if (optMap.isPresent()){
828-
purgeTask = new MapPurgeTask(optMap.get());
829-
} else {
830-
purgeTask = new MapPurgeTask(mapFolder);
831-
}
823+
MapPurgeTask purgeTask = MapPurgeTask.create(map);
832824

833825
plugin.getRenderManager().scheduleRenderTaskNext(purgeTask);
834-
source.sendMessage(Text.of(TextColor.GREEN, "Created new Task to purge map '" + mapId + "'"));
826+
source.sendMessage(Text.of(TextColor.GREEN, "Created new Task to purge map '" + map.getId() + "'"));
835827

836-
// if map is loaded, reset it and start updating it after the purge
837-
if (optMap.isPresent()) {
838-
RenderTask updateTask = new MapUpdateTask(optMap.get());
839-
plugin.getRenderManager().scheduleRenderTask(updateTask);
840-
source.sendMessage(Text.of(TextColor.GREEN, "Created new Update-Task for map '" + mapId + "'"));
841-
source.sendMessage(Text.of(TextColor.GRAY, "If you don't want to render this map again, you need to remove it from your configuration first!"));
842-
}
828+
// reset the map and start updating it after the purge
829+
RenderTask updateTask = new MapUpdateTask(map);
830+
plugin.getRenderManager().scheduleRenderTask(updateTask);
831+
source.sendMessage(Text.of(TextColor.GREEN, "Created new Update-Task for map '" + map.getId() + "'"));
832+
source.sendMessage(Text.of(TextColor.GRAY, "If you don't this map to render again after the purge, use ",
833+
TextColor.DARK_GRAY, "/bluemap freeze " + map.getId(), TextColor.GRAY, " first!"));
843834

844835
source.sendMessage(Text.of(TextColor.GREEN, "Use ", TextColor.GRAY, "/bluemap", TextColor.GREEN, " to see the progress."));
845836
} catch (IOException | IllegalArgumentException e) {
846-
source.sendMessage(Text.of(TextColor.RED, "There was an error trying to purge '" + mapId + "', see console for details."));
847-
Logger.global.logError("Failed to purge map '" + mapId + "'!", e);
837+
source.sendMessage(Text.of(TextColor.RED, "There was an error trying to purge '" + map.getId() + "', see console for details."));
838+
Logger.global.logError("Failed to purge map '" + map.getId() + "'!", e);
848839
}
849840
}).start();
850841

BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapPurgeTask.java

Lines changed: 146 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -26,96 +26,179 @@
2626

2727
import de.bluecolored.bluemap.core.debug.DebugDump;
2828
import de.bluecolored.bluemap.core.map.BmMap;
29+
import de.bluecolored.bluemap.core.storage.FileStorage;
30+
import de.bluecolored.bluemap.core.storage.Storage;
2931
import de.bluecolored.bluemap.core.util.FileUtils;
3032

3133
import java.io.IOException;
3234
import java.nio.file.Files;
3335
import java.nio.file.Path;
3436
import java.util.LinkedList;
37+
import java.util.Objects;
3538
import java.util.stream.Collectors;
3639

37-
public class MapPurgeTask implements RenderTask {
40+
public abstract class MapPurgeTask implements RenderTask {
3841

39-
@DebugDump private final BmMap map;
40-
@DebugDump private final Path directory;
41-
@DebugDump private final int subFilesCount;
42-
private final LinkedList<Path> subFiles;
43-
44-
@DebugDump private volatile boolean hasMoreWork;
45-
@DebugDump private volatile boolean cancelled;
46-
47-
public MapPurgeTask(Path mapDirectory) throws IOException {
48-
this(null, mapDirectory);
42+
public static MapPurgeTask create(BmMap map) throws IOException {
43+
Storage storage = map.getStorage();
44+
if (storage instanceof FileStorage) {
45+
return new MapFilePurgeTask(map, (FileStorage) storage);
46+
} else {
47+
return new MapStoragePurgeTask(map);
48+
}
4949
}
5050

51-
public MapPurgeTask(BmMap map) throws IOException {
52-
this(map, map.getFileRoot());
51+
public static MapPurgeTask create(Path mapDirectory) throws IOException {
52+
return new MapFilePurgeTask(mapDirectory);
5353
}
5454

55-
private MapPurgeTask(BmMap map, Path directory) throws IOException {
56-
this.map = map;
57-
this.directory = directory;
58-
this.subFiles = Files.walk(directory, 3)
59-
.collect(Collectors.toCollection(LinkedList::new));
60-
this.subFilesCount = subFiles.size();
61-
this.hasMoreWork = true;
62-
this.cancelled = false;
63-
}
55+
@DebugDump
56+
private static class MapFilePurgeTask extends MapPurgeTask {
6457

65-
@Override
66-
public void doWork() throws Exception {
67-
synchronized (this) {
68-
if (!this.hasMoreWork) return;
69-
this.hasMoreWork = false;
58+
private final BmMap map;
59+
private final Path directory;
60+
private final int subFilesCount;
61+
private final LinkedList<Path> subFiles;
62+
63+
private volatile boolean hasMoreWork;
64+
private volatile boolean cancelled;
65+
66+
public MapFilePurgeTask(Path mapDirectory) throws IOException {
67+
this(null, mapDirectory);
68+
}
69+
70+
public MapFilePurgeTask(BmMap map, FileStorage fileStorage) throws IOException {
71+
this(map, fileStorage.getFilePath(map.getId()));
7072
}
7173

72-
try {
73-
// delete subFiles first to be able to track the progress and cancel
74-
while (!subFiles.isEmpty()) {
75-
Path subFile = subFiles.getLast();
76-
FileUtils.delete(subFile.toFile());
77-
subFiles.removeLast();
78-
if (this.cancelled) return;
74+
private MapFilePurgeTask(BmMap map, Path directory) throws IOException {
75+
this.map = map;
76+
this.directory = directory;
77+
this.subFiles = Files.walk(directory, 3)
78+
.collect(Collectors.toCollection(LinkedList::new));
79+
this.subFilesCount = subFiles.size();
80+
this.hasMoreWork = true;
81+
this.cancelled = false;
82+
}
83+
84+
@Override
85+
public void doWork() throws Exception {
86+
synchronized (this) {
87+
if (!this.hasMoreWork) return;
88+
this.hasMoreWork = false;
7989
}
8090

81-
// make sure everything is deleted
82-
FileUtils.delete(directory.toFile());
83-
} finally {
84-
// reset map render state
85-
if (this.map != null) {
86-
this.map.getRenderState().reset();
91+
try {
92+
// delete subFiles first to be able to track the progress and cancel
93+
while (!subFiles.isEmpty()) {
94+
Path subFile = subFiles.getLast();
95+
FileUtils.delete(subFile.toFile());
96+
subFiles.removeLast();
97+
if (this.cancelled) return;
98+
}
99+
100+
// make sure everything is deleted
101+
FileUtils.delete(directory.toFile());
102+
} finally {
103+
// reset map render state
104+
if (this.map != null) {
105+
this.map.getRenderState().reset();
106+
}
87107
}
88108
}
89-
}
90109

91-
@Override
92-
public boolean hasMoreWork() {
93-
return this.hasMoreWork;
94-
}
110+
@Override
111+
public boolean hasMoreWork() {
112+
return this.hasMoreWork;
113+
}
95114

96-
@Override
97-
public double estimateProgress() {
98-
return 1d - (subFiles.size() / (double) subFilesCount);
99-
}
115+
@Override
116+
@DebugDump
117+
public double estimateProgress() {
118+
return 1d - (subFiles.size() / (double) subFilesCount);
119+
}
100120

101-
@Override
102-
public void cancel() {
103-
this.cancelled = true;
104-
}
121+
@Override
122+
public void cancel() {
123+
this.cancelled = true;
124+
}
105125

106-
@Override
107-
public boolean contains(RenderTask task) {
108-
if (task == this) return true;
109-
if (task instanceof MapPurgeTask) {
110-
return ((MapPurgeTask) task).directory.toAbsolutePath().normalize().startsWith(this.directory.toAbsolutePath().normalize());
126+
@Override
127+
public boolean contains(RenderTask task) {
128+
if (task == this) return true;
129+
if (task instanceof MapFilePurgeTask) {
130+
return ((MapFilePurgeTask) task).directory.toAbsolutePath().normalize()
131+
.startsWith(this.directory.toAbsolutePath().normalize());
132+
}
133+
134+
return false;
135+
}
136+
137+
@Override
138+
public String getDescription() {
139+
return "Purge Map " + directory.getFileName();
111140
}
112141

113-
return false;
114142
}
115143

116-
@Override
117-
public String getDescription() {
118-
return "Purge Map " + directory.getFileName();
144+
@DebugDump
145+
private static class MapStoragePurgeTask extends MapPurgeTask {
146+
147+
private final BmMap map;
148+
149+
private volatile boolean hasMoreWork;
150+
151+
public MapStoragePurgeTask(BmMap map) {
152+
this.map = Objects.requireNonNull(map);
153+
this.hasMoreWork = true;
154+
}
155+
156+
@Override
157+
public void doWork() throws Exception {
158+
synchronized (this) {
159+
if (!this.hasMoreWork) return;
160+
this.hasMoreWork = false;
161+
}
162+
163+
try {
164+
map.getStorage().purgeMap(map.getId());
165+
} finally {
166+
// reset map render state
167+
map.getRenderState().reset();
168+
}
169+
}
170+
171+
@Override
172+
public boolean hasMoreWork() {
173+
return this.hasMoreWork;
174+
}
175+
176+
@Override
177+
@DebugDump
178+
public double estimateProgress() {
179+
return 0d;
180+
}
181+
182+
@Override
183+
public void cancel() {
184+
this.hasMoreWork = false;
185+
}
186+
187+
@Override
188+
public boolean contains(RenderTask task) {
189+
if (task == this) return true;
190+
if (task instanceof MapStoragePurgeTask) {
191+
return map.equals(((MapStoragePurgeTask) task).map);
192+
}
193+
194+
return false;
195+
}
196+
197+
@Override
198+
public String getDescription() {
199+
return "Purge Map " + map.getId();
200+
}
201+
119202
}
120203

121-
}
204+
}

0 commit comments

Comments
 (0)