package com.zinep.script;
import com.zinep.*;
import com.zinep.trans.Transaccion;
import com.zinep.utils.TimeManager;
import com.zinep.utils.Trabajador;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.TreeSet;
/**
*
* @author tomas
*/
public class Simulacion {
public static class LlegadaCliente implements Comparable<LlegadaCliente> {
public final int instante;
public final Cliente cliente;
public final Sucursal sucursal;
public final List<Transaccion> trns = new LinkedList<Transaccion>();
public LlegadaCliente(int instante, Cliente cliente, Sucursal sucursal) {
this.instante = instante;
this.cliente = cliente;
this.sucursal = sucursal;
}
public boolean add(Transaccion e) {
return trns.add(e);
}
@Override
public int compareTo(LlegadaCliente t) {
int res = this.instante - t.instante;
if (res == 0) {
res = cliente.getNombre().compareTo(t.cliente.getNombre());
}
if (res == 0) {
res = sucursal.getNombre().compareTo(t.sucursal.getNombre());
}
return res;
}
private void aplicar() {
cliente.addAll(sucursal, trns.toArray(new Transaccion[]{}));
sucursal.entraCliente(cliente);
}
@Override
public String toString() {
return "LlegadaCliente{" + "instante=" + instante + ", cliente=" + cliente + ", sucursal=" + sucursal + '}';
}
}
private TreeSet<LlegadaCliente> llegadas = new TreeSet<Simulacion.LlegadaCliente>();
private Banco banco;
public Simulacion(Banco banco) {
this.banco = banco;
}
public void correr() {
Trabajador generadorClientes = new Trabajador() {
private int contador = 0;
Iterator<LlegadaCliente> it = llegadas.iterator();
LlegadaCliente llegada = null;
@Override
protected void ejecutar() {
do {
if (llegada != null) {
if (llegada.instante == contador) {
llegada.aplicar();
llegada = null;
} else {
break;
}
} else if (it.hasNext()) {
llegada = it.next();
} else {
detener();
break;
}
} while (true);
contador++;
}
};
final TimeManager tiempo = TimeManager.get();
tiempo.add(generadorClientes);
for (Sucursal sucursal : banco.getSucursales()) {
for (Agente agente : sucursal.getAgentes()) {
tiempo.add(agente);
}
tiempo.add(sucursal);
}
tiempo.setTerminacion(new Runnable() {
@Override
public void run() {
System.out.println("Banco:" + banco);
for (Sucursal sucursal1 : banco.getSucursales()) {
System.out.println("\tSucursal: " + sucursal1);
}
for (Cliente cliente1 : banco.getClientes().values()) {
System.out.println("\tCliente: " + cliente1);
for (Cuenta cuenta : cliente1.getCuentasCliente()) {
System.out.println("\t\tCuenta:" + cuenta);
}
}
}
});
tiempo.start();
}
public boolean add(LlegadaCliente e) {
return llegadas.add(e);
}
}