Initial implementation of CORRUPT state (ONOS-1060)

- Added CORRUPT state to state machine and event type
- Simplified phases using new request field
- Improved null-safety by using Optionals

Change-Id: I1d576b719765b5664aef73477ee04593e8acc4fd
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/WithdrawRequest.java b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/WithdrawRequest.java
index 004bb33..73a6510 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/WithdrawRequest.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/WithdrawRequest.java
@@ -29,7 +29,7 @@
 
     private final IntentProcessor processor;
     private final IntentData data;
-    private final IntentData stored;
+    private final Optional<IntentData> stored;
 
     /**
      * Creates a withdraw request phase.
@@ -39,7 +39,7 @@
      * @param intentData intent data to be processed
      * @param stored     intent data stored in the store
      */
-    WithdrawRequest(IntentProcessor processor, IntentData intentData, IntentData stored) {
+    WithdrawRequest(IntentProcessor processor, IntentData intentData, Optional<IntentData> stored) {
         this.processor = checkNotNull(processor);
         this.data = checkNotNull(intentData);
         this.stored = checkNotNull(stored);
@@ -50,7 +50,18 @@
         //TODO perhaps we want to validate that the pending and current are the
         // same version i.e. they are the same
         // Note: this call is not just the symmetric version of submit
-        data.setInstallables(stored.installables());
+
+        if (!stored.isPresent() || stored.get().installables().isEmpty()) {
+            switch (data.request()) {
+                case INSTALL_REQ:
+                    return Optional.of(new Failed(data));
+                case WITHDRAW_REQ:
+                default: //TODO "default" case should not happen
+                    return Optional.of(new Withdrawn(data));
+            }
+        }
+
+        data.setInstallables(stored.get().installables());
         return Optional.of(new Withdrawing(processor, data));
     }
 }