Skip to content

Commit

Permalink
added JSON serializers for JSONiJ and Argo; added Jackson Databind wi…
Browse files Browse the repository at this point in the history
…th Strings serializer; changed serializer names to lower case in reports and per preferences discussed in mailing list
  • Loading branch information
ProgrammerBruce committed Jun 22, 2011
1 parent cef1319 commit ed19fac
Show file tree
Hide file tree
Showing 14 changed files with 708 additions and 22 deletions.
2 changes: 2 additions & 0 deletions tpc/.classpath
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,7 @@
<classpathentry kind="lib" path="lib/json_simple-1.1.jar"/>
<classpathentry kind="lib" path="lib/json-smart-1.0.8.jar"/>
<classpathentry kind="lib" path="lib/json.org-ref-2011.06.21.jar"/>
<classpathentry kind="lib" path="lib/jsonij-0.2.7.jar"/>
<classpathentry kind="lib" path="lib/argo-2.10.jar"/>
<classpathentry kind="output" path="build"/>
</classpath>
Binary file added tpc/lib/argo-2.10.jar
Binary file not shown.
Binary file added tpc/lib/jsonij-0.2.7.jar
Binary file not shown.
12 changes: 8 additions & 4 deletions tpc/serializers.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,20 @@ avro
avro-generic
json/jackson-manual
json/jackson-databind
json/jackson-databind-strings
json/protostuff-manual
json/protostuff-runtime
json/protobuf
json/google-gson
json/svenson-databind
json/json-lib-databind
json/FastJSON-databind
json/JSON.simple/semi-manual
json/json-smart/semi-manual
json/org.json/semi-manual
json/fastjson-databind
json/json.simple/manual/tree
json/json-smart/manual/tree
json/org.json/manual/tree
json/jsonij-jpath
json/jsonij-manual/tree
json/argo-manual/tree
bson/jackson-manual
bson/jackson-databind
bson/mongodb
Expand Down
2 changes: 2 additions & 0 deletions tpc/src/data/media/Media.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.List;

import org.msgpack.annotation.Optional;
import jsonij.json.annotation.JSONIgnore;

import static data.ReprUtil.repr;

