/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source 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, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
*
* Free Software Foundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.jmx;
import com.caucho.loader.DynamicClassLoader;
import com.caucho.loader.EnvironmentLocal;
import com.caucho.loader.Environment;
import com.caucho.util.L10N;
import javax.management.MBeanServerDelegate;
import javax.management.MBeanServerDelegateMBean;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* JNDI object for the Resin mbean server.
*/
public class EnvironmentMBeanServer extends AbstractMBeanServer {
private static final L10N L = new L10N(EnvironmentMBeanServer.class);
private static final Logger log
= Logger.getLogger(EnvironmentMBeanServer.class.getName());
private EnvironmentLocal<MBeanContext> _localContext =
new EnvironmentLocal<MBeanContext>();
private MBeanServerDelegate _globalDelegate;
private MBeanContext _globalContext;
/**
* Creates an MBeanServerProxy based on the context class loader.
*/
public EnvironmentMBeanServer(String domain, MBeanServerDelegate delegate)
{
super(domain);
if (Jmx.getMBeanServer() == null)
Jmx.setMBeanServer(this);
ClassLoader systemLoader = ClassLoader.getSystemClassLoader();
MBeanContext context = new MBeanContext(this, systemLoader, delegate,
null);
_globalContext = context;
_localContext.setGlobal(context);
try {
IntrospectionMBean mbean;
mbean = new IntrospectionMBean(delegate, MBeanServerDelegateMBean.class);
MBeanWrapper mbeanWrapper;
mbeanWrapper = new MBeanWrapper(context, SERVER_DELEGATE_NAME,
delegate, mbean);
context.registerMBean(mbeanWrapper, SERVER_DELEGATE_NAME);
} catch (Exception e) {
log.log(Level.WARNING, e.toString(), e);
}
}
/**
* Returns the local context.
*/
protected MBeanContext createContext(ClassLoader loader)
{
synchronized (_localContext) {
MBeanContext context = _localContext.getLevel(loader);
if (context == null) {
if (loader instanceof DynamicClassLoader
&& ((DynamicClassLoader) loader).isDestroyed())
throw new IllegalStateException(L.l("JMX context {0} has been closed.",
loader));
MBeanServerDelegate delegate;
delegate = new MBeanServerDelegateImpl("Resin-JMX");
context = new MBeanContext(this, loader, delegate, _globalContext);
MBeanContext parent = null;
if (loader != null)
parent = createContext(loader.getParent());
if (parent != null)
context.setProperties(parent.copyProperties());
_localContext.set(context, loader);
try {
IntrospectionMBean mbean;
mbean = new IntrospectionMBean(delegate, MBeanServerDelegateMBean.class);
MBeanWrapper mbeanWrapper;
mbeanWrapper = new MBeanWrapper(context, SERVER_DELEGATE_NAME,
delegate, mbean);
context.registerMBean(mbeanWrapper, SERVER_DELEGATE_NAME);
} catch (Exception e) {
log.log(Level.WARNING, e.toString(), e);
}
}
return context;
}
}
/**
* Returns the local context.
*/
@Override
protected MBeanContext getCurrentContext(ClassLoader loader)
{
if (loader == null)
loader = Environment.getEnvironmentClassLoader(loader);
synchronized (_localContext) {
return _localContext.getLevel(loader);
}
}
/**
* Sets the local context.
*/
@Override
protected void setCurrentContext(MBeanContext context, ClassLoader loader)
{
if (loader == null)
loader = Environment.getEnvironmentClassLoader(loader);
synchronized (_localContext) {
if (_localContext.getLevel(loader) != null
&& _localContext.getLevel(loader) != context)
throw new IllegalStateException(L.l("replacing context is forbidden"));
_localContext.set(context, loader);
}
}
/**
* Returns the local context.
*/
protected MBeanContext getContext(ClassLoader loader)
{
return _localContext.get(loader);
}
/**
* Returns the local context.
*/
protected void removeContext(MBeanContext context, ClassLoader loader)
{
if (_localContext.get(loader) == context)
_localContext.remove(loader);
}
/**
* Returns the string form.
*/
public String toString()
{
return "EnvironmentMBeanServer[]";
}
}