package com.rubiconproject.oss.kv.transcoder; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class ZippingTranscoder implements Transcoder { private static final String ZIP_ENTRY_NAME = "entry"; private Transcoder delegate; public ZippingTranscoder() { this.delegate = new SerializableTranscoder(); } public ZippingTranscoder(Transcoder delegate) { this.delegate = delegate; } public Object decode(byte[] bytes) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayInputStream in = new ByteArrayInputStream(bytes); ZipInputStream unzip = new ZipInputStream(in); ZipEntry entry = unzip.getNextEntry(); byte[] buffer = new byte[bytes.length]; int read = 0; while ((read = unzip.read(buffer)) > 0) { baos.write(buffer, 0, read); } unzip.closeEntry(); unzip.close(); in.close(); baos.close(); byte[] uncompressed = baos.toByteArray(); Object obj = delegate.decode(uncompressed); return obj; } public byte[] encode(Object value) throws IOException { byte[] uncompressed = delegate.encode(value); ByteArrayOutputStream out = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(out); ZipEntry entry = new ZipEntry(ZIP_ENTRY_NAME); zip.putNextEntry(entry); zip.write(uncompressed); zip.closeEntry(); zip.close(); out.close(); return out.toByteArray(); } }