Implement rest of PlotRegionBackups

This commit is contained in:
2026-03-16 17:32:04 +01:00
parent 24029b795c
commit 824e0d7b6b
6 changed files with 112 additions and 56 deletions
@@ -50,7 +50,7 @@ public class DynamicRegionCommand extends SWCommand {
// Check location!
Class<? extends DynamicRegion> regionClass = DynamicRegionSystem.identifierDataMap.get(regionType);
Class<? extends DynamicRegion> regionClass = DynamicRegionSystem.getRegionClassByIdentifier(regionType);
DynamicRegion dynamicRegion = DynamicRegionRepository.constructRegion(regionClass, UUID.randomUUID(), tile.getMinX(), tile.getMinZ());
if (dynamicRegion == null) {
// TODO: Give error to user
@@ -73,7 +73,7 @@ public class DynamicRegionCommand extends SWCommand {
return new TypeMapper<>() {
@Override
public String map(CommandSender commandSender, String[] previousArguments, String s) {
if (DynamicRegionSystem.identifierDataMap.containsKey(s)) {
if (DynamicRegionSystem.hasRegionClassForIdentifier(s)) {
return s;
} else {
return null;
@@ -82,7 +82,7 @@ public class DynamicRegionCommand extends SWCommand {
@Override
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
return DynamicRegionSystem.identifierDataMap.keySet();
return DynamicRegionSystem.allRegionIdentifiers();
}
};
}
@@ -62,8 +62,24 @@ public class DynamicRegionSystem implements RegionSystem {
regionTypeMap.getOrDefault(region.getType(), Collections.emptySet()).remove(region);
}
public static Map<Class<? extends DynamicRegion>, RegionConstructorData> constructorDataMap = new HashMap<>();
public static Map<String, Class<? extends DynamicRegion>> identifierDataMap = new HashMap<>();
private static Map<Class<? extends DynamicRegion>, RegionConstructorData> constructorDataMap = new HashMap<>();
private static Map<String, Class<? extends DynamicRegion>> identifierDataMap = new HashMap<>();
public static RegionConstructorData getRegionConstructorByRegionClass(Class<?> regionClass) {
return constructorDataMap.get(regionClass);
}
public static Class<? extends DynamicRegion> getRegionClassByIdentifier(String identifier) {
return identifierDataMap.get(identifier);
}
public static boolean hasRegionClassForIdentifier(String identifier) {
return identifierDataMap.containsKey(identifier);
}
public static Set<String> allRegionIdentifiers() {
return Collections.unmodifiableSet(identifierDataMap.keySet());
}
@Override
public void load() {
@@ -132,7 +132,7 @@ public class DynamicRegionRepository {
}
// TODO: Maybe add static method to DynamicRegionSystem
Class<? extends DynamicRegion> regionClass = DynamicRegionSystem.identifierDataMap.get(identifier);
Class<? extends DynamicRegion> regionClass = DynamicRegionSystem.getRegionClassByIdentifier(identifier);
if (regionClass == null) {
RegionSystem.LOGGER.log(Level.SEVERE, "Failed to read region metadata file (region no longer exists)");
continue;
@@ -172,20 +172,28 @@ public class DynamicRegionRepository {
}
}
public static File getRegionDirectory(Region region) {
return new File(REGION_DATA_FOLDER, region.getID().toString());
}
public static File getBackupsTypeDirectory(Region region, RegionBackups.BackupType backupType) {
File regionDirectory = getRegionDirectory(region);
File backupsDirectory = new File(regionDirectory, BACKUPS_DIR_NAME);
return new File(backupsDirectory, backupType.name());
}
public static File getBackupDirectory(Region region, RegionBackups.Backup backup) {
return new File(getBackupsTypeDirectory(region, backup.getType()), backup.getName());
}
public static void loadRegionData(Region region, RegionData regionData) {
File regionDirectory = new File(REGION_DATA_FOLDER, region.getID().toString());
File regionDirectory = getRegionDirectory(region);
if (!regionDirectory.exists()) return;
loadRegionData(regionDirectory, regionData);
}
public static void loadRegionData(Region region, RegionBackups.Backup backup, RegionData regionData) {
File regionDirectory = new File(REGION_DATA_FOLDER, region.getID().toString());
if (!regionDirectory.exists()) return;
File backupsDirectory = new File(regionDirectory, BACKUPS_DIR_NAME);
if (!backupsDirectory.exists()) return;
File backupsTypeDirectory = new File(backupsDirectory, backup.getType().name());
if (!backupsTypeDirectory.exists()) return;
File backupDirectory = new File(backupsTypeDirectory, backup.getName());
File backupDirectory = getBackupDirectory(region, backup);
if (!backupDirectory.exists()) return;
loadRegionData(backupDirectory, regionData);
}
@@ -234,7 +242,7 @@ public class DynamicRegionRepository {
}
if (!region.getType().isGlobal()) {
RegionConstructorData constructorData = DynamicRegionSystem.constructorDataMap.get(region.getClass());
RegionConstructorData constructorData = DynamicRegionSystem.getRegionConstructorByRegionClass(region.getClass());
Point point = region.getArea().getMinPoint(false);
Tile tile = Tile.fromPoint(point).get();
@@ -242,7 +250,14 @@ public class DynamicRegionRepository {
}
writeFlagsFile(regionDirectory, region.getRegionData());
// TODO: Write backups -> Directly on create!
}
public static void saveBackup(Region region, RegionBackups.Backup backup) {
File backupDirectory = getBackupDirectory(region, backup);
if (!backupDirectory.exists()) {
backupDirectory.mkdirs();
}
writeFlagsFile(backupDirectory, backup.getRegionData());
}
@SneakyThrows
@@ -261,8 +276,8 @@ public class DynamicRegionRepository {
}
@SneakyThrows
private static void writeFlagsFile(File regionDirectory, RegionData regionData) {
JsonWriter jsonWriter = new JsonWriter(new FileWriter(new File(regionDirectory, FLAG_FILE_NAME)));
private static void writeFlagsFile(File directory, RegionData regionData) {
JsonWriter jsonWriter = new JsonWriter(new FileWriter(new File(directory, FLAG_FILE_NAME)));
jsonWriter.setIndent(" ");
jsonWriter.beginObject();
@@ -285,12 +300,15 @@ public class DynamicRegionRepository {
}
public static void deleteRegion(Region region) {
File regionDirectory = new File(REGION_DATA_FOLDER, region.getID().toString());
deleteDir(regionDirectory);
deleteDir(getRegionDirectory(region));
}
public static void deleteBackup(Region region, RegionBackups.Backup backup) {
deleteDir(getBackupDirectory(region, backup));
}
@SneakyThrows
public static void deleteDir(File file) {
private static void deleteDir(File file) {
Files.walkFileTree(file.toPath(), new SimpleFileVisitor<>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
@@ -20,17 +20,25 @@
package de.steamwar.bausystem.region.dynamic.modes;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter;
import de.steamwar.bausystem.region.RegionBackups;
import de.steamwar.bausystem.region.RegionData;
import de.steamwar.bausystem.region.dynamic.DynamicRegion;
import de.steamwar.bausystem.region.dynamic.DynamicRegionRepository;
import de.steamwar.bausystem.region.dynamic.PasteUtils;
import lombok.NonNull;
import org.bukkit.Bukkit;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.*;
import java.util.function.Function;
import java.util.logging.Level;
public class PlotRegionBackups implements RegionBackups {
@@ -46,7 +54,18 @@ public class PlotRegionBackups implements RegionBackups {
this.region = region;
this.regionDataConstructor = regionDataConstructor;
// DynamicRegionRepository.loadRegionData();
// Load all Backups of the Region
for (BackupType backupType : BackupType.values()) {
File backupsTypeDirectory = DynamicRegionRepository.getBackupsTypeDirectory(region, backupType);
if (!backupsTypeDirectory.exists()) continue;
File[] backupsDirectory = backupsTypeDirectory.listFiles();
if (backupsDirectory == null) continue;
List<Backup> backupList = backups.computeIfAbsent(backupType, __ -> new ArrayList<>());
for (File backupDirectory : backupsDirectory) {
backupList.add(new BackupImpl(backupType, region, backupDirectory));
}
}
}
@Override
@@ -60,11 +79,8 @@ public class PlotRegionBackups implements RegionBackups {
}
// Create backup and save!
Backup backup = new BackupImpl(this, backupType, "", regionDataConstructor, region);
// Create schematic and stuff?
backup.save();
Backup backup = new BackupImpl(backupType, region);
backupList.add(backup);
return Optional.of(backup);
}
@@ -90,20 +106,34 @@ public class PlotRegionBackups implements RegionBackups {
private static final String SCHEM_FILE = "backup.schem";
private final PlotRegionBackups parent;
private final File folder;
private final DynamicRegion region;
public BackupImpl(PlotRegionBackups parent, @NonNull BackupType type, @NonNull String name, @NonNull Function<Backup, RegionData> regionDataConstructor, DynamicRegion region) {
super(type, name, regionDataConstructor);
this.parent = parent;
folder = new File("");
public BackupImpl(@NonNull BackupType type, DynamicRegion region) {
super(type, LocalDateTime.now().format(FORMATTER), regionDataConstructor);
region.getRegionData().copyInto(regionData);
this.region = region;
File backupDirectory = DynamicRegionRepository.getBackupDirectory(region, this);
backupDirectory.mkdirs();
DynamicRegionRepository.saveBackup(region, this);
Clipboard clipboard = region.getArea().copy(false);
try (ClipboardWriter writer = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(new FileOutputStream(new File(backupDirectory, SCHEM_FILE)))) {
writer.write(clipboard);
} catch (IOException e) {
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
}
}
public BackupImpl(@NonNull BackupType type, DynamicRegion region, File backupDirectory) {
super(type, backupDirectory.getName(), regionDataConstructor);
this.region = region;
DynamicRegionRepository.loadRegionData(region, this, regionData);
}
@Override
public boolean load() {
File file = new File(folder, SCHEM_FILE);
File file = new File(DynamicRegionRepository.getBackupDirectory(region, this), SCHEM_FILE);
if (!file.exists()) return false;
EditSession editSession = PasteUtils.paste(file, region.getArea().getMinPoint(false), 0);
if (editSession == null) return false;
@@ -114,24 +144,14 @@ public class PlotRegionBackups implements RegionBackups {
@Override
public long getCreationTime() {
throw new UnsupportedOperationException();
return DynamicRegionRepository.getBackupDirectory(region, this).lastModified();
}
@Override
public void delete() {
parent.backups.getOrDefault(type, Collections.emptyList())
backups.getOrDefault(type, Collections.emptyList())
.remove(this);
DynamicRegionRepository.deleteDir(folder);
}
@Override
public void save() {
throw new UnsupportedOperationException();
}
@Override
public void load(RegionData regionData) {
throw new UnsupportedOperationException();
DynamicRegionRepository.deleteBackup(region, this);
}
}
}