-
Notifications
You must be signed in to change notification settings - Fork 561
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
added JSON serializers for JSONiJ and Argo; added Jackson Databind wi…
…th Strings serializer; changed serializer names to lower case in reports and per preferences discussed in mailing list
- Loading branch information
1 parent
cef1319
commit ed19fac
Showing
14 changed files
with
708 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
}; | ||
} |
Oops, something went wrong.