You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2006/03/03 15:52:19 UTC

svn commit: r382842 - in /cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon: components/treeprocessor/DefaultTreeBuilder.java components/treeprocessor/sitemap/SitemapLanguage.java core/container/spring/BeanFactoryUtil.java

Author: cziegeler
Date: Fri Mar  3 06:52:18 2006
New Revision: 382842

URL: http://svn.apache.org/viewcvs?rev=382842&view=rev
Log:
Start adding a bean for creating new sitemap bean factories

Modified:
    cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/DefaultTreeBuilder.java
    cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
    cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryUtil.java

Modified: cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/DefaultTreeBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/DefaultTreeBuilder.java?rev=382842&r1=382841&r2=382842&view=diff
==============================================================================
--- cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/DefaultTreeBuilder.java (original)
+++ cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/DefaultTreeBuilder.java Fri Mar  3 06:52:18 2006
@@ -198,12 +198,6 @@
         return this.context;
     }
 
-    protected ClassLoader createClassLoader(Configuration tree) throws Exception {
-        // Useless method as it's redefined in SitemapLanguage
-        // which is the only used incarnation.
-        return Thread.currentThread().getContextClassLoader();        
-    }
-    
     /**
      * Create a service manager that will be used for all <code>Serviceable</code>
      * <code>ProcessingNodeBuilder</code>s and <code>ProcessingNode</code>s.
@@ -217,7 +211,7 @@
      *
      * @return a component manager
      */
-    protected abstract ConfigurableBeanFactory createApplicationContext(ClassLoader classloader, Context context, Configuration tree)
+    protected abstract ConfigurableBeanFactory createBeanFactory(ClassLoader classloader, Context context, Configuration tree)
     throws Exception;
 
 
