/* * TeleStax, Open Source Cloud Communications * Copyright 2011-2017, Telestax Inc and individual contributors * by the @authors tag. * * 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.restcomm.media.network.netty.channel; import org.squirrelframework.foundation.fsm.StateMachineBuilder; import org.squirrelframework.foundation.fsm.StateMachineBuilderFactory; import org.squirrelframework.foundation.fsm.StateMachineConfiguration; /** * Builder for {@link NettyNetworkChannelFsm}. Use the {@link NettyNetworkChannelFsmBuilder#INSTANCE} to invoke the FSM builder. * @author Henrique Rosa (henrique.rosa@telestax.com) * */ public class NettyNetworkChannelFsmBuilder { public static final NettyNetworkChannelFsmBuilder INSTANCE = new NettyNetworkChannelFsmBuilder(); private final StateMachineBuilder<NettyNetworkChannelFsm, NettyNetworkChannelState, NettyNetworkChannelEvent, NettyNetworkChannelTransitionContext> builder; private NettyNetworkChannelFsmBuilder() { this.builder = StateMachineBuilderFactory .<NettyNetworkChannelFsm, NettyNetworkChannelState, NettyNetworkChannelEvent, NettyNetworkChannelTransitionContext> create( AsyncNettyNetworkChannelFsm.class, NettyNetworkChannelState.class, NettyNetworkChannelEvent.class, NettyNetworkChannelTransitionContext.class, NettyNetworkChannelGlobalContext.class); this.builder.externalTransition().from(NettyNetworkChannelState.UNINITIALIZED).to(NettyNetworkChannelState.OPENING).on(NettyNetworkChannelEvent.OPEN); this.builder.onEntry(NettyNetworkChannelState.OPENING).callMethod("enterOpening"); this.builder.externalTransition().from(NettyNetworkChannelState.OPENING).to(NettyNetworkChannelState.OPEN).on(NettyNetworkChannelEvent.OPENED); this.builder.externalTransition().from(NettyNetworkChannelState.OPENING).to(NettyNetworkChannelState.CLOSED).on(NettyNetworkChannelEvent.CLOSE); this.builder.transit().from(NettyNetworkChannelState.OPEN).to(NettyNetworkChannelState.CLOSED).onAny(); this.builder.onExit(NettyNetworkChannelState.OPENING).callMethod("exitOpening"); this.builder.onEntry(NettyNetworkChannelState.OPEN).callMethod("enterOpen"); this.builder.externalTransition().from(NettyNetworkChannelState.OPEN).to(NettyNetworkChannelState.BINDING).on(NettyNetworkChannelEvent.BIND); this.builder.externalTransition().from(NettyNetworkChannelState.OPEN).to(NettyNetworkChannelState.CLOSING).on(NettyNetworkChannelEvent.CLOSE); this.builder.onExit(NettyNetworkChannelState.OPEN).callMethod("exitOpen"); this.builder.onEntry(NettyNetworkChannelState.BINDING).callMethod("enterBinding"); this.builder.externalTransition().from(NettyNetworkChannelState.BINDING).to(NettyNetworkChannelState.BOUND).on(NettyNetworkChannelEvent.BOUND); this.builder.externalTransition().from(NettyNetworkChannelState.BINDING).to(NettyNetworkChannelState.CLOSING).on(NettyNetworkChannelEvent.CLOSE); this.builder.onExit(NettyNetworkChannelState.BINDING).callMethod("exitBinding"); this.builder.onEntry(NettyNetworkChannelState.BOUND).callMethod("enterBound"); this.builder.externalTransition().from(NettyNetworkChannelState.BOUND).to(NettyNetworkChannelState.CONNECTING).on(NettyNetworkChannelEvent.CONNECT); this.builder.externalTransition().from(NettyNetworkChannelState.BOUND).to(NettyNetworkChannelState.CLOSING).on(NettyNetworkChannelEvent.CLOSE); this.builder.onExit(NettyNetworkChannelState.BOUND).callMethod("exitBound"); this.builder.onEntry(NettyNetworkChannelState.CONNECTING).callMethod("enterConnecting"); this.builder.externalTransition().from(NettyNetworkChannelState.CONNECTING).to(NettyNetworkChannelState.CONNECTED).on(NettyNetworkChannelEvent.CONNECTED); this.builder.externalTransition().from(NettyNetworkChannelState.CONNECTING).to(NettyNetworkChannelState.CLOSING).on(NettyNetworkChannelEvent.CLOSE); this.builder.onExit(NettyNetworkChannelState.CONNECTING).callMethod("exitConnecting"); this.builder.onEntry(NettyNetworkChannelState.CONNECTED).callMethod("enterConnected"); this.builder.externalTransition().from(NettyNetworkChannelState.CONNECTED).to(NettyNetworkChannelState.DISCONNECTING).on(NettyNetworkChannelEvent.DISCONNECT); this.builder.externalTransition().from(NettyNetworkChannelState.CONNECTED).to(NettyNetworkChannelState.CLOSING).on(NettyNetworkChannelEvent.CLOSE); this.builder.onExit(NettyNetworkChannelState.CONNECTED).callMethod("exitConnected"); this.builder.onEntry(NettyNetworkChannelState.DISCONNECTING).callMethod("enterDisconnecting"); this.builder.externalTransition().from(NettyNetworkChannelState.DISCONNECTING).to(NettyNetworkChannelState.BOUND).on(NettyNetworkChannelEvent.DISCONNECTED); this.builder.externalTransition().from(NettyNetworkChannelState.DISCONNECTING).to(NettyNetworkChannelState.CLOSING).on(NettyNetworkChannelEvent.CLOSE); this.builder.onExit(NettyNetworkChannelState.DISCONNECTING).callMethod("exitDisconnecting"); this.builder.onEntry(NettyNetworkChannelState.CLOSING).callMethod("enterClosing"); this.builder.externalTransition().from(NettyNetworkChannelState.CLOSING).to(NettyNetworkChannelState.CLOSED).on(NettyNetworkChannelEvent.CLOSED); this.builder.onExit(NettyNetworkChannelState.CLOSING).callMethod("exitClosing"); this.builder.onEntry(NettyNetworkChannelState.CLOSED).callMethod("enterClosed"); this.builder.defineFinalState(NettyNetworkChannelState.CLOSED); } public NettyNetworkChannelFsm build(NettyNetworkChannelGlobalContext context) { return this.builder.newStateMachine(NettyNetworkChannelState.UNINITIALIZED, StateMachineConfiguration.getInstance().enableDebugMode(false), context); } }