/**
* Start time:11:12:08 2009-08-19<br>
* Project: diameter-parent-release<br>
*
* @author <a href="mailto:baranowb@gmail.com">Bartosz Baranowski </a>
*/
package org.mobicents.slee.resource.diameter.cxdx.handlers;
import static org.mobicents.slee.resource.diameter.cxdx.handlers.CxDxSessionCreationListener.*;
import org.apache.log4j.Logger;
import org.jdiameter.api.Answer;
import org.jdiameter.api.ApplicationId;
import org.jdiameter.api.IllegalDiameterStateException;
import org.jdiameter.api.InternalException;
import org.jdiameter.api.OverloadException;
import org.jdiameter.api.Request;
import org.jdiameter.api.RouteException;
import org.jdiameter.api.SessionFactory;
import org.jdiameter.api.app.AppAnswerEvent;
import org.jdiameter.api.app.AppRequestEvent;
import org.jdiameter.api.app.AppSession;
import org.jdiameter.api.app.StateChangeListener;
import org.jdiameter.api.cxdx.ClientCxDxSession;
import org.jdiameter.api.cxdx.ClientCxDxSessionListener;
import org.jdiameter.api.cxdx.ServerCxDxSession;
import org.jdiameter.api.cxdx.ServerCxDxSessionListener;
import org.jdiameter.api.cxdx.events.JLocationInfoAnswer;
import org.jdiameter.api.cxdx.events.JLocationInfoRequest;
import org.jdiameter.api.cxdx.events.JMultimediaAuthAnswer;
import org.jdiameter.api.cxdx.events.JMultimediaAuthRequest;
import org.jdiameter.api.cxdx.events.JPushProfileAnswer;
import org.jdiameter.api.cxdx.events.JPushProfileRequest;
import org.jdiameter.api.cxdx.events.JRegistrationTerminationAnswer;
import org.jdiameter.api.cxdx.events.JRegistrationTerminationRequest;
import org.jdiameter.api.cxdx.events.JServerAssignmentAnswer;
import org.jdiameter.api.cxdx.events.JServerAssignmentRequest;
import org.jdiameter.api.cxdx.events.JUserAuthorizationAnswer;
import org.jdiameter.api.cxdx.events.JUserAuthorizationRequest;
import org.jdiameter.client.impl.app.cxdx.CxDxClientSessionImpl;
import org.jdiameter.common.api.app.IAppSessionFactory;
import org.jdiameter.common.api.app.cxdx.ICxDxMessageFactory;
import org.jdiameter.common.impl.app.cxdx.JLocationInfoAnswerImpl;
import org.jdiameter.common.impl.app.cxdx.JLocationInfoRequestImpl;
import org.jdiameter.common.impl.app.cxdx.JMultimediaAuthAnswerImpl;
import org.jdiameter.common.impl.app.cxdx.JMultimediaAuthRequestImpl;
import org.jdiameter.common.impl.app.cxdx.JPushProfileAnswerImpl;
import org.jdiameter.common.impl.app.cxdx.JPushProfileRequestImpl;
import org.jdiameter.common.impl.app.cxdx.JRegistrationTerminationAnswerImpl;
import org.jdiameter.common.impl.app.cxdx.JRegistrationTerminationRequestImpl;
import org.jdiameter.common.impl.app.cxdx.JServerAssignmentAnswerImpl;
import org.jdiameter.common.impl.app.cxdx.JServerAssignmentRequestImpl;
import org.jdiameter.common.impl.app.cxdx.JUserAuthorizationAnswerImpl;
import org.jdiameter.common.impl.app.cxdx.JUserAuthorizationRequestImpl;
import org.jdiameter.server.impl.app.cxdx.CxDxServerSessionImpl;
/**
* Start time:11:12:08 2009-08-19<br>
* Project: diameter-parent-release<br>
*
* @author <a href="mailto:baranowb@gmail.com">Bartosz Baranowski
* </a>
*/
public class CxDxSessionFactory implements IAppSessionFactory, ServerCxDxSessionListener,ClientCxDxSessionListener, StateChangeListener, ICxDxMessageFactory{
private CxDxSessionCreationListener cxDxResourceAdaptor;
private long messageTimeout;
private SessionFactory sessionFactory;
private static final Logger log = Logger.getLogger(CxDxSessionFactory.class);
public CxDxSessionFactory(CxDxSessionCreationListener cxDxResourceAdaptor, long messageTimeout, SessionFactory sessionFactory) {
super();
this.cxDxResourceAdaptor = cxDxResourceAdaptor;
this.messageTimeout = messageTimeout;
this.sessionFactory = sessionFactory;
}
/* (non-Javadoc)
* @see org.jdiameter.common.api.app.IAppSessionFactory#getNewSession(java.lang.String, java.lang.Class, org.jdiameter.api.ApplicationId, java.lang.Object[])
*/
public AppSession getNewSession(String sessionId, Class<? extends AppSession> appSessionClass, ApplicationId applicationId, Object[] args) {
AppSession appSession = null;
if(appSessionClass == ClientCxDxSession.class)
{
CxDxClientSessionImpl clientSession = null;
if (args != null && args.length > 0 && args[0] instanceof Request) {
Request request = (Request) args[0];
clientSession = new CxDxClientSessionImpl(request.getSessionId(),this,this.sessionFactory,this);
}else
{
clientSession = new CxDxClientSessionImpl(sessionId,this,this.sessionFactory,this);
}
clientSession.getSessions().get(0).setRequestListener(clientSession);
clientSession.addStateChangeNotification(this);
this.cxDxResourceAdaptor.sessionCreated(clientSession);
appSession = clientSession;
}else if(appSessionClass == ServerCxDxSession.class)
{
org.jdiameter.server.impl.app.cxdx.CxDxServerSessionImpl serverSession = null;
if (args != null && args.length > 0 && args[0] instanceof Request) {
// This shouldnt happen but just in case
Request request = (Request) args[0];
serverSession = new org.jdiameter.server.impl.app.cxdx.CxDxServerSessionImpl(request.getSessionId(), this, sessionFactory, this);
} else {
serverSession = new org.jdiameter.server.impl.app.cxdx.CxDxServerSessionImpl(sessionId, this, sessionFactory, this);
}
serverSession.addStateChangeNotification(this);
serverSession.getSessions().get(0).setRequestListener(serverSession);
this.cxDxResourceAdaptor.sessionCreated(serverSession);
appSession = serverSession;
} else {
throw new IllegalArgumentException("Wrong session class!![" + appSessionClass + "]. Supported[" + ServerCxDxSession.class + "," + ClientCxDxSession.class + "]");
}
return appSession;
}
/* (non-Javadoc)
* @see org.jdiameter.api.cxdx.ServerCxDxSessionListener#doLocationInformationRequest(org.jdiameter.api.cxdx.ServerCxDxSession, org.jdiameter.api.cxdx.events.JLocationInfoRequest, org.jdiameter.api.cxdx.events.JLocationInfoAnswer)
*/
public void doLocationInformationRequest(ServerCxDxSession session, JLocationInfoRequest request, JLocationInfoAnswer answer) throws InternalException, IllegalDiameterStateException,
RouteException, OverloadException {
this.cxDxResourceAdaptor.fireEvent(session.getSessions().get(0).getSessionId(),_LocationInfoRequest , (Request)request.getMessage(), null);
}
/* (non-Javadoc)
* @see org.jdiameter.api.cxdx.ServerCxDxSessionListener#doMultimediaAuthRequest(org.jdiameter.api.cxdx.ServerCxDxSession, org.jdiameter.api.cxdx.events.JMultimediaAuthRequest, org.jdiameter.api.cxdx.events.JMultimediaAuthAnswer)
*/
public void doMultimediaAuthRequest(ServerCxDxSession session, JMultimediaAuthRequest request, JMultimediaAuthAnswer answer) throws InternalException, IllegalDiameterStateException,
RouteException, OverloadException {
this.cxDxResourceAdaptor.fireEvent(session.getSessions().get(0).getSessionId(),_MultimediaAuthenticationRequest , (Request)request.getMessage(), null);
}
/* (non-Javadoc)
* @see org.jdiameter.api.cxdx.ServerCxDxSessionListener#doOtherEvent(org.jdiameter.api.app.AppSession, org.jdiameter.api.app.AppRequestEvent, org.jdiameter.api.app.AppAnswerEvent)
*/
public void doOtherEvent(AppSession appSession, AppRequestEvent request, AppAnswerEvent answer) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException {
if (answer != null) {
if(answer.getMessage().isError())
{
this.cxDxResourceAdaptor.fireEvent(appSession.getSessions().get(0).getSessionId(), _ErrorAnswer, null, (Answer) answer.getMessage());
}else
{
this.cxDxResourceAdaptor.fireEvent(appSession.getSessions().get(0).getSessionId(), _ExtensionDiameterMessage, null, (Answer) answer.getMessage());
}
} else {
this.cxDxResourceAdaptor.fireEvent(appSession.getSessions().get(0).getSessionId(), _ExtensionDiameterMessage, (Request) request.getMessage(), null);
}
}
/* (non-Javadoc)
* @see org.jdiameter.api.cxdx.ServerCxDxSessionListener#doPushProfileAnswer(org.jdiameter.api.cxdx.ServerCxDxSession, org.jdiameter.api.cxdx.events.JPushProfileRequest, org.jdiameter.api.cxdx.events.JPushProfileAnswer)
*/
public void doPushProfileAnswer(ServerCxDxSession session, JPushProfileRequest request, JPushProfileAnswer answer) throws InternalException, IllegalDiameterStateException, RouteException,
OverloadException {
this.cxDxResourceAdaptor.fireEvent(session.getSessions().get(0).getSessionId(),_PushProfileAnswer , null, (Answer) answer.getMessage());
}
/* (non-Javadoc)
* @see org.jdiameter.api.cxdx.ServerCxDxSessionListener#doRegistrationTerminationAnswer(org.jdiameter.api.cxdx.ServerCxDxSession, org.jdiameter.api.cxdx.events.JRegistrationTerminationRequest, org.jdiameter.api.cxdx.events.JRegistrationTerminationAnswer)
*/
public void doRegistrationTerminationAnswer(ServerCxDxSession session, JRegistrationTerminationRequest request, JRegistrationTerminationAnswer answer) throws InternalException,
IllegalDiameterStateException, RouteException, OverloadException {
this.cxDxResourceAdaptor.fireEvent(session.getSessions().get(0).getSessionId(),_RegistrationTerminationAnswer , null, (Answer) answer.getMessage());
}
/* (non-Javadoc)
* @see org.jdiameter.api.cxdx.ServerCxDxSessionListener#doServerAssignmentRequest(org.jdiameter.api.cxdx.ServerCxDxSession, org.jdiameter.api.cxdx.events.JServerAssignmentRequest, org.jdiameter.api.cxdx.events.JServerAssignmentAnswer)
*/
public void doServerAssignmentRequest(ServerCxDxSession session, JServerAssignmentRequest request, JServerAssignmentAnswer answer) throws InternalException, IllegalDiameterStateException,
RouteException, OverloadException {
this.cxDxResourceAdaptor.fireEvent(session.getSessions().get(0).getSessionId(),_ServerAssignmentRequest , (Request)request.getMessage(), null);
}
/* (non-Javadoc)
* @see org.jdiameter.api.cxdx.ServerCxDxSessionListener#doUserAuthorizationRequest(org.jdiameter.api.cxdx.ServerCxDxSession, org.jdiameter.api.cxdx.events.JUserAuthorizationRequest, org.jdiameter.api.cxdx.events.JUserAuthorizationAnswer)
*/
public void doUserAuthorizationRequest(ServerCxDxSession session, JUserAuthorizationRequest request, JUserAuthorizationAnswer answer) throws InternalException, IllegalDiameterStateException,
RouteException, OverloadException {
this.cxDxResourceAdaptor.fireEvent(session.getSessions().get(0).getSessionId(),_UserAuthorizationRequest , (Request)request.getMessage(), null);
}
/* (non-Javadoc)
* @see org.jdiameter.api.cxdx.ClientCxDxSessionListener#doLocationInformationAnswer(org.jdiameter.api.cxdx.ClientCxDxSession, org.jdiameter.api.cxdx.events.JLocationInfoRequest, org.jdiameter.api.cxdx.events.JLocationInfoAnswer)
*/
public void doLocationInformationAnswer(ClientCxDxSession session, JLocationInfoRequest request, JLocationInfoAnswer answer) throws InternalException, IllegalDiameterStateException,
RouteException, OverloadException {
this.cxDxResourceAdaptor.fireEvent(session.getSessions().get(0).getSessionId(),_LocationInfoAnswer , null, (Answer) answer.getMessage());
}
/* (non-Javadoc)
* @see org.jdiameter.api.cxdx.ClientCxDxSessionListener#doMultimediaAuthAnswer(org.jdiameter.api.cxdx.ClientCxDxSession, org.jdiameter.api.cxdx.events.JMultimediaAuthRequest, org.jdiameter.api.cxdx.events.JMultimediaAuthAnswer)
*/
public void doMultimediaAuthAnswer(ClientCxDxSession session, JMultimediaAuthRequest request, JMultimediaAuthAnswer answer) throws InternalException, IllegalDiameterStateException,
RouteException, OverloadException {
this.cxDxResourceAdaptor.fireEvent(session.getSessions().get(0).getSessionId(),_MultimediaAuthenticationAnswer , null, (Answer) answer.getMessage());
}
/* (non-Javadoc)
* @see org.jdiameter.api.cxdx.ClientCxDxSessionListener#doPushProfileRequest(org.jdiameter.api.cxdx.ClientCxDxSession, org.jdiameter.api.cxdx.events.JPushProfileRequest, org.jdiameter.api.cxdx.events.JPushProfileAnswer)
*/
public void doPushProfileRequest(ClientCxDxSession session, JPushProfileRequest request, JPushProfileAnswer answer) throws InternalException, IllegalDiameterStateException, RouteException,
OverloadException {
this.cxDxResourceAdaptor.fireEvent(session.getSessions().get(0).getSessionId(),_PushProfileRequest , (Request)request.getMessage(), null);
}
/* (non-Javadoc)
* @see org.jdiameter.api.cxdx.ClientCxDxSessionListener#doRegistrationTerminationRequest(org.jdiameter.api.cxdx.ClientCxDxSession, org.jdiameter.api.cxdx.events.JRegistrationTerminationRequest, org.jdiameter.api.cxdx.events.JRegistrationTerminationAnswer)
*/
public void doRegistrationTerminationRequest(ClientCxDxSession session, JRegistrationTerminationRequest request, JRegistrationTerminationAnswer answer) throws InternalException,
IllegalDiameterStateException, RouteException, OverloadException {
this.cxDxResourceAdaptor.fireEvent(session.getSessions().get(0).getSessionId(),_RegistrationTerminationRequest , (Request)request.getMessage(), null);
}
/* (non-Javadoc)
* @see org.jdiameter.api.cxdx.ClientCxDxSessionListener#doServerAssignmentAnswer(org.jdiameter.api.cxdx.ClientCxDxSession, org.jdiameter.api.cxdx.events.JServerAssignmentRequest, org.jdiameter.api.cxdx.events.JServerAssignmentAnswer)
*/
public void doServerAssignmentAnswer(ClientCxDxSession session, JServerAssignmentRequest request, JServerAssignmentAnswer answer) throws InternalException, IllegalDiameterStateException,
RouteException, OverloadException {
this.cxDxResourceAdaptor.fireEvent(session.getSessions().get(0).getSessionId(),_ServerAssignmentAnswer , null, (Answer) answer.getMessage());
}
/* (non-Javadoc)
* @see org.jdiameter.api.cxdx.ClientCxDxSessionListener#doUserAuthorizationAnswer(org.jdiameter.api.cxdx.ClientCxDxSession, org.jdiameter.api.cxdx.events.JUserAuthorizationRequest, org.jdiameter.api.cxdx.events.JUserAuthorizationAnswer)
*/
public void doUserAuthorizationAnswer(ClientCxDxSession session, JUserAuthorizationRequest request, JUserAuthorizationAnswer answer) throws InternalException, IllegalDiameterStateException,
RouteException, OverloadException {
this.cxDxResourceAdaptor.fireEvent(session.getSessions().get(0).getSessionId(),_UserAuthorizationAnswer , null, (Answer) answer.getMessage());
}
/* (non-Javadoc)
* @see org.jdiameter.api.app.StateChangeListener#stateChanged(java.lang.Enum, java.lang.Enum)
*/
public void stateChanged(Enum oldState, Enum newState) {
log.info("Diameter CxDx SessionFactory :: stateChanged :: oldState[" + oldState + "], newState[" + newState + "]");
//FIXME: add code here.
}
/* (non-Javadoc)
* @see org.jdiameter.common.api.app.cxdx.ICxDxMessageFactory#createLocationInfoAnswer(org.jdiameter.api.Answer)
*/
public AppAnswerEvent createLocationInfoAnswer(Answer answer) {
return new JLocationInfoAnswerImpl(answer);
}
/* (non-Javadoc)
* @see org.jdiameter.common.api.app.cxdx.ICxDxMessageFactory#createLocationInfoRequest(org.jdiameter.api.Request)
*/
public AppRequestEvent createLocationInfoRequest(Request request) {
return new JLocationInfoRequestImpl(request);
}
/* (non-Javadoc)
* @see org.jdiameter.common.api.app.cxdx.ICxDxMessageFactory#createMultimediaAuthAnswer(org.jdiameter.api.Answer)
*/
public AppAnswerEvent createMultimediaAuthAnswer(Answer answer) {
return new JMultimediaAuthAnswerImpl(answer);
}
/* (non-Javadoc)
* @see org.jdiameter.common.api.app.cxdx.ICxDxMessageFactory#createMultimediaAuthRequest(org.jdiameter.api.Request)
*/
public AppRequestEvent createMultimediaAuthRequest(Request request) {
return new JMultimediaAuthRequestImpl(request);
}
/* (non-Javadoc)
* @see org.jdiameter.common.api.app.cxdx.ICxDxMessageFactory#createPushProfileAnswer(org.jdiameter.api.Answer)
*/
public AppAnswerEvent createPushProfileAnswer(Answer answer) {
return new JPushProfileAnswerImpl(answer);
}
/* (non-Javadoc)
* @see org.jdiameter.common.api.app.cxdx.ICxDxMessageFactory#createPushProfileRequest(org.jdiameter.api.Request)
*/
public AppRequestEvent createPushProfileRequest(Request request) {
// TODO Auto-generated method stub
return new JPushProfileRequestImpl(request);
}
/* (non-Javadoc)
* @see org.jdiameter.common.api.app.cxdx.ICxDxMessageFactory#createRegistrationTerminationAnswer(org.jdiameter.api.Answer)
*/
public AppAnswerEvent createRegistrationTerminationAnswer(Answer answer) {
return new JRegistrationTerminationAnswerImpl(answer);
}
/* (non-Javadoc)
* @see org.jdiameter.common.api.app.cxdx.ICxDxMessageFactory#createRegistrationTerminationRequest(org.jdiameter.api.Request)
*/
public AppRequestEvent createRegistrationTerminationRequest(Request request) {
return new JRegistrationTerminationRequestImpl(request);
}
/* (non-Javadoc)
* @see org.jdiameter.common.api.app.cxdx.ICxDxMessageFactory#createServerAssignmentAnswer(org.jdiameter.api.Answer)
*/
public AppAnswerEvent createServerAssignmentAnswer(Answer answer) {
return new JServerAssignmentAnswerImpl(answer);
}
/* (non-Javadoc)
* @see org.jdiameter.common.api.app.cxdx.ICxDxMessageFactory#createServerAssignmentRequest(org.jdiameter.api.Request)
*/
public AppRequestEvent createServerAssignmentRequest(Request request) {
return new JServerAssignmentRequestImpl(request);
}
/* (non-Javadoc)
* @see org.jdiameter.common.api.app.cxdx.ICxDxMessageFactory#createUserAuthorizationAnswer(org.jdiameter.api.Answer)
*/
public AppAnswerEvent createUserAuthorizationAnswer(Answer answer) {
return new JUserAuthorizationAnswerImpl(answer);
}
/* (non-Javadoc)
* @see org.jdiameter.common.api.app.cxdx.ICxDxMessageFactory#createUserAuthorizationRequest(org.jdiameter.api.Request)
*/
public AppRequestEvent createUserAuthorizationRequest(Request request) {
return new JUserAuthorizationRequestImpl(request);
}
/* (non-Javadoc)
* @see org.jdiameter.common.api.app.cxdx.ICxDxMessageFactory#getApplicationId()
*/
public long getApplicationId() {
//FIXME: ??
return 16777216;
}
}