forked from openrs2/openrs2
parent
aab286cf13
commit
c633725c55
@ -1,97 +0,0 @@ |
||||
package dev.openrs2.decompiler; |
||||
|
||||
import java.io.Closeable; |
||||
import java.io.IOException; |
||||
import java.io.UncheckedIOException; |
||||
import java.nio.file.Files; |
||||
import java.nio.file.Path; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
import java.util.function.Function; |
||||
import java.util.jar.JarFile; |
||||
import java.util.jar.Manifest; |
||||
|
||||
import com.google.common.io.ByteStreams; |
||||
import org.jetbrains.java.decompiler.main.extern.IBytecodeProvider; |
||||
import org.jetbrains.java.decompiler.main.extern.IResultSaver; |
||||
|
||||
public final class DecompilerIo implements IBytecodeProvider, IResultSaver, Closeable { |
||||
private final Map<String, JarFile> inputJars = new HashMap<>(); |
||||
private final Function<String, Path> destination; |
||||
|
||||
public DecompilerIo(Function<String, Path> destination) { |
||||
this.destination = destination; |
||||
} |
||||
|
||||
@Override |
||||
public byte[] getBytecode(String externalPath, String internalPath) throws IOException { |
||||
if (internalPath == null) { |
||||
throw new UnsupportedOperationException(); |
||||
} |
||||
|
||||
var jar = inputJars.get(externalPath); |
||||
if (jar == null) { |
||||
jar = new JarFile(externalPath); |
||||
inputJars.put(externalPath, jar); |
||||
} |
||||
|
||||
try (var in = jar.getInputStream(jar.getJarEntry(internalPath))) { |
||||
return ByteStreams.toByteArray(in); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void saveFolder(String path) { |
||||
/* ignore */ |
||||
} |
||||
|
||||
@Override |
||||
public void copyFile(String source, String path, String entryName) { |
||||
throw new UnsupportedOperationException(); |
||||
} |
||||
|
||||
@Override |
||||
public void saveClassFile(String path, String qualifiedName, String entryName, String content, int[] mapping) { |
||||
throw new UnsupportedOperationException(); |
||||
} |
||||
|
||||
@Override |
||||
public void createArchive(String path, String archiveName, Manifest manifest) { |
||||
/* ignore */ |
||||
} |
||||
|
||||
@Override |
||||
public void saveDirEntry(String path, String archiveName, String entryName) { |
||||
/* ignore */ |
||||
} |
||||
|
||||
@Override |
||||
public void copyEntry(String source, String path, String archiveName, String entry) { |
||||
/* ignore */ |
||||
} |
||||
|
||||
@Override |
||||
public void saveClassEntry(String path, String archiveName, String qualifiedName, String entryName, String content) { |
||||
var p = destination.apply(archiveName).resolve(entryName); |
||||
try { |
||||
Files.createDirectories(p.getParent()); |
||||
try (var writer = Files.newBufferedWriter(p)) { |
||||
writer.write(content); |
||||
} |
||||
} catch (IOException ex) { |
||||
throw new UncheckedIOException(ex); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void closeArchive(String path, String archiveName) { |
||||
/* ignore */ |
||||
} |
||||
|
||||
@Override |
||||
public void close() throws IOException { |
||||
for (var jar : inputJars.values()) { |
||||
jar.close(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,85 @@ |
||||
package dev.openrs2.decompiler |
||||
|
||||
import com.google.common.io.ByteStreams |
||||
import org.jetbrains.java.decompiler.main.extern.IBytecodeProvider |
||||
import org.jetbrains.java.decompiler.main.extern.IResultSaver |
||||
import java.io.Closeable |
||||
import java.io.IOException |
||||
import java.nio.file.Files |
||||
import java.nio.file.Path |
||||
import java.util.jar.JarFile |
||||
import java.util.jar.Manifest |
||||
|
||||
class DecompilerIo(private val destination: (String) -> Path) : IBytecodeProvider, IResultSaver, Closeable { |
||||
private val inputJars = mutableMapOf<String, JarFile>() |
||||
|
||||
@Throws(IOException::class) |
||||
override fun getBytecode(externalPath: String, internalPath: String?): ByteArray { |
||||
if (internalPath == null) { |
||||
throw UnsupportedOperationException() |
||||
} |
||||
|
||||
val jar = inputJars.computeIfAbsent(externalPath) { |
||||
JarFile(it) |
||||
} |
||||
|
||||
jar.getInputStream(jar.getJarEntry(internalPath)).use { |
||||
return ByteStreams.toByteArray(it) |
||||
} |
||||
} |
||||
|
||||
override fun saveFolder(path: String) { |
||||
// ignore |
||||
} |
||||
|
||||
override fun copyFile(source: String, path: String, entryName: String) { |
||||
throw UnsupportedOperationException() |
||||
} |
||||
|
||||
override fun saveClassFile( |
||||
path: String, |
||||
qualifiedName: String, |
||||
entryName: String, |
||||
content: String, |
||||
mapping: IntArray |
||||
) { |
||||
throw UnsupportedOperationException() |
||||
} |
||||
|
||||
override fun createArchive(path: String, archiveName: String, manifest: Manifest?) { |
||||
// ignore |
||||
} |
||||
|
||||
override fun saveDirEntry(path: String, archiveName: String, entryName: String) { |
||||
// ignore |
||||
} |
||||
|
||||
override fun copyEntry(source: String, path: String, archiveName: String, entry: String) { |
||||
// ignore |
||||
} |
||||
|
||||
override fun saveClassEntry( |
||||
path: String, |
||||
archiveName: String, |
||||
qualifiedName: String, |
||||
entryName: String, |
||||
content: String |
||||
) { |
||||
val p = destination(archiveName).resolve(entryName) |
||||
Files.createDirectories(p.parent) |
||||
Files.newBufferedWriter(p).use { |
||||
it.write(content) |
||||
} |
||||
} |
||||
|
||||
override fun closeArchive(path: String, archiveName: String) { |
||||
// ignore |
||||
} |
||||
|
||||
@Throws(IOException::class) |
||||
override fun close() { |
||||
for (jar in inputJars.values) { |
||||
jar.close() |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue