package edu.berkeley.lipstick.util.serializer; import java.io.*; import java.util.Vector; import com.google.protobuf.ByteString; import edu.berkeley.lipstick.util.*; public class ProtoDWSerializer implements IDWSerializer { public byte[] toByteArray(DataWrapper input) throws Exception { Vector<DWProto.KDSEntryMsg> kdsEntryMsgs = new Vector<DWProto.KDSEntryMsg>(); KeyDependencySet kds = input.getKeyDependencySet(); for(String key : kds.getKeys()) { KeyDependency kd = kds.getDependency(key); Vector<DWProto.ClockEntryMsg> clockEntryMsgs = new Vector<DWProto.ClockEntryMsg>(); for(String entry : kd.getClock().getWriters()) { clockEntryMsgs.add(DWProto.ClockEntryMsg.newBuilder() .setWriter(entry) .setValue(kd.getClock().getValue(entry)) .build()); } kdsEntryMsgs.add(DWProto.KDSEntryMsg.newBuilder() .setKey(key) .setWc(DWProto.WriteClockMsg.newBuilder() .addAllEntries(clockEntryMsgs) .build()) .build()); } DWProto.KeyDependencySetMsg.Builder kwsb = DWProto.KeyDependencySetMsg.newBuilder(); kwsb.addAllEntries(kdsEntryMsgs); DWProto.KeyDependencySetMsg kdsM = kwsb.build(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos); out.writeObject(input.getValue()); out.close(); DWProto.DataWrapperMsg.Builder dwmb = DWProto.DataWrapperMsg.newBuilder(); dwmb.setValue(ByteString.copyFrom(bos.toByteArray())); dwmb.setKds(kdsM); dwmb.setTimestamp(input.getTimestamp()); DWProto.DataWrapperMsg dwM = dwmb.build(); return dwM.toByteArray(); } public DataWrapper fromByteArray(String key, byte[] input) throws Exception { DWProto.DataWrapperMsg dw = DWProto.DataWrapperMsg.parseFrom(input); KeyDependencySet kds = new KeyDependencySet(); for(DWProto.KDSEntryMsg entry : dw.getKds().getEntriesList()) { WriteClock entryClock = new WriteClock(); for(DWProto.ClockEntryMsg clockEntry : entry.getWc().getEntriesList()) { entryClock.setValue(clockEntry.getWriter(), clockEntry.getValue()); } kds.putDependency(entry.getKey(), new KeyDependency(entryClock)); } ByteArrayInputStream bis = new ByteArrayInputStream(dw.getValue().toByteArray()); ObjectInput in = new ObjectInputStream(bis); Object o = in.readObject(); in.close(); DataWrapper ret = new DataWrapper(key, o, kds, dw.getTimestamp()); return ret; } }