diff --git a/pom.xml b/pom.xml
index 0036fbb..5ee2728 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
GraxCode
JByteMod
- 1.8.0
+ 1.8.3
jar
UTF-8
diff --git a/src/main/java/me/grax/jbytemod/utils/task/LoadTask.java b/src/main/java/me/grax/jbytemod/utils/task/LoadTask.java
index c702ac3..8dbe470 100644
--- a/src/main/java/me/grax/jbytemod/utils/task/LoadTask.java
+++ b/src/main/java/me/grax/jbytemod/utils/task/LoadTask.java
@@ -99,6 +99,7 @@ private void readJar(JarFile jar, JarEntry en, Map classes, M
try {
final ClassNode cn = ASMUtils.getNode(bytes);
if (cn != null) { // && (cn.name.equals("java/lang/Object") ? true : cn.superName != null)
+ cn.innerPath = en.getName();
classes.put(cn.name, cn);
}
} catch (Exception e) {
diff --git a/src/main/java/me/grax/jbytemod/utils/task/SaveTask.java b/src/main/java/me/grax/jbytemod/utils/task/SaveTask.java
index 69e5add..846927f 100644
--- a/src/main/java/me/grax/jbytemod/utils/task/SaveTask.java
+++ b/src/main/java/me/grax/jbytemod/utils/task/SaveTask.java
@@ -1,19 +1,17 @@
package me.grax.jbytemod.utils.task;
-import java.io.File;
-import java.nio.file.Files;
-import java.util.List;
-import java.util.Map;
-
-import javax.swing.SwingWorker;
-
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.tree.ClassNode;
-
import me.grax.jbytemod.JByteMod;
import me.grax.jbytemod.JarArchive;
import me.grax.jbytemod.ui.PageEndPanel;
import me.lpk.util.JarUtils;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.tree.ClassNode;
+
+import javax.swing.*;
+import java.io.File;
+import java.nio.file.Files;
+import java.util.List;
+import java.util.Map;
public class SaveTask extends SwingWorker {
@@ -53,12 +51,17 @@ protected Void doInBackground() throws Exception {
ClassNode node = classes.get(s);
ClassWriter writer = new ClassWriter(flags);
node.accept(writer);
- outputBytes.put(s + ".class", writer.toByteArray());
- publish((int) ((i++ / size) * 50d));
+ String name;
+ if (node.innerPath != null && !node.innerPath.isEmpty()) {
+ name = node.innerPath;
+ } else {
+ name = s + ".class";
+ }
+ outputBytes.put(name, writer.toByteArray());
+ publish((int) ((i++ / size) * 20d));
}
- publish(50);
JByteMod.LOGGER.log("Saving..");
- JarUtils.saveAsJar(outputBytes, output.getAbsolutePath());
+ JarUtils.saveAsJar(outputBytes, output.getAbsolutePath(), process -> publish((int) (20d + process*80d)));
JByteMod.LOGGER.log("Saving successful!");
} catch (Exception e) {
e.printStackTrace();
diff --git a/src/main/java/me/lpk/util/JarUtils.java b/src/main/java/me/lpk/util/JarUtils.java
index f935ed9..084e206 100644
--- a/src/main/java/me/lpk/util/JarUtils.java
+++ b/src/main/java/me/lpk/util/JarUtils.java
@@ -1,5 +1,8 @@
package me.lpk.util;
+import org.apache.commons.io.IOUtils;
+import org.objectweb.asm.tree.ClassNode;
+
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -8,16 +11,15 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.function.Consumer;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.stream.Stream;
+import java.util.zip.CRC32;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
-import org.apache.commons.io.IOUtils;
-import org.objectweb.asm.tree.ClassNode;
-
public class JarUtils {
/**
* Creates a map of for a given jar file
@@ -125,13 +127,34 @@ public static Map loadNonClassEntries(File jarFile) throws IOExc
* @param fileName
*/
public static void saveAsJar(Map outBytes, String fileName) {
+ saveAsJar(outBytes, fileName, null);
+ }
+ public static void saveAsJar(Map outBytes, String fileName, Consumer progress) {
try {
JarOutputStream out = new JarOutputStream(new java.io.FileOutputStream(fileName));
+ double i = 1;
+ double size = outBytes.size();
for (String entry : outBytes.keySet()) {
- out.putNextEntry(new ZipEntry(entry));
- if (!entry.endsWith("/"))
+ JarEntry jarEntry = new JarEntry(entry);
+
+ if (entry.endsWith("/")) {
+ out.putNextEntry(jarEntry);
+ } else {
+ byte[] content = outBytes.get(entry);
+ if (entry.endsWith(".jar")) {
+ jarEntry.setMethod(JarEntry.STORED);
+ jarEntry.setSize(content.length);
+ jarEntry.setCompressedSize(content.length);
+ CRC32 crc32 = new CRC32();
+ crc32.update(content);
+ jarEntry.setCrc(crc32.getValue());
+ }
+ out.putNextEntry(jarEntry);
out.write(outBytes.get(entry));
+ }
out.closeEntry();
+ if (progress != null)
+ progress.accept(i++/size);
}
out.close();
} catch (IOException e) {
diff --git a/src/main/java/me/lpk/util/drop/JarDropHandler.java b/src/main/java/me/lpk/util/drop/JarDropHandler.java
index 699a129..93f2ad2 100644
--- a/src/main/java/me/lpk/util/drop/JarDropHandler.java
+++ b/src/main/java/me/lpk/util/drop/JarDropHandler.java
@@ -1,12 +1,11 @@
package me.lpk.util.drop;
+import javax.swing.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.io.File;
import java.util.List;
-import javax.swing.TransferHandler;
-
public class JarDropHandler extends TransferHandler {
private static final long serialVersionUID = 1232L;
private final IDropUser user;
@@ -37,10 +36,7 @@ public boolean importData(TransferHandler.TransferSupport info) {
}
user.preLoadJars(id);
for (File jar : data) {
- if (jar.getName().toLowerCase().endsWith(".jar")) {
- user.onJarLoad(id, jar);
- break;
- }
+ user.onJarLoad(id, jar);
}
return true;
}
diff --git a/src/main/java/org/objectweb/asm/tree/ClassNode.java b/src/main/java/org/objectweb/asm/tree/ClassNode.java
index 3ac53d4..71f35a8 100644
--- a/src/main/java/org/objectweb/asm/tree/ClassNode.java
+++ b/src/main/java/org/objectweb/asm/tree/ClassNode.java
@@ -66,6 +66,11 @@ public class ClassNode extends ClassVisitor {
*/
public String name;
+ /**
+ * The internal path of the jar file.
+ */
+ public String innerPath;
+
/**
* The signature of the class. May be null.
*/