@@ -377,7 +371,7 @@
         // Only create an sitemap internal component manager if there really is a configuration
         // FIXME: Internal configurations doesn't work in a non bean factory environment
         if (componentConfig != null) {
-            this.itsBeanFactory = createApplicationContext(this.itsClassLoader, this.itsContext, componentConfig);
+            this.itsBeanFactory = createBeanFactory(this.itsClassLoader, this.itsContext, componentConfig);
             this.itsManager = (ServiceManager)this.itsBeanFactory.getBean(ServiceManager.class.getName());
         } else {
             this.itsManager = manager;

Modified: cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java?rev=382842&r1=382841&r2=382842&view=diff
==============================================================================
--- cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java (original)
+++ cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java Fri Mar  3 06:52:18 2006
@@ -103,10 +103,12 @@
 //    }
     
     /**
-     * Build a component manager with the contents of the &lt;map:components&gt; element of
-     * the tree.
+     * Build a component manager with the contents of the &lt;map:components&gt; element
+     * of the tree.
      */
-    protected ConfigurableBeanFactory createApplicationContext(ClassLoader classloader, Context context, Configuration config)
+    protected ConfigurableBeanFactory createBeanFactory(ClassLoader   classloader,
+                                                        Context       context,
+                                                        Configuration config)
     throws Exception {
 
         // Create the classloader, if needed.
@@ -120,7 +122,6 @@
                                                                 config.getNamespace(),
                                                                 "");
         c.addAll(config);
-        c.removeChild(config.getChild("application-container"));
         c.removeChild(config.getChild("classpath"));
         c.removeChild(config.getChild("listeners"));
 
@@ -143,7 +144,7 @@
         final ConfigurableBeanFactory sitemapContext = 
             BeanFactoryUtil.createBeanFactory(ae, ci, parentContext, false);
         newManager = (ServiceManager) sitemapContext.getBean(ServiceManager.class.getName());
-        Logger sitemapLogger = sitemapLogger = (Logger)sitemapContext.getBean(Logger.class.getName());
+        Logger sitemapLogger = (Logger)sitemapContext.getBean(Logger.class.getName());
 
         // and finally the listeners
         final Configuration listenersWrapper = config.getChild("listeners", false);

Modified: cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryUtil.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryUtil.java?rev=382842&r1=382841&r2=382842&view=diff
==============================================================================
--- cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryUtil.java (original)
+++ cocoon/trunk/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryUtil.java Fri Mar  3 06:52:18 2006
@@ -19,28 +19,41 @@
 import java.net.URL;
 import java.util.Iterator;
 
+import javax.servlet.ServletConfig;
 import javax.servlet.ServletContext;
 
 import org.apache.avalon.excalibur.logger.Log4JConfLoggerManager;
 import org.apache.avalon.excalibur.logger.ServletLogger;
 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.DefaultContext;
 import org.apache.avalon.framework.logger.Logger;
+import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.cocoon.ProcessingUtil;
 import org.apache.cocoon.acting.Action;
+import org.apache.cocoon.components.ContextHelper;
+import org.apache.cocoon.components.LifecycleHelper;
 import org.apache.cocoon.components.pipeline.ProcessingPipeline;
 import org.apache.cocoon.components.treeprocessor.ProcessorComponentInfo;
+import org.apache.cocoon.components.treeprocessor.TreeBuilder;
 import org.apache.cocoon.core.CoreInitializationException;
 import org.apache.cocoon.core.Settings;
 import org.apache.cocoon.core.container.util.ConfigurationBuilder;
 import org.apache.cocoon.core.container.util.SettingsContext;
+import org.apache.cocoon.environment.Request;
 import org.apache.cocoon.generation.Generator;
 import org.apache.cocoon.matching.Matcher;
 import org.apache.cocoon.reading.Reader;
 import org.apache.cocoon.selection.Selector;
 import org.apache.cocoon.serialization.Serializer;
+import org.apache.cocoon.servlet.CocoonServlet;
+import org.apache.cocoon.sitemap.EnterSitemapEventListener;
+import org.apache.cocoon.sitemap.LeaveSitemapEventListener;
+import org.apache.cocoon.sitemap.SitemapListener;
 import org.apache.cocoon.transformation.Transformer;
+import org.apache.cocoon.util.ClassUtils;
 import org.springframework.beans.factory.BeanFactory;
 import org.springframework.beans.factory.config.ConfigurableBeanFactory;
 import org.springframework.context.ApplicationContext;
@@ -58,6 +71,8 @@
  */
 public class BeanFactoryUtil {
 
+    protected BeanFactory beanFactory;
+
     /**
      * Create a new (sub) bean factory.
      *
@@ -238,5 +253,104 @@
             info.setDefaultType(category, component.getDefaultValue());
         }
     }
-                                          
+
+    /**
+     * Build a bean factory with the contents of the &lt;map:components&gt; element of
+     * the tree.
+     */
+    protected ConfigurableBeanFactory createBeanFactory(Logger        sitemapLogger,
+                                                        Configuration config,
+                                                        Context       sitemapContext)
+    throws Exception {
+        ServiceManager newManager;
+        
+        // before we pass the configuration we have to strip the
+        // additional configuration parts, like classpath etc. as these
+        // are not configurations for the service manager
+        final DefaultConfiguration c = new DefaultConfiguration(config.getName(), 
+                                                                config.getLocation(),
+                                                                config.getNamespace(),
+                                                                "");
+        c.addAll(config);
+        c.removeChild(config.getChild("classpath"));
+        c.removeChild(config.getChild("listeners"));
+
+        // setup spring container
+        // first, get the correct parent
+        BeanFactory parentContext = this.beanFactory;
+        final Request request = ContextHelper.getRequest(sitemapContext);
+        if ( request.getAttribute(CocoonBeanFactory.BEAN_FACTORY_REQUEST_ATTRIBUTE) != null ) {
+            parentContext = (ConfigurableBeanFactory)request.getAttribute(CocoonBeanFactory.BEAN_FACTORY_REQUEST_ATTRIBUTE);
+        }
+
+        final AvalonEnvironment ae = new AvalonEnvironment();
+        ae.context = sitemapContext;
+        if ( sitemapLogger != null ) {
+            ae.logger = sitemapLogger;
+        } else {
+            ae.logger = (Logger)parentContext.getBean(ProcessingUtil.LOGGER_ROLE);
+        }
+        ae.servletContext = ((ServletConfig)sitemapContext.get(CocoonServlet.CONTEXT_SERVLET_CONFIG)).getServletContext();
+        ae.settings = (Settings)parentContext.getBean(Settings.ROLE);
+        final ConfigurationInfo parentConfigInfo = (ConfigurationInfo)parentContext.getBean(ConfigurationInfo.class.getName());
+        final ConfigurationInfo ci = ConfigReader.readConfiguration(c, parentConfigInfo, ae);
+
+        final ConfigurableBeanFactory sitemapFactory = 
+            BeanFactoryUtil.createBeanFactory(ae, ci, parentContext, false);
+        newManager = (ServiceManager) sitemapFactory.getBean(ServiceManager.class.getName());
+        sitemapLogger = (Logger)sitemapFactory.getBean(Logger.class.getName());
+
+        // TODO: Add listeners configured by a class as beans to the factory
+        //       Then the factory will handle init/dispose of those components as well
+        //       and the sitemap language can lookup all handles by getting all
+        //       beans of that type.
+        // and finally the listeners
+        
+        final Configuration listenersWrapper = config.getChild("listeners", false);
+        if ( listenersWrapper != null ) {
+            final Configuration[] listeners = listenersWrapper.getChildren("listener");                
+            for(int i = 0; i < listeners.length; i++) {
+                final Configuration current = listeners[i];
+                final TreeBuilder.EventComponent listener = this.createListener(newManager, sitemapLogger, sitemapContext, current);
+                if ( !(listener.component instanceof SitemapListener) ) {
+                    throw new ConfigurationException("Listener must implement the SitemapListener interface.");
+                }
+                this.addListener(listener);
+            }
+        }
+
+        return sitemapFactory;
+    }
+
+    /**
+     * Create a listener
+     */
+    protected TreeBuilder.EventComponent createListener(ServiceManager manager,
+                                                        Logger sitemapLogger,
+                                                        Context context,
+                                                        Configuration config) 
+    throws Exception {
+        // role or class?
+        final String role = config.getAttribute("role", null);
+        if ( role != null ) {
+            return new TreeBuilder.EventComponent(manager.lookup(role), true);
+        }
+        final String className = config.getAttribute("class");
+        final Object component = ClassUtils.newInstance(className);
+
+        LifecycleHelper.setupComponent(component, sitemapLogger, context, manager, config);
+
+        return new TreeBuilder.EventComponent(component, false);
+    }
+
+    /**
+     * Add a listener
+     */
+    protected void addListener(TreeBuilder.EventComponent listener) {
+        if ( listener.component instanceof EnterSitemapEventListener ) {
+            //this.enterSitemapEventListeners.add(listener);
+        } else if ( listener.component instanceof LeaveSitemapEventListener ) {
+            //this.leaveSitemapEventListeners.add(listener);
+        }
+    }
 }