Implementation of new Flow Subsystem:

The subsystem no longer returns futures for tracking completion of work.
Notifications are explicitely returned via a call back mechanism. Also, the
subsystem is now asynchronous.

Change-Id: I1a4cef931c24820f9ae9ed9a5398f163f05dfbc9

more flowservice improvements

Change-Id: I5c9c1b6be4b2ebfa523b64f6f52e7634b7d3e05f

more flowservice impl

Change-Id: I05f6774460effb53ced8c36844bcda2f8f6c096f

Manager to store functional (at least i believe it)

Change-Id: I09b04989bd1004c98fe0bafed4c76714b9155d53

flow subsystem functional: need to fix unit tests

Change-Id: I1667f25b91320f625a03e5e1d5e92823184d9de0

flow subsystem functional

Change-Id: I429b3335c16d4fc16f5d55f233dd37c4d1d6111d

finished refactor of flow subsystem

Change-Id: I1899abc6ff6a974a2018d936cc555049c70a6804

fix for null flow provider to use new api

Change-Id: If2fd9bd5baf74d9c61c5c8085cef8bc2d204cbdc
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
index 04ff897..8f2b5f4 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
@@ -35,6 +35,7 @@
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.openflow.controller.Dpid;
+import org.projectfloodlight.openflow.protocol.OFFlowMod;
 import org.projectfloodlight.openflow.protocol.OFFlowRemoved;
 import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry;
 import org.projectfloodlight.openflow.protocol.OFInstructionType;
@@ -74,13 +75,16 @@
 
     private final OFFlowStatsEntry stat;
     private final OFFlowRemoved removed;
+    private final OFFlowMod flowMod;
 
     private final Match match;
     private final List<OFAction> actions;
 
     private final Dpid dpid;
 
-    private final boolean addedRule;
+    public enum FlowType { STAT, REMOVED, MOD }
+
+    private final FlowType type;
 
 
     public FlowEntryBuilder(Dpid dpid, OFFlowStatsEntry entry) {
@@ -89,7 +93,8 @@
         this.actions = getActions(entry);
         this.dpid = dpid;
         this.removed = null;
-        this.addedRule = true;
+        this.flowMod = null;
+        this.type = FlowType.STAT;
     }
 
     public FlowEntryBuilder(Dpid dpid, OFFlowRemoved removed) {
@@ -99,26 +104,48 @@
         this.dpid = dpid;
         this.actions = null;
         this.stat = null;
-        this.addedRule = false;
+        this.flowMod = null;
+        this.type = FlowType.REMOVED;
 
     }
 
-    public FlowEntry build() {
-        if (addedRule) {
-            FlowRule rule = new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)),
-                    buildSelector(), buildTreatment(), stat.getPriority(),
-                    stat.getCookie().getValue(), stat.getIdleTimeout(), false);
-            return new DefaultFlowEntry(rule, FlowEntryState.ADDED,
-                    stat.getDurationSec(), stat.getPacketCount().getValue(),
-                    stat.getByteCount().getValue());
+    public FlowEntryBuilder(Dpid dpid, OFFlowMod fm) {
+        this.match = fm.getMatch();
+        this.dpid = dpid;
+        this.actions = fm.getActions();
+        this.type = FlowType.MOD;
+        this.flowMod = fm;
+        this.stat = null;
+        this.removed = null;
+    }
 
-        } else {
-            FlowRule rule = new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)),
-                    buildSelector(), null, removed.getPriority(),
-                   removed.getCookie().getValue(), removed.getIdleTimeout(), false);
-            return new DefaultFlowEntry(rule, FlowEntryState.REMOVED, removed.getDurationSec(),
-                    removed.getPacketCount().getValue(), removed.getByteCount().getValue());
+    public FlowEntry build(FlowEntryState... state) {
+        FlowRule rule;
+        switch (this.type) {
+            case STAT:
+                rule = new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)),
+                                      buildSelector(), buildTreatment(), stat.getPriority(),
+                                      stat.getCookie().getValue(), stat.getIdleTimeout(), false);
+                return new DefaultFlowEntry(rule, FlowEntryState.ADDED,
+                                      stat.getDurationSec(), stat.getPacketCount().getValue(),
+                                      stat.getByteCount().getValue());
+            case REMOVED:
+                rule = new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)),
+                                      buildSelector(), null, removed.getPriority(),
+                                      removed.getCookie().getValue(), removed.getIdleTimeout(), false);
+                return new DefaultFlowEntry(rule, FlowEntryState.REMOVED, removed.getDurationSec(),
+                                      removed.getPacketCount().getValue(), removed.getByteCount().getValue());
+            case MOD:
+                FlowEntryState flowState = state.length > 0 ? state[0] : FlowEntryState.FAILED;
+                rule = new DefaultFlowRule(DeviceId.deviceId(Dpid.uri(dpid)),
+                                      buildSelector(), buildTreatment(), flowMod.getPriority(),
+                                      flowMod.getCookie().getValue(), flowMod.getIdleTimeout(), false);
+                return new DefaultFlowEntry(rule, flowState, 0, 0, 0);
+            default:
+                log.error("Unknown flow type : {}", this.type);
+                return null;
         }
+
     }
 
     private List<OFAction> getActions(OFFlowStatsEntry entry) {