package serializers.protobuf;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import data.media.MediaTransformer;
import serializers.*;
import serializers.activemq.media.MediaContentHolder.Image;
import serializers.activemq.media.MediaContentHolder.Media;
import serializers.activemq.media.MediaContentHolder.MediaContent;
import serializers.activemq.media.MediaContentHolder.Image.ImageBean;
import serializers.activemq.media.MediaContentHolder.Image.Size;
import serializers.activemq.media.MediaContentHolder.Media.MediaBean;
import serializers.activemq.media.MediaContentHolder.Media.Player;
import serializers.activemq.media.MediaContentHolder.MediaContent.MediaContentBean;
import serializers.activemq.media.MediaContentHolder.MediaContent.MediaContentBuffer;
public class ActiveMQProtobuf
{
public static void register(TestGroups groups)
{
groups.media.add(mediaTransformer, MediaSerializer,
new SerFeatures(
SerFormat.BIN_CROSSLANG,
SerGraph.FLAT_TREE,
SerClass.CLASSES_KNOWN,
""
)
);
}
// ------------------------------------------------------------
// Serializers
public static final Serializer<MediaContent> MediaSerializer = new Serializer<MediaContent>()
{
public MediaContent deserialize(byte[] array) throws Exception
{
return MediaContentBuffer.parseUnframed(array);
}
public byte[] serialize(MediaContent content)
{
return content.freeze().toUnframedByteArray();
}
public String getName()
{
return "protobuf/activemq+alt";
}
};
// ------------------------------------------------------------
// Transformers
public static final MediaTransformer<MediaContent> mediaTransformer = new MediaTransformer<MediaContent>()
{
@Override
public MediaContent[] resultArray(int size) { return new MediaContent[size]; }
// ----------------------------------------------------------
// Forward
public MediaContent forward(data.media.MediaContent mc)
{
MediaContentBean cb = new MediaContentBean();
cb.setMedia(forwardMedia(mc.media));
for (data.media.Image image : mc.images) {
cb.addImage(forwardImage(image));
}
return cb;
}
private Media forwardMedia(data.media.Media media)
{
// Media
MediaBean mb = new MediaBean();
mb.setUri(media.uri);
if (media.title != null) mb.setTitle(media.title);
mb.setWidth(media.width);
mb.setHeight(media.height);
mb.setFormat(media.format);
mb.setDuration(media.duration);
mb.setSize(media.size);
if (media.hasBitrate) mb.setBitrate(media.bitrate);
for (String person : media.persons) {
mb.addPerson(person);
}
mb.setPlayer(forwardPlayer(media.player));
if (media.copyright != null) mb.setCopyright(media.copyright);
return mb;
}
public Player 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 Image forwardImage(data.media.Image image)
{
ImageBean ib = new ImageBean();
ib.setUri(image.uri);
if (image.title != null) ib.setTitle(image.title);
ib.setWidth(image.width);
ib.setHeight(image.height);
ib.setSize(forwardSize(image.size));
return ib;
}
public Size 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);
}
}
// ----------------------------------------------------------
// Reverse
public data.media.MediaContent reverse(MediaContent mc)
{
List<data.media.Image> images = new ArrayList<data.media.Image>(mc.getImageCount());
for (Image image : mc.getImageList()) {
images.add(reverseImage(image));
}
return new data.media.MediaContent(reverseMedia(mc.getMedia()), images);
}
private data.media.Media reverseMedia(Media media)
{
// Media
return new data.media.Media(
media.getUri(),
media.hasTitle() ? media.getTitle() : null,
media.getWidth(),
media.getHeight(),
media.getFormat(),
media.getDuration(),
media.getSize(),
media.hasBitrate() ? media.getBitrate() : 0,
media.hasBitrate(),
new ArrayList<String>(media.getPersonList()),
reversePlayer(media.getPlayer()),
media.hasCopyright() ? media.getCopyright() : null
);
}
public data.media.Media.Player reversePlayer(Player p)
{
if (p == Player.JAVA) return data.media.Media.Player.JAVA;
if (p == Player.FLASH) return data.media.Media.Player.FLASH;
throw new AssertionError("invalid case: " + p);
}
private data.media.Image reverseImage(Image image)
{
return new data.media.Image(
image.getUri(),
image.hasTitle() ? image.getTitle() : null,
image.getWidth(),
image.getHeight(),
reverseSize(image.getSize()));
}
public data.media.Image.Size reverseSize(Size s)
{
switch (s) {
case SMALL: return data.media.Image.Size.SMALL;
case 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.getMedia()), Collections.<data.media.Image>emptyList());
}
};
}