package serializers; import static data.media.FieldMapping.*; import java.util.ArrayList; import java.util.List; import org.bson.BSONDecoder; import org.bson.BSONEncoder; import org.bson.BSONObject; import org.bson.BasicBSONObject; import org.bson.types.BasicBSONList; import data.media.Image; import data.media.Media; import data.media.MediaContent; public class MongoDB { public static void register(TestGroups groups) { groups.media.add(JavaBuiltIn.mediaTransformer, new MongoDBSerializer(), new SerFeatures( SerFormat.BIN_CROSSLANG, SerGraph.FLAT_TREE, SerClass.MANUAL_OPT, "" ) ); } public static final class MongoDBSerializer extends Serializer<MediaContent> { @Override public String getName() { return "bson/mongodb/manual"; } @Override public byte[] serialize(MediaContent data) throws Exception { BSONObject o = new BasicBSONObject(); BSONObject media = serializeMedia(data.media); o.put(FULL_FIELD_NAME_MEDIA, media); BSONObject[] images = new BSONObject[data.images.size()]; int j = 0; for (Image i : data.images) { images[j++] = serializeImage(i); } o.put(FULL_FIELD_NAME_IMAGES, images); BSONEncoder enc = new BSONEncoder(); return enc.encode(o); } protected BSONObject serializeMedia(Media media) { BSONObject r = new BasicBSONObject(); r.put(FULL_FIELD_NAME_PLAYER, media.player.name()); r.put(FULL_FIELD_NAME_URI, media.uri); if (media.title != null) r.put(FULL_FIELD_NAME_TITLE, media.title); r.put(FULL_FIELD_NAME_WIDTH, media.width); r.put(FULL_FIELD_NAME_HEIGHT, media.height); r.put(FULL_FIELD_NAME_FORMAT, media.format); r.put(FULL_FIELD_NAME_DURATION, media.duration); r.put(FULL_FIELD_NAME_SIZE, media.size); if (media.hasBitrate) r.put(FULL_FIELD_NAME_BITRATE, media.bitrate); if (media.copyright != null) r.put(FULL_FIELD_NAME_COPYRIGHT, media.copyright); r.put(FULL_FIELD_NAME_PERSONS, media.persons); return r; } protected BSONObject serializeImage(Image image) { BSONObject r = new BasicBSONObject(); r.put(FULL_FIELD_NAME_URI, image.uri); if (image.title != null) r.put(FULL_FIELD_NAME_TITLE, image.title); r.put(FULL_FIELD_NAME_WIDTH, image.width); r.put(FULL_FIELD_NAME_HEIGHT, image.height); r.put(FULL_FIELD_NAME_SIZE, image.size.name()); return r; } public MediaContent deserialize(byte[] array) throws Exception { MediaContent r = new MediaContent(); BSONDecoder dec = new BSONDecoder(); BSONObject o = dec.readObject(array); for (String name : o.keySet()) { Integer i = fullFieldToIndex.get(name); if (i != null) { switch (i) { case FIELD_IX_MEDIA: r.media = deserializeMedia((BSONObject)o.get(name)); continue; case FIELD_IX_IMAGES: r.images = deserializeImages((BasicBSONList)o.get(name)); continue; } } throw new IllegalStateException("Unexpected field '" + name + "'"); } return r; } protected Media deserializeMedia(BSONObject media) { Media r = new Media(); for (String name : media.keySet()) { Integer i = fullFieldToIndex.get(name); if (i != null) { switch (i) { case FIELD_IX_PLAYER: r.player = Media.Player.valueOf((String)media.get(name)); continue; case FIELD_IX_URI: r.uri = (String)media.get(name); continue; case FIELD_IX_TITLE: r.title = (String)media.get(name); continue; case FIELD_IX_WIDTH: r.width = (Integer)media.get(name); continue; case FIELD_IX_HEIGHT: r.height = (Integer)media.get(name); continue; case FIELD_IX_FORMAT: r.format = (String)media.get(name); continue; case FIELD_IX_DURATION: r.duration = (Long)media.get(name); continue; case FIELD_IX_SIZE: r.size = (Long)media.get(name); continue; case FIELD_IX_BITRATE: r.bitrate = (Integer)media.get(name); r.hasBitrate = true; continue; case FIELD_IX_PERSONS: BasicBSONList pl = (BasicBSONList)media.get(name); List<String> persons = new ArrayList<String>(); for (Object o : pl) { persons.add((String)o); } r.persons = persons; continue; case FIELD_IX_COPYRIGHT: r.copyright = (String)media.get(name); continue; } } throw new IllegalStateException("Unexpected field '" + name + "'"); } return r; } protected List<Image> deserializeImages(BasicBSONList images) { List<Image> r = new ArrayList<Image>(); for (Object o : images) { r.add(deserializeImage((BSONObject)o)); } return r; } protected Image deserializeImage(BSONObject image) { Image r = new Image(); for (String name : image.keySet()) { Integer i = fullFieldToIndex.get(name); if (i != null) { switch (i) { case FIELD_IX_URI: r.uri = (String)image.get(name); continue; case FIELD_IX_TITLE: r.title = (String)image.get(name); continue; case FIELD_IX_WIDTH: r.width = (Integer)image.get(name); continue; case FIELD_IX_HEIGHT: r.height = (Integer)image.get(name); continue; case FIELD_IX_SIZE: r.size = Image.Size.valueOf((String)image.get(name)); continue; } } throw new IllegalStateException("Unexpected field '" + name + "'"); } return r; } } }