--- C:\Home\leo\LOCALS~1\Temp\src.org.apache.cocoon.servlet.CocoonServlet_orig_3.java   Thu Aug 30 15:24:59 2001
+++ C:\Home\leo\private\Apache\xml-cocoon2\src\org\apache\cocoon\servlet\CocoonServlet.java     Thu Aug 30 15:03:51 2001

@@ -7,7 +7,10 @@
  *****************************************************************************/
 package org.apache.cocoon.servlet;

+import org.apache.avalon.framework.activity.Initializable;
+import org.apache.avalon.framework.component.ComponentManager;
 import org.apache.avalon.framework.context.DefaultContext;
+import org.apache.avalon.framework.logger.Loggable;
 import org.apache.cocoon.Cocoon;
 import org.apache.cocoon.ConnectionResetException;
 import org.apache.cocoon.Constants;
@@ -43,6 +46,7 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.lang.reflect.Constructor;
 import java.net.URL;
 import java.util.Arrays;
 import java.util.Date;
@@ -57,6 +61,7 @@
  * @author <a href="mailto:nicolaken@supereva.it">Nicola Ken Barozzi</a> Aisa
  * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
  * @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
+ * @author <a href="mailto:leo.sutic@inspireinfrastructure.com">Leo Sutic</a>
  * @version CVS $Revision: 1.13.2.20 $ $Date: 2001/08/20 19:02:08 $
  */

@@ -99,6 +104,8 @@
     protected String forceLoadParameter;
     private boolean addClassDirs;

+    private String parentComponentManagerClass;
+
     /**
      * Initialize this <code>CocoonServlet</code> instance.  You will
      * notice that I have broken the init into sub methods to make it
@@ -183,6 +190,11 @@
            log.debug("show-time was not set - defaulting to false");
         }

+        parentComponentManagerClass = conf.getInitParameter("parent-component-manager");
+        if(parentComponentManagerClass == null) {
+            log.debug("parent-component-manager was not set - defaulting to null.");
+        }
+
         this.createCocoon();
     }

@@ -660,6 +672,42 @@
     }

     /**
+     * Instatiates the parent component manager, as specified in the
+     * parent-component-manager init parameter.
+     *
+     * If none is specified, the method returns <code>null</code>.
+     *
+     * @return the parent component manager, or <code>null</code>.
+     */
+    private synchronized ComponentManager getParentComponentManager() {
+        ComponentManager parentComponentManager = null;
+        if (parentComponentManagerClass != null) {
+            try {
+                String initParam = null;
+                int dividerPos = parentComponentManagerClass.indexOf('/');
+                if (dividerPos != -1) {
+                    initParam = parentComponentManagerClass.substring (dividerPos + 1);
+                    parentComponentManagerClass = parentComponentManagerClass.substring (0, dividerPos);
+                }
+
+                Class pcm = ClassUtils.loadClass(parentComponentManagerClass);
+                Constructor pcmc = pcm.getConstructor(new Class[]{String.class});
+                parentComponentManager = (ComponentManager) pcmc.newInstance(new Object[]{initParam});
+
+                if (parentComponentManager instanceof Loggable) {
+                    ((Loggable) parentComponentManager).setLogger(log);
+                }
+                if (parentComponentManager instanceof Initializable) {
+                    ((Initializable) parentComponentManager).initialize();
+                }
+            } catch (Exception e) {
+                log.error("Could not initialize parent component manager.", e);
+            }
+        }
+        return parentComponentManager;
+    }
+
+    /**
      * Creates the Cocoon object and handles exception handling.
      */
     private synchronized void createCocoon()
@@ -681,8 +729,10 @@
             URL configFile = (URL) this.appContext.get(Constants.CONTEXT_CONFIG_URL);
             log.info("Reloading from: " + configFile.toExternalForm());
             Cocoon c = (Cocoon) ClassUtils.newInstance("org.apache.cocoon.Cocoon");
+
             c.contextualize(this.appContext);
             c.setLogger(this.log);
+            c.compose(getParentComponentManager ());
             c.initialize();
             this.creationTime = new Date().getTime();