[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