package serializers.colfer;
import java.nio.BufferOverflowException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import data.media.*;
import serializers.SerClass;
import serializers.SerFeatures;
import serializers.SerFormat;
import serializers.SerGraph;
import serializers.Serializer;
import serializers.TestGroups;
import serializers.colfer.media.Image;
import serializers.colfer.media.Media;
import serializers.colfer.media.MediaContent;
public class Colfer {
public static void register(TestGroups groups) {
groups.media.add(new Transformer(), new ColferSerializer(),
new SerFeatures(
SerFormat.BIN_CROSSLANG,
SerGraph.FLAT_TREE,
SerClass.CLASSES_KNOWN,
"generated code"
)
);
}
static final class ColferSerializer extends Serializer<MediaContent> {
private byte[] buffer = new byte[1024];
@Override
public MediaContent deserialize(byte[] array) throws Exception {
MediaContent mc = new MediaContent();
mc.unmarshal(array, 0);
return mc;
}
@Override
public byte[] serialize(MediaContent content) {
while (true) {
try {
int n = content.marshal(buffer, 0);
return Arrays.copyOf(buffer, n);
} catch (BufferOverflowException e) {
buffer = new byte[buffer.length * 2];
}
}
}
public String getName() {
return "colfer";
}
}
static final class Transformer extends MediaTransformer<MediaContent> {
@Override
public MediaContent[] resultArray(int size) {
return new MediaContent[size];
}
@Override
public data.media.MediaContent shallowReverse(MediaContent mc) {
return new data.media.MediaContent(reverseMedia(mc.getMedia()), Collections.<data.media.Image>emptyList());
}
@Override
public MediaContent forward(data.media.MediaContent src) {
int i = src.images.size();
Image[] images = new Image[i];
while (--i >= 0) {
images[i] = forwardImage(src.images.get(i));
}
MediaContent dst = new MediaContent();
dst.images = images;
dst.media = forwardMedia(src.media);
return dst;
}
@Override
public data.media.MediaContent reverse(MediaContent src) {
List<data.media.Image> images = new ArrayList<>(src.images.length);
for (Image image : src.images) {
images.add(reverseImage(image));
}
return new data.media.MediaContent(reverseMedia(src.media), images);
}
private static Media forwardMedia(data.media.Media src) {
Media dst = new Media();
dst.uri = src.uri;
dst.title = src.title;
dst.width = src.width;
dst.height = src.height;
dst.format = src.format;
dst.duration = src.duration;
dst.size = src.size;
dst.bitrate = src.bitrate;
dst.hasBitrate = src.hasBitrate;
dst.persons = src.persons.toArray(dst.persons);
switch (src.player) {
case FLASH:
dst.flashPlay = true;
break;
case JAVA:
dst.javaPlay = true;
break;
}
if (src.copyright != null)
dst.copyright = src.copyright;
return dst;
}
private static data.media.Media reverseMedia(Media src) {
data.media.Media dst = new data.media.Media();
dst.uri = src.uri;
dst.title = src.title;
dst.width = src.width;
dst.height = src.height;
dst.format = src.format;
dst.duration = src.duration;
dst.size = src.size;
dst.bitrate = src.bitrate;
dst.hasBitrate = src.hasBitrate;
dst.persons = Arrays.asList(src.persons);
if (src.flashPlay) {
dst.player = data.media.Media.Player.FLASH;
}
if (src.javaPlay) {
dst.player = data.media.Media.Player.JAVA;
}
if (src.copyright.length() != 0) {
dst.copyright = src.copyright;
}
return dst;
}
private static Image forwardImage(data.media.Image src) {
Image dst = new Image();
dst.uri = src.uri;
dst.title = src.title;
dst.width = src.width;
dst.height = src.height;
switch (src.size) {
case SMALL:
dst.small = true;
break;
case LARGE:
dst.large = true;
break;
}
return dst;
}
private static data.media.Image reverseImage(Image src) {
data.media.Image dst = new data.media.Image();
dst.uri = src.uri;
dst.title = src.title;
dst.width = src.width;
dst.height = src.height;
if (src.small) {
dst.size = data.media.Image.Size.SMALL;
}
if (src.large) {
dst.size = data.media.Image.Size.LARGE;
}
return dst;
}
}
}