Author: julien_viet
Date: 2009-12-29 04:58:06 -0500 (Tue, 29 Dec 2009)
New Revision: 1227
Added:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/KernelManagementContext.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapter.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapterFactory.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManagementContextImpl.java
Removed:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapter.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapterFactory.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java
Modified:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ExoContainer.java
kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestPortalContainerManagedIntegration.java
Log:
EXOJCR-350 : Enable plugability of management layer : move the management code in the
management package
M
trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestPortalContainerManagedIntegration.java
D
trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java
D
trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapter.java
D
trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java
D
trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java
D
trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapterFactory.java
A
trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java
A
trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapter.java
A
trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/KernelManagementContext.java
A
trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManagementContextImpl.java
A
trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapterFactory.java
M trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ExoContainer.java
Modified:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ExoContainer.java
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ExoContainer.java 2009-12-29
09:52:07 UTC (rev 1226)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ExoContainer.java 2009-12-29
09:58:06 UTC (rev 1227)
@@ -21,7 +21,7 @@
import org.exoplatform.commons.utils.PropertyManager;
import org.exoplatform.container.component.ComponentLifecyclePlugin;
import org.exoplatform.container.configuration.ConfigurationManager;
-import org.exoplatform.container.jmx.ManageableContainer;
+import org.exoplatform.container.management.ManageableContainer;
import org.exoplatform.container.util.ContainerUtil;
import org.exoplatform.container.xml.InitParams;
import org.exoplatform.services.log.ExoLogger;
Deleted:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java 2009-12-29
09:52:07 UTC (rev 1226)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java 2009-12-29
09:58:06 UTC (rev 1227)
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2009 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;
-
-import org.exoplatform.management.spi.ManagementProvider;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * @author <a href="mailto:julien.viet@exoplatform.com">Julien
Viet</a>
- * @version $Revision$
- */
-public class KernelManagementContext
-{
-
- /** . */
- final ManagementContextImpl root;
-
- /** . */
- private final Set<ManagementProvider> providers;
-
- /** . */
- private final ManageableContainer container;
-
- public KernelManagementContext(ManageableContainer container)
- {
- this.providers = new HashSet<ManagementProvider>();
- this.container = container;
-
- // Done last as we pass 'this' as argument
- this.root = new ManagementContextImpl(this, container);
- }
-
- public synchronized Collection<ManagementProvider> getProviders() {
- return providers;
- }
-
- public synchronized boolean addProvider(ManagementProvider provider)
- {
- // Prevent double registration just in case...
- if (providers.contains(provider)) {
- return false;
- }
-
- //
- providers.add(provider);
-
- // Perform registration of already registered managed components
- root.install(provider);
-
- //
- return false;
- }
-}
Deleted:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapter.java
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapter.java 2009-12-29
09:52:07 UTC (rev 1226)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapter.java 2009-12-29
09:58:06 UTC (rev 1227)
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2009 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;
-
-import org.exoplatform.management.spi.ManagementProvider;
-import org.exoplatform.services.log.ExoLogger;
-import org.exoplatform.services.log.Log;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.PicoContainer;
-import org.picocontainer.PicoInitializationException;
-import org.picocontainer.PicoIntrospectionException;
-import org.picocontainer.PicoVisitor;
-
-/**
- * @author <a href="mailto:julien.viet@exoplatform.com">Julien
Viet</a>
- * @version $Revision$
- */
-public class ManageableComponentAdapter implements ComponentAdapter
-{
-
- /** . */
- private Log log = ExoLogger.getLogger(ManageableComponentAdapter.class);
-
- /** . */
- private ComponentAdapter delegate;
-
- /** . */
- private final ManageableContainer container;
-
- /** . */
- private volatile boolean registered = false;
-
- public ManageableComponentAdapter(ManageableContainer container, ComponentAdapter
delegate)
- {
- this.delegate = delegate;
- this.container = container;
- }
-
- public Object getComponentKey()
- {
- return delegate.getComponentKey();
- }
-
- public Class getComponentImplementation()
- {
- return delegate.getComponentImplementation();
- }
-
- public Object getComponentInstance(PicoContainer pico) throws
PicoInitializationException,
- PicoIntrospectionException
- {
- Object instance = delegate.getComponentInstance(pico);
-
- //
- if (!registered)
- {
- registered = true;
-
- //
- if (container.managementContext != null)
- {
- // Registry the instance against the management context
- log.debug("==> add " + instance + " to a mbean
server");
- container.managementContext.register(instance);
-
- // Register if it is a management provider
- if (instance instanceof ManagementProvider)
- {
- ManagementProvider provider = (ManagementProvider)instance;
- container.managementContext.kernelContext.addProvider(provider);
- }
- }
- }
- return instance;
- }
-
- public void verify(PicoContainer container) throws PicoIntrospectionException
- {
- delegate.verify(container);
- }
-
- public void accept(PicoVisitor visitor)
- {
- delegate.accept(visitor);
- }
-}
Deleted:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapterFactory.java
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapterFactory.java 2009-12-29
09:52:07 UTC (rev 1226)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapterFactory.java 2009-12-29
09:58:06 UTC (rev 1227)
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2009 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;
-
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.Parameter;
-import org.picocontainer.PicoIntrospectionException;
-import org.picocontainer.defaults.AssignabilityRegistrationException;
-import org.picocontainer.defaults.ComponentAdapterFactory;
-import org.picocontainer.defaults.NotConcreteRegistrationException;
-
-/**
- * @author <a href="mailto:julien.viet@exoplatform.com">Julien
Viet</a>
- * @version $Revision$
- */
-public class ManageableComponentAdapterFactory implements ComponentAdapterFactory
-{
-
- /** . */
- private ComponentAdapterFactory delegate;
-
- /** . */
- ManageableContainer container;
-
- public ManageableComponentAdapterFactory(ComponentAdapterFactory delegate)
- {
- this.delegate = delegate;
- }
-
- public ComponentAdapter createComponentAdapter(Object componentKey, Class
componentImplementation,
- Parameter[] parameters) throws PicoIntrospectionException,
AssignabilityRegistrationException,
- NotConcreteRegistrationException
- {
- ComponentAdapter adapter = delegate.createComponentAdapter(componentKey,
componentImplementation, parameters);
- return new ManageableComponentAdapter(container, adapter);
- }
-}
Deleted:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java 2009-12-29
09:52:07 UTC (rev 1226)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java 2009-12-29
09:58:06 UTC (rev 1227)
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2009 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;
-
-import org.exoplatform.container.CachingContainer;
-import org.exoplatform.container.monitor.jvm.J2EEServerInfo;
-import org.exoplatform.management.ManagementContext;
-import org.exoplatform.management.annotations.Managed;
-import org.exoplatform.management.annotations.ManagedDescription;
-import org.exoplatform.management.annotations.ManagedName;
-import org.exoplatform.management.spi.ManagementProvider;
-import org.exoplatform.management.spi.jmx.JMXManagementProvider;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.PicoContainer;
-import org.picocontainer.PicoException;
-import org.picocontainer.PicoRegistrationException;
-import org.picocontainer.defaults.ComponentAdapterFactory;
-import org.picocontainer.defaults.DuplicateComponentKeyRegistrationException;
-
-import java.lang.management.ManagementFactory;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.management.MBeanServer;
-
-/**
- * @author <a href="mailto:julien.viet@exoplatform.com">Julien
Viet</a>
- * @version $Revision$
- */
-public class ManageableContainer extends CachingContainer
-{
-
- private static MBeanServer findMBeanServer()
- {
- J2EEServerInfo serverenv_ = new J2EEServerInfo();
- MBeanServer server = serverenv_.getMBeanServer();
- if (server == null)
- {
- server = ManagementFactory.getPlatformMBeanServer();
- }
- return server;
- }
-
- /** . */
- private static final ThreadLocal<ManageableComponentAdapterFactory> hack =
- new ThreadLocal<ManageableComponentAdapterFactory>();
-
- /** . */
- protected ManagementContextImpl managementContext;
-
- /** . */
- protected MBeanServer server;
-
- public ManageableContainer()
- {
- this((PicoContainer)null);
- }
-
- public ManageableContainer(PicoContainer parent)
- {
- this(new MX4JComponentAdapterFactory(), parent);
- }
-
- public ManageableContainer(ComponentAdapterFactory componentAdapterFactory,
PicoContainer parent)
- {
- super(getComponentAdapterFactory(componentAdapterFactory), parent);
-
- // Yeah this is not pretty but a necessary evil to make it work
- ManageableComponentAdapterFactory factory = hack.get();
- factory.container = this;
- hack.set(null);
-
- // Reference the same mbean server that the parent has
- if (parent instanceof ManageableContainer)
- {
- ManageableContainer manageableParent = (ManageableContainer)parent;
-
- //
- ManagementContextImpl parentManagementContext =
manageableParent.managementContext;
- if (parentManagementContext != null)
- {
- managementContext = new ManagementContextImpl(parentManagementContext,
this);
- }
-
- // Get server from parent
- server = manageableParent.server;
- } else {
- KernelManagementContext kernelCtx = new KernelManagementContext(this);
-
- //
- server = findMBeanServer();
- managementContext = kernelCtx.root;
-
- //
- kernelCtx.addProvider(new JMXManagementProvider(server));
- }
- }
-
- public ManageableContainer(ComponentAdapterFactory componentAdapterFactory)
- {
- this(componentAdapterFactory, null);
- }
-
- @Managed
- @ManagedName("RegisteredComponentNames")
- @ManagedDescription("Return the list of the registered component names")
- public Set<String> getRegisteredComponentNames() throws PicoException
- {
- Set<String> names = new HashSet<String>();
- Collection<ComponentAdapter> adapters = getComponentAdapters();
- for (ComponentAdapter adapter : adapters)
- {
- Object key = adapter.getComponentKey();
- String name = String.valueOf(key);
- names.add(name);
- }
- return names;
- }
-
- private static ManageableComponentAdapterFactory getComponentAdapterFactory(
- ComponentAdapterFactory componentAdapterFactory)
- {
- ManageableComponentAdapterFactory factory = new
ManageableComponentAdapterFactory(componentAdapterFactory);
- hack.set(factory);
- return factory;
- }
-
- public ManagementContext getManagementContext()
- {
- return managementContext;
- }
-
- public final MBeanServer getMBeanServer()
- {
- return server;
- }
-
- @Override
- public ComponentAdapter registerComponent(ComponentAdapter componentAdapter)
- throws DuplicateComponentKeyRegistrationException
- {
- return super.registerComponent(componentAdapter);
- }
-
- public ComponentAdapter registerComponentInstance(Object componentKey, Object
componentInstance)
- throws PicoRegistrationException
- {
- ComponentAdapter adapter = super.registerComponentInstance(componentKey,
componentInstance);
- if (managementContext != null)
- {
- managementContext.register(componentInstance);
-
- // Register if it is a management provider
- if (componentInstance instanceof ManagementProvider)
- {
- ManagementProvider provider = (ManagementProvider)componentInstance;
- managementContext.kernelContext.addProvider(provider);
- }
- }
- return adapter;
- }
-}
Deleted:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java 2009-12-29
09:52:07 UTC (rev 1226)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java 2009-12-29
09:58:06 UTC (rev 1227)
@@ -1,328 +0,0 @@
-/*
- * Copyright (C) 2009 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;
-
-import org.exoplatform.container.ExoContainer;
-import org.exoplatform.container.component.RequestLifeCycle;
-import org.exoplatform.management.ManagementAware;
-import org.exoplatform.management.spi.ManagedResource;
-import org.exoplatform.management.spi.ManagedTypeMetaData;
-import org.exoplatform.container.management.MetaDataBuilder;
-import org.exoplatform.management.spi.ManagementProvider;
-import org.exoplatform.management.ManagementContext;
-import org.exoplatform.management.annotations.ManagedBy;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author <a href="mailto:julien.viet@exoplatform.com">Julien
Viet</a>
- * @version $Revision$
- */
-public class ManagementContextImpl implements ManagementContext, ManagedResource
-{
-
- /** . */
- private final Map<Class<?>, Object> scopingDataList;
-
- /** The registrations done by this mbean. */
- private final Map<Object, ManagementContextImpl> registrations;
-
- /** . */
- final Map<ManagementProvider, Object> bilto;
-
- /** . */
- private final ManagementContextImpl parent;
-
- /** . */
- final KernelManagementContext kernelContext;
-
- /** . */
- private final Object resource;
-
- /** . */
- private final ManagedTypeMetaData typeMD;
-
- /** An optional container setup when the management context is attached to a
container. */
- private final ManageableContainer container;
-
- public ManagementContextImpl(KernelManagementContext kernelContext,
ManageableContainer container)
- {
- if (kernelContext == null)
- {
- throw new NullPointerException();
- }
- if (container == null)
- {
- throw new NullPointerException();
- }
-
- //
- Object resource = null;
- ManagedTypeMetaData typeMD = null;
- MetaDataBuilder builder = new MetaDataBuilder(container.getClass());
- if (builder.isBuildable())
- {
- resource = container;
- typeMD = builder.build();
- }
-
- //
- this.bilto = new HashMap<ManagementProvider, Object>();
- this.registrations = new HashMap<Object, ManagementContextImpl>();
- this.parent = null;
- this.scopingDataList = new HashMap<Class<?>, Object>();
- this.kernelContext = kernelContext;
- this.resource = resource;
- this.typeMD = typeMD;
- this.container = container;
- }
-
- public ManagementContextImpl(ManagementContextImpl parent, ManageableContainer
container)
- {
- if (parent == null)
- {
- throw new NullPointerException();
- }
- if (container == null)
- {
- throw new NullPointerException();
- }
-
- //
- Object resource = null;
- ManagedTypeMetaData typeMD = null;
- MetaDataBuilder builder = new MetaDataBuilder(container.getClass());
- if (builder.isBuildable())
- {
- resource = container;
- typeMD = builder.build();
- }
-
- //
- this.bilto = new HashMap<ManagementProvider, Object>();
- this.registrations = new HashMap<Object, ManagementContextImpl>();
- this.parent = parent;
- this.scopingDataList = new HashMap<Class<?>, Object>();
- this.kernelContext = parent.kernelContext;
- this.resource = resource;
- this.typeMD = typeMD;
- this.container = container;
- }
-
- public ManagementContextImpl(ManagementContextImpl parent, Object resource,
ManagedTypeMetaData typeMD)
- {
- if (parent == null)
- {
- throw new NullPointerException();
- }
- if ((resource != null && typeMD == null) && (resource == null
&& typeMD != null))
- {
- throw new IllegalArgumentException("Can't have resource null and meta
data not null or the converse");
- }
-
- //
- this.bilto = new HashMap<ManagementProvider, Object>();
- this.registrations = new HashMap<Object, ManagementContextImpl>();
- this.parent = parent;
- this.scopingDataList = new HashMap<Class<?>, Object>();
- this.kernelContext = parent.kernelContext;
- this.resource = resource;
- this.typeMD = typeMD;
- this.container = null;
- }
-
- public ManagementContext getParent()
- {
- return parent;
- }
-
- public <S> void setScopingData(Class<S> scopeType, S scopingData)
- {
- this.scopingDataList.put(scopeType, scopingData);
- }
-
- public void register(Object o)
- {
- Object resource = null;
-
- // Apply managed by annotation
- ManagedBy managedBy = o.getClass().getAnnotation(ManagedBy.class);
- if (managedBy != null)
- {
- try
- {
- Class managedByClass = managedBy.value();
- Constructor<?> blah = managedByClass.getConstructor(o.getClass());
- resource = blah.newInstance(o);
- }
- catch (NoSuchMethodException e)
- {
- e.printStackTrace();
- }
- catch (InstantiationException e)
- {
- e.printStackTrace();
- }
- catch (IllegalAccessException e)
- {
- e.printStackTrace();
- }
- catch (InvocationTargetException e)
- {
- e.printStackTrace();
- }
- }
- else
- {
- resource = o;
- }
-
- //
- if (resource != null) {
-
- MetaDataBuilder builder = new MetaDataBuilder(resource.getClass());
- if (builder.isBuildable()) {
- ManagedTypeMetaData metaData = builder.build();
-
- //
- ManagementContextImpl managementContext;
- if (resource instanceof ManageableContainer)
- {
- managementContext = ((ManageableContainer)resource).managementContext;
- }
- else
- {
- managementContext = new ManagementContextImpl(this, resource, metaData);
- }
-
- //
- registrations.put(resource, managementContext);
-
- //
- for (ManagementProvider provider : kernelContext.getProviders())
- {
- Object name = provider.manage(managementContext);
- if (name != null)
- {
- managementContext.bilto.put(provider, name);
- }
- }
-
- // Allow for more resource management
- if (resource instanceof ManagementAware)
- {
- ((ManagementAware)resource).setContext(managementContext);
- }
- }
- }
- }
-
- public void unregister(Object o)
- {
- ManagementContextImpl context = registrations.remove(o);
- if (context != null)
- {
- for (Map.Entry<ManagementProvider, Object> entry :
context.bilto.entrySet()) {
- entry.getKey().unmanage(entry.getValue());
- }
- }
- }
-
- public <S> List<S> getScopingData(Class<S> scopeType)
- {
- ArrayList<S> list = new ArrayList<S>();
- for (ManagementContextImpl current = this; current != null; current =
current.parent)
- {
- Object scopedData = current.scopingDataList.get(scopeType);
- if (scopedData != null)
- {
- // It must be that type since we put it
- list.add((S)scopedData);
- }
- }
- return list;
- }
-
- public ExoContainer findContainer()
- {
- for (ManagementContextImpl current = this;true;current = current.parent)
- {
- if (current.container instanceof ExoContainer)
- {
- return (ExoContainer)current.container;
- }
- else if (current.parent == null)
- {
- return null;
- }
- }
- }
-
- public void beforeInvoke(Object managedResource)
- {
- ExoContainer container = findContainer();
- if (container != null)
- {
- RequestLifeCycle.begin(container);
- }
- }
-
- public void afterInvoke(Object managedResource)
- {
- RequestLifeCycle.end();
- }
-
- @Override
- public String toString()
- {
- return "ManagementContextImpl[container=" + container + "]";
- }
-
- public Object getResource()
- {
- return resource;
- }
-
- public ManagedTypeMetaData getMetaData()
- {
- return typeMD;
- }
-
- void install(ManagementProvider provider) {
- if (resource != null&& typeMD != null)
- {
- Object name = provider.manage(this);
- if (name != null)
- {
- bilto.put(provider, name);
- }
- }
-
- // Install for all
- for (ManagementContextImpl registration : registrations.values())
- {
- registration.install(provider);
- }
- }
-}
Copied:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/KernelManagementContext.java
(from rev 1226,
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/KernelManagementContext.java)
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/KernelManagementContext.java
(rev 0)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/KernelManagementContext.java 2009-12-29
09:58:06 UTC (rev 1227)
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2009 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.management;
+
+import org.exoplatform.management.spi.ManagementProvider;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien
Viet</a>
+ * @version $Revision$
+ */
+public class KernelManagementContext
+{
+
+ /** . */
+ final ManagementContextImpl root;
+
+ /** . */
+ private final Set<ManagementProvider> providers;
+
+ /** . */
+ private final ManageableContainer container;
+
+ public KernelManagementContext(ManageableContainer container)
+ {
+ this.providers = new HashSet<ManagementProvider>();
+ this.container = container;
+
+ // Done last as we pass 'this' as argument
+ this.root = new ManagementContextImpl(this, container);
+ }
+
+ public synchronized Collection<ManagementProvider> getProviders() {
+ return providers;
+ }
+
+ public synchronized boolean addProvider(ManagementProvider provider)
+ {
+ // Prevent double registration just in case...
+ if (providers.contains(provider)) {
+ return false;
+ }
+
+ //
+ providers.add(provider);
+
+ // Perform registration of already registered managed components
+ root.install(provider);
+
+ //
+ return false;
+ }
+}
Copied:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapter.java
(from rev 1223,
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapter.java)
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapter.java
(rev 0)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapter.java 2009-12-29
09:58:06 UTC (rev 1227)
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2009 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.management;
+
+import org.exoplatform.management.spi.ManagementProvider;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.picocontainer.ComponentAdapter;
+import org.picocontainer.PicoContainer;
+import org.picocontainer.PicoInitializationException;
+import org.picocontainer.PicoIntrospectionException;
+import org.picocontainer.PicoVisitor;
+
+/**
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien
Viet</a>
+ * @version $Revision$
+ */
+public class ManageableComponentAdapter implements ComponentAdapter
+{
+
+ /** . */
+ private Log log = ExoLogger.getLogger(ManageableComponentAdapter.class);
+
+ /** . */
+ private ComponentAdapter delegate;
+
+ /** . */
+ private final ManageableContainer container;
+
+ /** . */
+ private volatile boolean registered = false;
+
+ public ManageableComponentAdapter(ManageableContainer container, ComponentAdapter
delegate)
+ {
+ this.delegate = delegate;
+ this.container = container;
+ }
+
+ public Object getComponentKey()
+ {
+ return delegate.getComponentKey();
+ }
+
+ public Class getComponentImplementation()
+ {
+ return delegate.getComponentImplementation();
+ }
+
+ public Object getComponentInstance(PicoContainer pico) throws
PicoInitializationException,
+ PicoIntrospectionException
+ {
+ Object instance = delegate.getComponentInstance(pico);
+
+ //
+ if (!registered)
+ {
+ registered = true;
+
+ //
+ if (container.managementContext != null)
+ {
+ // Registry the instance against the management context
+ log.debug("==> add " + instance + " to a mbean
server");
+ container.managementContext.register(instance);
+
+ // Register if it is a management provider
+ if (instance instanceof ManagementProvider)
+ {
+ ManagementProvider provider = (ManagementProvider)instance;
+ container.managementContext.kernelContext.addProvider(provider);
+ }
+ }
+ }
+ return instance;
+ }
+
+ public void verify(PicoContainer container) throws PicoIntrospectionException
+ {
+ delegate.verify(container);
+ }
+
+ public void accept(PicoVisitor visitor)
+ {
+ delegate.accept(visitor);
+ }
+}
Copied:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapterFactory.java
(from rev 1209,
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableComponentAdapterFactory.java)
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapterFactory.java
(rev 0)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableComponentAdapterFactory.java 2009-12-29
09:58:06 UTC (rev 1227)
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2009 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.management;
+
+import org.picocontainer.ComponentAdapter;
+import org.picocontainer.Parameter;
+import org.picocontainer.PicoIntrospectionException;
+import org.picocontainer.defaults.AssignabilityRegistrationException;
+import org.picocontainer.defaults.ComponentAdapterFactory;
+import org.picocontainer.defaults.NotConcreteRegistrationException;
+
+/**
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien
Viet</a>
+ * @version $Revision$
+ */
+public class ManageableComponentAdapterFactory implements ComponentAdapterFactory
+{
+
+ /** . */
+ private ComponentAdapterFactory delegate;
+
+ /** . */
+ ManageableContainer container;
+
+ public ManageableComponentAdapterFactory(ComponentAdapterFactory delegate)
+ {
+ this.delegate = delegate;
+ }
+
+ public ComponentAdapter createComponentAdapter(Object componentKey, Class
componentImplementation,
+ Parameter[] parameters) throws PicoIntrospectionException,
AssignabilityRegistrationException,
+ NotConcreteRegistrationException
+ {
+ ComponentAdapter adapter = delegate.createComponentAdapter(componentKey,
componentImplementation, parameters);
+ return new ManageableComponentAdapter(container, adapter);
+ }
+}
Copied:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java
(from rev 1226,
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManageableContainer.java)
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java
(rev 0)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java 2009-12-29
09:58:06 UTC (rev 1227)
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2009 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.management;
+
+import org.exoplatform.container.CachingContainer;
+import org.exoplatform.container.jmx.MX4JComponentAdapterFactory;
+import org.exoplatform.container.monitor.jvm.J2EEServerInfo;
+import org.exoplatform.management.ManagementContext;
+import org.exoplatform.management.annotations.Managed;
+import org.exoplatform.management.annotations.ManagedDescription;
+import org.exoplatform.management.annotations.ManagedName;
+import org.exoplatform.management.spi.ManagementProvider;
+import org.exoplatform.management.spi.jmx.JMXManagementProvider;
+import org.picocontainer.ComponentAdapter;
+import org.picocontainer.PicoContainer;
+import org.picocontainer.PicoException;
+import org.picocontainer.PicoRegistrationException;
+import org.picocontainer.defaults.ComponentAdapterFactory;
+import org.picocontainer.defaults.DuplicateComponentKeyRegistrationException;
+
+import java.lang.management.ManagementFactory;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.management.MBeanServer;
+
+/**
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien
Viet</a>
+ * @version $Revision$
+ */
+public class ManageableContainer extends CachingContainer
+{
+
+ private static MBeanServer findMBeanServer()
+ {
+ J2EEServerInfo serverenv_ = new J2EEServerInfo();
+ MBeanServer server = serverenv_.getMBeanServer();
+ if (server == null)
+ {
+ server = ManagementFactory.getPlatformMBeanServer();
+ }
+ return server;
+ }
+
+ /** . */
+ private static final ThreadLocal<ManageableComponentAdapterFactory> hack =
+ new ThreadLocal<ManageableComponentAdapterFactory>();
+
+ /** . */
+ protected ManagementContextImpl managementContext;
+
+ /** . */
+ protected MBeanServer server;
+
+ public ManageableContainer()
+ {
+ this((PicoContainer)null);
+ }
+
+ public ManageableContainer(PicoContainer parent)
+ {
+ this(new MX4JComponentAdapterFactory(), parent);
+ }
+
+ public ManageableContainer(ComponentAdapterFactory componentAdapterFactory,
PicoContainer parent)
+ {
+ super(getComponentAdapterFactory(componentAdapterFactory), parent);
+
+ // Yeah this is not pretty but a necessary evil to make it work
+ ManageableComponentAdapterFactory factory = hack.get();
+ factory.container = this;
+ hack.set(null);
+
+ // Reference the same mbean server that the parent has
+ if (parent instanceof ManageableContainer)
+ {
+ ManageableContainer manageableParent = (ManageableContainer)parent;
+
+ //
+ ManagementContextImpl parentManagementContext =
manageableParent.managementContext;
+ if (parentManagementContext != null)
+ {
+ managementContext = new ManagementContextImpl(parentManagementContext,
this);
+ }
+
+ // Get server from parent
+ server = manageableParent.server;
+ } else {
+ KernelManagementContext kernelCtx = new KernelManagementContext(this);
+
+ //
+ server = findMBeanServer();
+ managementContext = kernelCtx.root;
+
+ //
+ kernelCtx.addProvider(new JMXManagementProvider(server));
+ }
+ }
+
+ public ManageableContainer(ComponentAdapterFactory componentAdapterFactory)
+ {
+ this(componentAdapterFactory, null);
+ }
+
+ @Managed
+ @ManagedName("RegisteredComponentNames")
+ @ManagedDescription("Return the list of the registered component names")
+ public Set<String> getRegisteredComponentNames() throws PicoException
+ {
+ Set<String> names = new HashSet<String>();
+ Collection<ComponentAdapter> adapters = getComponentAdapters();
+ for (ComponentAdapter adapter : adapters)
+ {
+ Object key = adapter.getComponentKey();
+ String name = String.valueOf(key);
+ names.add(name);
+ }
+ return names;
+ }
+
+ private static ManageableComponentAdapterFactory getComponentAdapterFactory(
+ ComponentAdapterFactory componentAdapterFactory)
+ {
+ ManageableComponentAdapterFactory factory = new
ManageableComponentAdapterFactory(componentAdapterFactory);
+ hack.set(factory);
+ return factory;
+ }
+
+ public ManagementContext getManagementContext()
+ {
+ return managementContext;
+ }
+
+ public final MBeanServer getMBeanServer()
+ {
+ return server;
+ }
+
+ @Override
+ public ComponentAdapter registerComponent(ComponentAdapter componentAdapter)
+ throws DuplicateComponentKeyRegistrationException
+ {
+ return super.registerComponent(componentAdapter);
+ }
+
+ public ComponentAdapter registerComponentInstance(Object componentKey, Object
componentInstance)
+ throws PicoRegistrationException
+ {
+ ComponentAdapter adapter = super.registerComponentInstance(componentKey,
componentInstance);
+ if (managementContext != null)
+ {
+ managementContext.register(componentInstance);
+
+ // Register if it is a management provider
+ if (componentInstance instanceof ManagementProvider)
+ {
+ ManagementProvider provider = (ManagementProvider)componentInstance;
+ managementContext.kernelContext.addProvider(provider);
+ }
+ }
+ return adapter;
+ }
+}
Copied:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManagementContextImpl.java
(from rev 1226,
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/ManagementContextImpl.java)
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManagementContextImpl.java
(rev 0)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManagementContextImpl.java 2009-12-29
09:58:06 UTC (rev 1227)
@@ -0,0 +1,328 @@
+/*
+ * Copyright (C) 2009 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.management;
+
+import org.exoplatform.container.ExoContainer;
+import org.exoplatform.container.component.RequestLifeCycle;
+import org.exoplatform.management.ManagementAware;
+import org.exoplatform.management.spi.ManagedResource;
+import org.exoplatform.management.spi.ManagedTypeMetaData;
+import org.exoplatform.container.management.MetaDataBuilder;
+import org.exoplatform.management.spi.ManagementProvider;
+import org.exoplatform.management.ManagementContext;
+import org.exoplatform.management.annotations.ManagedBy;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien
Viet</a>
+ * @version $Revision$
+ */
+public class ManagementContextImpl implements ManagementContext, ManagedResource
+{
+
+ /** . */
+ private final Map<Class<?>, Object> scopingDataList;
+
+ /** The registrations done by this mbean. */
+ private final Map<Object, ManagementContextImpl> registrations;
+
+ /** . */
+ final Map<ManagementProvider, Object> bilto;
+
+ /** . */
+ private final ManagementContextImpl parent;
+
+ /** . */
+ final KernelManagementContext kernelContext;
+
+ /** . */
+ private final Object resource;
+
+ /** . */
+ private final ManagedTypeMetaData typeMD;
+
+ /** An optional container setup when the management context is attached to a
container. */
+ private final ManageableContainer container;
+
+ public ManagementContextImpl(KernelManagementContext kernelContext,
ManageableContainer container)
+ {
+ if (kernelContext == null)
+ {
+ throw new NullPointerException();
+ }
+ if (container == null)
+ {
+ throw new NullPointerException();
+ }
+
+ //
+ Object resource = null;
+ ManagedTypeMetaData typeMD = null;
+ MetaDataBuilder builder = new MetaDataBuilder(container.getClass());
+ if (builder.isBuildable())
+ {
+ resource = container;
+ typeMD = builder.build();
+ }
+
+ //
+ this.bilto = new HashMap<ManagementProvider, Object>();
+ this.registrations = new HashMap<Object, ManagementContextImpl>();
+ this.parent = null;
+ this.scopingDataList = new HashMap<Class<?>, Object>();
+ this.kernelContext = kernelContext;
+ this.resource = resource;
+ this.typeMD = typeMD;
+ this.container = container;
+ }
+
+ public ManagementContextImpl(ManagementContextImpl parent, ManageableContainer
container)
+ {
+ if (parent == null)
+ {
+ throw new NullPointerException();
+ }
+ if (container == null)
+ {
+ throw new NullPointerException();
+ }
+
+ //
+ Object resource = null;
+ ManagedTypeMetaData typeMD = null;
+ MetaDataBuilder builder = new MetaDataBuilder(container.getClass());
+ if (builder.isBuildable())
+ {
+ resource = container;
+ typeMD = builder.build();
+ }
+
+ //
+ this.bilto = new HashMap<ManagementProvider, Object>();
+ this.registrations = new HashMap<Object, ManagementContextImpl>();
+ this.parent = parent;
+ this.scopingDataList = new HashMap<Class<?>, Object>();
+ this.kernelContext = parent.kernelContext;
+ this.resource = resource;
+ this.typeMD = typeMD;
+ this.container = container;
+ }
+
+ public ManagementContextImpl(ManagementContextImpl parent, Object resource,
ManagedTypeMetaData typeMD)
+ {
+ if (parent == null)
+ {
+ throw new NullPointerException();
+ }
+ if ((resource != null && typeMD == null) && (resource == null
&& typeMD != null))
+ {
+ throw new IllegalArgumentException("Can't have resource null and meta
data not null or the converse");
+ }
+
+ //
+ this.bilto = new HashMap<ManagementProvider, Object>();
+ this.registrations = new HashMap<Object, ManagementContextImpl>();
+ this.parent = parent;
+ this.scopingDataList = new HashMap<Class<?>, Object>();
+ this.kernelContext = parent.kernelContext;
+ this.resource = resource;
+ this.typeMD = typeMD;
+ this.container = null;
+ }
+
+ public ManagementContext getParent()
+ {
+ return parent;
+ }
+
+ public <S> void setScopingData(Class<S> scopeType, S scopingData)
+ {
+ this.scopingDataList.put(scopeType, scopingData);
+ }
+
+ public void register(Object o)
+ {
+ Object resource = null;
+
+ // Apply managed by annotation
+ ManagedBy managedBy = o.getClass().getAnnotation(ManagedBy.class);
+ if (managedBy != null)
+ {
+ try
+ {
+ Class managedByClass = managedBy.value();
+ Constructor<?> blah = managedByClass.getConstructor(o.getClass());
+ resource = blah.newInstance(o);
+ }
+ catch (NoSuchMethodException e)
+ {
+ e.printStackTrace();
+ }
+ catch (InstantiationException e)
+ {
+ e.printStackTrace();
+ }
+ catch (IllegalAccessException e)
+ {
+ e.printStackTrace();
+ }
+ catch (InvocationTargetException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ else
+ {
+ resource = o;
+ }
+
+ //
+ if (resource != null) {
+
+ MetaDataBuilder builder = new MetaDataBuilder(resource.getClass());
+ if (builder.isBuildable()) {
+ ManagedTypeMetaData metaData = builder.build();
+
+ //
+ ManagementContextImpl managementContext;
+ if (resource instanceof ManageableContainer)
+ {
+ managementContext = ((ManageableContainer)resource).managementContext;
+ }
+ else
+ {
+ managementContext = new ManagementContextImpl(this, resource, metaData);
+ }
+
+ //
+ registrations.put(resource, managementContext);
+
+ //
+ for (ManagementProvider provider : kernelContext.getProviders())
+ {
+ Object name = provider.manage(managementContext);
+ if (name != null)
+ {
+ managementContext.bilto.put(provider, name);
+ }
+ }
+
+ // Allow for more resource management
+ if (resource instanceof ManagementAware)
+ {
+ ((ManagementAware)resource).setContext(managementContext);
+ }
+ }
+ }
+ }
+
+ public void unregister(Object o)
+ {
+ ManagementContextImpl context = registrations.remove(o);
+ if (context != null)
+ {
+ for (Map.Entry<ManagementProvider, Object> entry :
context.bilto.entrySet()) {
+ entry.getKey().unmanage(entry.getValue());
+ }
+ }
+ }
+
+ public <S> List<S> getScopingData(Class<S> scopeType)
+ {
+ ArrayList<S> list = new ArrayList<S>();
+ for (ManagementContextImpl current = this; current != null; current =
current.parent)
+ {
+ Object scopedData = current.scopingDataList.get(scopeType);
+ if (scopedData != null)
+ {
+ // It must be that type since we put it
+ list.add((S)scopedData);
+ }
+ }
+ return list;
+ }
+
+ public ExoContainer findContainer()
+ {
+ for (ManagementContextImpl current = this;true;current = current.parent)
+ {
+ if (current.container instanceof ExoContainer)
+ {
+ return (ExoContainer)current.container;
+ }
+ else if (current.parent == null)
+ {
+ return null;
+ }
+ }
+ }
+
+ public void beforeInvoke(Object managedResource)
+ {
+ ExoContainer container = findContainer();
+ if (container != null)
+ {
+ RequestLifeCycle.begin(container);
+ }
+ }
+
+ public void afterInvoke(Object managedResource)
+ {
+ RequestLifeCycle.end();
+ }
+
+ @Override
+ public String toString()
+ {
+ return "ManagementContextImpl[container=" + container + "]";
+ }
+
+ public Object getResource()
+ {
+ return resource;
+ }
+
+ public ManagedTypeMetaData getMetaData()
+ {
+ return typeMD;
+ }
+
+ void install(ManagementProvider provider) {
+ if (resource != null&& typeMD != null)
+ {
+ Object name = provider.manage(this);
+ if (name != null)
+ {
+ bilto.put(provider, name);
+ }
+ }
+
+ // Install for all
+ for (ManagementContextImpl registration : registrations.values())
+ {
+ registration.install(provider);
+ }
+ }
+}
Modified:
kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestPortalContainerManagedIntegration.java
===================================================================
---
kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestPortalContainerManagedIntegration.java 2009-12-29
09:52:07 UTC (rev 1226)
+++
kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/jmx/TestPortalContainerManagedIntegration.java 2009-12-29
09:58:06 UTC (rev 1227)
@@ -21,6 +21,7 @@
import org.exoplatform.container.PortalContainer;
import org.exoplatform.container.RootContainer;
import org.exoplatform.container.jmx.support.SimpleManagementAware;
+import org.exoplatform.container.management.ManagementContextImpl;
import org.exoplatform.container.support.ContainerBuilder;
import java.net.URL;