package org.jboss.management.j2ee;
import org.jboss.system.ServiceMBean;
import javax.management.AttributeChangeNotification;
import javax.management.Notification;
import javax.management.NotificationListener;
import java.security.InvalidParameterException;
public class StateManagement
implements NotificationListener
{
public static final int CREATED = 5;
public static final int DESTROYED = 6;
public static final int REGISTERED = 7;
public static final int UNREGISTERED = 8;
public static final String[] stateTypes = new String[]
{
NotificationConstants.STATE_STARTING,
NotificationConstants.STATE_RUNNING,
NotificationConstants.STATE_STOPPING,
NotificationConstants.STATE_STOPPED,
NotificationConstants.STATE_FAILED,
NotificationConstants.OBJECT_CREATED,
NotificationConstants.OBJECT_DELETED,
NotificationConstants.OBJECT_REGISTERED,
NotificationConstants.OBJECT_DELETED
};
private long startTime = -1;
private int state = StateManageable.UNREGISTERED;
private J2EEManagedObject managedObject;
public static int convertJBossState(int theState)
{
int jsr77State = -1;
switch (theState)
{
case ServiceMBean.STARTING:
jsr77State = StateManageable.STARTING;
break;
case ServiceMBean.STARTED:
jsr77State = StateManageable.RUNNING;
break;
case ServiceMBean.STOPPING:
jsr77State = StateManageable.STOPPING;
break;
case ServiceMBean.STOPPED:
jsr77State = StateManageable.STOPPED;
break;
case ServiceMBean.FAILED:
jsr77State = StateManageable.FAILED;
break;
case ServiceMBean.CREATED:
jsr77State = CREATED;
break;
case ServiceMBean.DESTROYED:
jsr77State = DESTROYED;
break;
case ServiceMBean.REGISTERED:
jsr77State = REGISTERED;
break;
case ServiceMBean.UNREGISTERED:
jsr77State = UNREGISTERED;
break;
default:
jsr77State = -1;
break;
}
return jsr77State;
}
public static int convertJSR77State(int theState)
{
int jbossState = -1;
switch (theState)
{
case StateManageable.STARTING:
jbossState = ServiceMBean.STARTING;
break;
case StateManageable.RUNNING:
jbossState = ServiceMBean.STARTED;
break;
case StateManageable.STOPPING:
jbossState = ServiceMBean.STOPPING;
break;
case StateManageable.STOPPED:
jbossState = ServiceMBean.STOPPED;
break;
case StateManageable.FAILED:
jbossState = ServiceMBean.FAILED;
break;
case CREATED:
jbossState = ServiceMBean.CREATED;
break;
case DESTROYED:
jbossState = ServiceMBean.DESTROYED;
break;
case REGISTERED:
jbossState = ServiceMBean.REGISTERED;
break;
case UNREGISTERED:
jbossState = ServiceMBean.UNREGISTERED;
break;
}
return jbossState;
}
public StateManagement(J2EEManagedObject managedObject)
{
if (managedObject == null)
{
throw new InvalidParameterException("managedObject must not be null");
}
this.managedObject = managedObject;
this.startTime = System.currentTimeMillis();
}
public long getStartTime()
{
return startTime;
}
public void setStartTime(long pTime)
{
startTime = pTime;
}
public int getState()
{
return state;
}
public String getStateString()
{
String stateName = stateTypes[state];
return stateName;
}
public void setState(int newState)
{
if (0 <= newState && newState < stateTypes.length)
{
if (newState != state)
{
state = newState;
String type = stateTypes[state];
managedObject.sendNotification(type, "State changed");
}
}
}
public void handleNotification(Notification msg, Object handback)
{
if (msg instanceof AttributeChangeNotification)
{
AttributeChangeNotification change = (AttributeChangeNotification) msg;
String attrName = change.getAttributeName();
Object newValue = change.getNewValue();
if ("State".equals(attrName) && newValue != null && newValue instanceof Integer)
{
int newState = ((Integer) newValue).intValue();
long eventTime = -1;
if (newState == ServiceMBean.STARTED)
{
eventTime = change.getTimeStamp();
}
if (newState == ServiceMBean.STARTED)
setStartTime(eventTime);
int jsr77State = convertJBossState(newState);
setState(jsr77State);
}
}
}
public String toString()
{
return "StateManagement [ " +
"State: " + state +
", Start Time: " + startTime +
" ]";
}
}