com.github.kyriosdata.regras.infraestrutura.Serializador.java Source code

Java tutorial

Introduction

Here is the source code for com.github.kyriosdata.regras.infraestrutura.Serializador.java

Source

/*
 * Copyright (c) 2016 Fbio Nogueira de Lucena
 * Fbrica de Software - Instituto de Informtica (UFG)
 * Creative Commons Attribution 4.0 International License.
 */

package com.github.kyriosdata.regras.infraestrutura;

import com.github.kyriosdata.regras.Pontuacao;
import com.github.kyriosdata.regras.Relato;
import com.github.kyriosdata.regras.Relatorio;
import com.github.kyriosdata.regras.Valor;
import com.github.kyriosdata.regras.regra.Configuracao;
import com.github.kyriosdata.regras.regra.RegraExpressao;
import com.github.kyriosdata.regras.regra.RegraPontosPorRelato;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;

/**
 * Servio para converso de objetos do domnio em
 * JSON e, no sentido inverso,
 * recuperao de objetos a partir do JSON gerado.
 */
public class Serializador {

    private static Gson gson;
    private static Type valorType;
    private static Type pontuacaoType;
    private static Type regraExpressaoType;
    private static Type regraPontosPorRelato;
    private static Type configuracaoType;
    private static Type relatoType;
    private static Type relatorioType;

    /**
     * Cria instncia de serializar preparada
     * para realizar converses entre objetos e
     * sequncias de caracters.
     *
     * <p>H dois grupos de mtodos principais nessa classe.
     * Aqueles do tipo {@link #toJson(Pontuacao)}, por exemplo,
     * cujo argumento  o objeto a ser convertido em JSON e,
     * no sentido inverso, {@link #pontuacao(String)}, que recebe
     * a sequncia JSON e produz um objeto do tipo {@link Pontuacao}.
     */
    public Serializador() {
        GsonBuilder gb = new GsonBuilder();
        gb.registerTypeAdapter(Valor.class, new ValorSerializer());
        gb.registerTypeAdapter(Valor.class, new ValorDeserializer());
        gb.registerTypeAdapterFactory(new CustomRegraTypeAdapterFactory());
        gson = gb.create();

        valorType = new TypeToken<Valor>() {
        }.getType();
        pontuacaoType = new TypeToken<Pontuacao>() {
        }.getType();
        regraExpressaoType = new TypeToken<RegraExpressao>() {
        }.getType();
        regraPontosPorRelato = new TypeToken<RegraPontosPorRelato>() {
        }.getType();
        configuracaoType = new TypeToken<Configuracao>() {
        }.getType();
        relatoType = new TypeToken<Relato>() {
        }.getType();
        relatorioType = new TypeToken<Relatorio>() {
        }.getType();
    }

    /**
     * Converte instncia de {@link Valor} em
     * sequncia de caracteres.
     *
     * @param v Instncia de {@link Valor}.
     *
     * @return Sequncia de caracteres correspondente ao
     * objeto fornecido no primeiro parmetro.
     */
    public String toJson(Valor v) {
        return gson.toJson(v, valorType);
    }

    /**
     * Converte sequncia de caracteres em instncia
     * de {@link Valor}.
     *
     * @param json Sequncia de caracteres correspondente
     *             a uma instncia de {@link Valor}.
     *
     * @return Instncia de {@link Valor} obtida da
     * sequncia de caracteres fornecida.
     */
    public Valor valor(String json) {
        return gson.fromJson(json, valorType);
    }

    public String toJson(Pontuacao v) {
        return gson.toJson(v, pontuacaoType);
    }

    public Pontuacao pontuacao(String json) {
        return gson.fromJson(json, pontuacaoType);
    }

    public RegraExpressao regraExpressao(String json) {
        return gson.fromJson(json, regraExpressaoType);
    }

    public String toJson(RegraExpressao v) {
        return gson.toJson(v, regraExpressaoType);
    }

    public RegraPontosPorRelato regraPontosPorRelato(String json) {
        return gson.fromJson(json, regraPontosPorRelato);
    }

    public String toJson(RegraPontosPorRelato v) {
        return gson.toJson(v, regraPontosPorRelato);
    }

    public Configuracao configuracao(String json) {
        return gson.fromJson(json, configuracaoType);
    }

    public String toJson(Configuracao v) {
        return gson.toJson(v, configuracaoType);
    }

    public Relato relato(String json) {
        return gson.fromJson(json, relatoType);
    }

    public String toJson(Relato v) {
        return gson.toJson(v, relatoType);
    }

    public Relatorio relatorio(String json) {
        return gson.fromJson(json, relatorioType);
    }

    public String toJson(Relatorio v) {
        return gson.toJson(v, relatorioType);
    }

    // TODO Serializacao de coleo polimrfica exige custom serializer (as shown below)
    // TODO http://stackoverflow.com/questions/19588020/gson-serialize-a-list-of-polymorphic-objects
}