You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by sy...@apache.org on 2005/01/05 18:42:37 UTC

svn commit: r124234 - in cocoon/trunk: . src/blocks/cron/WEB-INF/xconf src/blocks/hsqldb/WEB-INF/xconf src/blocks/python/java/org/apache/cocoon/components/language/programming/python src/blocks/slide/conf src/blocks/xmldb/conf src/blocks/xsp/java/org/apache/cocoon/acting src/blocks/xsp/java/org/apache/cocoon/components/language/programming/java src/blocks/xsp/java/org/apache/cocoon/components/language/programming/javascript src/core/java/org/apache/cocoon/components src/core/java/org/apache/cocoon/core/container src/core/test/org/apache/cocoon/core/container src/java/org/apache/cocoon src/java/org/apache/cocoon/components/container src/java/org/apache/cocoon/components/treeprocessor src/java/org/apache/cocoon/components/treeprocessor/sitemap src/test/org/apache/cocoon

Author: sylvain
Date: Wed Jan  5 09:42:34 2005
New Revision: 124234

URL: http://svn.apache.org/viewcvs?view=rev&rev=124234
Log:
New lazy mode to load components, which heavily speeds up Cocoon initialization time
Added:
   cocoon/trunk/src/core/java/org/apache/cocoon/core/container/LazyHandler.java   (contents, props changed)
Modified:
   cocoon/trunk/src/blocks/cron/WEB-INF/xconf/cocoon-cron.xconf
   cocoon/trunk/src/blocks/hsqldb/WEB-INF/xconf/cocoon-hsqldb.xconf
   cocoon/trunk/src/blocks/python/java/org/apache/cocoon/components/language/programming/python/PythonProgram.java
   cocoon/trunk/src/blocks/slide/conf/slide-servlet.xweb
   cocoon/trunk/src/blocks/xmldb/conf/xindice-servlet.xweb
   cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/acting/ServerPagesAction.java
   cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/components/language/programming/java/JavaProgram.java
   cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/components/language/programming/javascript/JavascriptProgram.java
   cocoon/trunk/src/core/java/org/apache/cocoon/components/ServiceInfo.java
   cocoon/trunk/src/core/java/org/apache/cocoon/core/container/AbstractComponentHandler.java
   cocoon/trunk/src/core/java/org/apache/cocoon/core/container/AbstractServiceManager.java
   cocoon/trunk/src/core/java/org/apache/cocoon/core/container/ComponentEnvironment.java
   cocoon/trunk/src/core/java/org/apache/cocoon/core/container/ComponentFactory.java
   cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CoreServiceManager.java
   cocoon/trunk/src/core/java/org/apache/cocoon/core/container/DefaultServiceSelector.java
   cocoon/trunk/src/core/java/org/apache/cocoon/core/container/StandaloneServiceSelector.java
   cocoon/trunk/src/core/test/org/apache/cocoon/core/container/ContainerTestCase.java
   cocoon/trunk/src/java/org/apache/cocoon/Cocoon.java
   cocoon/trunk/src/java/org/apache/cocoon/cocoon.roles
   cocoon/trunk/src/java/org/apache/cocoon/components/container/CocoonServiceManager.java
   cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ProcessorComponentInfo.java
   cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/FlowNode.java
   cocoon/trunk/src/test/org/apache/cocoon/CocoonTestCase.java
   cocoon/trunk/src/test/org/apache/cocoon/SitemapComponentTestCase.java
   cocoon/trunk/status.xml

Modified: cocoon/trunk/src/blocks/cron/WEB-INF/xconf/cocoon-cron.xconf
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/cron/WEB-INF/xconf/cocoon-cron.xconf?view=diff&rev=124234&p1=cocoon/trunk/src/blocks/cron/WEB-INF/xconf/cocoon-cron.xconf&r1=124233&p2=cocoon/trunk/src/blocks/cron/WEB-INF/xconf/cocoon-cron.xconf&r2=124234
==============================================================================
--- cocoon/trunk/src/blocks/cron/WEB-INF/xconf/cocoon-cron.xconf	(original)
+++ cocoon/trunk/src/blocks/cron/WEB-INF/xconf/cocoon-cron.xconf	Wed Jan  5 09:42:34 2005
@@ -18,7 +18,7 @@
 <components>
     <component role="org.apache.cocoon.components.cron.JobScheduler"
                class="org.apache.cocoon.components.cron.CocoonQuartzJobScheduler"
-               logger="cron">
+               logger="cron" preload="true">
       <!--+
           | Definitions for a thread pool used to schedule jobs
           +-->

Modified: cocoon/trunk/src/blocks/hsqldb/WEB-INF/xconf/cocoon-hsqldb.xconf
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/hsqldb/WEB-INF/xconf/cocoon-hsqldb.xconf?view=diff&rev=124234&p1=cocoon/trunk/src/blocks/hsqldb/WEB-INF/xconf/cocoon-hsqldb.xconf&r1=124233&p2=cocoon/trunk/src/blocks/hsqldb/WEB-INF/xconf/cocoon-hsqldb.xconf&r2=124234
==============================================================================
--- cocoon/trunk/src/blocks/hsqldb/WEB-INF/xconf/cocoon-hsqldb.xconf	(original)
+++ cocoon/trunk/src/blocks/hsqldb/WEB-INF/xconf/cocoon-hsqldb.xconf	Wed Jan  5 09:42:34 2005
@@ -27,7 +27,7 @@
       +-->
   <hsqldb-server class="org.apache.cocoon.components.hsqldb.ServerImpl"
                  logger="core.hsqldb-server"
-                 pool-max="1" pool-min="1">
+                 preload="true">
      <parameter name="port" value="9002"/>
      <parameter name="silent" value="true"/>
      <parameter name="trace" value="false"/>

Modified: cocoon/trunk/src/blocks/python/java/org/apache/cocoon/components/language/programming/python/PythonProgram.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/python/java/org/apache/cocoon/components/language/programming/python/PythonProgram.java?view=diff&rev=124234&p1=cocoon/trunk/src/blocks/python/java/org/apache/cocoon/components/language/programming/python/PythonProgram.java&r1=124233&p2=cocoon/trunk/src/blocks/python/java/org/apache/cocoon/components/language/programming/python/PythonProgram.java&r2=124234
==============================================================================
--- cocoon/trunk/src/blocks/python/java/org/apache/cocoon/components/language/programming/python/PythonProgram.java	(original)
+++ cocoon/trunk/src/blocks/python/java/org/apache/cocoon/components/language/programming/python/PythonProgram.java	Wed Jan  5 09:42:34 2005
@@ -21,11 +21,9 @@
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.avalon.framework.service.ServiceManager;
 
-import org.apache.cocoon.components.ServiceInfo;
 import org.apache.cocoon.components.language.programming.Program;
 import org.apache.cocoon.components.language.generator.CompiledComponent;
 import org.apache.cocoon.core.container.AbstractComponentHandler;
-import org.apache.cocoon.core.container.ComponentEnvironment;
 import org.apache.cocoon.core.container.ComponentHandler;
 
 import java.io.File;
