/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package practica1.logic;
import java.util.ArrayList;
import practica1.domain.Poblacion;
import practica1.domain.event.PoblacionPropertyEvent;
import practica1.domain.listener.PoblacionPropertyListener;
import practica1.logic.event.LogicPoblacionEvent;
import practica1.logic.listener.LogicPoblacionListener;
import practica1.util.HashCodeUtil;
/**
* Clase que extiende de Poblacion y se encarga de implementar su lógica
* @author Miguel González - Ceura
*/
public class LogicPoblacion extends Poblacion {
private boolean sincronizarComida;
private boolean modified;
private ArrayList<LogicPoblacionListener> listeners;
//Se guarda el experimento lógico que contiene a esta población
//Facilita el manejo de eventos entre padre e hijo
//NOTA: Tener cuidado al modificar el código para no romper la relación y
//probocar errores
private LogicExperimento experimentoPadre;
/**
* Constructor de una población lógica
* @param nombrePoblacion Nombre de la población
* @param experimentoPadre Experimento lógico que lo contiene
*/
public LogicPoblacion(String nombrePoblacion, LogicExperimento experimentoPadre) {
super(nombrePoblacion);
super.addPropertyChangeListener(new PoblacionPropertyListener() {
@Override
public void propertyChange(PoblacionPropertyEvent propertyChange) {
firePoblacionChange();
}
});
this.experimentoPadre = experimentoPadre;
sincronizarComida = true;
modified = false;
listeners = new ArrayList<LogicPoblacionListener>();
}
/**
* Devuelve el nombre de la población
* @return String nombrePoblacion
*/
@Override
public String toString() {
return getNombrePoblacion();
}
/**
* Compara una población lógica
* @param poblacion Object LogicPoblacion
* @return Devuelve verdad si son iguales, sino falso
*/
@Override
public boolean equals(Object poblacion) {
if(poblacion != null) {
if(poblacion instanceof LogicPoblacion) {
LogicPoblacion p = (LogicPoblacion) poblacion;
if(p.getFecha().equals(getFecha()) &&
p.getEscalaTemperatura().equals(getEscalaTemperatura())
&& p.getLuminosidad().equals(getLuminosidad()) &&
p.getModeloGraficaComida().equals(
getModeloGraficaComida()) && p.getModeloPoblacionTabla()
.equals(getModeloPoblacionTabla())
&& p.getNombrePoblacion().equals(getNombrePoblacion())
&& p.getTamanioPoblacion() == getTamanioPoblacion() &&
p.getTemperatura() == getTemperatura()
&& sincronizarComida == p.isSincronizarComida() &&
p.getExperimentoPadre().getFichExperimento().equals(
experimentoPadre.getFichExperimento()) &&
p.getExperimentoPadre().getNombreExperimento().equals(
experimentoPadre.getNombreExperimento())) {
return true;
}
}
}
return false;
}
/**
* Devuelve el hashCode de la población lógica
* @return int hashCode
*/
@Override
public int hashCode() {
int result = HashCodeUtil.SEED;
result = HashCodeUtil.hash(result, super.hashCode());
result = HashCodeUtil.hash(result, sincronizarComida);
result = HashCodeUtil.hash(result, experimentoPadre);
return result;
}
/**
* Permite suscribirse a los cambios en el modelo lógico de la población
* @param listener LogicPoblacionListener
*/
public void addLogicPoblacionListener(LogicPoblacionListener listener) {
if(listener != null) {
listeners.add(listener);
}
}
/**
* Permite desuscribirse a los cambios en el modelo lógico de la población
* @param listener LogicPoblacionListener
*/
public void removeLogicPoblacionListener(LogicPoblacionListener listener) {
if(listener != null) {
listeners.remove(listener);
}
}
/**
* Devuelve el experimento que contiene la población lógica
* @return LogicExperimento
*/
public LogicExperimento getExperimentoPadre() {
return experimentoPadre;
}
/**
* Devuelve si la población lógica ha sido modificada
* @return Devuelve verdad si la población lógica ha sido modificada, sino falso
*/
public boolean isModified() {
return modified;
}
/**
* Establece el estado de la población lógica
* @param modified Verdad si está modificada, falso sino
*/
public void setModified(boolean modified) {
this.modified = modified;
}
/**
* Devuelve si se está sincronizando la comida con la tabla
* @return Verdad si lo está haciendo, sino falso
*/
public boolean isSincronizarComida() {
return sincronizarComida;
}
/**
* Establece si la comida debe sincronziarse con la tabla
* @param sincronizarComida Verdad si lo debe hacer, sino falso
*/
public void setSincronizarComida(boolean sincronizarComida) {
this.sincronizarComida = sincronizarComida;
firePoblacionChange();
}
/**
* Notifica a todos los que escuchan el modelo lógico de la población
* que ha sido modificada
*/
private void firePoblacionChange() {
modified = true;
for(LogicPoblacionListener l : listeners) {
l.poblacionChange(new LogicPoblacionEvent(this));
}
}
}