package org.jdiameter.client.impl;
/*
* Copyright (c) 2006 jDiameter.
* https://jdiameter.dev.java.net/
*
* License: GPL v3
*
* e-mail: erick.svenson@yahoo.com
*
*/
import org.jdiameter.api.*;
import org.jdiameter.client.api.IContainer;
import org.jdiameter.client.api.IMessage;
import org.jdiameter.client.api.IRequest;
import org.jdiameter.client.api.ISession;
import org.jdiameter.client.api.parser.IMessageParser;
import java.util.concurrent.TimeUnit;
public class SessionImpl extends BaseSessionImpl implements ISession {
private static final long serialVersionUID = 1L;
SessionImpl(IContainer container) {
setContainer(container);
sessionId = generateSessionId();
}
void setContainer(IContainer container) {
this.container = container;
this.parser = (IMessageParser) container.getAssemblerFacility().getComponentInstance(IMessageParser.class);
}
public String getSessionId() {
return sessionId;
}
public void send(Message message, EventListener<Request, Answer> listener) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException {
genericSend(message, listener);
}
public void send(Message message, EventListener<Request, Answer> listener, long timeout, TimeUnit timeUnit) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException {
genericSend(message, listener, timeout, timeUnit);
}
public void setRequestListener(NetworkReqListener listener) {
if (listener != null) {
this.reqListener = listener;
container.addSessionListener(sessionId, listener);
}
}
public NetworkReqListener getReqListener() {
return reqListener;
}
public Request createRequest(int commandCode, ApplicationId appId, String destRealm) {
if ( isValid ) {
lastAccessedTime = System.currentTimeMillis();
IRequest m = parser.createEmptyMessage(IRequest.class, commandCode, getAppId(appId));
m.setNetworkRequest(false);
m.setRequest(true);
m.getAvps().addAvp(Avp.SESSION_ID, sessionId, true, false, false);
appendAppId(appId, m);
if (destRealm != null) {
m.getAvps().addAvp(Avp.DESTINATION_REALM, destRealm, true, false, true);
}
return m;
}
else {
throw new IllegalAccessError("Session already released");
}
}
public Request createRequest(int commandCode, ApplicationId appId, String destRealm, String destHost) {
if ( isValid ) {
lastAccessedTime = System.currentTimeMillis();
IRequest m = parser.createEmptyMessage(IRequest.class, commandCode, getAppId(appId));
m.setNetworkRequest(false);
m.setRequest(true);
m.getAvps().addAvp(Avp.SESSION_ID, sessionId, true, false, false);
appendAppId(appId, m);
if (destRealm != null) {
m.getAvps().addAvp(Avp.DESTINATION_REALM, destRealm, true, false, true);
}
if (destHost != null) {
m.getAvps().addAvp(Avp.DESTINATION_HOST, destHost, true, false, true);
}
return m;
}
else {
throw new IllegalAccessError("Session already released");
}
}
public Request createRequest(Request prevRequest) {
if ( isValid ) {
lastAccessedTime = System.currentTimeMillis();
IRequest request = parser.createEmptyMessage(Request.class, (IMessage) prevRequest);
request.setRequest(true);
request.setNetworkRequest(false);
return request;
}
else {
throw new IllegalAccessError("Session already released");
}
}
public void release() {
isValid = false;
if (container != null) {
container.removeSessionListener(sessionId);
}
container = null;
parser = null;
reqListener = null;
}
public boolean isWrapperFor(Class<?> iface) throws InternalException {
return iface == RawSession.class;
}
public <T> T unwrap(Class<T> iface) throws InternalException {
return (T) (iface == RawSession.class ? new RawSessionImpl(container) : null);
}
}