package org.mobicents.tests.diameter.cca; import java.io.InputStream; import java.util.concurrent.ScheduledFuture; import org.apache.log4j.Level; import org.jdiameter.api.Answer; import org.jdiameter.api.ApplicationId; import org.jdiameter.api.AvpDataException; import org.jdiameter.api.AvpSet; import org.jdiameter.api.EventListener; import org.jdiameter.api.IllegalDiameterStateException; import org.jdiameter.api.InternalException; import org.jdiameter.api.Message; import org.jdiameter.api.Network; import org.jdiameter.api.NetworkReqListener; 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.auth.events.ReAuthAnswer; import org.jdiameter.api.auth.events.ReAuthRequest; import org.jdiameter.api.cca.ClientCCASession; import org.jdiameter.api.cca.ServerCCASession; import org.jdiameter.api.cca.ServerCCASessionListener; import org.jdiameter.api.cca.events.JCreditControlAnswer; import org.jdiameter.api.cca.events.JCreditControlRequest; import org.jdiameter.client.api.ISessionFactory; import org.jdiameter.common.api.app.cca.IServerCCASessionContext; import org.jdiameter.common.impl.app.auth.ReAuthAnswerImpl; import org.jdiameter.common.impl.app.auth.ReAuthRequestImpl; import org.jdiameter.common.impl.app.cca.CCASessionFactoryImpl; import org.jdiameter.common.impl.app.cca.JCreditControlAnswerImpl; import org.jdiameter.common.impl.app.cca.JCreditControlRequestImpl; import org.jdiameter.server.impl.app.cca.ServerCCASessionImpl; import org.mobicents.tests.diameter.AbstractStackRunner; public class CCR extends AbstractStackRunner implements NetworkReqListener, EventListener<Request, Answer>, ServerCCASessionListener, IServerCCASessionContext, StateChangeListener<AppSession> { protected boolean isEventBased = true; protected ApplicationId authApplicationId = ApplicationId.createByAuthAppId(0, 4); // its miliseconds protected long messageTimeout = 5000; protected int defaultDirectDebitingFailureHandling = 0; protected int defaultCreditControlFailureHandling = 0; // its seconds protected long defaultValidityTime = 30; protected long defaultTxTimerValue = 10; protected CCASessionFactoryImpl ccaSessionFactory; public CCR() { super(); } @Override public void configure(InputStream f) throws Exception { // TODO Auto-generated method stub super.configure(f); this.ccaSessionFactory = new CCASessionFactoryImpl(super.factory); this.ccaSessionFactory.setServerSessionListener(this); this.ccaSessionFactory.setServerContextListener(this); Network network = stack.unwrap(Network.class); network.addNetworkReqListener(this, authApplicationId); ((ISessionFactory) super.factory).registerAppFacory(ServerCCASession.class, ccaSessionFactory); } public void doCreditControlRequest(ServerCCASession session, JCreditControlRequest request) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException { if (log.isInfoEnabled()) { log.info("Received Request: " + ((Request) request.getMessage()).getCommandCode() + "\nE2E:" + ((Request) request.getMessage()).getEndToEndIdentifier() + "\nHBH:" + ((Request) request.getMessage()).getHopByHopIdentifier() + "\nAppID:" + ((Request) request.getMessage()).getApplicationId()); log.info("Request AVPS: \n"); try { printAvps(((Request) request.getMessage()).getAvps()); } catch (AvpDataException e) { // TODO Auto-generated catch block e.printStackTrace(); } } try { // INITIAL_REQUEST 1, UPDATE_REQUEST 2, TERMINATION_REQUEST 3, // EVENT_REQUEST 4 JCreditControlAnswer answer = null; switch (request.getRequestTypeAVPValue()) { case 1: JCreditControlAnswerImpl local = new JCreditControlAnswerImpl((Request) request.getMessage(), 2000); answer = local; AvpSet reqSet = request.getMessage().getAvps(); AvpSet set = local.getMessage().getAvps(); int c = 0; set.removeAvp(293); set.removeAvp(283); // set.removeAvp(296); // set.removeAvp(264); // set.addAvp(296,"mobicents.org", true); // set.addAvp(264,"aaa://192.168.1.103:3868", true); set.addAvp(reqSet.getAvp(416), reqSet.getAvp(415), reqSet.getAvp(258)); if (answer != null) { if (log.isInfoEnabled()) { log.info("Created answer: " + answer.getCommandCode() + "\nE2E:" + answer.getMessage().getEndToEndIdentifier() + "\nHBH:" + answer.getMessage().getHopByHopIdentifier() + "\nAppID:" + answer.getMessage().getApplicationId()); log.info("Answer AVPS: \n"); try { printAvps(answer.getMessage().getAvps()); } catch (AvpDataException e) { // TODO Auto-generated catch block e.printStackTrace(); } } session.sendCreditControlAnswer(answer); } break; case 2: local = new JCreditControlAnswerImpl((Request) request.getMessage(), 2000); answer = local; reqSet = request.getMessage().getAvps(); set = local.getMessage().getAvps(); c = 0; set.removeAvp(293); set.removeAvp(283); // set.removeAvp(296); // set.removeAvp(264); // set.addAvp(296,"mobicents.org", true); // set.addAvp(264,"aaa://192.168.1.103:3868", true); set.addAvp(reqSet.getAvp(416), reqSet.getAvp(415), reqSet.getAvp(258)); if (answer != null) { if (log.isInfoEnabled()) { log.info("Created answer: " + answer.getCommandCode() + "\nE2E:" + answer.getMessage().getEndToEndIdentifier() + "\nHBH:" + answer.getMessage().getHopByHopIdentifier() + "\nAppID:" + answer.getMessage().getApplicationId()); log.info("Answer AVPS: \n"); try { printAvps(answer.getMessage().getAvps()); } catch (AvpDataException e) { // TODO Auto-generated catch block e.printStackTrace(); } } session.sendCreditControlAnswer(answer); } break; case 3: local = new JCreditControlAnswerImpl((Request) request.getMessage(), 2000); answer = local; reqSet = request.getMessage().getAvps(); set = local.getMessage().getAvps(); c = 0; set.removeAvp(293); set.removeAvp(283); // set.removeAvp(296); // set.removeAvp(264); // set.addAvp(296,"mobicents.org", true); // set.addAvp(264,"aaa://192.168.1.103:3868", true); set.addAvp(reqSet.getAvp(416), reqSet.getAvp(415), reqSet.getAvp(258)); if (answer != null) { if (log.isInfoEnabled()) { log.info("Created answer: " + answer.getCommandCode() + "\nE2E:" + answer.getMessage().getEndToEndIdentifier() + "\nHBH:" + answer.getMessage().getHopByHopIdentifier() + "\nAppID:" + answer.getMessage().getApplicationId()); log.info("Answer AVPS: \n"); try { printAvps(answer.getMessage().getAvps()); } catch (AvpDataException e) { // TODO Auto-generated catch block e.printStackTrace(); } } session.sendCreditControlAnswer(answer); } break; case 4: local = new JCreditControlAnswerImpl((Request) request.getMessage(), 2000); answer = local; reqSet = request.getMessage().getAvps(); set = local.getMessage().getAvps(); c = 0; set.removeAvp(293); set.removeAvp(283); // set.removeAvp(296); // set.removeAvp(264); // set.addAvp(296,"mobicents.org", true); // set.addAvp(264,"aaa://192.168.1.103:3868", true); set.addAvp(reqSet.getAvp(416), reqSet.getAvp(415), reqSet.getAvp(258)); if (answer != null) { if (log.isInfoEnabled()) { log.info("Created answer: " + answer.getCommandCode() + "\nE2E:" + answer.getMessage().getEndToEndIdentifier() + "\nHBH:" + answer.getMessage().getHopByHopIdentifier() + "\nAppID:" + answer.getMessage().getApplicationId()); log.info("Answer AVPS: \n"); try { printAvps(answer.getMessage().getAvps()); } catch (AvpDataException e) { // TODO Auto-generated catch block e.printStackTrace(); } } session.sendCreditControlAnswer(answer); } break; default: if (log.isEnabledFor(Level.ERROR)) { log.error("No REQ type present?: " + request.getRequestTypeAVPValue()); } } } catch (Exception e) { e.printStackTrace(); } } /* * (non-Javadoc) * @see * org.jdiameter.api.app.StateChangeListener#stateChanged(java.lang.Object, * java.lang.Enum, java.lang.Enum) */ public void stateChanged(AppSession source, Enum oldState, Enum newState) { this.stateChanged(oldState, newState); } public void stateChanged(Enum oldState, Enum newState) { if (log.isInfoEnabled()) { log.info("Diameter CCA SessionFactory :: stateChanged :: oldState[" + oldState + "], newState[" + newState + "]"); } } // //////////////////// // GENERIC HANDLERS // // //////////////////// public Answer processRequest(Request request) { if (request.getCommandCode() != 272) { if (super.log.isEnabledFor(Level.ERROR)) { // super.log.error("Received non CCR message, discarding: " + // toString(request)); super.dumpMessage(request, false); } return null; } if (log.isInfoEnabled()) { log.info("===Received=== Request: " + request.getCommandCode() + "\nE2E:" + request.getEndToEndIdentifier() + "\nHBH:" + request.getHopByHopIdentifier() + "\nAppID:" + request.getApplicationId()); log.info("Request AVPS: \n"); try { printAvps(request.getAvps()); } catch (AvpDataException e) { // TODO Auto-generated catch block e.printStackTrace(); } } try { ServerCCASessionImpl session = ((ISessionFactory) super.factory).getNewAppSession(request.getSessionId(), ApplicationId.createByAuthAppId(0, 4), ServerCCASession.class, null); // session. session.addStateChangeNotification(this); session.processRequest(request); } catch (InternalException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public long[] getApplicationIds() { // FIXME: ??? return new long[] { 4 }; } public long getDefaultValidityTime() { return this.defaultValidityTime; } public JCreditControlAnswer createCreditControlAnswer(Answer answer) { return new JCreditControlAnswerImpl(answer); } public JCreditControlRequest createCreditControlRequest(Request req) { return new JCreditControlRequestImpl(req); } public ReAuthAnswer createReAuthAnswer(Answer answer) { return new ReAuthAnswerImpl(answer); } public ReAuthRequest createReAuthRequest(Request req) { return new ReAuthRequestImpl(req); } // ///////////////////// // // CONTEXT METHODS // < - we dont care about them // ///////////////////// public void sessionSupervisionTimerReStarted(ServerCCASession session, ScheduledFuture future) { // TODO Auto-generated method stub } public void sessionSupervisionTimerStarted(ServerCCASession session, ScheduledFuture future) { // TODO Auto-generated method stub } public void sessionSupervisionTimerStopped(ServerCCASession session, ScheduledFuture future) { // TODO Auto-generated method stub } public void timeoutExpired(Request request) { // FIXME ??? } public void denyAccessOnDeliverFailure(ClientCCASession clientCCASessionImpl, Message request) { // TODO Auto-generated method stub } public void denyAccessOnFailureMessage(ClientCCASession clientCCASessionImpl) { // TODO Auto-generated method stub } public int getDefaultCCFHValue() { return defaultCreditControlFailureHandling; } public int getDefaultDDFHValue() { return defaultDirectDebitingFailureHandling; } public long getDefaultTxTimerValue() { return defaultTxTimerValue; } public void grantAccessOnDeliverFailure(ClientCCASession clientCCASessionImpl, Message request) { // TODO Auto-generated method stub } public void grantAccessOnFailureMessage(ClientCCASession clientCCASessionImpl) { // TODO Auto-generated method stub } public void grantAccessOnTxExpire(ClientCCASession clientCCASessionImpl) { // TODO Auto-generated method stub } public void indicateServiceError(ClientCCASession clientCCASessionImpl) { // TODO Auto-generated method stub } public void receivedSuccessMessage(Request request, Answer answer) { } public void doCreditControlAnswer(ClientCCASession arg0, JCreditControlRequest arg1, JCreditControlAnswer arg2) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException { // TODO Auto-generated method stub } public void doOtherEvent(AppSession arg0, AppRequestEvent arg1, AppAnswerEvent arg2) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException { // TODO Auto-generated method stub } public void doReAuthRequest(ClientCCASession arg0, ReAuthRequest arg1) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException { // TODO Auto-generated method stub } public void doReAuthAnswer(ServerCCASession arg0, ReAuthRequest arg1, ReAuthAnswer arg2) throws InternalException, IllegalDiameterStateException, RouteException, OverloadException { // TODO Auto-generated method stub } public void sessionSupervisionTimerExpired(ServerCCASession arg0) { // TODO Auto-generated method stub } public void denyAccessOnTxExpire(ClientCCASession arg0) { // TODO Auto-generated method stub } public void txTimerExpired(ClientCCASession arg0) { // TODO Auto-generated method stub } }