Brian O'Connor
Committed by Gerrit Code Review

NPE protection for purge requests (ONOS-1463)

Change-Id: I02732ed83aaaf5c760fdb96899696177415ebd23
...@@ -50,7 +50,7 @@ public interface IntentProcessPhase { ...@@ -50,7 +50,7 @@ public interface IntentProcessPhase {
50 case WITHDRAW_REQ: 50 case WITHDRAW_REQ:
51 return new WithdrawRequest(processor, data, Optional.ofNullable(current)); 51 return new WithdrawRequest(processor, data, Optional.ofNullable(current));
52 case PURGE_REQ: 52 case PURGE_REQ:
53 - return new PurgeRequest(data, current); 53 + return new PurgeRequest(data, Optional.ofNullable(current));
54 default: 54 default:
55 // illegal state 55 // illegal state
56 return new Failed(data); 56 return new Failed(data);
......
...@@ -19,6 +19,8 @@ import org.onosproject.net.intent.IntentData; ...@@ -19,6 +19,8 @@ import org.onosproject.net.intent.IntentData;
19 import org.onosproject.net.intent.IntentState; 19 import org.onosproject.net.intent.IntentState;
20 import org.slf4j.Logger; 20 import org.slf4j.Logger;
21 21
22 +import java.util.Optional;
23 +
22 import static com.google.common.base.Preconditions.checkNotNull; 24 import static com.google.common.base.Preconditions.checkNotNull;
23 import static org.slf4j.LoggerFactory.getLogger; 25 import static org.slf4j.LoggerFactory.getLogger;
24 26
...@@ -32,29 +34,37 @@ final class PurgeRequest extends FinalIntentProcessPhase { ...@@ -32,29 +34,37 @@ final class PurgeRequest extends FinalIntentProcessPhase {
32 34
33 private static final Logger log = getLogger(PurgeRequest.class); 35 private static final Logger log = getLogger(PurgeRequest.class);
34 36
35 - private final IntentData pending; 37 + private final IntentData data;
36 - private final IntentData current; 38 + private final Optional<IntentData> stored;
37 39
38 - PurgeRequest(IntentData intentData, IntentData current) { 40 + PurgeRequest(IntentData intentData, Optional<IntentData> stored) {
39 - this.pending = checkNotNull(intentData); 41 + this.data = checkNotNull(intentData);
40 - this.current = checkNotNull(current); 42 + this.stored = checkNotNull(stored);
41 } 43 }
42 44
43 private boolean shouldAcceptPurge() { 45 private boolean shouldAcceptPurge() {
44 - if (current.state() == IntentState.WITHDRAWN 46 + if (!stored.isPresent()) {
45 - || current.state() == IntentState.FAILED) { 47 + log.info("Purge for intent {}, but intent is not present",
48 + data.key());
49 + return true;
50 + }
51 +
52 + IntentData storedData = stored.get();
53 + if (storedData.state() == IntentState.WITHDRAWN
54 + || storedData.state() == IntentState.FAILED) {
46 return true; 55 return true;
47 } 56 }
48 - log.info("Purge for intent {} is rejected", pending.key()); 57 + log.info("Purge for intent {} is rejected because intent state is {}",
58 + data.key(), storedData.state());
49 return false; 59 return false;
50 } 60 }
51 61
52 @Override 62 @Override
53 public IntentData data() { 63 public IntentData data() {
54 if (shouldAcceptPurge()) { 64 if (shouldAcceptPurge()) {
55 - return pending; 65 + return data;
56 } else { 66 } else {
57 - return current; 67 + return stored.get();
58 } 68 }
59 } 69 }
60 } 70 }
......