package com.github.kzwang.osem.jackson;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.impl.PropertySerializerMap;
import com.github.kzwang.osem.annotations.IndexableComponent;
import com.github.kzwang.osem.annotations.IndexableProperties;
import com.github.kzwang.osem.annotations.IndexableProperty;
/**
* Override to use custom serializer for null value
*/
public class OsemBeanPropertyWriter extends BeanPropertyWriter {
protected OsemBeanPropertyWriter(BeanPropertyWriter base) {
super(base);
}
@Override
public void serializeAsField(Object bean, JsonGenerator jgen, SerializerProvider prov) throws Exception {
Object value = get(bean);
// Null handling is bit different, check that first
if (value == null) {
if (_nullSerializer != null) {
jgen.writeFieldName(_name);
// check has custom serializer first
IndexableProperty indexableProperty = _member.getAnnotation(IndexableProperty.class);
IndexableComponent indexableComponent = _member.getAnnotation(IndexableComponent.class);
IndexableProperties indexableProperties = _member.getAnnotation(IndexableProperties.class);
if (indexableProperty != null && indexableProperty.serializer() != JsonSerializer.class) {
JsonSerializer serializer = indexableProperty.serializer().newInstance();
serializer.serialize(null, jgen, prov);
} else if (indexableComponent != null && indexableComponent.serializer() != JsonSerializer.class) {
JsonSerializer serializer = indexableComponent.serializer().newInstance();
serializer.serialize(null, jgen, prov);
} else if (indexableProperties != null && indexableProperties.serializer() != JsonSerializer.class) {
JsonSerializer serializer = indexableProperties.serializer().newInstance();
serializer.serialize(null, jgen, prov);
} else {
_nullSerializer.serialize(null, jgen, prov);
}
}
return;
}
// then find serializer to use
JsonSerializer<Object> ser = _serializer;
if (ser == null) {
Class<?> cls = value.getClass();
PropertySerializerMap map = _dynamicSerializers;
ser = map.serializerFor(cls);
if (ser == null) {
ser = _findAndAddDynamic(map, cls, prov);
}
}
// and then see if we must suppress certain values (default, empty)
if (_suppressableValue != null) {
if (MARKER_FOR_EMPTY == _suppressableValue) {
if (ser.isEmpty(value)) {
return;
}
} else if (_suppressableValue.equals(value)) {
return;
}
}
// For non-nulls: simple check for direct cycles
if (value == bean) {
_handleSelfReference(bean, ser);
}
jgen.writeFieldName(_name);
if (_typeSerializer == null) {
ser.serialize(value, jgen, prov);
} else {
ser.serializeWithType(value, jgen, prov, _typeSerializer);
}
}
}