After discussion with Paul Hammant, applied this patch to allow
phoenix-embedded Servlets to take advantage of LogEnabled and Initializable
life-cycle methods. Changes are to the jetty-sevak block.

Created a new class called AvalonContext to pass into the constructors of
the numerous Jetty wrapper classes. This is in place of the ServiceManager
and holds both a ServiceManager and an Avalon Logger).

New class attached:
sevak/src/java/org/apache/avalon/apps/sevak/blocks/jetty/AvalonContext.java

Patch file attached:
avalon-apps-sevak.patch

Ben Hogan
http://lizardsoftware.com/


Index: sevak/src/java/org/apache/avalon/apps/sevak/Sevak.java
===================================================================
RCS file:
/home/cvspublic/avalon-apps/sevak/src/java/org/apache/avalon/apps/sevak/Seva
k.java,v
retrieving revision 1.4
diff -u -r1.4 Sevak.java
--- sevak/src/java/org/apache/avalon/apps/sevak/Sevak.java 12 Jan 2003
14:17:40 -0000 1.4
+++ sevak/src/java/org/apache/avalon/apps/sevak/Sevak.java 7 Feb 2003
15:18:51 -0000
@@ -8,6 +8,7 @@
 package org.apache.avalon.apps.sevak;

 import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.apps.sevak.blocks.jetty.AvalonContext;

 import java.io.File;

@@ -33,10 +34,10 @@
      * Deploy the given Web Application
      * @param context Context for the the webapp
      * @param pathToWebAppFolder path can be a war-archive or exploded
directory
-     * @param serviceManager The service manager to use for (optional)
Serviceable servlets.
+     * @param avalonContext the context that is applied to the servlet on
instantiation.
      * @throws SevakException Thrown when context already exists
      */
-    void deploy(String context, File pathToWebAppFolder, ServiceManager
serviceManager) throws SevakException;
+    void deploy(String context, File pathToWebAppFolder, AvalonContext
avalonContext) throws SevakException;


     /**
Index:
sevak/src/java/org/apache/avalon/apps/sevak/blocks/jetty/JettySevak.java
===================================================================
RCS file:
/home/cvspublic/avalon-apps/sevak/src/java/org/apache/avalon/apps/sevak/bloc
ks/jetty/JettySevak.java,v
retrieving revision 1.14
diff -u -r1.14 JettySevak.java
--- sevak/src/java/org/apache/avalon/apps/sevak/blocks/jetty/JettySevak.java
6 Feb 2003 16:43:46 -0000 1.14
+++ sevak/src/java/org/apache/avalon/apps/sevak/blocks/jetty/JettySevak.java
7 Feb 2003 15:18:52 -0000
@@ -102,7 +102,7 @@
     private int m_minThreads;
     private int m_maxThreads;
     private File m_sarRootDir;
-    private ServiceManager m_serviceManager;
+    private AvalonContext m_avalonContext;

     /**
      * @param serviceManager
@@ -112,7 +112,7 @@
      */
     public void service( ServiceManager serviceManager ) throws
ServiceException
     {
-        m_serviceManager = serviceManager;
+        m_avalonContext = new AvalonContext(serviceManager, getLogger());
     }

     /**
@@ -161,7 +161,7 @@
         Log.instance().add( phoenixLogSink );

         RequestLogger logger = ( RequestLogger )
-            m_serviceManager.lookup( RequestLogger.ROLE );
+            m_avalonContext.getServiceManager().lookup(
RequestLogger.ROLE );
         m_server.setRequestLog( new JettyRequestLogAdapter( logger ) );
     }

@@ -203,17 +203,17 @@
      */
     public void deploy( String context, File pathToWebAppFolder ) throws
SevakException
     {
-        deploy( context, pathToWebAppFolder, m_serviceManager );
+        deploy( context, pathToWebAppFolder, m_avalonContext );
     }

     /**
      * Deploy a webapp
      * @param context the contxct for the webapp
      * @param pathToWebAppFolder the path to it
-     * @param serviceManager The service manager to use for (optional)
Serviceable servlets.
+     * @param avalonContext The optional context to apply to servlets
(LogEnabled, Serviceable).
      * @throws SevakException if a problem
      */
-    public void deploy( String context, File pathToWebAppFolder,
ServiceManager serviceManager )
+    public void deploy( String context, File pathToWebAppFolder,
AvalonContext avalonContext )
         throws SevakException
     {
         String webAppURL = null;
@@ -224,7 +224,7 @@
             // This still does not work.

             WebApplicationContext ctx =
-                new SevakWebApplicationContext( serviceManager,
m_sarRootDir, webAppURL );
+                new SevakWebApplicationContext( avalonContext,
m_sarRootDir, webAppURL );
             ctx.setContextPath( context );
             m_server.addContext( m_hostName, ctx );

Index:
sevak/src/java/org/apache/avalon/apps/sevak/blocks/jetty/SevakServletHolder.
java
===================================================================
RCS file:
/home/cvspublic/avalon-apps/sevak/src/java/org/apache/avalon/apps/sevak/bloc
ks/jetty/SevakServletHolder.java,v
retrieving revision 1.2
diff -u -r1.2 SevakServletHolder.java
---
sevak/src/java/org/apache/avalon/apps/sevak/blocks/jetty/SevakServletHolder.
java 10 Jan 2003 00:33:32 -0000 1.2
+++
sevak/src/java/org/apache/avalon/apps/sevak/blocks/jetty/SevakServletHolder.
java 7 Feb 2003 15:18:52 -0000
@@ -9,8 +9,9 @@

 import org.mortbay.jetty.servlet.ServletHolder;
 import org.apache.avalon.framework.service.Serviceable;
-import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.logger.LogEnabled;
+import org.apache.avalon.framework.activity.Initializable;

 /**
  *
@@ -24,25 +25,28 @@
  */
 public class SevakServletHolder extends ServletHolder
 {
-    private ServiceManager m_serviceManager;
+    private AvalonContext m_avalonContext;

     /**
      * Construct a Servlet Holder
-     * @param serviceManager the service manager
+     * @param avalonContext the context that is applied to the servlet on
instantiation.
      * @param handler the handler
      * @param name the name
      * @param className the class name
      * @param forcedPath the forced path
      */
-    public SevakServletHolder(ServiceManager serviceManager,
SevakWebApplicationHandler handler, String name, String className, String
forcedPath)
+    public SevakServletHolder(AvalonContext avalonContext,
SevakWebApplicationHandler handler, String name, String className, String
forcedPath)
     {
         // this constructor public or protected...
         super(handler, name, className, forcedPath);
-        m_serviceManager = serviceManager;
+        m_avalonContext = avalonContext;
     }

     /**
-     * Create a new instance
+     * Create a new instance of a servlet, currently applying the following
lifecycle:
+     * If a servlet is Servicable then the serviceManager is set on the
servlet.
+     * If a servlet is LogEnabled then the logger is set on the servlet.
+     * If a servlet is Initializable then the initialize method is invoked.
      * @return the instance
      * @throws InstantiationException if a prob
      * @throws IllegalAccessException if a prob
@@ -52,14 +56,36 @@
             throw new InstantiationException("No class for " + this);
         else {
             Object instance = _class.newInstance();
+            if (instance instanceof LogEnabled) {
+                try
+                {
+                    ((LogEnabled)
instance).enableLogging(m_avalonContext.getLogger());
+                }
+                catch (Exception e)
+                {
+                    throw new InstantiationException("Exception during
enableLogging for servlet "
+                            + _class.getName() + ":" + e.getMessage());
+                }
+            }
             if (instance instanceof Serviceable) {
                 try
                 {
-                    ((Serviceable) instance).service(m_serviceManager);
+                    ((Serviceable)
instance).service(m_avalonContext.getServiceManager());
                 }
                 catch (ServiceException e)
                 {
                     throw new InstantiationException("Service Exception for
servlet "
+                            + _class.getName() + ":" + e.getMessage());
+                }
+            }
+            if (instance instanceof Initializable) {
+                try
+                {
+                    ((Initializable) instance).initialize();
+                }
+                catch (Exception e)
+                {
+                    throw new InstantiationException("Exception during
initialize for servlet "
                             + _class.getName() + ":" + e.getMessage());
                 }
             }
Index:
sevak/src/java/org/apache/avalon/apps/sevak/blocks/jetty/SevakWebApplication
Context.java
===================================================================
RCS file:
/home/cvspublic/avalon-apps/sevak/src/java/org/apache/avalon/apps/sevak/bloc
ks/jetty/SevakWebApplicationContext.java,v
retrieving revision 1.3
diff -u -r1.3 SevakWebApplicationContext.java
---
sevak/src/java/org/apache/avalon/apps/sevak/blocks/jetty/SevakWebApplication
Context.java 10 Jan 2003 00:33:32 -0000 1.3
+++
sevak/src/java/org/apache/avalon/apps/sevak/blocks/jetty/SevakWebApplication
Context.java 7 Feb 2003 15:18:52 -0000
@@ -8,9 +8,6 @@
 package org.apache.avalon.apps.sevak.blocks.jetty;

 import org.mortbay.jetty.servlet.WebApplicationContext;
-import org.mortbay.jetty.servlet.ServletHandler;
-import org.mortbay.jetty.servlet.WebApplicationHandler;
-import org.apache.avalon.framework.service.ServiceManager;

 import java.io.IOException;
 import java.io.File;
@@ -32,16 +29,16 @@

     private File m_sarRoot;
     private File m_phoenixLib;
-    private ServiceManager m_serviceManager;
+    private AvalonContext m_avalonContext;

-    public SevakWebApplicationContext(ServiceManager serviceManager, File
sarRoot, String webAppURL) throws IOException
+    public SevakWebApplicationContext(AvalonContext avalonContext, File
sarRoot, String webAppURL) throws IOException
     {
         super(webAppURL);
         m_sarRoot = sarRoot;
         m_phoenixLib = new
File(sarRoot.getParentFile().getParentFile(),"lib");
-        m_serviceManager = serviceManager;
+        m_avalonContext = avalonContext;

-        addHandler(0, new SevakWebApplicationHandler(m_serviceManager));
+        addHandler(0, new SevakWebApplicationHandler(m_avalonContext));

     }

Index:
sevak/src/java/org/apache/avalon/apps/sevak/blocks/jetty/SevakWebApplication
Handler.java
===================================================================
RCS file:
/home/cvspublic/avalon-apps/sevak/src/java/org/apache/avalon/apps/sevak/bloc
ks/jetty/SevakWebApplicationHandler.java,v
retrieving revision 1.1
diff -u -r1.1 SevakWebApplicationHandler.java
---
sevak/src/java/org/apache/avalon/apps/sevak/blocks/jetty/SevakWebApplication
Handler.java 9 Jan 2003 07:42:49 -0000 1.1
+++
sevak/src/java/org/apache/avalon/apps/sevak/blocks/jetty/SevakWebApplication
Handler.java 7 Feb 2003 15:18:52 -0000
@@ -9,7 +9,6 @@

 import org.mortbay.jetty.servlet.WebApplicationHandler;
 import org.mortbay.jetty.servlet.ServletHolder;
-import org.apache.avalon.framework.service.ServiceManager;

 /**
  *
@@ -23,11 +22,11 @@
  */
 public class SevakWebApplicationHandler extends WebApplicationHandler {

-    ServiceManager m_serviceManager;
+    AvalonContext m_avalonContext;

-    public SevakWebApplicationHandler(ServiceManager serviceManager)
+    public SevakWebApplicationHandler(AvalonContext avalonContext)
     {
-        m_serviceManager = serviceManager;
+        m_avalonContext = avalonContext;
     }

     public ServletHolder newServletHolder(String name, String servletClass,
String forcedPath)
@@ -35,7 +34,7 @@
         if(_nameMap.containsKey(name)) {
             throw new IllegalArgumentException("Named servlet already
exists: " + name);
         } else {
-            ServletHolder holder = new SevakServletHolder(m_serviceManager,
this, name, servletClass, forcedPath);
+            ServletHolder holder = new SevakServletHolder(m_avalonContext,
this, name, servletClass, forcedPath);
             _nameMap.put(holder.getName(), holder);
             return holder;
         }

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to