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 <map:components> element of
- * the tree.
+ * Build a component manager with the contents of the <map:components> 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 <map:components> 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);
+ }
+ }
}