package net.contra.obfuscator.util.bcel;
import com.sun.org.apache.bcel.internal.classfile.ClassParser;
import com.sun.org.apache.bcel.internal.classfile.JavaClass;
import com.sun.org.apache.bcel.internal.generic.ClassGen;
import net.contra.obfuscator.util.misc.IO;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
public class JarLoader {
public final Map<String, ClassGen> ClassEntries = new HashMap<String, ClassGen>();
public final Map<String, byte[]> NonClassEntries = new HashMap<String, byte[]>();
public JarLoader(String fileLocation) {
try {
File file = new File(fileLocation);
JarFile jarFile = new JarFile(file);
Enumeration<JarEntry> entries = jarFile.entries();
if (jarFile.getManifest() != null) {
wipeManifest(jarFile.getManifest().getMainAttributes().getValue("Main-Class"));
}
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (entry == null) continue;
InputStream entryStream = jarFile.getInputStream(entry);
if (entry.getName().endsWith(".class")) {
JavaClass jc = new ClassParser(entryStream, entry.getName()).parse();
ClassEntries.put(jc.getClassName(), new ClassGen(jc));
} else {
NonClassEntries.put(entry.getName(), IO.getBytes(entryStream));
}
}
} catch (Exception e) {
System.out.println("Error Loading Jar! Location: " + fileLocation);
e.printStackTrace();
}
}
private void wipeManifest(String main) {
for (String n : NonClassEntries.keySet()) {
if (n.startsWith("META-INF/")) {
if (n.endsWith("MANIFEST.MF")) {
String nm = "Main-Class: " + main;
NonClassEntries.put(n, nm.getBytes());
}
} else {
NonClassEntries.put(n, null);
}
}
}
public void saveJar(String fileName) {
try {
FileOutputStream os = new FileOutputStream(fileName);
JarOutputStream jos = new JarOutputStream(os);
for (ClassGen classIt : ClassEntries.values()) {
jos.putNextEntry(new JarEntry(classIt.getClassName().replace('.', '/') + ".class"));
jos.write(classIt.getJavaClass().getBytes());
jos.closeEntry();
jos.flush();
}
for (String n : NonClassEntries.keySet()) {
JarEntry destEntry = new JarEntry(n);
byte[] bite = NonClassEntries.get(n);
if (bite != null) {
jos.putNextEntry(destEntry);
jos.write(bite);
jos.closeEntry();
}
}
jos.closeEntry();
jos.close();
} catch (Exception e) {
System.out.println("Error Saving Jar! Location: " + fileName);
e.printStackTrace();
}
}
}