Expand All @@ -21,6 +22,7 @@ public enum Player {
public long duration;
public long size;
public int bitrate; // Can be unset.
@JSONIgnore // required by JSONiJ
public boolean hasBitrate;
public List<String> persons;

Expand Down
229 changes: 229 additions & 0 deletions tpc/src/serializers/ArgoManualTree.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,229 @@
package serializers;

import static argo.jdom.JsonNodeBuilders.aNullBuilder;
import static argo.jdom.JsonNodeBuilders.aNumberBuilder;
import static argo.jdom.JsonNodeBuilders.aStringBuilder;
import static argo.jdom.JsonNodeBuilders.anArrayBuilder;
import static argo.jdom.JsonNodeBuilders.anObjectBuilder;

import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

import argo.format.CompactJsonFormatter;
import argo.format.JsonFormatter;
import argo.jdom.JdomParser;
import argo.jdom.JsonArrayNodeBuilder;
import argo.jdom.JsonNode;
import argo.jdom.JsonObjectNodeBuilder;
import argo.jdom.JsonRootNode;

import data.media.Image;
import data.media.Media;
import data.media.MediaContent;

/**
* Driver that uses Argo [http://argo.sourceforge.net], with manual tree processing.
*/
public class ArgoManualTree
{
public static void register(TestGroups groups)
{
groups.media.add(JavaBuiltIn.MediaTransformer,
new ManualTreeSerializer("json/argo-manual/tree"));
}

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");
}

private static final JsonFormatter JSON_FORMATTER = new CompactJsonFormatter();
private static final JdomParser JDOM_PARSER = new JdomParser();

private static Image readImage(JsonNode node)
{
Image image = new Image();
image.height = Integer.parseInt(node.getNumberValue("height"));
image.size = Image.Size.valueOf(node.getStringValue("size"));
image.title = node.getNullableStringValue("title");
image.uri = node.getNullableStringValue("uri");
image.width = Integer.parseInt(node.getNumberValue("width"));
return image;
}

private static Image readImage(String imageJsonInput) throws Exception
{
JsonRootNode root = JDOM_PARSER.parse(imageJsonInput);
return readImage(root);
}

private static List<Image> readImages(String imagesJsonInput) throws Exception
{
JsonRootNode root = JDOM_PARSER.parse(imagesJsonInput);
return readImages(root);
}

private static List<Image> readImages(JsonNode node)
{
List<JsonNode> nodes = node.getElements();
int size = nodes.size();
List<Image> images = new ArrayList<Image>(size);
for (int i = 0; i < size; i++)
{
images.add(readImage(nodes.get(i)));
}
return images;
}

private static MediaContent readMediaContent(String mediaContentJsonInput) throws Exception
{
JsonRootNode root = JDOM_PARSER.parse(mediaContentJsonInput);
MediaContent mediaContent = new MediaContent();
mediaContent.media = readMedia(root.getNode("media"));
mediaContent.images = readImages(root.getNode("images"));
return mediaContent;
}

private static Media readMedia(JsonNode node)
{
Media media = new Media();
String bitrate = node.getNullableNumberValue("bitrate");
if (bitrate != null && bitrate.length() > 0)
{
media.bitrate = Integer.parseInt(bitrate);
media.hasBitrate = true;
}
media.copyright = node.getNullableStringValue("copyright");
media.duration = Long.parseLong(node.getNumberValue("duration"));
media.format = node.getNullableStringValue("format");
media.height = Integer.parseInt(node.getNumberValue("height"));
List<JsonNode> personJsonNodes = node.getArrayNode("persons");
int size = personJsonNodes.size();
List<String> persons = new ArrayList<String>(size);
for (int i = 0; i < size; i++)
{
persons.add(personJsonNodes.get(i).getText());
}
media.persons = persons;
media.player = Media.Player.valueOf(node.getStringValue("player"));
media.size = Long.parseLong(node.getNumberValue("size"));
media.title = node.getNullableStringValue("title");
media.uri = node.getNullableStringValue("uri");
media.width = Integer.parseInt(node.getNumberValue("width"));
return media;
}

private static Media readMedia(String mediaJsonInput) throws Exception
{
JsonRootNode root = JDOM_PARSER.parse(mediaJsonInput);
return readMedia(root);
}

private static void writeImages(StringWriter imagesWriter, List<Image> images)
{
JsonArrayNodeBuilder arrayBuilder = createImagesArrayBuilder(images);
JsonRootNode json = arrayBuilder.build();
imagesWriter.write(JSON_FORMATTER.format(json));
}

private static JsonArrayNodeBuilder createImagesArrayBuilder(List<Image> images)
{
JsonArrayNodeBuilder arrayBuilder = anArrayBuilder();
for (Image image : images)
{
arrayBuilder.withElement(createImageObjectBuilder(image));
}
return arrayBuilder;
}

private static void writeMediaContent(StringWriter mediaContentWriter, MediaContent mediaContent)
{
JsonObjectNodeBuilder builder = anObjectBuilder()
.withField("media", createMediaObjectBuilder(mediaContent.media))
.withField("images", createImagesArrayBuilder(mediaContent.images));
JsonRootNode json = builder.build();
mediaContentWriter.write(JSON_FORMATTER.format(json));
}

private static void writeMedia(StringWriter mediaWriter, Media media)
{
JsonObjectNodeBuilder builder = createMediaObjectBuilder(media);
JsonRootNode json = builder.build();
mediaWriter.write(JSON_FORMATTER.format(json));
}

private static JsonObjectNodeBuilder createMediaObjectBuilder(Media media)
{
JsonObjectNodeBuilder builder = anObjectBuilder()
.withField("uri", aStringBuilder(media.uri))
.withField("title", aStringBuilder(media.title))
.withField("width", aNumberBuilder(String.valueOf(media.width)))
.withField("height", aNumberBuilder(String.valueOf(media.height)))
.withField("format", aStringBuilder(media.format))
.withField("duration", aNumberBuilder(String.valueOf(media.duration)))
.withField("size", aNumberBuilder(String.valueOf(media.size)));
if (media.hasBitrate)
{
builder.withField("bitrate", aNumberBuilder(String.valueOf(media.bitrate)));
}
builder.withField("player", aStringBuilder(media.player.name()));
if (media.copyright != null)
{
builder.withField("copyright", aStringBuilder(media.copyright));
}
else
{
builder.withField("copyright", aNullBuilder());
}
JsonArrayNodeBuilder arrayBuilder = anArrayBuilder();
for (String person : media.persons)
{
arrayBuilder.withElement(aStringBuilder(person));
}
builder.withField("persons", arrayBuilder);
return builder;
}

private static JsonObjectNodeBuilder createImageObjectBuilder(Image image)
{
return anObjectBuilder()
.withField("height", aNumberBuilder(String.valueOf(image.height)))
.withField("size", aStringBuilder(image.size.name()))
.withField("title", aStringBuilder(image.title))
.withField("uri", aStringBuilder(image.uri))
.withField("width", aNumberBuilder(String.valueOf(image.width)));
}

private static void writeImage(StringWriter imageWriter, Image image)
{
JsonObjectNodeBuilder builder = createImageObjectBuilder(image);
JsonRootNode json = builder.build();
imageWriter.write(JSON_FORMATTER.format(json));
}
}
}
10 changes: 7 additions & 3 deletions tpc/src/serializers/BenchmarkRunner.java
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ else if (option.equals("help")) {
// JSON
JsonJacksonManual.register(groups);
JsonJacksonDatabind.register(groups);
JsonJacksonDatabindWithStrings.register(groups);
JsonTwoLattes.register(groups);
ProtostuffJson.register(groups);
ProtobufJson.register(groups);
Expand All @@ -273,9 +274,12 @@ else if (option.equals("help")) {
SvensonJsonDatabind.register(groups);
JsonLibJsonDatabind.register(groups);
FastJSONDatabind.register(groups);
JsonSimpleSemiManual.register(groups);
JsonSmartSemiManual.register(groups);
JsonDotOrgSemiManual.register(groups);
JsonSimpleManualTree.register(groups);
JsonSmartManualTree.register(groups);
JsonDotOrgManualTree.register(groups);
JsonijJpath.register(groups);
JsonijManualTree.register(groups);
ArgoManualTree.register(groups);
// Then JSON-like
// CKS text is textual JSON-like format
CksText.register(groups);
Expand Down
2 changes: 1 addition & 1 deletion tpc/src/serializers/FastJSONDatabind.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public class FastJSONDatabind
public static void register(TestGroups groups)
{
groups.media.add(JavaBuiltIn.MediaTransformer,
new GenericSerializer<MediaContent>("json/FastJSON-databind", MediaContent.class));
new GenericSerializer<MediaContent>("json/fastjson-databind", MediaContent.class));
}

static class GenericSerializer<T> extends Serializer<T>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,19 @@
/**
* Driver that uses the json.org reference JSON implementation in Java, with semi-manual parsing.
*/
public class JsonDotOrgSemiManual
public class JsonDotOrgManualTree
{
public static void register(TestGroups groups)
{
groups.media.add(JavaBuiltIn.MediaTransformer,
new SemiManualSerializer("json/org.json/semi-manual"));
new ManualTreeSerializer("json/org.json/manual/tree"));
}

static class SemiManualSerializer extends Serializer<MediaContent>
static class ManualTreeSerializer extends Serializer<MediaContent>
{
private final String name;

public SemiManualSerializer(String name)
public ManualTreeSerializer(String name)
{
this.name = name;
}
Expand Down
58 changes: 58 additions & 0 deletions tpc/src/serializers/JsonJacksonDatabindWithStrings.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package serializers;

import java.io.IOException;

import data.media.MediaContent;

import org.codehaus.jackson.map.*;
import org.codehaus.jackson.type.JavaType;

/**
* This serializer uses Jackson in full automated data binding mode, which
* can handle typical Java POJOs (esp. beans; otherwise may need to annotate
* to configure)
*/
public class JsonJacksonDatabindWithStrings
{
public static void register(TestGroups groups)
{
ObjectMapper mapper = new ObjectMapper();
// note: could also force static typing; left out to keep defaults
groups.media.add(JavaBuiltIn.MediaTransformer,
new GenericSerializer<MediaContent>("json/jackson-databind-strings", mapper, MediaContent.class));
}

// ------------------------------------------------------------
// Serializer (just one)

public static class GenericSerializer<T> extends Serializer<T>
{
private final String name;
private final ObjectMapper mapper;

private final JavaType type;

public GenericSerializer(String name, ObjectMapper mapper, Class<T> clazz)
{
this.name = name;
this.mapper = mapper;
this.type = mapper.getTypeFactory().constructType(clazz);
}

public String getName() { return name; }

public byte[] serialize(T data) throws IOException
{
// return mapper.writeValueAsBytes(data);
return mapper.writeValueAsString(data).getBytes(("UTF-8"));
}

@SuppressWarnings("unchecked")
public T deserialize(byte[] array) throws Exception
{
// return (T) mapper.readValue(array, 0, array.length, type);
String input = new String(array, "UTF-8");
return mapper.readValue(input, type);
}
};
}
Loading

0 comments on commit ed19fac

Please sign in to comment.