package com.pam.codenamehippie.modele;
import android.support.annotation.NonNull;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.SerializedName;
/**
* Classe de base des modèles. Cette classe est générique afin de pouvoir utiliser un API fluent
* et éviter de dupliquer du code inutilement, car autrement les classes qui hérite devrait
* faire des override de mutateurs en changeant le type de retour.
* <p>
* Par API fluent nous entendons quelque chose comme ceci:
* </p>
* <pre class="prettyprint">
* UtilisateurModele modele = new UtilisateurModele();
* modele.setNom("Lafontaine").setPrenom("Philippe").setTelephone("819 555 8963");
* </pre>
* Par opposition à:
* <pre class="prettyprint">
* UtilisateurModele modele = new UtilisateurModele();
* modele.setNom("Lafontaine");
* modele.setPrenom("Philippe");
* modele.setTelephone("819 555 8963");
* </pre>
*
* @param <T>
* La classe qui hérite de BaseModele
*
* @see <a href="http://goo.gl/67YLAR">Using Generics To Build Fluent API's In Java</a>
*/
public abstract class BaseModele<T extends BaseModele<T>> {
@SerializedName(value = "id")
protected Integer id = 0;
/**
* Accesseur de l'id du modèle
*
* @return l'id de l'objet
*/
public Integer getId() {
return this.id;
}
/**
* Mutateur pour l'id
*
* @param id
* le nouvelle id du modele
*
* @return l'instance du modèle.
*/
@SuppressWarnings(value = {"unchecked"})
public T setId(@NonNull Integer id) {
this.id = id;
return (T) this;
}
/**
* Surcharge de la méthode {@link Object#toString()}. Appelle la méthode {@link
* com.google.gson.Gson#toJson(Object)}.
* <p>
* Cette méthode est disponible à des fins de développement, car l'objet JSON
* résultant est adapté pour un affichage à la console.
* </p>
*
* @return l'objet en format JSON.
*
* @see com.google.gson.Gson#toJson(Object)
* @see GsonBuilder#setPrettyPrinting()
*/
@Override
public String toString() {
return new GsonBuilder().serializeNulls()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
.setPrettyPrinting()
.enableComplexMapKeySerialization()
.create()
.toJson(this);
}
}