package serializers.flatbuffers;
import com.google.flatbuffers.FlatBufferBuilder;
import serializers.*;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import serializers.flatbuffers.media.*;
public class FlatBuffers {
public static void register(TestGroups groups) {
groups.media.add(JavaBuiltIn.mediaTransformer, new FBSerializer(),
new SerFeatures(
SerFormat.BIN_CROSSLANG,
SerGraph.FLAT_TREE,
SerClass.CLASSES_KNOWN,
""
)
);
}
static final class FBSerializer extends Serializer<data.media.MediaContent> {
ByteBuffer bb = ByteBuffer.allocate(1024);
public String getName() { return "flatbuffers"; }
@Override
public data.media.MediaContent deserialize (byte[] array) throws Exception {
ByteBuffer bb = ByteBuffer.wrap(array);
MediaContent mc = MediaContent.getRootAsMediaContent(bb);
return reverse(mc);
}
@Override
public byte[] serialize(data.media.MediaContent content) {
FlatBufferBuilder fbb = new FlatBufferBuilder(bb);
forward(content, fbb);
return fbb.sizedByteArray();
}
public void forward(data.media.MediaContent mc, FlatBufferBuilder fbb) {
int media = forwardMedia(mc.media, fbb);
int images[] = new int[mc.images.size()];
for (int i = 0; i < mc.images.size(); i++) {
images[i] = forwardImage(mc.images.get(i), fbb);
}
int image = MediaContent.createImagesVector(fbb, images);
int offset = MediaContent.createMediaContent(fbb, image, media);
MediaContent.finishMediaContentBuffer(fbb, offset);
}
private int forwardMedia(data.media.Media media, FlatBufferBuilder fbb) {
int uri = fbb.createString(media.uri);
int title = media.title != null ? fbb.createString(media.title) : 0;
int format = fbb.createString(media.format);
int[] persons = new int[media.persons.size()];
for (int i = 0; i < media.persons.size(); i++) {
persons[i] = fbb.createString(media.persons.get(i));
}
int person = Media.createPersonsVector(fbb, persons);
byte player = forwardPlayer(media.player);
int copyright = media.copyright != null ? fbb.createString(media.copyright) : 0;
return Media.createMedia(
fbb,
uri,
title,
media.width,
media.height,
format,
media.duration,
media.size,
media.bitrate,
person,
player,
copyright);
}
public byte forwardPlayer(data.media.Media.Player p) {
switch (p) {
case JAVA: return Player.JAVA;
case FLASH: return Player.FLASH;
default:
throw new AssertionError("invalid case: " + p);
}
}
private int forwardImage(data.media.Image image, FlatBufferBuilder fbb) {
int uri = fbb.createString(image.uri);
int title = image.title != null ? fbb.createString(image.title) : 0;
byte size = forwardSize(image.size);
return Image.createImage(fbb, uri, title, image.width, image.height, size);
}
public byte forwardSize(data.media.Image.Size s) {
switch (s) {
case SMALL: return Size.SMALL;
case LARGE: return Size.LARGE;
default:
throw new AssertionError("invalid case: " + s);
}
}
public data.media.MediaContent reverse(MediaContent mc) {
List<data.media.Image> images = new ArrayList<data.media.Image>(mc.imagesLength());
for (int i = 0; i < mc.imagesLength(); i++) {
images.add(reverseImage(mc.images(i)));
}
return new data.media.MediaContent(reverseMedia(mc.media()), images);
}
private data.media.Media reverseMedia(Media media) {
return new data.media.Media(
media.uri(),
media.title(),
media.width(),
media.height(),
media.format(),
media.duration(),
media.size(),
media.bitrate(),
media.bitrate() != 0,
reversePersons(media),
reversePlayer(media.player()),
media.copyright()
);
}
public data.media.Media.Player reversePlayer(byte p) {
switch (p) {
case Player.JAVA: return data.media.Media.Player.JAVA;
case Player.FLASH: return data.media.Media.Player.FLASH;
default:
throw new AssertionError("invalid case: " + p);
}
}
private List<String> reversePersons(Media media) {
List<String> result = new ArrayList<>(media.personsLength());
for(int i = 0; i < media.personsLength(); i++) {
result.add(media.persons(i));
}
return result;
}
private data.media.Image reverseImage(Image image) {
return new data.media.Image(
image.uri(),
image.title(),
image.width(),
image.height(),
reverseSize(image.size()));
}
public data.media.Image.Size reverseSize(byte s) {
switch (s) {
case Size.SMALL: return data.media.Image.Size.SMALL;
case Size.LARGE: return data.media.Image.Size.LARGE;
default:
throw new AssertionError("invalid case: " + s);
}
}
public data.media.MediaContent shallowReverse(MediaContent mc) {
return new data.media.MediaContent(reverseMedia(mc.media()), Collections.<data.media.Image>emptyList());
}
}
}