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 components.neuralnetwork.NeuralNetworkException;
import components.neuralnetwork.Neuron;
import components.neuralnetwork.ExternalNeuralNetwork;
import resources.PropertiesLoader;
import utils.logging.Logger;
/**
* Esta clase implementa la base de datos de redes neuronales creadas.
*/
public class NeuralNetworkBase
{
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 NeuralNetworkBase()
{
super();
base = new Vector();
}
/**
* Recibe por parametro el archivo donde est� la base de las redes neuronales.
* @param file archivo de base de las redes neuronales.
* @throws NeuralNetworkException
*/
public NeuralNetworkBase(String file) throws NeuralNetworkException
{
super();
base = new Vector();
String str;
try
{
BufferedReader in = new BufferedReader(new FileReader(file));
while ((str = in.readLine()) != null)
{
if ( str.matches("[^#]*#[^#]*") )
{
NeuralNetworkBaseItem item = new NeuralNetworkBaseItem(str);
base.add(item);
if (EasyBotApp.getInstance().getExternalNetwork().load_network(item.getPath())==0)
{
item.setName(EasyBotApp.getInstance().getExternalNetwork().getName());
item.setDescription(EasyBotApp.getInstance().getExternalNetwork().getDescription());
item.setType(EasyBotApp.getInstance().getExternalNetwork().getType());
EasyBotApp.getInstance().getExternalNetwork().unload_network();
}
else
{
item.setName("");
item.setDescription("");
item.setType(-1);
}
}
}
if (getSelectedItem()==null) {
if(base.size() > 0) {
((NeuralNetworkBaseItem)base.get(0)).setSelected(true);
}
}
if (getSelectedItem()!=null) {
EasyBotApp.getInstance().getExternalNetwork().load_network(getSelectedItem().getPath());
}
in.close();
}
catch (IOException e)
{
throw new NeuralNetworkException( e.getMessage() );
}
}
/**
* Busca un �tem en la base de redes neuronales y lo retorna en caso de
* existir, o <code>null</code> si no se encuentra.
* @param path
* @return �tem o <code>null</code> si no se encuentra.
*/
public NeuralNetworkBaseItem getNeuralNetworkBaseItem(String path)
{
for (int i=0;i<base.size();i++)
{
if (((NeuralNetworkBaseItem)base.get(i)).getPath().compareTo(path)==0)
{
return (NeuralNetworkBaseItem)base.get(i);
}
}
return null;
}
/**
* Busca si existe un �tem por path.
* @param path
* @return <code>true</code> si existe, o <code>false</code> en caso
* contrario.
*/
public boolean isItemInBase(String path)
{
for (int i=0;i<base.size();i++)
if ( ((NeuralNetworkBaseItem)base.get(i)).getPath().compareTo(path) == 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 primera ocurrencia, o -1 en caso que no encuentre.
*/
public int indexOf(String path)
{
for (int i=0;i<base.size();i++)
{
if (((NeuralNetworkBaseItem)base.get(i)).getPath().compareTo(path)==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 insertNeuralNetworkBaseItem(NeuralNetworkBaseItem item)
{
if(! isItemInBase(item.getPath()))
{
base.add(item);
if (EasyBotApp.getInstance().getExternalNetwork().load_network(item.getPath())==0)
{
item.setName(EasyBotApp.getInstance().getExternalNetwork().getName());
item.setDescription(EasyBotApp.getInstance().getExternalNetwork().getDescription());
item.setType(EasyBotApp.getInstance().getExternalNetwork().getType());
EasyBotApp.getInstance().getExternalNetwork().unload_network();
}
else
{
item.setName("");
item.setDescription("");
item.setType(-1);
}
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 updateNeuralNetworkBaseItem(NeuralNetworkBaseItem item)
{
if(! isItemInBase(item.getPath()))
return NO_SUCH_OBJECT;
else
{
base.set(indexOf(item.getPath()),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 removeNeuralNetworkBaseItem(NeuralNetworkBaseItem item)
{
if(indexOf(item.getPath()) != -1)
{
base.removeElementAt(indexOf(item.getPath()));
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("NeuralNetworkBaseFile");
try
{
BufferedWriter out = new BufferedWriter(new FileWriter(file));
for (int i=0; i<base.size();i++)
out.write(((NeuralNetworkBaseItem)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;
}
/**
* Retorna el �tem seleccionado o NULL si no hay ninguno.
* @return NeuralNetworkBaseItem.
*/
public NeuralNetworkBaseItem getSelectedItem()
{
for (int i=0;i<base.size();i++)
{
if (((NeuralNetworkBaseItem)base.get(i)).getSelected())
return (NeuralNetworkBaseItem)base.get(i);
}
return null;
}
}