Synchronized JarUtil ClassWriters
This should be re-evaluated, it's most likely not needed and it will slow down multi-pane decompilation An alternative solution is generating the ClassNode List once, then storing it in a cache that can be quickly saved to disk. If a new file gets added regenerate the cache.
This commit is contained in:
parent
854c4d622c
commit
c0eb9e944e
1 changed files with 35 additions and 23 deletions
|
@ -17,7 +17,6 @@ import java.util.zip.ZipInputStream;
|
||||||
import me.konloch.kontainer.io.DiskWriter;
|
import me.konloch.kontainer.io.DiskWriter;
|
||||||
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
|
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
|
||||||
import org.apache.commons.compress.archivers.zip.ZipFile;
|
import org.apache.commons.compress.archivers.zip.ZipFile;
|
||||||
import org.objectweb.asm.ClassReader;
|
|
||||||
import org.objectweb.asm.ClassWriter;
|
import org.objectweb.asm.ClassWriter;
|
||||||
import org.objectweb.asm.tree.ClassNode;
|
import org.objectweb.asm.tree.ClassNode;
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
@ -51,7 +50,9 @@ import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
* @since 09/26/2011
|
* @since 09/26/2011
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class JarUtils {
|
public class JarUtils
|
||||||
|
{
|
||||||
|
public static Object LOCK = new Object();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads the classes and resources from the input jar file
|
* Loads the classes and resources from the input jar file
|
||||||
|
@ -245,8 +246,11 @@ public class JarUtils {
|
||||||
* @return the ClassNode instance
|
* @return the ClassNode instance
|
||||||
*/
|
*/
|
||||||
public static ClassNode getNode(final byte[] bytez) {
|
public static ClassNode getNode(final byte[] bytez) {
|
||||||
|
synchronized (LOCK)
|
||||||
|
{
|
||||||
return ASMUtil.getClassNode(bytez);
|
return ASMUtil.getClassNode(bytez);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saves as jar with manifest
|
* Saves as jar with manifest
|
||||||
|
@ -296,16 +300,21 @@ public class JarUtils {
|
||||||
* @param path the exact jar output path
|
* @param path the exact jar output path
|
||||||
*/
|
*/
|
||||||
public static void saveAsJarClassesOnly(ArrayList<ClassNode> nodeList, String path) {
|
public static void saveAsJarClassesOnly(ArrayList<ClassNode> nodeList, String path) {
|
||||||
try {
|
synchronized (LOCK)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
JarOutputStream out = new JarOutputStream(new FileOutputStream(path));
|
JarOutputStream out = new JarOutputStream(new FileOutputStream(path));
|
||||||
ArrayList<String> noDupe = new ArrayList<>();
|
ArrayList<String> noDupe = new ArrayList<>();
|
||||||
for (ClassNode cn : nodeList) {
|
for (ClassNode cn : nodeList)
|
||||||
|
{
|
||||||
ClassWriter cw = new ClassWriter(0);
|
ClassWriter cw = new ClassWriter(0);
|
||||||
cn.accept(cw);
|
cn.accept(cw);
|
||||||
|
|
||||||
String name = cn.name + ".class";
|
String name = cn.name + ".class";
|
||||||
|
|
||||||
if (!noDupe.contains(name)) {
|
if (!noDupe.contains(name))
|
||||||
|
{
|
||||||
noDupe.add(name);
|
noDupe.add(name);
|
||||||
out.putNextEntry(new ZipEntry(name));
|
out.putNextEntry(new ZipEntry(name));
|
||||||
out.write(cw.toByteArray());
|
out.write(cw.toByteArray());
|
||||||
|
@ -315,10 +324,13 @@ public class JarUtils {
|
||||||
|
|
||||||
noDupe.clear();
|
noDupe.clear();
|
||||||
out.close();
|
out.close();
|
||||||
} catch (IOException e) {
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saves a jar without the manifest
|
* Saves a jar without the manifest
|
||||||
|
|
Loading…
Reference in a new issue