package serializers.datakernel;
import data.media.Image;
import data.media.Media;
import data.media.MediaContent;
import data.media.MediaTransformer;
import io.datakernel.serializer.BufferSerializer;
import io.datakernel.serializer.SerializationInputBuffer;
import io.datakernel.serializer.SerializationOutputBuffer;
import io.datakernel.serializer.SerializerBuilder;
import io.datakernel.serializer.annotations.Serialize;
import io.datakernel.serializer.annotations.SerializeNullable;
import io.datakernel.serializer.annotations.SerializeVarLength;
import serializers.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class DataKernelSerializer {
public static void register(TestGroups groups) {
register(groups.media, DataKernelSerializer.mediaTransformer);
}
private static <T, S> void register(TestGroup<T> group, Transformer<T, S> transformer) {
group.add(transformer, new DefaultSerializer<S>(),
new SerFeatures(SerFormat.BINARY,
SerGraph.FLAT_TREE,
SerClass.MANUAL_OPT,
"manually optimized"));
}
public static class DefaultSerializer<T> extends Serializer<T> {
private BufferSerializer<T> serializer;
private byte[] array = new byte[20000];
SerializationOutputBuffer output = new SerializationOutputBuffer(array);
public DefaultSerializer() {
serializer = SerializerBuilder
.newDefaultInstance(ClassLoader.getSystemClassLoader())
.create(DMediaContent.class);
}
@Override
public T deserialize(byte[] array) throws Exception {
return serializer.deserialize(new SerializationInputBuffer(array, 0));
}
@Override
public byte[] serialize(T content) throws Exception {
output.position(0);
serializer.serialize(output, content);
byte[] bytes = new byte[output.position()];
System.arraycopy(array, 0, bytes, 0, output.position());
return bytes;
}
@Override
public String getName() {
return "datakernel";
}
}
public static class DImage {
public enum Size {
SMALL, LARGE
}
@Serialize(order = 1)
public String uri;
@Serialize(order = 2)
@SerializeNullable
public String title; // can be null;
@Serialize(order = 3)
@SerializeVarLength
public int width;
@Serialize(order = 4)
@SerializeVarLength
public int height;
@Serialize(order = 5)
public Size size;
public DImage(String uri, String title, int width, int height, Size size) {
this.uri = uri;
this.title = title;
this.width = width;
this.height = height;
this.size = size;
}
public DImage() {}
}
public static class DMedia {
public enum Player {
JAVA, FLASH
}
@Serialize(order = 1)
public String uri;
@Serialize(order = 2)
@SerializeNullable
public String title; // can be null
@Serialize(order = 3)
@SerializeVarLength
public int width;
@Serialize(order = 4)
@SerializeVarLength
public int height;
@Serialize(order = 5)
public String format;
@Serialize(order = 6)
public long duration;
@Serialize(order = 7)
public long size;
@Serialize(order = 8)
public int bitrate; // can be unset
@Serialize(order = 9)
public boolean hasBitrate;
@Serialize(order = 10)
public List<String> persons;
@Serialize(order = 11)
public Player player;
@Serialize(order = 12)
@SerializeNullable
public String copyright; // can be null
public DMedia(String uri, String title, int width, int height,
String format, long duration, long size, int bitrate,
boolean hasBitrate, List<String> persons, Player player,
String copyright) {
this.uri = uri;
this.title = title;
this.width = width;
this.height = height;
this.format = format;
this.duration = duration;
this.size = size;
this.bitrate = bitrate;
this.hasBitrate = hasBitrate;
this.persons = persons;
this.player = player;
this.copyright = copyright;
}
public DMedia() {}
}
public static class DMediaContent {
@Serialize(order = 1)
public List<DImage> DImages;
@Serialize(order = 2)
public DMedia DMedia;
public DMediaContent(List<DImage> list, DMedia DMedia) {
this.DImages = list;
this.DMedia = DMedia;
}
public DMediaContent() {}
}
public static MediaTransformer<DMediaContent> mediaTransformer = new MediaTransformer<DMediaContent>() {
@Override
public DMediaContent forward(MediaContent a) {
return new DMediaContent(forwardImages(a.getImages()), forwardMedia(a.getMedia()));
}
@Override
public MediaContent reverse(DMediaContent a) {
return new MediaContent(reverseMedia(a.DMedia), reverseImages(a.DImages));
}
@Override
public MediaContent shallowReverse(DMediaContent a) {
return new MediaContent(reverseMedia(a.DMedia), Collections.<Image>emptyList());
}
};
private static List<DImage> forwardImages(List<Image> images) {
List<DImage> list = new ArrayList<>(images.size());
for (Image image : images) {
list.add(forwardImage(image));
}
return list;
}
private static DMedia forwardMedia(Media m) {
return new DMedia(m.uri, m.title, m.width, m.height,
m.format, m.duration, m.size, m.bitrate,
m.hasBitrate, m.persons, forwardPlayer(m.player),
m.copyright);
}
private static DImage forwardImage(Image i) {
return new DImage(i.uri, i.title, i.width, i.height, forwardSize(i.size));
}
private static List<Image> reverseImages(List<DImage> DImages) {
List<Image> list = new ArrayList<>(DImages.size());
for (DImage DImage : DImages) {
list.add(reverseImage(DImage));
}
return list;
}
private static Media reverseMedia(DMedia m) {
return new Media(m.uri, m.title, m.width, m.height,
m.format, m.duration, m.size, m.bitrate,
m.hasBitrate, m.persons, reversePlayer(m.player),
m.copyright);
}
private static Image reverseImage(DImage i) {
return new Image(i.uri, i.title, i.width, i.height, reverseSize(i.size));
}
private static Image.Size reverseSize(DImage.Size oldSize) {
return Image.Size.values()[(oldSize.ordinal())];
}
private static Media.Player reversePlayer(DMedia.Player oldPlayer) {
return Media.Player.values()[(oldPlayer.ordinal())];
}
private static DImage.Size forwardSize(Image.Size oldSize) {
return DImage.Size.valueOf(oldSize.name());
}
private static DMedia.Player forwardPlayer(Media.Player oldPlayer) {
return DMedia.Player.valueOf(oldPlayer.name());
}
}