@@ -67,16 +65,9 @@
     public ComponentHandler getHandler(ServiceManager manager,
                                        Context context)
     throws Exception {
-        final ComponentEnvironment env = new ComponentEnvironment();
-        env.serviceManager = manager;
-        env.context = context;
-        env.logger = this.getLogger();
-        final ServiceInfo info = new ServiceInfo();
-        info.setConfiguration(config);
-        info.setServiceClass(clazz);
-        
+
         return AbstractComponentHandler.getComponentHandler(
-                null, info, env, null);
+                clazz, getLogger(), context, manager, config);
     }
 
     public CompiledComponent newInstance() throws Exception {

Modified: cocoon/trunk/src/blocks/slide/conf/slide-servlet.xweb
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/slide/conf/slide-servlet.xweb?view=diff&rev=124234&p1=cocoon/trunk/src/blocks/slide/conf/slide-servlet.xweb&r1=124233&p2=cocoon/trunk/src/blocks/slide/conf/slide-servlet.xweb&r2=124234
==============================================================================
--- cocoon/trunk/src/blocks/slide/conf/slide-servlet.xweb	(original)
+++ cocoon/trunk/src/blocks/slide/conf/slide-servlet.xweb	Wed Jan  5 09:42:34 2005
@@ -160,7 +160,9 @@
                 of interoperability problems.
             </description>
         </init-param>
-        <load-on-startup>2</load-on-startup>
+        <!-- Uncomment this to load slide servlet on startup -->
+        <!--load-on-startup>2</load-on-startup-->
+
         <!-- Uncomment this to get authentication -->
         <!--security-role-ref>
             <role-name>root</role-name>

Modified: cocoon/trunk/src/blocks/xmldb/conf/xindice-servlet.xweb
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/xmldb/conf/xindice-servlet.xweb?view=diff&rev=124234&p1=cocoon/trunk/src/blocks/xmldb/conf/xindice-servlet.xweb&r1=124233&p2=cocoon/trunk/src/blocks/xmldb/conf/xindice-servlet.xweb&r2=124234
==============================================================================
--- cocoon/trunk/src/blocks/xmldb/conf/xindice-servlet.xweb	(original)
+++ cocoon/trunk/src/blocks/xmldb/conf/xindice-servlet.xweb	Wed Jan  5 09:42:34 2005
@@ -36,6 +36,7 @@
       <param-value>WEB-INF/xindice.xml</param-value>
     </init-param>
 
-    <load-on-startup>1</load-on-startup>
+    <!-- Uncomment to load the xindice servlet on startup-->
+    <!--load-on-startup>1</load-on-startup-->
   </servlet>
 </xweb>

Modified: cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/acting/ServerPagesAction.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/acting/ServerPagesAction.java?view=diff&rev=124234&p1=cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/acting/ServerPagesAction.java&r1=124233&p2=cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/acting/ServerPagesAction.java&r2=124234
==============================================================================
--- cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/acting/ServerPagesAction.java	(original)
+++ cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/acting/ServerPagesAction.java	Wed Jan  5 09:42:34 2005
@@ -25,11 +25,9 @@
 import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.avalon.framework.thread.ThreadSafe;
 
-import org.apache.cocoon.components.ServiceInfo;
 import org.apache.cocoon.components.sax.XMLByteStreamCompiler;
 import org.apache.cocoon.components.sax.XMLByteStreamFragment;
 import org.apache.cocoon.core.container.AbstractComponentHandler;
-import org.apache.cocoon.core.container.ComponentEnvironment;
 import org.apache.cocoon.core.container.ComponentHandler;
 import org.apache.cocoon.environment.ObjectModelHelper;
 import org.apache.cocoon.environment.Redirector;
@@ -90,18 +88,12 @@
     public void configure(Configuration conf)
     throws ConfigurationException {
         try {
-            final ComponentEnvironment env = new ComponentEnvironment();
-            env.serviceManager = this.manager;
-            env.logger = this.getLogger();
-            final ServiceInfo info = new ServiceInfo();
-            info.setConfiguration(conf);
-            info.setServiceClass(ServerPagesGenerator.class);
-            
             this.generatorHandler = AbstractComponentHandler.getComponentHandler(
-                null,  // role
-                info,
-                env,
-                null   // RoleManager
+                ServerPagesGenerator.class,
+                this.getLogger(),
+                null,  // Context
+                this.manager,
+                conf
             );
 
             this.generatorHandler.initialize();

Modified: cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/components/language/programming/java/JavaProgram.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/components/language/programming/java/JavaProgram.java?view=diff&rev=124234&p1=cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/components/language/programming/java/JavaProgram.java&r1=124233&p2=cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/components/language/programming/java/JavaProgram.java&r2=124234
==============================================================================
--- cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/components/language/programming/java/JavaProgram.java	(original)
+++ cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/components/language/programming/java/JavaProgram.java	Wed Jan  5 09:42:34 2005
@@ -20,11 +20,9 @@
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.avalon.framework.service.ServiceManager;
 
-import org.apache.cocoon.components.ServiceInfo;
 import org.apache.cocoon.components.language.generator.CompiledComponent;
 import org.apache.cocoon.components.language.programming.Program;
 import org.apache.cocoon.core.container.AbstractComponentHandler;
-import org.apache.cocoon.core.container.ComponentEnvironment;
 import org.apache.cocoon.core.container.ComponentHandler;
 
 /**
@@ -49,18 +47,13 @@
     public ComponentHandler getHandler(ServiceManager manager,
                                        Context context)
     throws Exception {
-        final ComponentEnvironment env = new ComponentEnvironment();
-        env.serviceManager = manager;
-        env.context = context;
-        env.logger = this.getLogger();
-        final ServiceInfo info = new ServiceInfo();
-        info.setConfiguration(new DefaultConfiguration("", "GeneratorSelector"));
-        info.setServiceClass(program);
 
         return AbstractComponentHandler.getComponentHandler(
-                null, // role
-                info,
-                env, null);
+                program,
+                getLogger(),
+                context,
+                manager,
+                new DefaultConfiguration("", "GeneratorSelector"));
     }
 
     public CompiledComponent newInstance() throws Exception {

Modified: cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/components/language/programming/javascript/JavascriptProgram.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/components/language/programming/javascript/JavascriptProgram.java?view=diff&rev=124234&p1=cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/components/language/programming/javascript/JavascriptProgram.java&r1=124233&p2=cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/components/language/programming/javascript/JavascriptProgram.java&r2=124234
==============================================================================
--- cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/components/language/programming/javascript/JavascriptProgram.java	(original)
+++ cocoon/trunk/src/blocks/xsp/java/org/apache/cocoon/components/language/programming/javascript/JavascriptProgram.java	Wed Jan  5 09:42:34 2005
@@ -21,11 +21,9 @@
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.avalon.framework.service.ServiceManager;
 
-import org.apache.cocoon.components.ServiceInfo;
 import org.apache.cocoon.components.language.generator.CompiledComponent;
 import org.apache.cocoon.components.language.programming.Program;
 import org.apache.cocoon.core.container.AbstractComponentHandler;
-import org.apache.cocoon.core.container.ComponentEnvironment;
 import org.apache.cocoon.core.container.ComponentHandler;
 
 import java.io.File;
@@ -69,16 +67,9 @@
     public ComponentHandler getHandler(ServiceManager manager,
                                        Context context)
     throws Exception {
-        final ComponentEnvironment env = new ComponentEnvironment();
-        env.serviceManager = manager;
-        env.context = context;
-        env.logger = this.getLogger();
-        final ServiceInfo info = new ServiceInfo();
-        info.setConfiguration(this.config);
-        info.setServiceClass(clazz);
 
         return AbstractComponentHandler.getComponentHandler(
-                null, info, env, null);
+                clazz, getLogger(), context, manager, config);
     }
 
     public CompiledComponent newInstance() throws Exception {

Modified: cocoon/trunk/src/core/java/org/apache/cocoon/components/ServiceInfo.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/components/ServiceInfo.java?view=diff&rev=124234&p1=cocoon/trunk/src/core/java/org/apache/cocoon/components/ServiceInfo.java&r1=124233&p2=cocoon/trunk/src/core/java/org/apache/cocoon/components/ServiceInfo.java&r2=124234
==============================================================================
--- cocoon/trunk/src/core/java/org/apache/cocoon/components/ServiceInfo.java	(original)
+++ cocoon/trunk/src/core/java/org/apache/cocoon/components/ServiceInfo.java	Wed Jan  5 09:42:34 2005
@@ -33,7 +33,6 @@
     private String destroyMethodName;
     private String poolInMethodName;
     private String poolOutMethodName;
-    private Class serviceClass;
     private String serviceClassName;
     private Configuration configuration;
     
@@ -110,13 +109,6 @@
     public void setPoolOutMethodName(String poolMethod) {
         this.poolOutMethodName = poolMethod;
     }
-
-    /**
-     * @return Returns the serviceClass.
-     */
-    public Class getServiceClass() {
-        return serviceClass;
-    }
     
     /**
      * @return Returns the serviceClassName.
@@ -132,13 +124,6 @@
         this.serviceClassName = serviceClassName;
     }
     
-    /**
-     * @param serviceClass The serviceClass to set.
-     */
-    public void setServiceClass(Class serviceClass) {
-        this.serviceClass = serviceClass;
-    }
-        
     /**
      * @return Returns the configuration.
      */

Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/AbstractComponentHandler.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/core/container/AbstractComponentHandler.java?view=diff&rev=124234&p1=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/AbstractComponentHandler.java&r1=124233&p2=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/AbstractComponentHandler.java&r2=124234
==============================================================================
--- cocoon/trunk/src/core/java/org/apache/cocoon/core/container/AbstractComponentHandler.java	(original)
+++ cocoon/trunk/src/core/java/org/apache/cocoon/core/container/AbstractComponentHandler.java	Wed Jan  5 09:42:34 2005
@@ -16,9 +16,16 @@
  */
 package org.apache.cocoon.core.container;
 
+import org.apache.avalon.excalibur.logger.LoggerManager;
 import org.apache.avalon.excalibur.pool.Poolable;
 import org.apache.avalon.framework.component.Composable;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.configuration.DefaultConfiguration;
+import org.apache.avalon.framework.context.Context;
 import org.apache.avalon.framework.logger.Logger;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.avalon.framework.thread.SingleThreaded;
 import org.apache.avalon.framework.thread.ThreadSafe;
 import org.apache.cocoon.components.ServiceInfo;
@@ -44,87 +51,95 @@
     private boolean initialized = false;
     
     private ServiceInfo info;
-
+    
     /**
      * Looks up and returns a component handler for a given component class.
      *
      * @param role the component's role. Can be <code>null</code> if the role isn't known.
-     * @param componentClass Class of the component for which the handle is
+     * @param className Class of the component for which the handle is
      *                       being requested.
      * @param configuration The configuration for this component.
-     * @param serviceManager The service manager which will be managing the service.
-     * @param context The current context object.
-     * @param logger  The current logger
-     * @param loggerManager The current LoggerManager.
+     * @param componentEnv The component's creation environment.
      *
      * @throws Exception If there were any problems obtaining a ComponentHandler
      */
-    public static ComponentHandler getComponentHandler( final String role,
-                                                        final ServiceInfo info,
-                                                        final ComponentEnvironment env,
-                                                        final RoleManager roleManager)
-    throws Exception {
+    public static ComponentHandler getComponentHandler(
+            String role, String className, Configuration configuration, ComponentEnvironment componentEnv) throws Exception {
+        
+        // Load the class
+        Class componentClass;
+        
+        try {
+            componentClass = componentEnv.loadClass(className);
+        } catch(ClassNotFoundException cnfe) {
+            throw new ConfigurationException("Cannot find class " + className + " for component at " +
+                    configuration.getLocation(), cnfe);
+        }
+
         int numInterfaces = 0;
 
-        // FIXME we don't need the class but a classloader
-        info.setServiceClassName(info.getServiceClass().getName());
+        final ServiceInfo info = new ServiceInfo();
+        info.setServiceClassName(className);
+        info.setConfiguration(configuration);
         
         // Early check for Composable
-        if ( Composable.class.isAssignableFrom( info.getServiceClass() ) ) {
+        if ( Composable.class.isAssignableFrom( componentClass ) ) {
             throw new Exception("Interface Composable is not supported anymore. Please change class "
-                                + info.getServiceClassName() + " to use Serviceable instead.");
+                                + componentClass.getName() + " to use Serviceable instead.");
         }
 
-        if( SingleThreaded.class.isAssignableFrom( info.getServiceClass() ) ) {
+        if( SingleThreaded.class.isAssignableFrom( componentClass ) ) {
             numInterfaces++;
             info.setModel(ServiceInfo.MODEL_PRIMITIVE);
         }
 
-        if( ThreadSafe.class.isAssignableFrom( info.getServiceClass() ) ) {
+        if( ThreadSafe.class.isAssignableFrom( componentClass ) ) {
             numInterfaces++;
             info.setModel(ServiceInfo.MODEL_SINGLETON);
         }
 
-        if( Poolable.class.isAssignableFrom( info.getServiceClass() ) ) {
+        if( Poolable.class.isAssignableFrom( componentClass ) ) {
             numInterfaces++;
             info.setModel(ServiceInfo.MODEL_POOLED);
         }
 
         if( numInterfaces > 1 ) {
             throw new Exception( "[CONFLICT] More than one lifecycle interface in "
-                                 + info.getServiceClassName() + "  May implement no more than one of "
+                                 + componentClass.getName() + "  May implement no more than one of "
                                  + "SingleThreaded, ThreadSafe, or Poolable" );
         }
 
         if ( numInterfaces == 0 ) {
             // this component does not use avalon interfaces, so get the info from the configuration
-            info.fill(info.getConfiguration());
+            info.fill(configuration);
         }
         
         // Create the factory to use to create the instances of the Component.
         ComponentFactory factory;
-        
-        if (DefaultServiceSelector.class.isAssignableFrom(info.getServiceClass())) {
+        ComponentHandler handler;
+                
+        if (DefaultServiceSelector.class.isAssignableFrom(componentClass)) {
             // Special factory for DefaultServiceSelector
-            factory = new DefaultServiceSelector.Factory(env, roleManager, info, role);
+            factory = new DefaultServiceSelector.Factory(componentEnv, info, role);
+            handler = new ThreadSafeComponentHandler(info, componentEnv.logger, factory);
+            handler.initialize();
+            return handler;
             
-        } else if (StandaloneServiceSelector.class.isAssignableFrom(info.getServiceClass())) {
+        } else if (StandaloneServiceSelector.class.isAssignableFrom(componentClass)) {
             // Special factory for StandaloneServiceSelector
-            factory = new StandaloneServiceSelector.Factory(env, roleManager, info, role);
+            factory = new StandaloneServiceSelector.Factory(componentEnv, info, role);
                 
         } else {
-            factory = new ComponentFactory(env, info);
+            factory = new ComponentFactory(componentEnv, info);
         }
 
-        ComponentHandler handler;
-        
         if( info.getModel() == ServiceInfo.MODEL_POOLED )  {
-            handler = new PoolableComponentHandler( info, env.logger, factory, info.getConfiguration() );
+            handler = new PoolableComponentHandler( info, componentEnv.logger, factory, configuration );
         } else if( info.getModel() == ServiceInfo.MODEL_SINGLETON ) {
-            handler = new ThreadSafeComponentHandler( info, env.logger, factory );
+            handler = new ThreadSafeComponentHandler( info, componentEnv.logger, factory );
         } else {
             // This is a SingleThreaded component
-            handler = new SingleThreadedComponentHandler( info, env.logger, factory );
+            handler = new SingleThreadedComponentHandler( info, componentEnv.logger, factory );
         }
 
         return handler;
@@ -256,4 +271,13 @@
     }
     
     protected abstract void doInitialize() throws Exception;
+
+    /**
+     * Create a component handler (version used by XSP)
+     */
+    public static ComponentHandler getComponentHandler(Class clazz, Logger logger, Context context, ServiceManager manager, Configuration config) throws Exception {
+        ComponentEnvironment env = new ComponentEnvironment(clazz.getClassLoader(), logger, null, null, context, manager);
+        return getComponentHandler(null, clazz.getName(), config, env);
+
+    }
 }

Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/AbstractServiceManager.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/core/container/AbstractServiceManager.java?view=diff&rev=124234&p1=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/AbstractServiceManager.java&r1=124233&p2=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/AbstractServiceManager.java&r2=124234
==============================================================================
--- cocoon/trunk/src/core/java/org/apache/cocoon/core/container/AbstractServiceManager.java	(original)
+++ cocoon/trunk/src/core/java/org/apache/cocoon/core/container/AbstractServiceManager.java	Wed Jan  5 09:42:34 2005
@@ -31,7 +31,6 @@
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.avalon.framework.thread.ThreadSafe;
-import org.apache.cocoon.components.ServiceInfo;
 
 /**
  * Base class for all service managers: ServiceManager and ServiceSelector
@@ -62,6 +61,8 @@
 
     /** LoggerManager. */
     protected LoggerManager loggerManager;
+    
+    protected ComponentEnvironment componentEnv;
 
     
     /* (non-Javadoc)
@@ -94,18 +95,19 @@
      * @throws Exception If there were any problems obtaining a ComponentHandler
      */
     protected ComponentHandler getComponentHandler( final String role,
-                                                    final ServiceInfo info,
+                                                    final Class componentClass,
+                                                    final Configuration configuration,
                                                     final ServiceManager serviceManager)
     throws Exception {
-        final ComponentEnvironment env = new ComponentEnvironment();
-        env.serviceManager = serviceManager;
-        env.context = context;
-        env.logger = this.getLogger();
-        env.loggerManager = this.loggerManager;
+        if (this.componentEnv == null) {
+            this.componentEnv = new ComponentEnvironment(null, getLogger(), this.roleManager,
+                    this.loggerManager, this.context, serviceManager);
+        }
+        
         return AbstractComponentHandler.getComponentHandler(role,
-                                                     info,
-                                                     env,
-                                                     this.roleManager);
+                                                     componentClass.getName(),
+                                                     configuration,
+                                                     this.componentEnv);
     }
 
     protected void addComponent(String className,

Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/ComponentEnvironment.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/core/container/ComponentEnvironment.java?view=diff&rev=124234&p1=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/ComponentEnvironment.java&r1=124233&p2=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/ComponentEnvironment.java&r2=124234
==============================================================================
--- cocoon/trunk/src/core/java/org/apache/cocoon/core/container/ComponentEnvironment.java	(original)
+++ cocoon/trunk/src/core/java/org/apache/cocoon/core/container/ComponentEnvironment.java	Wed Jan  5 09:42:34 2005
@@ -29,10 +29,33 @@
  */
 public class ComponentEnvironment {
 
-    public ServiceManager serviceManager;
-    public Context context;
-    public Logger logger;
-    public LoggerManager loggerManager;
-    public ClassLoader classloader;
+    public final ServiceManager serviceManager;
+    public final Context context;
+    public final Logger logger;
+    public final RoleManager roleManager;
+    public final LoggerManager loggerManager;
+    private final ClassLoader classLoader;
     
+    public ComponentEnvironment(ClassLoader classLoader, Logger logger, RoleManager roleManager, LoggerManager loggerManager,
+            Context context, ServiceManager serviceManager) {
+
+        // Find a class loader
+        if (classLoader == null) {
+            classLoader = Thread.currentThread().getContextClassLoader();
+            if (classLoader == null) {
+                classLoader = this.getClass().getClassLoader();
+            }            
+        }
+
+        this.classLoader = classLoader;
+        this.logger = logger;
+        this.roleManager = roleManager;
+        this.loggerManager = loggerManager;
+        this.context = context;
+        this.serviceManager = serviceManager;
+    }
+
+    public Class loadClass(String name) throws ClassNotFoundException {
+        return this.classLoader.loadClass(name);
+    }
 }

Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/ComponentFactory.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/core/container/ComponentFactory.java?view=diff&rev=124234&p1=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/ComponentFactory.java&r1=124233&p2=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/ComponentFactory.java&r2=124234
==============================================================================
--- cocoon/trunk/src/core/java/org/apache/cocoon/core/container/ComponentFactory.java	(original)
+++ cocoon/trunk/src/core/java/org/apache/cocoon/core/container/ComponentFactory.java	Wed Jan  5 09:42:34 2005
@@ -36,6 +36,11 @@
     
     protected final ComponentEnvironment environment;
     
+    /**
+     * The component's logger, which may be different from the environment's logger
+     */
+    protected final Logger componentLogger;
+    
     /** The parameters for this component
      */
     protected Parameters parameters;
@@ -69,17 +74,9 @@
                 actualLogger = this.environment.loggerManager.getLoggerForCategory(category);
             }
         }
-        this.environment.logger = actualLogger;
+        this.componentLogger = actualLogger;
         
-        // now get the meta data for the component
-        // FIXME - this is a workaround
-        if ( this.environment.classloader == null ) {
-            this.environment.classloader = Thread.currentThread().getContextClassLoader();
-            if ( this.environment.classloader == null ) {
-                this.environment.classloader = this.getClass().getClassLoader();
-            }            
-        }
-        this.serviceClass = this.environment.classloader.loadClass(this.serviceInfo.getServiceClassName());
+        this.serviceClass = this.environment.loadClass(this.serviceInfo.getServiceClassName());
         if ( this.serviceInfo.getDestroyMethodName() != null ) {
             this.destroyMethod = this.serviceClass.getMethod(this.serviceInfo.getDestroyMethodName(), null);
         } else {
@@ -124,7 +121,7 @@
                     this.serviceClass.getName() + "." );
         }
 
-        ContainerUtil.enableLogging(component, this.environment.logger);
+        ContainerUtil.enableLogging(component, this.componentLogger);
         ContainerUtil.contextualize( component, this.environment.context );
         ContainerUtil.service( component, this.environment.serviceManager );
         ContainerUtil.configure( component, this.serviceInfo.getConfiguration() );

Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CoreServiceManager.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CoreServiceManager.java?view=diff&rev=124234&p1=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CoreServiceManager.java&r1=124233&p2=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CoreServiceManager.java&r2=124234
==============================================================================
--- cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CoreServiceManager.java	(original)
+++ cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CoreServiceManager.java	Wed Jan  5 09:42:34 2005
@@ -18,21 +18,30 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
+import org.apache.avalon.excalibur.logger.LoggerManager;
 import org.apache.avalon.framework.CascadingRuntimeException;
+import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.activity.Initializable;
 import org.apache.avalon.framework.configuration.Configurable;
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
 import org.apache.avalon.framework.configuration.DefaultConfiguration;
 import org.apache.avalon.framework.context.Context;
 import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.avalon.framework.logger.Logger;
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.thread.ThreadSafe;
 import org.apache.cocoon.components.ServiceInfo;
 import org.apache.cocoon.core.source.SimpleSourceResolver;
 import org.apache.excalibur.source.Source;
@@ -45,8 +54,8 @@
  * @version SVN $Revision: 1.6 $Id$
  */
 public class CoreServiceManager
-extends AbstractServiceManager
-implements ServiceManager, Configurable {
+        extends AbstractLogEnabled
+        implements Contextualizable, ThreadSafe, Disposable, Initializable, ServiceManager, Configurable {
     
     /**
      * An empty configuration object, that can be used when no configuration is known but one
@@ -54,6 +63,31 @@
      */
     public static final Configuration EMPTY_CONFIGURATION = new DefaultConfiguration("-", "unknown location");
     
+    /** The application context for components */
+    protected Context context;
+
+    /** Static component mapping handlers. */
+    protected final Map componentMapping = Collections.synchronizedMap(new HashMap());
+
+    /** Used to map roles to ComponentHandlers. */
+    protected final Map componentHandlers = Collections.synchronizedMap(new HashMap());
+
+    /** Is the Manager disposed or not? */
+    protected boolean disposed;
+
+    /** Is the Manager initialized? */
+    protected boolean initialized;
+
+    /** RoleInfos. */
+    protected RoleManager roleManager;
+
+    /** LoggerManager. */
+    protected LoggerManager loggerManager;
+    
+    private ComponentEnvironment componentEnv;
+    
+    private boolean lazyMode = Boolean.getBoolean("org.apache.cocoon.core.LazyMode");
+    
     /** The location where this manager is defined */
     protected String location;
     
@@ -89,6 +123,9 @@
     public void enableLogging(Logger logger) {
         super.enableLogging(logger);
         this.roleManager.enableLogging(logger);
+        String msg = "Lazy mode: " + this.lazyMode;
+        logger.debug(msg);
+        System.out.println(msg);
     }
 
     /* (non-Javadoc)
@@ -98,6 +135,13 @@
         this.context = context;
     }
     
+    /**
+     * Configure the LoggerManager.
+     */
+    public void setLoggerManager( final LoggerManager manager ) {
+        this.loggerManager = manager;
+    }
+    
     public void setRoleManager (RoleManager rm) {
         if (rm != null) {
             // Override the one eventually got in the parent (see constructor)
@@ -109,6 +153,9 @@
      * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
      */
     public void configure(Configuration configuration) throws ConfigurationException {
+        
+        this.componentEnv = new ComponentEnvironment(null, getLogger(), this.roleManager, this.loggerManager, this.context, this);
+        
         // Setup location
         this.location = configuration.getLocation();
         
@@ -137,7 +184,7 @@
      */
     public void initialize()
     throws Exception {
-        super.initialize();
+        this.initialized = true;
 
         // Initialize component handlers. This is done in no particular order, but initializing a
         // handler may indirectly initialize another handler through a call to lookup().
@@ -207,7 +254,7 @@
                 forceDisposal = true;
             }
         }
-        super.dispose();
+        this.disposed = true;
     }
 
     //=============================================================================================
@@ -284,15 +331,11 @@
                     }
 
                     try {
-                        // FIXME use different class loader
-                        final Class componentClass = this.getClass().getClassLoader().loadClass( info.getServiceClassName() );
                         final Configuration configuration = new DefaultConfiguration( "", "-" );
-                        info.setServiceClass(componentClass);
-                        info.setConfiguration(configuration);
 
                         handler = this.getComponentHandler(role,
-                                                       info,
-                                                       this);
+                                                       info.getServiceClassName(),
+                                                       configuration);
 
                         handler.initialize();
                     } catch (ServiceException se) {
@@ -399,56 +442,58 @@
      * Add a new component to the manager.
      *
      * @param role the role name for the new component.
-     * @param component the class of this component.
+     * @param className the class of this component.
      * @param configuration the configuration for this component.
      */
-    public void addComponent( final String role,
-                              final Class component,
-                              final Configuration configuration )
-    throws ServiceException {
+    public void addComponent( String role,
+                              String className,
+                              Configuration configuration )
+    throws ConfigurationException {
         if( this.initialized ) {
-            throw new ServiceException( role,
-                "Cannot add components to an initialized CoreServiceManager." );
+            throw new IllegalStateException("Cannot add components to an initialized CoreServiceManager." );
+        }
+
+        // check for old excalibur class names - we only test against the selector
+        // implementation
+        if ( "org.apache.cocoon.components.ExtendedComponentSelector".equals(className)) {
+            className = DefaultServiceSelector.class.getName();
+        }
+        
+        if( this.getLogger().isDebugEnabled() ) {
+            this.getLogger().debug( "Adding component (" + role + " = " + className + ")" );
         }
 
         ComponentHandler handler = (ComponentHandler)this.componentHandlers.get(role);
         if (handler != null) {
-            // Overloaded component: we only allow selectors to be overloaded
-            ServiceInfo info = handler.getInfo();
-            // FIXME - info should not contain the class, we need to get it from somewhere else
-            if (!DefaultServiceSelector.class.isAssignableFrom(component) ||
-                !DefaultServiceSelector.class.isAssignableFrom(info.getServiceClass())) {
-                throw new ServiceException(role, "Component declared at " + info.getLocation() + " is redefined at " +
-                        configuration.getLocation());
-            }
+            // Check that override is allowed. If yes, the handler will be redefined below, allowing
+            // the new definition to feed this manager with its components.
+            checkComponentOverride(role, className, configuration, handler);
         }
+        
         try {
-            final ServiceInfo info = new ServiceInfo();
-            info.setConfiguration(configuration);
-            info.setServiceClass(component);
-            handler = this.getComponentHandler(role, info, this);
+            handler = this.getComponentHandler(role, className, configuration);
 
             if( this.getLogger().isDebugEnabled() ) {
                 this.getLogger().debug( "Handler type = " + handler.getClass().getName() );
             }
 
             this.componentHandlers.put( role, handler );
-        } catch ( final ServiceException se ) {
-            throw se;
+        } catch ( final ConfigurationException ce ) {
+            throw ce;
         } catch( final Exception e ) {
-            throw new ServiceException( role, "Could not set up component handler.", e );
+            throw new ConfigurationException( "Could not add component defined at " + configuration.getLocation(), e );
         }
         
-        // Initialize shadow selector now, it will feed this service manager
-        if ( DefaultServiceSelector.class.isAssignableFrom( component )) {
-            try {
-                handler.initialize();
-            } catch(ServiceException se) {
-                throw se;
-            } catch(Exception e) {
-                throw new ServiceException(role, "Could not initialize selector", e);
-            }
-        }
+//        // Initialize shadow selector now, it will feed this service manager
+//        if ( DefaultServiceSelector.class.isAssignableFrom( component )) {
+//            try {
+//                handler.initialize();
+//            } catch(ServiceException se) {
+//                throw se;
+//            } catch(Exception e) {
+//                throw new ServiceException(role, "Could not initialize selector", e);
+//            }
+//        }
     }
     
     /**
@@ -517,6 +562,30 @@
     // Private methods
     //=============================================================================================
     
+    /**
+     * Obtain a new ComponentHandler for the specified component. 
+     * 
+     * @param role the component's role.
+     * @param componentClass Class of the component for which the handle is
+     *                       being requested.
+     * @param configuration The configuration for this component.
+     * @param serviceManager The service manager which will be managing the Component.
+     *
+     * @throws Exception If there were any problems obtaining a ComponentHandler
+     */
+    private ComponentHandler getComponentHandler( final String role,
+                                                    final String className,
+                                                    final Configuration configuration)
+    throws Exception {
+        
+        if (!lazyMode || configuration.getAttributeAsBoolean("preload", false) || role.endsWith("Selector")) {
+            return AbstractComponentHandler.getComponentHandler(
+                    role, className, configuration, this.componentEnv);
+        } else {
+            return new LazyHandler(role, className, configuration, this.componentEnv);
+        }
+    }
+
     private void parseConfiguration(final Configuration configuration, String contextURI, Set loadedURIs) 
         throws ConfigurationException {
 
@@ -562,8 +631,8 @@
                 if (name != null) {
                     role = role + "/" + name;
                 }
-    
-                this.addComponent(className, role, componentConfig);
+
+                this.addComponent(role, className, componentConfig);
             }
         }
     }
@@ -690,5 +759,34 @@
             this.parentManager.release(this.cachedSourceResolver);
         }
         this.cachedSourceResolver = null;
+    }
+    
+    /** 
+     * Check if a component can be overriden. Only {@link DefaultSelector} or its subclasses can be
+     * overriden, as they directly feed this manager with their component definitions and are empty
+     * shells delegating to this manager afterwards.
+     */
+    private void checkComponentOverride(String role, String className, Configuration config,
+            ComponentHandler existingHandler) throws ConfigurationException {
+        
+        // We only allow selectors to be overloaded
+        ServiceInfo info = existingHandler.getInfo();
+        if (!className.equals(info.getServiceClassName())) {
+            throw new ConfigurationException("Role " + role + " redefined with a different class name, at " +
+                    config.getLocation());
+        }
+        
+        Class clazz;
+        try {
+            clazz = this.componentEnv.loadClass(className);
+        } catch(ClassNotFoundException cnfe) {
+            throw new ConfigurationException("Cannot load class " + className + " for component at " +
+                    config.getLocation(), cnfe);
+        }
+
+        if (!DefaultServiceSelector.class.isAssignableFrom(clazz)) {
+            throw new ConfigurationException("Component declared at " + info.getLocation() + " is redefined at " +
+                    config.getLocation());
+        }
     }
 }

Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/DefaultServiceSelector.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/core/container/DefaultServiceSelector.java?view=diff&rev=124234&p1=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/DefaultServiceSelector.java&r1=124233&p2=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/DefaultServiceSelector.java&r2=124234
==============================================================================
--- cocoon/trunk/src/core/java/org/apache/cocoon/core/container/DefaultServiceSelector.java	(original)
+++ cocoon/trunk/src/core/java/org/apache/cocoon/core/container/DefaultServiceSelector.java	Wed Jan  5 09:42:34 2005
@@ -118,7 +118,7 @@
             }
             
             // Add this component in the manager
-            this.manager.addComponent(className, this.rolePrefix + key, instance);
+            this.manager.addComponent(this.rolePrefix + key, className, instance);
         }
         
         // Register default key, if any
