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();
}
}