Skip to content

Commit c4432ac

Browse files
committed
add new file type
1 parent 10f4630 commit c4432ac

File tree

3 files changed

+72
-22
lines changed

3 files changed

+72
-22
lines changed

src/main/java/cn/enaium/joe/gui/component/FileTree.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@
2525
import cn.enaium.joe.gui.panel.file.tree.node.*;
2626
import cn.enaium.joe.jar.Jar;
2727
import cn.enaium.joe.task.InputJarTask;
28+
import cn.enaium.joe.task.RemappingTask;
2829
import cn.enaium.joe.util.JMenuUtil;
2930
import cn.enaium.joe.util.JTreeUtil;
3031
import cn.enaium.joe.util.LangUtil;
32+
import net.fabricmc.mappingio.format.MappingFormat;
3133
import org.objectweb.asm.tree.ClassNode;
3234

3335
import javax.swing.*;
@@ -37,7 +39,9 @@
3739
import java.awt.dnd.DropTarget;
3840
import java.awt.event.MouseAdapter;
3941
import java.awt.event.MouseEvent;
42+
import java.io.File;
4043
import java.util.*;
44+
import java.util.function.Predicate;
4145

4246
/**
4347
* @author Enaium
@@ -65,9 +69,28 @@ public void mouseClicked(MouseEvent e) {
6569
}
6670
});
6771

68-
new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, new FileDropTarget(".jar", files -> {
72+
new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, new FileDropTarget(
73+
(file) -> {
74+
if (file.isDirectory()) return true;
75+
else {
76+
String name = file.getName().toLowerCase();
77+
return name.endsWith(".jar") || name.endsWith(".zip");
78+
}
79+
}
80+
, files -> {
81+
6982
if (!files.isEmpty()) {
70-
JavaOctetEditor.getInstance().task.submit(new InputJarTask(files.get(0)));
83+
File file = files.get(0);
84+
if (file.isDirectory()) {
85+
JavaOctetEditor.getInstance().task.submit(new InputJarTask(file));
86+
} else {
87+
String name = file.getName().toLowerCase();
88+
if (name.endsWith(".jar") || name.endsWith(".zip")){
89+
JavaOctetEditor.getInstance().task.submit(new InputJarTask(file));
90+
} else if (name.endsWith(".srg")){
91+
JavaOctetEditor.getInstance().task.submit(new RemappingTask(file, MappingFormat.SRG));
92+
}
93+
}
7194
}
7295
}), true);
7396

src/main/java/cn/enaium/joe/gui/panel/file/FileDropTarget.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package cn.enaium.joe.gui.panel.file;
1818

19+
import org.pmw.tinylog.Logger;
20+
1921
import java.awt.datatransfer.DataFlavor;
2022
import java.awt.datatransfer.Transferable;
2123
import java.awt.datatransfer.UnsupportedFlavorException;
@@ -25,6 +27,7 @@
2527
import java.util.ArrayList;
2628
import java.util.List;
2729
import java.util.function.Consumer;
30+
import java.util.function.Predicate;
2831

2932
/**
3033
* @author Enaium
@@ -34,11 +37,11 @@ public class FileDropTarget implements DropTargetListener {
3437
private boolean drop = false;
3538
private final List<File> files = new ArrayList<>();
3639

37-
private final String suffix;
40+
private final Predicate<File> predicate;
3841
private final Consumer<List<File>> consumer;
3942

40-
public FileDropTarget(String suffix, Consumer<List<File>> consumer) {
41-
this.suffix = suffix;
43+
public FileDropTarget(Predicate<File> predicate, Consumer<List<File>> consumer) {
44+
this.predicate = predicate;
4245
this.consumer = consumer;
4346
}
4447

@@ -55,8 +58,7 @@ public void dragEnter(DropTargetDragEvent dtde) {
5558
for (Object value : ((List) td)) {
5659
if (value instanceof File) {
5760
File file = (File) value;
58-
String name = file.getName().toLowerCase();
59-
if (!name.endsWith(suffix)) {
61+
if (!predicate.test(file)) {
6062
drop = false;
6163
break;
6264
} else {
@@ -66,7 +68,7 @@ public void dragEnter(DropTargetDragEvent dtde) {
6668
}
6769
}
6870
} catch (UnsupportedFlavorException | IOException ex) {
69-
ex.printStackTrace();
71+
Logger.info(ex);
7072
}
7173
}
7274
if (drop) {

src/main/java/cn/enaium/joe/task/InputJarTask.java

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,13 @@
2727

2828
import java.io.File;
2929
import java.io.IOException;
30-
import java.util.Enumeration;
30+
import java.nio.file.*;
31+
import java.nio.file.attribute.BasicFileAttributes;
32+
import java.util.*;
3133
import java.util.jar.JarEntry;
3234
import java.util.jar.JarFile;
35+
import java.util.zip.ZipEntry;
36+
import java.util.zip.ZipFile;
3337

3438
/**
3539
* @author Enaium
@@ -48,23 +52,44 @@ public Jar get() {
4852
Logger.info("LOAD:{}", file.getAbsolutePath());
4953
Jar jar = new Jar();
5054
try {
51-
JarFile jarFile = new JarFile(file);
52-
float loaded = 0;
53-
float files = Util.countFiles(jarFile);
55+
if (file.isFile()){
56+
ZipFile jarFile = new ZipFile(file);
57+
float loaded = 0;
58+
float files = Util.countFiles(jarFile);
5459

5560

56-
Enumeration<JarEntry> entries = jarFile.entries();
57-
while (entries.hasMoreElements()) {
58-
JarEntry jarEntry = entries.nextElement();
59-
if (jarEntry.getName().endsWith(".class")) {
60-
ClassReader classReader = new ClassReader(IOUtil.getBytes(jarFile.getInputStream(new JarEntry(jarEntry.getName()))));
61-
jar.classes.put(jarEntry.getName(), ASMUtil.acceptClassNode(classReader));
62-
} else if (!jarEntry.isDirectory()) {
63-
jar.resources.put(jarEntry.getName(), IOUtil.getBytes(jarFile.getInputStream(new JarEntry(jarEntry.getName()))));
61+
var entries = jarFile.entries();
62+
while (entries.hasMoreElements()) {
63+
ZipEntry jarEntry = entries.nextElement();
64+
if (jarEntry.getName().endsWith(".class")) {
65+
ClassReader classReader = new ClassReader(IOUtil.getBytes(jarFile.getInputStream(new ZipEntry(jarEntry.getName()))));
66+
jar.classes.put(jarEntry.getName(), ASMUtil.acceptClassNode(classReader));
67+
} else if (!jarEntry.isDirectory()) {
68+
jar.resources.put(jarEntry.getName(), IOUtil.getBytes(jarFile.getInputStream(new ZipEntry(jarEntry.getName()))));
69+
}
70+
setProgress((int) ((loaded++ / files) * 100f));
71+
}
72+
jarFile.close();
73+
} else {
74+
Path root = file.toPath();
75+
Iterator<Path> itr = Files.walk(root).filter(Files::isReadable).iterator();
76+
List<Path> paths = new LinkedList<>();
77+
while (itr.hasNext()){
78+
paths.add(itr.next());
79+
}
80+
float loaded = 0;
81+
float files = paths.size();
82+
for(Path path : paths){
83+
String relative = root.relativize(path).toString();
84+
if (relative.endsWith(".class")) {
85+
ClassReader classReader = new ClassReader(IOUtil.getBytes(Files.newInputStream(path)));
86+
jar.classes.put(relative, ASMUtil.acceptClassNode(classReader));
87+
} else if (!Files.isDirectory(path)) {
88+
jar.resources.put(relative, IOUtil.getBytes(Files.newInputStream(path));
89+
}
90+
setProgress((int) ((loaded++ / files) * 100f));
6491
}
65-
setProgress((int) ((loaded++ / files) * 100f));
6692
}
67-
jarFile.close();
6893
} catch (IOException e) {
6994
throw new RuntimeException(e);
7095
}

0 commit comments

Comments
 (0)