package serializers.jackson; import java.io.*; import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import serializers.*; import data.media.Image; import data.media.Media; import data.media.MediaContent; /** * Driver that uses Jackson for manual tree processing (to/from byte[]). */ public class JacksonJsonTree extends BaseJacksonDataBind<MediaContent> { public static void register(TestGroups groups) { groups.media.add(JavaBuiltIn.mediaTransformer, new JacksonJsonTree( "json/jackson/tree",new ObjectMapper()), new SerFeatures( SerFormat.JSON, SerGraph.FLAT_TREE, SerClass.MANUAL_OPT, "" ) ); } public JacksonJsonTree(String name, ObjectMapper mapper) { super(name, MediaContent.class, mapper); } @Override public MediaContent deserialize(byte[] array) throws IOException { return readMediaContent(mapper.readTree(new ByteArrayInputStream(array))); } @Override public byte[] serialize(MediaContent mediaContent) throws IOException { JsonNode root = asTree(mediaContent, mapper.createObjectNode()); return mapper.writeValueAsBytes(root); } @Override public void serializeItems(MediaContent[] items, OutputStream out) throws IOException { JsonGenerator generator = constructGenerator(out); // JSON allows simple sequences, so: for (int i = 0, len = items.length; i < len; ++i) { mapper.writeValue(generator, asTree(items[i], mapper.createObjectNode())); } generator.close(); } @Override public MediaContent[] deserializeItems(InputStream in, int numberOfItems) throws IOException { JsonParser parser = constructParser(in); MediaContent[] result = new MediaContent[numberOfItems]; for (int i = 0; i < numberOfItems; ++i) { result[i] = readMediaContent((JsonNode)mapper.readTree(parser)); } parser.close(); return result; } // // // Methods for deserializing using intermediate Tree representation protected static Image readImage(JsonNode node) { Image image = new Image(); image.height = node.get("height").intValue(); image.size = Image.Size.valueOf(node.get("size").textValue()); image.title = node.get("title").textValue(); image.uri = node.get("uri").textValue(); image.width = node.get("width").intValue(); return image; } protected static List<Image> readImages(ArrayNode imagesNode) { int size = imagesNode.size(); List<Image> images = new ArrayList<Image>(size); for (JsonNode image : imagesNode) { images.add(readImage(image)); } return images; } protected static MediaContent readMediaContent(JsonNode root) throws IOException { MediaContent mediaContent = new MediaContent(); mediaContent.media = readMedia(root.get("media")); mediaContent.images = readImages((ArrayNode) root.get("images")); return mediaContent; } protected static Media readMedia(JsonNode node) { Media media = new Media(); JsonNode bitrate = node.get("bitrate"); if (bitrate != null && !bitrate.isNull()) { media.bitrate = bitrate.intValue(); media.hasBitrate = true; } media.copyright = node.path("copyright").textValue(); media.duration = node.path("duration").longValue(); media.format = node.path("format").textValue(); media.height = node.path("height").intValue(); media.player = Media.Player.valueOf(node.get("player").textValue()); ArrayNode personsArrayNode = (ArrayNode) node.get("persons"); int size = personsArrayNode.size(); List<String> persons = new ArrayList<String>(size); for (JsonNode person : personsArrayNode) { persons.add(person.textValue()); } media.persons = persons; media.size = node.get("size").intValue(); media.title = node.get("title").textValue(); media.uri = node.get("uri").textValue(); media.width = node.get("width").intValue(); return media; } // // // Methods for serializing using intermediate Tree representation protected static JsonNode asTree(MediaContent mediaContent, ObjectNode node) throws IOException { addMedia(mediaContent.media, node.putObject("media")); addImages(mediaContent.images, node.putArray("images")); return node; } protected static ObjectNode addImage(Image image, ObjectNode node) { node.put("height", image.height); node.put("size", image.size.name()); node.put("title", image.title); node.put("uri", image.uri); node.put("width", image.width); return node; } protected static ArrayNode addImages(List<Image> images, ArrayNode node) { for (Image image : images) { addImage(image, node.addObject()); } return node; } protected static ObjectNode addMedia(Media media, ObjectNode node) { if (media.hasBitrate) { node.put("bitrate", media.bitrate); } node.put("copyright", media.copyright); node.put("duration", media.duration); node.put("format", media.format); node.put("height", media.height); ArrayNode persons = node.arrayNode(); for (String person : media.persons) { persons.add(person); } node.set("persons", persons); node.put("player", media.player.name()); node.put("size", media.size); node.put("title", media.title); node.put("uri", media.uri); node.put("width", media.width); return node; } }