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--- src/main/java/cuchaz/enigma/Main.java | 4 ++++ src/main/java/cuchaz/enigma/command/Command.java | 4 ++++ .../enigma/command/MapSpecializedMethodsCommand.java | 10 ++++++---- .../java/cuchaz/enigma/command/MappingCommandsUtil.java | 3 ++- .../translation/mapping/serde/EnigmaMappingsReader.java | 10 ++++++++++ .../translation/mapping/serde/EnigmaMappingsWriter.java | 17 +++++++++++++++++ .../enigma/translation/mapping/serde/MappingFormat.java | 1 + src/main/java/cuchaz/enigma/utils/Utils.java | 2 +- src/main/resources/lang/en_us.json | 1 + 9 files changed, 46 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/main/java/cuchaz/enigma/Main.java b/src/main/java/cuchaz/enigma/Main.java index ceb5554..1d63ec1 100644 --- a/src/main/java/cuchaz/enigma/Main.java +++ b/src/main/java/cuchaz/enigma/Main.java @@ -25,6 +25,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import com.google.common.io.MoreFiles; + public class Main { public static void main(String[] args) throws IOException { @@ -78,6 +80,8 @@ public class Main { Path mappingsPath = options.valueOf(mappings); if (Files.isDirectory(mappingsPath)) { controller.openMappings(MappingFormat.ENIGMA_DIRECTORY, mappingsPath); + } else if ("zip".equalsIgnoreCase(MoreFiles.getFileExtension(mappingsPath))) { + controller.openMappings(MappingFormat.ENIGMA_ZIP, mappingsPath); } else { controller.openMappings(MappingFormat.ENIGMA_FILE, mappingsPath); } diff --git a/src/main/java/cuchaz/enigma/command/Command.java b/src/main/java/cuchaz/enigma/command/Command.java index d53ed6e..09dd321 100644 --- a/src/main/java/cuchaz/enigma/command/Command.java +++ b/src/main/java/cuchaz/enigma/command/Command.java @@ -13,6 +13,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import com.google.common.io.MoreFiles; + public abstract class Command { public final String name; @@ -49,6 +51,8 @@ public abstract class Command { protected static MappingFormat chooseEnigmaFormat(Path path) { if (Files.isDirectory(path)) { return MappingFormat.ENIGMA_DIRECTORY; + } else if ("zip".equalsIgnoreCase(MoreFiles.getFileExtension(path))) { + return MappingFormat.ENIGMA_ZIP; } else { return MappingFormat.ENIGMA_FILE; } diff --git a/src/main/java/cuchaz/enigma/command/MapSpecializedMethodsCommand.java b/src/main/java/cuchaz/enigma/command/MapSpecializedMethodsCommand.java index 7696f0f..eb8d5dc 100644 --- a/src/main/java/cuchaz/enigma/command/MapSpecializedMethodsCommand.java +++ b/src/main/java/cuchaz/enigma/command/MapSpecializedMethodsCommand.java @@ -36,10 +36,13 @@ public class MapSpecializedMethodsCommand extends Command { @Override public void run(String... args) throws IOException, MappingParseException { + run(Paths.get(args[0]), args[1], Paths.get(args[2]), args[3], Paths.get(args[4])); + } + + public static void run(Path jar, String sourceFormat, Path sourcePath, String resultFormat, Path output) throws IOException, MappingParseException { MappingSaveParameters saveParameters = new MappingSaveParameters(MappingFileNameFormat.BY_DEOBF); - EntryTree source = MappingCommandsUtil.read(args[1], Paths.get(args[2]), saveParameters); + EntryTree source = MappingCommandsUtil.read(sourceFormat, sourcePath, saveParameters); EntryTree result = new HashEntryTree<>(); - Path jar = Paths.get(args[0]); ClassCache classCache = ClassCache.of(jar); JarIndex jarIndex = classCache.index(ProgressListener.none()); BridgeMethodIndex bridgeMethodIndex = jarIndex.getBridgeMethodIndex(); @@ -60,8 +63,7 @@ public class MapSpecializedMethodsCommand extends Command { result.insert(specialized, new EntryMapping(name)); } - Path output = Paths.get(args[4]); Utils.delete(output); - MappingCommandsUtil.write(result, args[3], output, saveParameters); + MappingCommandsUtil.write(result, resultFormat, output, saveParameters); } } diff --git a/src/main/java/cuchaz/enigma/command/MappingCommandsUtil.java b/src/main/java/cuchaz/enigma/command/MappingCommandsUtil.java index fc68edf..fc7afbc 100644 --- a/src/main/java/cuchaz/enigma/command/MappingCommandsUtil.java +++ b/src/main/java/cuchaz/enigma/command/MappingCommandsUtil.java @@ -17,6 +17,7 @@ import cuchaz.enigma.translation.representation.entry.FieldEntry; import cuchaz.enigma.translation.representation.entry.MethodEntry; import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; import java.util.HashSet; import java.util.Set; @@ -81,7 +82,7 @@ public final class MappingCommandsUtil { public static EntryTree read(String type, Path path, MappingSaveParameters saveParameters) throws MappingParseException, IOException { if (type.equals("enigma")) { - return EnigmaMappingsReader.DIRECTORY.read(path, ProgressListener.none(), saveParameters); + return (Files.isDirectory(path) ? EnigmaMappingsReader.DIRECTORY : EnigmaMappingsReader.ZIP).read(path, ProgressListener.none(), saveParameters); } if (type.equals("tiny")) { 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), diff --git a/src/main/java/cuchaz/enigma/utils/Utils.java b/src/main/java/cuchaz/enigma/utils/Utils.java index 3c3e68a..17f6fb8 100644 --- a/src/main/java/cuchaz/enigma/utils/Utils.java +++ b/src/main/java/cuchaz/enigma/utils/Utils.java @@ -101,7 +101,7 @@ public class Utils { } public static void delete(Path path) throws IOException { - if (path.toFile().exists()) { + if (Files.exists(path)) { for (Path p : Files.walk(path).sorted(Comparator.reverseOrder()).collect(Collectors.toList())) { Files.delete(p); } diff --git a/src/main/resources/lang/en_us.json b/src/main/resources/lang/en_us.json index 8cd5823..dbba198 100644 --- a/src/main/resources/lang/en_us.json +++ b/src/main/resources/lang/en_us.json @@ -3,6 +3,7 @@ "mapping_format.enigma_file": "Enigma File", "mapping_format.enigma_directory": "Enigma Directory", + "mapping_format.enigma_zip": "Enigma ZIP", "mapping_format.tiny_v2": "Tiny v2", "mapping_format.tiny_file": "Tiny File", "mapping_format.srg_file": "SRG File", -- cgit v1.2.3