[exo-jcr-commits] exo-jcr SVN: r445 - in kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container: definition and 1 other directory.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Oct 29 17:54:44 EDT 2009


Author: nfilotto
Date: 2009-10-29 17:54:44 -0400 (Thu, 29 Oct 2009)
New Revision: 445

Modified:
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/PortalContainer.java
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/RootContainer.java
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/definition/PortalContainerConfig.java
Log:
EXOJCR-166: Support separated ear delivery
* The PortalContainerContext must not be used as context of a init task
* PortalContainer.getInstance(ServletContext) could return a bad value if the PortalContainer set in the ThreadLocal was not cleaned properly
* We ensure that the PortalContainer set in the ThreadLocal has been set properly 

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/PortalContainer.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/PortalContainer.java	2009-10-29 16:49:03 UTC (rev 444)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/PortalContainer.java	2009-10-29 21:54:44 UTC (rev 445)
@@ -319,7 +319,7 @@
     */
    public static PortalContainer getInstance()
    {
-      PortalContainer container = (PortalContainer)currentContainer_.get();
+      PortalContainer container = getInstanceIfPresent();
       if (container == null)
       {
          container = RootContainer.getInstance().getPortalContainer(DEFAULT_PORTAL_CONTAINER_NAME);
@@ -334,7 +334,27 @@
     */
    public static PortalContainer getInstanceIfPresent()
    {
-      return currentContainer_.get();
+      PortalContainer pc = currentContainer_.get();
+      if (pc != null) 
+      {
+         ExoContainer container = ExoContainerContext.getCurrentContainerIfPresent();
+         if (container != pc)
+         {
+            // Clean the value of currentContainer_ since it should be equals to 
+            // ExoContainerContext.getCurrentContainerIfPresent()
+            if (container instanceof PortalContainer)
+            {
+               // The current container is a PortalContainer, this value will replace the old one
+               currentContainer_.set(pc = (PortalContainer)container);
+            }
+            else
+            {
+               // The current container is not a PortalContainer, the old value must be removed
+               currentContainer_.set(pc = null);
+            }
+         }
+      }
+      return pc;
    }
 
    /**
@@ -402,9 +422,9 @@
       {
          return null;
       }
-      List<String> portalContainerNames = CONFIG.getPortalContainerNames(context.getServletContextName());
+      String portalContainerName = CONFIG.getPortalContainerName(context.getServletContextName());
       RootContainer root = RootContainer.getInstance();
-      return root.getPortalContainer(portalContainerNames.get(0));
+      return root.getPortalContainer(portalContainerName);
    }
 
    /**
@@ -425,14 +445,7 @@
       }
       else
       {
-         PortalContainer pContainer = PortalContainer.getInstanceIfPresent();
-         if (pContainer == null)
-         {
-            if (log.isDebugEnabled())
-               log.debug("No portal container has been set in the ThreadLoal of PortalContainer");
-            pContainer = PortalContainer.getInstance(context);
-         }
-         return pContainer;
+         return PortalContainer.getInstance(context);
       }
    }
 
@@ -560,7 +573,7 @@
 
    public static Object getComponent(Class key)
    {
-      PortalContainer pcontainer = (PortalContainer)currentContainer_.get();
+      PortalContainer pcontainer = getInstanceIfPresent();
       return pcontainer.getComponentInstanceOfType(key);
    }
 

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/RootContainer.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/RootContainer.java	2009-10-29 16:49:03 UTC (rev 444)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/RootContainer.java	2009-10-29 21:54:44 UTC (rev 445)
@@ -566,18 +566,10 @@
       {
          while ((context = queue.poll()) != null)
          {
-            if (context.getServletContextName().equals(portalContainer.getName()))
-            {
-               context.getTask().execute(portalContainer.getPortalContext(), portalContainer);
-            }
-            else
-            {
-               // The current servlet context is not the context of the portal
-               // Set the context classloader of the related web application
-               Thread.currentThread().setContextClassLoader(context.getWebappClassLoader());
-               hasChanged = true;
-               context.getTask().execute(context.getServletContext(), portalContainer);
-            }
+            // Set the context classloader of the related web application
+            Thread.currentThread().setContextClassLoader(context.getWebappClassLoader());
+            hasChanged = true;
+            context.getTask().execute(context.getServletContext(), portalContainer);
          }
       }
       finally

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/definition/PortalContainerConfig.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/definition/PortalContainerConfig.java	2009-10-29 16:49:03 UTC (rev 444)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/definition/PortalContainerConfig.java	2009-10-29 21:54:44 UTC (rev 445)
@@ -219,6 +219,31 @@
    }
 
    /**
+    * Gives the portal container names for which the web application is available if several
+    * portal container are available only the fist one will be returned
+    * @param contextName the context name of the web application
+    * @return the portal container names for which the web application is available
+    */
+   public String getPortalContainerName(String contextName)
+   {
+      if (contextName == null)
+      {
+         throw new IllegalArgumentException("The context name cannot be null");
+      }
+      if (portalContainerNames.contains(contextName))
+      {
+         // The given context name is a context name of a portal container
+         return contextName;
+      }
+      final List<String> result = scopes.get(contextName);
+      if (result == null || result.isEmpty())
+      {
+         // we assume the old behavior is expected         
+         return defaultPortalContainerName;
+      }
+      return result.get(0);
+   }
+   /**
     * Gives all the dependencies related to the given portal container
     * @param portalContainerName the name of the portal container for which we want the dependencies
     * @return a list of sorted context names



More information about the exo-jcr-commits mailing list