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/05/20 21:04:42 UTC
svn commit: r408074 - in /cocoon/trunk/core:
cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/
cocoon-core/src/main/java/org/apache/cocoon/core/
cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/
cocoon-webap...
Author: cziegeler
Date: Sat May 20 12:04:42 2006
New Revision: 408074
URL: http://svn.apache.org/viewvc?rev=408074&view=rev
Log:
More code for per sitemap classloading
Modified:
cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/CoreUtil.java
cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryFactory.java
cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryFactoryImpl.java
cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryUtil.java
cocoon/trunk/core/cocoon-webapp/src/main/webapp/WEB-INF/web.xml
Modified: cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java?rev=408074&r1=408073&r2=408074&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java (original)
+++ cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java Sat May 20 12:04:42 2006
@@ -366,6 +366,7 @@
this.itsNamespace = tree.getNamespace();
Configuration componentConfig = tree.getChild("components", false);
+ Configuration classPathConfig = null;
if (componentConfig == null) {
if (getLogger().isDebugEnabled()) {
@@ -380,9 +381,6 @@
final BeanFactoryFactoryImpl factory = new BeanFactoryFactoryImpl();
factory.setBeanFactory(this.beanFactory);
- // TODO Create class loader (and filter classpath configuration from componentConfig!)
- // this.itsClassLoader = factory.createClassLoader(itsContext, componentConfig.getChild("classpath", false));
-
// check for sitemap local properties
Settings settings = (Settings)factory.getCurrentBeanFactory(itsContext).getBean(ProcessingUtil.SETTINGS_ROLE);
if ( componentConfig != null && componentConfig.getAttribute("property-dir", null) != null ) {
@@ -394,9 +392,28 @@
tree = this.replaceProperties(tree, settings);
}
+ if ( componentConfig != null ) {
+ // before we pass the configuration we have to strip the
+ // additional configuration parts, like classpath as these
+ // are not configurations for the component container
+ final DefaultConfiguration c = new DefaultConfiguration(componentConfig.getName(),
+ componentConfig.getLocation(),
+ componentConfig.getNamespace(),
+ "");
+ c.addAll(componentConfig);
+ classPathConfig = c.getChild("classpath", false);
+ if ( classPathConfig != null ) {
+ c.removeChild(classPathConfig);
+ }
+ componentConfig = c;
+ }
+
+ // Create class loader
+ this.itsClassLoader = factory.createClassLoader(itsContext, classPathConfig);
+
// FIXME: Internal configurations doesn't work in a non bean factory
// environment
- this.itsBeanFactory = factory.createBeanFactory(this.getLogger(), componentConfig, itsContext, this.processor.getSourceResolver(), settings);
+ this.itsBeanFactory = factory.createBeanFactory(this.itsClassLoader, this.getLogger(), componentConfig, itsContext, this.processor.getSourceResolver(), settings);
this.itsManager = (ServiceManager) this.itsBeanFactory.getBean(ProcessingUtil.SERVICE_MANAGER_ROLE);
if (componentConfig != null) {
// only register listeners if a new bean factory is created
Modified: cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/CoreUtil.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/CoreUtil.java?rev=408074&r1=408073&r2=408074&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/CoreUtil.java (original)
+++ cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/CoreUtil.java Sat May 20 12:04:42 2006
@@ -22,12 +22,9 @@
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
-import java.util.List;
import java.util.Map;
import java.util.Properties;
@@ -36,7 +33,6 @@
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
-import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.DefaultContext;
import org.apache.avalon.framework.logger.Logger;
Modified: cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryFactory.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryFactory.java?rev=408074&r1=408073&r2=408074&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryFactory.java (original)
+++ cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryFactory.java Sat May 20 12:04:42 2006
@@ -34,11 +34,12 @@
* Build a bean factory with the contents of the <map:components> element of
* the tree.
*/
- ConfigurableListableBeanFactory createBeanFactory(Logger sitemapLogger,
- Configuration config,
- Context sitemapContext,
- SourceResolver resolver,
- Settings settings)
+ ConfigurableListableBeanFactory createBeanFactory(ClassLoader classLoader,
+ Logger sitemapLogger,
+ Configuration config,
+ Context sitemapContext,
+ SourceResolver resolver,
+ Settings settings)
throws Exception;
/**
Modified: cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryFactoryImpl.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryFactoryImpl.java?rev=408074&r1=408073&r2=408074&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryFactoryImpl.java (original)
+++ cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryFactoryImpl.java Sat May 20 12:04:42 2006
@@ -53,7 +53,7 @@
Configuration config)
throws Exception {
// we don't create a new class loader if there is no new configuration
- if ( config == null ) {
+ if ( true ) { //config == null ) {
return Thread.currentThread().getContextClassLoader();
}
// get parent bean factory
@@ -64,6 +64,7 @@
// Create a new classloader
ClassLoaderConfiguration configBean = ClassLoaderUtils.createConfiguration(config);
ClassLoaderFactory clFactory = (ClassLoaderFactory)parentFactory.getBean(factoryRole);
+ // TODO - we need the servlet context and the path to the sitemap starting from the root context!
return clFactory.createClassLoader(Thread.currentThread().getContextClassLoader(),
configBean,
null,
@@ -73,12 +74,14 @@
/**
* @see org.apache.cocoon.core.container.spring.BeanFactoryFactory#createBeanFactory(org.apache.avalon.framework.logger.Logger, org.apache.avalon.framework.configuration.Configuration, org.apache.avalon.framework.context.Context, org.apache.excalibur.source.SourceResolver, org.apache.cocoon.core.Settings)
*/
- public ConfigurableListableBeanFactory createBeanFactory(Logger sitemapLogger,
+ public ConfigurableListableBeanFactory createBeanFactory(ClassLoader classLoader,
+ Logger sitemapLogger,
Configuration config,
Context sitemapContext,
SourceResolver resolver,
Settings settings)
throws Exception {
+ Thread.currentThread().setContextClassLoader(classLoader);
// setup spring container
// first, get the correct parent
final ConfigurableListableBeanFactory parentFactory = this.getCurrentBeanFactory(sitemapContext);
@@ -95,7 +98,7 @@
final ConfigurationInfo parentConfigInfo = (ConfigurationInfo) parentFactory
.getBean(ConfigurationInfo.class.getName());
final ConfigurationInfo ci = ConfigReader.readConfiguration(config, parentConfigInfo, ae, resolver);
- return BeanFactoryUtil.createBeanFactory(ae, ci, resolver, parentFactory, false);
+ return BeanFactoryUtil.createBeanFactory(classLoader, ae, ci, resolver, parentFactory, false);
}
return parentFactory;
}
Modified: cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryUtil.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryUtil.java?rev=408074&r1=408073&r2=408074&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryUtil.java (original)
+++ cocoon/trunk/core/cocoon-core/src/main/java/org/apache/cocoon/core/container/spring/BeanFactoryUtil.java Sat May 20 12:04:42 2006
@@ -79,7 +79,26 @@
return createBeanFactory(env, info, resolver, parent, addCocoon, true);
}
- /**
+ /**
+ * Create a new (sub) bean factory.
+ *
+ * @param env The avalon environment.
+ * @param info The avalon configuration.
+ * @param parent The parent factory or null.
+ * @return A new bean factory.
+ * @throws Exception
+ */
+ public static ConfigurableListableBeanFactory createBeanFactory(ClassLoader classLoader,
+ AvalonEnvironment env,
+ ConfigurationInfo info,
+ SourceResolver resolver,
+ BeanFactory parent,
+ boolean addCocoon)
+ throws Exception {
+ return createBeanFactory(classLoader, env, info, resolver, parent, addCocoon, true);
+ }
+
+ /**
* Create a new (sub) bean factory.
*
* @param env The avalon environment.
@@ -95,30 +114,62 @@
boolean addCocoon,
boolean preInstantiateSingletons)
throws Exception {
- final String xmlConfig = (new XmlConfigCreator(env.logger)).createConfig(info, addCocoon);
- Resource rsc = new ByteArrayResource(xmlConfig.getBytes("utf-8"));
- Logger logger = env.logger;
- if ( info.rootLogger != null ) {
- logger = env.logger.getChildLogger(info.rootLogger);
- }
- CocoonBeanFactory factory = new CocoonBeanFactory(rsc,
- parent,
- logger,
- info,
- env.context,
- env.settings);
- if ( info.rootLogger != null ) {
- factory.registerSingleton(Logger.class.getName(), logger);
- }
- // add local resolver
- if ( resolver != null ) {
- factory.registerSingleton(SourceResolver.ROLE + "/Local", resolver);
- }
- prepareBeanFactory(factory, info);
- if (preInstantiateSingletons) {
- factory.preInstantiateSingletons();
+ return createBeanFactory(Thread.currentThread().getContextClassLoader(), env, info, resolver, parent, addCocoon, preInstantiateSingletons);
+ }
+
+ /**
+ * Create a new (sub) bean factory.
+ *
+ * @param env The avalon environment.
+ * @param info The avalon configuration.
+ * @param parent The parent factory or null.
+ * @return A new bean factory.
+ * @throws Exception
+ */
+ public static ConfigurableListableBeanFactory createBeanFactory(ClassLoader classLoader,
+ AvalonEnvironment env,
+ ConfigurationInfo info,
+ SourceResolver resolver,
+ BeanFactory parent,
+ boolean addCocoon,
+ boolean preInstantiateSingletons)
+ throws Exception {
+ final ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ if ( classLoader != null ) {
+ Thread.currentThread().setContextClassLoader(classLoader);
+ }
+ final String xmlConfig = (new XmlConfigCreator(env.logger)).createConfig(info, addCocoon);
+ Resource rsc = new ByteArrayResource(xmlConfig.getBytes("utf-8"));
+ Logger logger = env.logger;
+ if ( info.rootLogger != null ) {
+ logger = env.logger.getChildLogger(info.rootLogger);
+ }
+ CocoonBeanFactory factory;
+// if ( classLoader == null ) {
+ factory = new CocoonBeanFactory(rsc,
+ parent,
+ logger,
+ info,
+ env.context,
+ env.settings);
+// } else {
+// }
+ if ( info.rootLogger != null ) {
+ factory.registerSingleton(Logger.class.getName(), logger);
+ }
+ // add local resolver
+ if ( resolver != null ) {
+ factory.registerSingleton(SourceResolver.ROLE + "/Local", resolver);
+ }
+ prepareBeanFactory(factory, info);
+ if (preInstantiateSingletons) {
+ factory.preInstantiateSingletons();
+ }
+ return factory;
+ } finally {
+ Thread.currentThread().setContextClassLoader(oldClassLoader);
}
- return factory;
}
/**
Modified: cocoon/trunk/core/cocoon-webapp/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-webapp/src/main/webapp/WEB-INF/web.xml?rev=408074&r1=408073&r2=408074&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-webapp/src/main/webapp/WEB-INF/web.xml (original)
+++ cocoon/trunk/core/cocoon-webapp/src/main/webapp/WEB-INF/web.xml Sat May 20 12:04:42 2006
@@ -47,14 +47,6 @@
<description>Cocoon demo web application</description>
<servlet-class>org.apache.cocoon.servlet.CocoonServlet</servlet-class>
- <!-- If you don't want to use the ParanoidClassLoader, that reverses
- the classloading hierarchy and loads the jars and classes of the
- web application _first_, and want to rely on the normal web application
- classloading, remove the "classloader-class" parameter. -->
- <init-param>
- <param-name>classloader-class</param-name>
- <param-value>org.apache.cocoon.servlet.ParanoidClassLoader</param-value>
- </init-param>
<!--
Set encoding used by the container. If not set the ISO-8859-1 encoding