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/api/src/main/java/org/onosproject/net/intent/IntentData.java b/core/api/src/main/java/org/onosproject/net/intent/IntentData.java
index b70e7cc..6a9c9ae 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/IntentData.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/IntentData.java
@@ -22,16 +22,12 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.net.intent.IntentState.FAILED;
-import static org.onosproject.net.intent.IntentState.INSTALLED;
-import static org.onosproject.net.intent.IntentState.INSTALLING;
-import static org.onosproject.net.intent.IntentState.PURGE_REQ;
-import static org.onosproject.net.intent.IntentState.WITHDRAWING;
-import static org.onosproject.net.intent.IntentState.WITHDRAWN;
+import static org.onosproject.net.intent.IntentState.*;
 
 /**
  * A wrapper class that contains an intents, its state, and other metadata for
@@ -44,6 +40,7 @@
 
     private final Intent intent;
 
+    private final IntentState request; //TODO perhaps we want a full fledged object for requests
     private IntentState state;
     private Timestamp version;
     private NodeId origin;
@@ -60,6 +57,7 @@
     public IntentData(Intent intent, IntentState state, Timestamp version) {
         this.intent = intent;
         this.state = state;
+        this.request = state;
         this.version = version;
     }
 
@@ -73,6 +71,7 @@
 
         intent = intentData.intent;
         state = intentData.state;
+        request = intentData.request;
         version = intentData.version;
         origin = intentData.origin;
         installables = intentData.installables;
@@ -81,6 +80,7 @@
     // kryo constructor
     protected IntentData() {
         intent = null;
+        request = null;
     }
 
     /**
@@ -101,6 +101,10 @@
         return state;
     }
 
+    public IntentState request() {
+        return request;
+    }
+
     /**
      * Returns the intent key.
      *
@@ -175,7 +179,7 @@
      * @return list of installable intents
      */
     public List<Intent> installables() {
-        return installables;
+        return installables != null ? installables : Collections.emptyList();
     }
 
     /**
@@ -240,6 +244,12 @@
             }
             return true;
 
+        case CORRUPT:
+            if (currentState == CORRUPT) {
+                return false;
+            }
+            return true;
+
         case PURGE_REQ:
             return true;