Skip to content

Commit 3768831

Browse files
committed
Remove folder functionality, needs to be rewritten
1 parent 8fb6235 commit 3768831

File tree

9 files changed

+94
-97
lines changed

9 files changed

+94
-97
lines changed

src/main/java/club/bytecode/the/jda/FileContainer.java

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,38 @@ public FileContainer(File f) {
2020
this.name = f.getAbsolutePath();
2121
}
2222

23-
public File file;
24-
public String name;
23+
public final File file;
24+
public final String name;
2525

2626
public HashMap<String, byte[]> files = new HashMap<>();
2727
private Map<String, ClassNode> classes = new HashMap<>();
2828

2929
public ClassNode getClassNode(String name) {
30-
if (!classes.containsKey(name)) {
31-
byte[] bytes = files.get(name);
32-
if (bytes != null) {
33-
ClassReader reader = new ClassReader(bytes);
34-
ClassNode classNode = new ClassNode();
35-
reader.accept(classNode, ClassReader.EXPAND_FRAMES);
36-
classes.put(name, classNode);
37-
}
38-
}
30+
if (classes.containsKey(name))
31+
return classes.get(name);
32+
ClassNode cn = loadClass(findClassfile(name));
33+
if (cn != null)
34+
classes.put(name, cn);
3935
return classes.get(name);
4036
}
4137

38+
public ClassNode loadClass(String name) {
39+
byte[] bytes = files.get(name);
40+
if (bytes == null)
41+
return null;
42+
ClassReader reader = new ClassReader(bytes);
43+
ClassNode classNode = new ClassNode();
44+
reader.accept(classNode, ClassReader.EXPAND_FRAMES);
45+
return classNode;
46+
}
47+
48+
public String findClassfile(String className) {
49+
String candidate = className + ".class";
50+
if (files.containsKey(candidate))
51+
return candidate;
52+
return "";
53+
}
54+
4255
public Map<String, byte[]> getData() {
4356
return files;
4457
}
@@ -54,4 +67,9 @@ public void add(ClassNode classNode) {
5467
public Collection<ClassNode> getClasses() {
5568
return classes.values();
5669
}
70+
71+
@Override
72+
public String toString() {
73+
return name;
74+
}
5775
}

src/main/java/club/bytecode/the/jda/JDA.java

Lines changed: 37 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@
2323
import java.io.FileInputStream;
2424
import java.io.IOException;
2525
import java.net.MalformedURLException;
26-
import java.nio.file.Files;
27-
import java.nio.file.Paths;
28-
import java.util.*;
26+
import java.util.ArrayList;
27+
import java.util.HashMap;
28+
import java.util.List;
29+
import java.util.Map;
2930

