All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.squirrelframework.foundation.fsm.jmx.StateMachineManagement Maven / Gradle / Ivy

package org.squirrelframework.foundation.fsm.jmx;

import org.squirrelframework.foundation.fsm.Converter;
import org.squirrelframework.foundation.fsm.ConverterProvider;
import org.squirrelframework.foundation.fsm.StateMachine;
import org.squirrelframework.foundation.fsm.StateMachineLogger;
import org.squirrelframework.foundation.fsm.StateMachinePerformanceModel;
import org.squirrelframework.foundation.fsm.StateMachinePerformanceMonitor;
import org.squirrelframework.foundation.fsm.impl.AbstractStateMachine;

import com.google.common.base.Preconditions;

public class StateMachineManagement implements StateMachineManagementMBean {
    
    private StateMachine stateMachine;
    
    private StateMachineLogger fsmLogger;
    
    private StateMachinePerformanceMonitor performanceMonitor;
    
    private long totalTransitionInvokedTimes = 0;
    
    private long totalTransitionFailedTimes = 0;
    
    private long totalTransitionDeclinedTimes = 0;
    
    private float averageTranstionConsumedTime = 0.0f;
    
    private String perfStatDetails = "[Empty]";
    
    public StateMachineManagement(StateMachine stateMachine) {
        Preconditions.checkNotNull(stateMachine);
        this.stateMachine = stateMachine;
    }
    
    @Override
    public String getIdentifier() {
        return stateMachine.getIdentifier();
    }

    @Override
    public String getCurrentState() {
        return stateMachine.getCurrentState()!=null ? 
                stateMachine.getCurrentState().toString() : "[NULL]";
    }
    
    @Override
    public String getPerfStatDetails() {
        return perfStatDetails;
    }
    
    public long getTotalTransitionInvokedTimes() {
        return totalTransitionInvokedTimes;
    }
    
    public long getTotalTransitionFailedTimes() {
        return totalTransitionFailedTimes;
    }
    
    public long getTotalTransitionDeclinedTimes() {
        return totalTransitionDeclinedTimes;
    }
    
    public float getAverageTranstionConsumedTime() {
        return averageTranstionConsumedTime;
    }
    
    @Override
    public String getLastErrorMessage() {
        return stateMachine.getLastException()!=null ? 
                stateMachine.getLastException().getMessage() : "[NoException]";
    }

    @Override
    public String toggleLogging() {
        if(fsmLogger==null) {
            fsmLogger = new StateMachineLogger(stateMachine);
            fsmLogger.startLogging();
            return "Logging Started";
        } else {
            fsmLogger.stopLogging();
            fsmLogger = null;
            return "Logging Ended";
        }
    }
    
    @Override
    public String togglePerfMon() {
        if(performanceMonitor==null) {
            perfStatDetails = "[Empty]";
            performanceMonitor = new StateMachinePerformanceMonitor("Performance-of-"+stateMachine.getIdentifier());
            stateMachine.addDeclarativeListener(performanceMonitor);
            if(stateMachine.isStarted()) {
                performanceMonitor.onStateMachineStart(stateMachine);
            }
            return "Performance Monitor Start";
        } else {
            StateMachinePerformanceModel perfModel = performanceMonitor.getPerfModel();
            this.totalTransitionInvokedTimes = perfModel.getTotalTransitionInvokedTimes();
            this.totalTransitionDeclinedTimes = perfModel.getTotalTransitionDeclinedTimes();
            this.totalTransitionFailedTimes = perfModel.getTotalTransitionFailedTimes();
            this.averageTranstionConsumedTime = perfModel.getAverageTranstionConsumedTime();
            
            perfStatDetails = perfModel.toString();
            stateMachine.removeDeclarativeListener(performanceMonitor);
            performanceMonitor = null;
            return "Performance Monitor End";
        }
    }

    @Override
    public void fireEvent(String event, String context) {
        Converter eventConverter = ConverterProvider.INSTANCE.getConverter(stateMachine.typeOfEvent());
        Converter contextConverter = ConverterProvider.INSTANCE.getConverter(stateMachine.typeOfContext());
        Object e = eventConverter.convertFromString(event);
        Object c = context!=null && !context.isEmpty() ? contextConverter.convertFromString(context) : null;
        ((AbstractStateMachine)stateMachine).untypedFire(e, c);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy