Author: pier Date: Wed Nov 3 16:44:17 2004 New Revision: 56540 Modified: cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/KernelLoader.java cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/ServletLoader.java cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/ServletWrapper.java Log: Do not use servlet context attributes for the kernel, but a more siple (and more secure) static factory method
Modified: cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/KernelLoader.java ============================================================================== --- cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/KernelLoader.java (original) +++ cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/KernelLoader.java Wed Nov 3 16:44:17 2004 @@ -16,7 +16,6 @@ import java.net.URL; import java.net.URLClassLoader; import java.util.HashSet; -import java.util.Iterator; import java.util.Set; /** @@ -88,15 +87,6 @@ return(kernel); } - /** - * <p>Add a [EMAIL PROTECTED] URL} to the class path handled by this [EMAIL PROTECTED] KernelLoader} - * instance.</p> - */ - public Iterator getURLs(StartupKernel kernel) { - if (this.kernel != kernel) throw new SecurityException("Invalid instance"); - return(this.urls.iterator()); - } - /** * <p>Add a [EMAIL PROTECTED] URL} to the class path handled by this [EMAIL PROTECTED] KernelLoader} * instance.</p> Modified: cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/ServletLoader.java ============================================================================== --- cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/ServletLoader.java (original) +++ cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/ServletLoader.java Wed Nov 3 16:44:17 2004 @@ -21,6 +21,7 @@ import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; +import javax.servlet.ServletException; import org.apache.cocoon.kernel.Kernel; import org.apache.cocoon.kernel.configuration.Configuration; @@ -63,20 +64,32 @@ */ public class ServletLoader implements ServletContextListener { - /** - * <p>The [EMAIL PROTECTED] ServletContext} attribute name of the [EMAIL PROTECTED] Kernel} instance - * associated with this web application.</p> - */ - public static final String ATTRIBUTE = "org.apache.cocoon.kernel.Kernel"; - + /** <p>The unique instance of this [EMAIL PROTECTED] ServletLoader}.</p> */ + private static ServletLoader instance = null; /** <p>The current [EMAIL PROTECTED] Deployer} instance.</p> */ - StartupKernel kernel = null; + private StartupKernel kernel = null; /** * <p>Create a new [EMAIL PROTECTED] ServletLoader} instance.</p> */ public ServletLoader() { super(); + if (ServletLoader.instance != null) { + throw new IllegalStateException("Duplicate initialization"); + } else { + ServletLoader.instance = this; + } + } + + /** + * <p>Create a new [EMAIL PROTECTED] ServletLoader} instance.</p> + */ + protected static Object lookup(String name) + throws ServletException { + if (ServletLoader.instance.kernel == null) { + throw new ServletException("Kernel not initialized"); + } + return ServletLoader.instance.kernel.lookup(name); } /** @@ -149,10 +162,6 @@ logger.error("Unable to intialize kernel", t); throw new RuntimeException("Unable to initialize kernel", t); } - - /* Make the kernel available through the servlet context */ - Wrapper wrapper = new Wrapper(this.kernel); - context.setAttribute(ServletLoader.ATTRIBUTE, wrapper); } /** @@ -161,7 +170,6 @@ public void contextDestroyed(ServletContextEvent event) { if (this.kernel == null) return; ServletContext context = event.getServletContext(); - context.removeAttribute(ServletLoader.ATTRIBUTE); try { this.kernel.destroy(); } catch (Throwable t) { Modified: cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/ServletWrapper.java ============================================================================== --- cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/ServletWrapper.java (original) +++ cocoon/whiteboard/kernel/sources/startup/org/apache/cocoon/kernel/startup/ServletWrapper.java Wed Nov 3 16:44:17 2004 @@ -13,6 +13,7 @@ package org.apache.cocoon.kernel.startup; import java.io.IOException; +import java.util.Enumeration; import javax.servlet.Servlet; import javax.servlet.ServletConfig; @@ -49,13 +50,20 @@ public void init(ServletConfig config) throws ServletException { ServletContext context = config.getServletContext(); - Kernel kernel = (Kernel) context.getAttribute(ServletLoader.ATTRIBUTE); - if (kernel == null) throw new ServletException("Unable to retrieve Kernel"); - - String name = context.getInitParameter("block-instance"); + + String name = config.getInitParameter("block-instance"); if (name == null) throw new ServletException("No block instance configured"); - this.instance = (Servlet) kernel.lookup(name); + String err = "Unable to access servlet instance for block \"" + name + "\""; + try { + this.instance = (Servlet) ServletLoader.lookup(name); + if (this.instance == null) throw new ServletException(err); + this.instance.init(config); + } catch (ServletException e) { + throw e; + } catch (Throwable t) { + throw new ServletException(err, t); + } } /**