package resources.digesters;
import gui.EasyBotAppException;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
import resources.PropertiesLoader;
/**
* La clase <code>PluginCollector</code> es la encargada de buscar los archivos
* de manifiesto de los plug-ins, de manera recursiva, en la carpeta configurada
* como <code>PluginFolder</code> en el archivo de configuraci�n de EasyBot
* (<code>config.properties</code>).<br>
*
* La b�squeda recursiva es interrumpida en una rama cuando se encuentra un
* archivo con extensi�n <code>.properties</code>, cuyo prefijo est� definido
* en el archivo de configuraciones como <code>PluginFileNamePrefix</code>.
*/
public class PluginCollector
{
private List repositories;
/**
* El constructor es el encargado de armar la lista de directorios que
* fueron configurados en <code>config.properties</code> para la posterior
* b�squeda resursiva.
* @throws Exception si alguno de los directorios no existe.
*/
public PluginCollector()throws EasyBotAppException
{
super();
repositories = new LinkedList();
StringTokenizer st = new StringTokenizer(
// busca en el archivo de configuracion la key PluginFolder y si no la encuentra pone ./plugins
PropertiesLoader.getInstance().getProperty("PluginFolder",'.' + File.separator + "plugins")
, ",", false);
for ( ; st.hasMoreTokens() ; )
{
String token = st.nextToken().trim();
if ( token.length() == 0 )
continue;
try
{
repositories.add(new File(token).getCanonicalFile());
}
catch (IOException e)
{
throw new EasyBotAppException(e.getMessage());
}
}
}
/**
* Este metodo devuelve una colecci�n de instancias <code>PluginLocation</code>
* iterando sobre la lista de directorios generada en el contructor.
* @return colecci�n de instancias <code>PluginLocation</code>.
* @throws Exception si se produce un error procesando la lista de directorios.
*/
public Collection collectPluginLocations() throws EasyBotAppException
{
List result = new LinkedList();
for (Iterator it = repositories.iterator(); it.hasNext(); )
{
File file = (File) it.next();
if (file.isDirectory())
{
processFolder(file, result);
}
else if (file.isFile())
{
processFile(file, result);
}
}
return result;
}
protected void processFolder(final File folder, final List result) throws EasyBotAppException
{
try
{
PluginLocation pluginLocation = PluginLocation.create(folder);
if (pluginLocation != null)
{
result.add(pluginLocation);
return;
}
}
catch (MalformedURLException mue)
{
throw new EasyBotAppException(mue.getMessage());
}
File[] files = folder.listFiles();
for (int i = 0; i < files.length; i++)
{
File file = files[i];
if (file.isDirectory())
{
processFolder(file, result);
}
else if (file.isFile())
{
processFile(file, result);
}
}
}
protected void processFile(final File file, final List result) throws EasyBotAppException
{
try
{
PluginLocation pluginLocation = PluginLocation.create(file);
if (pluginLocation != null)
{
result.add(pluginLocation);
}
}
catch (MalformedURLException e)
{
throw new EasyBotAppException(e.getMessage());
}
}
}