package serializers.json; import java.io.StringWriter; import java.io.Writer; import java.util.ArrayList; import java.util.List; import serializers.*; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonPrimitive; import data.media.Image; import data.media.Media; import data.media.MediaContent; /** * Driver that uses Gson for manual tree processing. */ public class JsonGsonTree { public static void register(TestGroups groups) { groups.media.add(JavaBuiltIn.mediaTransformer, new SemiManualSerializer("json/gson/manual-tree"), new SerFeatures( SerFormat.JSON, SerGraph.FLAT_TREE, SerClass.MANUAL_OPT, "" ) ); } static class SemiManualSerializer extends Serializer<MediaContent> { private final String name; private final JsonParser parser = new JsonParser(); public SemiManualSerializer(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(parser, mediaContentJsonInput); } public byte[] serialize(MediaContent mediaContent) throws Exception { StringWriter writer = new StringWriter(); writeMediaContent(writer, mediaContent); writer.flush(); return writer.toString().getBytes("UTF-8"); } private static Image readImage(JsonParser parser, String imageJsonInput) { JsonObject imageJsonObject = parser.parse(imageJsonInput).getAsJsonObject(); return readImage(imageJsonObject); } private static Image readImage(JsonObject imageJsonObject) { Image image = new Image(); image.height = imageJsonObject.get("height").getAsInt(); image.size = Image.Size.valueOf(imageJsonObject.get("size").getAsString()); image.title = imageJsonObject.get("title").getAsString(); image.uri = imageJsonObject.get("uri").getAsString(); image.width = imageJsonObject.get("width").getAsInt(); return image; } private static MediaContent readMediaContent(JsonParser parser, String mediaContentJsonInput) throws Exception { JsonObject mediaContentJsonObject = parser.parse(mediaContentJsonInput).getAsJsonObject(); MediaContent mediaContent = new MediaContent(); mediaContent.images = readImages(mediaContentJsonObject.get("images").getAsJsonArray()); mediaContent.media = readMedia(mediaContentJsonObject.get("media").getAsJsonObject()); return mediaContent; } private static Media readMedia(JsonParser parser, String mediaJsonInput) { JsonObject mediaJsonObject = parser.parse(mediaJsonInput).getAsJsonObject(); return readMedia(mediaJsonObject); } private static Media readMedia(JsonObject mediaJsonObject) { Media media = new Media(); JsonElement bitrate = mediaJsonObject.get("bitrate"); if (bitrate != null && !bitrate.isJsonNull()) { media.bitrate = bitrate.getAsInt(); media.hasBitrate = true; } JsonElement copyright = mediaJsonObject.get("copyright"); if (copyright != null && !copyright.isJsonNull()) { media.copyright = copyright.getAsString(); } media.duration = mediaJsonObject.get("duration").getAsLong(); media.format = mediaJsonObject.get("format").getAsString(); media.height = mediaJsonObject.get("height").getAsInt(); media.player = Media.Player.valueOf(mediaJsonObject.get("player").getAsString()); JsonArray personsJsonArray = mediaJsonObject.get("persons").getAsJsonArray(); int size = personsJsonArray.size(); List<String> persons = new ArrayList<String>(size); for (JsonElement person : personsJsonArray) { persons.add(person.getAsString()); } media.persons = persons; media.size = mediaJsonObject.get("size").getAsInt(); media.title = mediaJsonObject.get("title").getAsString(); media.uri = mediaJsonObject.get("uri").getAsString(); media.width = mediaJsonObject.get("width").getAsInt(); return media; } private static List<Image> readImages(JsonParser parser, String imagesJsonInput) throws Exception { JsonArray imagesJsonArray = parser.parse(imagesJsonInput).getAsJsonArray(); return readImages(imagesJsonArray); } private static List<Image> readImages(JsonArray imagesJsonArray) { int size = imagesJsonArray.size(); List<Image> images = new ArrayList<Image>(size); for (JsonElement image : imagesJsonArray) { images.add(readImage(image.getAsJsonObject())); } return images; } private static JsonObject createJsonObject(Image image) { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("height", image.height); jsonObject.addProperty("size", image.size.name()); jsonObject.addProperty("title", image.title); jsonObject.addProperty("uri", image.uri); jsonObject.addProperty("width", image.width); return jsonObject; } private static JsonObject createJsonObject(Media media) { JsonObject jsonObject = new JsonObject(); if (media.hasBitrate) { jsonObject.addProperty("bitrate", media.bitrate); } jsonObject.addProperty("copyright", media.copyright); jsonObject.addProperty("duration", media.duration); jsonObject.addProperty("format", media.format); jsonObject.addProperty("height", media.height); int size = media.persons.size(); JsonArray personsJsonArray = new JsonArray(); for (int i = 0; i < size; i++) { personsJsonArray.add(new JsonPrimitive(media.persons.get(i))); } jsonObject.add("persons", personsJsonArray); jsonObject.addProperty("player", media.player.name()); jsonObject.addProperty("size", media.size); jsonObject.addProperty("title", media.title); jsonObject.addProperty("uri", media.uri); jsonObject.addProperty("width", media.width); return jsonObject; } private static void writeMedia(StringWriter writer, Media media) { JsonObject jsonObject = createJsonObject(media); writer.write(jsonObject.toString()); } private static void writeMediaContent(Writer writer, MediaContent mediaContent) throws Exception { JsonObject jsonObject = new JsonObject(); jsonObject.add("media", createJsonObject(mediaContent.media)); jsonObject.add("images", createJsonArray(mediaContent.images)); writer.write(jsonObject.toString()); } private static void writeImage(Writer writer, Image image) throws Exception { JsonObject jsonObject = createJsonObject(image); writer.write(jsonObject.toString()); } private static JsonArray createJsonArray(List<Image> images) { JsonArray jsonArray = new JsonArray(); for (Image image : images) { jsonArray.add(createJsonObject(image)); } return jsonArray; } private static void writeImages(Writer writer, List<Image> images) throws Exception { JsonArray jsonArray = createJsonArray(images); writer.write(jsonArray.toString()); } } }