package org.mobicents.slee.resource.diameter.cxdx; import java.io.IOException; import java.util.ArrayList; import javax.slee.resource.SleeEndpoint; import net.java.slee.resource.diameter.base.events.DiameterMessage; import net.java.slee.resource.diameter.base.events.avp.AvpNotAllowedException; import net.java.slee.resource.diameter.base.events.avp.DiameterAvp; import net.java.slee.resource.diameter.base.events.avp.DiameterIdentity; import net.java.slee.resource.diameter.cxdx.CxDxAVPFactory; import net.java.slee.resource.diameter.cxdx.CxDxMessageFactory; import net.java.slee.resource.diameter.cxdx.CxDxServerSession; import net.java.slee.resource.diameter.cxdx.events.LocationInfoAnswer; import net.java.slee.resource.diameter.cxdx.events.LocationInfoRequest; import net.java.slee.resource.diameter.cxdx.events.MultimediaAuthenticationAnswer; import net.java.slee.resource.diameter.cxdx.events.MultimediaAuthenticationRequest; import net.java.slee.resource.diameter.cxdx.events.PushProfileRequest; import net.java.slee.resource.diameter.cxdx.events.RegistrationTerminationAnswer; import net.java.slee.resource.diameter.cxdx.events.RegistrationTerminationRequest; import net.java.slee.resource.diameter.cxdx.events.ServerAssignmentAnswer; import net.java.slee.resource.diameter.cxdx.events.ServerAssignmentRequest; import net.java.slee.resource.diameter.cxdx.events.UserAuthorizationAnswer; import net.java.slee.resource.diameter.cxdx.events.UserAuthorizationRequest; import org.jdiameter.api.Answer; import org.jdiameter.api.EventListener; import org.jdiameter.api.IllegalDiameterStateException; import org.jdiameter.api.InternalException; import org.jdiameter.api.Message; import org.jdiameter.api.OverloadException; import org.jdiameter.api.Request; import org.jdiameter.api.RouteException; import org.jdiameter.api.Session; import org.jdiameter.api.Stack; import org.jdiameter.api.cxdx.ServerCxDxSession; import org.jdiameter.common.api.app.cxdx.CxDxSessionState; import org.jdiameter.common.impl.app.cxdx.JLocationInfoAnswerImpl; import org.jdiameter.common.impl.app.cxdx.JMultimediaAuthAnswerImpl; import org.jdiameter.common.impl.app.cxdx.JPushProfileRequestImpl; import org.jdiameter.common.impl.app.cxdx.JRegistrationTerminationRequestImpl; import org.jdiameter.common.impl.app.cxdx.JServerAssignmentAnswerImpl; import org.jdiameter.common.impl.app.cxdx.JUserAuthorizationAnswerImpl; import org.jdiameter.common.impl.app.cxdx.JUserAuthorizationRequestImpl; import org.jdiameter.common.impl.validation.JAvpNotAllowedException; import org.mobicents.slee.resource.diameter.base.events.DiameterMessageImpl; import org.mobicents.slee.resource.diameter.cxdx.events.LocationInfoAnswerImpl; import org.mobicents.slee.resource.diameter.cxdx.events.MultimediaAuthenticationAnswerImpl; import org.mobicents.slee.resource.diameter.cxdx.events.RegistrationTerminationAnswerImpl; import org.mobicents.slee.resource.diameter.cxdx.events.RegistrationTerminationRequestImpl; import org.mobicents.slee.resource.diameter.cxdx.events.ServerAssignmentAnswerImpl; import org.mobicents.slee.resource.diameter.cxdx.events.UserAuthorizationAnswerImpl; /** * * CxDxServerSessionImpl.java * * @author <a href="mailto:brainslog@gmail.com"> Alexandre Mendonca </a> * @author <a href="mailto:baranowb@gmail.com"> Bartosz Baranowski </a> */ public class CxDxServerSessionImpl extends CxDxSessionImpl implements CxDxServerSession { protected ArrayList<DiameterAvp> sessionAvps = new ArrayList<DiameterAvp>(); protected ServerCxDxSession appSession; /** * * @param cxdxMessageFactory * @param cxdxAvpFactory * @param session * @param session2 * @param messageTimeout * @param destinationHost * @param destinationRealm * @param sleeEndpoint * @param stack */ public CxDxServerSessionImpl(CxDxMessageFactory cxdxMessageFactory, CxDxAVPFactory cxdxAvpFactory, ServerCxDxSession session, EventListener<Request, Answer> raEventListener, long messageTimeout, DiameterIdentity destinationHost, DiameterIdentity destinationRealm, SleeEndpoint sleeEndpoint, Stack stack) { super(cxdxMessageFactory, cxdxAvpFactory, session.getSessions().get(0), raEventListener, messageTimeout, destinationHost, destinationRealm, sleeEndpoint); // FIXME: why stack? this.appSession = session; this.appSession.addStateChangeNotification(this); } /* * (non-Javadoc) * * @seenet.java.slee.resource.diameter.cxdx.CxDxServerSession# * createLocationInfoAnswer() */ public LocationInfoAnswer createLocationInfoAnswer() { // Make sure we have the correct type of Request if (!(lastRequest instanceof LocationInfoRequest)) { logger.warn("Invalid type of answer for this activity."); return null; } // Create Request from last received and set it as answer //FIXME: Alex this is prob with ANSWER Message msg = session.createRequest((Request) ((DiameterMessageImpl) lastRequest).getGenericData()); msg.setRequest(false); LocationInfoAnswer lia = new LocationInfoAnswerImpl(msg); // Fill extension avps if present if (sessionAvps.size() > 0) { try { lia.setExtensionAvps(sessionAvps.toArray(new DiameterAvp[sessionAvps.size()])); } catch (AvpNotAllowedException e) { logger.error("Failed to add Session AVPs to request.", e); } } // Guarantee session-id is present if (!lia.hasSessionId()) { lia.setSessionId(sessionId); } return lia; } /* * (non-Javadoc) * * @seenet.java.slee.resource.diameter.cxdx.CxDxServerSession# * createMultimediaAuthenticationAnswer() */ public MultimediaAuthenticationAnswer createMultimediaAuthenticationAnswer() { // Make sure we have the correct type of Request if (!(lastRequest instanceof MultimediaAuthenticationRequest)) { logger.warn("Invalid type of answer for this activity."); return null; } // Create Request from last received and set it as answer Message msg = session.createRequest((Request) ((DiameterMessageImpl) lastRequest).getGenericData()); msg.setRequest(false); MultimediaAuthenticationAnswer maa = new MultimediaAuthenticationAnswerImpl(msg); // Fill extension avps if present if (sessionAvps.size() > 0) { try { maa.setExtensionAvps(sessionAvps.toArray(new DiameterAvp[sessionAvps.size()])); } catch (AvpNotAllowedException e) { logger.error("Failed to add Session AVPs to request.", e); } } // Guarantee session-id is present if (!maa.hasSessionId()) { maa.setSessionId(sessionId); } return maa; } /* * (non-Javadoc) * * @seenet.java.slee.resource.diameter.cxdx.CxDxServerSession# * createPushProfileRequest() */ public PushProfileRequest createPushProfileRequest() { // Create the request PushProfileRequest ppr = super.cxdxMessageFactory.createPushProfileRequest(super.getSessionId()); // If there's a Destination-Host, add the AVP if (destinationHost != null) { ppr.setDestinationHost(destinationHost); } if (destinationRealm != null) { ppr.setDestinationRealm(destinationRealm); } // Fill extension avps if present if (sessionAvps.size() > 0) { try { ppr.setExtensionAvps(sessionAvps.toArray(new DiameterAvp[sessionAvps.size()])); } catch (AvpNotAllowedException e) { logger.error("Failed to add Session AVPs to request.", e); } } return ppr; } /* * (non-Javadoc) * * @seenet.java.slee.resource.diameter.cxdx.CxDxServerSession# * createRegistrationTerminationAnswer() */ public RegistrationTerminationRequest createRegistrationTerminationRequest() { // Make sure we have the correct type of Request // if(!(lastRequest instanceof RegistrationTerminationRequest)) { // logger.warn("Invalid type of answer for this activity."); // return null; // } // Create Request from last received and set it as answer Message msg = session.createRequest((Request) ((DiameterMessageImpl) lastRequest).getGenericData()); msg.setRequest(true); RegistrationTerminationRequest rta = new RegistrationTerminationRequestImpl(msg); // Fill extension avps if present if (sessionAvps.size() > 0) { try { rta.setExtensionAvps(sessionAvps.toArray(new DiameterAvp[sessionAvps.size()])); } catch (AvpNotAllowedException e) { logger.error("Failed to add Session AVPs to request.", e); } } // Guarantee session-id is present if (!rta.hasSessionId()) { rta.setSessionId(sessionId); } return rta; } /* * (non-Javadoc) * * @seenet.java.slee.resource.diameter.cxdx.CxDxServerSession# * createServerAssignmentAnswer() */ public ServerAssignmentAnswer createServerAssignmentAnswer() { // Make sure we have the correct type of Request if (!(lastRequest instanceof ServerAssignmentRequest)) { logger.warn("Invalid type of answer for this activity."); return null; } // Create Request from last received and set it as answer Message msg = session.createRequest((Request) ((DiameterMessageImpl) lastRequest).getGenericData()); msg.setRequest(false); ServerAssignmentAnswer saa = new ServerAssignmentAnswerImpl(msg); // Fill extension avps if present if (sessionAvps.size() > 0) { try { saa.setExtensionAvps(sessionAvps.toArray(new DiameterAvp[sessionAvps.size()])); } catch (AvpNotAllowedException e) { logger.error("Failed to add Session AVPs to request.", e); } } // Guarantee session-id is present if (!saa.hasSessionId()) { saa.setSessionId(sessionId); } return saa; } /* * (non-Javadoc) * * @seenet.java.slee.resource.diameter.cxdx.CxDxServerSession# * createUserAuthorizationAnswer() */ public UserAuthorizationAnswer createUserAuthorizationAnswer() { // Make sure we have the correct type of Request if (!(lastRequest instanceof UserAuthorizationRequest)) { logger.warn("Invalid type of answer for this activity."); return null; } // Create Request from last received and set it as answer Message msg = session.createRequest((Request) ((DiameterMessageImpl) lastRequest).getGenericData()); msg.setRequest(false); UserAuthorizationAnswer uaa = new UserAuthorizationAnswerImpl(msg); // Fill extension avps if present if (sessionAvps.size() > 0) { try { uaa.setExtensionAvps(sessionAvps.toArray(new DiameterAvp[sessionAvps.size()])); } catch (AvpNotAllowedException e) { logger.error("Failed to add Session AVPs to request.", e); } } // Guarantee session-id is present if (!uaa.hasSessionId()) { uaa.setSessionId(sessionId); } return uaa; } /* * (non-Javadoc) * * @see * net.java.slee.resource.diameter.cxdx.CxDxServerSession#sendLocationInfoAnswer * (net.java.slee.resource.diameter.cxdx.events.LocationInfoAnswer) */ public void sendLocationInfoAnswer(LocationInfoAnswer locationInfoAnswer) throws IOException { // sendCxDxMessage(locationInfoAnswer); DiameterMessageImpl msg = (DiameterMessageImpl) locationInfoAnswer; JLocationInfoAnswerImpl answer = new JLocationInfoAnswerImpl(msg.getGenericData()); try { appSession.sendLocationInformationAnswer(answer); } catch (JAvpNotAllowedException anae) { throw new AvpNotAllowedException(anae.getMessage(), anae.getAvpCode(), anae.getVendorId()); } catch (Exception e) { e.printStackTrace(); throw new IOException(e.getMessage()); } } /* * (non-Javadoc) * * @seenet.java.slee.resource.diameter.cxdx.CxDxServerSession# * sendMultimediaAuthenticationAnswer * (net.java.slee.resource.diameter.cxdx.events * .MultimediaAuthenticationAnswer) */ public void sendMultimediaAuthenticationAnswer(MultimediaAuthenticationAnswer multimediaAuthenticationAnswer) throws IOException { // sendCxDxMessage(multimediaAuthenticationAnswer); DiameterMessageImpl msg = (DiameterMessageImpl) multimediaAuthenticationAnswer; JMultimediaAuthAnswerImpl answer = new JMultimediaAuthAnswerImpl(msg.getGenericData()); try { appSession.sendMultimediaAuthAnswer(answer); } catch (JAvpNotAllowedException anae) { throw new AvpNotAllowedException(anae.getMessage(), anae.getAvpCode(), anae.getVendorId()); } catch (Exception e) { e.printStackTrace(); throw new IOException(e.getMessage()); } } /* * (non-Javadoc) * * @see * net.java.slee.resource.diameter.cxdx.CxDxServerSession#sendPushProfileRequest * (net.java.slee.resource.diameter.cxdx.events.PushProfileRequest) */ public void sendPushProfileRequest(PushProfileRequest pushProfileRequest) throws IOException { DiameterMessageImpl msg = (DiameterMessageImpl) pushProfileRequest; JPushProfileRequestImpl request = new JPushProfileRequestImpl(msg.getGenericData()); try { appSession.sendPushProfileRequest(request); } catch (JAvpNotAllowedException anae) { throw new AvpNotAllowedException(anae.getMessage(), anae.getAvpCode(), anae.getVendorId()); } catch (Exception e) { e.printStackTrace(); throw new IOException(e.getMessage()); } } /* * (non-Javadoc) * * @seenet.java.slee.resource.diameter.cxdx.CxDxServerSession# * sendRegistrationTerminationAnswer * (net.java.slee.resource.diameter.cxdx.events * .RegistrationTerminationAnswer) */ public void sendRegistrationTerminationRequest(RegistrationTerminationRequest registrationTerminationRequest) throws IOException { // sendCxDxMessage(registrationTerminationAnswer); DiameterMessageImpl msg = (DiameterMessageImpl) registrationTerminationRequest; JRegistrationTerminationRequestImpl request = new JRegistrationTerminationRequestImpl(msg.getGenericData()); try { appSession.sendRegistrationTerminationRequest(request); } catch (JAvpNotAllowedException anae) { throw new AvpNotAllowedException(anae.getMessage(), anae.getAvpCode(), anae.getVendorId()); } catch (Exception e) { e.printStackTrace(); throw new IOException(e.getMessage()); } } /* * (non-Javadoc) * * @seenet.java.slee.resource.diameter.cxdx.CxDxServerSession# * sendServerAssignmentAnswer * (net.java.slee.resource.diameter.cxdx.events.ServerAssignmentAnswer) */ public void sendServerAssignmentAnswer(ServerAssignmentAnswer serverAssignmentAnswer) throws IOException { // sendCxDxMessage(serverAssignmentAnswer); DiameterMessageImpl msg = (DiameterMessageImpl) serverAssignmentAnswer; JServerAssignmentAnswerImpl answer = new JServerAssignmentAnswerImpl(msg.getGenericData()); try { appSession.sendServerAssignmentAnswer(answer); } catch (JAvpNotAllowedException anae) { throw new AvpNotAllowedException(anae.getMessage(), anae.getAvpCode(), anae.getVendorId()); } catch (Exception e) { e.printStackTrace(); throw new IOException(e.getMessage()); } } /* * (non-Javadoc) * * @seenet.java.slee.resource.diameter.cxdx.CxDxServerSession# * sendUserAuthorizationAnswer * (net.java.slee.resource.diameter.cxdx.events.UserAuthorizationAnswer) */ public void sendUserAuthorizationAnswer(UserAuthorizationAnswer userAuthorizationAnswer) throws IOException { // sendCxDxMessage(userAuthorizationAnswer); DiameterMessageImpl msg = (DiameterMessageImpl) userAuthorizationAnswer; JUserAuthorizationAnswerImpl answer = new JUserAuthorizationAnswerImpl(msg.getGenericData()); try { appSession.sendUserAuthorizationAnswer(answer); } catch (JAvpNotAllowedException anae) { throw new AvpNotAllowedException(anae.getMessage(), anae.getAvpCode(), anae.getVendorId()); } catch (Exception e) { e.printStackTrace(); throw new IOException(e.getMessage()); } } // protected void sendCxDxMessage(DiameterMessage message) throws // IOException { // DiameterMessageImpl msg = (DiameterMessageImpl) message; // try { // session.send(msg.getGenericData()); // } // catch (JAvpNotAllowedException e) { // AvpNotAllowedException anae = new // AvpNotAllowedException("Message validation failed.", e, e.getAvpCode(), // e.getVendorId()); // throw anae; // } // catch (Exception e) { // IOException ioe = new IOException("Failed to send message, due to: " + // e); // throw ioe; // } // } public void stateChanged(Enum oldState, Enum newState) { if (!terminated) if (newState == CxDxSessionState.TERMINATED || newState == CxDxSessionState.TIMEDOUT) { terminated = true; super.cxdxSessionListener.sessionDestroyed(sessionId, this.appSession); } } }