From bfd7bfd739968af5b7bad17134783deedd424f1f Mon Sep 17 00:00:00 2001 From: Chocohead Date: Tue, 17 Mar 2020 23:28:47 +0000 Subject: Add support for reading/writing zipped mappings (#199) * Add support to read/write Enigma mappings from ZIP Takes any path which points to a ZIP as wanting to be read/written as a ZIP Paths from an existing ZIP file system will be correctly handled as directories * Fix deleting a path needing to be from the default file system * Allow calling MapSpecializedMethodsCommand directly * Fix indentation * Missing static--- .../translation/mapping/serde/EnigmaMappingsReader.java | 10 ++++++++++ .../translation/mapping/serde/EnigmaMappingsWriter.java | 17 +++++++++++++++++ .../enigma/translation/mapping/serde/MappingFormat.java | 1 + 3 files changed, 28 insertions(+) (limited to 'src/main/java/cuchaz/enigma/translation/mapping') diff --git a/src/main/java/cuchaz/enigma/translation/mapping/serde/EnigmaMappingsReader.java b/src/main/java/cuchaz/enigma/translation/mapping/serde/EnigmaMappingsReader.java index 60ce587..a1d5e01 100644 --- a/src/main/java/cuchaz/enigma/translation/mapping/serde/EnigmaMappingsReader.java +++ b/src/main/java/cuchaz/enigma/translation/mapping/serde/EnigmaMappingsReader.java @@ -16,6 +16,8 @@ import cuchaz.enigma.utils.I18n; import javax.annotation.Nullable; import java.io.IOException; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayDeque; @@ -62,6 +64,14 @@ public enum EnigmaMappingsReader implements MappingsReader { return mappings; } + }, + ZIP { + @Override + public EntryTree read(Path zip, ProgressListener progress, MappingSaveParameters saveParameters) throws MappingParseException, IOException { + try (FileSystem fs = FileSystems.newFileSystem(zip, (ClassLoader) null)) { + return DIRECTORY.read(fs.getPath("/"), progress, saveParameters); + } + } }; protected void readFile(Path path, EntryTree mappings) throws IOException, MappingParseException { diff --git a/src/main/java/cuchaz/enigma/translation/mapping/serde/EnigmaMappingsWriter.java b/src/main/java/cuchaz/enigma/translation/mapping/serde/EnigmaMappingsWriter.java index 2ce1234..2f6c7bc 100644 --- a/src/main/java/cuchaz/enigma/translation/mapping/serde/EnigmaMappingsWriter.java +++ b/src/main/java/cuchaz/enigma/translation/mapping/serde/EnigmaMappingsWriter.java @@ -13,12 +13,17 @@ package cuchaz.enigma.translation.mapping.serde; import java.io.IOException; import java.io.PrintWriter; +import java.net.URI; +import java.net.URISyntaxException; import java.nio.file.DirectoryStream; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -159,6 +164,18 @@ public enum EnigmaMappingsWriter implements MappingsWriter { private Path resolve(Path root, ClassEntry classEntry) { return root.resolve(classEntry.getFullName() + ".mapping"); } + }, + ZIP { + @Override + public void write(EntryTree mappings, MappingDelta delta, Path zip, ProgressListener progress, MappingSaveParameters saveParameters) { + try (FileSystem fs = FileSystems.newFileSystem(new URI("jar:file", null, zip.toUri().getPath(), ""), Collections.singletonMap("create", "true"))) { + DIRECTORY.write(mappings, delta, fs.getPath("/"), progress, saveParameters); + } catch (IOException e) { + e.printStackTrace(); + } catch (URISyntaxException e) { + throw new RuntimeException("Unexpected error creating URI for " + zip, e); + } + } }; protected void writeRoot(PrintWriter writer, EntryTree mappings, ClassEntry classEntry) { diff --git a/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java b/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java index c04eec5..6c8c343 100644 --- a/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java +++ b/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java @@ -14,6 +14,7 @@ import java.nio.file.Path; public enum MappingFormat { ENIGMA_FILE(EnigmaMappingsWriter.FILE, EnigmaMappingsReader.FILE), ENIGMA_DIRECTORY(EnigmaMappingsWriter.DIRECTORY, EnigmaMappingsReader.DIRECTORY), + ENIGMA_ZIP(EnigmaMappingsWriter.ZIP, EnigmaMappingsReader.ZIP), TINY_V2(new TinyV2Writer("intermediary", "named"), new TinyV2Reader()), TINY_FILE(TinyMappingsWriter.INSTANCE, TinyMappingsReader.INSTANCE), SRG_FILE(SrgMappingsWriter.INSTANCE, null), -- cgit v1.2.3