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