/*
* Copyright 2012 E.J.I.E., S.A.
*
* Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en
*
* http://ec.europa.eu/idabc/eupl.html
*
* Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,
* el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,
* SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.
* Véase la Licencia en el idioma concreto que rige los permisos y limitaciones
* que establece la Licencia.
*/
package com.ejie.x38.serialization;
import java.io.IOException;
import java.util.Map.Entry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
/**
* Serializador que permite serializar unicamente determinadas propiedades del
* objeto a procesar. Las propiedades a serializar se especifican enviandose en
* un mapa de propiedades del thread.
*
* @author UDA
*
*/
public class CustomSerializer extends JsonSerializer<Object> {
protected final Logger logger = LoggerFactory.getLogger(CustomSerializer.class);
/**
* Realiza la serializacion del objeto pasado por parametro. Se escriben
* unicamente en el JSON resultante las propiedades del bean indicadas en el
* mapa de parametros almacenado en el thread.
*
* @param obj
* Objeto a serializar.
* @param jgen
* Clase que define la API publica para escribir contenido JSON.
* @param provider
* Proporciona la API para obtener serializadores para serializar
* instancias de tipos especificos.
* @throws IOException
* Al producirse un error al escribir contenido JSON.
* @throws JsonProcessingException
* Al producirse un error al escribir contenido JSON.
*/
@Override
public void serialize(Object obj, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
logger.debug("CustomSerializer.serialize()");
// Se crea un BeanWrapper a partir del objeto a serializar
BeanWrapper beanWrapper = new BeanWrapperImpl(obj);
// Inicio del objeto JSON
jgen.writeStartObject();
// Se recorren las propiedades almacenadas en el mapa del thread
for (Entry<?, ?> entry : ThreadSafeCache.getMap().entrySet()) {
// Obtenemos el nombre de la propiedad
String propertyName = (String) entry.getValue();
// Comprobamos si la propiedad existe en el bean y es accesible para lectura
if(beanWrapper.isReadableProperty(propertyName)){
// Se obtiene el valor de la propiedad del bean
Object propertyValue = beanWrapper.getPropertyValue(propertyName);
// Se escribe en el JSON el key
jgen.writeFieldName((String) entry.getKey());
// Se escribe en el JSON el value
if (propertyValue==null){
jgen.writeString("");
}else{
jgen.writeObject(propertyValue);
}
}
}
// Fin del objeto JSON
jgen.writeEndObject();
}
}