/
WorkspaceClassPath.java
58 lines (51 loc) · 1.5 KB
/
WorkspaceClassPath.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package me.coley.recaf.parse.source;
import javassist.ClassPath;
import me.coley.recaf.util.Log;
import me.coley.recaf.workspace.Workspace;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
/**
* Javassist classpath implementation that pulls classes from a workspace.
*
* @author Matt Coley
*/
public class WorkspaceClassPath implements ClassPath {
private static final RecafStreamHandler dummyUrlHandler = new RecafStreamHandler();
private final Workspace workspace;
/**
* @param workspace
* Workspace to pull classes from.
*/
public WorkspaceClassPath(Workspace workspace) {
this.workspace = workspace;
}
@Override
public InputStream openClassfile(String classname) {
byte[] bytes = workspace.getRawClass(classname);
if (bytes != null)
return new ByteArrayInputStream(bytes);
return null;
}
@Override
public URL find(String classname) {
// Javassist does a URL lookup before allowing any actual reading, so we have to supply some
// dummy value in order to then call "openClassfile"
try {
String internalName = classname.replace('.', '/');
return new URL(null, "recaf:" + internalName, dummyUrlHandler);
} catch (Exception ex) {
Log.error("Failed to create 'recaf' URL scheme", ex);
return null;
}
}
private static class RecafStreamHandler extends URLStreamHandler {
@Override
protected URLConnection openConnection(URL u) {
// No-op
return null;
}
}
}