Revision: 1cd6476ff32c
Author:   Alexandre Mendonça <ammendonca>
Date:     Sat Jan 12 10:10:57 2013
Log: Diameter Stack: Session based Client CCA/Gx/Ro throws Null Pointer Exceptions if send fails in HA mode in getGatheredRequestedAction()

Update Issue 34
Status: Fixed
Fixed the issue in all affected applications and situations.

http://code.google.com/p/jdiameter/source/detail?r=1cd6476ff32c

Modified:
/core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/app/cca/ClientCCASessionImpl.java /core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/app/gx/ClientGxSessionImpl.java /core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/app/ro/ClientRoSessionImpl.java

=======================================
--- /core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/app/cca/ClientCCASessionImpl.java Tue Apr 10 11:05:24 2012 +++ /core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/app/cca/ClientCCASessionImpl.java Sat Jan 12 10:10:57 2013
@@ -654,9 +654,9 @@
     try {
       this.sendAndStateLock.lock();
ClientCCASessionState state = this.sessionData.getClientCCASessionState(); - int gatheredRequestedAction = this.sessionData.getGatheredRequestedAction(); // Event Based ----------------------------------------------------------
       if (isEventBased()) {
+ int gatheredRequestedAction = this.sessionData.getGatheredRequestedAction();
         switch (state) {
         case PENDING_EVENT:
if (gatheredRequestedAction == CHECK_BALANCE || gatheredRequestedAction == PRICE_ENQUIRY) {
@@ -761,8 +761,8 @@
       long resultCode = event.getResultCodeAvp().getUnsigned32();
ClientCCASessionState state = this.sessionData.getClientCCASessionState();
       Serializable txTimerId = this.sessionData.getTxTimerId();
- int gatheredRequestedAction = this.sessionData.getGatheredRequestedAction();
       if (isEventBased()) {
+ int gatheredRequestedAction = this.sessionData.getGatheredRequestedAction();
         switch (state) {
         case PENDING_EVENT:
if (resultCode == END_USER_SERVICE_DENIED || resultCode == USER_UNKNOWN) {
@@ -999,9 +999,8 @@
// Event Based ---------------------------------------------------------- ClientCCASessionState state = this.sessionData.getClientCCASessionState();
     Serializable txTimerId = this.sessionData.getTxTimerId();
- int gatheredRequestedAction = this.sessionData.getGatheredRequestedAction();
-    int gatheredDDFH = this.sessionData.getGatheredDDFH();
     if (isEventBased()) {
+ int gatheredRequestedAction = this.sessionData.getGatheredRequestedAction(); if (gatheredRequestedAction == CHECK_BALANCE || gatheredRequestedAction == PRICE_ENQUIRY) {
         // Current State: PENDING_E
// Event: Failure to send, temporary error, failed CC event answer received or Tx expired; requested action CHECK_BALANCE or PRICE_ENQUIRY
@@ -1011,6 +1010,7 @@
         setState(ClientCCASessionState.IDLE);
       }
       else if (gatheredRequestedAction == DIRECT_DEBITING) {
+        int gatheredDDFH = this.sessionData.getGatheredDDFH();
         if(gatheredDDFH == DDFH_TERMINATE_OR_BUFFER) {
           // Current State: PENDING_E
// Event: Temporary error; requested action DIRECT_DEBITING; DDFH equal to TERMINATE_OR_BUFFER; Tx expired
=======================================
--- /core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/app/gx/ClientGxSessionImpl.java Tue Apr 10 11:05:24 2012 +++ /core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/app/gx/ClientGxSessionImpl.java Sat Jan 12 10:10:57 2013
@@ -640,8 +640,8 @@
         try {
// Event Based ---------------------------------------------------------- final ClientGxSessionState state = this.sessionData.getClientGxSessionState(); - final int gatheredRequestedAction = sessionData.getGatheredRequestedAction();
             if (isEventBased()) {
+ final int gatheredRequestedAction = sessionData.getGatheredRequestedAction();
                 switch (state) {
                     case PENDING_EVENT:
if (gatheredRequestedAction == CHECK_BALANCE || gatheredRequestedAction == PRICE_ENQUIRY) {
@@ -738,10 +738,10 @@
         try {
// Event Based ---------------------------------------------------------- final ClientGxSessionState state = this.sessionData.getClientGxSessionState(); - final int gatheredRequestedAction = sessionData.getGatheredRequestedAction();
           final Serializable txTimerId = sessionData.getTxTimerId();
final long resultCode = event.getResultCodeAvp().getUnsigned32();
             if (isEventBased()) {
+ final int gatheredRequestedAction = sessionData.getGatheredRequestedAction();
                 switch (state) {
                     case PENDING_EVENT:
if (resultCode == END_USER_SERVICE_DENIED || resultCode == USER_UNKNOWN) {
@@ -959,9 +959,8 @@
     protected void handleTxExpires(Message message) {
// Event Based ---------------------------------------------------------- final ClientGxSessionState state = this.sessionData.getClientGxSessionState(); - final int gatheredRequestedAction = this.sessionData.getGatheredRequestedAction();
-      final int gatheredDDFH = this.sessionData.getGatheredDDFH();
         if (isEventBased()) {
+ final int gatheredRequestedAction = this.sessionData.getGatheredRequestedAction(); if (gatheredRequestedAction == CHECK_BALANCE || gatheredRequestedAction == PRICE_ENQUIRY) {
                 // Current State: PENDING_E
// Event: Failure to send, temporary error, failed CC event answer received or Tx expired; requested action CHECK_BALANCE or PRICE_ENQUIRY
@@ -970,6 +969,7 @@
                 context.indicateServiceError(this);
                 setState(ClientGxSessionState.IDLE);
             } else if (gatheredRequestedAction == DIRECT_DEBITING) {
+ final int gatheredDDFH = this.sessionData.getGatheredDDFH();
                 if (gatheredDDFH == DDFH_TERMINATE_OR_BUFFER) {
                     // Current State: PENDING_E
// Event: Temporary error; requested action DIRECT_DEBITING; DDFH equal to TERMINATE_OR_BUFFER; Tx expired
=======================================
--- /core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/app/ro/ClientRoSessionImpl.java Tue Apr 10 11:05:24 2012 +++ /core/jdiameter/impl/src/main/java/org/jdiameter/client/impl/app/ro/ClientRoSessionImpl.java Sat Jan 12 10:10:57 2013
@@ -669,9 +669,9 @@
logger.debug("Failed to send message, type: {} message: {}, failure: {}", new Object[]{eventType, request, e != null ? e.getLocalizedMessage() : ""});
     try {
       ClientRoSessionState state = sessionData.getClientRoSessionState();
- int gatheredRequestedAction = sessionData.getGatheredRequestedAction(); // Event Based ----------------------------------------------------------
       if (isEventBased()) {
+ int gatheredRequestedAction = sessionData.getGatheredRequestedAction();
         switch (state) {
         case PENDING_EVENT:
if (gatheredRequestedAction == CHECK_BALANCE || gatheredRequestedAction == PRICE_ENQUIRY) {
@@ -774,9 +774,9 @@
// Event Based ----------------------------------------------------------
       long resultCode = event.getResultCodeAvp().getUnsigned32();
       ClientRoSessionState state = sessionData.getClientRoSessionState();
- int gatheredRequestedAction = sessionData.getGatheredRequestedAction();
       Serializable txTimerId = sessionData.getTxTimerId();
       if (isEventBased()) {
+ int gatheredRequestedAction = sessionData.getGatheredRequestedAction();
         switch (state) {
         case PENDING_EVENT:
if (resultCode == END_USER_SERVICE_DENIED || resultCode == USER_UNKNOWN) {
@@ -1012,9 +1012,9 @@
   protected void handleTxExpires(Message message) {
// Event Based ----------------------------------------------------------
     ClientRoSessionState state = sessionData.getClientRoSessionState();
-    int gatheredRequestedAction = sessionData.getGatheredRequestedAction();

     if (isEventBased()) {
+ int gatheredRequestedAction = sessionData.getGatheredRequestedAction(); if (gatheredRequestedAction == CHECK_BALANCE || gatheredRequestedAction == PRICE_ENQUIRY) {
         // Current State: PENDING_E
// Event: Failure to send, temporary error, failed CC event answer received or Tx expired; requested action CHECK_BALANCE or PRICE_ENQUIRY

Reply via email to