I happened to have written just the thing. Feel free to include it
into excalibur under Apache license. build.xml needs to be augmented
with:
<exclude
name="org/apache/avalon/excalibur/servlet/ComponentManagerCreator.java"
unless="servlet.present"/>
To make it always build.
Any suggestions and fixes are certainly welcome.
>>>>> "Peter" == Peter Donald <[EMAIL PROTECTED]> writes:
Peter> Sounds like a great idea - any volunteers ?
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE file.
*/
package org.apache.avalon.excalibur.servlet;
import java.io.InputStream;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.ServletException;
import javax.servlet.UnavailableException;
import org.xml.sax.SAXException;
import org.apache.log.Hierarchy;
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.context.DefaultContext;
import org.apache.avalon.excalibur.component.ExcaliburComponentManager;
import org.apache.avalon.excalibur.component.DefaultRoleManager;
import org.apache.avalon.excalibur.component.RoleManager;
/**
* Initializes servlet component manager. Puts it into the
* servlet context. Typical usage of the ComponentManager from a JSP
* page is:
* <pre>
* <%@ page import="org.apache.avalon.framework.component.ComponentManager" %>
* <%@ page
import="org.apache.avalon.excalibur.servlet.ComponentManagerCreator" %>
* <%@ page import="com.mycompany.MyComponent" %>
* ComponentManager cm = (ComponentManager)
*
getServletConfig().getServletContext().getAttribute(ComponentManagerCreator.COMPONENT_MANAGER);
* MyComponent myC = (MyComponent) cm.lookup(MyComponent.ROLE);
* message = myC.getMessage();
* cm.release(myC);
* </pre>
* @author Gregory Steuck mailto:[EMAIL PROTECTED]
*/
public class ComponentManagerCreator extends GenericServlet {
/**
* Name of the servlet context attribute that contains our
* component manager.
*/
public static final String COMPONENT_MANAGER =
"org.apache.avalon.excalibur.servlet.ComponentManager";
/**
* Builds the component manager, stores it as an attribute of the
* ServletContext.
*/
public void init(ServletConfig config) throws ServletException
{
super.init(config);
try {
InputStream roleStream = streamFromParameter(config, "roles");
InputStream configStream = streamFromParameter(config,
"configuration");
ServletContext ctx = getServletContext();
ctx.setAttribute(COMPONENT_MANAGER,
buildComponentManager(configStream,
roleStream));
configStream.close();
roleStream.close();
} catch (IOException e) {
abort(e);
} catch (SAXException e) {
abort(e);
} catch (ConfigurationException e) {
abort(e);
}
}
/**
* Does not process any requests, complains if attempted. Since
* it is not mapped to URLs this method should never be called.
*/
public void service(ServletRequest req, ServletResponse res)
throws UnavailableException
{
abort(getClass().getName() + " doesn't service requests");
}
/**
* Removes the component manager from the servlet context.
* Hardly ever called, but is here for consistency.
*/
public void destroy() {
log(getClass().getName() + " destroyed, removing component manager");
ServletContext ctx = getServletContext();
ExcaliburComponentManager cm =
(ExcaliburComponentManager) ctx.getAttribute(COMPONENT_MANAGER);
ctx.removeAttribute(COMPONENT_MANAGER);
cm.dispose();
}
/**
* Creates Avalon component manager from the passed config stream
* and role config stream.
* @param config input stream containing components definitions
* @param roles input stream with role definitions
*/
private ComponentManager buildComponentManager(InputStream configStream,
InputStream roleStream)
throws IOException, SAXException, ConfigurationException
{
DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
Configuration roleConfig = builder.build(roleStream);
DefaultRoleManager roles = new DefaultRoleManager();
roles.setLogger(Hierarchy.getDefaultHierarchy().getLoggerFor("document.roles"));
roles.configure(roleConfig);
Configuration systemConf = builder.build(configStream);
ExcaliburComponentManager manager = new ExcaliburComponentManager();
manager.setLogger(Hierarchy.getDefaultHierarchy().getLoggerFor("bp"));
manager.contextualize(new DefaultContext());
manager.setRoleManager(roles);
manager.configure(systemConf);
manager.initialize();
return manager;
}
/**
* Logs the error message and makes servlet unavailable
* by throwing UnavailableException.
*
* @param msg reason for failure
*/
private void abort(String msg) throws UnavailableException {
log(msg);
throw new UnavailableException(msg);
}
/**
* Logs passed exception and makes servlet unavailable
* by throwing UnavailableException.
* @param e exception that caused the original failure
*/
private void abort(Exception e) throws UnavailableException {
log("", e);
throw new UnavailableException(e.getMessage());
}
/**
* Finds the value for given key in the servlet init parameters,
* treats it as a file name, opens a resource stream with this
* name.
* @param resourceName key into init parameters
* @param config connection to the world
* @return opened resorce stream
* @throws ServletException if init parameter does not exist, or resource
can't be opened
*/
private InputStream streamFromParameter(ServletConfig config,
String resourceName)
throws ServletException
{
String configFileName = config.getInitParameter(resourceName);
if (configFileName == null) {
abort(resourceName + " parameter must be provided");
}
ServletContext ctx = config.getServletContext();
log("Attempting to use file " + configFileName);
InputStream result = ctx.getResourceAsStream(configFileName);
if (result == null) {
abort("Resource '" + configFileName + "' is not available.");
}
return result;
}
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>