package org.mobicents.tests.diameter.sh; import java.io.InputStream; import org.apache.log4j.Level; import org.jdiameter.api.Answer; import org.jdiameter.api.ApplicationId; import org.jdiameter.api.Avp; import org.jdiameter.api.AvpDataException; import org.jdiameter.api.AvpSet; import org.jdiameter.api.IllegalDiameterStateException; import org.jdiameter.api.InternalException; import org.jdiameter.api.Network; import org.jdiameter.api.OverloadException; import org.jdiameter.api.Request; import org.jdiameter.api.RouteException; 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.sh.ClientShSession; import org.jdiameter.api.sh.ClientShSessionListener; import org.jdiameter.api.sh.ServerShSession; import org.jdiameter.api.sh.ServerShSessionListener; import org.jdiameter.api.sh.events.ProfileUpdateAnswer; import org.jdiameter.api.sh.events.ProfileUpdateRequest; import org.jdiameter.api.sh.events.PushNotificationAnswer; import org.jdiameter.api.sh.events.PushNotificationRequest; import org.jdiameter.api.sh.events.SubscribeNotificationsAnswer; import org.jdiameter.api.sh.events.SubscribeNotificationsRequest; import org.jdiameter.api.sh.events.UserDataAnswer; import org.jdiameter.api.sh.events.UserDataRequest; import org.jdiameter.client.api.ISessionFactory; import org.jdiameter.client.impl.app.sh.ShClientSessionImpl; import org.jdiameter.common.api.app.sh.IShMessageFactory; import org.jdiameter.common.impl.app.sh.ProfileUpdateAnswerImpl; import org.jdiameter.common.impl.app.sh.ProfileUpdateRequestImpl; import org.jdiameter.common.impl.app.sh.PushNotificationAnswerImpl; import org.jdiameter.common.impl.app.sh.PushNotificationRequestImpl; import org.jdiameter.common.impl.app.sh.ShSessionFactoryImpl; import org.jdiameter.common.impl.app.sh.SubscribeNotificationsAnswerImpl; import org.jdiameter.common.impl.app.sh.SubscribeNotificationsRequestImpl; import org.jdiameter.common.impl.app.sh.UserDataAnswerImpl; import org.jdiameter.common.impl.app.sh.UserDataRequestImpl; import org.jdiameter.server.impl.app.sh.ShServerSessionImpl; import org.mobicents.tests.diameter.AbstractStackRunner; public class SH extends AbstractStackRunner implements ServerShSessionListener, ClientShSessionListener, StateChangeListener<AppSession>, IShMessageFactory { private ApplicationId shAuthApplicationId = ApplicationId.createByAuthAppId(10415, 16777217); private ShSessionFactoryImpl shSessionFactory; public SH() { super(); // TODO Auto-generated constructor stub } @Override public void configure(InputStream f) throws Exception { // TODO Auto-generated method stub super.configure(f); this.shSessionFactory = new ShSessionFactoryImpl(super.factory); this.shSessionFactory.setClientShSessionListener(this); this.shSessionFactory.setServerShSessionListener(this); Network network = stack.unwrap(Network.class); network.addNetworkReqListener(this, shAuthApplicationId); ((ISessionFactory) super.factory).registerAppFacory(ServerShSession.class, this.shSessionFactory); ((ISessionFactory) super.factory).registerAppFacory(ClientShSession.class, this.shSessionFactory); } public Answer processRequest(Request request) { int commandCode = request.getCommandCode(); if (commandCode != 308 && commandCode != 306 && commandCode != 309) { if (log.isEnabledFor(Level.ERROR)) { log.error("Received command with wrong code: " + commandCode); super.dumpMessage(request, false); } return null; } if (commandCode == 308 || commandCode == 306) { try { ShServerSessionImpl session = ((ISessionFactory) super.factory).getNewAppSession(request.getSessionId(), shAuthApplicationId, ServerShSession.class, null); // session. session.addStateChangeNotification(this); session.processRequest(request); } catch (InternalException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { try { ShClientSessionImpl session = ((ISessionFactory) super.factory).getNewAppSession(request.getSessionId(), shAuthApplicationId, ClientShSession.class, null); // session. session.processRequest(request); session.addStateChangeNotification(this); } catch (InternalException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return null; } public void receivedSuccessMessage(Request arg0, Answer arg1) { // we should not do that if (super.log.isEnabledFor(Level.ERROR)) { super.log.error("Received answer"); dumpMessage(arg1, false); new Exception().printStackTrace(); } } public void timeoutExpired(Request arg0) { if (super.log.isInfoEnabled()) { super.log.info("Timeout expired"); dumpMessage(arg0, true); } } public void doOtherEvent(AppSession arg0, AppRequestEvent arg1, AppAnswerEvent arg2) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException { // TODO Auto-generated method stub } public void doProfileUpdateRequestEvent(ServerShSession arg0, ProfileUpdateRequest arg1) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException { // TODO Auto-generated method stub } public void doPushNotificationAnswerEvent(ServerShSession arg0, PushNotificationRequest arg1, PushNotificationAnswer arg2) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException { if (log.isEnabledFor(Level.DEBUG)) { log.error("Received PNA"); super.dumpMessage(arg1.getMessage(), false); } } public void doSubscribeNotificationsRequestEvent(ServerShSession appSession, SubscribeNotificationsRequest request) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException { try { // create answer, we will do that always Answer answer = (Answer) super.createAnswer((Request) request.getMessage(), 2001, this.shAuthApplicationId); AvpSet set = answer.getAvps(); // Auth-Session-State set.addAvp(277, 0); if (log.isDebugEnabled()) { log.info("Recievend SNR in App Session."); super.dumpMessage(request.getMessage(), false); log.info("Sending SNA in App Session."); super.dumpMessage(answer, true); } appSession.sendSubscribeNotificationsAnswer( (SubscribeNotificationsAnswer) this.createSubscribeNotificationsAnswer(answer)); // if we have subscribe, we need to send PNR set = request.getMessage().getAvps(); Avp a = set.getAvp(705, 10415L); if (a == null) { if (log.isEnabledFor(Level.ERROR)) { log.error("No subs req type!!"); } return; } int v = -1; try { v = a.getInteger32(); } catch (AvpDataException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (v == 0) { // other side waits for PNR try { Request pnrRaw = appSession.getSessions().get(0).createRequest(309, this.shAuthApplicationId, request.getOriginRealm(), request.getOriginHost()); set = pnrRaw.getAvps(); // Auth-Session-State set.addAvp(277, 0); // User-Identity set.addAvp(request.getMessage().getAvps().getAvp(700, 10415L)); // User-Data set.addAvp(702, "XXXXXXXX", 10415L, true, false, true); appSession.sendPushNotificationRequest((PushNotificationRequest) this.createPushNotificationRequest(pnrRaw)); } catch (AvpDataException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } } public void doUserDataRequestEvent(ServerShSession appSession, UserDataRequest request) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException { try { // create answer, we will do that always Answer answer = (Answer) super.createAnswer((Request) request.getMessage(), 2001, this.shAuthApplicationId); AvpSet set = answer.getAvps(); // Auth-Session-State set.addAvp(277, 0); if (log.isDebugEnabled()) { log.info("Recievend UDR in App Session."); super.dumpMessage(request.getMessage(), false); log.info("Sending UDA in App Session."); super.dumpMessage(answer, true); } appSession.sendUserDataAnswer((UserDataAnswer) this.createUserDataAnswer(answer)); } catch (Exception e) { e.printStackTrace(); } } // ////////////////// // Client methods // // ////////////////// public void doProfileUpdateAnswerEvent(ClientShSession arg0, ProfileUpdateRequest arg1, ProfileUpdateAnswer arg2) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException { // TODO Auto-generated method stub } public void doPushNotificationRequestEvent(ClientShSession appSession, PushNotificationRequest request) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException { try { // create answer, we will do that always Answer answer = (Answer) super.createAnswer((Request) request.getMessage(), 2001, this.shAuthApplicationId); AvpSet set = answer.getAvps(); // Auth-Session-State set.addAvp(277, 0); if (log.isDebugEnabled()) { log.info("Recievend PNR in App Session."); super.dumpMessage(request.getMessage(), false); log.info("Sending PNA in App Session."); super.dumpMessage(answer, true); } appSession.sendPushNotificationAnswer((PushNotificationAnswer) this.createPushNotificationAnswer(answer)); } catch (Exception e) { e.printStackTrace(); } } public void doSubscribeNotificationsAnswerEvent(ClientShSession arg0, SubscribeNotificationsRequest arg1, SubscribeNotificationsAnswer arg2) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException { // TODO Auto-generated method stub } public void doUserDataAnswerEvent(ClientShSession arg0, UserDataRequest arg1, UserDataAnswer arg2) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException { // TODO Auto-generated method stub } public void stateChanged(Enum arg0, Enum arg1) { if (log.isDebugEnabled()) { log.debug("State changed from[" + arg0 + "] to[" + arg1 + "]"); } } public void stateChanged(AppSession source, Enum arg0, Enum arg1) { this.stateChanged(arg0, arg1); } public AppAnswerEvent createProfileUpdateAnswer(Answer answer) { return new ProfileUpdateAnswerImpl(answer); } public AppRequestEvent createProfileUpdateRequest(Request request) { return new ProfileUpdateRequestImpl(request); } public AppAnswerEvent createPushNotificationAnswer(Answer answer) { return new PushNotificationAnswerImpl(answer); } public AppRequestEvent createPushNotificationRequest(Request request) { return new PushNotificationRequestImpl(request); } public AppAnswerEvent createSubscribeNotificationsAnswer(Answer answer) { return new SubscribeNotificationsAnswerImpl(answer); } public AppRequestEvent createSubscribeNotificationsRequest(Request request) { return new SubscribeNotificationsRequestImpl(request); } public AppAnswerEvent createUserDataAnswer(Answer answer) { return new UserDataAnswerImpl(answer); } public AppRequestEvent createUserDataRequest(Request request) { return new UserDataRequestImpl(request); } public long getApplicationId() { return this.shAuthApplicationId.getAuthAppId(); } public long getMessageTimeout() { // TODO Auto-generated method stub return 5000; } }