[exo-jcr-commits] exo-jcr SVN: r5814 - in kernel/trunk/exo.kernel.container/src: test/java/org/exoplatform/container/jmx and 1 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Tue Mar 6 07:44:12 EST 2012


Author: nfilotto
Date: 2012-03-06 07:44:11 -0500 (Tue, 06 Mar 2012)
New Revision: 5814

Added:
   kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/support/ExoContainerFinder.java
Modified:
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManagementContextImpl.java
   kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestRegistration.java
   kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/support/ManagedWithObjectNameTemplate.java
Log:
EXOJCR-1791: JMX calls are not adding current ExoContainer into ExoContainerContext 

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManagementContextImpl.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManagementContextImpl.java	2012-03-06 12:40:45 UTC (rev 5813)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManagementContextImpl.java	2012-03-06 12:44:11 UTC (rev 5814)
@@ -18,7 +18,10 @@
  */
 package org.exoplatform.container.management;
 
+import org.exoplatform.commons.utils.SecurityHelper;
 import org.exoplatform.container.ExoContainer;
+import org.exoplatform.container.ExoContainerContext;
+import org.exoplatform.container.RootContainer;
 import org.exoplatform.container.component.RequestLifeCycle;
 import org.exoplatform.management.ManagementAware;
 import org.exoplatform.management.ManagementContext;
@@ -31,6 +34,7 @@
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
+import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -50,6 +54,11 @@
     */
    private static final Log LOG = ExoLogger.getLogger("exo.kernel.container.ManagementContextImpl");
 
+   /**
+    * The previous container
+    */
+   private static final ThreadLocal<ExoContainer> previousContainer = new ThreadLocal<ExoContainer>();
+
    /** . */
    private final Map<Class<?>, Object> scopingDataList;
 
@@ -306,16 +315,48 @@
 
    public void beforeInvoke(Object managedResource)
    {
-      ExoContainer container = findContainer();
+      final ExoContainer container = findContainer();
       if (container != null)
       {
+         SecurityHelper.doPrivilegedAction(new PrivilegedAction<Void>()
+         {
+            public Void run()
+            {
+               ExoContainer oldContainer = ExoContainerContext.getCurrentContainerIfPresent();
+               if (!(oldContainer instanceof RootContainer))
+               {
+                  previousContainer.set(oldContainer);
+               }
+               ExoContainerContext.setCurrentContainer(container);
+               return null;
+            }
+         });
          RequestLifeCycle.begin(container);
       }
    }
 
    public void afterInvoke(Object managedResource)
    {
-      RequestLifeCycle.end();
+      try
+      {
+         RequestLifeCycle.end();
+      }
+      finally
+      {
+         SecurityHelper.doPrivilegedAction(new PrivilegedAction<Void>()
+         {
+            public Void run()
+            {
+               ExoContainer oldContainer = previousContainer.get();
+               if (oldContainer != null)
+               {
+                  previousContainer.set(null);
+               }
+               ExoContainerContext.setCurrentContainer(oldContainer);
+               return null;
+            }
+         });
+      }
    }
 
    @Override

Modified: kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestRegistration.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestRegistration.java	2012-03-06 12:40:45 UTC (rev 5813)
+++ kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestRegistration.java	2012-03-06 12:44:11 UTC (rev 5814)
@@ -18,12 +18,17 @@
  */
 package org.exoplatform.container.jmx;
 
+import org.exoplatform.container.ExoContainer;
+import org.exoplatform.container.ExoContainerContext;
 import org.exoplatform.container.RootContainer;
+import org.exoplatform.container.jmx.support.ExoContainerFinder;
 import org.exoplatform.container.jmx.support.ManagedWithObjectNameTemplate;
 
 import java.util.Set;
 
 import javax.management.MBeanServer;
+import javax.management.MBeanServerInvocationHandler;
+import javax.management.ObjectInstance;
 import javax.management.ObjectName;
 
 /**
@@ -43,9 +48,33 @@
 
       MBeanServer server = root.getMBeanServer();
 
-      Set set = server.queryMBeans(ObjectName.getInstance("exo:object=\"Foo\""), null);
+      Set<ObjectInstance> set = server.queryMBeans(ObjectName.getInstance("exo:object=\"Foo\""), null);
       assertEquals(1, set.size());
 
+      ObjectInstance oi = set.iterator().next();
+      ExoContainer oldContainer = ExoContainerContext.getCurrentContainerIfPresent();
+      
+      ExoContainer currentContainer = new ExoContainer();
+      ExoContainerContext.setCurrentContainer(currentContainer);
+      try
+      {
+         ExoContainerFinder proxyObject =
+            MBeanServerInvocationHandler.newProxyInstance(server, oi.getObjectName(),
+               ExoContainerFinder.class, false);
+         assertTrue("We expect to get the current exo container", oldContainer == proxyObject.getCurrentExoContainer());
+         assertTrue("We expect to get the previous exo container", ExoContainerContext.getCurrentContainerIfPresent() == currentContainer);
+         ExoContainerContext.setCurrentContainer(oldContainer);
+         assertTrue("We expect to get the current exo container", oldContainer == proxyObject.getCurrentExoContainer());
+         assertTrue("We expect to get the previous exo container", ExoContainerContext.getCurrentContainerIfPresent() == oldContainer);
+         ExoContainerContext.setCurrentContainer(null);
+         assertTrue("We expect to get the current exo container", oldContainer == proxyObject.getCurrentExoContainer());
+         assertTrue("We expect to get the previous exo container", ExoContainerContext.getCurrentContainerIfPresent() == oldContainer);
+      }
+      finally
+      {
+         ExoContainerContext.setCurrentContainer(oldContainer);
+      }
+      
       // Manual
 
       root.registerComponentInstance("Bar", new ManagedWithObjectNameTemplate("Bar"));

Added: kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/support/ExoContainerFinder.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/support/ExoContainerFinder.java	                        (rev 0)
+++ kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/support/ExoContainerFinder.java	2012-03-06 12:44:11 UTC (rev 5814)
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2012 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.container.jmx.support;
+
+import org.exoplatform.container.ExoContainer;
+
+/**
+ * @author <a href="mailto:nfilotto at exoplatform.com">Nicolas Filotto</a>
+ * @version $Id$
+ *
+ */
+public interface ExoContainerFinder
+{
+   ExoContainer getCurrentExoContainer();
+}

Modified: kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/support/ManagedWithObjectNameTemplate.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/support/ManagedWithObjectNameTemplate.java	2012-03-06 12:40:45 UTC (rev 5813)
+++ kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/support/ManagedWithObjectNameTemplate.java	2012-03-06 12:44:11 UTC (rev 5814)
@@ -18,6 +18,8 @@
  */
 package org.exoplatform.container.jmx.support;
 
+import org.exoplatform.container.ExoContainer;
+import org.exoplatform.container.ExoContainerContext;
 import org.exoplatform.container.xml.InitParams;
 import org.exoplatform.management.annotations.Managed;
 import org.exoplatform.management.jmx.annotations.NameTemplate;
@@ -29,7 +31,7 @@
  */
 @Managed
 @NameTemplate(@Property(key = "object", value = "{Name}"))
-public class ManagedWithObjectNameTemplate
+public class ManagedWithObjectNameTemplate implements ExoContainerFinder
 {
 
    private String name;
@@ -45,6 +47,12 @@
    }
 
    @Managed
+   public ExoContainer getCurrentExoContainer()
+   {
+      return ExoContainerContext.getCurrentContainerIfPresent();
+   }
+
+   @Managed
    public String getName()
    {
       return name;



More information about the exo-jcr-commits mailing list