/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* 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.jboss.management.j2ee;
import java.util.Hashtable;
import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import org.jboss.logging.Logger;
/**
* Root class of the JBoss implementation of a custom MBean managed object.
*
* @author <a href="mailto:andreas@jboss.org">Andreas Schaefer</a>
* @author <a href="mailto:scott.stark@jboss.org">Scott Stark</a>
* @author <a href="mailto:thomas.diesler@jboss.org">Thomas Diesler</a>
* @version $Revision: 81025 $
*/
public class MBean extends J2EEManagedObject
implements MBeanMBean
{
// Attributes ----------------------------------------------------
private static Logger log = Logger.getLogger(MBean.class);
private ObjectName jbossServiceName;
private StateManagement mState;
private boolean monitorsStateChanges = false;
/** Does the mbean have a State attribute */
private boolean hasState;
// Static --------------------------------------------------------
/**
* Create a
*
* @param pServer
* @param pServiceModule
* @param pTarget
* @return ObjectName of the MBean
*/
public static ObjectName create(MBeanServer pServer, String pServiceModule,
ObjectName pTarget)
{
String pName = pTarget.toString();
ObjectName mbeanName = null;
try
{
if (pServiceModule == null)
{
log.debug("Parent SAR Module not defined");
return null;
}
MBean mbean = new MBean(pName, new ObjectName(pServiceModule), pTarget);
mbeanName = mbean.getObjectName();
pServer.registerMBean(mbean, mbeanName);
}
catch (Exception e)
{
log.debug("Could not create JSR-77 MBean: " + pName, e);
}
return mbeanName;
}
public static void destroy(MBeanServer pServer, String pName)
{
try
{
if (pName.indexOf(J2EEManagedObject.TYPE + "=" + J2EETypeConstants.MBean) >= 0)
{
J2EEManagedObject.removeObject(pServer,
pName);
}
else
{
J2EEManagedObject.removeObject(pServer,
pName,
J2EEDomain.getDomainName() + ":" +
J2EEManagedObject.TYPE + "=" + J2EETypeConstants.MBean +
"," + "*");
}
}
catch (Exception e)
{
log.error("Could not destroy JSR-77 MBean: " + pName, e);
}
}
// Constructors --------------------------------------------------
/**
* @param pName Name of the MBean
*/
public MBean(String pName, ObjectName pServiceModule, ObjectName pTarget)
throws
MalformedObjectNameException,
InvalidParentException
{
super(J2EETypeConstants.MBean, pName, pServiceModule);
mState = new StateManagement(this);
jbossServiceName = pTarget;
}
/**
* Does the MBean monitor state changes of the JBoss MBean service.
*
* @return True if the underlying JBoss MBean service is monitored for state
* changes.
* @jmx:managed-attribute
*/
public boolean isstateMonitored()
{
return monitorsStateChanges;
}
public boolean isstateManageable()
{
return hasState;
}
// J2EEManagedObjectMBean implementation -------------------------
public void postCreation()
{
try
{
// First check if the service implements the NotificationBroadcaster
monitorsStateChanges = getServer().isInstanceOf(jbossServiceName,
"javax.management.NotificationBroadcaster");
if (monitorsStateChanges)
{
getServer().addNotificationListener(jbossServiceName, mState, null, null);
}
}
catch (Exception jme)
{
log.debug("Failed to register as listener of: " + jbossServiceName, jme);
}
sendNotification(NotificationConstants.OBJECT_CREATED, "MBean created");
// Initialize the state
try
{
Integer jbossState = (Integer)getServer().getAttribute(jbossServiceName, "State");
int jsr77State = StateManagement.convertJBossState(jbossState.intValue());
mState.setState(jsr77State);
}
catch (Exception e)
{
log.trace("Failed to initialize state from: '" + jbossServiceName +
"' : " + e.getClass().getName() + " : " + e.getMessage());
hasState = false;
}
}
public void preDestruction()
{
sendNotification(NotificationConstants.OBJECT_DELETED, "MBean destroyed");
// Remove the listener of the target MBean
try
{
if( monitorsStateChanges )
getServer().removeNotificationListener(jbossServiceName, mState);
}
catch (JMException jme)
{
// When the service is not available anymore then just ignore the exception
}
}
// javax.managment.j2ee.EventProvider implementation -------------
public String[] getEventTypes()
{
return StateManagement.stateTypes;
}
public String getEventType(int pIndex)
{
if (pIndex >= 0 && pIndex < StateManagement.stateTypes.length)
{
return StateManagement.stateTypes[pIndex];
}
else
{
return null;
}
}
// javax.management.j2ee.StateManageable implementation ----------
public long getStartTime()
{
return mState.getStartTime();
}
public int getState()
{
return mState.getState();
}
public String getStateString()
{
return mState.getStateString();
}
public void mejbStart()
{
try
{
getServer().invoke(jbossServiceName,
"start",
new Object[]{},
new String[]{});
}
catch (Exception e)
{
getLog().error("Start of MBean failed", e);
}
}
public void mejbStartRecursive()
{
// No recursive start here
mejbStart();
}
public void mejbStop()
{
try
{
getServer().invoke(jbossServiceName,
"stop",
new Object[]{},
new String[]{});
}
catch (Exception e)
{
getLog().error("Stop of MBean failed", e);
}
}
// java.lang.Object overrides --------------------------------------
public String toString()
{
return "MBean { " + super.toString() + " } []";
}
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
/**
* @return A hashtable with the SAR-Module, J2EE-Application and J2EE-Server as parent
*/
protected Hashtable getParentKeys(ObjectName pParent)
{
Hashtable lReturn = new Hashtable();
Hashtable lProperties = pParent.getKeyPropertyList();
lReturn.put(J2EETypeConstants.ServiceModule, lProperties.get("name"));
// J2EE-Application is never a parent of a MBean therefore set it to "null"
lReturn.put(J2EETypeConstants.J2EEApplication, "null");
// J2EE-Server is already parent of J2EE-Application therefore lookup
// the name by the J2EE-Server type
lReturn.put(J2EETypeConstants.J2EEServer, lProperties.get(J2EETypeConstants.J2EEServer));
return lReturn;
}
// Private -------------------------------------------------------
// Inner classes -------------------------------------------------
}