Various Bmv2 protocol refactorings in preparation of the flow rule
translator (ONOS-4044)

- Added new classes for different match parameters (exact, ternary, lpm,
  valid)
- Divided api package in two sub-packages, model (previously under
  drivers) and runtime (old api package)
- Improved Bmv2ThriftClient caching and table entry handling

Change-Id: I23c174cf3e8f9f6ecddb99c2d09dc531e8f1c73f
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2FlowRuleDriver.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2FlowRuleDriver.java
index c000f52..c226e60 100644
--- a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2FlowRuleDriver.java
+++ b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2FlowRuleDriver.java
@@ -20,10 +20,10 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import org.onosproject.bmv2.api.Bmv2ExtensionSelector;
-import org.onosproject.bmv2.api.Bmv2ExtensionTreatment;
-import org.onosproject.bmv2.api.Bmv2TableEntry;
-import org.onosproject.bmv2.api.Bmv2Exception;
+import org.onosproject.bmv2.api.runtime.Bmv2ExtensionSelector;
+import org.onosproject.bmv2.api.runtime.Bmv2ExtensionTreatment;
+import org.onosproject.bmv2.api.runtime.Bmv2TableEntry;
+import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException;
 import org.onosproject.bmv2.ctl.Bmv2ThriftClient;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 import org.onosproject.net.flow.DefaultFlowEntry;
@@ -70,7 +70,7 @@
         Bmv2ThriftClient deviceClient;
         try {
             deviceClient = getDeviceClient();
-        } catch (Bmv2Exception e) {
+        } catch (Bmv2RuntimeException e) {
             return Collections.emptyList();
         }
 
@@ -107,7 +107,7 @@
                     tableEntryIdsMap.put(rule, entryId);
                     deviceEntriesMap.put(rule, new DefaultFlowEntry(
                             rule, FlowEntry.FlowEntryState.ADDED, 0, 0, 0));
-                } catch (Bmv2Exception e) {
+                } catch (Bmv2RuntimeException e) {
                     log.error("Unable to update flow rule", e);
                     continue;
                 }
@@ -121,7 +121,7 @@
                     tableEntryIdsMap.put(rule, entryId);
                     deviceEntriesMap.put(rule, new DefaultFlowEntry(
                             rule, FlowEntry.FlowEntryState.ADDED, 0, 0, 0));
-                } catch (Bmv2Exception e) {
+                } catch (Bmv2RuntimeException e) {
                     log.error("Unable to add flow rule", e);
                     continue;
                 }
@@ -138,7 +138,7 @@
         Bmv2ThriftClient deviceClient;
         try {
             deviceClient = getDeviceClient();
-        } catch (Bmv2Exception e) {
+        } catch (Bmv2RuntimeException e) {
             return Collections.emptyList();
         }
 
@@ -152,7 +152,7 @@
 
                 try {
                     deviceClient.deleteTableEntry(tableName, entryId);
-                } catch (Bmv2Exception e) {
+                } catch (Bmv2RuntimeException e) {
                     log.error("Unable to delete flow rule", e);
                     continue;
                 }
@@ -225,10 +225,10 @@
         return "table" + String.valueOf(tableId);
     }
 
-    private Bmv2ThriftClient getDeviceClient() throws Bmv2Exception {
+    private Bmv2ThriftClient getDeviceClient() throws Bmv2RuntimeException {
         try {
             return Bmv2ThriftClient.of(handler().data().deviceId());
-        } catch (Bmv2Exception e) {
+        } catch (Bmv2RuntimeException e) {
             log.error("Failed to connect to Bmv2 device", e);
             throw e;
         }