summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java
diff options
context:
space:
mode:
authorGravatar Thog2017-03-24 01:28:34 +0100
committerGravatar Thog2017-03-24 01:28:34 +0100
commitf829582ae418504ff6685eeb14fad5a67916c6f9 (patch)
treebdcfebffe3f0618e06552dc59b7d1cef0b541dae /src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java
parentFix var naming and locals var index issues (diff)
downloadenigma-fork-f829582ae418504ff6685eeb14fad5a67916c6f9.tar.gz
enigma-fork-f829582ae418504ff6685eeb14fad5a67916c6f9.tar.xz
enigma-fork-f829582ae418504ff6685eeb14fad5a67916c6f9.zip
Implement experimental Tiny mappings loader
~ This will need some tests and more security checks
Diffstat (limited to 'src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java')
-rw-r--r--src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java b/src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java
new file mode 100644
index 0000000..b2ba191
--- /dev/null
+++ b/src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java
@@ -0,0 +1,99 @@
1package cuchaz.enigma.mapping;
2
3import com.google.common.base.Charsets;
4import com.google.common.collect.Maps;
5import cuchaz.enigma.throwables.MappingConflict;
6import cuchaz.enigma.throwables.MappingParseException;
7
8import java.io.File;
9import java.io.IOException;
10import java.nio.file.Files;
11import java.util.ArrayList;
12import java.util.List;
13import java.util.Map;
14
15public class MappingsTinyReader {
16 public ClassMapping readClass(String[] parts) {
17 // Extract the inner naming of the deob form if it have one
18 String deobName = parts[2].contains("$") ? parts[2].substring(parts[2].lastIndexOf('$') + 1) : parts[2];
19 return new ClassMapping(parts[1], deobName).setDeobInner(parts[2]);
20 }
21
22 public FieldMapping readField(String[] parts) {
23 return new FieldMapping(parts[3], new Type(parts[2]), parts[4], Mappings.EntryModifier.UNCHANGED);
24 }
25
26 public MethodMapping readMethod(String[] parts) {
27 return new MethodMapping(parts[3], new Signature(parts[2]), parts[4]);
28 }
29
30 public Mappings read(File file) throws IOException, MappingParseException {
31 Mappings mappings = new Mappings(Mappings.FormatType.TINY_FILE);
32 System.out.println(file);
33 List<String> lines = Files.readAllLines(file.toPath(), Charsets.UTF_8);
34 Map<String, ClassMapping> classMappingMap = Maps.newHashMap();
35 String header = lines.remove(0);
36 for (int lineNumber = 0; lineNumber < lines.size(); lineNumber++) {
37 String line = lines.get(lineNumber);
38 String[] parts = line.split("\\s");
39 try {
40 String token = parts[0];
41 ClassMapping classMapping;
42 switch (token) {
43 case "CLASS":
44 if (classMappingMap.containsKey(parts[1])) {
45 classMapping = classMappingMap.get(parts[1]);
46 String deobName = parts[2].contains("$") ?
47 parts[2].substring(parts[2].lastIndexOf('$') + 1) :
48 parts[2];
49 classMappingMap.put(parts[2], classMapping.setDeobInner(parts[2]));
50 classMapping.setDeobfName(deobName);
51 classMapping.resetDirty();
52 } else
53 classMapping = readClass(parts);
54 classMappingMap.put(parts[1], classMapping);
55 break;
56 case "FIELD":
57 classMapping = classMappingMap.computeIfAbsent(parts[1], k -> new ClassMapping(parts[1]));
58 //throw new MappingParseException(file, lineNumber, "Cannot find class '" + parts[1] + "' declaration!");
59 classMapping.addFieldMapping(readField(parts));
60 break;
61 case "METHOD":
62 classMapping = classMappingMap.computeIfAbsent(parts[1], k -> new ClassMapping(parts[1]));
63 //throw new MappingParseException(file, lineNumber, "Cannot find class '" + parts[1] + "' declaration!");
64 classMapping.addMethodMapping(readMethod(parts));
65 break;
66 default:
67 throw new MappingParseException(file, lineNumber, "Unknown token '" + token + "' !");
68 }
69 } catch (ArrayIndexOutOfBoundsException | IllegalArgumentException ex) {
70 throw new MappingParseException(file, lineNumber, "Malformed line:\n" + line);
71 }
72 }
73
74 List<ClassMapping> toRegister = new ArrayList<>(classMappingMap.values());
75 for (ClassMapping classMapping : toRegister) {
76 ClassEntry obEntry = classMapping.getObfEntry();
77 ClassEntry deobEntry = classMapping.getDeObfEntry();
78 try {
79 if (obEntry.isInnerClass()) {
80 ClassMapping parent = classMappingMap.get(obEntry.getOuterClassName());
81 if (parent == null) {
82 parent = new ClassMapping(obEntry.getOuterClassName());
83 classMappingMap.put(obEntry.getOuterClassName(), parent);
84 mappings.addClassMapping(parent);
85 }
86 parent.addInnerClassMapping(classMapping);
87 } else if (deobEntry != null && deobEntry.isInnerClass())
88 classMappingMap.get(deobEntry.getOuterClassName()).addInnerClassMapping(classMapping);
89 else
90 mappings.addClassMapping(classMapping);
91 } catch (MappingConflict e) {
92 throw new MappingParseException(file, -1, e.getMessage());
93 }
94 }
95 lines.clear();
96 classMappingMap.clear();
97 return mappings;
98 }
99}