package org.jdiameter.common.impl.app.sh; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import org.jdiameter.api.Answer; import org.jdiameter.api.NetworkReqListener; import org.jdiameter.api.Request; import org.jdiameter.api.acc.events.AccountAnswer; import org.jdiameter.api.acc.events.AccountRequest; import org.jdiameter.api.app.StateChangeListener; import org.jdiameter.api.app.StateMachine; import org.jdiameter.common.impl.app.AppSessionImpl; import org.jdiameter.common.impl.app.acc.AccountAnswerImpl; import org.jdiameter.common.impl.app.acc.AccountRequestImpl; public abstract class ShSession extends AppSessionImpl implements NetworkReqListener, StateMachine { private static final long serialVersionUID = 1L; protected Lock sendAndStateLock = new ReentrantLock(); protected static final ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(4); protected List<StateChangeListener> stateListeners = new CopyOnWriteArrayList<StateChangeListener>(); public void addStateChangeNotification(StateChangeListener listener) { if (!stateListeners.contains(listener)) { stateListeners.add(listener); } } public void removeStateChangeNotification(StateChangeListener listener) { stateListeners.remove(listener); } protected AccountRequest createAccountRequest(Request request) { return new AccountRequestImpl(request); } protected AccountAnswer createAccountAnswer(Answer answer) { return new AccountAnswerImpl(answer); } public void release() { //scheduler.shutdown(); super.release(); } }