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