package serializers.avro; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.avro.generic.GenericArray; import org.apache.avro.generic.GenericData; import serializers.avro.media.Image; import serializers.avro.media.Media; import serializers.avro.media.MediaContent; import data.media.MediaTransformer; /** * Transformer is needed when we use Avro-generated Java classes, to convert * between these and POJOs for verification purposes. This transformation * is NOT done during performance testing, as it could be viewed as * unfair overhead for use cases where generated class is used instead * of equivalent POJO. */ public class AvroTransformer extends MediaTransformer<MediaContent> { @Override public MediaContent[] resultArray(int size) { return new MediaContent[size]; } // ---------------------------------------------------------- // Forward public MediaContent forward(data.media.MediaContent mc) { GenericArray<Image> images = new GenericData.Array<Image>(mc.images.size(), Avro.Media.sImages); for (data.media.Image image : mc.images) { images.add(forwardImage(image)); } MediaContent amc = new MediaContent(); amc.setMedia(forwardMedia(mc.media)); amc.setImages(images); return amc; } private Media forwardMedia(data.media.Media media) { Media m = new Media(); m.setUri(media.uri); m.setTitle(media.title); m.setWidth(media.width); m.setHeight(media.height); m.setFormat(media.format); m.setDuration(media.duration); m.setSize(media.size); if (media.hasBitrate) { m.setBitrate(media.bitrate); } GenericArray<CharSequence> persons = new GenericData.Array<CharSequence>(media.persons.size(), Avro.Media.sPersons); for (String s : media.persons) { persons.add(s); } m.setPersons(persons); m.setPlayer(forwardPlayer(media.player)); m.setCopyright(media.copyright); return m; } public int forwardPlayer(data.media.Media.Player p) { switch (p) { case JAVA: return 1; case FLASH: return 2; default: throw new AssertionError("invalid case: " + p); } } private Image forwardImage(data.media.Image image) { Image i = new Image(); i.setUri(image.uri); i.setTitle(image.title); i.setWidth(image.width); i.setHeight(image.height); i.setSize(forwardSize(image.size)); return i; } public int forwardSize(data.media.Image.Size s) { switch (s) { case SMALL: return 1; case LARGE: return 2; 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>((int) mc.getImages().size()); for (Image image : mc.getImages()) { images.add(reverseImage(image)); } return new data.media.MediaContent(reverseMedia(mc.getMedia()), images); } private data.media.Media reverseMedia(Media media) { // Media List<String> persons = new ArrayList<String>(); for (CharSequence p : media.getPersons()) { persons.add(p.toString()); } return new data.media.Media( media.getUri().toString(), media.getTitle() != null ? media.getTitle().toString() : null, media.getWidth(), media.getHeight(), media.getFormat().toString(), media.getDuration(), media.getSize(), media.getBitrate() != null ? media.getBitrate() : 0, media.getBitrate() != null, persons, reversePlayer(media.getPlayer()), media.getCopyright() != null ? media.getCopyright().toString() : null ); } public data.media.Media.Player reversePlayer(int p) { switch (p) { case 1: return data.media.Media.Player.JAVA; case 2: return data.media.Media.Player.FLASH; default: throw new AssertionError("invalid case: " + p); } } private data.media.Image reverseImage(Image image) { return new data.media.Image( image.getUri().toString(), image.getTitle() != null ? image.getTitle().toString() : null, image.getWidth(), image.getHeight(), reverseSize(image.getSize())); } public data.media.Image.Size reverseSize(int s) { switch (s) { case 1: return data.media.Image.Size.SMALL; case 2: 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()); } }