/**********************************************************************
* $Source: /cvsroot/jameica/jameica.webadmin/src/de/willuhn/jameica/webadmin/deploy/AbstractServletDeployer.java,v $
* $Revision: 1.2 $
* $Date: 2008/04/10 13:02:29 $
* $Author: willuhn $
* $Locker: $
* $State: Exp $
*
* Copyright (c) by willuhn software & services
* All rights reserved
*
**********************************************************************/
package de.willuhn.jameica.webadmin.deploy;
import org.mortbay.jetty.Handler;
import org.mortbay.jetty.handler.ContextHandler;
import org.mortbay.jetty.security.Constraint;
import org.mortbay.jetty.security.ConstraintMapping;
import org.mortbay.jetty.security.SecurityHandler;
import org.mortbay.jetty.security.UserRealm;
import org.mortbay.jetty.servlet.ServletHandler;
import de.willuhn.jameica.webadmin.Settings;
import de.willuhn.jameica.webadmin.server.JameicaUserRealm;
import de.willuhn.logging.Logger;
/**
* Abstrakte Basis-Implementierung eines Deployers, der Servlets deployen kann.
*/
public abstract class AbstractServletDeployer implements Deployer
{
/**
* @see de.willuhn.jameica.webadmin.deploy.Deployer#deploy()
*/
public final Handler[] deploy()
{
String context = getContext();
Class servlet = getServletClass();
Logger.info("deploying " + context + " (" + servlet.getName() + ")");
ServletHandler sv = new ServletHandler();
sv.addServletWithMapping(servlet,"/");
ContextHandler handler = new ContextHandler(context);
handler.setHandler(sv);
// Classloader explizit angeben. Sonst verwendet Jetty den System-Classloader, der nichts kennt
handler.setClassLoader(this.getClass().getClassLoader());
if (! Settings.getUseAuth())
return new Handler[]{handler};
UserRealm realm = getUserRealm();
if (realm == null)
{
Logger.error(" no user realm defined but authentication activated. fallback to login via master password");
realm = new JameicaUserRealm();
}
Logger.info(" activating authentication via " + realm.getName());
Constraint constraint = new Constraint();
constraint.setName(Constraint.__BASIC_AUTH);
constraint.setAuthenticate(true);
String[] roles = getSecurityRoles();
if (roles != null)
{
constraint.setRoles(roles);
}
ConstraintMapping cm = new ConstraintMapping();
cm.setConstraint(constraint);
cm.setPathSpec("/*");
SecurityHandler sh = new SecurityHandler();
sh.setUserRealm(realm);
sh.setConstraintMappings(new ConstraintMapping[]{cm});
sh.setHandler(handler);
return new Handler[]{sh};
}
/**
* Liefert den Namen des Contextes.
* Soll die Webanwendung also unter "http://server/test" erreichbar
* sein, muss die Funktion "/test" zurueckliefern.
* @return der Name des Context.
*/
protected abstract String getContext();
/**
* Liefert das zu deployende Servlet.
* @return das Servlet.
*/
protected abstract Class getServletClass();
/**
* Liefert die Benutzer-Rollen, die im Servlet zur Verfuegung stehen.
* Dummy-Implementierung, die keine Rollen zurueckliefert.
* Kann jedoch ueberschrieben werden.
* @return Liste der Rollen des Servlets.
*/
protected String[] getSecurityRoles()
{
return null;
}
/**
* Liefert das Login-Handle, welches fuer das Servlet verwendet werden soll.
* Dummy-Implementierung, die kein Login-Handle zurueckliefert.
* Kann jedoch ueberschrieben werden.
* @return das Login-Handle.
*/
protected UserRealm getUserRealm()
{
return null;
}
}
/*********************************************************************
* $Log: AbstractServletDeployer.java,v $
* Revision 1.2 2008/04/10 13:02:29 willuhn
* @N Zweischritt-Deployment. Der Server wird zwar sofort initialisiert, wenn der Jameica-Service startet, gestartet wird er aber erst, wenn die ersten Handler resgistriert werden
* @N damit koennen auch nachtraeglich zur Laufzeit weitere Handler hinzu registriert werden
* @R separater Worker in HttpServiceImpl entfernt. Der Classloader wird nun direkt von den Deployern gesetzt. Das ist wichtig, da Jetty fuer die Webanwendungen sonst den System-Classloader nutzt, welcher die Plugins nicht kennt
*
* Revision 1.1 2008/04/04 00:16:58 willuhn
* @N Apache XML-RPC von 3.0 auf 3.1 aktualisiert
* @N jameica.xmlrpc ist jetzt von jameica.webadmin abhaengig
* @N jameica.xmlrpc nutzt jetzt keinen eigenen embedded Webserver mehr sondern den Jetty von jameica.webadmin mittels Servlet. Damit kann nun XML-RPC ueber den gleichen TCP-Port (8080) gemacht werden, wo auch die restlichen Webfrontends laufen -> spart einen TCP-Port und skaliert besser wegen Multi-Threading-Support in Jetty
*
**********************************************************************/