diff options
| author | 2018-07-10 21:18:54 +0800 | |
|---|---|---|
| committer | 2018-07-10 21:18:54 +0800 | |
| commit | 0809cffbade803caa34ad99f5409997f50d57b8b (patch) | |
| tree | a4fa172e6e22495848b9eb7693a868aa59cf43c0 /src/main/java/cuchaz | |
| parent | fix giving obf classes a name not removing them from the panel (diff) | |
| download | enigma-0809cffbade803caa34ad99f5409997f50d57b8b.tar.gz enigma-0809cffbade803caa34ad99f5409997f50d57b8b.tar.xz enigma-0809cffbade803caa34ad99f5409997f50d57b8b.zip | |
buffer the ParsedJar class entry inputstream, allow use with a jarinputstream
Diffstat (limited to 'src/main/java/cuchaz')
| -rw-r--r-- | src/main/java/cuchaz/enigma/analysis/ParsedJar.java | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/main/java/cuchaz/enigma/analysis/ParsedJar.java b/src/main/java/cuchaz/enigma/analysis/ParsedJar.java index fae58f80..55f2141b 100644 --- a/src/main/java/cuchaz/enigma/analysis/ParsedJar.java +++ b/src/main/java/cuchaz/enigma/analysis/ParsedJar.java | |||
| @@ -15,12 +15,14 @@ import cuchaz.enigma.mapping.entry.ClassEntry; | |||
| 15 | import org.objectweb.asm.ClassReader; | 15 | import org.objectweb.asm.ClassReader; |
| 16 | import org.objectweb.asm.tree.ClassNode; | 16 | import org.objectweb.asm.tree.ClassNode; |
| 17 | 17 | ||
| 18 | import java.io.BufferedInputStream; | ||
| 18 | import java.io.IOException; | 19 | import java.io.IOException; |
| 19 | import java.io.InputStream; | 20 | import java.io.InputStream; |
| 20 | import java.util.*; | 21 | import java.util.*; |
| 21 | import java.util.function.Consumer; | 22 | import java.util.function.Consumer; |
| 22 | import java.util.jar.JarEntry; | 23 | import java.util.jar.JarEntry; |
| 23 | import java.util.jar.JarFile; | 24 | import java.util.jar.JarFile; |
| 25 | import java.util.jar.JarInputStream; | ||
| 24 | 26 | ||
| 25 | public class ParsedJar { | 27 | public class ParsedJar { |
| 26 | private final Map<String, ClassNode> nodes = new LinkedHashMap<>(); | 28 | private final Map<String, ClassNode> nodes = new LinkedHashMap<>(); |
| @@ -33,7 +35,7 @@ public class ParsedJar { | |||
| 33 | JarEntry entry = entries.nextElement(); | 35 | JarEntry entry = entries.nextElement(); |
| 34 | // is this a class file? | 36 | // is this a class file? |
| 35 | if (entry.getName().endsWith(".class")) { | 37 | if (entry.getName().endsWith(".class")) { |
| 36 | try (InputStream input = jar.getInputStream(entry)) { | 38 | try (InputStream input = new BufferedInputStream(jar.getInputStream(entry))) { |
| 37 | // read the ClassNode from the jar | 39 | // read the ClassNode from the jar |
| 38 | ClassReader reader = new ClassReader(input); | 40 | ClassReader reader = new ClassReader(input); |
| 39 | ClassNode node = new ClassNode(); | 41 | ClassNode node = new ClassNode(); |
| @@ -48,6 +50,27 @@ public class ParsedJar { | |||
| 48 | } | 50 | } |
| 49 | } | 51 | } |
| 50 | 52 | ||
| 53 | public ParsedJar(JarInputStream jar) throws IOException { | ||
| 54 | try { | ||
| 55 | // get the jar entries that correspond to classes | ||
| 56 | JarEntry entry; | ||
| 57 | while ((entry = jar.getNextJarEntry()) != null) { | ||
| 58 | // is this a class file? | ||
| 59 | if (entry.getName().endsWith(".class")) { | ||
| 60 | // read the ClassNode from the jar | ||
| 61 | ClassReader reader = new ClassReader(jar); | ||
| 62 | ClassNode node = new ClassNode(); | ||
| 63 | reader.accept(node, 0); | ||
| 64 | String path = entry.getName().substring(0, entry.getName().length() - ".class".length()); | ||
| 65 | nodes.put(path, node); | ||
| 66 | jar.closeEntry(); | ||
| 67 | } | ||
| 68 | } | ||
| 69 | } finally { | ||
| 70 | jar.close(); | ||
| 71 | } | ||
| 72 | } | ||
| 73 | |||
| 51 | public void visit(Consumer<ClassNode> visitor) { | 74 | public void visit(Consumer<ClassNode> visitor) { |
| 52 | for (ClassNode node : nodes.values()) { | 75 | for (ClassNode node : nodes.values()) { |
| 53 | visitor.accept(node); | 76 | visitor.accept(node); |