package info.mineshafter.util;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class JarPatcher {
private Map<String, byte[]> entries;
public JarPatcher(File jarFile) {
try {
init(new FileInputStream(jarFile));
} catch (IOException e) {
e.printStackTrace();
}
}
public JarPatcher(InputStream jarStream) {
init(jarStream);
}
public JarPatcher(byte[] jarData) {
init(new ByteArrayInputStream(jarData));
}
private void init(InputStream jarStream) {
entries = new HashMap<String, byte[]>();
try {
ZipEntry entry;
ZipInputStream jarIn = new ZipInputStream(jarStream);
while ((entry = jarIn.getNextEntry()) != null) {
String name = entry.getName();
entries.put(name, Streams.toByteArray(jarIn));
}
jarIn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void setEntry(String name, byte[] data) {
entries.put(name, data);
}
public void removeEntry(String name) {
entries.remove(name);
}
public byte[] getEntry(String name){
return entries.get(name);
}
public Collection<String> getEntries() {
return new HashSet<String>(entries.keySet());
}
public void write(File destination) {
try {
write(new FileOutputStream(destination));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public void write(OutputStream destination) {
ZipOutputStream out = new ZipOutputStream(destination);
try {
for (String name : entries.keySet()) {
ZipEntry entry = new ZipEntry(name);
byte[] blob = entries.get(name);
out.putNextEntry(entry);
out.write(blob);
out.flush();
}
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}