package serializers.jackson; import serializers.JavaBuiltIn; import serializers.SerClass; import serializers.SerFeatures; import serializers.SerFormat; import serializers.SerGraph; import serializers.TestGroups; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.cbor.CBORFactory; import com.fasterxml.jackson.dataformat.smile.SmileFactory; import com.fasterxml.jackson.dataformat.smile.SmileGenerator; import com.fasterxml.jackson.module.afterburner.AfterburnerModule; import data.media.MediaContent; /** * Class for registering variants of Jackson-based tests that use Afterburner * for generating byte code to avoid use of Reflection for calling methods * and constructing objects. */ public class JacksonWithAfterburner { final static String STD_DESC = "uses bytecode generation to reduce overhead"; public static void registerAll(TestGroups groups) { registerJSON(groups); registerSmile(groups); registerCBOR(groups); } public static void registerJSON(TestGroups groups) { ObjectMapper mapper = new ObjectMapper(new JsonFactory()); mapper.registerModule(new AfterburnerModule()); groups.media.add(JavaBuiltIn.mediaTransformer, new StdJacksonDataBind<MediaContent>("json/jackson+afterburner/databind", MediaContent.class, mapper), new SerFeatures(SerFormat.BINARY, SerGraph.FLAT_TREE, SerClass.ZERO_KNOWLEDGE, STD_DESC)); } public static void registerCBOR(TestGroups groups) { ObjectMapper mapper = new ObjectMapper(new CBORFactory()); mapper.registerModule(new AfterburnerModule()); groups.media.add(JavaBuiltIn.mediaTransformer, new StdJacksonDataBind<MediaContent>("cbor/jackson+afterburner/databind", MediaContent.class, mapper), new SerFeatures(SerFormat.BINARY, SerGraph.FLAT_TREE, SerClass.ZERO_KNOWLEDGE, STD_DESC)); } public static void registerSmile(TestGroups groups) { // use defaults: shared names, not values (but set explicitly just in case) // sharing can reduce size, but also adds some processing overhead -- typically name sharing // cheap, value sharing bit more expensive; hence the defaults registerSmile(groups, true, false); } public static void registerSmile(TestGroups groups, boolean shareNames, boolean shareValues) { SmileFactory f = new SmileFactory(); f.configure(SmileGenerator.Feature.CHECK_SHARED_NAMES, shareNames); f.configure(SmileGenerator.Feature.CHECK_SHARED_STRING_VALUES, shareValues); ObjectMapper smileMapper = new ObjectMapper(f); smileMapper.registerModule(new AfterburnerModule()); groups.media.add(JavaBuiltIn.mediaTransformer, new StdJacksonDataBind<MediaContent>("smile/jackson+afterburner/databind", MediaContent.class, smileMapper), new SerFeatures(SerFormat.BINARY, SerGraph.FLAT_TREE, SerClass.ZERO_KNOWLEDGE, STD_DESC)); } }