package org.lobobrowser.main;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
final class ZipEntryHandler extends URLStreamHandler {
private final Map<String, byte[]> entryBufMap = new HashMap<>();
ZipEntryHandler(final ZipInputStream is) throws IOException {
processStream(is);
}
public void processStream(final ZipInputStream is) throws IOException {
final byte[] tempBuffer = new byte[8192 * 2];
ZipEntry nextEntry = null;
do {
nextEntry = is.getNextEntry();
if (nextEntry != null) {
if (!nextEntry.isDirectory()) {
{
int bytesRead = -1;
final ByteArrayOutputStream streamBuilder = new ByteArrayOutputStream();
while ((bytesRead = is.read(tempBuffer)) != -1) {
streamBuilder.write(tempBuffer, 0, bytesRead);
}
// System.out.println(nextEntry.getName());
entryBufMap.put(nextEntry.getName(), streamBuilder.toByteArray());
}
}
is.closeEntry();
}
} while (nextEntry != null);
}
@Override
protected URLConnection openConnection(final URL u) throws IOException {
// System.out.println("Request: " + u);
if (ExtensionManager.ZIPENTRY_PROTOCOL.equals(u.getProtocol())) {
// TODO: Check url host for faster processing. Or use a common zip handler
final String uStr = u.toExternalForm();
final String requestName = uStr.substring(uStr.indexOf("!/") + 2);
if (requestName.length() == 0) {
return new URLConnection(u) {
@Override
public void connect() throws IOException {
// TODO Auto-generated method stub
}
};
}
final byte[] entry = entryBufMap.get(requestName);
if (requestName.contains("jooq")) {
System.out.println("req: " + requestName + " entry: " + entry);
}
return entry == null ? null : new URLConnection(u) {
@Override
public void connect() throws IOException {
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(entry);
}
};
} else {
return null;
}
}
}