package gui;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Vector;
import core.simulation.SimulationException;
import resources.PropertiesLoader;
import utils.logging.Logger;
/**
* Esta clase implementa la base de datos de simulaciones creadas.
*/
public class SimulationBase
{
public static final int OK = 0;
public static final int DUPLICATEK_KEY = 500;
public static final int NO_SUCH_OBJECT = 501;
private Vector base;
public SimulationBase()
{
super();
base = new Vector();
}
/**
* Recibe por parametro el archivo donde est� la base de la simulaci�n.
* @param file archivo de base de la simulaci�n.
* @throws SimulationException
*/
public SimulationBase(String file) throws SimulationException
{
super();
base = new Vector();
String str;
try
{
BufferedReader in = new BufferedReader(new FileReader(file));
while ((str = in.readLine()) != null)
{
if ( str.matches("[^#]*#[^#]*#[^#]*#[^#]*") )
{
SimulationBaseItem item = new SimulationBaseItem(str);
base.add(item);
}
}
in.close();
}
catch (IOException e)
{
throw new SimulationException( e.getMessage() );
}
}
/**
* Busca un �tem en la base de simlaciones y lo retorna en caso de
* existir, o <code>null</code> si no se encuentra.
* @param name
* @return �tem o <code>null</code> si no se encuentra.
*/
public SimulationBaseItem getSimulationBaseItem(String name)
{
for (int i=0;i<base.size();i++)
{
if (((SimulationBaseItem)base.get(i)).getName().compareTo(name)==0)
{
return (SimulationBaseItem)base.get(i);
}
}
return null;
}
/**
* Busca si existe un �tem por nombre.
* @param name
* @return <code>true</code> si existe, o <code>false</code> en caso
* contrario.
*/
public boolean isItemInBase(String name)
{
for (int i=0;i<base.size();i++)
if ( ((SimulationBaseItem)base.get(i)).getName().compareTo(name) == 0 )
return true;
return false;
}
/**
* Busca si existe un �tem por nombre y retorna su posicion en el vector.
* @param name
* @return posici�n de la primara ocurrencia, o -1 en caso que no encuentre.
*/
public int indexOf(String name)
{
for (int i=0;i<base.size();i++)
{
if (((SimulationBaseItem)base.get(i)).getName().compareTo(name)==0)
{
return i;
}
}
return -1;
}
/**
* Inserta un �tem en la base y guarda los cambios.
* @param item �tem.
* @return {@link #OK} o {@link #DUPLICATEK_KEY}.
*/
public int insertSimulationBaseItem(SimulationBaseItem item)
{
if(! isItemInBase(item.getName()))
{
base.add(item);
saveToFile();
return OK;
}
else
return DUPLICATEK_KEY;
}
/**
* Actualiza el �tem que se ingresa por par�metro y guarda los cambios.
* @param item �tem.
* @return {@link #OK} o {@link #DUPLICATEK_KEY}.
*/
public int updateSimulationBaseItem(SimulationBaseItem item)
{
if(! isItemInBase(item.getName()))
return NO_SUCH_OBJECT;
else
{
base.set(indexOf(item.getName()),item);
saveToFile();
}
return OK;
}
/**
* Remueve el �tem pasado por par�metro y guarda los cambios.
* @param item �tem.
* @return {@link #OK}, o {@link #NO_SUCH_OBJECT} en caso de no
* existir el objeto.
*/
public int removeSimulationBaseItem(SimulationBaseItem item)
{
if(indexOf(item.getName()) != -1)
{
base.removeElementAt(indexOf(item.getName()));
saveToFile();
return OK;
}
else
return NO_SUCH_OBJECT;
}
/**
* Graba en el archivo el contenido de la base. El nombre del archivo se
* obtiene del archivo de confifuraci�n.
*/
public void saveToFile()
{
String file = PropertiesLoader.getInstance().getProperty("SimulationBaseFile");
try
{
BufferedWriter out = new BufferedWriter(new FileWriter(file));
for (int i=0; i<base.size();i++)
out.write(((SimulationBaseItem)base.get(i)).toString());
out.close();
}
catch (IOException e)
{
Logger.error( e.getMessage() );
}
}
/**
* Retorna el arreglo de �tems.
* @return arreglo de �tems.
*/
public Vector getItems()
{
return base;
}
}