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 2005/03/24 14:41:23 UTC

svn commit: r158914 - cocoon/blocks/spring-app/trunk/java/org/apache/cocoon/spring/SpringComponentLocator.java

Author: cziegeler
Date: Thu Mar 24 05:41:23 2005
New Revision: 158914

URL: http://svn.apache.org/viewcvs?view=rev&rev=158914
Log:
Correctly chain contexts

Modified:
    cocoon/blocks/spring-app/trunk/java/org/apache/cocoon/spring/SpringComponentLocator.java

Modified: cocoon/blocks/spring-app/trunk/java/org/apache/cocoon/spring/SpringComponentLocator.java
URL: http://svn.apache.org/viewcvs/cocoon/blocks/spring-app/trunk/java/org/apache/cocoon/spring/SpringComponentLocator.java?view=diff&r1=158913&r2=158914
==============================================================================
--- cocoon/blocks/spring-app/trunk/java/org/apache/cocoon/spring/SpringComponentLocator.java (original)
+++ cocoon/blocks/spring-app/trunk/java/org/apache/cocoon/spring/SpringComponentLocator.java Thu Mar 24 05:41:23 2005
@@ -15,6 +15,8 @@
  */
 package org.apache.cocoon.spring;
 
+import java.util.Map;
+
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletContext;
 
@@ -31,6 +33,7 @@
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.avalon.framework.service.Serviceable;
 import org.apache.cocoon.Constants;
+import org.apache.cocoon.components.ContextHelper;
 import org.apache.cocoon.core.Core;
 import org.apache.cocoon.environment.ObjectModelHelper;
 import org.apache.cocoon.environment.Request;
@@ -44,20 +47,16 @@
 import org.apache.excalibur.source.SourceResolver;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.access.BeanFactoryLocator;
-import org.springframework.beans.factory.access.BeanFactoryReference;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextException;
-import org.springframework.context.ConfigurableApplicationContext;
-import org.springframework.context.access.ContextSingletonBeanFactoryLocator;
 import org.springframework.context.support.GenericApplicationContext;
 import org.springframework.util.StringUtils;
 import org.springframework.web.context.ConfigurableWebApplicationContext;
+import org.springframework.web.context.WebApplicationContext;
 
 /**
  * This is the connection between Cocoon and Spring.
  * We create an own web application context.
- * Part of this code is based on Springs ContextLoader class.
  *
  * TODO - we need to store the application context somewhere to use the context
  * of a parent sitemap as the parent of a sub sitemap.
@@ -131,7 +130,7 @@
 
         try {
             // Determine parent for application context, if any.
-            ApplicationContext parent = this.loadParentContext();
+            ApplicationContext parent = this.getParentContext();
 
             // Make the core available as a bean, if not already done by a parent context
             if ( parent == null || !parent.containsBean("cocoon-core") ) {
@@ -163,14 +162,7 @@
         if (this.getLogger().isInfoEnabled()) {
             this.getLogger().info("Closing Spring web application context");
         }
-        try {
-            ((ConfigurableApplicationContext) this.wac).close();
-        } finally {
-            if (this.beanFactoryRef != null) {
-                this.beanFactoryRef.release();
-                this.beanFactoryRef = null;
-            }
-        }
+        this.wac.close();
         if ( this.manager != null ) {
             this.manager.release(this.resolver);
             this.resolver = null;
@@ -202,13 +194,6 @@
     }
 
     /**
-     * Holds BeanFactoryReference when loading parent factory via
-     * ContextSingletonBeanFactoryLocator.
-     */
-    protected BeanFactoryReference beanFactoryRef;
-
-
-    /**
      * Instantiate the web application context for this loader, either a
      * default CocoonApplicationContext or a custom context class if specified.
      * <p>This implementation expects custom contexts to be a subclass of
@@ -261,39 +246,19 @@
     }
 
     /**
-     * Template method with default implementation (which may be overridden by a
-     * subclass), to load or obtain an ApplicationContext instance which will be
-     * used as the parent context of the root WebApplicationContext. If the
-     * return value from the method is null, no parent context is set.
-     * <p>The main reason to load a parent context here is to allow multiple root
-     * web application contexts to all be children of a shared EAR context, or
-     * alternately to also share the same parent context that is visible to
-     * EJBs. For pure web applications, there is usually no need to worry about
-     * having a parent context to the root web application context.
-     * <p>The default implementation uses ContextSingletonBeanFactoryLocator,
-     * configured via {@link #LOCATOR_FACTORY_SELECTOR_PARAM} and
-     * {@link #BEAN_FACTORY_LOCATOR_FACTORY_KEY_PARAM}, to load a parent context
-     * which will be shared by all other users of ContextsingletonBeanFactoryLocator
-     * which also use the same configuration parameters.
-     * @return the parent application context, or null if none
-     * @throws BeansException if the context couldn't be initialized
-     * @see org.springframework.beans.factory.access.BeanFactoryLocator
-     * @see org.springframework.context.access.ContextSingletonBeanFactoryLocator
-     */
-    protected ApplicationContext loadParentContext()
-    throws BeansException {
-
-        ApplicationContext parentContext = null;
-        if (this.locatorFactorySelector != null) {
-            BeanFactoryLocator locator = ContextSingletonBeanFactoryLocator.getInstance(this.locatorFactorySelector);
-
-            if (this.getLogger().isInfoEnabled()) {
-                this.getLogger().info("Getting parent context definition: using parent context key of '"
-                        + parentContextKey + "' with BeanFactoryLocator");
-            }
-
-            this.beanFactoryRef = locator.useBeanFactory(this.parentContextKey);
-            parentContext = (ApplicationContext) this.beanFactoryRef.getFactory();
+     * Get the parent application context: this is either the context of a parent
+     * sitemap or an optional web application context set by the spring servlet (filter).
+     * @return A parent application context or null
+     */
+    protected ApplicationContext getParentContext() {
+        final Map objectModel = ContextHelper.getObjectModel(this.context);
+        final Request request = ObjectModelHelper.getRequest(objectModel);
+        ApplicationContext parentContext = (ApplicationContext)request.getAttribute("application-context");
+        
+        if ( parentContext == null ) {
+            // there is no parent sitemap with an application context
+            // let's search for a global one
+            parentContext = (ApplicationContext)this.servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
         }
 
         return parentContext;