3031
public class JDA {
3132
/*per version*/
@@ -151,15 +152,6 @@ private static void onExit() {
151152
Settings.saveGUI();
152153
}
153154

154-
/**
155-
* Returns the currently opened ClassNode
156-
*
157-
* @return the currently opened ClassNode
158-
*/
159-
public static ClassNode getCurrentlyOpenedClassNode() {
160-
return viewer.FileViewerPane.getCurrentViewer().cn;
161-
}
162-
163155
public static byte[] getFileBytes(FileContainer container, String name) {
164156
if (container != null)
165157
return container.getData().get(name);
@@ -168,7 +160,7 @@ public static byte[] getFileBytes(FileContainer container, String name) {
168160
}
169161

170162
public static byte[] getClassBytes(FileContainer container, ClassNode cn) {
171-
byte[] bytes = getFileBytes(container, getClassfileName(cn));
163+
byte[] bytes = getFileBytes(container, container.findClassfile(cn.name));
172164
if (bytes == null)
173165
return null;
174166
if (cn.version < 49)
@@ -179,19 +171,19 @@ public static byte[] getClassBytes(FileContainer container, ClassNode cn) {
179171
public static final String HACK_PREFIX = "\0JDA-hack";
180172

181173
public static File getClassFileProxy(ClassNode cn) {
182-
return new File('/' + HACK_PREFIX, getClassfileName(cn));
174+
return new File('/' + HACK_PREFIX, cn + ".class");
183175
}
184176

185-
public static String getClassfileName(ClassNode cn) {
186-
return cn.name + ".class";
177+
public static String extractProxyClassName(String fileName) {
178+
return getClassFilePath(fileName.substring(fileName.indexOf(HACK_PREFIX) + HACK_PREFIX.length() + 1));
187179
}
188180

189-
public static String extractProxyClassName(String fileName) {
190-
return extractClassName(fileName.substring(fileName.indexOf(HACK_PREFIX) + HACK_PREFIX.length() + 1));
181+
public static String getClassFilePath(String fileName) {
182+
return fileName.replace(File.separator, "/").substring(0, fileName.length() - ".class".length());
191183
}
192184

193-
public static String extractClassName(String fileName) {
194-
return fileName.replace(File.separator, "/").substring(0, fileName.length() - 6);
185+
public static String getClassName(String fullyQualifiedName) {
186+
return fullyQualifiedName.substring(fullyQualifiedName.lastIndexOf('/') + 1);
195187
}
196188

197189
protected static byte[] fixBytes(byte[] in) {
@@ -248,6 +240,7 @@ public static ArrayList<ClassNode> loadAllClasses() {
248240
return a;
249241
}
250242

243+
// WTF????
251244
public static Map<String, byte[]> getLoadedBytes() {
252245
Map<String, byte[]> data = new HashMap<>();
253246
for (FileContainer container : files) {
@@ -281,35 +274,7 @@ public static void openFiles(final File[] files, boolean recentFiles) {
281274
update = false;
282275
showMessage("The file " + fileToOpen.getAbsolutePath() + " could not be found.");
283276
} else if (fileToOpen.isDirectory()) {
284-
FileContainer container = new FileContainer(fileToOpen);
285-
HashMap<String, byte[]> openedFiles = new HashMap<>();
286-
Set<File> totalFiles = new HashSet<>();
287-
Deque<File> queue = new ArrayDeque<>();
288-
queue.add(fileToOpen);
289-
String dir = fileToOpen.getAbsolutePath();//f.getAbsolutePath().substring(0, f.getAbsolutePath().length()-f.getName().length());
290-
291-
while (!queue.isEmpty()) {
292-
File file = queue.remove();
293-
if (!totalFiles.add(file))
294-
continue;
295-
if (file.listFiles() != null) { // is directory
296-
for (File child : file.listFiles()) {
297-
if (!totalFiles.contains(child)) {
298-
queue.add(child);
299-
}
300-
}
301-
}
302-
}
303-
304-
for (File file : totalFiles) {
305-
if (file.isFile()) {
306-
String fileName = file.getAbsolutePath().substring(dir.length() + 1, file.getAbsolutePath().length()).replaceAll("\\\\", "\\/");
307-
openedFiles.put(fileName, Files.readAllBytes(Paths.get(file.getAbsolutePath())));
308-
}
309-
}
310-
311-
container.files = openedFiles;
312-
addFile(container);
277+
openFiles(fileToOpen.listFiles(), false);
313278
} else if (fn.endsWith(".jar") || fn.endsWith(".zip")) {
314279
try {
315280
JarUtils.put(fileToOpen);
@@ -318,30 +283,12 @@ public static void openFiles(final File[] files, boolean recentFiles) {
318283
update = false;
319284
}
320285
} else if (fn.endsWith(".class")) {
321-
try {
322-
byte[] bytes = JarUtils.getBytes(new FileInputStream(fileToOpen));
323-
String cafebabe = String.format("%02X%02X%02X%02X", bytes[0], bytes[1], bytes[2], bytes[3]);
324-
if (cafebabe.toLowerCase().equals("cafebabe")) {
325-
final ClassNode cn = JarUtils.getNode(bytes);
326-
327-
FileContainer container = new FileContainer(fileToOpen);
328-
container.files.put(getClassfileName(cn), bytes);
329-
container.add(cn);
330-
addFile(container);
331-
} else {
332-
showMessage(fn + ": Header does not start with CAFEBABE, ignoring.");
333-
update = false;
334-
}
335-
} catch (final Exception e) {
336-
new ExceptionUI(e);
337-
update = false;
338-
}
286+
FileContainer container = loadClassfile(fileToOpen, fn);
287+
addFile(container);
339288
} else {
340289
HashMap<String, byte[]> files1 = new HashMap<>();
341290
byte[] bytes = JarUtils.getBytes(new FileInputStream(fileToOpen));
342291
files1.put(fileToOpen.getName(), bytes);
343-
344-
345292
FileContainer container = new FileContainer(fileToOpen);
346293
container.files = files1;
347294
addFile(container);
@@ -362,6 +309,27 @@ public static void openFiles(final File[] files, boolean recentFiles) {
362309
})).start();
363310
}
364311

312+
public static FileContainer loadClassfile(File fileToOpen, String fn) {
313+
try {
314+
byte[] bytes = JarUtils.getBytes(new FileInputStream(fileToOpen));
315+
String cafebabe = String.format("%02X%02X%02X%02X", bytes[0], bytes[1], bytes[2], bytes[3]);
316+
if (cafebabe.toLowerCase().equals("cafebabe")) {
317+
final ClassNode cn = JarUtils.getNode(bytes);
318+
FileContainer container = new FileContainer(fileToOpen);
319+
container.files.put(cn.name + ".class", bytes);
320+
container.add(cn);
321+
return container;
322+
} else {
323+
showMessage(fn + ": Header does not start with CAFEBABE, ignoring.");
324+
update = false;
325+
}
326+
} catch (final Exception e) {
327+
new ExceptionUI(e);
328+
update = false;
329+
}
330+
return null;
331+
}
332+
365333
public static void addFile(FileContainer fc) {
366334
JDA.files.add(fc);
367335
plugins.forEach((plugin -> plugin.onAddFile(fc)));

src/main/java/club/bytecode/the/jda/decompilers/CFRDecompiler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public String getName() {
9898
@Override
9999
public String decompileClassNode(FileContainer container, ClassNode cn) {
100100
try {
101-
byte[] bytes = JDA.getClassBytes(containerName, cn);
101+
byte[] bytes = JDA.getClassBytes(container, cn);
102102
Options options = new GetOptParser().parse(generateMainMethod(), OptionsImpl.getFactory());
103103
ClassFileSourceImpl classFileSource = new ClassFileSourceImpl(options);
104104
DCCommonState dcCommonState = new DCCommonState(options, classFileSource);

src/main/java/club/bytecode/the/jda/decompilers/FernflowerDecompiler.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ public String decompileClassNode(FileContainer container, final ClassNode cn) {
6161
result.set(null);
6262

6363
BaseDecompiler baseDecompiler = new BaseDecompiler((externalPath, internalPath) -> {
64-
ClassNode requestedCn = JDA.getClassNode(containerName, JDA.extractProxyClassName(externalPath));
64+
ClassNode requestedCn = container.getClassNode(JDA.extractProxyClassName(externalPath));
6565
if (requestedCn == null) {
6666
System.err.println("Couldn't load " + externalPath);
67-
throw new IOException(containerName + "$" + cn + " is missing");
67+
throw new IOException(container + "$" + cn + " is missing");
6868
}
69-
return JDA.getClassBytes(containerName, requestedCn);
69+
return JDA.getClassBytes(container, requestedCn);
7070
}, new IResultSaver() {
7171
@Override
7272
public void saveFolder(String s) {
@@ -118,7 +118,7 @@ public void closeArchive(String s, String s1) {
118118
visited.add(curCn);
119119
baseDecompiler.addSpace(JDA.getClassFileProxy(curCn), true);
120120
for (InnerClassNode innerClass : curCn.innerClasses) {
121-
ClassNode innerCn = JDA.getClassNode(containerName, innerClass.name);
121+
ClassNode innerCn = container.getClassNode(innerClass.name);
122122
if (innerCn != null && !visited.contains(innerCn)) {
123123
fifo.add(innerCn);
124124
}

src/main/java/club/bytecode/the/jda/decompilers/ProcyonDecompiler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public DecompilerSettings getDecompilerSettings() {
7171
@Override
7272
public String decompileClassNode(FileContainer container, final ClassNode cn) {
7373
try {
74-
byte[] bytes = JDA.getClassBytes(containerName, cn);
74+
byte[] bytes = JDA.getClassBytes(container, cn);
7575
final Map<String, byte[]> loadedClasses = JDA.getLoadedBytes();
7676
MetadataSystem metadataSystem = new MetadataSystem(new ITypeLoader() {
7777
private InputTypeLoader backLoader = new InputTypeLoader();

src/main/java/club/bytecode/the/jda/decompilers/bytecode/BytecodeDecompiler.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public String getName() {
3434
}
3535

3636
public String decompileClassNode(FileContainer container, ClassNode cn) {
37-
return decompile(new PrefixedStringBuilder(), new ArrayList<>(), containerName, cn).toString();
37+
return decompile(new PrefixedStringBuilder(), new ArrayList<>(), container, cn).toString();
3838
}
3939

4040
protected PrefixedStringBuilder decompile(PrefixedStringBuilder sb, ArrayList<String> decompiledClasses, FileContainer container, ClassNode cn) {
@@ -82,11 +82,11 @@ protected PrefixedStringBuilder decompile(PrefixedStringBuilder sb, ArrayList<St
8282
String innerClassName = innerClassNode.name;
8383
if ((innerClassName != null) && !decompiledClasses.contains(innerClassName)) {
8484
decompiledClasses.add(innerClassName);
85-
ClassNode cn1 = JDA.getClassNode(containerName, innerClassName);
85+
ClassNode cn1 = container.getClassNode(innerClassName);
8686
if (cn1 != null) {
8787
sb.appendPrefix(" ");
8888
sb.append(JDA.nl + JDA.nl);
89-
sb = decompile(sb, decompiledClasses, containerName, cn1);
89+
sb = decompile(sb, decompiledClasses, container, cn1);
9090
sb.trimPrefix(5);
9191
sb.append(JDA.nl);
9292
} else {

src/main/java/club/bytecode/the/jda/gui/fileviewer/ClassViewer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
*/
2626

2727
public class ClassViewer extends Viewer {
28+
public ClassNode cn;
2829
private static final long serialVersionUID = -8650495368920680024L;
2930
private List<Thread> decompileThreads = new ArrayList<>();
3031

src/main/java/club/bytecode/the/jda/gui/fileviewer/Viewer.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22

33
import club.bytecode.the.jda.FileContainer;
44
import club.bytecode.the.jda.settings.Settings;
5-
import org.objectweb.asm.tree.ClassNode;
65

76
import javax.swing.*;
87

98
public abstract class Viewer extends JPanel {
10-
11-
public ClassNode cn;
9+
protected String pathInContainer; // path within the container
1210
public String name;
1311
public FileContainer container;
1412

src/main/java/club/bytecode/the/jda/gui/navigation/FileNavigationPane.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ public void updateTree() {
221221
try {
222222
treeRoot.removeAllChildren();
223223
for (FileContainer container : JDA.files) {
224-
FileNode root = new FileNode(container.name);
224+
FileNode root = new FileNode(container);
225225
treeRoot.add(root);
226226
JDATreeCellRenderer renderer = new JDATreeCellRenderer();
227227
tree.setCellRenderer(renderer);
@@ -407,15 +407,27 @@ public void openPath(TreePath path) {
407407
}
408408
}
409409

410+
FileContainer container = null;
411+
for (int i = path.getPathCount() - 1; i > 0; i--) {
412+
Object o = ((FileNode) path.getPathComponent(1)).getUserObject();
413+
if (o != null && o instanceof FileContainer) {
414+
container = (FileContainer) o;
415+
break;
416+
}
417+
}
418+
if (container == null) {
419+
System.err.println(path);
420+
throw new IllegalStateException("Path isn't parented to a container?");
421+
}
422+
410423
String name = nameBuffer.toString();
411-
String containerName = path.getPathComponent(1).toString();
412424
if (name.endsWith(".class")) {
413-
final ClassNode cn = JDA.getClassNode(containerName, name);
425+
final ClassNode cn = container.loadClass(name);
414426
if (cn != null) {
415-
openClassFileToWorkSpace(nameBuffer.toString(), containerName, cn);
427+
openClassFileToWorkSpace(nameBuffer.toString(), container, cn);
416428
}
417429
} else {
418-
openFileToWorkSpace(nameBuffer.toString(), containerName, JDA.getFileBytes(containerName, nameBuffer.toString()));
430+
openFileToWorkSpace(nameBuffer.toString(), container, JDA.getFileBytes(container, nameBuffer.toString()));
419431
}
420432
}
421433

0 commit comments

Comments
 (0)