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