/**********************************************************************
* $Source: /cvsroot/jameica/jameica.webadmin/src/de/willuhn/jameica/webadmin/deploy/WarDeployer.java,v $
* $Revision: 1.11 $
* $Date: 2012/03/29 21:11:30 $
* $Author: willuhn $
* $Locker: $
* $State: Exp $
*
* Copyright (c) by willuhn software & services
* All rights reserved
*
**********************************************************************/
package de.willuhn.jameica.webadmin.deploy;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.mortbay.jetty.Handler;
import org.mortbay.jetty.webapp.WebAppContext;
import de.willuhn.io.FileFinder;
import de.willuhn.jameica.system.Application;
import de.willuhn.jameica.webadmin.Plugin;
import de.willuhn.logging.Logger;
/**
* Durchsucht alle Plugins nach WAR-Dateien und deployed sie.
*/
public class WarDeployer implements Deployer
{
/**
* @see de.willuhn.jameica.webadmin.deploy.Deployer#deploy()
*/
public Handler[] deploy()
{
List<Config> wars = new ArrayList<Config>();
////////////////////////////////////////////////////////////////////////////
// 1. Wir suchen nach War-Datein in ~/.jameica/jameica.webadmin/webapps
{
String work = Application.getPluginLoader().getPlugin(Plugin.class).getResources().getWorkPath();
File dir = new File(work,"webapps");
FileFinder finder = new FileFinder(dir);
finder.extension("war");
File[] files = finder.findRecursive();
for (File f:files)
{
wars.add(new Config(f,null));
}
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// 2. Wir suchen in den Plugin-Verzeichnissen
List<de.willuhn.jameica.plugin.Plugin> list = Application.getPluginLoader().getInstalledPlugins();
for (int i=0;i<list.size();++i)
{
de.willuhn.jameica.plugin.Plugin plugin = list.get(i);
File dir = new File(plugin.getManifest().getPluginDir());
FileFinder finder = new FileFinder(dir);
finder.extension("war");
File[] files = finder.findRecursive();
for (File f:files)
{
wars.add(new Config(f,plugin));
}
}
////////////////////////////////////////////////////////////////////////////
if (wars.size() == 0)
{
Logger.info("no war files found");
return null;
}
List<Handler> handlers = new ArrayList<Handler>();
for (Config c:wars)
{
final String path = c.file.getAbsolutePath();
final String context = "/" + c.file.getName().replaceFirst("\\.war$",""); // ".war" am Ende noch abschneiden
Logger.info("deploying " + context + " (" + path + ")");
try
{
final WebAppContext ctx = new WebAppContext(path,context);
// Classloader explizit angeben. Sonst verwendet Jetty den System-Classloader, der nichts kennt
if (c.plugin != null)
ctx.setClassLoader(c.plugin.getManifest().getClassLoader());
handlers.add(ctx);
}
catch (Exception e)
{
Logger.error("unable to deploy " + context, e);
}
}
return handlers.toArray(new Handler[handlers.size()]);
}
/**
* Hilfsklasse, um WAR-Datei und Plugin zusammenzuhalten.
*/
private class Config
{
private File file = null;
private de.willuhn.jameica.plugin.Plugin plugin = null;
/**
* ct.
* @param file
* @param plugin
*/
private Config(File file, de.willuhn.jameica.plugin.Plugin plugin)
{
this.file = file;
this.plugin = plugin;
}
}
}