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.parser.IMessageParser;
import java.util.concurrent.TimeUnit;
public class RawSessionImpl extends BaseSessionImpl implements RawSession {
RawSessionImpl(IContainer stack) {
container = stack;
this.parser = (IMessageParser) container.getAssemblerFacility().
getComponentInstance(IMessageParser.class);
}
public Message createMessage(int commandCode, ApplicationId appId, Avp... avps) {
if ( isValid ) {
lastAccessedTime = System.currentTimeMillis();
IMessage m = parser.createEmptyMessage(commandCode, getAppId(appId));
m.getAvps().addAvp(avps);
appendAppId(appId, m);
return m;
} else {
throw new IllegalAccessError("Session already released");
}
}
public Message createMessage(int commandCode, ApplicationId appId, long hopByHopIdentifier, long endToEndIdentifier, Avp... avps) {
if ( isValid ) {
lastAccessedTime = System.currentTimeMillis();
IMessage m = parser.createEmptyMessage(commandCode, getAppId(appId));
if (hopByHopIdentifier >= 0)
m.setHopByHopIdentifier(-hopByHopIdentifier);
if (endToEndIdentifier >=0)
m.setEndToEndIdentifier(endToEndIdentifier);
m.getAvps().addAvp(avps);
appendAppId(appId, m);
return m;
} else {
throw new IllegalAccessError("Session already released");
}
}
public Message createMessage(Message message, boolean copyAvps) {
if ( isValid ) {
lastAccessedTime = System.currentTimeMillis();
IMessage newMessage = null;
IMessage inner = (IMessage) message;
if (copyAvps) {
newMessage = parser.createEmptyMessage(inner);
} else {
newMessage = (IMessage) createMessage(
inner.getCommandCode(),
inner.getSingleApplicationId(),
-1,
-1
);
}
newMessage.setRequest(message.isRequest());
newMessage.setProxiable(message.isProxiable());
newMessage.setError(message.isError());
newMessage.setReTransmitted(message.isReTransmitted());
return newMessage;
} else {
throw new IllegalAccessError("Session already released");
}
}
public void send(Message message, EventListener<Message, Message> listener) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException {
genericSend(message, listener);
}
public void send(Message message, EventListener<Message, Message> listener, long timeOut, TimeUnit timeUnit) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException {
genericSend(message, listener, timeOut, timeUnit);
}
public void release() {
isValid = false;
container = null;
parser = null;
}
public boolean isWrapperFor(Class<?> iface) throws InternalException {
return iface == Session.class;
}
public <T> T unwrap(Class<T> iface) throws InternalException {
return (T) (iface == Session.class ? new SessionImpl(container) : null);
}
}