ONOS-3529 Updating FlowEntryBuilder to avoid calling getTable on OF_1.0 messages

Change-Id: Id67a07855e0aed0cbd0612a28914c54d802af2cc
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 b12d8a6..b1fa717 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
@@ -49,6 +49,7 @@
 import org.projectfloodlight.openflow.protocol.OFFlowMod;
 import org.projectfloodlight.openflow.protocol.OFFlowRemoved;
 import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry;
+import org.projectfloodlight.openflow.protocol.OFVersion;
 import org.projectfloodlight.openflow.protocol.action.OFAction;
 import org.projectfloodlight.openflow.protocol.action.OFActionCircuit;
 import org.projectfloodlight.openflow.protocol.action.OFActionEnqueue;
@@ -157,50 +158,59 @@
     }
 
     public FlowEntry build(FlowEntryState... state) {
-        FlowRule rule;
-        switch (this.type) {
-            case STAT:
-                rule = DefaultFlowRule.builder()
-                        .forDevice(DeviceId.deviceId(Dpid.uri(dpid)))
-                        .withSelector(buildSelector())
-                        .withTreatment(buildTreatment())
-                        .withPriority(stat.getPriority())
-                        .makeTemporary(stat.getIdleTimeout())
-                        .withCookie(stat.getCookie().getValue())
-                        .forTable(stat.getTableId().getValue())
-                        .build();
+        FlowRule.Builder builder;
+        try {
+            switch (this.type) {
+                case STAT:
+                    builder = DefaultFlowRule.builder()
+                            .forDevice(DeviceId.deviceId(Dpid.uri(dpid)))
+                            .withSelector(buildSelector())
+                            .withTreatment(buildTreatment())
+                            .withPriority(stat.getPriority())
+                            .makeTemporary(stat.getIdleTimeout())
+                            .withCookie(stat.getCookie().getValue())
+                            .forTable(stat.getTableId().getValue());
 
-                return new DefaultFlowEntry(rule, FlowEntryState.ADDED,
-                                      stat.getDurationSec(), stat.getPacketCount().getValue(),
-                                      stat.getByteCount().getValue());
-            case REMOVED:
-                rule = DefaultFlowRule.builder()
-                        .forDevice(DeviceId.deviceId(Dpid.uri(dpid)))
-                        .withSelector(buildSelector())
-                        .withPriority(removed.getPriority())
-                        .makeTemporary(removed.getIdleTimeout())
-                        .withCookie(removed.getCookie().getValue())
-                        .forTable(removed.getTableId().getValue())
-                        .build();
+                    return new DefaultFlowEntry(builder.build(), FlowEntryState.ADDED,
+                                                stat.getDurationSec(),
+                                                stat.getPacketCount().getValue(),
+                                                stat.getByteCount().getValue());
+                case REMOVED:
+                    builder = DefaultFlowRule.builder()
+                            .forDevice(DeviceId.deviceId(Dpid.uri(dpid)))
+                            .withSelector(buildSelector())
+                            .withPriority(removed.getPriority())
+                            .makeTemporary(removed.getIdleTimeout())
+                            .withCookie(removed.getCookie().getValue());
+                    if (removed.getVersion() != OFVersion.OF_10) {
+                        builder.forTable(removed.getTableId().getValue());
+                    }
 
-                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 = DefaultFlowRule.builder()
-                        .forDevice(DeviceId.deviceId(Dpid.uri(dpid)))
-                        .withSelector(buildSelector())
-                        .withTreatment(buildTreatment())
-                        .withPriority(flowMod.getPriority())
-                        .makeTemporary(flowMod.getIdleTimeout())
-                        .withCookie(flowMod.getCookie().getValue())
-                        .forTable(flowMod.getTableId().getValue())
-                        .build();
+                    return new DefaultFlowEntry(builder.build(), FlowEntryState.REMOVED,
+                                                removed.getDurationSec(),
+                                                removed.getPacketCount().getValue(),
+                                                removed.getByteCount().getValue());
+                case MOD:
+                    FlowEntryState flowState = state.length > 0 ? state[0] : FlowEntryState.FAILED;
+                    builder = DefaultFlowRule.builder()
+                            .forDevice(DeviceId.deviceId(Dpid.uri(dpid)))
+                            .withSelector(buildSelector())
+                            .withTreatment(buildTreatment())
+                            .withPriority(flowMod.getPriority())
+                            .makeTemporary(flowMod.getIdleTimeout())
+                            .withCookie(flowMod.getCookie().getValue());
+                    if (flowMod.getVersion() != OFVersion.OF_10) {
+                        builder.forTable(flowMod.getTableId().getValue());
+                    }
 
-                return new DefaultFlowEntry(rule, flowState, 0, 0, 0);
-            default:
-                log.error("Unknown flow type : {}", this.type);
-                return null;
+                    return new DefaultFlowEntry(builder.build(), flowState, 0, 0, 0);
+                default:
+                    log.error("Unknown flow type : {}", this.type);
+                    return null;
+            }
+        } catch (UnsupportedOperationException e) {
+            log.warn("Error building flow entry", e);
+            return null;
         }
 
     }