package telefono.almacen;
import telefono.almacen.PendingWrite;
/** Implemnta un pool de grabaciones pendientes.
* Cuando se introduce un elemento este se encola. Tras encolarlo se puede
* realizar una llamada a guardar o no (no en caso de que se machaque una
* entrada.
* todas las entradas tienen un n�mbre asociado, no pueden existir dos entradas
* con el mismo nombre. si se intenta introducir una entrada con un nombre
* igual al de otra ya existente, se machaca la m�s vieja entendiendo que los
* datos posteriores son los �nicos v�lidos.
*/
class Pool
{
private java.util.Vector pendings=new java.util.Vector(3);
/** agrega una partida a la lista de partidas pendientes
* @param nombre nombre del slot donde se quiere guardar
* @param valor datos que representan la partida
* @return true si se a�adi� el elemento, false, si se sobreescribi� un elemento
* ya existiente
*/
synchronized public boolean add(String nombre, byte[] valor)
{
PendingWrite buscado=busca(nombre);
if(buscado==null)//no se encontr�
{
PendingWrite next=new PendingWrite();
next.nombre=nombre;
next.valor=valor;
pendings.addElement(next);
notifyAll();
return true;
}
else
{
buscado.valor=valor;
return false;
}
}
/** obtiene una partida para ser guardada.
* @return partida o null, si no quedan partidas pendientes
*/
synchronized public PendingWrite pop()
{
if(pendings.size()>1)
{
PendingWrite result=(PendingWrite)pendings.firstElement();
pendings.removeElement(result);
return result;
}
else
return null;
}
/** obtiene una partida para ser guardada.
* si no hay partida, bloquea el proceso
* @return partida
*/
synchronized public PendingWrite blockingPop() throws InterruptedException
{
while(pendings.size()<1)
{
wait();
}
PendingWrite result=(PendingWrite)pendings.firstElement();
pendings.removeElement(result);
return result;
}
/** busca en el vector si hay alguno nuevo, y lo retorna
* @return null si no lo encuentra, o el valor, si s� lo encuentra.
*/
private PendingWrite busca(String nombre)
{
PendingWrite current;
for(int i=0;i<pendings.size();i++)
{
current=(PendingWrite)pendings.elementAt(i);
if(current.nombre.equals(nombre))
{
return current;
}
}
return null;
}
}