package serializers.json;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import serializers.*;
import jsonij.json.JPath;
import jsonij.json.JSON;
import jsonij.json.JSONMarshaler;
import jsonij.json.JSONParser;
import jsonij.json.Value;
import jsonij.json.JSON.Array;
import data.media.Image;
import data.media.Media;
import data.media.MediaContent;
/**
* Driver that uses JSONiJ [http://projects.plural.cc/projects/jsonij], with JPath parsing.
*/
public class JsonijJpath
{
public static void register(TestGroups groups)
{
groups.media.add(JavaBuiltIn.mediaTransformer,
new SemiManualSerializer("json/jsonij/manual-jpath"),
new SerFeatures(
SerFormat.JSON,
SerGraph.FLAT_TREE,
SerClass.MANUAL_OPT,
""
)
);
}
static class SemiManualSerializer extends Serializer<MediaContent>
{
private final String name;
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(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" })
static MediaContent readMediaContent(String mediaContentJsonInput) throws Exception
{
MediaContent mediaContent = new MediaContent();
JSON json = JSON.parse(mediaContentJsonInput);
Media media = new Media();
Value bitrate = JPath.parse("/media/bitrate").evaluate(json);
if (bitrate != null && !bitrate.isNull())
{
media.bitrate = bitrate.getInt();
media.hasBitrate = true;
}
Value copyright = JPath.parse("/media/copyright").evaluate(json);
if (copyright != null && !copyright.isNull())
{
media.copyright = copyright.getString();
}
media.duration = JPath.parse("/media/duration").evaluate(json).getNumber().longValue();
media.format = JPath.parse("/media/format").evaluate(json).getString();
media.height = JPath.parse("/media/height").evaluate(json).getInt();
JSON.Array<Value> personValues = (JSON.Array<Value>) JPath.parse("/media/persons").evaluate(json);
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(JPath.parse("/media/player").evaluate(json).getString());
media.size = JPath.parse("/media/size").evaluate(json).getNumber().longValue();
media.title = JPath.parse("/media/title").evaluate(json).getString();
media.uri = JPath.parse("/media/uri").evaluate(json).getString();
media.width = JPath.parse("/media/width").evaluate(json).getInt();
JSON.Array<Value> imageValues = (JSON.Array<Value>) JPath.parse("/images").evaluate(json);
List<Image> images = readImages(imageValues);
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(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("unchecked")
static Media readMedia(String mediaJsonInput) throws Exception
{
JSON json = JSON.parse(mediaJsonInput);
Media media = new Media();
Value bitrate = JPath.parse("/bitrate").evaluate(json);
if (bitrate != null && !bitrate.isNull())
{
media.bitrate = bitrate.getInt();
media.hasBitrate = true;
}
Value copyright = JPath.parse("/copyright").evaluate(json);
if (copyright != null && !copyright.isNull())
{
media.copyright = copyright.getString();
}
media.duration = JPath.parse("/duration").evaluate(json).getNumber().longValue();
media.format = JPath.parse("/format").evaluate(json).getString();
media.height = JPath.parse("/height").evaluate(json).getInt();
JSON.Array<Value> personValues = (JSON.Array<Value>) JPath.parse("/persons").evaluate(json);
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(JPath.parse("/player").evaluate(json).getString());
media.size = JPath.parse("/size").evaluate(json).getNumber().longValue();
media.title = JPath.parse("/title").evaluate(json).getString();
media.uri = JPath.parse("/uri").evaluate(json).getString();
media.width = JPath.parse("/width").evaluate(json).getInt();
return media;
}
static Image readImage(String imageJsonInput) throws Exception
{
Image image = new Image();
JSON json = JSON.parse(imageJsonInput);
image.height = JPath.parse("/height").evaluate(json).getInt();
image.size = Image.Size.valueOf(JPath.parse("/size").evaluate(json).getString());
image.title = JPath.parse("/title").evaluate(json).getString();
image.uri = JPath.parse("/uri").evaluate(json).getString();
image.width = JPath.parse("/width").evaluate(json).getInt();
return image;
}
@SuppressWarnings("rawtypes")
static Image readImage(JSON.Object imageJsonObject) throws Exception
{
Image image = new Image();
image.height = JPath.parse("/height").evaluate(imageJsonObject).getInt();
image.size = Image.Size.valueOf(JPath.parse("/size").evaluate(imageJsonObject).getString());
image.title = JPath.parse("/title").evaluate(imageJsonObject).getString();
image.uri = JPath.parse("/uri").evaluate(imageJsonObject).getString();
image.width = JPath.parse("/width").evaluate(imageJsonObject).getInt();
return image;
}
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());
}
}
}