@@ -191,13 +191,11 @@
      */
     public static class Factory extends ComponentFactory {
         private final String role;
-        private final RoleManager roleManager;
         
-        public Factory(ComponentEnvironment env, RoleManager manager, ServiceInfo info, String role) 
+        public Factory(ComponentEnvironment env, ServiceInfo info, String role) 
         throws Exception {
             super(env, info);
             this.role = role;
-            this.roleManager = manager;
         }
         
         protected void setupInstance(Object object)
@@ -208,7 +206,7 @@
             ContainerUtil.contextualize(component, this.environment.context);
             ContainerUtil.service(component, this.environment.serviceManager);
             
-            component.setRoleManager(this.roleManager);
+            component.setRoleManager(this.environment.roleManager);
             component.setRole(this.role);
             
             ContainerUtil.configure(component, this.serviceInfo.getConfiguration());

Added: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/LazyHandler.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/core/container/LazyHandler.java?view=auto&rev=124234
==============================================================================
--- (empty file)
+++ cocoon/trunk/src/core/java/org/apache/cocoon/core/container/LazyHandler.java	Wed Jan  5 09:42:34 2005
@@ -0,0 +1,116 @@
+/*
+ * Created on Jan 3, 2005
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package org.apache.cocoon.core.container;
+
+import org.apache.avalon.framework.CascadingRuntimeException;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.cocoon.components.ServiceInfo;
+
+/**
+ * @author sylvain
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class LazyHandler implements ComponentHandler {
+    
+    private String role;
+    private String className;
+    private Configuration config;
+    private ComponentEnvironment compEnv;
+    
+    private ComponentHandler delegate;
+    
+    public LazyHandler(String role, String className, Configuration configuration, ComponentEnvironment environment) {
+        this.role = role;
+        this.className = className;
+        this.config = configuration;
+        this.compEnv = environment;
+    }
+    
+    private ComponentHandler getDelegate() throws Exception {
+        if (this.delegate == null) {
+//            System.err.println("######## " + System.identityHashCode(compEnv.serviceManager) + " creating handler for " + this.role);
+            this.delegate = AbstractComponentHandler.getComponentHandler(role, className, config, compEnv);
+            this.delegate.initialize();
+        }
+        
+        return this.delegate;
+    }
+    
+    private ComponentHandler getDelegateRE() {
+        try {
+            return getDelegate();
+        } catch (Exception e) {
+            throw new CascadingRuntimeException("Cannot get delegate handler", e);
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.cocoon.core.container.ComponentHandler#get()
+     */
+    public Object get() throws Exception {
+        return getDelegate().get();
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.cocoon.core.container.ComponentHandler#put(java.lang.Object)
+     */
+    public void put(Object component) throws Exception {
+        getDelegate().put(component);
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.cocoon.core.container.ComponentHandler#isSingleton()
+     */
+    public boolean isSingleton() {
+        return getDelegateRE().isSingleton();
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.cocoon.core.container.ComponentHandler#canBeDisposed()
+     */
+    public boolean canBeDisposed() {
+        // We can always be disposed if handler was never used
+        if (this.delegate == null) {
+            return true;
+        } else {
+            return getDelegateRE().canBeDisposed();
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.cocoon.core.container.ComponentHandler#dispose()
+     */
+    public void dispose() {
+        // Dispose only if handler was actually used
+        if (this.delegate != null) {
+            this.delegate.dispose();
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.cocoon.core.container.ComponentHandler#initialize()
+     */
+    public void initialize() throws Exception {
+        // nothing (delegate is initialized when created)
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.cocoon.core.container.ComponentHandler#getInfo()
+     */
+    public ServiceInfo getInfo() {
+        if (this.delegate == null) {
+            final ServiceInfo info = new ServiceInfo();
+            info.setServiceClassName(className);
+            info.setConfiguration(config);
+            return info;
+        } else {
+            return this.delegate.getInfo();
+        }
+    }
+}

Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/StandaloneServiceSelector.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/core/container/StandaloneServiceSelector.java?view=diff&rev=124234&p1=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/StandaloneServiceSelector.java&r1=124233&p2=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/StandaloneServiceSelector.java&r2=124234
==============================================================================
--- cocoon/trunk/src/core/java/org/apache/cocoon/core/container/StandaloneServiceSelector.java	(original)
+++ cocoon/trunk/src/core/java/org/apache/cocoon/core/container/StandaloneServiceSelector.java	Wed Jan  5 09:42:34 2005
@@ -343,11 +343,9 @@
         }
 
         try {
-            final ServiceInfo info = new ServiceInfo();
-            info.setConfiguration(configuration);
-            info.setServiceClass(component);
             final ComponentHandler handler = getComponentHandler( null,
-                                                                  info,
+                                                                  component,
+                                                                  configuration,
                                                                   this.serviceManager);
 
             handler.initialize();
@@ -460,13 +458,11 @@
      */
     public static class Factory extends ComponentFactory {
         
-        private final RoleManager roleManager;
         private final String role;
         
-        public Factory(ComponentEnvironment env, RoleManager roleManager, ServiceInfo info, String role) 
+        public Factory(ComponentEnvironment env, ServiceInfo info, String role) 
         throws Exception {
             super(env, info);
-            this.roleManager = roleManager;
             this.role = role;
         }
         
@@ -479,7 +475,7 @@
             ContainerUtil.service(component, this.environment.serviceManager);
             
             component.setLoggerManager(this.environment.loggerManager);
-            component.setRoleManager(this.roleManager);
+            component.setRoleManager(this.environment.roleManager);
 
             ServiceManager manager = this.environment.serviceManager;
             if (manager instanceof CoreServiceManager) {

Modified: cocoon/trunk/src/core/test/org/apache/cocoon/core/container/ContainerTestCase.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/test/org/apache/cocoon/core/container/ContainerTestCase.java?view=diff&rev=124234&p1=cocoon/trunk/src/core/test/org/apache/cocoon/core/container/ContainerTestCase.java&r1=124233&p2=cocoon/trunk/src/core/test/org/apache/cocoon/core/container/ContainerTestCase.java&r2=124234
==============================================================================
--- cocoon/trunk/src/core/test/org/apache/cocoon/core/container/ContainerTestCase.java	(original)
+++ cocoon/trunk/src/core/test/org/apache/cocoon/core/container/ContainerTestCase.java	Wed Jan  5 09:42:34 2005
@@ -24,6 +24,7 @@
 import org.apache.avalon.excalibur.logger.LoggerManager;
 import org.apache.avalon.framework.configuration.Configurable;
 import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
 import org.apache.avalon.framework.configuration.DefaultConfiguration;
 import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
 import org.apache.avalon.framework.container.ContainerUtil;
@@ -259,7 +260,7 @@
      * components.
      */
     protected void addComponents( CoreServiceManager manager) 
-    throws ServiceException {
+    throws ServiceException, ConfigurationException {
         // subclasses can add components here
     }
     

Modified: cocoon/trunk/src/java/org/apache/cocoon/Cocoon.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/Cocoon.java?view=diff&rev=124234&p1=cocoon/trunk/src/java/org/apache/cocoon/Cocoon.java&r1=124233&p2=cocoon/trunk/src/java/org/apache/cocoon/Cocoon.java&r2=124234
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/Cocoon.java	(original)
+++ cocoon/trunk/src/java/org/apache/cocoon/Cocoon.java	Wed Jan  5 09:42:34 2005
@@ -184,6 +184,8 @@
      * @exception Exception if an error occurs
      */
     public void initialize() throws Exception {
+//long start = System.currentTimeMillis();
+
         this.serviceManager = new CocoonServiceManager(this.parentServiceManager);
         ContainerUtil.enableLogging(this.serviceManager, getLogger().getChildLogger("manager"));
         ContainerUtil.contextualize(this.serviceManager, this.context);
@@ -227,6 +229,8 @@
         if (this.serviceManager.hasService(RequestListener.ROLE)){
             this.requestListener = (RequestListener) this.serviceManager.lookup(RequestListener.ROLE);
         }
+//long delay = System.currentTimeMillis() - start;
+//System.err.println("########## Cocoon.initialize() : " + delay);
     }
 
     /** Dump System Properties */
@@ -470,6 +474,8 @@
      */
     public boolean process(Environment environment)
     throws Exception {
+//long start = System.currentTimeMillis();
+
         if (this.disposed) {
             throw new IllegalStateException("You cannot process a Disposed Cocoon engine.");
         }
@@ -519,6 +525,9 @@
             }
             // commit response on success
             environment.commitResponse();
+
+//long delay = System.currentTimeMillis() - start;
+//System.err.println("########## Cocoon.process() : " + delay);
 
             return result;
         } catch (Exception any) {

Modified: cocoon/trunk/src/java/org/apache/cocoon/cocoon.roles
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/cocoon.roles?view=diff&rev=124234&p1=cocoon/trunk/src/java/org/apache/cocoon/cocoon.roles&r1=124233&p2=cocoon/trunk/src/java/org/apache/cocoon/cocoon.roles&r2=124234
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/cocoon.roles	(original)
+++ cocoon/trunk/src/java/org/apache/cocoon/cocoon.roles	Wed Jan  5 09:42:34 2005
@@ -204,7 +204,7 @@
         default-class="org.apache.cocoon.i18n.XMLResourceBundleFactory"/>
 
   <!-- Control flow layer: the interpreters selector and continuations  manager -->
-  <role name="org.apache.cocoon.components.flow.Interpreter" 
+  <role name="org.apache.cocoon.components.flow.InterpreterSelector" 
         shorthand="flow-interpreters"
         default-class="org.apache.cocoon.core.container.DefaultServiceSelector"/>
 

Modified: cocoon/trunk/src/java/org/apache/cocoon/components/container/CocoonServiceManager.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/container/CocoonServiceManager.java?view=diff&rev=124234&p1=cocoon/trunk/src/java/org/apache/cocoon/components/container/CocoonServiceManager.java&r1=124233&p2=cocoon/trunk/src/java/org/apache/cocoon/components/container/CocoonServiceManager.java&r2=124234
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/container/CocoonServiceManager.java	(original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/container/CocoonServiceManager.java	Wed Jan  5 09:42:34 2005
@@ -54,7 +54,7 @@
         this.info = new ProcessorComponentInfo(parentInfo);
     }
     
-    public void addComponent(String role, Class clazz, Configuration config) throws ServiceException {
+    public void addComponent(String role, String clazz, Configuration config) throws ConfigurationException {
         super.addComponent(role, clazz, config);
         // Let's ProcessorComponentInfo do its stuff.
         // Note: if more behaviours of this kind are needed, we may setup an

Modified: cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ProcessorComponentInfo.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ProcessorComponentInfo.java?view=diff&rev=124234&p1=cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ProcessorComponentInfo.java&r1=124233&p2=cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ProcessorComponentInfo.java&r2=124234
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ProcessorComponentInfo.java	(original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ProcessorComponentInfo.java	Wed Jan  5 09:42:34 2005
@@ -95,7 +95,7 @@
      * @param clazz the component's class
      * @param config the component's configuration
      */
-    public void componentAdded(String role, Class clazz, Configuration config) {
+    public void componentAdded(String role, String clazz, Configuration config) {
         if (role.startsWith(GENERATOR_PREFIX)) {
             setupLabelAndPipelineHint(role, config);
 

Modified: cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/FlowNode.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/FlowNode.java?view=diff&rev=124234&p1=cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/FlowNode.java&r1=124233&p2=cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/FlowNode.java&r2=124234
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/FlowNode.java	(original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/FlowNode.java	Wed Jan  5 09:42:34 2005
@@ -57,7 +57,7 @@
         this.manager = manager;
 
         try {
-            this.interpreterSelector = (ServiceSelector) manager.lookup(Interpreter.ROLE);
+            this.interpreterSelector = (ServiceSelector) manager.lookup(Interpreter.ROLE + "Selector");
             // Obtain the Interpreter instance for this language
             this.interpreter = (Interpreter) this.interpreterSelector.select(language);
             // Set interpreter ID as location of the flow node (which includes full sitemap file path)

Modified: cocoon/trunk/src/test/org/apache/cocoon/CocoonTestCase.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/test/org/apache/cocoon/CocoonTestCase.java?view=diff&rev=124234&p1=cocoon/trunk/src/test/org/apache/cocoon/CocoonTestCase.java&r1=124233&p2=cocoon/trunk/src/test/org/apache/cocoon/CocoonTestCase.java&r2=124234
==============================================================================
--- cocoon/trunk/src/test/org/apache/cocoon/CocoonTestCase.java	(original)
+++ cocoon/trunk/src/test/org/apache/cocoon/CocoonTestCase.java	Wed Jan  5 09:42:34 2005
@@ -16,6 +16,7 @@
 
 package org.apache.cocoon;
 
+import org.apache.avalon.framework.configuration.ConfigurationException;
 import org.apache.avalon.framework.configuration.DefaultConfiguration;
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.cocoon.core.container.CoreServiceManager;
@@ -37,7 +38,7 @@
      * @see org.apache.cocoon.core.container.ContainerTestCase#addComponents(org.apache.cocoon.core.container.CocoonServiceManager)
      */
     protected void addComponents(CoreServiceManager manager) 
-    throws ServiceException {
+    throws ServiceException, ConfigurationException {
         super.addComponents(manager);
         if ( this.addSourceFactories() ) {
             // Create configuration for source-factories
@@ -51,12 +52,12 @@
             factory.setAttribute("name", "*");
             df.addChild(factory);
             manager.addComponent("org.apache.excalibur.source.SourceFactorySelector", 
-                                 CocoonServiceSelector.class, 
+                                 CocoonServiceSelector.class.getName(), 
                                  df);
         }
         if ( this.addSourceResolver() ) {
             manager.addComponent(SourceResolver.ROLE, 
-                    SourceResolverImpl.class, 
+                    SourceResolverImpl.class.getName(), 
                     new DefaultConfiguration("", "-"));
         }
     }

Modified: cocoon/trunk/src/test/org/apache/cocoon/SitemapComponentTestCase.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/test/org/apache/cocoon/SitemapComponentTestCase.java?view=diff&rev=124234&p1=cocoon/trunk/src/test/org/apache/cocoon/SitemapComponentTestCase.java&r1=124233&p2=cocoon/trunk/src/test/org/apache/cocoon/SitemapComponentTestCase.java&r2=124234
==============================================================================
--- cocoon/trunk/src/test/org/apache/cocoon/SitemapComponentTestCase.java	(original)
+++ cocoon/trunk/src/test/org/apache/cocoon/SitemapComponentTestCase.java	Wed Jan  5 09:42:34 2005
@@ -28,6 +28,7 @@
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
+import org.apache.avalon.framework.configuration.ConfigurationException;
 import org.apache.avalon.framework.configuration.DefaultConfiguration;
 import org.apache.avalon.framework.context.DefaultContext;
 import org.apache.avalon.framework.parameters.Parameters;
@@ -130,7 +131,7 @@
      * @see org.apache.cocoon.core.container.ContainerTestCase#addComponents(org.apache.cocoon.core.container.CocoonServiceManager)
      */
     protected void addComponents(CoreServiceManager manager) 
-    throws ServiceException {
+    throws ServiceException, ConfigurationException {
         super.addComponents(manager);
         final String[] o = this.getSitemapComponentInfo();
         if ( o != null ) {
@@ -145,7 +146,7 @@
             factory.setAttribute("name", key);
             df.addChild(factory);
             manager.addComponent(typeClassName + "Selector", 
-                                 CocoonServiceSelector.class, 
+                                 CocoonServiceSelector.class.getName(), 
                                  df);
         }
     }
@@ -505,7 +506,7 @@
         SourceResolver resolver = null;
 
         try {
-            selector = (ServiceSelector) this.lookup(Interpreter.ROLE);
+            selector = (ServiceSelector) this.lookup(Interpreter.ROLE + "Selector");
             assertNotNull("Test lookup of interpreter selector", selector);
 
             resolver = (SourceResolver) this.lookup(SourceResolver.ROLE);
@@ -548,7 +549,7 @@
         SourceResolver resolver = null;
 
         try {
-            selector = (ServiceSelector) this.lookup(Interpreter.ROLE);
+            selector = (ServiceSelector) this.lookup(Interpreter.ROLE + "Selector");
             assertNotNull("Test lookup of interpreter selector", selector);
 
             resolver = (SourceResolver) this.lookup(SourceResolver.ROLE);

Modified: cocoon/trunk/status.xml
Url: http://svn.apache.org/viewcvs/cocoon/trunk/status.xml?view=diff&rev=124234&p1=cocoon/trunk/status.xml&r1=124233&p2=cocoon/trunk/status.xml&r2=124234
==============================================================================
--- cocoon/trunk/status.xml	(original)
+++ cocoon/trunk/status.xml	Wed Jan  5 09:42:34 2005
@@ -203,6 +203,11 @@
   <changes>
  <release version="@version@" date="@date@">
    <action dev="SW" type="add">
+     Add an experimental lazy loading in the service manager that dramatically speeds up Cocoon init time
+     (approx 4 times faster). To use it, set JAVA_OPTIONS="-Dorg.apache.cocoon.core.LazyMode=true" prior
+     to starting "cocoon.sh servlet".
+   </action>
+   <action dev="SW" type="add">
      Add an include feature to xconf files and xmap files, to allow an easier configuration of the system.
      The main cocoon.xconf is now a list of inclusion of the main core components and a
      separate xconf file for each block. Additional role files can also be included.

Re: svn commit: r124234 - in cocoon/trunk: . src/blocks/cron/WEB-INF/xconf src/blocks/hsqldb/WEB-INF/xconf src/blocks/python/java/org/apache/cocoon/components/language/programming/python src/blocks/slide/conf src/blocks/xmldb/conf src/blocks/xsp/java/org/apache/cocoon/acting src/blocks/xsp/java/org/apache/cocoon/components/language/programming/java src/blocks/xsp/java/org/apache/cocoon/components/language/programming/javascript src/core/java/org/apache/cocoon/components src/core/java/org/apache/cocoon/core/container src/core/test/org/apache/cocoon/core/container src/java/org/apache/cocoon src/java/org/apache/cocoon/components/container src/java/org/apache/cocoon/components/treeprocessor src/java/org/apache/cocoon/components/treeprocessor/sitemap src/test/org/apache/cocoon

Posted by Stefano Mazzocchi <st...@apache.org>.
sylvain@apache.org wrote:
> Author: sylvain
> Date: Wed Jan  5 09:42:34 2005
> New Revision: 124234
> 
> URL: http://svn.apache.org/viewcvs?view=rev&rev=124234
> Log:
> New lazy mode to load components, which heavily speeds up Cocoon initialization time

boy, that hero plate of mine is getting *very* shiny :-)

-- 
Stefano.