package ch.unibe.scg.cc; import java.io.Serializable; import ch.unibe.scg.cc.Protos.CodeFile; import ch.unibe.scg.cc.Protos.Function; import ch.unibe.scg.cc.Protos.Project; import ch.unibe.scg.cc.Protos.Snippet; import ch.unibe.scg.cc.Protos.Version; import ch.unibe.scg.cells.Cell; import ch.unibe.scg.cells.Codec; import com.google.common.base.Charsets; import com.google.common.primitives.Bytes; import com.google.common.primitives.Ints; import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; /** Translates from Cell to our protobufs and back */ class PopulatorCodec implements Serializable { private static final long serialVersionUID = 1L; final Codec<CodeFile> codeFile = new CodeFileCodec(); /** Maps from functions to snippets. */ final Codec<Snippet> snippet = new Function2SnippetCodec(); final Codec<Version> version = new VersionCodec(); final Codec<Function> function = new FunctionCodec(); final Codec<Project> project = new ProjectCodec(); static class CodeFileCodec implements Codec<CodeFile> { private static final long serialVersionUID = 1L; @Override public Cell<CodeFile> encode(CodeFile fil) { return Cell.make(fil.getVersion(), ByteString.copyFrom(Bytes.concat(fil.getHash().toByteArray(), fil.getPath().getBytes(Charsets.UTF_8))), fil.toByteString()); } @Override public CodeFile decode(Cell<CodeFile> encoded) throws InvalidProtocolBufferException { return CodeFile.parseFrom(encoded.getCellContents()); } } static class Function2SnippetCodec implements Codec<Snippet> { private static final long serialVersionUID = 1L; @Override public Cell<Snippet> encode(Snippet snip) { byte[] colKey = Bytes.concat(new byte[] {(byte) snip.getCloneType().getNumber()}, Ints.toByteArray(snip.getPosition())); return Cell.make(snip.getFunction(), ByteString.copyFrom(colKey), snip.toByteString()); } @Override public Snippet decode(Cell<Snippet> encoded) throws InvalidProtocolBufferException { return Snippet.parseFrom(encoded.getCellContents()); } } static class VersionCodec implements Codec<Version> { private static final long serialVersionUID = 1L; @Override public Cell<Version> encode(Version v) { return Cell.make(v.getProject(), ByteString.copyFrom(Bytes.concat(v.getHash().toByteArray(), v.getName().getBytes(Charsets.UTF_8))), v.toByteString()); } @Override public Version decode(Cell<Version> encoded) throws InvalidProtocolBufferException { return Version.parseFrom(encoded.getCellContents()); } } static class FunctionCodec implements Codec<Function> { private static final long serialVersionUID = 1L; @Override public Cell<Function> encode(Function fun) { ByteString colKey = ByteString.copyFrom(Bytes.concat(fun.getHash().toByteArray(), Ints.toByteArray(fun.getBaseLine()))); return Cell.make(fun.getCodeFile(), colKey, fun.toByteString()); } @Override public Function decode(Cell<Function> encoded) throws InvalidProtocolBufferException { return Function.parseFrom(encoded.getCellContents()); } } static class ProjectCodec implements Codec<Project> { private static final long serialVersionUID = 1L; @Override public Cell<Project> encode(Project project) { return Cell.make(project.getHash(), project.getHash(), project.toByteString()); } @Override public Project decode(Cell<Project> encoded) throws InvalidProtocolBufferException { return Project.parseFrom(encoded.getCellContents()); } } }