package org.jdiameter.server.impl.app.cca; import org.jdiameter.api.app.AppAnswerEvent; import org.jdiameter.api.app.AppEvent; import org.jdiameter.api.app.AppRequestEvent; import org.jdiameter.api.app.StateEvent; import org.jdiameter.api.cca.events.JCreditControlAnswer; import org.jdiameter.api.cca.events.JCreditControlRequest; public class Event implements StateEvent { public enum Type { RECEIVED_EVENT, SENT_EVENT_RESPONSE, RECEIVED_INITIAL, SENT_INITIAL_RESPONSE, RECEIVED_UPDATE, SENT_UPDATE_RESPONSE, RECEIVED_TERMINATE, SENT_TERMINATE_RESPONSE, // These are minigles, no transition happens, no state resources, timers SENT_RAR, RECEIVED_RAA; } Type type; AppRequestEvent request; AppAnswerEvent answer; Event(Type type) { this.type = type; } Event(Type type, AppRequestEvent request, AppAnswerEvent answer) { this.type = type; this.answer = answer; this.request = request; } Event(boolean isRequest, JCreditControlRequest request, JCreditControlAnswer answer) { this.answer = answer; this.request = request; /** * <pre> * 8.3. CC-Request-Type AVP * * The CC-Request-Type AVP (AVP Code 416) is of type Enumerated and * contains the reason for sending the credit-control request message. * It MUST be present in all Credit-Control-Request messages. The * following values are defined for the CC-Request-Type AVP: * * INITIAL_REQUEST 1 * UPDATE_REQUEST 2 * TERMINATION_REQUEST 3 * EVENT_REQUEST 4 * </pre> */ if (isRequest) { switch (request.getRequestTypeAVPValue()) { case 1: type = Type.RECEIVED_INITIAL; break; case 2: type = Type.RECEIVED_UPDATE; break; case 3: type = Type.RECEIVED_TERMINATE; break; case 4: type = Type.RECEIVED_EVENT; break; default: throw new IllegalArgumentException( "Wrong value off avp code 416 or avp not present!!!"); } } else { switch (answer.getRequestTypeAVPValue()) { case 1: type = Type.SENT_INITIAL_RESPONSE; break; case 2: type = Type.SENT_UPDATE_RESPONSE; break; case 3: type = Type.SENT_TERMINATE_RESPONSE; break; case 4: type = Type.SENT_EVENT_RESPONSE; break; default: throw new IllegalArgumentException( "Wrong value off avp code 416 or avp not present"); } } } public <E> E encodeType(Class<E> eClass) { return eClass == Event.Type.class ? (E) type : null; } public Enum getType() { return type; } public int compareTo(Object o) { return 0; } public Object getData() { return this.request != null ? this.request : this.answer; } public void setData(Object data) { // FIXME: What should we do here?! Is it request or answer? } public AppEvent getRequest() { return request; } public AppEvent getAnswer() { return answer; } }