/* * 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 org.jboss.system.ServiceMBean; import javax.management.AttributeChangeNotification; import javax.management.Notification; import javax.management.NotificationListener; import java.security.InvalidParameterException; /** * Root class of the JBoss JSR-77 implementation of StateManagement * * @author <a href="mailto:andreas@jboss.org">Andreas Schaefer</a> * @version $Revision: 81025 $ */ public class StateManagement implements NotificationListener { // Constants ----------------------------------------------------- // These are not defined by JSR-77 as valid states public static final int CREATED = 5; public static final int DESTROYED = 6; public static final int REGISTERED = 7; public static final int UNREGISTERED = 8; /** * The int state to state name mappings */ 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 }; // Attributes ---------------------------------------------------- private long startTime = -1; private int state = StateManageable.UNREGISTERED; private J2EEManagedObject managedObject; // Static -------------------------------------------------------- /** * Converts a state from JBoss ServiceMBean to the JSR-77 state * * @param theState the JBoss ServiceMBean state. * @return Converted state or -1 if unknown. */ 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; } /** * Converts a JSR-77 state to the JBoss ServiceMBean state * * @param theState the JSR-77 state. * @return Converted state or -1 if unknown. */ 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; } // Constructors -------------------------------------------------- /** * @param managedObject * @throws InvalidParameterException If the given Name is null */ public StateManagement(J2EEManagedObject managedObject) { if (managedObject == null) { throw new InvalidParameterException("managedObject must not be null"); } this.managedObject = managedObject; this.startTime = System.currentTimeMillis(); } // Public -------------------------------------------------------- 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; } /** * Sets a new state and if it changed the appropriate state change event * is sent. * * @param newState Integer indicating the new state according to * {@link org.jboss.management.j2ee.StateManageable StateManageable} * constants */ public void setState(int newState) { // Only send a notification if the state really changes if (0 <= newState && newState < stateTypes.length) { if (newState != state) { state = newState; // Now send the event to the JSR-77 listeners String type = stateTypes[state]; managedObject.sendNotification(type, "State changed"); } } } // NotificationListener overrides --------------------------------- /** * A notification from the underlying JBoss service. * * @param msg The notification msg, AttributeChangeNotification is what we * care about * @param handback not used */ 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); } } } // Object overrides --------------------------------------------------- public String toString() { return "StateManagement [ " + "State: " + state + ", Start Time: " + startTime + " ]"; } }