package serializers.json; import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import serializers.*; import jsonij.json.JSON; import jsonij.json.JSONMarshaler; import jsonij.json.JSONParser; import jsonij.json.Value; import data.media.Image; import data.media.Media; import data.media.MediaContent; /** * Driver that uses JSONiJ [http://projects.plural.cc/projects/jsonij], with manual tree processing. */ public class JsonijManualTree { public static void register(TestGroups groups) { groups.media.add(JavaBuiltIn.mediaTransformer, new ManualTreeSerializer("json/jsonij/manual-tree"), new SerFeatures( SerFormat.JSON, SerGraph.FLAT_TREE, SerClass.MANUAL_OPT, "" ) ); } static class ManualTreeSerializer extends Serializer<MediaContent> { private final String name; public ManualTreeSerializer(String name) { this.name = name; } public String getName() { return name; } public MediaContent deserialize(byte[] array) throws Exception { String mediaContentJsonInput = new String(array, "UTF-8"); return readMediaContent(mediaContentJsonInput); } public byte[] serialize(MediaContent mediaContent) throws IOException { StringWriter writer = new StringWriter(); writeMediaContent(writer, mediaContent); writer.flush(); return writer.toString().getBytes("UTF-8"); } @SuppressWarnings({ "unchecked", "rawtypes" }) static MediaContent readMediaContent(String mediaContentJsonInput) throws Exception { JSONParser parser = new JSONParser(); JSON.Object mediaContentJsonObject = (JSON.Object) parser.parse(mediaContentJsonInput); JSON.Object mediaJsonObject = (JSON.Object) mediaContentJsonObject.get("media"); Media media = readMedia(mediaJsonObject); JSON.Array<Value> imageValues = (JSON.Array<Value>) mediaContentJsonObject.get("images"); List<Image> images = readImages(imageValues); MediaContent mediaContent = new MediaContent(); mediaContent.media = media; mediaContent.images = images; return mediaContent; } @SuppressWarnings({ "unchecked" }) static List<Image> readImages(String imagesJsonInput) throws Exception { JSONParser parser = new JSONParser(); JSON.Array<Value> imageValues = (JSON.Array<Value>) parser.parse(imagesJsonInput); return readImages(imageValues); } @SuppressWarnings("rawtypes") static List<Image> readImages(JSON.Array<Value> imageValues) throws Exception { int size = imageValues.size(); List<Image> images = new ArrayList<Image>(size); for (int i = 0; i < size; i++) { JSON.Object imageJsonObject = (JSON.Object) imageValues.get(i); Image image = readImage(imageJsonObject); images.add(image); } return images; } @SuppressWarnings("rawtypes") static Image readImage(String imageJsonInput) throws Exception { JSONParser parser = new JSONParser(); JSON.Object imageJsonObject = (JSON.Object) parser.parse(imageJsonInput); return readImage(imageJsonObject); } @SuppressWarnings("rawtypes") static Image readImage(JSON.Object imageJsonObject) throws Exception { Image image = new Image(); image.height = imageJsonObject.get("height").getInt(); image.size = Image.Size.valueOf(imageJsonObject.get("size").getString()); image.title = imageJsonObject.get("title").getString(); image.uri = imageJsonObject.get("uri").getString(); image.width = imageJsonObject.get("width").getInt(); return image; } @SuppressWarnings({ "rawtypes" }) static Media readMedia(String mediaJsonInput) throws Exception { JSONParser parser = new JSONParser(); JSON.Object mediaJsonObject = (JSON.Object) parser.parse(mediaJsonInput); return readMedia(mediaJsonObject); } @SuppressWarnings({ "unchecked", "rawtypes" }) static Media readMedia(JSON.Object mediaJsonObject) { Media media = new Media(); Value bitrate = mediaJsonObject.get("bitrate"); if (bitrate != null && !bitrate.isNull()) { media.bitrate = bitrate.getInt(); media.hasBitrate = true; } Value copyright = mediaJsonObject.get("copyright"); if (copyright != null && !copyright.isNull()) { media.copyright = copyright.getString(); } media.duration = mediaJsonObject.get("duration").getNumber().longValue(); media.format = mediaJsonObject.get("format").getString(); media.height = mediaJsonObject.get("height").getInt(); JSON.Array<Value> personValues = (JSON.Array<Value>) mediaJsonObject.get("persons"); int size = personValues.size(); List<String> persons = new ArrayList<String>(size); for (int i = 0; i < size; i++) { persons.add(personValues.get(i).getString()); } media.persons = persons; media.player = Media.Player.valueOf(mediaJsonObject.get("player").getString()); media.size = mediaJsonObject.get("size").getNumber().longValue(); media.title = mediaJsonObject.get("title").getString(); media.uri = mediaJsonObject.get("uri").getString(); media.width = mediaJsonObject.get("width").getInt(); return media; } static void writeMedia(StringWriter writer, Media media) { JSON json = JSONMarshaler.marshalObject(media); writer.write(json.toJSON()); } static void writeImage(StringWriter writer, Image image) { JSON json = JSONMarshaler.marshalObject(image); writer.write(json.toJSON()); } static void writeImages(StringWriter writer, List<Image> images) { JSON json = JSONMarshaler.marshalObject(images); writer.write(json.toJSON()); } static void writeMediaContent(StringWriter writer, MediaContent mediaContent) { JSON json = JSONMarshaler.marshalObject(mediaContent); writer.write(json.toJSON()); } } }