package serializers.json;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONWriter;
import serializers.*;
import data.media.Image;
import data.media.Media;
import data.media.MediaContent;
/**
* Driver that uses the json.org reference JSON implementation in Java, with semi-manual parsing.
*/
public class JsonDotOrgManualTree
{
public static void register(TestGroups groups)
{
groups.media.add(JavaBuiltIn.mediaTransformer,
new ManualTreeSerializer("json/org.json/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 Exception
{
StringWriter writer = new StringWriter();
writeMediaContent(new JSONWriter(writer), mediaContent);
writer.flush();
return writer.toString().getBytes("UTF-8");
}
static Media readMedia(String mediaJsonInput) throws Exception
{
JSONObject mediaJsonObject = new JSONObject(mediaJsonInput);
return readMedia(mediaJsonObject);
}
static Media readMedia(JSONObject mediaJsonObject) throws Exception
{
Media media = new Media();
Object bitrate = mediaJsonObject.get("bitrate");
if (bitrate != null && bitrate instanceof Integer)
{
media.bitrate = ((Integer) bitrate).intValue();
media.hasBitrate = true;
}
Object copyright = mediaJsonObject.get("copyright");
if (copyright != null && !JSONObject.NULL.equals(copyright))
{
media.copyright = (String) mediaJsonObject.get("copyright");
}
media.duration = ((Integer) mediaJsonObject.get("duration")).longValue();
media.format = (String) mediaJsonObject.get("format");
media.height = ((Integer) mediaJsonObject.get("height")).intValue();
List<String> persons = new ArrayList<String>();
JSONArray personsJsonArray = (JSONArray) mediaJsonObject.get("persons");
for (int i = 0, size = personsJsonArray.length(); i < size; i++)
{
persons.add((String) personsJsonArray.get(i));
}
media.persons = persons;
media.player = Media.Player.valueOf((String) mediaJsonObject.get("player"));
media.size = ((Integer) mediaJsonObject.get("size")).longValue();
media.title = (String) mediaJsonObject.get("title");
media.uri = (String) mediaJsonObject.get("uri");
media.width = ((Integer) mediaJsonObject.get("width")).intValue();
return media;
}
static MediaContent readMediaContent(String mediaContentJsonInput) throws Exception
{
JSONObject mediaContentJsonObject = new JSONObject(mediaContentJsonInput);
MediaContent mediaContent = new MediaContent();
mediaContent.images = readImages((JSONArray) mediaContentJsonObject.get("images"));
mediaContent.media = readMedia((JSONObject) mediaContentJsonObject.get("media"));
return mediaContent;
}
static Image readImage(String imageJsonInput) throws Exception
{
JSONObject imageJsonObject = new JSONObject(imageJsonInput);
return readImage(imageJsonObject);
}
static Image readImage(JSONObject imageJsonObject) throws Exception
{
Image image = new Image();
image.height = ((Integer) imageJsonObject.get("height")).intValue();
image.size = Image.Size.valueOf((String) imageJsonObject.get("size"));
image.title = (String) imageJsonObject.get("title");
image.uri = (String) imageJsonObject.get("uri");
image.width = ((Integer) imageJsonObject.get("width")).intValue();
return image;
}
static List<Image> readImages(String imagesJsonInput) throws Exception
{
JSONArray imagesJsonArray = new JSONArray(imagesJsonInput);
return readImages(imagesJsonArray);
}
static List<Image> readImages(JSONArray imagesJsonArray) throws Exception
{
int size = imagesJsonArray.length();
List<Image> images = new ArrayList<Image>(size);
for (int i = 0; i < size; i++)
{
images.add(readImage((JSONObject) imagesJsonArray.get(i)));
}
return images;
}
static void writeJsonObject(JSONWriter jsonWriter, Media media) throws Exception
{
jsonWriter.object();
if (media.hasBitrate)
{
jsonWriter.key("bitrate").value(media.bitrate);
}
jsonWriter.key("copyright").value(media.copyright);
jsonWriter.key("duration").value(media.duration);
jsonWriter.key("format").value(media.format);
jsonWriter.key("height").value(media.height);
JSONArray personsJsonArray = new JSONArray();
for (int i = 0, size = media.persons.size(); i < size; i++)
{
personsJsonArray.put(media.persons.get(i));
}
jsonWriter.key("persons").value(personsJsonArray);
jsonWriter.key("player").value(media.player.name());
jsonWriter.key("size").value(media.size);
jsonWriter.key("title").value(media.title);
jsonWriter.key("uri").value(media.uri);
jsonWriter.key("width").value(media.width);
jsonWriter.endObject();
}
static void writeMedia(JSONWriter jsonWriter, Media media) throws Exception
{
writeJsonObject(jsonWriter, media);
}
static void writeImage(JSONWriter jsonWriter, Image image) throws Exception
{
writeJsonObject(jsonWriter, image);
}
static void writeJsonObject(JSONWriter jsonWriter, Image image) throws Exception
{
jsonWriter.object();
jsonWriter.key("height").value(image.height);
jsonWriter.key("size").value(image.size.name());
jsonWriter.key("title").value(image.title);
jsonWriter.key("uri").value(image.uri);
jsonWriter.key("width").value(image.width);
jsonWriter.endObject();
}
static void writeMediaContent(JSONWriter jsonWriter, MediaContent mediaContent) throws Exception
{
jsonWriter.object();
jsonWriter.key("media");
writeJsonObject(jsonWriter, mediaContent.media);
jsonWriter.key("images");
writeJsonArray(jsonWriter, mediaContent.images);
jsonWriter.endObject();
}
static void writeJsonArray(JSONWriter jsonWriter, List<Image> images) throws Exception
{
jsonWriter.array();
for (Image image : images)
{
writeJsonObject(jsonWriter, image);
}
jsonWriter.endArray();
}
static void writeImages(JSONWriter jsonWriter, List<Image> images) throws Exception
{
writeJsonArray(jsonWriter, images);
}
}
}