/*
* AlmacenMicropocha.java
*
* Created on 25 de febrero de 2006, 18:21
*
* To change this template, choose Tools | Options and locate the template under
* the Source Creation and Management node. Right-click the template and choose
* Open. You can then make changes to the template in the Source Editor.
*/
package telefono.almacen;
import javax.microedition.rms.InvalidRecordIDException;
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordFilter;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import javax.microedition.rms.RecordStoreNotOpenException;
import telefono.Partida;
/**
*
* @author Enrique Vicent Ramis
*/
public class AlmacenMicropocha implements telefono.Almacen
{
/**identificador rms*/
public static final String RMS_ID="MicroPocha";
telefono.MicroPocha micropocha;
private final static String savename="auto";
Pool pool;
private GuardadoDemonio guardador;
/**clase auxiliar para filtrar registros por id*/
public static class RmsFiltro implements RecordFilter
{
private String criterio;
public RmsFiltro(String criterio)
{
this.criterio=criterio;
}
public boolean matches(byte[] b)
{
String paquete=new String(b);
return getId(paquete).equals(criterio);
}
}
/** Creates a new instance of AlmacenMicropocha */
public AlmacenMicropocha(telefono.MicroPocha m)
{
this.micropocha=m;
this.pool=new Pool();
guardador=new GuardadoDemonio(pool);
}
/** guarda la partida actual en el slot autom?tico
* adem�s el amacenado se hace en segundo plano.
* si recibe m�s de una petici�n de guadado mientras est� procesando otra
* petici�n anterior, procesar� directamente la �ltima, descartando el resto
* ya que de todos modos se sobreescribir�an, es m�s r�pido descartarlas.
*
**/
public void guardar() throws java.io.IOException
{
guardar(savename);
}
/** guarda la partida actual con el nombre dado
* @param nombre nombre del slot destino */
public void guardar(String nombre) throws java.io.IOException
{
if(nombre.indexOf('|')!=-1)
throw new java.io.IOException("error no se admiten nombres con el caracter |");
StringBuffer xml=new StringBuffer(nombre);
xml.append('|');
micropocha.toXml(xml);
byte [] buffer=xml.toString().getBytes();
pool.add(nombre,buffer);
}
/** carga la partida almacenada enel slot autom?tico */
public String cargar() throws java.io.IOException
{
return cargar(savename);
}
/** carga la partid almacenada en un slot con el nombre dado */
public String cargar(String nombre) throws java.io.IOException
{
byte[]result=null;
RecordStore rs=null;
try
{
rs=RecordStore.openRecordStore(RMS_ID,true);
//buscar y borrar elemto con mismo nombre
RecordFilter filtro=new RmsFiltro(nombre);
RecordEnumeration re=rs.enumerateRecords(filtro,null,false);
while(re.hasNextElement())
{
int el=re.nextRecordId();
result=rs.getRecord(el);
}
rs.closeRecordStore();
}
catch (Exception e)
{
throw new java.io.IOException(e.getMessage());
}
String ret= getRecord(new String(result));
System.err.println(ret);
return ret;
}
/** borra una partida de un slot
* @throws java.util.NoSuchElementException nunca
* @throws java.io.IOException Error rms
*/
public void borrar(String nombre) throws java.io.IOException, java.util.NoSuchElementException
{
RecordStore rs=null;
try
{
rs=RecordStore.openRecordStore(RMS_ID,true);
//buscar y borrar elemto con mismo nombre
RecordFilter filtro=new RmsFiltro(nombre);
RecordEnumeration re=rs.enumerateRecords(filtro,null,false);
while(re.hasNextElement())
{
int el=re.nextRecordId();
rs.deleteRecord(el);
}
rs.closeRecordStore();
}
catch (Exception e)
{
throw new java.io.IOException(e.getMessage());
}
}
/** obtiene una lista de las partidas existentes */
public String [] getExistentes()
{
String[]result=null;
RecordStore rs=null;
try
{
rs=RecordStore.openRecordStore(RMS_ID,true);
//buscar y borrar elemto con mismo nombre
RecordEnumeration re=rs.enumerateRecords(null,null,false);
result=new String[re.numRecords()];
for(int i=0;i<result.length;i++)
{
String el=new String(re.nextRecord());
result[i]=getId(el);
}
rs.closeRecordStore();
}
catch (Exception e)
{
//throw new java.io.IOException(e.getMessage());
}
return result;
}
/** dado un registro obtiene su identificador
*
* un registro tiene el formato identificador|<xml...
* donde <xml... es la representacion de la partida en xml
* @param registro registro de rms
* @return identificador
*/
static public String getId(String registro)
{
int idLng;
idLng=registro.indexOf('|');
if(idLng==-1)
return new String();
else
return registro.substring(0,idLng);
}
/** dado un registro obtiene sus datos
* un registro tiene el formato identificador|<xml...
* donde <xml... es la representacion de la partida en xml
* @param registro registro de rms
* @return datos sin identificador ni separador de campo
*/
static public String getRecord(String registro)
{
int idLng;
idLng=registro.indexOf('|');
if(idLng==-1)
return "";
else
return registro.substring(idLng+1);
}
}