package com.rzg.zombieland.comunes.comunicacion;
import java.util.UUID;
import org.jdeferred.Deferred;
import org.jdeferred.Promise;
import org.jdeferred.impl.DeferredObject;
import com.google.gson.Gson;
/**
* Modela una petición realizada al servidor.
*
* @author nicolas
* @param <ClaseEnviable> el tipo de objeto que se envía al otro extremo.
* @param <Respuesta> el tipo de objeto respuesta de la petición.
*
*/
public abstract class Peticion<ClaseEnviable, Respuesta> {
// Un ID único para identificar a la petición.
private UUID id;
// Promesa que se llena con la respuesta.
private Deferred<Respuesta, Object, Respuesta> promesa;
// El objeto que se envía al servidor.
private ClaseEnviable enviable;
// La clase que forma el objeto respuesta de esta petición.
private Class<Respuesta> claseRespuesta;
/**
* Construye la petición asingándole un ID aleatorio y creando la promesa.
* @param enviable - el objeto que se envía al servidor.
* @param claseRespuesta - la clase que se responde.
*/
public Peticion(ClaseEnviable enviable, Class<Respuesta> claseRespuesta) {
if (claseRespuesta == null)
throw new NullPointerException("La clase de la respuesta no puede ser null");
this.claseRespuesta = claseRespuesta;
this.id = UUID.randomUUID();
promesa = new DeferredObject<Respuesta, Object, Respuesta>();
this.enviable = enviable;
}
/**
* @return el mensaje de una petición.
*/
public String getMensajePeticion() {
return new Gson().toJson(enviable);
}
/**
* @return el código de la petición.
*/
protected abstract int getCodigoPeticion();
/**
* Procesa una respuesta.
* @param respuesta
* @return el resultado de procesar la respuesta.
*/
private Respuesta generarRespuesta(String respuesta) {
return new Gson().fromJson(respuesta, claseRespuesta);
}
/**
* @return un ID único de petición.
*/
public final UUID getID() {
return id;
}
/**
* @return la promesa de la respuesta.
*/
public final Promise<Respuesta, Object, Respuesta> getRespuesta() {
return promesa.promise();
}
/**
* Completa la promesa con la respuesta dada.
* @param respuesta
*/
public void procesarRespuesta(String respuesta) {
promesa.resolve(generarRespuesta(respuesta));
}
}