Java tutorial
package tv.arte.resteventapi.core.presentation.serialization; /* * #%L * RestEventAPI * %% * Copyright (C) 2014 ARTE G.E.I.E * %% * This program is free software: you can redistribute it and/or modify * it under the terms of The MIT License (MIT) as published by the Open Source * Initiative. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See The * MIT License (MIT) for more details. * * You should have received a copy of The MIT License (MIT) * along with this program. If not, see <http://opensource.org/licenses/MIT> * #L% */ import java.io.IOException; import java.math.BigDecimal; import java.util.Map; import java.util.Map.Entry; import tv.arte.resteventapi.core.presentation.decoration.RestEventApiDecorationProvider; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.BeanDescription; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationConfig; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; import com.fasterxml.jackson.databind.ser.Serializers; import com.fasterxml.jackson.databind.ser.impl.BeanAsArraySerializer; import com.fasterxml.jackson.databind.ser.impl.ObjectIdWriter; import com.fasterxml.jackson.databind.ser.std.BeanSerializerBase; import com.fasterxml.jackson.databind.type.ArrayType; import com.fasterxml.jackson.databind.type.CollectionLikeType; import com.fasterxml.jackson.databind.type.CollectionType; import com.fasterxml.jackson.databind.type.MapLikeType; import com.fasterxml.jackson.databind.type.MapType; /** * A custom module to register for {@link ObjectMapper} serialization and providing some * decoration information * * @author Simeon Petev * @since 0.1 */ public class JsonDecorationSerializationModule extends SimpleModule { private static final long serialVersionUID = -7361985561768455237L; @Override public void setupModule(SetupContext context) { super.setupModule(context); context.addBeanSerializerModifier(new BeanSerializerModifier() { @Override public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) { if (serializer instanceof BeanSerializerBase) { return new ExtraFieldSerializer((BeanSerializerBase) serializer); } else { return super.modifySerializer(config, beanDesc, serializer); } } }); context.addKeySerializers(new Serializers() { @Override public JsonSerializer<?> findSerializer(SerializationConfig config, JavaType type, BeanDescription beanDesc) { return new TransientStringSerializer(); } @Override public JsonSerializer<?> findMapSerializer(SerializationConfig config, MapType type, BeanDescription beanDesc, JsonSerializer<Object> keySerializer, TypeSerializer elementTypeSerializer, JsonSerializer<Object> elementValueSerializer) { return null; } @Override public JsonSerializer<?> findMapLikeSerializer(SerializationConfig config, MapLikeType type, BeanDescription beanDesc, JsonSerializer<Object> keySerializer, TypeSerializer elementTypeSerializer, JsonSerializer<Object> elementValueSerializer) { return null; } @Override public JsonSerializer<?> findCollectionSerializer(SerializationConfig config, CollectionType type, BeanDescription beanDesc, TypeSerializer elementTypeSerializer, JsonSerializer<Object> elementValueSerializer) { return null; } @Override public JsonSerializer<?> findCollectionLikeSerializer(SerializationConfig config, CollectionLikeType type, BeanDescription beanDesc, TypeSerializer elementTypeSerializer, JsonSerializer<Object> elementValueSerializer) { return null; } @Override public JsonSerializer<?> findArraySerializer(SerializationConfig config, ArrayType type, BeanDescription beanDesc, TypeSerializer elementTypeSerializer, JsonSerializer<Object> elementValueSerializer) { return null; } }); } public class ExtraFieldSerializer extends BeanSerializerBase { public ExtraFieldSerializer(BeanSerializerBase source) { super(source); } public ExtraFieldSerializer(ExtraFieldSerializer source, ObjectIdWriter objectIdWriter) { super(source, objectIdWriter); } public ExtraFieldSerializer(ExtraFieldSerializer source, String[] toIgnore) { super(source, toIgnore); } public BeanSerializerBase withObjectIdWriter(ObjectIdWriter objectIdWriter) { return new ExtraFieldSerializer(this, objectIdWriter); } protected BeanSerializerBase withIgnorals(String[] toIgnore) { return new ExtraFieldSerializer(this, toIgnore); } public void serialize(Object bean, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException { if (bean == null || bean.getClass().getAnnotation(Stripped.class) == null) { jgen.writeStartObject(); } serializeFields(bean, jgen, provider); Map<String, ?> decorationContext = RestEventApiDecorationProvider.getBeanDecorationContext(bean); if (decorationContext != null) { for (Entry<String, ?> decorationContextEntry : decorationContext.entrySet()) { String fieldName = decorationContextEntry.getKey(); Object fieldValue = decorationContextEntry.getValue(); if (fieldValue instanceof String) { jgen.writeStringField(fieldName, (String) fieldValue); } else if (fieldValue instanceof byte[]) { jgen.writeBinaryField(fieldName, (byte[]) fieldValue); } else if (fieldValue instanceof Boolean) { jgen.writeBooleanField(fieldName, (Boolean) fieldValue); } else if (fieldValue instanceof BigDecimal) { jgen.writeNumberField(fieldName, (BigDecimal) fieldValue); } else if (fieldValue instanceof Double) { jgen.writeNumberField(fieldName, (Double) fieldValue); } else if (fieldValue instanceof Float) { jgen.writeNumberField(fieldName, (Float) fieldValue); } else if (fieldValue instanceof Integer) { jgen.writeNumberField(fieldName, (Integer) fieldValue); } else if (fieldValue instanceof Long) { jgen.writeNumberField(fieldName, (Long) fieldValue); } else { jgen.writeObjectField(fieldName, fieldValue); } } } if (bean == null || bean.getClass().getAnnotation(Stripped.class) == null) { jgen.writeEndObject(); } } @Override protected BeanSerializerBase asArraySerializer() { return new BeanAsArraySerializer(this); } @Override protected BeanSerializerBase withFilterId(Object filterId) { return new BeanAsArraySerializer(this); } } }