PageRenderTime 13ms CodeModel.GetById 1ms app.highlight 7ms RepoModel.GetById 1ms app.codeStats 1ms

/protocols/ss7/m3ua/impl/src/main/java/org/mobicents/protocols/ss7/m3ua/impl/as/AsStatePenTimeout.java

http://mobicents.googlecode.com/
Java | 105 lines | 45 code | 13 blank | 47 comment | 5 complexity | 215fa9acf0daca4b0082648684e6eff3 MD5 | raw file
  1/*
  2 * JBoss, Home of Professional Open Source
  3 * Copyright 2011, Red Hat, Inc. and individual contributors
  4 * by the @authors tag. See the copyright.txt in the distribution for a
  5 * full listing of individual contributors.
  6 *
  7 * This is free software; you can redistribute it and/or modify it
  8 * under the terms of the GNU Lesser General Public License as
  9 * published by the Free Software Foundation; either version 2.1 of
 10 * the License, or (at your option) any later version.
 11 *
 12 * This software is distributed in the hope that it will be useful,
 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 15 * Lesser General Public License for more details.
 16 *
 17 * You should have received a copy of the GNU Lesser General Public
 18 * License along with this software; if not, write to the Free
 19 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 20 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 21 */
 22
 23package org.mobicents.protocols.ss7.m3ua.impl.as;
 24
 25import javolution.util.FastList;
 26
 27import org.apache.log4j.Logger;
 28import org.mobicents.protocols.ss7.m3ua.impl.Asp;
 29import org.mobicents.protocols.ss7.m3ua.impl.AspState;
 30import org.mobicents.protocols.ss7.m3ua.impl.TransitionState;
 31import org.mobicents.protocols.ss7.m3ua.impl.fsm.FSM;
 32import org.mobicents.protocols.ss7.m3ua.impl.fsm.State;
 33import org.mobicents.protocols.ss7.m3ua.impl.fsm.StateEventHandler;
 34import org.mobicents.protocols.ss7.m3ua.impl.fsm.UnknownTransitionException;
 35
 36/**
 37 * {@link AsStatePenTimeout#onEvent(State)} is called when the pending timer
 38 * T(r) expires.
 39 * 
 40 * @author amit bhayani
 41 *
 42 */
 43public class AsStatePenTimeout implements StateEventHandler {
 44
 45    private AsImpl as;
 46    private FSM fsm;
 47    private static final Logger logger = Logger.getLogger(AsStatePenTimeout.class);
 48
 49    boolean inactive = false;
 50
 51    public AsStatePenTimeout(AsImpl as, FSM fsm) {
 52        this.as = as;
 53        this.fsm = fsm;
 54    }
 55
 56	/**
 57	 * <p>
 58	 * An active ASP has transitioned to ASP-INACTIVE or ASP DOWN and it was the
 59	 * last remaining active ASP in the AS. A recovery timer T(r) SHOULD be
 60	 * started, and all incoming signalling messages SHOULD be queued by the
 61	 * SGP. If an ASP becomes ASP-ACTIVE before T(r) expires, the AS is moved to
 62	 * the AS-ACTIVE state, and all the queued messages will be sent to the ASP.
 63	 * </p>
 64	 * <p>
 65	 * If T(r) expires before an ASP becomes ASP-ACTIVE, and the SGP has no
 66	 * alternative, the SGP may stop queuing messages and discard all previously
 67	 * queued messages. The AS will move to the AS-INACTIVE state if at least
 68	 * one ASP is in ASP-INACTIVE; otherwise, it will move to AS-DOWN state.
 69	 * </p>
 70	 */
 71    public void onEvent(State state) {
 72    	
 73		//Clear the Pending Queue for this As
 74		this.as.clearPendingQueue();
 75		
 76        this.inactive = false;
 77        // check if there are any ASP's who are INACTIVE, transition to
 78        // INACTIVE else DOWN
 79        for (FastList.Node<Asp> n = this.as.getAspList().head(), end = this.as.getAspList().tail(); (n = n
 80                .getNext()) != end;) {
 81            Asp asp = n.getValue();
 82            if (asp.getState() == AspState.INACTIVE) {
 83                try {
 84                    this.fsm.signal(TransitionState.AS_INACTIVE);
 85                    inactive = true;
 86                    break;
 87                } catch (UnknownTransitionException e) {
 88                	logger.error(e.getMessage(), e);
 89                }
 90
 91            }// if
 92        }// for
 93
 94        if (!this.inactive) {
 95            // else transition to DOWN
 96            try {
 97                this.fsm.signal(TransitionState.AS_DOWN);
 98                inactive = true;
 99            } catch (UnknownTransitionException e) {
100            	logger.error(e.getMessage(), e);
101            }
102        }
103    }
104
105}