package org.jdiameter.common.impl.app.cxdx; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Future; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import org.jdiameter.api.NetworkReqListener; import org.jdiameter.api.app.StateChangeListener; import org.jdiameter.api.app.StateMachine; import org.jdiameter.common.api.app.cxdx.CxDxSessionState; import org.jdiameter.common.api.app.cxdx.ICxDxMessageFactory; import org.jdiameter.common.impl.app.AppSessionImpl; /** * Start time:15:18:44 2009-08-17<br> * Project: diameter-parent<br> * * @author <a href="mailto:baranowb@gmail.com">Bartosz Baranowski </a> * @author <a href="mailto:brainslog@gmail.com"> Alexandre Mendonca </a> */ public abstract class CxDxSession extends AppSessionImpl implements NetworkReqListener, StateMachine { private static final long serialVersionUID = 1L; public static final int _TX_TIMEOUT=30*1000; protected Lock sendAndStateLock = new ReentrantLock(); protected static final ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(4); protected List<StateChangeListener> stateListeners = new CopyOnWriteArrayList<StateChangeListener>(); protected CxDxSessionState state = CxDxSessionState.IDLE; protected Future timeoutTaskFuture; protected ICxDxMessageFactory messageFactory; public CxDxSession() { super(); } public void addStateChangeNotification(StateChangeListener listener) { if (!stateListeners.contains(listener)) { stateListeners.add(listener); } } public void removeStateChangeNotification(StateChangeListener listener) { stateListeners.remove(listener); } /* * (non-Javadoc) * * @see org.jdiameter.api.app.AppSession#isStateless() */ public boolean isStateless() { //Right? return true; } }