package serializers.jackson; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import data.media.MediaContent; import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.databind.*; import serializers.*; import de.undercouch.bson4jackson.BsonFactory; import de.undercouch.bson4jackson.BsonModule; /** * This serializer uses bson4jackson in full automated data binding mode, which * can handle typical Java POJOs (esp. beans; otherwise may need to annotate * to configure) */ public class JacksonBsonDatabind { public static void register(TestGroups groups) { JsonFactory f = new BsonFactory(); ObjectMapper mapper = new ObjectMapper(f); mapper.registerModule(new BsonModule()); groups.media.add(JavaBuiltIn.mediaTransformer, new DataBindBase<MediaContent>( "bson/jackson/databind", MediaContent.class, mapper), new SerFeatures( SerFormat.BIN_CROSSLANG, SerGraph.FLAT_TREE, SerClass.CLASSES_KNOWN, "" ) ); } public final static class DataBindBase<T> extends Serializer<T> { protected final String name; protected final JavaType type; protected final ObjectMapper mapper; protected final ObjectReader objectReader; protected final ObjectWriter objectWriter; public DataBindBase(String name, Class<T> clazz, ObjectMapper mapper) { this.name = name; type = mapper.constructType(clazz); this.mapper = mapper; objectReader = mapper.readerFor(type); objectWriter = mapper.writerFor(type); } @Override public final String getName() { return name; } protected final JsonParser constructParser(byte[] data) throws IOException { return mapper.getFactory().createParser(data, 0, data.length); } protected final JsonParser constructParser(InputStream in) throws IOException { return mapper.getFactory().createParser(in); } protected final JsonGenerator constructGenerator(OutputStream out) throws IOException { return mapper.getFactory().createGenerator(out, JsonEncoding.UTF8); } @Override public byte[] serialize(T data) throws IOException { return objectWriter.writeValueAsBytes(data); } @Override @SuppressWarnings("unchecked") public T deserialize(byte[] array) throws IOException { return (T) objectReader.readValue(array, 0, array.length); } // // Future extensions for testing performance for item sequences @Override public void serializeItems(T[] 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, items[i]); } generator.close(); } @Override @SuppressWarnings("unchecked") public T[] deserializeItems(InputStream in, int numberOfItems) throws IOException { T[] result = (T[]) new Object[numberOfItems]; JsonParser parser = constructParser(in); for (int i = 0; i < numberOfItems; ++i) { result[i] = (T) mapper.readValue(parser, type); } parser.close(); return result; } } }