Merge "Remove dependency of impl on onf-extensions"
authorJozef Bacigal <jozef.bacigal@pantheon.tech>
Fri, 8 Sep 2017 08:43:03 +0000 (08:43 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Fri, 8 Sep 2017 08:43:03 +0000 (08:43 +0000)
83 files changed:
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/FlowNodeReconciliation.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/AbstractListeningCommiter.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/AbstractNodeConnectorCommitter.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/DeviceMastershipManager.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/FlowForwarder.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/FlowNodeConnectorInventoryTranslatorImpl.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/FlowNodeReconciliationImpl.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/GroupForwarder.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/MeterForwarder.java
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/TableForwarder.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/TransactionChainManager.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/lifecycle/ContextChainHolderImpl.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/multilayer/MultiLayerAggregateFlowMultipartService.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/ofpspecific/SessionStatistics.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/AllMeterConfigStatsService.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/FlowsInTableService.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupDescriptionService.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/compatibility/FlowStatisticsToNotificationTransformer.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/compatibility/GroupStatisticsToNotificationTransformer.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/compatibility/MeterStatisticsToNotificationTransformer.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/compatibility/NodeConnectorStatisticsToNotificationTransformer.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/compatibility/QueueStatisticsToNotificationTransformer.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/multilayer/FlowDirectStatisticsService.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/translator/PacketReceivedTranslator.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/translator/TranslatorKeyFactory.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/connection/OutboundQueueProviderImplTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImplTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/multipart/MultipartReplyMeterFeaturesDeserializerTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/multipart/MultipartReplyPortDescDeserializerTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/services/sal/SalFlowServiceImplTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsContextImplParamTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsContextImplTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/multilayer/FlowDirectStatisticsServiceTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/multilayer/GroupDirectStatisticsServiceTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/multilayer/MeterDirectStatisticsServiceTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/multilayer/NodeConnectorDirectStatisticsServiceTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/multilayer/QueueDirectStatisticsServiceTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/singlelayer/FlowDirectStatisticsServiceTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/singlelayer/GroupDirectStatisticsServiceTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/singlelayer/MeterDirectStatisticsServiceTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/singlelayer/NodeConnectorDirectStatisticsServiceTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/singlelayer/QueueDirectStatisticsServiceTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/translator/PacketReceivedTranslatorTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/util/MatchUtilTest.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ConvertorExecutor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ConvertorManager.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ConvertorManagerFactory.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupDescStatsResponseConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterConfigStatsResponseConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterStatsResponseConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PacketOutConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PortConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/TableFeaturesConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/TableFeaturesResponseConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/action/ActionConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/action/ActionResponseConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/action/cases/SalToOfSetFieldCase.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/common/Convertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/FlowConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/FlowFlagsConvertor.java [new file with mode: 0644]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/FlowFlagsInjector.java [moved from openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagReactorMappingFactory.java with 64% similarity]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/FlowFlagsV10Convertor.java [new file with mode: 0644]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/FlowInstructionResponseConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/FlowStatsResponseConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagConvertor.java [deleted file]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagReactor.java [deleted file]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagsConvertorImpl.java [deleted file]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagsConvertorV10Impl.java [deleted file]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java [deleted file]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchInjector.java [moved from openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchReactorMappingFactory.java with 83% similarity]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchReactor.java [deleted file]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchResponseConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchV10Convertor.java [moved from openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorV10Impl.java with 86% similarity]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchV10ResponseConvertor.java
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ConvertorManagerTest.java
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagReactorTest.java [deleted file]
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorTest.java [moved from openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl2Test.java with 94% similarity]
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorV10Test.java [moved from openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorV10ImplTest.java with 88% similarity]
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchReactorTest.java [deleted file]

index 602208fff829eac5e431765647387e88739defcc..0829337fd535a1d8a42c23a3f9c4da379aea5852 100644 (file)
@@ -11,12 +11,13 @@ package org.opendaylight.openflowplugin.applications.frm;
 import org.opendaylight.openflowplugin.applications.reconciliation.ReconciliationNotificationListener;
 
 /**
- * Implementation provider of this interface will implement reconciliation functionality for a newly connected node.
- * Implementation is not enforced to do reconciliation in any specific way, but the higher level intention is to
- * provide best effort reconciliation of  all the configuration (flow/meter/group) present in configuration data store
- * for the given node.
+ * Implementation provider of this interface will implement reconciliation
+ * functionality for a newly connected node. Implementation is not enforced to
+ * do reconciliation in any specific way, but the higher level intention is to
+ * provide best effort reconciliation of all the configuration
+ * (flow/meter/group) present in configuration data store for the given node.
  *
  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
  */
 public interface FlowNodeReconciliation extends ReconciliationNotificationListener, AutoCloseable {
-}
\ No newline at end of file
+}
index 2e8864aa259ebcc9e43258d81730d74908f5992a..2393685ef562f58a3c58fb57a11b13e6548cf613 100644 (file)
@@ -27,11 +27,9 @@ public abstract class AbstractListeningCommiter<T extends DataObject> implements
 
     private static final Logger LOG = LoggerFactory.getLogger(AbstractListeningCommiter.class);
     ForwardingRulesManager provider;
-    private final Class<T> clazz;
 
-    public AbstractListeningCommiter(ForwardingRulesManager provider, Class<T> clazz) {
+    public AbstractListeningCommiter(ForwardingRulesManager provider) {
         this.provider = Preconditions.checkNotNull(provider, "ForwardingRulesManager can not be null!");
-        this.clazz = Preconditions.checkNotNull(clazz, "Class can not be null!");
     }
 
     @Override
@@ -101,19 +99,8 @@ public abstract class AbstractListeningCommiter<T extends DataObject> implements
         // skip the flow/group/meter operational. This requires an addition check, where it reads
         // node from operational data store and if it's present it calls flowNodeConnected to explicitly
         // trigger the event of new node connected.
-
-        if (!provider.isNodeOwner(nodeIdent)) {
-            return false;
-        }
-
-        if (!provider.isNodeActive(nodeIdent)) {
-            if (provider.checkNodeInOperationalDataStore(nodeIdent)) {
-                return true;
-            } else {
-                return false;
-            }
-        }
-        return true;
+        return provider.isNodeOwner(nodeIdent)
+                && (provider.isNodeActive(nodeIdent) || provider.checkNodeInOperationalDataStore(nodeIdent));
     }
 }
 
index 87e9cccc09b33eeb12355dcda303e2379e4dfa3f..3fd406139eff6303fd665cd90a00ed5e04c490db 100644 (file)
@@ -22,11 +22,8 @@ public abstract class AbstractNodeConnectorCommitter<T extends DataObject>
         implements FlowCapableNodeConnectorCommitter<T> {
     private final ForwardingRulesManager provider;
 
-    private final Class<T> clazz;
-
-    public AbstractNodeConnectorCommitter(ForwardingRulesManager provider, Class<T> clazz) {
+    public AbstractNodeConnectorCommitter(ForwardingRulesManager provider) {
         this.provider = Preconditions.checkNotNull(provider, "ForwardingRulesManager can not be null!");
-        this.clazz = Preconditions.checkNotNull(clazz, "Class can not be null!");
     }
 
     @Override
@@ -36,8 +33,8 @@ public abstract class AbstractNodeConnectorCommitter<T extends DataObject>
         for (DataTreeModification<T> change : changes) {
             final InstanceIdentifier<T> key = change.getRootPath().getRootIdentifier();
             final DataObjectModification<T> mod = change.getRootNode();
-            final InstanceIdentifier<FlowCapableNodeConnector> nodeConnIdent =
-                    key.firstIdentifierOf(FlowCapableNodeConnector.class);
+            final InstanceIdentifier<FlowCapableNodeConnector> nodeConnIdent = key
+                    .firstIdentifierOf(FlowCapableNodeConnector.class);
 
             if (preConfigurationCheck(nodeConnIdent)) {
                 switch (mod.getModificationType()) {
@@ -62,8 +59,8 @@ public abstract class AbstractNodeConnectorCommitter<T extends DataObject>
     }
 
     /**
-     * Method return wildCardPath for Listener registration
-     * and for identify the correct KeyInstanceIdentifier from data.
+     * Method return wildCardPath for Listener registration and for identify the
+     * correct KeyInstanceIdentifier from data.
      */
     protected abstract InstanceIdentifier<T> getWildCardPath();
 
index 2e27d697411f722df0c0c7f3d6cf4c09cebd9825..6ae53868a6e8b7340e3942cd48da6915259888ec 100644 (file)
@@ -159,19 +159,16 @@ public class DeviceMastershipManager
                 LOG.debug("Node removed: {}", nodeIdent.firstKeyOf(Node.class).getId().getValue());
             }
 
-            if (!nodeIdent.isWildcarded()) {
-                if (activeNodes.contains(nodeIdent)) {
-                    synchronized (lockObj) {
-                        if (activeNodes.contains(nodeIdent)) {
-                            Set<InstanceIdentifier<FlowCapableNode>> set = Sets.newHashSet(activeNodes);
-                            set.remove(nodeIdent);
-                            activeNodes = Collections.unmodifiableSet(set);
-                            setNodeOperationalStatus(nodeIdent, false);
-                        }
+            if (!nodeIdent.isWildcarded() && activeNodes.contains(nodeIdent)) {
+                synchronized (lockObj) {
+                    if (activeNodes.contains(nodeIdent)) {
+                        Set<InstanceIdentifier<FlowCapableNode>> set = Sets.newHashSet(activeNodes);
+                        set.remove(nodeIdent);
+                        activeNodes = Collections.unmodifiableSet(set);
+                        setNodeOperationalStatus(nodeIdent, false);
                     }
                 }
             }
-
         }
     }
 
@@ -182,15 +179,13 @@ public class DeviceMastershipManager
                 LOG.debug("Node added: {}", nodeIdent.firstKeyOf(Node.class).getId().getValue());
             }
 
-            if (!nodeIdent.isWildcarded()) {
-                if (!activeNodes.contains(nodeIdent)) {
-                    synchronized (lockObj) {
-                        if (!activeNodes.contains(nodeIdent)) {
-                            Set<InstanceIdentifier<FlowCapableNode>> set = Sets.newHashSet(activeNodes);
-                            set.add(nodeIdent);
-                            activeNodes = Collections.unmodifiableSet(set);
-                            setNodeOperationalStatus(nodeIdent, true);
-                        }
+            if (!nodeIdent.isWildcarded() && !activeNodes.contains(nodeIdent)) {
+                synchronized (lockObj) {
+                    if (!activeNodes.contains(nodeIdent)) {
+                        Set<InstanceIdentifier<FlowCapableNode>> set = Sets.newHashSet(activeNodes);
+                        set.add(nodeIdent);
+                        activeNodes = Collections.unmodifiableSet(set);
+                        setNodeOperationalStatus(nodeIdent, true);
                     }
                 }
             }
@@ -216,11 +211,9 @@ public class DeviceMastershipManager
 
     private void setNodeOperationalStatus(InstanceIdentifier<FlowCapableNode> nodeIid, boolean status) {
         NodeId nodeId = nodeIid.firstKeyOf(Node.class).getId();
-        if (nodeId != null) {
-            if (deviceMasterships.containsKey(nodeId)) {
-                deviceMasterships.get(nodeId).setDeviceOperationalStatus(status);
-                LOG.debug("Operational status of device {} is set to {}", nodeId, status);
-            }
+        if (nodeId != null && deviceMasterships.containsKey(nodeId)) {
+            deviceMasterships.get(nodeId).setDeviceOperationalStatus(status);
+            LOG.debug("Operational status of device {} is set to {}", nodeId, status);
         }
     }
 
index 23d124a1d55614bd64d75e1be29573e4c3b6f4f9..cb27c294e583bd6767b2dbc54d4586d7185e9fcb 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2014, 2017 Cisco Systems, Inc. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -61,7 +61,7 @@ public class FlowForwarder extends AbstractListeningCommiter<Flow> {
     private ListenerRegistration<FlowForwarder> listenerRegistration;
 
     public FlowForwarder(final ForwardingRulesManager manager, final DataBroker db) {
-        super(manager, Flow.class);
+        super(manager);
         dataBroker = Preconditions.checkNotNull(db, "DataBroker can not be null!");
         registrationListener(db);
     }
index 95d7a4ebf1e412e14c4b3aa6e992c0c3d6bb5ce5..69f13b5709d519ad09df51df65d4844a2b257e53 100644 (file)
@@ -51,7 +51,7 @@ public class FlowNodeConnectorInventoryTranslatorImpl extends AbstractNodeConnec
 
     @SuppressWarnings("IllegalCatch")
     public FlowNodeConnectorInventoryTranslatorImpl(final ForwardingRulesManager manager, final DataBroker dataBroker) {
-        super(manager, FlowCapableNodeConnector.class);
+        super(manager);
         Preconditions.checkNotNull(dataBroker, "DataBroker can not be null!");
 
         final DataTreeIdentifier<FlowCapableNodeConnector> treeId =
index f3110ed80bd9984123e424a7e2652c51f1336952..5b5933efb940059d2f8646ee23cc659a8d90f5c6 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.openflowplugin.applications.frm.impl;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.CheckedFuture;
 import com.google.common.util.concurrent.FutureCallback;
@@ -215,7 +214,6 @@ public class FlowNodeReconciliationImpl implements FlowNodeReconciliation {
                             }
                             return Futures.immediateFuture(null);
                         });
-
                 ListenableFuture<RpcResult<Void>> commitBundleFuture = Futures.transformAsync(addBundleMessagesFuture,
                     rpcResult -> {
                         if (rpcResult.isSuccessful()) {
@@ -228,7 +226,7 @@ public class FlowNodeReconciliationImpl implements FlowNodeReconciliation {
                 /* Bundles not supported for meters */
                 List<Meter> meters = flowNode.get().getMeter() != null ? flowNode.get().getMeter()
                         : Collections.emptyList();
-                ListenableFuture<RpcResult<Void>> meterFuture = Futures.transformAsync(commitBundleFuture,
+                Futures.transformAsync(commitBundleFuture,
                     rpcResult -> {
                         if (rpcResult.isSuccessful()) {
                             for (Meter meter : meters) {
@@ -313,7 +311,7 @@ public class FlowNodeReconciliationImpl implements FlowNodeReconciliation {
 
             if (flowNode.isPresent()) {
                 /* Tables - have to be pushed before groups */
-                // CHECK if while pusing the update, updateTableInput can be null to emulate a
+                // CHECK if while pushing the update, updateTableInput can be null to emulate a
                 // table add
                 List<TableFeatures> tableList = flowNode.get().getTableFeatures() != null
                         ? flowNode.get().getTableFeatures()
@@ -628,8 +626,6 @@ public class FlowNodeReconciliationImpl implements FlowNodeReconciliation {
     }
 
     private void deleteDSStaleFlows(List<InstanceIdentifier<StaleFlow>> flowsForBulkDelete) {
-        ImmutableList.Builder<InstanceIdentifier<StaleFlow>> builder = ImmutableList.builder();
-
         WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
 
         for (InstanceIdentifier<StaleFlow> staleFlowIId : flowsForBulkDelete) {
@@ -641,8 +637,6 @@ public class FlowNodeReconciliationImpl implements FlowNodeReconciliation {
     }
 
     private void deleteDSStaleGroups(List<InstanceIdentifier<StaleGroup>> groupsForBulkDelete) {
-        ImmutableList.Builder<InstanceIdentifier<StaleGroup>> builder = ImmutableList.builder();
-
         WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
 
         for (InstanceIdentifier<StaleGroup> staleGroupIId : groupsForBulkDelete) {
@@ -654,8 +648,6 @@ public class FlowNodeReconciliationImpl implements FlowNodeReconciliation {
     }
 
     private void deleteDSStaleMeters(List<InstanceIdentifier<StaleMeter>> metersForBulkDelete) {
-        ImmutableList.Builder<InstanceIdentifier<StaleMeter>> builder = ImmutableList.builder();
-
         WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
 
         for (InstanceIdentifier<StaleMeter> staleMeterIId : metersForBulkDelete) {
index f9ee0feafde1f7fe745629a41ffd5ebebffc4d59..f5ccb19947c6bea17c8f6da4681c104b4c0a6a56 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2014, 2017 Cisco Systems, Inc. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -58,7 +58,7 @@ public class GroupForwarder extends AbstractListeningCommiter<Group> {
 
     @SuppressWarnings("IllegalCatch")
     public GroupForwarder(final ForwardingRulesManager manager, final DataBroker db) {
-        super(manager, Group.class);
+        super(manager);
         dataBroker = Preconditions.checkNotNull(db, "DataBroker can not be null!");
         final DataTreeIdentifier<Group> treeId = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,
                 getWildCardPath());
index 08b4d5742f51cfbd4e953eb697536120cc693e18..5cc0c10a33db417b49f56b6a6ee03cc337e98896 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2014, 2017 Cisco Systems, Inc. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -59,7 +59,7 @@ public class MeterForwarder extends AbstractListeningCommiter<Meter> {
 
     @SuppressWarnings("IllegalCatch")
     public MeterForwarder(final ForwardingRulesManager manager, final DataBroker db) {
-        super(manager, Meter.class);
+        super(manager);
         dataBroker = Preconditions.checkNotNull(db, "DataBroker can not be null!");
         final DataTreeIdentifier<Meter> treeId = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,
                 getWildCardPath());
@@ -145,15 +145,13 @@ public class MeterForwarder extends AbstractListeningCommiter<Meter> {
     public void createStaleMarkEntity(InstanceIdentifier<Meter> identifier, Meter del,
             InstanceIdentifier<FlowCapableNode> nodeIdent) {
         LOG.debug("Creating Stale-Mark entry for the switch {} for meter {} ", nodeIdent.toString(), del.toString());
-        StaleMeter staleMeter = makeStaleMeter(identifier, del, nodeIdent);
+        StaleMeter staleMeter = makeStaleMeter(del);
         persistStaleMeter(staleMeter, nodeIdent);
     }
 
-    private StaleMeter makeStaleMeter(InstanceIdentifier<Meter> identifier, Meter del,
-            InstanceIdentifier<FlowCapableNode> nodeIdent) {
+    private StaleMeter makeStaleMeter(Meter del) {
         StaleMeterBuilder staleMeterBuilder = new StaleMeterBuilder(del);
         return staleMeterBuilder.setMeterId(del.getMeterId()).build();
-
     }
 
     private void persistStaleMeter(StaleMeter staleMeter, InstanceIdentifier<FlowCapableNode> nodeIdent) {
@@ -163,7 +161,6 @@ public class MeterForwarder extends AbstractListeningCommiter<Meter> {
 
         CheckedFuture<Void, TransactionCommitFailedException> submitFuture = writeTransaction.submit();
         handleStaleMeterResultFuture(submitFuture);
-
     }
 
     private void handleStaleMeterResultFuture(CheckedFuture<Void, TransactionCommitFailedException> submitFuture) {
@@ -178,13 +175,11 @@ public class MeterForwarder extends AbstractListeningCommiter<Meter> {
                 LOG.error("Stale Meter creation failed {}", throwable);
             }
         });
-
     }
 
-    private InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.flow
-        .inventory.rev130819.meters.StaleMeter> getStaleMeterInstanceIdentifier(
+    private InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819
+        .meters.StaleMeter> getStaleMeterInstanceIdentifier(
             StaleMeter staleMeter, InstanceIdentifier<FlowCapableNode> nodeIdent) {
         return nodeIdent.child(StaleMeter.class, new StaleMeterKey(new MeterId(staleMeter.getMeterId())));
     }
-
 }
index 2ed93b95ee98a05b87a4ff3309e29ddaf53f1e5d..96feb79ddfe607e9a3e7a352ceaa7d849310da95 100644 (file)
@@ -40,7 +40,7 @@ public class TableForwarder extends AbstractListeningCommiter<TableFeatures> {
 
     @SuppressWarnings("IllegalCatch")
     public TableForwarder(final ForwardingRulesManager manager, final DataBroker db) {
-        super(manager, TableFeatures.class);
+        super(manager);
         Preconditions.checkNotNull(db, "DataBroker can not be null!");
         final DataTreeIdentifier<TableFeatures> treeId = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,
                 getWildCardPath());
index 23790303b91d3c627e44c8f5d78f74e32cfff080..38a9d7a8ea135f2496c1f5633c207652e3b097d9 100644 (file)
@@ -329,6 +329,6 @@ class TransactionChainManager implements TransactionChainListener, AutoCloseable
         /**
          * txChainManager is trying to be closed - device disconnecting.
          */
-        SHUTTING_DOWN;
+        SHUTTING_DOWN
     }
 }
index d24d6329bf02f433c5ebf21d70f1710f516a68c4..36923b53944bebbd81cb5701f70a3370b63620d6 100644 (file)
@@ -49,6 +49,7 @@ import org.opendaylight.openflowplugin.impl.util.DeviceStateUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FeaturesReply;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.rf.state.rev170713.ResultState;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -148,7 +149,10 @@ public class ContextChainHolderImpl implements ContextChainHolder, MasterChecker
         final DeviceInfo deviceInfo = connectionContext.getDeviceInfo();
         final ContextChain contextChain = contextChainMap.get(deviceInfo);
 
-        if (connectionContext.getFeatures().getAuxiliaryId() != 0) {
+        final FeaturesReply featuresReply = connectionContext.getFeatures();
+        final short auxiliaryId = featuresReply != null ? featuresReply.getAuxiliaryId() : 0;
+
+        if (auxiliaryId != 0) {
             if (contextChain == null) {
                 LOG.warn("An auxiliary connection for device {}, but no primary connection. Refusing connection.",
                         deviceInfo);
index 0e1043c9011ede0d10e118ad54f33d6acfb3913c..c6e57b43f44841d7e77835f00849a992ab56bab4 100644 (file)
@@ -13,6 +13,7 @@ import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.Futures;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.Future;
 import java.util.stream.Collectors;
 import org.opendaylight.openflowplugin.api.OFConstants;
@@ -26,7 +27,8 @@ import org.opendaylight.openflowplugin.impl.services.AbstractAggregateFlowMultip
 import org.opendaylight.openflowplugin.impl.services.util.RequestInputUtils;
 import org.opendaylight.openflowplugin.impl.services.util.ServiceException;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchInjector;
 import org.opendaylight.openflowplugin.openflow.md.util.FlowCreatorUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput;
@@ -46,6 +48,7 @@ public class MultiLayerAggregateFlowMultipartService extends AbstractAggregateFl
 
     private final TranslatorLibrary translatorLibrary;
     private final ConvertorExecutor convertorExecutor;
+    private final VersionConvertorData data;
 
     public MultiLayerAggregateFlowMultipartService(final RequestContextStack requestContextStack,
                                                    final DeviceContext deviceContext,
@@ -54,6 +57,7 @@ public class MultiLayerAggregateFlowMultipartService extends AbstractAggregateFl
         super(requestContextStack, deviceContext);
         this.convertorExecutor = convertorExecutor;
         this.translatorLibrary = translatorLibrary;
+        this.data = new VersionConvertorData(getVersion());
     }
 
 
@@ -93,7 +97,9 @@ public class MultiLayerAggregateFlowMultipartService extends AbstractAggregateFl
             mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
         }
 
-        MatchReactor.getInstance().convert(input.getMatch(), version, mprAggregateRequestBuilder, convertorExecutor);
+        // convert and inject match
+        final Optional<Object> conversionMatch = convertorExecutor.convert(input.getMatch(), data);
+        MatchInjector.inject(conversionMatch, mprAggregateRequestBuilder, data.getVersion());
 
         FlowCreatorUtil.setWildcardedFlowMatch(version, mprAggregateRequestBuilder);
 
index 70892d92b7b3246deba1a650ecc4938032d33ede..0e2aa3a7341e61d2ba3ad0413f462062909446c1 100644 (file)
@@ -59,7 +59,7 @@ public class SessionStatistics {
     }
 
     public enum ConnectionStatus {
-        CONNECTION_CREATED, CONNECTION_DISCONNECTED_BY_DEVICE, CONNECTION_DISCONNECTED_BY_OFP;
+        CONNECTION_CREATED, CONNECTION_DISCONNECTED_BY_DEVICE, CONNECTION_DISCONNECTED_BY_OFP
     }
 
     private static final class EventCounter {
index 220d84fd822a9b99333c3fb06cf0cfb622c34fc5..f79d24460e1a6e35f5b44921b84abe335969d0d3 100644 (file)
@@ -90,7 +90,7 @@ final class AllMeterConfigStatsService
         message.setMoreReplies(Boolean.FALSE);
         message.setTransactionId(emulatedTxId);
 
-        message.setMeterConfigStats(new ArrayList<MeterConfigStats>());
+        message.setMeterConfigStats(new ArrayList<>());
         for (MultipartReply mpReply : result) {
             MultipartReplyMeterConfigCase caseBody = (MultipartReplyMeterConfigCase) mpReply.getMultipartReplyBody();
             MultipartReplyMeterConfig replyBody = caseBody.getMultipartReplyMeterConfig();
@@ -98,9 +98,7 @@ final class AllMeterConfigStatsService
             final Optional<List<MeterConfigStats>> meterConfigStatsList =
                     convertorExecutor.convert(replyBody.getMeterConfig(), data);
 
-            if (meterConfigStatsList.isPresent()) {
-                message.getMeterConfigStats().addAll(meterConfigStatsList.get());
-            }
+            meterConfigStatsList.ifPresent(meterConfigStats -> message.getMeterConfigStats().addAll(meterConfigStats));
         }
 
         return message.build();
index c9f04eed90c78072f354ef0bc060a4f31fca8799..db676154cfd8cf846f7331f0537e6e377592ac49 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.openflowplugin.impl.statistics.services;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.atomic.AtomicLong;
 import org.opendaylight.openflowplugin.api.OFConstants;
 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
@@ -18,7 +19,8 @@ import org.opendaylight.openflowplugin.impl.services.util.ServiceException;
 import org.opendaylight.openflowplugin.impl.statistics.services.compatibility.AbstractCompatibleStatService;
 import org.opendaylight.openflowplugin.impl.statistics.services.compatibility.FlowStatisticsToNotificationTransformer;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchInjector;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.FlowsStatisticsUpdate;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableOutput;
@@ -35,6 +37,7 @@ public final class FlowsInTableService extends AbstractCompatibleStatService<Get
         GetFlowStatisticsFromFlowTableOutput, FlowsStatisticsUpdate> {
 
     private final ConvertorExecutor convertorExecutor;
+    private final VersionConvertorData data;
 
     public FlowsInTableService(final RequestContextStack requestContextStack,
                                final DeviceContext deviceContext,
@@ -42,6 +45,7 @@ public final class FlowsInTableService extends AbstractCompatibleStatService<Get
                                ConvertorExecutor convertorExecutor) {
         super(requestContextStack, deviceContext, compatibilityXidSeed);
         this.convertorExecutor = convertorExecutor;
+        this.data = new VersionConvertorData(getVersion());
     }
 
     @Override
@@ -81,13 +85,13 @@ public final class FlowsInTableService extends AbstractCompatibleStatService<Get
         }
 
         // convert and inject match
-        final short version = getVersion();
-        MatchReactor.getInstance().convert(input.getMatch(), version, mprFlowRequestBuilder, convertorExecutor);
+        final Optional<Object> conversionMatch = convertorExecutor.convert(input.getMatch(), data);
+        MatchInjector.inject(conversionMatch, mprFlowRequestBuilder, data.getVersion());
 
         // Set request body to main multipart request
         multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
         final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader(
-                MultipartType.OFPMPFLOW, xid.getValue(), version);
+                MultipartType.OFPMPFLOW, xid.getValue(), getVersion());
         mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build());
 
         return mprInput.build();
index 12f12b4133e3ae3e7dcc4a32477d10e36ae04ac0..8006a59028384dde6054a4b5388f23aa4e463bd7 100644 (file)
@@ -71,7 +71,7 @@ final class GroupDescriptionService
         notification.setMoreReplies(Boolean.FALSE);
         notification.setTransactionId(emulatedTxId);
 
-        notification.setGroupDescStats(new ArrayList<GroupDescStats>());
+        notification.setGroupDescStats(new ArrayList<>());
         final VersionConvertorData data = new VersionConvertorData(getVersion());
 
         for (MultipartReply mpReply : result) {
@@ -80,9 +80,7 @@ final class GroupDescriptionService
             final Optional<List<GroupDescStats>> groupDescStatsList = convertorExecutor.convert(
                     replyBody.getGroupDesc(), data);
 
-            if (groupDescStatsList.isPresent()) {
-                notification.getGroupDescStats().addAll(groupDescStatsList.get());
-            }
+            groupDescStatsList.ifPresent(groupDescStats -> notification.getGroupDescStats().addAll(groupDescStats));
         }
 
         return notification.build();
index bf1d21dbc50f80ab330cb6abb45d4c5fc03578f6..cdb6669333a06ed6acbeb8062d6976061e0f36aa 100644 (file)
@@ -69,9 +69,7 @@ public class FlowStatisticsToNotificationTransformer {
                     convertorExecutor.convert(replyBody.getFlowStats(), data);
 
 
-            if (outStatsItem.isPresent()) {
-                statsList.addAll(outStatsItem.get());
-            }
+            outStatsItem.ifPresent(statsList::addAll);
         }
 
         return notification.build();
index f98a3bcba4a20751bd49cfc76494a507bf05a19e..4da34b81c8f4e7f2f547b0c2832a645b03a24e83 100644 (file)
@@ -50,7 +50,7 @@ public class GroupStatisticsToNotificationTransformer {
         notification.setMoreReplies(Boolean.FALSE);
         notification.setTransactionId(emulatedTxId);
 
-        notification.setGroupStats(new ArrayList<GroupStats>());
+        notification.setGroupStats(new ArrayList<>());
 
         for (MultipartReply mpReply : mpReplyList) {
             MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) mpReply.getMultipartReplyBody();
@@ -58,9 +58,7 @@ public class GroupStatisticsToNotificationTransformer {
             final Optional<List<GroupStats>> groupStatsList = convertorExecutor.convert(
                     replyBody.getGroupStats(), data);
 
-            if (groupStatsList.isPresent()) {
-                notification.getGroupStats().addAll(groupStatsList.get());
-            }
+            groupStatsList.ifPresent(groupStats -> notification.getGroupStats().addAll(groupStats));
         }
         return notification.build();
     }
index 7f3d3941737fe6fdb0bd488abd55d415245c5c1b..f595415d1677808a1cb874b27faf16d2f537358e 100644 (file)
@@ -54,16 +54,14 @@ public class MeterStatisticsToNotificationTransformer {
         notification.setMoreReplies(Boolean.FALSE);
         notification.setTransactionId(emulatedTxId);
 
-        notification.setMeterStats(new ArrayList<MeterStats>());
+        notification.setMeterStats(new ArrayList<>());
         for (MultipartReply mpReply : mpReplyList) {
             MultipartReplyMeterCase caseBody = (MultipartReplyMeterCase) mpReply.getMultipartReplyBody();
             MultipartReplyMeter replyBody = caseBody.getMultipartReplyMeter();
             final Optional<List<MeterStats>> meterStatsList =
                     convertorExecutor.convert(replyBody.getMeterStats(), data);
 
-            if (meterStatsList.isPresent()) {
-                notification.getMeterStats().addAll(meterStatsList.get());
-            }
+            meterStatsList.ifPresent(meterStats -> notification.getMeterStats().addAll(meterStats));
         }
 
         return notification.build();
index fdf42c8cf23371d1a4768e2271b9e782237be323..1dafdec3630a91bc110598541e12a120c1e20174 100644 (file)
@@ -58,7 +58,7 @@ public class NodeConnectorStatisticsToNotificationTransformer {
         notification.setTransactionId(emulatedTxId);
 
         notification
-                .setNodeConnectorStatisticsAndPortNumberMap(new ArrayList<NodeConnectorStatisticsAndPortNumberMap>());
+                .setNodeConnectorStatisticsAndPortNumberMap(new ArrayList<>());
         for (MultipartReply mpReply : mpReplyList) {
             MultipartReplyPortStatsCase caseBody = (MultipartReplyPortStatsCase) mpReply.getMultipartReplyBody();
 
index a431175f870b006687e6bf8a5903da5b27755daa..7aa5ee0f715c0144130496a252e43816a9f50345 100644 (file)
@@ -55,7 +55,7 @@ public class QueueStatisticsToNotificationTransformer {
         notification.setMoreReplies(Boolean.FALSE);
         notification.setTransactionId(emulatedTxId);
 
-        notification.setQueueIdAndStatisticsMap(new ArrayList<QueueIdAndStatisticsMap>());
+        notification.setQueueIdAndStatisticsMap(new ArrayList<>());
         for (MultipartReply mpReply : mpReplyList) {
 
             MultipartReplyQueueCase caseBody = (MultipartReplyQueueCase) mpReply.getMultipartReplyBody();
index 47abf2824d79a2b295df1ff1bf0f2c43ba49b20d..246f6ec409aca65a41ddaf9e220e2cad784e0a93 100644 (file)
@@ -21,7 +21,7 @@ import org.opendaylight.openflowplugin.impl.services.util.RequestInputUtils;
 import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractFlowDirectStatisticsService;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.FlowStatsResponseConvertorData;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchInjector;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsOutputBuilder;
@@ -61,15 +61,15 @@ public class FlowDirectStatisticsService extends AbstractFlowDirectStatisticsSer
                 final Optional<List<FlowAndStatisticsMapList>> statsListPart = getConvertorExecutor().convert(
                     replyBody.getFlowStats(), data);
 
-                if (statsListPart.isPresent()) {
-                    for (final FlowAndStatisticsMapList part : statsListPart.get()) {
+                statsListPart.ifPresent(flowAndStatisticsMapLists -> {
+                    for (final FlowAndStatisticsMapList part : flowAndStatisticsMapLists) {
                         final FlowId flowId = new FlowId(generateFlowId(part).getValue());
                         statsList.add(new FlowAndStatisticsMapListBuilder(part)
-                            .setKey(new FlowAndStatisticsMapListKey(flowId))
-                            .setFlowId(flowId)
-                            .build());
+                                .setKey(new FlowAndStatisticsMapListKey(flowId))
+                                .setFlowId(flowId)
+                                .build());
                     }
-                }
+                });
             }
         }
 
@@ -112,10 +112,9 @@ public class FlowDirectStatisticsService extends AbstractFlowDirectStatisticsSer
             mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
         }
 
-        MatchReactor.getInstance().convert(input.getMatch(),
-                                           getVersion(),
-                                           mprFlowRequestBuilder,
-                                           getConvertorExecutor());
+        // convert and inject match
+        final Optional<Object> conversionMatch = getConvertorExecutor().convert(input.getMatch(), data);
+        MatchInjector.inject(conversionMatch, mprFlowRequestBuilder, data.getVersion());
 
         return RequestInputUtils.createMultipartHeader(getMultipartType(), xid.getValue(), getVersion())
             .setMultipartRequestBody(new MultipartRequestFlowCaseBuilder()
index c7d3a54b25a150ec892b459ef73fbfad2ac5efca..038e5f679adaf079ae4e9a2e17fa8a081abb67b5 100644 (file)
@@ -86,9 +86,7 @@ public class PacketReceivedTranslator implements MessageTranslator<PacketInMessa
 
         final Optional<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder>
                 matchOptional = convertorExecutor.convert(input.getMatch(), datapathIdConvertorData);
-        final MatchBuilder matchBuilder = matchOptional.isPresent()
-                ? new MatchBuilder(matchOptional.get().build())
-                : new MatchBuilder();
+        final MatchBuilder matchBuilder = matchOptional.map(matchBuilder1 -> new MatchBuilder(matchBuilder1.build())).orElseGet(MatchBuilder::new);
 
         final AugmentTuple<org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.received.Match>
                 matchExtensionWrap = MatchExtensionHelper.processAllExtensions(
index 1ed582472f226acafe668a11d2395faa042288d3..1560459845932269fb619e95226dc4443497b84a 100644 (file)
@@ -22,6 +22,6 @@ public class TranslatorKeyFactory {
     }
 
     public TranslatorKey createTranslatorKey(final Class<?> messageClass) {
-        return new TranslatorKey(version, messageClass.getName().toString());
+        return new TranslatorKey(version, messageClass.getName());
     }
 }
index dc39cdff39823782eef201b0f8c672a5eabfcf3d..b8421c0c48c5e03c56c7d0058c3572119d3fa07e 100644 (file)
@@ -40,7 +40,7 @@ public class OutboundQueueProviderImplTest extends TestCase {
     @Test
     public void testCreateBarrierRequest() {
         final BarrierInput barrierRequest = outboundQueueProvider.createBarrierRequest(DUMMY_XID);
-        assertNotNull(barrierRequest);;
+        assertNotNull(barrierRequest);
         assertEquals((short)OFConstants.OFP_VERSION_1_3, (short)barrierRequest.getVersion());
         assertEquals(DUMMY_XID, barrierRequest.getXid());
     }
index 9f549a7b84ac06c2a4a9f1de7d500246c972a385..1c15675ee23f5860f2ca1a3790810ceddec62dcb 100644 (file)
@@ -350,7 +350,7 @@ public class DeviceContextImplTest {
     public void testProcessPacketInMessageFutureSuccess() {
         final PacketInMessage mockedPacketInMessage = mock(PacketInMessage.class);
         final NotificationPublishService mockedNotificationPublishService = mock(NotificationPublishService.class);
-        final ListenableFuture stringListenableFuture = Futures.immediateFuture(new String("dummy value"));
+        final ListenableFuture stringListenableFuture = Futures.immediateFuture("dummy value");
 
         when(mockedNotificationPublishService.offerNotification(any(PacketReceived.class)))
                 .thenReturn(stringListenableFuture);
index e790b3953240542c25a9fadd66f2bc534b4f69ff..c8525c17d7d7cb62652252f44de34e0c570c6f31 100644 (file)
@@ -14,6 +14,7 @@ import static org.junit.Assert.assertTrue;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.UnpooledByteBufAllocator;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import org.junit.Test;
 import org.opendaylight.openflowjava.util.ByteBufUtils;
@@ -28,7 +29,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev13
 
 public class MultipartReplyMeterFeaturesDeserializerTest extends AbstractMultipartDeserializerTest {
     private static final int MAX_METER = 3;
-    private static final List BANDS_SUPPORTED = Arrays.asList(MeterBandDrop.class);
+    private static final List BANDS_SUPPORTED = Collections.singletonList(MeterBandDrop.class);
     private static final List CAPABILITIES_SUPPORTED = Arrays.asList(MeterKbps.class, MeterBurst.class);
     private static final byte MAX_BANDS = 56;
     private static final byte MAX_COLOR = 48;
index 47ea9c1f51392b115fd5587fc02fdf248d46b4ff..709c1e8d1f1518cc806a1d3ad93aaf493126adcb 100644 (file)
@@ -74,10 +74,10 @@ public class MultipartReplyPortDescDeserializerTest extends AbstractMultipartDes
         buffer.writeZero(EncodeConstants.MAX_PORT_NAME_LENGTH);
 
         Map<Integer, Boolean> portMap = new HashMap<>();
-        portMap.put(new Integer(0), PORT_CONFIG.isPORTDOWN());
-        portMap.put(new Integer(2), PORT_CONFIG.isNORECV());
-        portMap.put(new Integer(5), PORT_CONFIG.isNOFWD());
-        portMap.put(new Integer(6), PORT_CONFIG.isNOPACKETIN());
+        portMap.put(0, PORT_CONFIG.isPORTDOWN());
+        portMap.put(2, PORT_CONFIG.isNORECV());
+        portMap.put(5, PORT_CONFIG.isNOFWD());
+        portMap.put(6, PORT_CONFIG.isNOPACKETIN());
 
         buffer.writeInt(ByteBufUtils.fillBitMaskFromMap(portMap));
         buffer.writeInt(ByteBufUtils.fillBitMask(0, PS_BLOCKED, PS_LINK_DOWN, PS_LIVE));
index 8865220bccdc8e9f5c827b2bc5b286f27d4ab500..476ec1bbfd8dadf149283e981fba8c4e7bbaddae 100644 (file)
@@ -288,7 +288,7 @@ public class SalFlowServiceImplTest extends TestCase {
         UpdatedFlow mockedUpdateFlow1 = new UpdatedFlowBuilder()
                 .setMatch(match)
                 .setTableId((short)1)
-                .setPriority(Integer.valueOf(1))
+                .setPriority(1)
                 .build();
 
         when(mockedUpdateFlowInput.getUpdatedFlow()).thenReturn(mockedUpdateFlow);
@@ -308,7 +308,7 @@ public class SalFlowServiceImplTest extends TestCase {
         OriginalFlow mockedOriginalFlow1 = new OriginalFlowBuilder()
                 .setMatch(match)
                 .setTableId((short)1)
-                .setPriority(Integer.valueOf(2))
+                .setPriority(2)
                 .build();
 
         when(mockedUpdateFlowInput.getOriginalFlow()).thenReturn(mockedOriginalFlow);
index 6426e2fa23b92a3cbda15635ed31758696172169..fade81a4c1cab4ddfc771d55f1c8c03a110f8643 100644 (file)
@@ -71,8 +71,8 @@ public class StatisticsContextImplParamTest extends StatisticsContextImpMockInit
         when(mockedDeviceContext.getDeviceState()).thenReturn(mockedDeviceState);
 
         final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
-        final StatisticsContextImpl<MultipartReply> statisticsContext = new StatisticsContextImpl<MultipartReply>(
-                mockedDeviceContext ,convertorManager,
+        final StatisticsContextImpl<MultipartReply> statisticsContext = new StatisticsContextImpl<>(
+                mockedDeviceContextconvertorManager,
                 MultipartWriterProviderFactory.createDefaultProvider(mockedDeviceContext),
                 true, false, 3000, 50000);
 
index ba97b9c53b75a3e6e1d44463e3c0a3523b205234..77e2299eb98c9bdedb5837b49d77f3fa251cb3ad 100644 (file)
@@ -53,7 +53,7 @@ public class StatisticsContextImplTest extends StatisticsContextImpMockInitiatio
     }
 
     private void initStatisticsContext() {
-        statisticsContext = new StatisticsContextImpl<MultipartReply>(
+        statisticsContext = new StatisticsContextImpl<>(
                 mockedDeviceContext, convertorManager,
                 MultipartWriterProviderFactory.createDefaultProvider(mockedDeviceContext),
                 true,
@@ -76,7 +76,7 @@ public class StatisticsContextImplTest extends StatisticsContextImpMockInitiatio
      */
     @Test
     public void testClose() throws Exception {
-        final StatisticsContextImpl<MultipartReply> statisticsContext = new StatisticsContextImpl<MultipartReply>(
+        final StatisticsContextImpl<MultipartReply> statisticsContext = new StatisticsContextImpl<>(
                 mockedDeviceContext, convertorManager,
                 MultipartWriterProviderFactory.createDefaultProvider(mockedDeviceContext),
                 true, false, 3000, 50000);
index 3ef1d20474f5f4e4c6825baee1c893ed64b86167..6b84f0310f8a3a036d4fdfdb71720ccdf9d7f3fc 100644 (file)
@@ -112,7 +112,7 @@ public class FlowDirectStatisticsServiceTest extends AbstractDirectStatisticsSer
         when(stat.getTableId()).thenReturn(TABLE_NO);
         when(stat.getMatch()).thenReturn(new MatchBuilder().build());
 
-        final List<FlowAndStatisticsMapList> stats = Arrays.asList(stat);
+        final List<FlowAndStatisticsMapList> stats = Collections.singletonList(stat);
         final GetFlowStatisticsOutput output = mock(GetFlowStatisticsOutput.class);
         when(output.getFlowAndStatisticsMapList()).thenReturn(stats);
 
index 4547b2645a4b27a15ad0003e3d586baff3328808..3fbe7d64c41a58d1f3b5abd75f6030eba2e74c6e 100644 (file)
@@ -105,7 +105,7 @@ public class GroupDirectStatisticsServiceTest extends AbstractDirectStatisticsSe
         when(stat.getGroupId()).thenReturn(new GroupId(GROUP_NO));
 
         final List<org.opendaylight.yang.gen.v1.urn
-                .opendaylight.group.types.rev131018.group.statistics.reply.GroupStats> stats = Arrays.asList(stat);
+                .opendaylight.group.types.rev131018.group.statistics.reply.GroupStats> stats = Collections.singletonList(stat);
         final GetGroupStatisticsOutput output = mock(GetGroupStatisticsOutput.class);
         when(output.getGroupStats()).thenReturn(stats);
 
index f361d509b3697597c4c8df4dcab089a7e7bbe66a..bba979331349b22dd9a0d7fa4b39b0c304c9b355 100644 (file)
@@ -105,7 +105,7 @@ public class MeterDirectStatisticsServiceTest extends AbstractDirectStatisticsSe
         when(stat.getMeterId()).thenReturn(new MeterId(METER_NO));
 
         final List<org.opendaylight.yang.gen.v1.urn
-                .opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats> stats = Arrays.asList(stat);
+                .opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats> stats = Collections.singletonList(stat);
         final GetMeterStatisticsOutput output = mock(GetMeterStatisticsOutput.class);
         when(output.getMeterStats()).thenReturn(stats);
 
index 6969ce96a3334245efe7e8acc419ce58907754d7..253e1a8ba384338bd1fd2795e8e88dbd5896f1e2 100644 (file)
@@ -18,6 +18,7 @@ import static org.mockito.Mockito.when;
 
 import java.math.BigInteger;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.openflowplugin.api.openflow.device.Xid;
@@ -67,8 +68,8 @@ public class NodeConnectorDirectStatisticsServiceTest extends AbstractDirectStat
         final MultipartReplyPortStatsCase nodeConnectorCase = mock(MultipartReplyPortStatsCase.class);
         final MultipartReplyPortStats nodeConnector = mock(MultipartReplyPortStats.class);
         final PortStats nodeConnectorStat = mock(PortStats.class);
-        final List<PortStats> nodeConnectorStats = Arrays.asList(nodeConnectorStat);
-        final List<MultipartReply> input = Arrays.asList(reply);
+        final List<PortStats> nodeConnectorStats = Collections.singletonList(nodeConnectorStat);
+        final List<MultipartReply> input = Collections.singletonList(reply);
 
         when(nodeConnector.getPortStats()).thenReturn(nodeConnectorStats);
         when(nodeConnectorCase.getMultipartReplyPortStats()).thenReturn(nodeConnector);
@@ -101,7 +102,7 @@ public class NodeConnectorDirectStatisticsServiceTest extends AbstractDirectStat
         final NodeConnectorStatisticsAndPortNumberMap stat = mock(NodeConnectorStatisticsAndPortNumberMap.class);
         when(stat.getNodeConnectorId()).thenReturn(nodeConnectorId);
 
-        final List<NodeConnectorStatisticsAndPortNumberMap> stats = Arrays.asList(stat);
+        final List<NodeConnectorStatisticsAndPortNumberMap> stats = Collections.singletonList(stat);
         final GetNodeConnectorStatisticsOutput output = mock(GetNodeConnectorStatisticsOutput.class);
         when(output.getNodeConnectorStatisticsAndPortNumberMap()).thenReturn(stats);
 
index 07ef4d5cbd587602ba178e885d31dbc33b98abfe..9944e075d7d03443c1432267625fe2121759e175 100644 (file)
@@ -18,6 +18,7 @@ import static org.mockito.Mockito.when;
 
 import java.math.BigInteger;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.openflowplugin.api.openflow.device.Xid;
@@ -72,8 +73,8 @@ public class QueueDirectStatisticsServiceTest extends AbstractDirectStatisticsSe
         final MultipartReplyQueueCase queueCase = mock(MultipartReplyQueueCase.class);
         final MultipartReplyQueue queue = mock(MultipartReplyQueue.class);
         final QueueStats queueStat = mock(QueueStats.class);
-        final List<QueueStats> queueStats = Arrays.asList(queueStat);
-        final List<MultipartReply> input = Arrays.asList(reply);
+        final List<QueueStats> queueStats = Collections.singletonList(queueStat);
+        final List<MultipartReply> input = Collections.singletonList(reply);
 
         when(queue.getQueueStats()).thenReturn(queueStats);
         when(queueCase.getMultipartReplyQueue()).thenReturn(queue);
@@ -98,7 +99,7 @@ public class QueueDirectStatisticsServiceTest extends AbstractDirectStatisticsSe
         final QueueIdAndStatisticsMap map = mock(QueueIdAndStatisticsMap.class);
         when(map.getQueueId()).thenReturn(new QueueId(QUEUE_NO));
 
-        final List<QueueIdAndStatisticsMap> maps = Arrays.asList(map);
+        final List<QueueIdAndStatisticsMap> maps = Collections.singletonList(map);
         final GetQueueStatisticsOutput output = mock(GetQueueStatisticsOutput.class);
         when(output.getQueueIdAndStatisticsMap()).thenReturn(maps);
 
index 8035dc93e98b1fec244b835a5fdd6b65fe6f0100..22bfbe644e7cee3046cdee65eb2a1a6296925199 100644 (file)
@@ -108,7 +108,7 @@ public class FlowDirectStatisticsServiceTest extends AbstractDirectStatisticsSer
         when(stat.getTableId()).thenReturn(TABLE_NO);
         when(stat.getMatch()).thenReturn(new MatchBuilder().build());
 
-        final List<FlowAndStatisticsMapList> stats = Arrays.asList(stat);
+        final List<FlowAndStatisticsMapList> stats = Collections.singletonList(stat);
         final GetFlowStatisticsOutput output = mock(GetFlowStatisticsOutput.class);
         when(output.getFlowAndStatisticsMapList()).thenReturn(stats);
 
index adea301ea4a1a3b356b177bb22ebd4055574bb98..f2247cc0557759770015eb38ffc7f91f70682c3d 100644 (file)
@@ -92,7 +92,7 @@ public class GroupDirectStatisticsServiceTest extends AbstractDirectStatisticsSe
         when(stat.getGroupId()).thenReturn(new GroupId(GROUP_NO));
 
         final List<org.opendaylight.yang.gen.v1.urn
-                .opendaylight.group.types.rev131018.group.statistics.reply.GroupStats> stats = Arrays.asList(stat);
+                .opendaylight.group.types.rev131018.group.statistics.reply.GroupStats> stats = Collections.singletonList(stat);
         final GetGroupStatisticsOutput output = mock(GetGroupStatisticsOutput.class);
         when(output.getGroupStats()).thenReturn(stats);
 
index 64672443786f01e465bed2177be78b879f19f204..d394fd7bd3a603ba19860209d09a740361b6de28 100644 (file)
@@ -103,7 +103,7 @@ public class MeterDirectStatisticsServiceTest extends AbstractDirectStatisticsSe
         when(stat.getMeterId()).thenReturn(new MeterId(METER_NO));
 
         final List<org.opendaylight.yang.gen.v1.urn
-                .opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats> stats = Arrays.asList(stat);
+                .opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats> stats = Collections.singletonList(stat);
         final GetMeterStatisticsOutput output = mock(GetMeterStatisticsOutput.class);
         when(output.getMeterStats()).thenReturn(stats);
 
index 2ced51a7218bb4112ab54613ffddad6b3bf15694..709ba4c1d7786041660d5352d03d3b1566275c3b 100644 (file)
@@ -85,7 +85,7 @@ public class NodeConnectorDirectStatisticsServiceTest extends AbstractDirectStat
         final NodeConnectorStatisticsAndPortNumberMap stat = mock(NodeConnectorStatisticsAndPortNumberMap.class);
         when(stat.getNodeConnectorId()).thenReturn(nodeConnectorId);
 
-        final List<NodeConnectorStatisticsAndPortNumberMap> stats = Arrays.asList(stat);
+        final List<NodeConnectorStatisticsAndPortNumberMap> stats = Collections.singletonList(stat);
         final GetNodeConnectorStatisticsOutput output = mock(GetNodeConnectorStatisticsOutput.class);
         when(output.getNodeConnectorStatisticsAndPortNumberMap()).thenReturn(stats);
 
index 33026c116c9b3528aed2db1c9edf0af4c1181403..bd29c2de8f9e28a1e1d387b9ae3a3d924a0a3ded 100644 (file)
@@ -95,7 +95,7 @@ public class QueueDirectStatisticsServiceTest extends AbstractDirectStatisticsSe
         final QueueIdAndStatisticsMap map = mock(QueueIdAndStatisticsMap.class);
         when(map.getQueueId()).thenReturn(new QueueId(QUEUE_NO));
 
-        final List<QueueIdAndStatisticsMap> maps = Arrays.asList(map);
+        final List<QueueIdAndStatisticsMap> maps = Collections.singletonList(map);
         final GetQueueStatisticsOutput output = mock(GetQueueStatisticsOutput.class);
         when(output.getQueueIdAndStatisticsMap()).thenReturn(maps);
 
index 6803d5deb6f422457bb130cb3978d9197b34a475..be1be7fb1d47edeba108dc67436ec37c53a76eef 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.openflowplugin.impl.translator;
 import com.google.common.collect.Lists;
 import java.math.BigInteger;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import org.junit.Assert;
 import org.junit.Before;
@@ -82,7 +83,7 @@ public class PacketReceivedTranslatorTest {
 
     @Before
     public void setUp() throws Exception {
-        final List<PhyPort> phyPorts = Arrays.asList(phyPort);
+        final List<PhyPort> phyPorts = Collections.singletonList(phyPort);
         convertorManager = ConvertorManagerFactory.createDefaultManager();
 
         Mockito.when(deviceContext.getPrimaryConnectionContext()).thenReturn(connectionContext);
index 18495eab440ff31f3980607430b19a6ac41968e4..75273c26af54eb75be485d92de9c78feb42ec0a6 100644 (file)
@@ -30,7 +30,7 @@ public class MatchUtilTest {
 
     private MatchV10Builder expectedV10Match() {
         Short zeroShort = Short.valueOf("0");
-        Integer zeroInteger = Integer.valueOf(0);
+        Integer zeroInteger = 0;
         MatchV10Builder matchV10Builder = new MatchV10Builder();
         matchV10Builder.setDlDst(ZERO_MAC_ADDRESS);
         matchV10Builder.setDlSrc(ZERO_MAC_ADDRESS);
index 1e28a5498ddc462eee432faebcae46361d2320e9..7849780ce5d9c944f915f28683ab9e7611013c76 100644 (file)
@@ -11,7 +11,6 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
 import java.util.Collection;
 import java.util.Optional;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorData;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
 
 public interface ConvertorExecutor {
     /**
@@ -24,7 +23,7 @@ public interface ConvertorExecutor {
      * @param data   convertor data
      * @return the result (can be empty, if no convertor was found)
      */
-    <FROM extends DataContainer, TO, DATA extends ConvertorData> Optional<TO> convert(final FROM source, final DATA data);
+    <FROM, TO, DATA extends ConvertorData> Optional<TO> convert(final FROM source, final DATA data);
 
     /**
      * Lookup and use convertor by specified type, then converts source collection and returns converted result
@@ -36,5 +35,5 @@ public interface ConvertorExecutor {
      * @param data   convertor data
      * @return the result (can be empty, if no convertor was found)
      */
-    <FROM extends DataContainer, TO, DATA extends ConvertorData> Optional<TO> convert(final Collection<FROM> source, final DATA data);
+    <FROM, TO, DATA extends ConvertorData> Optional<TO> convert(final Collection<FROM> source, final DATA data);
 }
\ No newline at end of file
index 191b21d241fd20eb6d5652d60f9d2040ae54e35d..5c3ed315fcb1ad264918ac34dc387666861c5f62 100644 (file)
@@ -31,7 +31,7 @@ public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator
 
     // Cache, that holds all registered convertors, but they can have multiple keys,
     // based on instanceof checks in the convert method
-    private Map<Short, Map<Class<? extends DataContainer>, Convertor<?, ?, ? extends ConvertorData>>> convertors;
+    private Map<Short, Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>>> convertors;
 
     /**
      * Create new instance of Convertor Manager
@@ -51,11 +51,11 @@ public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator
 
     @Override
     public ConvertorManager registerConvertor(final short version, final Convertor<?, ?, ? extends ConvertorData> convertor) {
-        final Map<Class<? extends DataContainer>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
+        final Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
                 convertors.get(version);
 
         if (Objects.nonNull(convertorsForVersion)) {
-            for (final Class<? extends DataContainer> type : convertor.getTypes()) {
+            for (final Class<?> type : convertor.getTypes()) {
                 final Convertor<?, ?, ? extends ConvertorData> result = convertorsForVersion.get(type);
 
                 if (Objects.isNull(result)) {
@@ -75,7 +75,7 @@ public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator
 
     @Override
     @SuppressWarnings("unchecked")
-    public <FROM extends DataContainer, TO, DATA extends ConvertorData> Optional<TO> convert(final FROM source, final DATA data) {
+    public <FROM, TO, DATA extends ConvertorData> Optional<TO> convert(final FROM source, final DATA data) {
         Optional<TO> result = Optional.empty();
 
         if (Objects.isNull(source)) {
@@ -83,7 +83,9 @@ public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator
             return result;
         }
 
-        final Class<? extends DataContainer> type = source.getImplementedInterface();
+        final Class<?> type = source instanceof DataContainer ?
+                ((DataContainer)source).getImplementedInterface()
+                : source.getClass();
 
         if (Objects.isNull(type)) {
             LOG.warn("Cannot extract type from {}, because getImplementedInterface() returns null", source);
@@ -96,7 +98,7 @@ public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator
 
     @Override
     @SuppressWarnings("unchecked")
-    public <FROM extends DataContainer, TO, DATA extends ConvertorData> Optional<TO> convert(final Collection<FROM> source, final DATA data) {
+    public <FROM, TO, DATA extends ConvertorData> Optional<TO> convert(final Collection<FROM> source, final DATA data) {
         Optional<TO> result = Optional.empty();
 
         if (Objects.isNull(source)) {
@@ -104,14 +106,18 @@ public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator
             return result;
         }
 
-        final Optional<FROM> first = source.stream().findFirst();
+        final Optional<FROM> firstOptional = source.stream().findFirst();
 
-        if (!first.isPresent()) {
+        if (!firstOptional.isPresent()) {
             LOG.trace("Cannot extract type from empty collection");
             return result;
         }
 
-        final Class<? extends DataContainer> type = first.get().getImplementedInterface();
+        final FROM first = firstOptional.get();
+
+        final Class<?> type = first instanceof DataContainer ?
+                ((DataContainer)first).getImplementedInterface()
+                : first.getClass();
 
         if (Objects.isNull(type)) {
             LOG.warn("Cannot extract type from {}, because getImplementedInterface() returns null", source);
@@ -130,8 +136,8 @@ public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator
      * @return found convertor
      */
     @VisibleForTesting
-    Optional<Convertor> findConvertor(final short version, final Class<? extends DataContainer> type) {
-        final Map<Class<? extends DataContainer>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
+    Optional<Convertor> findConvertor(final short version, final Class<?> type) {
+        final Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
                 convertors.get(version);
 
         Optional<Convertor> convertor = Optional.empty();
@@ -140,7 +146,7 @@ public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator
             convertor = Optional.ofNullable(convertorsForVersion.get(type));
 
             if (!convertor.isPresent()) {
-                for (final Class<? extends DataContainer> convertorType : convertorsForVersion.keySet()) {
+                for (final Class<?> convertorType : convertorsForVersion.keySet()) {
                     if (type.isAssignableFrom(convertorType)) {
                         final Convertor<?, ?, ? extends ConvertorData> foundConvertor = convertorsForVersion.get(convertorType);
                         convertor = Optional.ofNullable(foundConvertor);
index 5111912c620227d4f46443be19352d3826719879..3791d89ef6536708e1cb262ccefcd99d26a3eaf7 100644 (file)
@@ -12,9 +12,13 @@ import org.opendaylight.openflowplugin.api.OFConstants;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.ActionConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.ActionResponseConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowFlagsConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowFlagsV10Convertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowInstructionResponseConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowStatsResponseConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchV10Convertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchV10ResponseConvertor;
 
 /**
@@ -33,6 +37,8 @@ public class ConvertorManagerFactory {
         final MeterStatsResponseConvertor meterStatsResponseConvertor = new MeterStatsResponseConvertor();
         final MeterConfigStatsResponseConvertor meterConfigStatsResponseConvertor = new MeterConfigStatsResponseConvertor();
         final PortConvertor portConvertor = new PortConvertor();
+        final MatchConvertor matchConvertor = new MatchConvertor();
+        final MatchV10Convertor matchV10Convertor = new MatchV10Convertor();
         final MatchResponseConvertor matchResponseConvertor = new MatchResponseConvertor();
         final MatchV10ResponseConvertor matchV10ResponseConvertor = new MatchV10ResponseConvertor();
         final ActionConvertor actionConvertor = new ActionConvertor();
@@ -44,6 +50,8 @@ public class ConvertorManagerFactory {
         final FlowConvertor flowConvertor = new FlowConvertor();
         final FlowInstructionResponseConvertor flowInstructionResponseConvertor = new FlowInstructionResponseConvertor();
         final FlowStatsResponseConvertor flowStatsResponseConvertor = new FlowStatsResponseConvertor();
+        final FlowFlagsConvertor flowFlagsConvertor = new FlowFlagsConvertor();
+        final FlowFlagsV10Convertor flowFlagsV10Convertor = new FlowFlagsV10Convertor();
 
         return new ConvertorManager(OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3)
                 .registerConvertor(OFConstants.OFP_VERSION_1_0, tableFeaturesConvertor)
@@ -58,7 +66,8 @@ public class ConvertorManagerFactory {
                 .registerConvertor(OFConstants.OFP_VERSION_1_3, meterConfigStatsResponseConvertor)
                 .registerConvertor(OFConstants.OFP_VERSION_1_0, portConvertor)
                 .registerConvertor(OFConstants.OFP_VERSION_1_3, portConvertor)
-                // TODO: Add MatchConvertorImpl and MatchConvertorV10Impl
+                .registerConvertor(OFConstants.OFP_VERSION_1_0, matchV10Convertor)
+                .registerConvertor(OFConstants.OFP_VERSION_1_3, matchConvertor)
                 .registerConvertor(OFConstants.OFP_VERSION_1_3, matchResponseConvertor)
                 .registerConvertor(OFConstants.OFP_VERSION_1_0, matchV10ResponseConvertor)
                 .registerConvertor(OFConstants.OFP_VERSION_1_0, actionConvertor)
@@ -78,6 +87,8 @@ public class ConvertorManagerFactory {
                 .registerConvertor(OFConstants.OFP_VERSION_1_0, flowInstructionResponseConvertor)
                 .registerConvertor(OFConstants.OFP_VERSION_1_3, flowInstructionResponseConvertor)
                 .registerConvertor(OFConstants.OFP_VERSION_1_0, flowStatsResponseConvertor)
-                .registerConvertor(OFConstants.OFP_VERSION_1_3, flowStatsResponseConvertor);
+                .registerConvertor(OFConstants.OFP_VERSION_1_3, flowStatsResponseConvertor)
+                .registerConvertor(OFConstants.OFP_VERSION_1_0, flowFlagsV10Convertor)
+                .registerConvertor(OFConstants.OFP_VERSION_1_3, flowFlagsConvertor);
     }
-}
+}
\ No newline at end of file
index 527da0910d37db00ef8c9f46c18af15ffa8ea647..6290a3d8822c013f2de24312005f88da513d183d 100644 (file)
@@ -35,7 +35,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev13
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsListBuilder;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -53,7 +52,7 @@ import org.slf4j.LoggerFactory;
  * </pre>
  */
 public class GroupConvertor extends Convertor<Group, GroupModInputBuilder, VersionDatapathIdConvertorData> {
-    private static final List<Class<? extends DataContainer>> TYPES = Arrays.asList(Group.class, AddGroupInput.class, RemoveGroupInput.class, UpdatedGroup.class);
+    private static final List<Class<?>> TYPES = Arrays.asList(Group.class, AddGroupInput.class, RemoveGroupInput.class, UpdatedGroup.class);
     /**
      * Create default empty group mod input builder
      * Use this method, if result from convertor is empty.
@@ -136,7 +135,7 @@ public class GroupConvertor extends Convertor<Group, GroupModInputBuilder, Versi
     }
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return  TYPES;
     }
 
index 6b58fa33fe82016184bc7b4f1d261f1b1791c110..ba5f91e7b2b0a688ca5bdcf7ed6d03fa3d76ef04 100644 (file)
@@ -47,7 +47,7 @@ import org.opendaylight.yangtools.yang.binding.DataContainer;
  */
 public class GroupDescStatsResponseConvertor extends Convertor<List<GroupDesc>, List<GroupDescStats>, VersionConvertorData> {
 
-    private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(GroupDesc.class);
+    private static final Set<Class<?>> TYPES = Collections.singleton(GroupDesc.class);
 
     private org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets toSALBucketsDesc(List<BucketsList> bucketDescStats, short version) {
         final ActionResponseConvertorData data = new ActionResponseConvertorData(version);
@@ -99,7 +99,7 @@ public class GroupDescStatsResponseConvertor extends Convertor<List<GroupDesc>,
     }
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return TYPES;
     }
 
index aea519d4d9320c268be3d2570dcdda46a8327f67..a2be1e222238027b2ac05c359e2519d70faef515 100644 (file)
@@ -13,10 +13,10 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.Buckets;
@@ -29,7 +29,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStatsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStatsKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.group.stats.BucketStats;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
 
 /**
  * Converts group related statistics messages coming from switch to MD-SAL messages.
@@ -47,7 +46,7 @@ public class GroupStatsResponseConvertor extends Convertor<
         List<GroupStats>,
         VersionConvertorData> {
 
-    private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats.class);
+    private static final Set<Class<?>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats.class);
 
     private Buckets toSALBuckets(List<BucketStats> bucketStats) {
         BucketsBuilder salBuckets = new BucketsBuilder();
@@ -71,7 +70,7 @@ public class GroupStatsResponseConvertor extends Convertor<
     }
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return TYPES;
     }
 
index 218c5457a75fe6164214212b12cec95a47183c38..bc63700d7746cd09d29c0b3ef23635ff5fa4a66e 100644 (file)
@@ -53,10 +53,10 @@ import org.opendaylight.yangtools.yang.binding.DataContainer;
  */
 public class MeterConfigStatsResponseConvertor extends Convertor<List<MeterConfig>, List<MeterConfigStats>, VersionConvertorData> {
 
-    private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(MeterConfig.class);
+    private static final Set<Class<?>> TYPES = Collections.singleton(MeterConfig.class);
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return TYPES;
     }
 
index 8a7dc4274553a09f66ebab7dc7a6808df3e61ec2..1bd059bafeb4141f50ac8a314bc4c8566d46b9a1 100644 (file)
@@ -57,7 +57,7 @@ import org.slf4j.LoggerFactory;
  */
 public class MeterConvertor extends Convertor<Meter, MeterModInputBuilder, VersionConvertorData> {
     private static final Logger LOG = LoggerFactory.getLogger(MeterConvertor.class);
-    private static final List<Class<? extends DataContainer>> TYPES = Arrays.asList(Meter.class, AddMeterInput.class, RemoveMeterInput.class, UpdatedMeter.class);
+    private static final List<Class<?>> TYPES = Arrays.asList(Meter.class, AddMeterInput.class, RemoveMeterInput.class, UpdatedMeter.class);
 
     /**
      * Create default empty meter mot input builder.
@@ -147,7 +147,7 @@ public class MeterConvertor extends Convertor<Meter, MeterModInputBuilder, Versi
     }
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return  TYPES;
     }
 
index 654e8cde9787e818926c211311fa4a141edfa9bc..c7c6a8c6097450aa481e6442f5435c01c941ade7 100644 (file)
@@ -47,10 +47,10 @@ public class MeterStatsResponseConvertor extends Convertor<
         List<MeterStats>,
         VersionConvertorData> {
 
-    private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.MeterStats.class);
+    private static final Set<Class<?>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.MeterStats.class);
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return TYPES;
     }
 
index bc320215b8e2b9a7e18a7757eeb25eef43db7c85..b0aee3b8429954b5c683628df5dcb39eaa89b30c 100644 (file)
@@ -53,7 +53,7 @@ import org.slf4j.LoggerFactory;
  */
 public class PacketOutConvertor extends Convertor<TransmitPacketInput, PacketOutInput, PacketOutConvertorData> {
     private static final Logger LOG = LoggerFactory.getLogger(PacketOutConvertor.class);
-    private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(TransmitPacketInput.class);
+    private static final Set<Class<?>> TYPES = Collections.singleton(TransmitPacketInput.class);
 
     /**
      * Create default empty meter mot input builder.
@@ -79,7 +79,7 @@ public class PacketOutConvertor extends Convertor<TransmitPacketInput, PacketOut
     }
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return TYPES;
     }
 
index 2ca332aef34708b73028a9b3a261b3facbd99c8b..f0041a49ffd08b0d22c844049fe7bd69b58d7d63 100644 (file)
@@ -30,7 +30,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.multipart.reply.port.desc.Ports;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.multipart.reply.port.desc.PortsBuilder;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
 
 /**
  * Converts port mod, port status and port description MD-SAL messages to OF library data
@@ -45,7 +44,7 @@ import org.opendaylight.yangtools.yang.binding.DataContainer;
  */
 public class PortConvertor extends Convertor<Port, PortModInput, VersionConvertorData> {
 
-    private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(Port.class);
+    private static final Set<Class<?>> TYPES = Collections.singleton(Port.class);
 
     /**
      * Create default empty port mod input
@@ -162,7 +161,7 @@ public class PortConvertor extends Convertor<Port, PortModInput, VersionConverto
     }
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return TYPES;
     }
 
index 38b1935b32e22079253b3eaf096bc5eceb6d2192..9ca8b5011ec83ea802668d7f8a8cd89cc21786d7 100644 (file)
@@ -129,6 +129,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.multipart.request.table.features.TableFeaturesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeatureProperties;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeaturePropertiesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.table.update.UpdatedTable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.TableFeaturePropType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplyActions;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplyActionsMiss;
@@ -147,8 +148,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.match.MatchSetfield;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.next.table.miss.TablesMiss;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.wildcards.WildcardSetfield;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.table.update.UpdatedTable;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -172,7 +171,7 @@ public class TableFeaturesConvertor extends Convertor<
     private static final Ordering<org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.table.features.table.properties.TableFeatureProperties> TABLE_FEATURE_PROPS_ORDERING =
             Ordering.from(OrderComparator.<org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.table.features.table.properties.TableFeatureProperties>build());
     private static final Map<Class<?>, Class<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField>> SAL_TO_OF_TABLE_FEATURES;
-    private static final List<Class<? extends DataContainer>> TYPES = Arrays.asList(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableFeatures.class, UpdatedTable.class);
+    private static final List<Class<?>> TYPES = Arrays.asList(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableFeatures.class, UpdatedTable.class);
 
     static {
         Builder<Class<?>, Class<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField>> builder = ImmutableMap.builder();
@@ -600,7 +599,7 @@ public class TableFeaturesConvertor extends Convertor<
     }
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return  TYPES;
     }
 
index 04c7e72ef5e5eb3377faa0f4b1baceeec5faae5d..0ee23117c8da1d7e1c8f53fb5f423057720991fe 100644 (file)
@@ -185,7 +185,7 @@ public class TableFeaturesResponseConvertor extends Convertor<MultipartReplyTabl
     private static final Map<TableFeaturesPropType, ActionExecutor> TABLE_FEATURE_PROPERTY_TYPE_TO_ACTION;
     private static final Map<Class<?>, org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> OF_TO_SAL_ACTION;
     private static final Map<Class<? extends MatchField>, Class<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MatchField>> OF_TO_SAL_TABLE_FEATURE_PROPERTIES;
-    private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(MultipartReplyTableFeatures.class);
+    private static final Set<Class<?>> TYPES = Collections.singleton(MultipartReplyTableFeatures.class);
 
     static {
         final Builder<TableFeaturesPropType, ActionExecutor> builder = ImmutableMap.builder();
@@ -487,7 +487,7 @@ public class TableFeaturesResponseConvertor extends Convertor<MultipartReplyTabl
     }
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return TYPES;
     }
 
index 13ae9dbc911c3c92d932e6d07aff912e95a03385..c66508bfad3bc9710a453aebce570b0504e743e9 100644 (file)
@@ -130,12 +130,12 @@ public final class ActionConvertor extends Convertor<
             .addCase(new SalToOfSetNwTosActionV10Case())
             // Try to convert action grouping using converters from openflowplugin-extension
             .addCase(new SalToOfGeneralExtensionGroupingCase());
-    private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action.class);
+    private static final Set<Class<?>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action.class);
     private static final Ordering<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> ACTION_ORDERING =
             Ordering.from(OrderComparator.<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action>build());
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return TYPES;
     }
 
index f9e75fd93a764c0e0a15514c8ce50ab8207c294a..e17457fb7220cf55b0fa9f51bf5933e4c72dbde3 100644 (file)
@@ -99,10 +99,10 @@ public final class ActionResponseConvertor extends Convertor<
             .addCase(new OfToSalSetVlanPcpCase())
             .addCase(new OfToSalSetVlanIdCase())
             .addCase(new OfToSalStripVlanCase());
-    private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(Action.class);
+    private static final Set<Class<?>> TYPES = Collections.singleton(Action.class);
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return TYPES;
     }
 
index a54ecc23bedab8ecd25388ab8f6611404bf2c195..9145ae0c7d58a14e88ebb3baaa5196846574f7bb 100644 (file)
@@ -14,7 +14,7 @@ import org.opendaylight.openflowplugin.api.OFConstants;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionConvertorData;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchInjector;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.field._case.SetFieldActionBuilder;
@@ -32,7 +32,9 @@ public class SalToOfSetFieldCase extends ConvertorCase<SetFieldCase, Action, Act
         final short version = data.getVersion();
         final SetFieldActionBuilder setFieldBuilder = new SetFieldActionBuilder();
 
-        MatchReactor.getInstance().convert(source.getSetField(), version, setFieldBuilder, convertorExecutor);
+        // convert and inject match
+        final Optional<Object> conversionMatch = convertorExecutor.convert(source.getSetField(), data);
+        MatchInjector.inject(conversionMatch, setFieldBuilder, version);
 
         return Optional.of(new ActionBuilder()
                 .setActionChoice(new SetFieldCaseBuilder()
index 91f91d2aac3c19c559aac2a4b6044594cc7c8562..2afc64e087ed19e2f2de587cb3967aeb37a966bc 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common;
 
 import java.util.Collection;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
 
 /**
  * Converts OpenflowJava to MDSal model and vice versa
@@ -46,7 +45,7 @@ public abstract class Convertor<FROM, TO, DATA extends ConvertorData> {
      *
      * @return the type of convertor
      */
-    public abstract Collection<Class<? extends DataContainer>> getTypes();
+    public abstract Collection<Class<?>> getTypes();
 
     /**
      * Converts source to result
index 47a8a3f0111b9475169f999c0cdc1bd1f9aaeec5..049eba6c8a65d099123af2a13cb32e7693215840 100644 (file)
@@ -30,8 +30,7 @@ import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.cases
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.cases.MeterCase;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.cases.WriteActionsCase;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.cases.WriteMetadataCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.flowflag.FlowFlagReactor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchInjector;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.VlanCfi;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
@@ -65,7 +64,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev13
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
 
 /**
  * Converts the SAL Flow to OF Flow. It checks if there is a set-vlan-id (1.0) action made on OF1.3.
@@ -144,7 +142,7 @@ public class FlowConvertor extends Convertor<Flow, List<FlowModInputBuilder>, Ve
             .addCase(new MeterCase())
             .addCase(new WriteActionsCase())
             .addCase(new WriteMetadataCase());
-    private static final List<Class<? extends DataContainer>> TYPES = Arrays.asList(Flow.class, AddFlowInput.class, RemoveFlowInput.class, UpdatedFlow.class);
+    private static final List<Class<?>> TYPES = Arrays.asList(Flow.class, AddFlowInput.class, RemoveFlowInput.class, UpdatedFlow.class);
 
     static {
         final VlanId zeroVlan = new VlanId(0);
@@ -165,7 +163,7 @@ public class FlowConvertor extends Convertor<Flow, List<FlowModInputBuilder>, Ve
         VLAN_MATCH_TRUE = vlanMatchBuilder2.build();
     }
 
-    private FlowModInputBuilder toFlowModInput(Flow flow, short version, BigInteger datapathid) {
+    private FlowModInputBuilder toFlowModInput(Flow flow, VersionDatapathIdConvertorData versionConverterData) {
 
         FlowModInputBuilder flowMod = new FlowModInputBuilder();
         salToOFFlowCookie(flow, flowMod);
@@ -180,19 +178,19 @@ public class FlowConvertor extends Convertor<Flow, List<FlowModInputBuilder>, Ve
         salToOFFlowOutGroup(flow, flowMod);
 
         // convert and inject flowFlags
-        FlowFlagReactor.getInstance().convert(flow.getFlags(), version, flowMod, getConvertorExecutor());
+        final Optional<Object> conversion = getConvertorExecutor().convert(flow.getFlags(), versionConverterData);
+        FlowFlagsInjector.inject(conversion, flowMod, versionConverterData.getVersion());
 
         // convert and inject match
-        MatchReactor.getInstance().convert(flow.getMatch(), version, flowMod, getConvertorExecutor());
+        final Optional<Object> conversionMatch = getConvertorExecutor().convert(flow.getMatch(), versionConverterData);
+        MatchInjector.inject(conversionMatch, flowMod, versionConverterData.getVersion());
 
         if (flow.getInstructions() != null) {
-            flowMod.setInstruction(toInstructions(flow, version, datapathid));
-            flowMod.setAction(getActions(version, datapathid, flow));
+            flowMod.setInstruction(toInstructions(flow, versionConverterData.getVersion(), versionConverterData.getDatapathId()));
+            flowMod.setAction(getActions(versionConverterData.getVersion(), versionConverterData.getDatapathId(), flow));
         }
 
-        flowMod.setVersion(version);
-
-        return flowMod;
+        flowMod.setVersion(versionConverterData.getVersion());        return flowMod;
     }
 
     private static void salToOFFlowOutGroup(Flow flow, FlowModInputBuilder flowMod) {
@@ -361,7 +359,7 @@ public class FlowConvertor extends Convertor<Flow, List<FlowModInputBuilder>, Ve
      * Â  Â  1) Match on (OFPVID_NONE ) without mask + action [push vlan tag + set_field]
      * Â  Â  2) Match on (OFPVID_PRESENT) with mask (OFPVID_PRESENT ) + action [ set_field]
      */
-    private List<FlowModInputBuilder> handleSetVlanIdForOF13(Flow srcFlow, short version, BigInteger datapathId) {
+    private List<FlowModInputBuilder> handleSetVlanIdForOF13(Flow srcFlow, VersionDatapathIdConvertorData versionDatapathIdConverterData) {
         List<FlowModInputBuilder> list = new ArrayList<>(2);
 
         final Match srcMatch = Preconditions.checkNotNull(srcFlow.getMatch());
@@ -378,7 +376,7 @@ public class FlowConvertor extends Convertor<Flow, List<FlowModInputBuilder>, Ve
 
             Optional<? extends Flow> optional = injectMatchToFlow(srcFlow, match);
             if (optional.isPresent()) {
-                list.add(toFlowModInput(optional.get(), version, datapathId));
+                list.add(toFlowModInput(optional.get(), versionDatapathIdConverterData));
             }
         } else {
             // create 2 flows
@@ -388,7 +386,7 @@ public class FlowConvertor extends Convertor<Flow, List<FlowModInputBuilder>, Ve
 
             Optional<? extends Flow> optional1 = injectMatchAndAction(srcFlow, match1);
             if (optional1.isPresent()) {
-                list.add(toFlowModInput(optional1.get(), version, datapathId));
+                list.add(toFlowModInput(optional1.get(), versionDatapathIdConverterData));
             }
 
             //flow2
@@ -396,7 +394,7 @@ public class FlowConvertor extends Convertor<Flow, List<FlowModInputBuilder>, Ve
             Match match2 = new MatchBuilder(srcMatch).setVlanMatch(VLAN_MATCH_TRUE).build();
             Optional<? extends Flow> optional2 = injectMatchToFlow(srcFlow, match2);
             if (optional2.isPresent()) {
-                list.add(toFlowModInput(optional2.get(), version, datapathId));
+                list.add(toFlowModInput(optional2.get(), versionDatapathIdConverterData));
             }
         }
         return list;
@@ -514,16 +512,16 @@ public class FlowConvertor extends Convertor<Flow, List<FlowModInputBuilder>, Ve
     }
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return  TYPES;
     }
 
     @Override
     public List<FlowModInputBuilder> convert(Flow source, VersionDatapathIdConvertorData data) {
         if (data.getVersion() >= OFConstants.OFP_VERSION_1_3 && isSetVlanIdActionCasePresent(source)) {
-            return handleSetVlanIdForOF13(source, data.getVersion(), data.getDatapathId());
+            return handleSetVlanIdForOF13(source, data);
         } else {
-            return Collections.singletonList(toFlowModInput(source, data.getVersion(), data.getDatapathId()));
+            return Collections.singletonList(toFlowModInput(source, data));
         }
     }
 }
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/FlowFlagsConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/FlowFlagsConvertor.java
new file mode 100644 (file)
index 0000000..00e3f7a
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;
+
+public class FlowFlagsConvertor extends Convertor<
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags,
+        FlowModFlags,
+        VersionConvertorData> {
+
+    private static final List<Class<?>> TYPES = Collections.singletonList(
+            org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags.class);
+
+
+    /**
+     * Create default empty flow flags
+     * Use this method, if result from converter is empty.
+     */
+    public static FlowModFlags defaultResult() {
+        return new FlowModFlags(
+                FlowConvertor.DEFAULT_OFPFF_CHECK_OVERLAP,
+                FlowConvertor.DEFAULT_OFPFF_NO_BYT_COUNTS,
+                FlowConvertor.DEFAULT_OFPFF_NO_PKT_COUNTS,
+                FlowConvertor.DEFAULT_OFPFF_RESET_COUNTS,
+                FlowConvertor.DEFAULT_OFPFF_FLOW_REM);
+    }
+
+    @Override
+    public Collection<Class<?>> getTypes() {
+        return TYPES;
+    }
+
+    @Override
+    public FlowModFlags convert(final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags source,
+                                final VersionConvertorData data) {
+        return new FlowModFlags(
+                source.isCHECKOVERLAP(), source.isNOBYTCOUNTS(), source.isNOPKTCOUNTS(),
+                source.isRESETCOUNTS(), source.isSENDFLOWREM());
+    }
+}
\ No newline at end of file
@@ -6,36 +6,41 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.flowflag;
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow;
 
+import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowplugin.api.OFConstants;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactorConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorKey;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ResultInjector;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlagsV10;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
 
-/**
- * add prepared convertors and injectors into given mappings
- *
- * @see FlowFlagReactor
- */
-public class FlowFlagReactorMappingFactory {
-
-    /**
-     * @param conversionMapping conversion mapping
-     */
-    public static void addFlowFlagsConvertors(final Map<Short, ConvertReactorConvertor<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags, ?>> conversionMapping) {
-        conversionMapping.put(OFConstants.OFP_VERSION_1_3, new FlowFlagsConvertorImpl());
-        conversionMapping.put(OFConstants.OFP_VERSION_1_0, new FlowFlagsConvertorV10Impl());
+public class FlowFlagsInjector {
+    @SuppressWarnings("unchecked")
+    public static <FROM, TO> void inject(Optional<FROM> source, TO target, short version) {
+        FROM sourceResult;
+        if (source.isPresent()) {
+            sourceResult = source.get();
+        } else if (version == EncodeConstants.OF10_VERSION_ID) {
+            sourceResult = (FROM) FlowFlagsV10Convertor.defaultResult();
+        } else {
+            sourceResult = (FROM) FlowFlagsConvertor.defaultResult();
+        }
+
+        final Map<ConvertorKey, ResultInjector<?, ?>> injectorMap = new HashMap<>();
+        addInjectors(injectorMap);
+
+        final ResultInjector<FROM, TO> injection = (ResultInjector<FROM, TO>) injectorMap
+                .get(new ConvertorKey(version, target.getClass()));
+
+        injection.inject(sourceResult, target);
     }
 
-    /**
-     * @param injectionMapping injection mapping
-     */
-    public static void addFlowFlagsIjectors(final Map<ConvertorKey, ResultInjector<?, ?>> injectionMapping) {
+    private static void addInjectors(final Map<ConvertorKey, ResultInjector<?, ?>> injectionMapping) {
         // OF-1.3|FlowModFlags --> FlowModInputBuilder
         injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_3, FlowModInputBuilder.class),
                 new ResultInjector<FlowModFlags, FlowModInputBuilder>() {
@@ -55,7 +60,5 @@ public class FlowFlagReactorMappingFactory {
                         target.setFlagsV10(value);
                     }
                 });
-
     }
-
-}
+}
\ No newline at end of file
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/FlowFlagsV10Convertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/FlowFlagsV10Convertor.java
new file mode 100644 (file)
index 0000000..38fca81
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlagsV10;
+
+public class FlowFlagsV10Convertor extends Convertor<FlowModFlags, FlowModFlagsV10, VersionConvertorData> {
+    private static final List<Class<?>> TYPES = Collections.singletonList(
+            org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags.class);
+    /**
+     * Create default empty flow flags
+     * Use this method, if result from converter is empty.
+     */
+    public static FlowModFlagsV10 defaultResult() {
+        return new FlowModFlagsV10(
+                FlowConvertor.DEFAULT_OFPFF_CHECK_OVERLAP,
+                FlowConvertor.DEFAULT_OFPFF_EMERGENCY,
+                FlowConvertor.DEFAULT_OFPFF_FLOW_REM);
+    }
+
+    @Override
+    public Collection<Class<?>> getTypes() {
+        return TYPES;
+    }
+
+    @Override
+    public FlowModFlagsV10 convert(final FlowModFlags source, final VersionConvertorData data) {
+        return new FlowModFlagsV10(
+                source.isCHECKOVERLAP(), FlowConvertor.DEFAULT_OFPFF_EMERGENCY, source.isSENDFLOWREM());
+    }
+}
\ No newline at end of file
index edc10de00bf5838ec8cc33c541405b24f44245e0..54a469e020786f0fea2a669cdd8ea2b79b3d81fb 100644 (file)
@@ -60,10 +60,10 @@ public final class FlowInstructionResponseConvertor extends Convertor<
         Instructions,
         VersionConvertorData> {
 
-    private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction.class);
+    private static final Set<Class<?>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction.class);
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return TYPES;
     }
 
index 7b8e93ddc0c430d09553365cbc5aef11650a87fd..fb536a8998788042c9902541c12ea139ae858ddb 100644 (file)
@@ -56,7 +56,7 @@ import org.opendaylight.yangtools.yang.binding.DataContainer;
  */
 public class FlowStatsResponseConvertor extends Convertor<List<FlowStats>, List<FlowAndStatisticsMapList>, FlowStatsResponseConvertorData> {
 
-    private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(FlowStats.class);
+    private static final Set<Class<?>> TYPES = Collections.singleton(FlowStats.class);
 
     /**
      * Method wraps openflow 1.0 actions list to Apply Action Instructions
@@ -95,7 +95,7 @@ public class FlowStatsResponseConvertor extends Convertor<List<FlowStats>, List<
     }
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return TYPES;
     }
 
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagConvertor.java
deleted file mode 100644 (file)
index 96e99d9..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.flowflag;
-
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactorConvertor;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
-
-/**
- * converting from MD-SAL match model into appropriate OF-API match model
- *
- * @param <E> type of converted match
- */
-public interface FlowFlagConvertor<E> extends ConvertReactorConvertor<FlowModFlags, E> {
-    /**
-     * @param source flow mode flags
-     * @param convertorExecutor
-     * @return converted match (into OF-API model)
-     */
-    E convert(FlowModFlags source, ConvertorExecutor convertorExecutor);
-}
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagReactor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagReactor.java
deleted file mode 100644 (file)
index b921939..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.flowflag;
-
-import java.util.Map;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactorConvertor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorKey;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ResultInjector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
-
-/**
- *
- */
-public class FlowFlagReactor extends ConvertReactor<FlowModFlags> {
-
-    private static FlowFlagReactor INSTANCE = new FlowFlagReactor();
-
-    private FlowFlagReactor() {
-        //NOOP
-    }
-
-    /**
-     * @return singleton
-     */
-    public static FlowFlagReactor getInstance() {
-        return INSTANCE;
-    }
-
-    @Override
-    protected void initMappings(final Map<Short, ConvertReactorConvertor<FlowModFlags, ?>> conversions,
-                                final Map<ConvertorKey, ResultInjector<?, ?>> injections) {
-        FlowFlagReactorMappingFactory.addFlowFlagsConvertors(conversions);
-        FlowFlagReactorMappingFactory.addFlowFlagsIjectors(injections);
-    }
-
-}
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagsConvertorImpl.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagsConvertorImpl.java
deleted file mode 100644 (file)
index d33a973..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.flowflag;
-
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;
-
-/**
- *
- */
-public class FlowFlagsConvertorImpl implements FlowFlagConvertor<FlowModFlags> {
-
-    @Override
-    public FlowModFlags convert(
-            org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags source, ConvertorExecutor convertorExecutor) {
-
-        FlowModFlags ofFlowModFlags;
-        if (source != null) {
-            ofFlowModFlags = new FlowModFlags(
-                    source.isCHECKOVERLAP(), source.isNOBYTCOUNTS(), source.isNOPKTCOUNTS(),
-                    source.isRESETCOUNTS(), source.isSENDFLOWREM());
-        } else {
-            ofFlowModFlags = new FlowModFlags(
-                    FlowConvertor.DEFAULT_OFPFF_CHECK_OVERLAP,
-                    FlowConvertor.DEFAULT_OFPFF_NO_BYT_COUNTS,
-                    FlowConvertor.DEFAULT_OFPFF_NO_PKT_COUNTS,
-                    FlowConvertor.DEFAULT_OFPFF_RESET_COUNTS,
-                    FlowConvertor.DEFAULT_OFPFF_FLOW_REM);
-        }
-
-        return ofFlowModFlags;
-    }
-}
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagsConvertorV10Impl.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagsConvertorV10Impl.java
deleted file mode 100644 (file)
index 7302111..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.flowflag;
-
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlagsV10;
-
-/**
- *
- */
-public class FlowFlagsConvertorV10Impl implements FlowFlagConvertor<FlowModFlagsV10> {
-
-    @Override
-    public FlowModFlagsV10 convert(
-            FlowModFlags source, ConvertorExecutor convertorExecutor) {
-
-        FlowModFlagsV10 ofFlowModFlags;
-        if (source != null) {
-            ofFlowModFlags = new FlowModFlagsV10(
-                    source.isCHECKOVERLAP(), FlowConvertor.DEFAULT_OFPFF_EMERGENCY, source.isSENDFLOWREM());
-        } else {
-            ofFlowModFlags = new FlowModFlagsV10(
-                    FlowConvertor.DEFAULT_OFPFF_CHECK_OVERLAP,
-                    FlowConvertor.DEFAULT_OFPFF_EMERGENCY,
-                    FlowConvertor.DEFAULT_OFPFF_FLOW_REM);
-        }
-
-        return ofFlowModFlags;
-    }
-}
index b4a027329e98b96527fb0957f8a554350ecb553d..48ed63281e23ba473707ab75e66ff27723936fb4 100644 (file)
 
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
 
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.openflowplugin.api.OFConstants;
+import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
+import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey;
+import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava;
+import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterProvider;
+import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionResolvers;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactorConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.OFApprovedExperimenterIds;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorProcessor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfArpMatchCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv4MatchArbitraryBitMaskCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv4MatchCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv6MatchArbitraryBitMaskCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv6MatchCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfSctpMatchCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfTcpMatchCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfTunnelIpv4MatchCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfUdpMatchCase;
+import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetField;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestination;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSource;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFields;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagsMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.Pbb;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlagsContainer;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlagsContainerBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.oxm.container.match.entry.value.experimenter.id._case.TcpFlagsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.ExperimenterIdCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.experimenter.id._case.ExperimenterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthSrc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ExperimenterClass;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Code;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Type;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Code;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Type;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPhyPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpEcn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpProto;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsBos;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsLabel;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsTc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PbbIsid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TunnelId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanVid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.dst._case.EthDstBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.src._case.EthSrcBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.type._case.EthTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.code._case.Icmpv4CodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.type._case.Icmpv4TypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.code._case.Icmpv6CodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.type._case.Icmpv6TypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.phy.port._case.InPhyPortBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.port._case.InPortBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.ecn._case.IpEcnBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.proto._case.IpProtoBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.bos._case.MplsBosBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.label._case.MplsLabelBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.tc._case.MplsTcBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.pbb.isid._case.PbbIsidBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tunnel.id._case.TunnelIdBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.vid._case.VlanVidBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralExtensionListGrouping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList;
 
 /**
- * converting from MD-SAL match model into appropriate OF-API match model
- *
- * @param <E> type of converted match
+ * Utility class for converting a MD-SAL Flow into the OF flow mod
  */
-public interface MatchConvertor<E> extends ConvertReactorConvertor<Match, E> {
+public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionConvertorData> {
+    private static final List<Class<?>> TYPES = Arrays.asList(
+            Match.class,
+            org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match.class,
+            org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.mod.removed.Match.class,
+            org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.received.Match.class,
+            org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.in.message.Match.class,
+            org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.Match.class,
+            SetField.class);
+
+    private static final ConvertorProcessor<Layer3Match, List<MatchEntry>, VersionConvertorData> LAYER3_PROCESSOR = new ConvertorProcessor<Layer3Match, List<MatchEntry>, VersionConvertorData>()
+            .addCase(new SalToOfIpv4MatchArbitraryBitMaskCase())
+            .addCase(new SalToOfIpv4MatchCase())
+            .addCase(new SalToOfTunnelIpv4MatchCase())
+            .addCase(new SalToOfArpMatchCase())
+            .addCase(new SalToOfIpv6MatchArbitraryBitMaskCase())
+            .addCase(new SalToOfIpv6MatchCase());
+
+    private static final ConvertorProcessor<Layer4Match, List<MatchEntry>, VersionConvertorData> LAYER4_PROCESSOR = new ConvertorProcessor<Layer4Match, List<MatchEntry>, VersionConvertorData>()
+            .addCase(new SalToOfTcpMatchCase())
+            .addCase(new SalToOfUdpMatchCase())
+            .addCase(new SalToOfSctpMatchCase());
+
+    private static final byte[] VLAN_VID_MASK = new byte[]{16, 0};
+
+    private static void layer3Match(final List<MatchEntry> matchEntryList, final Layer3Match layer3Match,
+                                    ConvertorExecutor converterExecutor,
+                                    final ExtensionConverterProvider extensionConvertorProvider) {
+        java.util.Optional<List<MatchEntry>> result = LAYER3_PROCESSOR.process(layer3Match, converterExecutor
+        );
+
+        if (result.isPresent()) {
+            matchEntryList.addAll(result.get());
+        }
+    }
+
+    private static void layer4Match(final List<MatchEntry> matchEntryList, final Layer4Match layer4Match,
+                                    ConvertorExecutor converterExecutor, final ExtensionConverterProvider extensionConvertorProvider) {
+        java.util.Optional<List<MatchEntry>> result = LAYER4_PROCESSOR.process(layer4Match, converterExecutor
+        );
+
+        if (result.isPresent()) {
+            matchEntryList.addAll(result.get());
+        }
+    }
+
+    private static void inPortMatch(final List<MatchEntry> matchEntryList, NodeConnectorId inPort) {
+        if (inPort == null) {
+            return;
+        }
+
+        //TODO: currently this matchconverter is mapped to OF1.3 in MatchInjector. Will need to revisit during 1.4+
+        final long portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, inPort);
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryBuilder.setHasMask(false);
+        matchEntryBuilder.setOxmMatchField(InPort.class);
+        InPortCaseBuilder caseBuilder = new InPortCaseBuilder();
+        InPortBuilder portBuilder = new InPortBuilder();
+        portBuilder.setPortNumber(new PortNumber(portNumber));
+        caseBuilder.setInPort(portBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(caseBuilder.build());
+        matchEntryList.add(matchEntryBuilder.build());
+    }
+
+    private static void inPhyPortMatch(final List<MatchEntry> matchEntryList, NodeConnectorId inPhyPort) {
+        if (inPhyPort == null) {
+            return;
+        }
+
+        //TODO: currently this matchconverter is mapped to OF1.3 in MatchInjector. Will need to revisit during 1.4+
+        final long portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, inPhyPort);
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryBuilder.setHasMask(false);
+        matchEntryBuilder.setOxmMatchField(InPhyPort.class);
+        InPhyPortCaseBuilder caseBuilder = new InPhyPortCaseBuilder();
+        InPhyPortBuilder portBuilder = new InPhyPortBuilder();
+        portBuilder.setPortNumber(new PortNumber(portNumber));
+        caseBuilder.setInPhyPort(portBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(caseBuilder.build());
+        matchEntryList.add(matchEntryBuilder.build());
+    }
+
+    private static void metadataMatch(final List<MatchEntry> matchEntryList,
+                                      final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata metadata) {
+        if (metadata == null) {
+            return;
+        }
+
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        boolean hasmask = metadata.getMetadataMask() != null;
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryBuilder.setOxmMatchField(Metadata.class);
+        MetadataCaseBuilder metadataCaseBuilder = new MetadataCaseBuilder();
+        org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder metadataBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder();
+        metadataBuilder.setMetadata(ByteUtil.convertBigIntegerToNBytes(metadata.getMetadata(), OFConstants.SIZE_OF_LONG_IN_BYTES));
+
+        if (hasmask) {
+            metadataBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(metadata.getMetadataMask(), OFConstants.SIZE_OF_LONG_IN_BYTES));
+        }
+
+        metadataCaseBuilder.setMetadata(metadataBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(metadataCaseBuilder.build());
+        matchEntryBuilder.setHasMask(hasmask);
+        matchEntryList.add(matchEntryBuilder.build());
+    }
+
+    private static void tunnelMatch(final List<MatchEntry> matchEntryList,
+                                    final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Tunnel tunnel) {
+        if (tunnel == null) {
+            return;
+        }
+
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        TunnelIdCaseBuilder tunnelIdCaseBuilder = new TunnelIdCaseBuilder();
+        TunnelIdBuilder tunnelIdBuilder = new TunnelIdBuilder();
+        boolean hasMask = tunnel.getTunnelMask() != null;
+
+        if (hasMask) {
+            tunnelIdBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelMask(), OFConstants.SIZE_OF_LONG_IN_BYTES));
+        }
+
+        tunnelIdBuilder.setTunnelId(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelId(), OFConstants.SIZE_OF_LONG_IN_BYTES));
+        tunnelIdCaseBuilder.setTunnelId(tunnelIdBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(tunnelIdCaseBuilder.build());
+        matchEntryBuilder.setHasMask(hasMask);
+        matchEntryBuilder.setOxmMatchField(TunnelId.class);
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryList.add(matchEntryBuilder.build());
+    }
+
+    private static void protocolMatchFields(final List<MatchEntry> matchEntryList,
+                                            final ProtocolMatchFields protocolMatchFields) {
+        if (protocolMatchFields == null) {
+            return;
+        }
+
+        if (protocolMatchFields.getMplsLabel() != null) {
+            matchEntryList.add(toOfMplsLabel(protocolMatchFields.getMplsLabel()));
+        }
+
+        if (protocolMatchFields.getMplsBos() != null) {
+            matchEntryList.add(toOfMplsBos(protocolMatchFields.getMplsBos()));
+        }
+
+        if (protocolMatchFields.getMplsTc() != null) {
+            matchEntryList.add(toOfMplsTc(protocolMatchFields.getMplsTc()));
+        }
+
+        if (protocolMatchFields.getPbb() != null) {
+            matchEntryList.add(toOfMplsPbb(protocolMatchFields.getPbb()));
+        }
+    }
+
+    private static void icmpv6Match(final List<MatchEntry> matchEntryList, final Icmpv6Match icmpv6Match) {
+        if (icmpv6Match == null) {
+            return;
+        }
+
+        if (icmpv6Match.getIcmpv6Type() != null) {
+            matchEntryList.add(toOfIcmpv6Type(icmpv6Match.getIcmpv6Type()));
+        }
+
+        if (icmpv6Match.getIcmpv6Code() != null) {
+            matchEntryList.add(toOfIcmpv6Code(icmpv6Match.getIcmpv6Code()));
+        }
+    }
+
+    private static void icmpv4Match(final List<MatchEntry> matchEntryList, final Icmpv4Match icmpv4Match) {
+        if (icmpv4Match == null) {
+            return;
+        }
+
+        if (icmpv4Match.getIcmpv4Type() != null) {
+            matchEntryList.add(toOfIcmpv4Type(icmpv4Match.getIcmpv4Type()));
+        }
+
+        if (icmpv4Match.getIcmpv4Code() != null) {
+            matchEntryList.add(toOfIcmpv4Code(icmpv4Match.getIcmpv4Code()));
+        }
+    }
+
+    private static void ipMatch(final List<MatchEntry> matchEntryList, final IpMatch ipMatch) {
+        if (ipMatch == null) {
+            return;
+        }
+
+        if (ipMatch.getIpDscp() != null) {
+            matchEntryList.add(MatchConvertorUtil.toOfIpDscp(ipMatch.getIpDscp()));
+        }
+
+        if (ipMatch.getIpEcn() != null) {
+            matchEntryList.add(toOfIpEcn(ipMatch.getIpEcn()));
+        }
+
+        if (ipMatch.getIpProtocol() != null) {
+            matchEntryList.add(toOfIpProto(ipMatch.getIpProtocol()));
+        }
+    }
+
+    private static void vlanMatch(final List<MatchEntry> matchEntryList, final VlanMatch vlanMatch) {
+        if (vlanMatch == null) {
+            return;
+        }
+
+        if (vlanMatch.getVlanId() != null) {
+            VlanId vlanId = vlanMatch.getVlanId();
+            MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+            matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+            matchEntryBuilder.setOxmMatchField(VlanVid.class);
+            VlanVidCaseBuilder vlanVidCaseBuilder = new VlanVidCaseBuilder();
+            VlanVidBuilder vlanVidBuilder = new VlanVidBuilder();
+            boolean setCfiBit = false;
+            Integer vidEntryValue = 0;
+            boolean hasmask = false;
+
+            if (Boolean.TRUE.equals(vlanId.isVlanIdPresent())) {
+                setCfiBit = true;
+                if (vlanId.getVlanId() != null) {
+                    vidEntryValue = vlanId.getVlanId().getValue();
+                }
+
+                hasmask = vidEntryValue == 0;
+                if (hasmask) {
+                    vlanVidBuilder.setMask(VLAN_VID_MASK);
+                }
+            }
+
+            vlanVidBuilder.setCfiBit(setCfiBit);
+            vlanVidBuilder.setVlanVid(vidEntryValue);
+            vlanVidCaseBuilder.setVlanVid(vlanVidBuilder.build());
+            matchEntryBuilder.setMatchEntryValue(vlanVidCaseBuilder.build());
+            matchEntryBuilder.setHasMask(hasmask);
+            matchEntryList.add(matchEntryBuilder.build());
+        }
+
+        if (vlanMatch.getVlanPcp() != null) {
+            matchEntryList.add(MatchConvertorUtil.toOfVlanPcp(vlanMatch.getVlanPcp()));
+        }
+    }
+
+    private static void ethernetMatch(final List<MatchEntry> matchEntryList, final EthernetMatch ethernetMatch) {
+        if (ethernetMatch == null) {
+            return;
+        }
+
+        EthernetDestination ethernetDestination = ethernetMatch.getEthernetDestination();
+        if (ethernetDestination != null) {
+            MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+            matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+            matchEntryBuilder.setOxmMatchField(EthDst.class);
+            EthDstCaseBuilder ethDstCaseBuilder = new EthDstCaseBuilder();
+            EthDstBuilder ethDstBuilder = new EthDstBuilder();
+            ethDstBuilder.setMacAddress(ethernetDestination.getAddress());
+            boolean hasMask = ethernetDestination.getMask() != null;
+
+            if (hasMask) {
+                ethDstBuilder.setMask(ByteBufUtils.macAddressToBytes(ethernetDestination.getMask().getValue()));
+            }
+
+            ethDstCaseBuilder.setEthDst(ethDstBuilder.build());
+            matchEntryBuilder.setMatchEntryValue(ethDstCaseBuilder.build());
+            matchEntryBuilder.setHasMask(hasMask);
+            matchEntryList.add(matchEntryBuilder.build());
+        }
+
+        EthernetSource ethernetSource = ethernetMatch.getEthernetSource();
+        if (ethernetSource != null) {
+            MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+            matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+            matchEntryBuilder.setOxmMatchField(EthSrc.class);
+            EthSrcCaseBuilder ethSrcCaseBuilder = new EthSrcCaseBuilder();
+            EthSrcBuilder ethDstBuilder = new EthSrcBuilder();
+            ethDstBuilder.setMacAddress(ethernetSource.getAddress());
+            boolean hasMask = ethernetSource.getMask() != null;
+
+            if (hasMask) {
+                ethDstBuilder.setMask(ByteBufUtils.macAddressToBytes(ethernetSource.getMask().getValue()));
+            }
+
+            ethSrcCaseBuilder.setEthSrc(ethDstBuilder.build());
+            matchEntryBuilder.setMatchEntryValue(ethSrcCaseBuilder.build());
+            matchEntryBuilder.setHasMask(hasMask);
+            matchEntryList.add(matchEntryBuilder.build());
+        }
+
+        if (ethernetMatch.getEthernetType() != null) {
+            matchEntryList.add(toOfEthernetType(ethernetMatch.getEthernetType()));
+        }
+    }
+
+    private static void tcpFlagsMatch(List<MatchEntry> matchEntryList, TcpFlagsMatch tcpFlagsMatch) {
+        ExperimenterIdCaseBuilder expIdCaseBuilder = new ExperimenterIdCaseBuilder();
+        if (tcpFlagsMatch != null) {
+            MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+            matchEntryBuilder.setOxmClass(ExperimenterClass.class);
+            matchEntryBuilder.setHasMask(false);
+            matchEntryBuilder.setOxmMatchField(TcpFlags.class);
+
+            TcpFlagsContainerBuilder tcpFlagsContainerBuilder = new TcpFlagsContainerBuilder();
+            TcpFlagsBuilder tcpFlagsBuilder = new TcpFlagsBuilder();
+            tcpFlagsBuilder.setFlags(tcpFlagsMatch.getTcpFlags());
+            if(tcpFlagsMatch.getTcpFlagsMask() != null) {
+                matchEntryBuilder.setHasMask(true);
+                tcpFlagsBuilder.setMask(ByteUtil.unsignedShortToBytes(tcpFlagsMatch.getTcpFlagsMask()));
+            }
+            tcpFlagsContainerBuilder.setTcpFlags(tcpFlagsBuilder.build());
+
+            //Set experimenter ID.
+            ExperimenterBuilder experimenterBuilder = new ExperimenterBuilder();
+            experimenterBuilder.setExperimenter(new ExperimenterId(OFApprovedExperimenterIds.MATCH_TCP_FLAGS_EXP_ID));
+            expIdCaseBuilder.setExperimenter(experimenterBuilder.build());
+
+            expIdCaseBuilder.addAugmentation(TcpFlagsContainer.class, tcpFlagsContainerBuilder.build());
+            matchEntryBuilder.setMatchEntryValue(expIdCaseBuilder.build());
+            matchEntryList.add(matchEntryBuilder.build());
+        }
+    }
+
+    private static MatchEntry toOfMplsPbb(final Pbb pbb) {
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        boolean hasmask = pbb.getPbbMask() != null;
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryBuilder.setOxmMatchField(PbbIsid.class);
+        PbbIsidCaseBuilder pbbIsidCaseBuilder = new PbbIsidCaseBuilder();
+        PbbIsidBuilder pbbIsidBuilder = new PbbIsidBuilder();
+        pbbIsidBuilder.setIsid(pbb.getPbbIsid());
+
+        if (hasmask) {
+            pbbIsidBuilder.setMask(ByteUtil.unsignedMediumToBytes(pbb.getPbbMask()));
+        }
+
+        pbbIsidCaseBuilder.setPbbIsid(pbbIsidBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(pbbIsidCaseBuilder.build());
+        matchEntryBuilder.setHasMask(hasmask);
+        return matchEntryBuilder.build();
+    }
+
+    private static MatchEntry toOfMplsTc(final Short mplsTc) {
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryBuilder.setHasMask(false);
+        matchEntryBuilder.setOxmMatchField(MplsTc.class);
+        MplsTcCaseBuilder mplsTcCaseBuilder = new MplsTcCaseBuilder();
+        MplsTcBuilder mplsTcBuilder = new MplsTcBuilder();
+        mplsTcBuilder.setTc(mplsTc);
+        mplsTcCaseBuilder.setMplsTc(mplsTcBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(mplsTcCaseBuilder.build());
+        return matchEntryBuilder.build();
+    }
+
+    private static MatchEntry toOfMplsBos(final Short mplsBos) {
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryBuilder.setHasMask(false);
+        matchEntryBuilder.setOxmMatchField(MplsBos.class);
+        MplsBosCaseBuilder mplsBosCaseBuilder = new MplsBosCaseBuilder();
+        MplsBosBuilder mplsBosBuilder = new MplsBosBuilder();
+        mplsBosBuilder.setBos(mplsBos != 0);
+        mplsBosCaseBuilder.setMplsBos(mplsBosBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(mplsBosCaseBuilder.build());
+        return matchEntryBuilder.build();
+    }
+
+    private static MatchEntry toOfMplsLabel(final Long mplsLabel) {
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryBuilder.setHasMask(false);
+        matchEntryBuilder.setOxmMatchField(MplsLabel.class);
+        MplsLabelCaseBuilder mplsLabelCaseBuilder = new MplsLabelCaseBuilder();
+        MplsLabelBuilder mplsLabelBuilder = new MplsLabelBuilder();
+        mplsLabelBuilder.setMplsLabel(mplsLabel);
+        mplsLabelCaseBuilder.setMplsLabel(mplsLabelBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(mplsLabelCaseBuilder.build());
+        return matchEntryBuilder.build();
+    }
+
+    private static MatchEntry toOfEthernetType(final EthernetType ethernetType) {
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryBuilder.setHasMask(false);
+        matchEntryBuilder.setOxmMatchField(EthType.class);
+        EthTypeCaseBuilder ethTypeCaseBuilder = new EthTypeCaseBuilder();
+        EthTypeBuilder ethTypeBuilder = new EthTypeBuilder();
+        EtherType etherType = new EtherType(ethernetType.getType().getValue().intValue());
+        ethTypeBuilder.setEthType(etherType);
+        ethTypeCaseBuilder.setEthType(ethTypeBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(ethTypeCaseBuilder.build());
+        return matchEntryBuilder.build();
+    }
+
+    private static MatchEntry toOfIcmpv4Type(final Short icmpv4Type) {
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryBuilder.setHasMask(false);
+        matchEntryBuilder.setOxmMatchField(Icmpv4Type.class);
+        Icmpv4TypeCaseBuilder icmpv4TypeCaseBuilder = new Icmpv4TypeCaseBuilder();
+        Icmpv4TypeBuilder icmpv4TypeBuilder = new Icmpv4TypeBuilder();
+        icmpv4TypeBuilder.setIcmpv4Type(icmpv4Type);
+        icmpv4TypeCaseBuilder.setIcmpv4Type(icmpv4TypeBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(icmpv4TypeCaseBuilder.build());
+        return matchEntryBuilder.build();
+    }
+
+    private static MatchEntry toOfIcmpv4Code(final Short icmpv4Code) {
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryBuilder.setHasMask(false);
+        matchEntryBuilder.setOxmMatchField(Icmpv4Code.class);
+        Icmpv4CodeCaseBuilder icmpv4CodeCaseBuilder = new Icmpv4CodeCaseBuilder();
+        Icmpv4CodeBuilder icmpv4CodeBuilder = new Icmpv4CodeBuilder();
+        icmpv4CodeBuilder.setIcmpv4Code(icmpv4Code);
+        icmpv4CodeCaseBuilder.setIcmpv4Code(icmpv4CodeBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(icmpv4CodeCaseBuilder.build());
+        return matchEntryBuilder.build();
+    }
+
+    private static MatchEntry toOfIcmpv6Type(final Short icmpv6Type) {
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryBuilder.setHasMask(false);
+        matchEntryBuilder.setOxmMatchField(Icmpv6Type.class);
+        Icmpv6TypeCaseBuilder icmpv6TypeCaseBuilder = new Icmpv6TypeCaseBuilder();
+        Icmpv6TypeBuilder icmpv6TypeBuilder = new Icmpv6TypeBuilder();
+        icmpv6TypeBuilder.setIcmpv6Type(icmpv6Type);
+        icmpv6TypeCaseBuilder.setIcmpv6Type(icmpv6TypeBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(icmpv6TypeCaseBuilder.build());
+        return matchEntryBuilder.build();
+    }
+
+    private static MatchEntry toOfIcmpv6Code(final Short icmpv6Code) {
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryBuilder.setHasMask(false);
+        matchEntryBuilder.setOxmMatchField(Icmpv6Code.class);
+        Icmpv6CodeCaseBuilder icmpv6CodeCaseBuilder = new Icmpv6CodeCaseBuilder();
+        Icmpv6CodeBuilder icmpv6CodeBuilder = new Icmpv6CodeBuilder();
+        icmpv6CodeBuilder.setIcmpv6Code(icmpv6Code);
+        icmpv6CodeCaseBuilder.setIcmpv6Code(icmpv6CodeBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(icmpv6CodeCaseBuilder.build());
+        return matchEntryBuilder.build();
+    }
+
+    private static MatchEntry toOfIpProto(final Short ipProtocol) {
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryBuilder.setHasMask(false);
+        matchEntryBuilder.setOxmMatchField(IpProto.class);
+        IpProtoCaseBuilder ipProtoCaseBuilder = new IpProtoCaseBuilder();
+        IpProtoBuilder ipProtoBuilder = new IpProtoBuilder();
+        ipProtoBuilder.setProtocolNumber(ipProtocol);
+        ipProtoCaseBuilder.setIpProto(ipProtoBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(ipProtoCaseBuilder.build());
+        return matchEntryBuilder.build();
+    }
+
+    private static MatchEntry toOfIpEcn(final Short ipEcn) {
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryBuilder.setHasMask(false);
+        matchEntryBuilder.setOxmMatchField(IpEcn.class);
+        IpEcnCaseBuilder ipEcnCaseBuilder = new IpEcnCaseBuilder();
+        IpEcnBuilder ipEcnBuilder = new IpEcnBuilder();
+        ipEcnBuilder.setEcn(ipEcn);
+        ipEcnCaseBuilder.setIpEcn(ipEcnBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(ipEcnCaseBuilder.build());
+        return matchEntryBuilder.build();
+    }
+
     /**
-     * @param source match input
-     * @param convertorExecutor
-     * @return converted match (into OF-API model)
+     * Create default empty match entries
+     * Use this method, if result from converter is empty.
      */
-    E convert(Match source, ConvertorExecutor convertorExecutor);
+    public static List<MatchEntry> defaultResult() {
+        return FlowConvertor.DEFAULT_MATCH_ENTRIES;
+    }
+
+    @Override
+    public Collection<Class<?>> getTypes() {
+        return TYPES;
+    }
+
+    @Override
+    public List<MatchEntry> convert(final Match source, final VersionConvertorData data) {
+        List<MatchEntry> result = new ArrayList<>();
+
+        if (source == null) {
+            return result;
+        }
+
+        final ExtensionConverterProvider extensionConvertorProvider = OFSessionUtil.getExtensionConvertorProvider();
+
+        inPortMatch(result, source.getInPort());
+        inPhyPortMatch(result, source.getInPhyPort());
+        metadataMatch(result, source.getMetadata());
+        ethernetMatch(result, source.getEthernetMatch());
+        vlanMatch(result, source.getVlanMatch());
+        ipMatch(result, source.getIpMatch());
+        layer4Match(result, source.getLayer4Match(), getConvertorExecutor(), extensionConvertorProvider);
+        icmpv4Match(result, source.getIcmpv4Match());
+        icmpv6Match(result, source.getIcmpv6Match());
+        layer3Match(result, source.getLayer3Match(), getConvertorExecutor(), extensionConvertorProvider);
+        protocolMatchFields(result, source.getProtocolMatchFields());
+        tunnelMatch(result, source.getTunnel());
+        tcpFlagsMatch(result, source.getTcpFlagsMatch());
+
+        /**
+         * TODO: EXTENSION PROPOSAL (source, MD-SAL to OFJava)
+         * - we might need version for conversion and for key
+         */
+        Optional<GeneralExtensionListGrouping> extensionListOpt = ExtensionResolvers.getMatchExtensionResolver().getExtension(source);
+        if (extensionListOpt.isPresent()) {
+            List<ExtensionList> extensionListList = extensionListOpt.get().getExtensionList();
+            for (ExtensionList extensionItem : extensionListList) {
+                // TODO: get real version
+                ConverterExtensionKey<? extends ExtensionKey> key = new ConverterExtensionKey<>(extensionItem.getExtensionKey(), OFConstants.OFP_VERSION_1_3);
+                ConvertorToOFJava<MatchEntry> convertor = extensionConvertorProvider.getConverter(key);
+                if (convertor == null) {
+                    throw new IllegalStateException("No converter found for key: " + key.toString());
+                }
+                MatchEntry ofMatch = convertor.convert(extensionItem.getExtension());
+                result.add(ofMatch);
+            }
+        }
+
+        return result;
+    }
 }
+
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java
deleted file mode 100644 (file)
index 56c7d50..0000000
+++ /dev/null
@@ -1,625 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import org.opendaylight.openflowjava.util.ByteBufUtils;
-import org.opendaylight.openflowplugin.api.OFConstants;
-import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
-import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey;
-import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava;
-import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionResolvers;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.OFApprovedExperimenterIds;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorProcessor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfArpMatchCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv4MatchArbitraryBitMaskCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv4MatchCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv6MatchArbitraryBitMaskCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv6MatchCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfSctpMatchCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfTcpMatchCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfTunnelIpv4MatchCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfUdpMatchCase;
-import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
-import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil;
-import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestination;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSource;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFields;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagsMatch;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.Pbb;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlags;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlagsContainer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlagsContainerBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.oxm.container.match.entry.value.experimenter.id._case.TcpFlagsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.ExperimenterIdCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.experimenter.id._case.ExperimenterBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthDst;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthSrc;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ExperimenterClass;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Code;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Type;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Code;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Type;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPhyPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpEcn;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpProto;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsBos;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsLabel;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsTc;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PbbIsid;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TunnelId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanVid;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.dst._case.EthDstBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.src._case.EthSrcBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.type._case.EthTypeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.code._case.Icmpv4CodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.type._case.Icmpv4TypeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.code._case.Icmpv6CodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.type._case.Icmpv6TypeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.phy.port._case.InPhyPortBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.port._case.InPortBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.ecn._case.IpEcnBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.proto._case.IpProtoBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.bos._case.MplsBosBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.label._case.MplsLabelBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.tc._case.MplsTcBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.pbb.isid._case.PbbIsidBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tunnel.id._case.TunnelIdBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.vid._case.VlanVidBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralExtensionListGrouping;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList;
-
-/**
- * Utility class for converting a MD-SAL Flow into the OF flow mod
- */
-public class MatchConvertorImpl implements MatchConvertor<List<MatchEntry>> {
-    private static final ConvertorProcessor<Layer3Match, List<MatchEntry>, VersionConvertorData> LAYER3_PROCESSOR = new ConvertorProcessor<Layer3Match, List<MatchEntry>, VersionConvertorData>()
-            .addCase(new SalToOfIpv4MatchArbitraryBitMaskCase())
-            .addCase(new SalToOfIpv4MatchCase())
-            .addCase(new SalToOfTunnelIpv4MatchCase())
-            .addCase(new SalToOfArpMatchCase())
-            .addCase(new SalToOfIpv6MatchArbitraryBitMaskCase())
-            .addCase(new SalToOfIpv6MatchCase());
-
-    private static final ConvertorProcessor<Layer4Match, List<MatchEntry>, VersionConvertorData> LAYER4_PROCESSOR = new ConvertorProcessor<Layer4Match, List<MatchEntry>, VersionConvertorData>()
-            .addCase(new SalToOfTcpMatchCase())
-            .addCase(new SalToOfUdpMatchCase())
-            .addCase(new SalToOfSctpMatchCase());
-
-    private static final byte[] VLAN_VID_MASK = new byte[]{16, 0};
-
-    private static void layer3Match(final List<MatchEntry> matchEntryList, final Layer3Match layer3Match, ConvertorExecutor convertorExecutor) {
-        java.util.Optional<List<MatchEntry>> result = LAYER3_PROCESSOR.process(layer3Match, convertorExecutor);
-
-        if (result.isPresent()) {
-            matchEntryList.addAll(result.get());
-        }
-    }
-
-    private static void layer4Match(final List<MatchEntry> matchEntryList, final Layer4Match layer4Match, ConvertorExecutor convertorExecutor) {
-        java.util.Optional<List<MatchEntry>> result = LAYER4_PROCESSOR.process(layer4Match, convertorExecutor);
-
-        if (result.isPresent()) {
-            matchEntryList.addAll(result.get());
-        }
-    }
-
-    private static void inPortMatch(final List<MatchEntry> matchEntryList, NodeConnectorId inPort) {
-        if (inPort == null) {
-            return;
-        }
-
-        //TODO: currently this matchconverter is mapped to OF1.3 in MatchReactorMappingFactory. Will need to revisit during 1.4+
-        final long portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, inPort);
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(InPort.class);
-        InPortCaseBuilder caseBuilder = new InPortCaseBuilder();
-        InPortBuilder portBuilder = new InPortBuilder();
-        portBuilder.setPortNumber(new PortNumber(portNumber));
-        caseBuilder.setInPort(portBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(caseBuilder.build());
-        matchEntryList.add(matchEntryBuilder.build());
-    }
-
-    private static void inPhyPortMatch(final List<MatchEntry> matchEntryList, NodeConnectorId inPhyPort) {
-        if (inPhyPort == null) {
-            return;
-        }
-
-        //TODO: currently this matchconverter is mapped to OF1.3 in MatchReactorMappingFactory. Will need to revisit during 1.4+
-        final long portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, inPhyPort);
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(InPhyPort.class);
-        InPhyPortCaseBuilder caseBuilder = new InPhyPortCaseBuilder();
-        InPhyPortBuilder portBuilder = new InPhyPortBuilder();
-        portBuilder.setPortNumber(new PortNumber(portNumber));
-        caseBuilder.setInPhyPort(portBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(caseBuilder.build());
-        matchEntryList.add(matchEntryBuilder.build());
-    }
-
-    private static void metadataMatch(final List<MatchEntry> matchEntryList,
-                                      final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata metadata) {
-        if (metadata == null) {
-            return;
-        }
-
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        boolean hasmask = metadata.getMetadataMask() != null;
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setOxmMatchField(Metadata.class);
-        MetadataCaseBuilder metadataCaseBuilder = new MetadataCaseBuilder();
-        org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder metadataBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder();
-        metadataBuilder.setMetadata(ByteUtil.convertBigIntegerToNBytes(metadata.getMetadata(), OFConstants.SIZE_OF_LONG_IN_BYTES));
-
-        if (hasmask) {
-            metadataBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(metadata.getMetadataMask(), OFConstants.SIZE_OF_LONG_IN_BYTES));
-        }
-
-        metadataCaseBuilder.setMetadata(metadataBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(metadataCaseBuilder.build());
-        matchEntryBuilder.setHasMask(hasmask);
-        matchEntryList.add(matchEntryBuilder.build());
-    }
-
-    private static void tunnelMatch(final List<MatchEntry> matchEntryList,
-                                    final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Tunnel tunnel) {
-        if (tunnel == null) {
-            return;
-        }
-
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        TunnelIdCaseBuilder tunnelIdCaseBuilder = new TunnelIdCaseBuilder();
-        TunnelIdBuilder tunnelIdBuilder = new TunnelIdBuilder();
-        boolean hasMask = tunnel.getTunnelMask() != null;
-
-        if (hasMask) {
-            tunnelIdBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelMask(), OFConstants.SIZE_OF_LONG_IN_BYTES));
-        }
-
-        tunnelIdBuilder.setTunnelId(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelId(), OFConstants.SIZE_OF_LONG_IN_BYTES));
-        tunnelIdCaseBuilder.setTunnelId(tunnelIdBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(tunnelIdCaseBuilder.build());
-        matchEntryBuilder.setHasMask(hasMask);
-        matchEntryBuilder.setOxmMatchField(TunnelId.class);
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryList.add(matchEntryBuilder.build());
-    }
-
-    private static void protocolMatchFields(final List<MatchEntry> matchEntryList,
-                                            final ProtocolMatchFields protocolMatchFields) {
-        if (protocolMatchFields == null) {
-            return;
-        }
-
-        if (protocolMatchFields.getMplsLabel() != null) {
-            matchEntryList.add(toOfMplsLabel(protocolMatchFields.getMplsLabel()));
-        }
-
-        if (protocolMatchFields.getMplsBos() != null) {
-            matchEntryList.add(toOfMplsBos(protocolMatchFields.getMplsBos()));
-        }
-
-        if (protocolMatchFields.getMplsTc() != null) {
-            matchEntryList.add(toOfMplsTc(protocolMatchFields.getMplsTc()));
-        }
-
-        if (protocolMatchFields.getPbb() != null) {
-            matchEntryList.add(toOfMplsPbb(protocolMatchFields.getPbb()));
-        }
-    }
-
-    private static void icmpv6Match(final List<MatchEntry> matchEntryList, final Icmpv6Match icmpv6Match) {
-        if (icmpv6Match == null) {
-            return;
-        }
-
-        if (icmpv6Match.getIcmpv6Type() != null) {
-            matchEntryList.add(toOfIcmpv6Type(icmpv6Match.getIcmpv6Type()));
-        }
-
-        if (icmpv6Match.getIcmpv6Code() != null) {
-            matchEntryList.add(toOfIcmpv6Code(icmpv6Match.getIcmpv6Code()));
-        }
-    }
-
-    private static void icmpv4Match(final List<MatchEntry> matchEntryList, final Icmpv4Match icmpv4Match) {
-        if (icmpv4Match == null) {
-            return;
-        }
-
-        if (icmpv4Match.getIcmpv4Type() != null) {
-            matchEntryList.add(toOfIcmpv4Type(icmpv4Match.getIcmpv4Type()));
-        }
-
-        if (icmpv4Match.getIcmpv4Code() != null) {
-            matchEntryList.add(toOfIcmpv4Code(icmpv4Match.getIcmpv4Code()));
-        }
-    }
-
-    private static void ipMatch(final List<MatchEntry> matchEntryList, final IpMatch ipMatch) {
-        if (ipMatch == null) {
-            return;
-        }
-
-        if (ipMatch.getIpDscp() != null) {
-            matchEntryList.add(MatchConvertorUtil.toOfIpDscp(ipMatch.getIpDscp()));
-        }
-
-        if (ipMatch.getIpEcn() != null) {
-            matchEntryList.add(toOfIpEcn(ipMatch.getIpEcn()));
-        }
-
-        if (ipMatch.getIpProtocol() != null) {
-            matchEntryList.add(toOfIpProto(ipMatch.getIpProtocol()));
-        }
-    }
-
-    private static void vlanMatch(final List<MatchEntry> matchEntryList, final VlanMatch vlanMatch) {
-        if (vlanMatch == null) {
-            return;
-        }
-
-        if (vlanMatch.getVlanId() != null) {
-            VlanId vlanId = vlanMatch.getVlanId();
-            MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-            matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-            matchEntryBuilder.setOxmMatchField(VlanVid.class);
-            VlanVidCaseBuilder vlanVidCaseBuilder = new VlanVidCaseBuilder();
-            VlanVidBuilder vlanVidBuilder = new VlanVidBuilder();
-            boolean setCfiBit = false;
-            Integer vidEntryValue = 0;
-            boolean hasmask = false;
-
-            if (Boolean.TRUE.equals(vlanId.isVlanIdPresent())) {
-                setCfiBit = true;
-                if (vlanId.getVlanId() != null) {
-                    vidEntryValue = vlanId.getVlanId().getValue();
-                }
-
-                hasmask = vidEntryValue == 0;
-                if (hasmask) {
-                    vlanVidBuilder.setMask(VLAN_VID_MASK);
-                }
-            }
-
-            vlanVidBuilder.setCfiBit(setCfiBit);
-            vlanVidBuilder.setVlanVid(vidEntryValue);
-            vlanVidCaseBuilder.setVlanVid(vlanVidBuilder.build());
-            matchEntryBuilder.setMatchEntryValue(vlanVidCaseBuilder.build());
-            matchEntryBuilder.setHasMask(hasmask);
-            matchEntryList.add(matchEntryBuilder.build());
-        }
-
-        if (vlanMatch.getVlanPcp() != null) {
-            matchEntryList.add(MatchConvertorUtil.toOfVlanPcp(vlanMatch.getVlanPcp()));
-        }
-    }
-
-    private static void ethernetMatch(final List<MatchEntry> matchEntryList, final EthernetMatch ethernetMatch) {
-        if (ethernetMatch == null) {
-            return;
-        }
-
-        EthernetDestination ethernetDestination = ethernetMatch.getEthernetDestination();
-        if (ethernetDestination != null) {
-            MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-            matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-            matchEntryBuilder.setOxmMatchField(EthDst.class);
-            EthDstCaseBuilder ethDstCaseBuilder = new EthDstCaseBuilder();
-            EthDstBuilder ethDstBuilder = new EthDstBuilder();
-            ethDstBuilder.setMacAddress(ethernetDestination.getAddress());
-            boolean hasMask = ethernetDestination.getMask() != null;
-
-            if (hasMask) {
-                ethDstBuilder.setMask(ByteBufUtils.macAddressToBytes(ethernetDestination.getMask().getValue()));
-            }
-
-            ethDstCaseBuilder.setEthDst(ethDstBuilder.build());
-            matchEntryBuilder.setMatchEntryValue(ethDstCaseBuilder.build());
-            matchEntryBuilder.setHasMask(hasMask);
-            matchEntryList.add(matchEntryBuilder.build());
-        }
-
-        EthernetSource ethernetSource = ethernetMatch.getEthernetSource();
-        if (ethernetSource != null) {
-            MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-            matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-            matchEntryBuilder.setOxmMatchField(EthSrc.class);
-            EthSrcCaseBuilder ethSrcCaseBuilder = new EthSrcCaseBuilder();
-            EthSrcBuilder ethDstBuilder = new EthSrcBuilder();
-            ethDstBuilder.setMacAddress(ethernetSource.getAddress());
-            boolean hasMask = ethernetSource.getMask() != null;
-
-            if (hasMask) {
-                ethDstBuilder.setMask(ByteBufUtils.macAddressToBytes(ethernetSource.getMask().getValue()));
-            }
-
-            ethSrcCaseBuilder.setEthSrc(ethDstBuilder.build());
-            matchEntryBuilder.setMatchEntryValue(ethSrcCaseBuilder.build());
-            matchEntryBuilder.setHasMask(hasMask);
-            matchEntryList.add(matchEntryBuilder.build());
-        }
-
-        if (ethernetMatch.getEthernetType() != null) {
-            matchEntryList.add(toOfEthernetType(ethernetMatch.getEthernetType()));
-        }
-    }
-
-    private static void tcpFlagsMatch(List<MatchEntry> matchEntryList, TcpFlagsMatch tcpFlagsMatch) {
-        ExperimenterIdCaseBuilder expIdCaseBuilder = new ExperimenterIdCaseBuilder();
-        if (tcpFlagsMatch != null) {
-            MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-            matchEntryBuilder.setOxmClass(ExperimenterClass.class);
-            matchEntryBuilder.setHasMask(false);
-            matchEntryBuilder.setOxmMatchField(TcpFlags.class);
-
-            TcpFlagsContainerBuilder tcpFlagsContainerBuilder = new TcpFlagsContainerBuilder();
-            TcpFlagsBuilder tcpFlagsBuilder = new TcpFlagsBuilder();
-            tcpFlagsBuilder.setFlags(tcpFlagsMatch.getTcpFlags());
-            if(tcpFlagsMatch.getTcpFlagsMask() != null) {
-                matchEntryBuilder.setHasMask(true);
-                tcpFlagsBuilder.setMask(ByteUtil.unsignedShortToBytes(tcpFlagsMatch.getTcpFlagsMask()));
-            }
-            tcpFlagsContainerBuilder.setTcpFlags(tcpFlagsBuilder.build());
-
-            //Set experimenter ID.
-            ExperimenterBuilder experimenterBuilder = new ExperimenterBuilder();
-            experimenterBuilder.setExperimenter(new ExperimenterId(OFApprovedExperimenterIds.MATCH_TCP_FLAGS_EXP_ID));
-            expIdCaseBuilder.setExperimenter(experimenterBuilder.build());
-
-            expIdCaseBuilder.addAugmentation(TcpFlagsContainer.class, tcpFlagsContainerBuilder.build());
-            matchEntryBuilder.setMatchEntryValue(expIdCaseBuilder.build());
-            matchEntryList.add(matchEntryBuilder.build());
-        }
-    }
-
-    private static MatchEntry toOfMplsPbb(final Pbb pbb) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        boolean hasmask = pbb.getPbbMask() != null;
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setOxmMatchField(PbbIsid.class);
-        PbbIsidCaseBuilder pbbIsidCaseBuilder = new PbbIsidCaseBuilder();
-        PbbIsidBuilder pbbIsidBuilder = new PbbIsidBuilder();
-        pbbIsidBuilder.setIsid(pbb.getPbbIsid());
-
-        if (hasmask) {
-            pbbIsidBuilder.setMask(ByteUtil.unsignedMediumToBytes(pbb.getPbbMask()));
-        }
-
-        pbbIsidCaseBuilder.setPbbIsid(pbbIsidBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(pbbIsidCaseBuilder.build());
-        matchEntryBuilder.setHasMask(hasmask);
-        return matchEntryBuilder.build();
-    }
-
-    private static MatchEntry toOfMplsTc(final Short mplsTc) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(MplsTc.class);
-        MplsTcCaseBuilder mplsTcCaseBuilder = new MplsTcCaseBuilder();
-        MplsTcBuilder mplsTcBuilder = new MplsTcBuilder();
-        mplsTcBuilder.setTc(mplsTc);
-        mplsTcCaseBuilder.setMplsTc(mplsTcBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(mplsTcCaseBuilder.build());
-        return matchEntryBuilder.build();
-    }
-
-    private static MatchEntry toOfMplsBos(final Short mplsBos) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(MplsBos.class);
-        MplsBosCaseBuilder mplsBosCaseBuilder = new MplsBosCaseBuilder();
-        MplsBosBuilder mplsBosBuilder = new MplsBosBuilder();
-        mplsBosBuilder.setBos(mplsBos != 0);
-        mplsBosCaseBuilder.setMplsBos(mplsBosBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(mplsBosCaseBuilder.build());
-        return matchEntryBuilder.build();
-    }
-
-    private static MatchEntry toOfMplsLabel(final Long mplsLabel) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(MplsLabel.class);
-        MplsLabelCaseBuilder mplsLabelCaseBuilder = new MplsLabelCaseBuilder();
-        MplsLabelBuilder mplsLabelBuilder = new MplsLabelBuilder();
-        mplsLabelBuilder.setMplsLabel(mplsLabel);
-        mplsLabelCaseBuilder.setMplsLabel(mplsLabelBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(mplsLabelCaseBuilder.build());
-        return matchEntryBuilder.build();
-    }
-
-    private static MatchEntry toOfEthernetType(final EthernetType ethernetType) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(EthType.class);
-        EthTypeCaseBuilder ethTypeCaseBuilder = new EthTypeCaseBuilder();
-        EthTypeBuilder ethTypeBuilder = new EthTypeBuilder();
-        EtherType etherType = new EtherType(ethernetType.getType().getValue().intValue());
-        ethTypeBuilder.setEthType(etherType);
-        ethTypeCaseBuilder.setEthType(ethTypeBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(ethTypeCaseBuilder.build());
-        return matchEntryBuilder.build();
-    }
-
-    private static MatchEntry toOfIcmpv4Type(final Short icmpv4Type) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(Icmpv4Type.class);
-        Icmpv4TypeCaseBuilder icmpv4TypeCaseBuilder = new Icmpv4TypeCaseBuilder();
-        Icmpv4TypeBuilder icmpv4TypeBuilder = new Icmpv4TypeBuilder();
-        icmpv4TypeBuilder.setIcmpv4Type(icmpv4Type);
-        icmpv4TypeCaseBuilder.setIcmpv4Type(icmpv4TypeBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(icmpv4TypeCaseBuilder.build());
-        return matchEntryBuilder.build();
-    }
-
-    private static MatchEntry toOfIcmpv4Code(final Short icmpv4Code) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(Icmpv4Code.class);
-        Icmpv4CodeCaseBuilder icmpv4CodeCaseBuilder = new Icmpv4CodeCaseBuilder();
-        Icmpv4CodeBuilder icmpv4CodeBuilder = new Icmpv4CodeBuilder();
-        icmpv4CodeBuilder.setIcmpv4Code(icmpv4Code);
-        icmpv4CodeCaseBuilder.setIcmpv4Code(icmpv4CodeBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(icmpv4CodeCaseBuilder.build());
-        return matchEntryBuilder.build();
-    }
-
-    private static MatchEntry toOfIcmpv6Type(final Short icmpv6Type) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(Icmpv6Type.class);
-        Icmpv6TypeCaseBuilder icmpv6TypeCaseBuilder = new Icmpv6TypeCaseBuilder();
-        Icmpv6TypeBuilder icmpv6TypeBuilder = new Icmpv6TypeBuilder();
-        icmpv6TypeBuilder.setIcmpv6Type(icmpv6Type);
-        icmpv6TypeCaseBuilder.setIcmpv6Type(icmpv6TypeBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(icmpv6TypeCaseBuilder.build());
-        return matchEntryBuilder.build();
-    }
-
-    private static MatchEntry toOfIcmpv6Code(final Short icmpv6Code) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(Icmpv6Code.class);
-        Icmpv6CodeCaseBuilder icmpv6CodeCaseBuilder = new Icmpv6CodeCaseBuilder();
-        Icmpv6CodeBuilder icmpv6CodeBuilder = new Icmpv6CodeBuilder();
-        icmpv6CodeBuilder.setIcmpv6Code(icmpv6Code);
-        icmpv6CodeCaseBuilder.setIcmpv6Code(icmpv6CodeBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(icmpv6CodeCaseBuilder.build());
-        return matchEntryBuilder.build();
-    }
-
-    private static MatchEntry toOfIpProto(final Short ipProtocol) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(IpProto.class);
-        IpProtoCaseBuilder ipProtoCaseBuilder = new IpProtoCaseBuilder();
-        IpProtoBuilder ipProtoBuilder = new IpProtoBuilder();
-        ipProtoBuilder.setProtocolNumber(ipProtocol);
-        ipProtoCaseBuilder.setIpProto(ipProtoBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(ipProtoCaseBuilder.build());
-        return matchEntryBuilder.build();
-    }
-
-    private static MatchEntry toOfIpEcn(final Short ipEcn) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(IpEcn.class);
-        IpEcnCaseBuilder ipEcnCaseBuilder = new IpEcnCaseBuilder();
-        IpEcnBuilder ipEcnBuilder = new IpEcnBuilder();
-        ipEcnBuilder.setEcn(ipEcn);
-        ipEcnCaseBuilder.setIpEcn(ipEcnBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(ipEcnCaseBuilder.build());
-        return matchEntryBuilder.build();
-    }
-
-    @Override
-    public List<MatchEntry> convert(final Match match, ConvertorExecutor convertorExecutor) {
-        List<MatchEntry> result = new ArrayList<>();
-
-        if (match == null) {
-            return result;
-        }
-
-        inPortMatch(result, match.getInPort());
-        inPhyPortMatch(result, match.getInPhyPort());
-        metadataMatch(result, match.getMetadata());
-        ethernetMatch(result, match.getEthernetMatch());
-        vlanMatch(result, match.getVlanMatch());
-        ipMatch(result, match.getIpMatch());
-        layer4Match(result, match.getLayer4Match(), convertorExecutor);
-        icmpv4Match(result, match.getIcmpv4Match());
-        icmpv6Match(result, match.getIcmpv6Match());
-        layer3Match(result, match.getLayer3Match(), convertorExecutor);
-        protocolMatchFields(result, match.getProtocolMatchFields());
-        tunnelMatch(result, match.getTunnel());
-        tcpFlagsMatch(result, match.getTcpFlagsMatch());
-
-        /**
-         * TODO: EXTENSION PROPOSAL (match, MD-SAL to OFJava)
-         * - we might need version for conversion and for key
-         */
-        Optional<GeneralExtensionListGrouping> extensionListOpt = ExtensionResolvers.getMatchExtensionResolver().getExtension(match);
-        if (extensionListOpt.isPresent()) {
-            List<ExtensionList> extensionListList = extensionListOpt.get().getExtensionList();
-            for (ExtensionList extensionItem : extensionListList) {
-                // TODO: get real version
-                ConverterExtensionKey<? extends ExtensionKey> key = new ConverterExtensionKey<>(extensionItem.getExtensionKey(), OFConstants.OFP_VERSION_1_3);
-                ConvertorToOFJava<MatchEntry> convertor = OFSessionUtil.getExtensionConvertorProvider().getConverter(key);
-                if (convertor == null) {
-                    throw new IllegalStateException("No converter found for key: " + key.toString());
-                }
-                MatchEntry ofMatch = convertor.convert(extensionItem.getExtension());
-                result.add(ofMatch);
-            }
-        }
-
-        return result;
-    }
-}
@@ -8,14 +8,15 @@
 
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowplugin.api.OFConstants;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactorConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorKey;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ResultInjector;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.field._case.SetFieldActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.MatchBuilder;
@@ -24,25 +25,28 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
 
-/**
- * add prepared convertors and injectors into given mappings
- *
- * @see MatchReactor
- */
-public class MatchReactorMappingFactory {
+public class MatchInjector {
+    @SuppressWarnings("unchecked")
+    public static <FROM, TO> void inject(Optional<FROM> source, TO target, short version) {
+        FROM sourceResult;
+        if (source.isPresent()) {
+            sourceResult = source.get();
+        } else if (version == EncodeConstants.OF10_VERSION_ID) {
+            sourceResult = (FROM) MatchV10Convertor.defaultResult();
+        } else {
+            sourceResult = (FROM) MatchConvertor.defaultResult();
+        }
+
+        final Map<ConvertorKey, ResultInjector<?, ?>> injectorMap = new HashMap<>();
+        addInjectors(injectorMap);
+
+        final ResultInjector<FROM, TO> injection = (ResultInjector<FROM, TO>) injectorMap
+                .get(new ConvertorKey(version, target.getClass()));
 
-    /**
-     * @param conversionMapping conversion mapping
-     */
-    public static void addMatchConvertors(final Map<Short, ConvertReactorConvertor<Match, ?>> conversionMapping) {
-        conversionMapping.put(OFConstants.OFP_VERSION_1_3, new MatchConvertorImpl());
-        conversionMapping.put(OFConstants.OFP_VERSION_1_0, new MatchConvertorV10Impl());
+        injection.inject(sourceResult, target);
     }
 
-    /**
-     * @param injectionMapping injection mapping
-     */
-    public static void addMatchIjectors(final Map<ConvertorKey, ResultInjector<?, ?>> injectionMapping) {
+    private static void addInjectors(final Map<ConvertorKey, ResultInjector<?, ?>> injectionMapping) {
         // OF-1.3|List<MatchEntries> --> FlowModInputBuilder
         injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_3, FlowModInputBuilder.class),
                 new ResultInjector<List<MatchEntry>, FlowModInputBuilder>() {
@@ -114,11 +118,7 @@ public class MatchReactorMappingFactory {
                 });
     }
 
-    /**
-     * @param value pure match
-     * @return wrapped match
-     */
-    public static MatchBuilder wrapMatchV13(final List<MatchEntry> value) {
+    private static MatchBuilder wrapMatchV13(final List<MatchEntry> value) {
         MatchBuilder matchBuilder = new MatchBuilder();
         matchBuilder.setType(FlowConvertor.DEFAULT_MATCH_TYPE);
         if (value == null) {
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchReactor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchReactor.java
deleted file mode 100644 (file)
index 3c31f4d..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
-
-import java.util.Map;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactorConvertor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorKey;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ResultInjector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match;
-
-/**
- *
- */
-public class MatchReactor extends ConvertReactor<Match> {
-
-    private static final MatchReactor INSTANCE = new MatchReactor();
-
-    private MatchReactor() {
-        //NOOP
-    }
-
-    /**
-     * @return singleton
-     */
-    public static MatchReactor getInstance() {
-        return INSTANCE;
-    }
-
-    @Override
-    protected void initMappings(final Map<Short, ConvertReactorConvertor<Match, ?>> conversions,
-                                final Map<ConvertorKey, ResultInjector<?, ?>> injections) {
-        MatchReactorMappingFactory.addMatchConvertors(conversions);
-        MatchReactorMappingFactory.addMatchIjectors(injections);
-    }
-}
index 2529f37fbe8f579ffa116d6f7d01d209d06158c9..0c156e26bc8abff44b19b1d488c32eaaf378d4f5 100644 (file)
@@ -143,10 +143,10 @@ public class MatchResponseConvertor extends Convertor<MatchEntriesGrouping, Matc
     private static final ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData> OF_TO_SAL_TUNNEL_PROCESSOR = new ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData>()
             .addCase(new OfToSalTunnelIpv4SrcCase())
             .addCase(new OfToSalTunnelIpv4DstCase());
-    private static final java.util.List<Class<? extends DataContainer>> TYPES = Arrays.asList(Match.class, SetFieldAction.class);
+    private static final java.util.List<Class<?>> TYPES = Arrays.asList(Match.class, SetFieldAction.class);
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return  TYPES;
     }
 
@@ -8,14 +8,19 @@
 
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
 
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Iterator;
+import java.util.List;
 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
 import org.opendaylight.openflowplugin.openflow.md.util.ActionUtil;
 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetField;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
@@ -32,9 +37,18 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.matc
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10Builder;
 
 /**
- * The type Match convertor v 10.
+ * The type Match converter v 10.
  */
-public class MatchConvertorV10Impl implements MatchConvertor<MatchV10> {
+public class MatchV10Convertor extends Convertor<Match, MatchV10, VersionConvertorData> {
+
+    private static final List<Class<?>> TYPES = Arrays.asList(
+            Match.class,
+            org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match.class,
+            org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.mod.removed.Match.class,
+            org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.received.Match.class,
+            org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.in.message.Match.class,
+            org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.Match.class,
+            SetField.class);
 
     /**
      * default MAC
@@ -203,14 +217,20 @@ public class MatchConvertorV10Impl implements MatchConvertor<MatchV10> {
     }
 
     /**
-     * Method builds openflow 1.0 specific match (MatchV10) from MD-SAL match.
-     *
-     * @param match MD-SAL match
-     * @param convertorExecutor
-     * @return OF-API match
+     * Create default empty match v10
+     * Use this method, if result from converter is empty.
      */
+    public static MatchV10 defaultResult() {
+        return new MatchV10Builder().build();
+    }
+
+    @Override
+    public Collection<Class<?>> getTypes() {
+        return TYPES;
+    }
+
     @Override
-    public MatchV10 convert(final Match match, ConvertorExecutor convertorExecutor) {
+    public MatchV10 convert(final Match source, final VersionConvertorData data) {
         MatchV10Builder matchBuilder = new MatchV10Builder();
         boolean _dLDST = true;
         boolean _dLSRC = true;
@@ -238,23 +258,23 @@ public class MatchConvertorV10Impl implements MatchConvertor<MatchV10> {
         matchBuilder.setTpSrc(0);
         matchBuilder.setTpDst(0);
 
-        if (match != null) {
-            EthernetMatch ethernetMatch = match.getEthernetMatch();
+        if (source != null) {
+            EthernetMatch ethernetMatch = source.getEthernetMatch();
             if (ethernetMatch != null) {
                 _dLDST = convertEthernetDlDst(matchBuilder, ethernetMatch);
                 _dLSRC = convertEthernetDlSrc(matchBuilder, ethernetMatch);
                 _dLTYPE = convertEthernetDlType(matchBuilder, ethernetMatch);
             }
-            VlanMatch vlanMatch = match.getVlanMatch();
+            VlanMatch vlanMatch = source.getVlanMatch();
             if (vlanMatch != null) {
                 _dLVLAN = convertDlVlan(matchBuilder, vlanMatch);
                 _dLVLANPCP = convertDlVlanPcp(matchBuilder, vlanMatch);
             }
-            NodeConnectorId inPort = match.getInPort();
+            NodeConnectorId inPort = source.getInPort();
             if (inPort != null) {
                 _iNPORT = convertInPortMatch(matchBuilder, inPort);
             }
-            Layer3Match l3Match = match.getLayer3Match();
+            Layer3Match l3Match = source.getLayer3Match();
             if (l3Match != null) {
                 if (l3Match instanceof Ipv4Match) {
                     Ipv4Match ipv4 = (Ipv4Match) l3Match;
@@ -262,12 +282,12 @@ public class MatchConvertorV10Impl implements MatchConvertor<MatchV10> {
                     convertL3Ipv4DstMatch(matchBuilder, ipv4);
                 }
             }
-            IpMatch ipMatch = match.getIpMatch();
+            IpMatch ipMatch = source.getIpMatch();
             if (ipMatch != null) {
                 _nWPROTO = convertNwProto(matchBuilder, ipMatch);
                 _nWTOS = convertNwTos(matchBuilder, ipMatch);
             }
-            Layer4Match layer4Match = match.getLayer4Match();
+            Layer4Match layer4Match = source.getLayer4Match();
             if (layer4Match != null) {
                 if (layer4Match instanceof TcpMatch) {
                     TcpMatch tcpMatch = (TcpMatch) layer4Match;
@@ -279,7 +299,7 @@ public class MatchConvertorV10Impl implements MatchConvertor<MatchV10> {
                     _tPDST = convertL4UdpDstMatch(matchBuilder, udpMatch);
                 }
             } else {
-                Icmpv4Match icmpv4Match = match.getIcmpv4Match();
+                Icmpv4Match icmpv4Match = source.getIcmpv4Match();
                 if (icmpv4Match != null) {
                     Short type = icmpv4Match.getIcmpv4Type();
                     if (type != null) {
@@ -302,4 +322,4 @@ public class MatchConvertorV10Impl implements MatchConvertor<MatchV10> {
 
         return matchBuilder.build();
     }
-}
+}
\ No newline at end of file
index 742ddc032e1ab4069317acc61f9153ff1ef2fdd6..790e4791dd2ab213d92d44ece3d85e67f12da975 100644 (file)
@@ -53,10 +53,10 @@ public class MatchV10ResponseConvertor extends Convertor<MatchV10, MatchBuilder,
     private static final short PROTO_UDP = 17;
     private static final short PROTO_ICMPV4 = 1;
     private static final String NO_IP = "0.0.0.0/0";
-    private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(MatchV10.class);
+    private static final Set<Class<?>> TYPES = Collections.singleton(MatchV10.class);
 
     @Override
-    public Collection<Class<? extends DataContainer>> getTypes() {
+    public Collection<Class<?>> getTypes() {
         return TYPES;
     }
 
index 7675e5445097814d63b3aa7a05a99ce6affe66ab..5049fbbd0d55fb78429283e40da8553c85fe30f1 100644 (file)
@@ -23,23 +23,18 @@ import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Con
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
 
 /**
  * Test for {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager}
  */
 @RunWith(MockitoJUnitRunner.class)
 public class ConvertorManagerTest {
-    /**
-     * Test for {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager#registerConvertor(short, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor)}
-     * @throws Exception
-     */
     @Test
     public void testRegisterConvertor() throws Exception {
         final ConvertorManager convertorManager = new ConvertorManager(OFConstants.OFP_VERSION_1_3)
                 .registerConvertor(OFConstants.OFP_VERSION_1_3, new Convertor<Action, String, VersionConvertorData>() {
                     @Override
-                    public Collection<Class<? extends DataContainer>> getTypes() {
+                    public Collection<Class<?>> getTypes() {
                         return Collections.singleton(Action.class);
                     }
 
@@ -53,16 +48,12 @@ public class ConvertorManagerTest {
         assertTrue("Failed to find convertor for action", convertor.isPresent());
     }
 
-    /**
-     * Test for {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager#convert(org.opendaylight.yangtools.yang.binding.DataContainer, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorData)}
-     * @throws Exception
-     */
     @Test
     public void testConvert() throws Exception {
         final ConvertorManager convertorManager = new ConvertorManager(OFConstants.OFP_VERSION_1_3)
                 .registerConvertor(OFConstants.OFP_VERSION_1_3, new Convertor<Action, String, VersionConvertorData>() {
                     @Override
-                    public Collection<Class<? extends DataContainer>> getTypes() {
+                    public Collection<Class<?>> getTypes() {
                         return Collections.singleton(Action.class);
                     }
 
@@ -90,7 +81,7 @@ public class ConvertorManagerTest {
         final ConvertorManager convertorManager = new ConvertorManager(OFConstants.OFP_VERSION_1_3)
                 .registerConvertor(OFConstants.OFP_VERSION_1_3, new Convertor<List<Action>, String, VersionConvertorData>() {
                     @Override
-                    public Collection<Class<? extends DataContainer>> getTypes() {
+                    public Collection<Class<?>> getTypes() {
                         return Collections.singleton(Action.class);
                     }
 
diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagReactorTest.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/flowflag/FlowFlagReactorTest.java
deleted file mode 100644 (file)
index ee16c76..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.flowflag;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.openflowplugin.api.OFConstants;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
-
-/**
- * match conversion and injection test
- */
-public class FlowFlagReactorTest {
-
-    private FlowModFlags[] flowFlags;
-    private ConvertorManager convertorManager;
-
-    /**
-     * prepare input match
-     */
-    @Before
-    public void setUp() {
-        flowFlags = new FlowModFlags[] {
-                new FlowModFlags(true, true, true, true, true),
-                new FlowModFlags(false, false, false, false, false),
-                new FlowModFlags(true, false, true, false, true)
-        };
-        convertorManager = ConvertorManagerFactory.createDefaultManager();
-    }
-
-    /**
-     * convert for OF-1.3, inject into {@link FlowModInputBuilder}
-     */
-    @Test
-    public void testMatchConvertorV13_flow() {
-        FlowModInputBuilder target = new FlowModInputBuilder();
-        for (FlowModFlags fFlag : flowFlags) {
-            target.setFlags(null);
-            FlowFlagReactor.getInstance().convert(fFlag,
-                    OFConstants.OFP_VERSION_1_3, target, convertorManager);
-            Assert.assertNotNull(target.getFlags());
-        }
-    }
-
-    /**
-     * convert for OF-1.0, inject into {@link FlowModInputBuilder}
-     */
-    @Test
-    public void testMatchConvertorV10_flow() {
-        FlowModInputBuilder target = new FlowModInputBuilder();
-        for (FlowModFlags fFlag : flowFlags) {
-            target.setFlagsV10(null);
-            FlowFlagReactor.getInstance().convert(fFlag,
-                    OFConstants.OFP_VERSION_1_0, target, convertorManager);
-            Assert.assertNotNull(target.getFlagsV10());
-        }
-    }
-}
\ No newline at end of file
-/*\r
- * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-\r
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;\r
-\r
-import java.math.BigInteger;\r
-import java.util.List;\r
-import org.junit.Assert;\r
-import org.junit.Before;\r
-import org.junit.Test;\r
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;\r
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6FlowLabel;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6ExtHeaderBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6LabelBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpOp;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSha;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSpa;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTha;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTpa;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthDst;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthSrc;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthType;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Code;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Type;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Code;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Type;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPhyPort;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpDscp;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpEcn;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpProto;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Dst;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Src;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Dst;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Exthdr;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Flabel;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdSll;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTarget;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTll;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Src;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsBos;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsLabel;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsTc;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PbbIsid;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpDst;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpSrc;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpDst;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpSrc;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TunnelId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpDst;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpSrc;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanVid;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpOpCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpShaCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpSpaCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpThaCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpTpaCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpDscpCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6ExthdrCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6FlabelCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdSllCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTargetCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTllCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6SrcCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpDstCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpSrcCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpDstCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpSrcCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpDstCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpSrcCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanPcpCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCase;\r
-\r
-/**\r
- * @author michal.polkorab\r
- */\r
-public class MatchConvertorImpl2Test {\r
-\r
-    private static final MatchConvertorImpl convertor = new MatchConvertorImpl();\r
-    private ConvertorManager convertorManager;\r
-\r
-    /**\r
-     * Initializes OpenflowPortsUtil\r
-     */\r
-    @Before\r
-    public void startUp() {\r
-        convertorManager = ConvertorManagerFactory.createDefaultManager();\r
-    }\r
-\r
-    @Test\r
-    public void testEmptyAndNullInput() {\r
-        MatchBuilder builder = new MatchBuilder();\r
-        Match match = builder.build();\r
-\r
-        List<MatchEntry> entries = convertor.convert(null, convertorManager);\r
-        Assert.assertEquals("Wrong entries size", 0, entries.size());\r
-\r
-        entries = convertor.convert(match, convertorManager);\r
-        Assert.assertEquals("Wrong entries size", 0, entries.size());\r
-    }\r
-\r
-    @Test\r
-    public void testConversion() {\r
-        MatchBuilder builder = new MatchBuilder();\r
-        builder.setInPort(new NodeConnectorId("openflow:42:1"));\r
-        builder.setInPhyPort(new NodeConnectorId("openflow:42:2"));\r
-        MetadataBuilder metadataBuilder = new MetadataBuilder();\r
-        metadataBuilder.setMetadata(new BigInteger("3"));\r
-        builder.setMetadata(metadataBuilder.build());\r
-        EthernetMatchBuilder ethernetBuilder = new EthernetMatchBuilder();\r
-        EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();\r
-        ethTypeBuilder.setType(new EtherType(4L));\r
-        ethernetBuilder.setEthernetType(ethTypeBuilder.build());\r
-        EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder();\r
-        ethSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
-        ethernetBuilder.setEthernetSource(ethSrcBuilder.build());\r
-        EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder();\r
-        ethDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
-        ethernetBuilder.setEthernetDestination(ethDstBuilder.build());\r
-        builder.setEthernetMatch(ethernetBuilder.build());\r
-        VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();\r
-        VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();\r
-        vlanIdBuilder.setVlanId(new VlanId(7));\r
-        vlanIdBuilder.setVlanIdPresent(true);\r
-        vlanBuilder.setVlanId(vlanIdBuilder.build());\r
-        vlanBuilder.setVlanPcp(new VlanPcp((short) 7));\r
-        builder.setVlanMatch(vlanBuilder.build());\r
-        IpMatchBuilder ipMatchBuilder = new IpMatchBuilder();\r
-        ipMatchBuilder.setIpDscp(new Dscp((short) 8));\r
-        ipMatchBuilder.setIpEcn((short) 9);\r
-        ipMatchBuilder.setIpProtocol((short) 10);\r
-        builder.setIpMatch(ipMatchBuilder.build());\r
-        TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();\r
-        tcpMatchBuilder.setTcpSourcePort(new PortNumber(11));\r
-        tcpMatchBuilder.setTcpDestinationPort(new PortNumber(12));\r
-        builder.setLayer4Match(tcpMatchBuilder.build());\r
-        Icmpv4MatchBuilder icmpv4Builder = new Icmpv4MatchBuilder();\r
-        icmpv4Builder.setIcmpv4Type((short) 13);\r
-        icmpv4Builder.setIcmpv4Code((short) 14);\r
-        builder.setIcmpv4Match(icmpv4Builder.build());\r
-        Icmpv6MatchBuilder icmpv6Builder = new Icmpv6MatchBuilder();\r
-        icmpv6Builder.setIcmpv6Type((short) 15);\r
-        icmpv6Builder.setIcmpv6Code((short) 16);\r
-        builder.setIcmpv6Match(icmpv6Builder.build());\r
-        ProtocolMatchFieldsBuilder protoBuilder = new ProtocolMatchFieldsBuilder();\r
-        protoBuilder.setMplsLabel(17L);\r
-        protoBuilder.setMplsTc((short) 18);\r
-        protoBuilder.setMplsBos((short) 19);\r
-        PbbBuilder pbbBuilder = new PbbBuilder();\r
-        pbbBuilder.setPbbIsid(20L);\r
-        protoBuilder.setPbb(pbbBuilder.build());\r
-        builder.setProtocolMatchFields(protoBuilder.build());\r
-        TunnelBuilder tunnelBuilder = new TunnelBuilder();\r
-        tunnelBuilder.setTunnelId(new BigInteger("21"));\r
-        builder.setTunnel(tunnelBuilder.build());\r
-        Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();\r
-        ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("10.0.0.1/32"));\r
-        ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("10.0.0.2/32"));\r
-        builder.setLayer3Match(ipv4MatchBuilder.build());\r
-        Match match = builder.build();\r
-\r
-        List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
-        Assert.assertEquals("Wrong entries size", 24, entries.size());\r
-        MatchEntry entry = entries.get(0);\r
-        checkEntryHeader(entry, InPort.class, false);\r
-        Assert.assertEquals("Wrong in port", 1, ((InPortCase) entry.getMatchEntryValue()).getInPort()\r
-                .getPortNumber().getValue().intValue());\r
-\r
-        entry = entries.get(1);\r
-        checkEntryHeader(entry, InPhyPort.class, false);\r
-        Assert.assertEquals("Wrong in phy port", 2, ((InPhyPortCase) entry.getMatchEntryValue()).\r
-                        getInPhyPort().getPortNumber().getValue().intValue());\r
-\r
-        entry = entries.get(2);\r
-        checkEntryHeader(entry, Metadata.class, false);\r
-        Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},\r
-                ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMetadata());\r
-        entry = entries.get(3);\r
-        checkEntryHeader(entry, EthDst.class, false);\r
-        Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:06"),\r
-                ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMacAddress());\r
-        entry = entries.get(4);\r
-        checkEntryHeader(entry, EthSrc.class, false);\r
-        Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:05"),\r
-                ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMacAddress());\r
-        entry = entries.get(5);\r
-        checkEntryHeader(entry, EthType.class, false);\r
-        Assert.assertEquals("Wrong eth type", 4, ((EthTypeCase) entry.getMatchEntryValue())\r
-                .getEthType().getEthType().getValue().intValue());\r
-        entry = entries.get(6);\r
-        checkEntryHeader(entry, VlanVid.class, false);\r
-        Assert.assertEquals("Wrong vlan id", 7, ((VlanVidCase) entry.getMatchEntryValue())\r
-                .getVlanVid().getVlanVid().intValue());\r
-        Assert.assertEquals("Wrong cfi bit", true, ((VlanVidCase) entry.getMatchEntryValue())\r
-                .getVlanVid().isCfiBit());\r
-        entry = entries.get(7);\r
-        checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanPcp.class, false);\r
-        Assert.assertEquals("Wrong vlan pcp", 7, ((VlanPcpCase) entry.getMatchEntryValue())\r
-                .getVlanPcp().getVlanPcp().intValue());\r
-        entry = entries.get(8);\r
-        checkEntryHeader(entry, IpDscp.class, false);\r
-        Assert.assertEquals("Wrong ip dscp", 8, ((IpDscpCase) entry.getMatchEntryValue())\r
-                .getIpDscp().getDscp().getValue().intValue());\r
-        entry = entries.get(9);\r
-        checkEntryHeader(entry, IpEcn.class, false);\r
-        Assert.assertEquals("Wrong ip ecn", 9, ((IpEcnCase) entry.getMatchEntryValue())\r
-                .getIpEcn().getEcn().intValue());\r
-        entry = entries.get(10);\r
-        checkEntryHeader(entry, IpProto.class, false);\r
-        Assert.assertEquals("Wrong ip proto", 10, ((IpProtoCase) entry.getMatchEntryValue())\r
-                .getIpProto().getProtocolNumber().intValue());\r
-        entry = entries.get(11);\r
-        checkEntryHeader(entry, TcpSrc.class, false);\r
-        Assert.assertEquals("Wrong tcp src", 11, ((TcpSrcCase) entry.getMatchEntryValue())\r
-                .getTcpSrc().getPort().getValue().intValue());\r
-        entry = entries.get(12);\r
-        checkEntryHeader(entry, TcpDst.class, false);\r
-        Assert.assertEquals("Wrong tcp dst", 12, ((TcpDstCase) entry.getMatchEntryValue())\r
-                .getTcpDst().getPort().getValue().intValue());\r
-        entry = entries.get(13);\r
-        checkEntryHeader(entry, Icmpv4Type.class, false);\r
-        Assert.assertEquals("Wrong icmpv4 type", 13, ((Icmpv4TypeCase) entry.getMatchEntryValue())\r
-                .getIcmpv4Type().getIcmpv4Type().intValue());\r
-        entry = entries.get(14);\r
-        checkEntryHeader(entry, Icmpv4Code.class, false);\r
-        Assert.assertEquals("Wrong icmpv4 code", 14, ((Icmpv4CodeCase) entry.getMatchEntryValue())\r
-                .getIcmpv4Code().getIcmpv4Code().intValue());\r
-        entry = entries.get(15);\r
-        checkEntryHeader(entry, Icmpv6Type.class, false);\r
-        Assert.assertEquals("Wrong icmpv6 type", 15, ((Icmpv6TypeCase) entry.getMatchEntryValue())\r
-                .getIcmpv6Type().getIcmpv6Type().intValue());\r
-        entry = entries.get(16);\r
-        checkEntryHeader(entry, Icmpv6Code.class, false);\r
-        Assert.assertEquals("Wrong icmpv6 code", 16, ((Icmpv6CodeCase) entry.getMatchEntryValue())\r
-                .getIcmpv6Code().getIcmpv6Code().intValue());\r
-        entry = entries.get(17);\r
-        checkEntryHeader(entry, Ipv4Src.class, false);\r
-        Assert.assertEquals("Wrong ipv4 src", "10.0.0.1", ((Ipv4SrcCase) entry.getMatchEntryValue())\r
-                .getIpv4Src().getIpv4Address().getValue());\r
-        entry = entries.get(18);\r
-        checkEntryHeader(entry, Ipv4Dst.class, false);\r
-        Assert.assertEquals("Wrong ipv4 dst", "10.0.0.2", ((Ipv4DstCase) entry.getMatchEntryValue())\r
-                .getIpv4Dst().getIpv4Address().getValue());\r
-        entry = entries.get(19);\r
-        checkEntryHeader(entry, MplsLabel.class, false);\r
-        Assert.assertEquals("Wrong mpls label", 17, ((MplsLabelCase) entry.getMatchEntryValue())\r
-                .getMplsLabel().getMplsLabel().intValue());\r
-        entry = entries.get(20);\r
-        checkEntryHeader(entry, MplsBos.class, false);\r
-        Assert.assertEquals("Wrong mpls bos", true, ((MplsBosCase) entry.getMatchEntryValue()).getMplsBos().isBos());\r
-        entry = entries.get(21);\r
-        checkEntryHeader(entry, MplsTc.class, false);\r
-        Assert.assertEquals("Wrong mpls tc", 18, ((MplsTcCase) entry.getMatchEntryValue())\r
-                .getMplsTc().getTc().intValue());\r
-        entry = entries.get(22);\r
-        checkEntryHeader(entry, PbbIsid.class, false);\r
-        Assert.assertEquals("Wrong pbb isid", 20, ((PbbIsidCase) entry.getMatchEntryValue())\r
-                .getPbbIsid().getIsid().intValue());\r
-        entry = entries.get(23);\r
-        checkEntryHeader(entry, TunnelId.class, false);\r
-        Assert.assertArrayEquals("Wrong tunnel id", new byte[]{0, 0, 0, 0, 0, 0, 0, 21},\r
-                ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getTunnelId());\r
-    }\r
-\r
-    private static void checkEntryHeader(MatchEntry entry, Class<? extends MatchField> field, boolean hasMask) {\r
-        Assert.assertEquals("Wrong oxm class", OpenflowBasicClass.class, entry.getOxmClass());\r
-        Assert.assertEquals("Wrong oxm field", field, entry.getOxmMatchField());\r
-        Assert.assertEquals("Wrong hasMask", hasMask, entry.isHasMask());\r
-    }\r
-\r
-    @Test\r
-    public void testIpv4MatchArbitraryBitMaskwithNoMask(){\r
-        MatchBuilder builder = new MatchBuilder();\r
-        Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder= new Ipv4MatchArbitraryBitMaskBuilder();\r
-        ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask( new Ipv4Address("10.2.2.2"));\r
-        ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask( new Ipv4Address("10.1.1.1"));\r
-        builder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());\r
-        Match match = builder.build();\r
-\r
-        List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
-        Assert.assertEquals("Wrong entries size", 2, entries.size());\r
-\r
-        MatchEntry entry = entries.get(0);\r
-        checkEntryHeader(entry,Ipv4Src.class,false);\r
-        Assert.assertEquals("wrong Ipv4Address source", "10.2.2.2",((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getIpv4Address().getValue());\r
-        entry = entries.get(1);\r
-        checkEntryHeader(entry,Ipv4Dst.class,false);\r
-        Assert.assertEquals("wrong Ipv4Address destination", "10.1.1.1",((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getIpv4Address().getValue());\r
-    }\r
-\r
-    @Test\r
-    public void testIpv4MatchArbitraryBitMaskwithMask(){\r
-        MatchBuilder builder = new MatchBuilder();\r
-        Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder= new Ipv4MatchArbitraryBitMaskBuilder();\r
-        ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask( new Ipv4Address("10.2.2.2"));\r
-        ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceArbitraryBitmask(new DottedQuad("0.0.255.0"));\r
-        ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask( new Ipv4Address("10.1.1.1"));\r
-        ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationArbitraryBitmask(new DottedQuad("0.240.0.0"));\r
-        builder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());\r
-        Match match = builder.build();\r
-\r
-        List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
-        Assert.assertEquals("Wrong entries size", 2, entries.size());\r
-\r
-        MatchEntry entry = entries.get(0);\r
-        checkEntryHeader(entry,Ipv4Src.class,true);\r
-        Assert.assertEquals("wrong Ipv4Address source", "10.2.2.2",((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getIpv4Address().getValue());\r
-        entry = entries.get(1);\r
-        checkEntryHeader(entry,Ipv4Dst.class,true);\r
-        Assert.assertEquals("wrong Ipv4Adress destination", "10.1.1.1",((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getIpv4Address().getValue());\r
-    }\r
-\r
-    @Test\r
-    public void testUdpMatchConversion() {\r
-        MatchBuilder builder = new MatchBuilder();\r
-        UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();\r
-        udpMatchBuilder.setUdpSourcePort(new PortNumber(11));\r
-        udpMatchBuilder.setUdpDestinationPort(new PortNumber(12));\r
-        builder.setLayer4Match(udpMatchBuilder.build());\r
-        Match match = builder.build();\r
-\r
-        List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
-        Assert.assertEquals("Wrong entries size", 2, entries.size());\r
-        MatchEntry entry = entries.get(0);\r
-        checkEntryHeader(entry, UdpSrc.class, false);\r
-        Assert.assertEquals("Wrong udp src", 11, ((UdpSrcCase) entry.getMatchEntryValue()).getUdpSrc()\r
-                .getPort().getValue().intValue());\r
-        entry = entries.get(1);\r
-        checkEntryHeader(entry, UdpDst.class, false);\r
-        Assert.assertEquals("Wrong udp dst", 12, ((UdpDstCase) entry.getMatchEntryValue())\r
-                .getUdpDst().getPort().getValue().intValue());\r
-    }\r
-\r
-    @Test\r
-    public void testTunnelIpv4MatchConversion() {\r
-        MatchBuilder builder = new MatchBuilder();\r
-        TunnelIpv4MatchBuilder tunnelIpv4MatchBuilder = new TunnelIpv4MatchBuilder();\r
-        tunnelIpv4MatchBuilder.setTunnelIpv4Source(new Ipv4Prefix("10.0.0.1/32"));\r
-        tunnelIpv4MatchBuilder.setTunnelIpv4Destination(new Ipv4Prefix("10.0.0.2/32"));\r
-        builder.setLayer3Match(tunnelIpv4MatchBuilder.build());\r
-        Match match = builder.build();\r
-\r
-        List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
-        Assert.assertEquals("Wrong entries size", 2, entries.size());\r
-        MatchEntry entry = entries.get(0);\r
-        checkEntryHeader(entry, Ipv4Src.class, false);\r
-        Assert.assertEquals("Wrong ipv4 tunnel src", "10.0.0.1", ((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src()\r
-                .getIpv4Address().getValue());\r
-        entry = entries.get(1);\r
-        checkEntryHeader(entry, Ipv4Dst.class, false);\r
-        Assert.assertEquals("Wrong ipv4 tunnel dst", "10.0.0.2", ((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst()\r
-                .getIpv4Address().getValue());\r
-    }\r
-\r
-    @Test\r
-    public void testSctpMatchConversion() {\r
-        MatchBuilder builder = new MatchBuilder();\r
-        SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();\r
-        sctpMatchBuilder.setSctpSourcePort(new PortNumber(11));\r
-        sctpMatchBuilder.setSctpDestinationPort(new PortNumber(12));\r
-        builder.setLayer4Match(sctpMatchBuilder.build());\r
-        Match match = builder.build();\r
-\r
-        List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
-        Assert.assertEquals("Wrong entries size", 2, entries.size());\r
-        MatchEntry entry = entries.get(0);\r
-        checkEntryHeader(entry, SctpSrc.class, false);\r
-        Assert.assertEquals("Wrong sctp src", 11, ((SctpSrcCase) entry.getMatchEntryValue()).getSctpSrc()\r
-                .getPort().getValue().intValue());\r
-        entry = entries.get(1);\r
-        checkEntryHeader(entry, SctpDst.class, false);\r
-        Assert.assertEquals("Wrong sctp dst", 12, ((SctpDstCase) entry.getMatchEntryValue())\r
-                .getSctpDst().getPort().getValue().intValue());\r
-    }\r
-\r
-    @Test\r
-    public void testArpMatchConversion() {\r
-        MatchBuilder builder = new MatchBuilder();\r
-        ArpMatchBuilder arpBuilder = new ArpMatchBuilder();\r
-        arpBuilder.setArpOp(5);\r
-        arpBuilder.setArpSourceTransportAddress(new Ipv4Prefix("10.0.0.3/32"));\r
-        arpBuilder.setArpTargetTransportAddress(new Ipv4Prefix("10.0.0.4/32"));\r
-        ArpSourceHardwareAddressBuilder srcHwBuilder = new ArpSourceHardwareAddressBuilder();\r
-        srcHwBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
-        arpBuilder.setArpSourceHardwareAddress(srcHwBuilder.build());\r
-        ArpTargetHardwareAddressBuilder dstHwBuilder = new ArpTargetHardwareAddressBuilder();\r
-        dstHwBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
-        arpBuilder.setArpTargetHardwareAddress(dstHwBuilder.build());\r
-        builder.setLayer3Match(arpBuilder.build());\r
-        Match match = builder.build();\r
-\r
-        List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
-        Assert.assertEquals("Wrong entries size", 5, entries.size());\r
-        MatchEntry entry = entries.get(0);\r
-        checkEntryHeader(entry, ArpOp.class, false);\r
-        Assert.assertEquals("Wrong arp op", 5, ((ArpOpCase) entry.getMatchEntryValue())\r
-                .getArpOp().getOpCode().intValue());\r
-        entry = entries.get(1);\r
-        checkEntryHeader(entry, ArpSpa.class, false);\r
-        Assert.assertEquals("Wrong arp spa", "10.0.0.3", ((ArpSpaCase) entry.getMatchEntryValue())\r
-                .getArpSpa().getIpv4Address().getValue());\r
-        entry = entries.get(2);\r
-        checkEntryHeader(entry, ArpTpa.class, false);\r
-        Assert.assertEquals("Wrong arp tpa", "10.0.0.4", ((ArpTpaCase) entry.getMatchEntryValue())\r
-                .getArpTpa().getIpv4Address().getValue());\r
-        entry = entries.get(3);\r
-        checkEntryHeader(entry, ArpSha.class, false);\r
-        Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:05", ((ArpShaCase) entry.getMatchEntryValue())\r
-                .getArpSha().getMacAddress().getValue());\r
-        entry = entries.get(4);\r
-        checkEntryHeader(entry, ArpTha.class, false);\r
-        Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:06", ((ArpThaCase) entry.getMatchEntryValue())\r
-                .getArpTha().getMacAddress().getValue());\r
-    }\r
-\r
-    @Test\r
-    public void testArpMatchConversionWithMasks() {\r
-        MatchBuilder builder = new MatchBuilder();\r
-        ArpMatchBuilder arpBuilder = new ArpMatchBuilder();\r
-        /* Use canonnical prefixes !!! */\r
-        arpBuilder.setArpSourceTransportAddress(new Ipv4Prefix("10.0.0.0/8"));\r
-        arpBuilder.setArpTargetTransportAddress(new Ipv4Prefix("10.0.0.4/31"));\r
-        ArpSourceHardwareAddressBuilder srcHwBuilder = new ArpSourceHardwareAddressBuilder();\r
-        srcHwBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
-        srcHwBuilder.setMask(new MacAddress("00:00:00:00:00:08"));\r
-        arpBuilder.setArpSourceHardwareAddress(srcHwBuilder.build());\r
-        ArpTargetHardwareAddressBuilder dstHwBuilder = new ArpTargetHardwareAddressBuilder();\r
-        dstHwBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
-        dstHwBuilder.setMask(new MacAddress("00:00:00:00:00:09"));\r
-        arpBuilder.setArpTargetHardwareAddress(dstHwBuilder.build());\r
-        builder.setLayer3Match(arpBuilder.build());\r
-        Match match = builder.build();\r
-\r
-        List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
-        Assert.assertEquals("Wrong entries size", 4, entries.size());\r
-        MatchEntry entry = entries.get(0);\r
-        entry = entries.get(0);\r
-        checkEntryHeader(entry, ArpSpa.class, true);\r
-        Assert.assertEquals("Wrong arp spa", "10.0.0.0", ((ArpSpaCase) entry.getMatchEntryValue())\r
-                .getArpSpa().getIpv4Address().getValue());\r
-        Assert.assertArrayEquals("Wrong arp spa mask", new byte[]{(byte) 255, 0, 0, 0},\r
-                ((ArpSpaCase) entry.getMatchEntryValue()).getArpSpa().getMask());\r
-        entry = entries.get(1);\r
-        checkEntryHeader(entry, ArpTpa.class, true);\r
-        Assert.assertEquals("Wrong arp tpa", "10.0.0.4", ((ArpTpaCase) entry.getMatchEntryValue()).getArpTpa()\r
-                .getIpv4Address().getValue());\r
-        Assert.assertArrayEquals("Wrong arp tpa mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 254},\r
-                ((ArpTpaCase) entry.getMatchEntryValue()).getArpTpa().getMask());\r
-        entry = entries.get(2);\r
-        checkEntryHeader(entry, ArpSha.class, true);\r
-        Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:05", ((ArpShaCase) entry.getMatchEntryValue())\r
-                .getArpSha().getMacAddress().getValue());\r
-        Assert.assertArrayEquals("Wrong arp sha mask", new byte[]{0, 0, 0, 0, 0, 8},\r
-                ((ArpShaCase) entry.getMatchEntryValue()).getArpSha().getMask());\r
-        entry = entries.get(3);\r
-        checkEntryHeader(entry, ArpTha.class, true);\r
-        Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:06", ((ArpThaCase) entry.getMatchEntryValue()).getArpTha()\r
-                .getMacAddress().getValue());\r
-        Assert.assertArrayEquals("Wrong arp tha mask", new byte[]{0, 0, 0, 0, 0, 9},\r
-                ((ArpThaCase) entry.getMatchEntryValue()).getArpTha().getMask());\r
-    }\r
-\r
-    @Test\r
-    public void testIpv6MatchConversion() {\r
-        MatchBuilder builder = new MatchBuilder();\r
-        Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();\r
-        ipv6Builder.setIpv6Source(new Ipv6Prefix("::1/128"));\r
-        ipv6Builder.setIpv6Destination(new Ipv6Prefix("::2/128"));\r
-        Ipv6LabelBuilder ipv6LabelBuilder = new Ipv6LabelBuilder();\r
-        ipv6LabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(3L));\r
-        ipv6Builder.setIpv6Label(ipv6LabelBuilder.build());\r
-        ipv6Builder.setIpv6NdTarget(new Ipv6Address("::4"));\r
-        ipv6Builder.setIpv6NdSll(new MacAddress("00:00:00:00:00:05"));\r
-        ipv6Builder.setIpv6NdTll(new MacAddress("00:00:00:00:00:06"));\r
-        Ipv6ExtHeaderBuilder extHdrBuilder = new Ipv6ExtHeaderBuilder();\r
-        extHdrBuilder.setIpv6Exthdr(153);\r
-        ipv6Builder.setIpv6ExtHeader(extHdrBuilder.build());\r
-        builder.setLayer3Match(ipv6Builder.build());\r
-        Match match = builder.build();\r
-\r
-        List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
-        Assert.assertEquals("Wrong entries size", 7, entries.size());\r
-        MatchEntry entry = entries.get(0);\r
-        /* Due to conversion ambiguities, we always get "has mask" because \r
-         * an ip with no mask and prefix with /128 (or 32 in v4) cannot \r
-         * be distinguished */\r
-        checkEntryHeader(entry, Ipv6Src.class, true);\r
-        Assert.assertEquals("Wrong ipv6 src", "::1",\r
-                ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());\r
-        entry = entries.get(1);\r
-        checkEntryHeader(entry, Ipv6Dst.class, true);\r
-        Assert.assertEquals("Wrong ipv6 dst", "::2",\r
-                ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());\r
-        entry = entries.get(2);\r
-        checkEntryHeader(entry, Ipv6Flabel.class, false);\r
-        Assert.assertEquals("Wrong ipv6 flabel", 3,\r
-                ((Ipv6FlabelCase) entry.getMatchEntryValue()).getIpv6Flabel().getIpv6Flabel().getValue().intValue());\r
-        entry = entries.get(3);\r
-        checkEntryHeader(entry, Ipv6NdTarget.class, false);\r
-        Assert.assertEquals("Wrong ipv6 nd target", "::4",\r
-                ((Ipv6NdTargetCase) entry.getMatchEntryValue()).getIpv6NdTarget().getIpv6Address().getValue());\r
-        entry = entries.get(4);\r
-        checkEntryHeader(entry, Ipv6NdSll.class, false);\r
-        Assert.assertEquals("Wrong ipv6 nd sll", "00:00:00:00:00:05",\r
-                ((Ipv6NdSllCase) entry.getMatchEntryValue()).getIpv6NdSll().getMacAddress().getValue());\r
-        entry = entries.get(5);\r
-        checkEntryHeader(entry, Ipv6NdTll.class, false);\r
-        Assert.assertEquals("Wrong ipv6 nd tll", "00:00:00:00:00:06",\r
-                ((Ipv6NdTllCase) entry.getMatchEntryValue()).getIpv6NdTll().getMacAddress().getValue());\r
-        entry = entries.get(6);\r
-        checkEntryHeader(entry, Ipv6Exthdr.class, false);\r
-        Assert.assertEquals("Wrong ipv6 ext hdr", new Ipv6ExthdrFlags(false, true, false, true, false,\r
-                true, false, true, false), ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getPseudoField());\r
-    }\r
-\r
-    @Test\r
-    public void testIpv6MatchConversionWithMasks() {\r
-        MatchBuilder builder = new MatchBuilder();\r
-        Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();\r
-        ipv6Builder.setIpv6Source(new Ipv6Prefix("::/24"));\r
-        ipv6Builder.setIpv6Destination(new Ipv6Prefix("::/64"));\r
-        builder.setLayer3Match(ipv6Builder.build());\r
-        Match match = builder.build();\r
-\r
-        List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
-        Assert.assertEquals("Wrong entries size", 2, entries.size());\r
-        MatchEntry entry = entries.get(0);\r
-        checkEntryHeader(entry, Ipv6Src.class, true);\r
-        Assert.assertEquals("Wrong ipv6 src", "::",\r
-                ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());\r
-        Assert.assertArrayEquals("Wrong ipv6 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, 0, 0, 0, 0,\r
-                0, 0, 0, 0, 0, 0, 0, 0, 0}, ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getMask());\r
-        entry = entries.get(1);\r
-        checkEntryHeader(entry, Ipv6Dst.class, true);\r
-        Assert.assertEquals("Wrong ipv6 dst", "::",\r
-                ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());\r
-        Assert.assertArrayEquals("Wrong ipv6 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 255,\r
-                        (byte) 255, (byte) 255, (byte) 255, (byte) 255, 0, 0, 0, 0, 0, 0, 0, 0},\r
-                ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getMask());\r
-    }\r
-\r
-    @Test\r
-    public void testIpv6ExtHeaderConversion() {\r
-        MatchBuilder builder = new MatchBuilder();\r
-        Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();\r
-        Ipv6ExtHeaderBuilder extHdrBuilder = new Ipv6ExtHeaderBuilder();\r
-        extHdrBuilder.setIpv6Exthdr(358);\r
-        extHdrBuilder.setIpv6ExthdrMask(258);\r
-        ipv6Builder.setIpv6ExtHeader(extHdrBuilder.build());\r
-        builder.setLayer3Match(ipv6Builder.build());\r
-        Match match = builder.build();\r
-\r
-        List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
-        Assert.assertEquals("Wrong entries size", 1, entries.size());\r
-        MatchEntry entry = entries.get(0);\r
-        checkEntryHeader(entry, Ipv6Exthdr.class, true);\r
-        Assert.assertEquals("Wrong ipv6 ext hdr", new Ipv6ExthdrFlags(true, false, true, false, true, false,\r
-                true, false, true), ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getPseudoField());\r
-        Assert.assertArrayEquals("Wrong ipv6 ext hdr mask", new byte[]{1, 2},\r
-                ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getMask());\r
-    }\r
-\r
-    @Test\r
-    public void testConversionWithMasks() {\r
-        MatchBuilder builder = new MatchBuilder();\r
-        MetadataBuilder metadataBuilder = new MetadataBuilder();\r
-        metadataBuilder.setMetadata(new BigInteger("3"));\r
-        metadataBuilder.setMetadataMask(new BigInteger("15"));\r
-        builder.setMetadata(metadataBuilder.build());\r
-        EthernetMatchBuilder ethernetBuilder = new EthernetMatchBuilder();\r
-        EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder();\r
-        ethSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
-        ethSrcBuilder.setMask(new MacAddress("00:00:00:00:00:08"));\r
-        ethernetBuilder.setEthernetSource(ethSrcBuilder.build());\r
-        EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder();\r
-        ethDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
-        ethDstBuilder.setMask(new MacAddress("00:00:00:00:00:09"));\r
-        ethernetBuilder.setEthernetDestination(ethDstBuilder.build());\r
-        builder.setEthernetMatch(ethernetBuilder.build());\r
-        VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();\r
-        VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();\r
-        vlanIdBuilder.setVlanId(new VlanId(0));\r
-        vlanIdBuilder.setVlanIdPresent(true);\r
-        vlanBuilder.setVlanId(vlanIdBuilder.build());\r
-        builder.setVlanMatch(vlanBuilder.build());\r
-        ProtocolMatchFieldsBuilder protoBuilder = new ProtocolMatchFieldsBuilder();\r
-        PbbBuilder pbbBuilder = new PbbBuilder();\r
-        pbbBuilder.setPbbIsid(20L);\r
-        pbbBuilder.setPbbMask(8L);\r
-        protoBuilder.setPbb(pbbBuilder.build());\r
-        builder.setProtocolMatchFields(protoBuilder.build());\r
-        TunnelBuilder tunnelBuilder = new TunnelBuilder();\r
-        tunnelBuilder.setTunnelId(new BigInteger("21"));\r
-        tunnelBuilder.setTunnelMask(new BigInteger("14"));\r
-        builder.setTunnel(tunnelBuilder.build());\r
-        Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();\r
-        ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("10.0.0.0/24"));\r
-        ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("10.0.0.0/8"));\r
-        builder.setLayer3Match(ipv4MatchBuilder.build());\r
-        Match match = builder.build();\r
-\r
-        List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
-        Assert.assertEquals("Wrong entries size", 8, entries.size());\r
-        MatchEntry entry = entries.get(0);\r
-        checkEntryHeader(entry, Metadata.class, true);\r
-        Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},\r
-                ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMetadata());\r
-        Assert.assertArrayEquals("Wrong metadata mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 15},\r
-                ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMask());\r
-        entry = entries.get(1);\r
-        checkEntryHeader(entry, EthDst.class, true);\r
-        Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:06"),\r
-                ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMacAddress());\r
-        Assert.assertArrayEquals("Wrong eth dst mask", new byte[]{0, 0, 0, 0, 0, 9},\r
-                ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMask());\r
-        entry = entries.get(2);\r
-        checkEntryHeader(entry, EthSrc.class, true);\r
-        Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:05"),\r
-                ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMacAddress());\r
-        Assert.assertArrayEquals("Wrong eth src mask", new byte[]{0, 0, 0, 0, 0, 8},\r
-                ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMask());\r
-        entry = entries.get(3);\r
-        checkEntryHeader(entry, VlanVid.class, true);\r
-        Assert.assertEquals("Wrong vlan id", 0, ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid()\r
-                .getVlanVid().intValue());\r
-        Assert.assertEquals("Wrong cfi bit", true, ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid()\r
-                .isCfiBit());\r
-        Assert.assertArrayEquals("Wrong vlanId mask", new byte[]{16, 0},\r
-                ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid().getMask());\r
-        entry = entries.get(4);\r
-        checkEntryHeader(entry, Ipv4Src.class, true);\r
-        Assert.assertEquals("Wrong ipv4 src", "10.0.0.0", ((Ipv4SrcCase) entry.getMatchEntryValue())\r
-                .getIpv4Src().getIpv4Address().getValue());\r
-        Assert.assertArrayEquals("Wrong ipv4 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, 0},\r
-                ((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getMask());\r
-        entry = entries.get(5);\r
-        checkEntryHeader(entry, Ipv4Dst.class, true);\r
-        Assert.assertEquals("Wrong ipv4 dst", "10.0.0.0", ((Ipv4DstCase) entry.getMatchEntryValue())\r
-                .getIpv4Dst().getIpv4Address().getValue());\r
-        Assert.assertArrayEquals("Wrong ipv4 dst mask", new byte[]{(byte) 255, 0, 0, 0},\r
-                ((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getMask());\r
-        entry = entries.get(6);\r
-        checkEntryHeader(entry, PbbIsid.class, true);\r
-        Assert.assertEquals("Wrong pbb isid", 20, ((PbbIsidCase) entry.getMatchEntryValue())\r
-                .getPbbIsid().getIsid().intValue());\r
-        Assert.assertArrayEquals("Wrong pbb isid mask", new byte[]{0, 0, 8},\r
-                ((PbbIsidCase) entry.getMatchEntryValue()).getPbbIsid().getMask());\r
-        entry = entries.get(7);\r
-        checkEntryHeader(entry, TunnelId.class, true);\r
-        Assert.assertArrayEquals("Wrong tunnel id", new byte[]{0, 0, 0, 0, 0, 0, 0, 21},\r
-                ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getTunnelId());\r
-        Assert.assertArrayEquals("Wrong tunnel id mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 14},\r
-                ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getMask());\r
-    }\r
-\r
-    @Test\r
-    public void testIpv6MatchArbitraryBitMask(){\r
-        MatchBuilder builder = new MatchBuilder();\r
-        Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder= new Ipv6MatchArbitraryBitMaskBuilder();\r
-        ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceAddressNoMask(new Ipv6Address("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0"));\r
-        ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceArbitraryBitmask(new Ipv6ArbitraryMask("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:A555"));\r
-        ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationAddressNoMask(new Ipv6Address("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0"));\r
-        ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationArbitraryBitmask(new Ipv6ArbitraryMask("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:A555"));\r
-        builder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());\r
-        Match match = builder.build();\r
-\r
-        List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
-        Assert.assertEquals("Wrong entries size", 2, entries.size());\r
-\r
-        MatchEntry entry = entries.get(0);\r
-        checkEntryHeader(entry,Ipv6Src.class,true);\r
-        Assert.assertEquals("wrong Ipv6Adress source", "fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0",((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());\r
-        entry = entries.get(1);\r
-        checkEntryHeader(entry,Ipv6Dst.class,true);\r
-        Assert.assertEquals("wrong Ipv6Adress destination", "fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0",((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());\r
-    }\r
-}\r
+/*
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
+
+import java.math.BigInteger;
+import java.util.List;
+import java.util.Optional;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.openflowplugin.api.OFConstants;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6FlowLabel;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6ExtHeaderBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6LabelBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpOp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSha;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSpa;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTha;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTpa;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthSrc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Code;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Type;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Code;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Type;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPhyPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpDscp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpEcn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpProto;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Dst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Src;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Dst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Exthdr;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Flabel;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdSll;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTarget;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTll;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Src;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsBos;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsLabel;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsTc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PbbIsid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpSrc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpSrc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TunnelId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpSrc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanVid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpOpCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpShaCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpSpaCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpThaCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpTpaCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpDscpCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6ExthdrCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6FlabelCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdSllCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTargetCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTllCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6SrcCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpDstCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpSrcCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpDstCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpSrcCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpDstCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpSrcCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanPcpCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCase;
+
+/**
+ * @author michal.polkorab
+ */
+public class MatchConvertorTest {
+
+    private ConvertorManager converterManager;
+
+    /**
+     * Initializes OpenflowPortsUtil
+     */
+    @Before
+    public void startUp() {
+        converterManager = ConvertorManagerFactory.createDefaultManager();
+    }
+
+    @Test
+    public void testConversion() {
+        MatchBuilder builder = new MatchBuilder();
+        builder.setInPort(new NodeConnectorId("openflow:42:1"));
+        builder.setInPhyPort(new NodeConnectorId("openflow:42:2"));
+        MetadataBuilder metadataBuilder = new MetadataBuilder();
+        metadataBuilder.setMetadata(new BigInteger("3"));
+        builder.setMetadata(metadataBuilder.build());
+        EthernetMatchBuilder ethernetBuilder = new EthernetMatchBuilder();
+        EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+        ethTypeBuilder.setType(new EtherType(4L));
+        ethernetBuilder.setEthernetType(ethTypeBuilder.build());
+        EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder();
+        ethSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
+        ethernetBuilder.setEthernetSource(ethSrcBuilder.build());
+        EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder();
+        ethDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
+        ethernetBuilder.setEthernetDestination(ethDstBuilder.build());
+        builder.setEthernetMatch(ethernetBuilder.build());
+        VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();
+        VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();
+        vlanIdBuilder.setVlanId(new VlanId(7));
+        vlanIdBuilder.setVlanIdPresent(true);
+        vlanBuilder.setVlanId(vlanIdBuilder.build());
+        vlanBuilder.setVlanPcp(new VlanPcp((short) 7));
+        builder.setVlanMatch(vlanBuilder.build());
+        IpMatchBuilder ipMatchBuilder = new IpMatchBuilder();
+        ipMatchBuilder.setIpDscp(new Dscp((short) 8));
+        ipMatchBuilder.setIpEcn((short) 9);
+        ipMatchBuilder.setIpProtocol((short) 10);
+        builder.setIpMatch(ipMatchBuilder.build());
+        TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();
+        tcpMatchBuilder.setTcpSourcePort(new PortNumber(11));
+        tcpMatchBuilder.setTcpDestinationPort(new PortNumber(12));
+        builder.setLayer4Match(tcpMatchBuilder.build());
+        Icmpv4MatchBuilder icmpv4Builder = new Icmpv4MatchBuilder();
+        icmpv4Builder.setIcmpv4Type((short) 13);
+        icmpv4Builder.setIcmpv4Code((short) 14);
+        builder.setIcmpv4Match(icmpv4Builder.build());
+        Icmpv6MatchBuilder icmpv6Builder = new Icmpv6MatchBuilder();
+        icmpv6Builder.setIcmpv6Type((short) 15);
+        icmpv6Builder.setIcmpv6Code((short) 16);
+        builder.setIcmpv6Match(icmpv6Builder.build());
+        ProtocolMatchFieldsBuilder protoBuilder = new ProtocolMatchFieldsBuilder();
+        protoBuilder.setMplsLabel(17L);
+        protoBuilder.setMplsTc((short) 18);
+        protoBuilder.setMplsBos((short) 19);
+        PbbBuilder pbbBuilder = new PbbBuilder();
+        pbbBuilder.setPbbIsid(20L);
+        protoBuilder.setPbb(pbbBuilder.build());
+        builder.setProtocolMatchFields(protoBuilder.build());
+        TunnelBuilder tunnelBuilder = new TunnelBuilder();
+        tunnelBuilder.setTunnelId(new BigInteger("21"));
+        builder.setTunnel(tunnelBuilder.build());
+        Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();
+        ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("10.0.0.1/32"));
+        ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("10.0.0.2/32"));
+        builder.setLayer3Match(ipv4MatchBuilder.build());
+        Match match = builder.build();
+
+        Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+        List<MatchEntry> entries = entriesOptional.get();
+        Assert.assertEquals("Wrong entries size", 24, entries.size());
+        MatchEntry entry = entries.get(0);
+        checkEntryHeader(entry, InPort.class, false);
+        Assert.assertEquals("Wrong in port", 1, ((InPortCase) entry.getMatchEntryValue()).getInPort()
+                .getPortNumber().getValue().intValue());
+
+        entry = entries.get(1);
+        checkEntryHeader(entry, InPhyPort.class, false);
+        Assert.assertEquals("Wrong in phy port", 2, ((InPhyPortCase) entry.getMatchEntryValue()).
+                getInPhyPort().getPortNumber().getValue().intValue());
+
+        entry = entries.get(2);
+        checkEntryHeader(entry, Metadata.class, false);
+        Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},
+                ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMetadata());
+        entry = entries.get(3);
+        checkEntryHeader(entry, EthDst.class, false);
+        Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:06"),
+                ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMacAddress());
+        entry = entries.get(4);
+        checkEntryHeader(entry, EthSrc.class, false);
+        Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:05"),
+                ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMacAddress());
+        entry = entries.get(5);
+        checkEntryHeader(entry, EthType.class, false);
+        Assert.assertEquals("Wrong eth type", 4, ((EthTypeCase) entry.getMatchEntryValue())
+                .getEthType().getEthType().getValue().intValue());
+        entry = entries.get(6);
+        checkEntryHeader(entry, VlanVid.class, false);
+        Assert.assertEquals("Wrong vlan id", 7, ((VlanVidCase) entry.getMatchEntryValue())
+                .getVlanVid().getVlanVid().intValue());
+        Assert.assertEquals("Wrong cfi bit", true, ((VlanVidCase) entry.getMatchEntryValue())
+                .getVlanVid().isCfiBit());
+        entry = entries.get(7);
+        checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanPcp.class, false);
+        Assert.assertEquals("Wrong vlan pcp", 7, ((VlanPcpCase) entry.getMatchEntryValue())
+                .getVlanPcp().getVlanPcp().intValue());
+        entry = entries.get(8);
+        checkEntryHeader(entry, IpDscp.class, false);
+        Assert.assertEquals("Wrong ip dscp", 8, ((IpDscpCase) entry.getMatchEntryValue())
+                .getIpDscp().getDscp().getValue().intValue());
+        entry = entries.get(9);
+        checkEntryHeader(entry, IpEcn.class, false);
+        Assert.assertEquals("Wrong ip ecn", 9, ((IpEcnCase) entry.getMatchEntryValue())
+                .getIpEcn().getEcn().intValue());
+        entry = entries.get(10);
+        checkEntryHeader(entry, IpProto.class, false);
+        Assert.assertEquals("Wrong ip proto", 10, ((IpProtoCase) entry.getMatchEntryValue())
+                .getIpProto().getProtocolNumber().intValue());
+        entry = entries.get(11);
+        checkEntryHeader(entry, TcpSrc.class, false);
+        Assert.assertEquals("Wrong tcp src", 11, ((TcpSrcCase) entry.getMatchEntryValue())
+                .getTcpSrc().getPort().getValue().intValue());
+        entry = entries.get(12);
+        checkEntryHeader(entry, TcpDst.class, false);
+        Assert.assertEquals("Wrong tcp dst", 12, ((TcpDstCase) entry.getMatchEntryValue())
+                .getTcpDst().getPort().getValue().intValue());
+        entry = entries.get(13);
+        checkEntryHeader(entry, Icmpv4Type.class, false);
+        Assert.assertEquals("Wrong icmpv4 type", 13, ((Icmpv4TypeCase) entry.getMatchEntryValue())
+                .getIcmpv4Type().getIcmpv4Type().intValue());
+        entry = entries.get(14);
+        checkEntryHeader(entry, Icmpv4Code.class, false);
+        Assert.assertEquals("Wrong icmpv4 code", 14, ((Icmpv4CodeCase) entry.getMatchEntryValue())
+                .getIcmpv4Code().getIcmpv4Code().intValue());
+        entry = entries.get(15);
+        checkEntryHeader(entry, Icmpv6Type.class, false);
+        Assert.assertEquals("Wrong icmpv6 type", 15, ((Icmpv6TypeCase) entry.getMatchEntryValue())
+                .getIcmpv6Type().getIcmpv6Type().intValue());
+        entry = entries.get(16);
+        checkEntryHeader(entry, Icmpv6Code.class, false);
+        Assert.assertEquals("Wrong icmpv6 code", 16, ((Icmpv6CodeCase) entry.getMatchEntryValue())
+                .getIcmpv6Code().getIcmpv6Code().intValue());
+        entry = entries.get(17);
+        checkEntryHeader(entry, Ipv4Src.class, false);
+        Assert.assertEquals("Wrong ipv4 src", "10.0.0.1", ((Ipv4SrcCase) entry.getMatchEntryValue())
+                .getIpv4Src().getIpv4Address().getValue());
+        entry = entries.get(18);
+        checkEntryHeader(entry, Ipv4Dst.class, false);
+        Assert.assertEquals("Wrong ipv4 dst", "10.0.0.2", ((Ipv4DstCase) entry.getMatchEntryValue())
+                .getIpv4Dst().getIpv4Address().getValue());
+        entry = entries.get(19);
+        checkEntryHeader(entry, MplsLabel.class, false);
+        Assert.assertEquals("Wrong mpls label", 17, ((MplsLabelCase) entry.getMatchEntryValue())
+                .getMplsLabel().getMplsLabel().intValue());
+        entry = entries.get(20);
+        checkEntryHeader(entry, MplsBos.class, false);
+        Assert.assertEquals("Wrong mpls bos", true, ((MplsBosCase) entry.getMatchEntryValue()).getMplsBos().isBos());
+        entry = entries.get(21);
+        checkEntryHeader(entry, MplsTc.class, false);
+        Assert.assertEquals("Wrong mpls tc", 18, ((MplsTcCase) entry.getMatchEntryValue())
+                .getMplsTc().getTc().intValue());
+        entry = entries.get(22);
+        checkEntryHeader(entry, PbbIsid.class, false);
+        Assert.assertEquals("Wrong pbb isid", 20, ((PbbIsidCase) entry.getMatchEntryValue())
+                .getPbbIsid().getIsid().intValue());
+        entry = entries.get(23);
+        checkEntryHeader(entry, TunnelId.class, false);
+        Assert.assertArrayEquals("Wrong tunnel id", new byte[]{0, 0, 0, 0, 0, 0, 0, 21},
+                ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getTunnelId());
+    }
+
+    private static void checkEntryHeader(MatchEntry entry, Class<? extends MatchField> field, boolean hasMask) {
+        Assert.assertEquals("Wrong oxm class", OpenflowBasicClass.class, entry.getOxmClass());
+        Assert.assertEquals("Wrong oxm field", field, entry.getOxmMatchField());
+        Assert.assertEquals("Wrong hasMask", hasMask, entry.isHasMask());
+    }
+
+    @Test
+    public void testIpv4MatchArbitraryBitMaskwithNoMask(){
+        MatchBuilder builder = new MatchBuilder();
+        Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder= new Ipv4MatchArbitraryBitMaskBuilder();
+        ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask( new Ipv4Address("10.2.2.2"));
+        ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask( new Ipv4Address("10.1.1.1"));
+        builder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
+        Match match = builder.build();
+
+        Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+        List<MatchEntry> entries = entriesOptional.get();
+        Assert.assertEquals("Wrong entries size", 2, entries.size());
+
+        MatchEntry entry = entries.get(0);
+        checkEntryHeader(entry,Ipv4Src.class,false);
+        Assert.assertEquals("wrong Ipv4Address source", "10.2.2.2",((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getIpv4Address().getValue());
+        entry = entries.get(1);
+        checkEntryHeader(entry,Ipv4Dst.class,false);
+        Assert.assertEquals("wrong Ipv4Address destination", "10.1.1.1",((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getIpv4Address().getValue());
+    }
+
+    @Test
+    public void testIpv4MatchArbitraryBitMaskwithMask(){
+        MatchBuilder builder = new MatchBuilder();
+        Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder= new Ipv4MatchArbitraryBitMaskBuilder();
+        ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask( new Ipv4Address("10.2.2.2"));
+        ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceArbitraryBitmask(new DottedQuad("0.0.255.0"));
+        ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask( new Ipv4Address("10.1.1.1"));
+        ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationArbitraryBitmask(new DottedQuad("0.240.0.0"));
+        builder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
+        Match match = builder.build();
+
+        Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+        List<MatchEntry> entries = entriesOptional.get();
+        Assert.assertEquals("Wrong entries size", 2, entries.size());
+
+        MatchEntry entry = entries.get(0);
+        checkEntryHeader(entry,Ipv4Src.class,true);
+        Assert.assertEquals("wrong Ipv4Address source", "10.2.2.2",((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getIpv4Address().getValue());
+        entry = entries.get(1);
+        checkEntryHeader(entry,Ipv4Dst.class,true);
+        Assert.assertEquals("wrong Ipv4Adress destination", "10.1.1.1",((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getIpv4Address().getValue());
+    }
+
+    @Test
+    public void testUdpMatchConversion() {
+        MatchBuilder builder = new MatchBuilder();
+        UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();
+        udpMatchBuilder.setUdpSourcePort(new PortNumber(11));
+        udpMatchBuilder.setUdpDestinationPort(new PortNumber(12));
+        builder.setLayer4Match(udpMatchBuilder.build());
+        Match match = builder.build();
+
+        Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+        List<MatchEntry> entries = entriesOptional.get();
+        Assert.assertEquals("Wrong entries size", 2, entries.size());
+        MatchEntry entry = entries.get(0);
+        checkEntryHeader(entry, UdpSrc.class, false);
+        Assert.assertEquals("Wrong udp src", 11, ((UdpSrcCase) entry.getMatchEntryValue()).getUdpSrc()
+                .getPort().getValue().intValue());
+        entry = entries.get(1);
+        checkEntryHeader(entry, UdpDst.class, false);
+        Assert.assertEquals("Wrong udp dst", 12, ((UdpDstCase) entry.getMatchEntryValue())
+                .getUdpDst().getPort().getValue().intValue());
+    }
+
+    @Test
+    public void testTunnelIpv4MatchConversion() {
+        MatchBuilder builder = new MatchBuilder();
+        TunnelIpv4MatchBuilder tunnelIpv4MatchBuilder = new TunnelIpv4MatchBuilder();
+        tunnelIpv4MatchBuilder.setTunnelIpv4Source(new Ipv4Prefix("10.0.0.1/32"));
+        tunnelIpv4MatchBuilder.setTunnelIpv4Destination(new Ipv4Prefix("10.0.0.2/32"));
+        builder.setLayer3Match(tunnelIpv4MatchBuilder.build());
+        Match match = builder.build();
+
+        Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+        List<MatchEntry> entries = entriesOptional.get();
+        Assert.assertEquals("Wrong entries size", 2, entries.size());
+        MatchEntry entry = entries.get(0);
+        checkEntryHeader(entry, Ipv4Src.class, false);
+        Assert.assertEquals("Wrong ipv4 tunnel src", "10.0.0.1", ((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src()
+                .getIpv4Address().getValue());
+        entry = entries.get(1);
+        checkEntryHeader(entry, Ipv4Dst.class, false);
+        Assert.assertEquals("Wrong ipv4 tunnel dst", "10.0.0.2", ((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst()
+                .getIpv4Address().getValue());
+    }
+
+    @Test
+    public void testSctpMatchConversion() {
+        MatchBuilder builder = new MatchBuilder();
+        SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();
+        sctpMatchBuilder.setSctpSourcePort(new PortNumber(11));
+        sctpMatchBuilder.setSctpDestinationPort(new PortNumber(12));
+        builder.setLayer4Match(sctpMatchBuilder.build());
+        Match match = builder.build();
+
+        Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+        List<MatchEntry> entries = entriesOptional.get();
+        Assert.assertEquals("Wrong entries size", 2, entries.size());
+        MatchEntry entry = entries.get(0);
+        checkEntryHeader(entry, SctpSrc.class, false);
+        Assert.assertEquals("Wrong sctp src", 11, ((SctpSrcCase) entry.getMatchEntryValue()).getSctpSrc()
+                .getPort().getValue().intValue());
+        entry = entries.get(1);
+        checkEntryHeader(entry, SctpDst.class, false);
+        Assert.assertEquals("Wrong sctp dst", 12, ((SctpDstCase) entry.getMatchEntryValue())
+                .getSctpDst().getPort().getValue().intValue());
+    }
+
+    @Test
+    public void testArpMatchConversion() {
+        MatchBuilder builder = new MatchBuilder();
+        ArpMatchBuilder arpBuilder = new ArpMatchBuilder();
+        arpBuilder.setArpOp(5);
+        arpBuilder.setArpSourceTransportAddress(new Ipv4Prefix("10.0.0.3/32"));
+        arpBuilder.setArpTargetTransportAddress(new Ipv4Prefix("10.0.0.4/32"));
+        ArpSourceHardwareAddressBuilder srcHwBuilder = new ArpSourceHardwareAddressBuilder();
+        srcHwBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
+        arpBuilder.setArpSourceHardwareAddress(srcHwBuilder.build());
+        ArpTargetHardwareAddressBuilder dstHwBuilder = new ArpTargetHardwareAddressBuilder();
+        dstHwBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
+        arpBuilder.setArpTargetHardwareAddress(dstHwBuilder.build());
+        builder.setLayer3Match(arpBuilder.build());
+        Match match = builder.build();
+
+        Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+        List<MatchEntry> entries = entriesOptional.get();
+        Assert.assertEquals("Wrong entries size", 5, entries.size());
+        MatchEntry entry = entries.get(0);
+        checkEntryHeader(entry, ArpOp.class, false);
+        Assert.assertEquals("Wrong arp op", 5, ((ArpOpCase) entry.getMatchEntryValue())
+                .getArpOp().getOpCode().intValue());
+        entry = entries.get(1);
+        checkEntryHeader(entry, ArpSpa.class, false);
+        Assert.assertEquals("Wrong arp spa", "10.0.0.3", ((ArpSpaCase) entry.getMatchEntryValue())
+                .getArpSpa().getIpv4Address().getValue());
+        entry = entries.get(2);
+        checkEntryHeader(entry, ArpTpa.class, false);
+        Assert.assertEquals("Wrong arp tpa", "10.0.0.4", ((ArpTpaCase) entry.getMatchEntryValue())
+                .getArpTpa().getIpv4Address().getValue());
+        entry = entries.get(3);
+        checkEntryHeader(entry, ArpSha.class, false);
+        Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:05", ((ArpShaCase) entry.getMatchEntryValue())
+                .getArpSha().getMacAddress().getValue());
+        entry = entries.get(4);
+        checkEntryHeader(entry, ArpTha.class, false);
+        Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:06", ((ArpThaCase) entry.getMatchEntryValue())
+                .getArpTha().getMacAddress().getValue());
+    }
+
+    @Test
+    public void testArpMatchConversionWithMasks() {
+        MatchBuilder builder = new MatchBuilder();
+        ArpMatchBuilder arpBuilder = new ArpMatchBuilder();
+        /* Use canonnical prefixes !!! */
+        arpBuilder.setArpSourceTransportAddress(new Ipv4Prefix("10.0.0.0/8"));
+        arpBuilder.setArpTargetTransportAddress(new Ipv4Prefix("10.0.0.4/31"));
+        ArpSourceHardwareAddressBuilder srcHwBuilder = new ArpSourceHardwareAddressBuilder();
+        srcHwBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
+        srcHwBuilder.setMask(new MacAddress("00:00:00:00:00:08"));
+        arpBuilder.setArpSourceHardwareAddress(srcHwBuilder.build());
+        ArpTargetHardwareAddressBuilder dstHwBuilder = new ArpTargetHardwareAddressBuilder();
+        dstHwBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
+        dstHwBuilder.setMask(new MacAddress("00:00:00:00:00:09"));
+        arpBuilder.setArpTargetHardwareAddress(dstHwBuilder.build());
+        builder.setLayer3Match(arpBuilder.build());
+        Match match = builder.build();
+
+        Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+        List<MatchEntry> entries = entriesOptional.get();
+        Assert.assertEquals("Wrong entries size", 4, entries.size());
+        MatchEntry entry = entries.get(0);
+        entry = entries.get(0);
+        checkEntryHeader(entry, ArpSpa.class, true);
+        Assert.assertEquals("Wrong arp spa", "10.0.0.0", ((ArpSpaCase) entry.getMatchEntryValue())
+                .getArpSpa().getIpv4Address().getValue());
+        Assert.assertArrayEquals("Wrong arp spa mask", new byte[]{(byte) 255, 0, 0, 0},
+                ((ArpSpaCase) entry.getMatchEntryValue()).getArpSpa().getMask());
+        entry = entries.get(1);
+        checkEntryHeader(entry, ArpTpa.class, true);
+        Assert.assertEquals("Wrong arp tpa", "10.0.0.4", ((ArpTpaCase) entry.getMatchEntryValue()).getArpTpa()
+                .getIpv4Address().getValue());
+        Assert.assertArrayEquals("Wrong arp tpa mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 254},
+                ((ArpTpaCase) entry.getMatchEntryValue()).getArpTpa().getMask());
+        entry = entries.get(2);
+        checkEntryHeader(entry, ArpSha.class, true);
+        Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:05", ((ArpShaCase) entry.getMatchEntryValue())
+                .getArpSha().getMacAddress().getValue());
+        Assert.assertArrayEquals("Wrong arp sha mask", new byte[]{0, 0, 0, 0, 0, 8},
+                ((ArpShaCase) entry.getMatchEntryValue()).getArpSha().getMask());
+        entry = entries.get(3);
+        checkEntryHeader(entry, ArpTha.class, true);
+        Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:06", ((ArpThaCase) entry.getMatchEntryValue()).getArpTha()
+                .getMacAddress().getValue());
+        Assert.assertArrayEquals("Wrong arp tha mask", new byte[]{0, 0, 0, 0, 0, 9},
+                ((ArpThaCase) entry.getMatchEntryValue()).getArpTha().getMask());
+    }
+
+    @Test
+    public void testIpv6MatchConversion() {
+        MatchBuilder builder = new MatchBuilder();
+        Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();
+        ipv6Builder.setIpv6Source(new Ipv6Prefix("::1/128"));
+        ipv6Builder.setIpv6Destination(new Ipv6Prefix("::2/128"));
+        Ipv6LabelBuilder ipv6LabelBuilder = new Ipv6LabelBuilder();
+        ipv6LabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(3L));
+        ipv6Builder.setIpv6Label(ipv6LabelBuilder.build());
+        ipv6Builder.setIpv6NdTarget(new Ipv6Address("::4"));
+        ipv6Builder.setIpv6NdSll(new MacAddress("00:00:00:00:00:05"));
+        ipv6Builder.setIpv6NdTll(new MacAddress("00:00:00:00:00:06"));
+        Ipv6ExtHeaderBuilder extHdrBuilder = new Ipv6ExtHeaderBuilder();
+        extHdrBuilder.setIpv6Exthdr(153);
+        ipv6Builder.setIpv6ExtHeader(extHdrBuilder.build());
+        builder.setLayer3Match(ipv6Builder.build());
+        Match match = builder.build();
+
+        Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+        List<MatchEntry> entries = entriesOptional.get();
+        Assert.assertEquals("Wrong entries size", 7, entries.size());
+        MatchEntry entry = entries.get(0);
+        /* Due to conversion ambiguities, we always get "has mask" because
+         * an ip with no mask and prefix with /128 (or 32 in v4) cannot
+         * be distinguished */
+        checkEntryHeader(entry, Ipv6Src.class, true);
+        Assert.assertEquals("Wrong ipv6 src", "::1",
+                ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());
+        entry = entries.get(1);
+        checkEntryHeader(entry, Ipv6Dst.class, true);
+        Assert.assertEquals("Wrong ipv6 dst", "::2",
+                ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());
+        entry = entries.get(2);
+        checkEntryHeader(entry, Ipv6Flabel.class, false);
+        Assert.assertEquals("Wrong ipv6 flabel", 3,
+                ((Ipv6FlabelCase) entry.getMatchEntryValue()).getIpv6Flabel().getIpv6Flabel().getValue().intValue());
+        entry = entries.get(3);
+        checkEntryHeader(entry, Ipv6NdTarget.class, false);
+        Assert.assertEquals("Wrong ipv6 nd target", "::4",
+                ((Ipv6NdTargetCase) entry.getMatchEntryValue()).getIpv6NdTarget().getIpv6Address().getValue());
+        entry = entries.get(4);
+        checkEntryHeader(entry, Ipv6NdSll.class, false);
+        Assert.assertEquals("Wrong ipv6 nd sll", "00:00:00:00:00:05",
+                ((Ipv6NdSllCase) entry.getMatchEntryValue()).getIpv6NdSll().getMacAddress().getValue());
+        entry = entries.get(5);
+        checkEntryHeader(entry, Ipv6NdTll.class, false);
+        Assert.assertEquals("Wrong ipv6 nd tll", "00:00:00:00:00:06",
+                ((Ipv6NdTllCase) entry.getMatchEntryValue()).getIpv6NdTll().getMacAddress().getValue());
+        entry = entries.get(6);
+        checkEntryHeader(entry, Ipv6Exthdr.class, false);
+        Assert.assertEquals("Wrong ipv6 ext hdr", new Ipv6ExthdrFlags(false, true, false, true, false,
+                true, false, true, false), ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getPseudoField());
+    }
+
+    @Test
+    public void testIpv6MatchConversionWithMasks() {
+        MatchBuilder builder = new MatchBuilder();
+        Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();
+        ipv6Builder.setIpv6Source(new Ipv6Prefix("::/24"));
+        ipv6Builder.setIpv6Destination(new Ipv6Prefix("::/64"));
+        builder.setLayer3Match(ipv6Builder.build());
+        Match match = builder.build();
+
+        Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+        List<MatchEntry> entries = entriesOptional.get();
+        Assert.assertEquals("Wrong entries size", 2, entries.size());
+        MatchEntry entry = entries.get(0);
+        checkEntryHeader(entry, Ipv6Src.class, true);
+        Assert.assertEquals("Wrong ipv6 src", "::",
+                ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());
+        Assert.assertArrayEquals("Wrong ipv6 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0}, ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getMask());
+        entry = entries.get(1);
+        checkEntryHeader(entry, Ipv6Dst.class, true);
+        Assert.assertEquals("Wrong ipv6 dst", "::",
+                ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());
+        Assert.assertArrayEquals("Wrong ipv6 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 255,
+                        (byte) 255, (byte) 255, (byte) 255, (byte) 255, 0, 0, 0, 0, 0, 0, 0, 0},
+                ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getMask());
+    }
+
+    @Test
+    public void testIpv6ExtHeaderConversion() {
+        MatchBuilder builder = new MatchBuilder();
+        Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();
+        Ipv6ExtHeaderBuilder extHdrBuilder = new Ipv6ExtHeaderBuilder();
+        extHdrBuilder.setIpv6Exthdr(358);
+        extHdrBuilder.setIpv6ExthdrMask(258);
+        ipv6Builder.setIpv6ExtHeader(extHdrBuilder.build());
+        builder.setLayer3Match(ipv6Builder.build());
+        Match match = builder.build();
+
+        Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+        List<MatchEntry> entries = entriesOptional.get();
+        Assert.assertEquals("Wrong entries size", 1, entries.size());
+        MatchEntry entry = entries.get(0);
+        checkEntryHeader(entry, Ipv6Exthdr.class, true);
+        Assert.assertEquals("Wrong ipv6 ext hdr", new Ipv6ExthdrFlags(true, false, true, false, true, false,
+                true, false, true), ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getPseudoField());
+        Assert.assertArrayEquals("Wrong ipv6 ext hdr mask", new byte[]{1, 2},
+                ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getMask());
+    }
+
+    @Test
+    public void testConversionWithMasks() {
+        MatchBuilder builder = new MatchBuilder();
+        MetadataBuilder metadataBuilder = new MetadataBuilder();
+        metadataBuilder.setMetadata(new BigInteger("3"));
+        metadataBuilder.setMetadataMask(new BigInteger("15"));
+        builder.setMetadata(metadataBuilder.build());
+        EthernetMatchBuilder ethernetBuilder = new EthernetMatchBuilder();
+        EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder();
+        ethSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
+        ethSrcBuilder.setMask(new MacAddress("00:00:00:00:00:08"));
+        ethernetBuilder.setEthernetSource(ethSrcBuilder.build());
+        EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder();
+        ethDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
+        ethDstBuilder.setMask(new MacAddress("00:00:00:00:00:09"));
+        ethernetBuilder.setEthernetDestination(ethDstBuilder.build());
+        builder.setEthernetMatch(ethernetBuilder.build());
+        VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();
+        VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();
+        vlanIdBuilder.setVlanId(new VlanId(0));
+        vlanIdBuilder.setVlanIdPresent(true);
+        vlanBuilder.setVlanId(vlanIdBuilder.build());
+        builder.setVlanMatch(vlanBuilder.build());
+        ProtocolMatchFieldsBuilder protoBuilder = new ProtocolMatchFieldsBuilder();
+        PbbBuilder pbbBuilder = new PbbBuilder();
+        pbbBuilder.setPbbIsid(20L);
+        pbbBuilder.setPbbMask(8L);
+        protoBuilder.setPbb(pbbBuilder.build());
+        builder.setProtocolMatchFields(protoBuilder.build());
+        TunnelBuilder tunnelBuilder = new TunnelBuilder();
+        tunnelBuilder.setTunnelId(new BigInteger("21"));
+        tunnelBuilder.setTunnelMask(new BigInteger("14"));
+        builder.setTunnel(tunnelBuilder.build());
+        Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();
+        ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("10.0.0.0/24"));
+        ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("10.0.0.0/8"));
+        builder.setLayer3Match(ipv4MatchBuilder.build());
+        Match match = builder.build();
+
+        Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+        List<MatchEntry> entries = entriesOptional.get();
+        Assert.assertEquals("Wrong entries size", 8, entries.size());
+        MatchEntry entry = entries.get(0);
+        checkEntryHeader(entry, Metadata.class, true);
+        Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},
+                ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMetadata());
+        Assert.assertArrayEquals("Wrong metadata mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 15},
+                ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMask());
+        entry = entries.get(1);
+        checkEntryHeader(entry, EthDst.class, true);
+        Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:06"),
+                ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMacAddress());
+        Assert.assertArrayEquals("Wrong eth dst mask", new byte[]{0, 0, 0, 0, 0, 9},
+                ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMask());
+        entry = entries.get(2);
+        checkEntryHeader(entry, EthSrc.class, true);
+        Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:05"),
+                ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMacAddress());
+        Assert.assertArrayEquals("Wrong eth src mask", new byte[]{0, 0, 0, 0, 0, 8},
+                ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMask());
+        entry = entries.get(3);
+        checkEntryHeader(entry, VlanVid.class, true);
+        Assert.assertEquals("Wrong vlan id", 0, ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid()
+                .getVlanVid().intValue());
+        Assert.assertEquals("Wrong cfi bit", true, ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid()
+                .isCfiBit());
+        Assert.assertArrayEquals("Wrong vlanId mask", new byte[]{16, 0},
+                ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid().getMask());
+        entry = entries.get(4);
+        checkEntryHeader(entry, Ipv4Src.class, true);
+        Assert.assertEquals("Wrong ipv4 src", "10.0.0.0", ((Ipv4SrcCase) entry.getMatchEntryValue())
+                .getIpv4Src().getIpv4Address().getValue());
+        Assert.assertArrayEquals("Wrong ipv4 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, 0},
+                ((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getMask());
+        entry = entries.get(5);
+        checkEntryHeader(entry, Ipv4Dst.class, true);
+        Assert.assertEquals("Wrong ipv4 dst", "10.0.0.0", ((Ipv4DstCase) entry.getMatchEntryValue())
+                .getIpv4Dst().getIpv4Address().getValue());
+        Assert.assertArrayEquals("Wrong ipv4 dst mask", new byte[]{(byte) 255, 0, 0, 0},
+                ((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getMask());
+        entry = entries.get(6);
+        checkEntryHeader(entry, PbbIsid.class, true);
+        Assert.assertEquals("Wrong pbb isid", 20, ((PbbIsidCase) entry.getMatchEntryValue())
+                .getPbbIsid().getIsid().intValue());
+        Assert.assertArrayEquals("Wrong pbb isid mask", new byte[]{0, 0, 8},
+                ((PbbIsidCase) entry.getMatchEntryValue()).getPbbIsid().getMask());
+        entry = entries.get(7);
+        checkEntryHeader(entry, TunnelId.class, true);
+        Assert.assertArrayEquals("Wrong tunnel id", new byte[]{0, 0, 0, 0, 0, 0, 0, 21},
+                ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getTunnelId());
+        Assert.assertArrayEquals("Wrong tunnel id mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 14},
+                ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getMask());
+    }
+
+    @Test
+    public void testIpv6MatchArbitraryBitMask(){
+        MatchBuilder builder = new MatchBuilder();
+        Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder= new Ipv6MatchArbitraryBitMaskBuilder();
+        ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceAddressNoMask(new Ipv6Address("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0"));
+        ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceArbitraryBitmask(new Ipv6ArbitraryMask("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:A555"));
+        ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationAddressNoMask(new Ipv6Address("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0"));
+        ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationArbitraryBitmask(new Ipv6ArbitraryMask("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:A555"));
+        builder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
+        Match match = builder.build();
+
+        Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+        List<MatchEntry> entries = entriesOptional.get();
+        Assert.assertEquals("Wrong entries size", 2, entries.size());
+
+        MatchEntry entry = entries.get(0);
+        checkEntryHeader(entry,Ipv6Src.class,true);
+        Assert.assertEquals("wrong Ipv6Adress source", "fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0",((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());
+        entry = entries.get(1);
+        checkEntryHeader(entry,Ipv6Dst.class,true);
+        Assert.assertEquals("wrong Ipv6Adress destination", "fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0",((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());
+    }
+}
+
@@ -11,10 +11,13 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
 import static org.junit.Assert.assertEquals;
 
 import java.math.BigInteger;
+import java.util.Optional;
 import org.junit.Before;
 import org.junit.Test;
+import org.opendaylight.openflowplugin.api.OFConstants;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpVersion;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
@@ -43,9 +46,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.matc
 /**
  * Created by Martin Bobak mbobak@cisco.com on 8/30/14.
  */
-public class MatchConvertorV10ImplTest {
+public class MatchConvertorV10Test {
 
-    private static final MatchConvertorV10Impl matchConvertorV10 = new MatchConvertorV10Impl();
+    private static final MatchV10Convertor matchConvertorV10 = new MatchV10Convertor();
     private static final BigInteger dataPathId = BigInteger.TEN;
     private static final long ETH_TYPE_802_3 = 0x0000;
     private static final MacAddress ZERO_MAC = MacAddress.getDefaultInstance("00:00:00:00:00:00");
@@ -59,19 +62,19 @@ public class MatchConvertorV10ImplTest {
     private static final VlanId DEFAULT_VLAN_ID = new VlanId(42);
     private static final Ipv4Address DEFAULT_IPV4_ADDRESS = new Ipv4Address("10.0.0.1");
     private static final short DEFAULT_MASK = 24;
-    private ConvertorManager convertorManager;
+    private ConvertorManager converterManager;
 
     @Before
     public void setup() {
-        convertorManager = ConvertorManagerFactory.createDefaultManager();
+        converterManager = ConvertorManagerFactory.createDefaultManager();
     }
 
     @Test
-    /**
-     * Test method for {@link MatchConvertorV10Impl#convert(Match,BigInteger)}
-     */
     public void testConvert() {
-        MatchV10 matchV10 = matchConvertorV10.convert(createL4UdpMatch().build(), null);
+
+        Optional<MatchV10> matchV10Optional = converterManager.convert(createL4UdpMatch().build(),
+                new VersionConvertorData(OFConstants.OFP_VERSION_1_0));
+        MatchV10 matchV10 = matchV10Optional.get();
 
         assertEquals(ZERO_MAC, matchV10.getDlDst());
         assertEquals(FF_MAC, matchV10.getDlSrc());
@@ -86,24 +89,26 @@ public class MatchConvertorV10ImplTest {
         assertEquals(DEFAULT_PORT.getValue().intValue(), matchV10.getTpSrc().intValue());
         assertEquals(DEFAULT_PORT.getValue().intValue(), matchV10.getTpDst().intValue());
 
-        matchV10 = matchConvertorV10.convert(createL4TcpMatch().build(), null);
+        matchV10Optional = converterManager.convert(createL4TcpMatch().build(),
+                new VersionConvertorData(OFConstants.OFP_VERSION_1_0));
+        matchV10 = matchV10Optional.get();
         assertEquals(DEFAULT_PORT.getValue().intValue(), matchV10.getTpSrc().intValue());
         assertEquals(DEFAULT_PORT.getValue().intValue(), matchV10.getTpDst().intValue());
 
-        matchV10 = matchConvertorV10.convert(createVlanTcpMatch().build(), null);
+        matchV10Optional = converterManager.convert(createVlanTcpMatch().build(),
+                new VersionConvertorData(OFConstants.OFP_VERSION_1_0));
+        matchV10 = matchV10Optional.get();
         assertEquals(DEFAULT_VLAN_ID.getValue().intValue(), matchV10.getDlVlan().intValue());
 
     }
 
-    /**
-     * ICMPv4 match test for
-     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactorConvertor#convert(Object, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor)}.
-     */
     @Test
     public void testConvertIcmpv4() {
         MatchBuilder matchBuilder = createMatchBuilderWithDefaults();
         Match match = matchBuilder.build();
-        MatchV10 matchV10 = matchConvertorV10.convert(match, convertorManager);
+        Optional<MatchV10> matchV10Optional = converterManager.convert(match,
+                new VersionConvertorData(OFConstants.OFP_VERSION_1_0));
+        MatchV10 matchV10 = matchV10Optional.get();
         Integer zero = 0;
         boolean wcTpSrc = true;
         boolean wcTpDst = true;
@@ -134,7 +139,9 @@ public class MatchConvertorV10ImplTest {
             wcTpDst, wcTpSrc);
         match = matchBuilder.setIcmpv4Match(icmpv4MatchBuilder.build()).
             build();
-        matchV10 = matchConvertorV10.convert(match, convertorManager);
+        matchV10Optional = converterManager.convert(match,
+                new VersionConvertorData(OFConstants.OFP_VERSION_1_0));
+        matchV10 = matchV10Optional.get();
         assertEquals(ZERO_MAC, matchV10.getDlDst());
         assertEquals(FF_MAC, matchV10.getDlSrc());
         assertEquals(0, matchV10.getDlType().intValue());
@@ -160,7 +167,9 @@ public class MatchConvertorV10ImplTest {
             wcTpDst, wcTpSrc);
         match = matchBuilder.setIcmpv4Match(icmpv4MatchBuilder.build()).
             build();
-        matchV10 = matchConvertorV10.convert(match, convertorManager);
+        matchV10Optional = converterManager.convert(match,
+                new VersionConvertorData(OFConstants.OFP_VERSION_1_0));
+        matchV10 = matchV10Optional.get();
         assertEquals(ZERO_MAC, matchV10.getDlDst());
         assertEquals(FF_MAC, matchV10.getDlSrc());
         assertEquals(0, matchV10.getDlType().intValue());
@@ -188,7 +197,9 @@ public class MatchConvertorV10ImplTest {
             wcTpDst, wcTpSrc);
         match = matchBuilder.setIcmpv4Match(icmpv4MatchBuilder.build()).
             build();
-        matchV10 = matchConvertorV10.convert(match, convertorManager);
+        matchV10Optional = converterManager.convert(match,
+                new VersionConvertorData(OFConstants.OFP_VERSION_1_0));
+        matchV10 = matchV10Optional.get();
         assertEquals(ZERO_MAC, matchV10.getDlDst());
         assertEquals(FF_MAC, matchV10.getDlSrc());
         assertEquals(0, matchV10.getDlType().intValue());
diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchReactorTest.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchReactorTest.java
deleted file mode 100644 (file)
index eba0299..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/**
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.openflowplugin.api.OFConstants;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
-
-/**
- * match conversion and injection test
- */
-public class MatchReactorTest {
-    private MatchBuilder matchBuilder;
-    private ConvertorManager convertorManager;
-
-    /**
-     * prepare input match
-     */
-    @Before
-    public void setUp() {
-        matchBuilder = new MatchBuilder();
-        EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder();
-        EthernetTypeBuilder ethernetTypeBuilder = new EthernetTypeBuilder();
-        ethernetTypeBuilder.setType(new EtherType(42L));
-        ethernetMatchBuilder.setEthernetType(ethernetTypeBuilder.build());
-        matchBuilder.setEthernetMatch(ethernetMatchBuilder.build());
-        convertorManager = ConvertorManagerFactory.createDefaultManager();
-    }
-
-    /**
-     * convert for OF-1.3, inject into {@link FlowModInputBuilder}
-     */
-    @Test
-    public void testMatchConvertorV13_flow() {
-        FlowModInputBuilder target = new FlowModInputBuilder();
-        MatchReactor.getInstance().convert(matchBuilder.build(),
-                OFConstants.OFP_VERSION_1_3, target, convertorManager);
-        Assert.assertNotNull(target.getMatch());
-    }
-
-    /**
-     * convert for OF-1.0, inject into {@link FlowModInputBuilder}
-     */
-    @Test
-    public void testMatchConvertorV10_flow() {
-        FlowModInputBuilder target = new FlowModInputBuilder();
-        MatchReactor.getInstance().convert(matchBuilder.build(),
-                OFConstants.OFP_VERSION_1_0, target, convertorManager);
-        Assert.assertNotNull(target.getMatchV10());
-    }
-
-
-    /**
-     * convert for OF-1.3, inject into {@link MultipartRequestFlowBuilder}
-     */
-    @Test
-    public void testMatchConvertorV13_mpRequestFlow() {
-        MultipartRequestFlowBuilder target = new MultipartRequestFlowBuilder();
-        MatchReactor.getInstance().convert(matchBuilder.build(),
-                OFConstants.OFP_VERSION_1_3, target, convertorManager);
-        Assert.assertNotNull(target.getMatch());
-    }
-
-    /**
-     * convert for OF-1.0, inject into {@link MultipartRequestFlowBuilder}
-     */
-    @Test
-    public void testMatchConvertorV10_mpRequestFlow() {
-        MultipartRequestFlowBuilder target = new MultipartRequestFlowBuilder();
-        MatchReactor.getInstance().convert(matchBuilder.build(),
-                OFConstants.OFP_VERSION_1_0, target, convertorManager);
-        Assert.assertNotNull(target.getMatchV10());
-    }
-
-    @Test
-    public void testMatchConvertorV10_null() {
-        MultipartRequestAggregateBuilder target = new MultipartRequestAggregateBuilder();
-        MatchReactor.getInstance().convert(null,
-                OFConstants.OFP_VERSION_1_0, target, convertorManager);
-        Assert.assertNotNull(target.getMatchV10());
-    }
-
-    /**
-     * convert for OF-1.3, inject into {@link MultipartRequestAggregateBuilder}
-     */
-    @Test
-    public void testMatchConvertorV13_mpRequestAggregate() {
-        MultipartRequestAggregateBuilder target = new MultipartRequestAggregateBuilder();
-        MatchReactor.getInstance().convert(matchBuilder.build(),
-                OFConstants.OFP_VERSION_1_3, target, convertorManager);
-        Assert.assertNotNull(target.getMatch());
-    }
-
-    @Test
-    public void testMatchConvertorV13_null() {
-        MultipartRequestAggregateBuilder target = new MultipartRequestAggregateBuilder();
-        MatchReactor.getInstance().convert(null,
-                OFConstants.OFP_VERSION_1_3, target, convertorManager);
-        Assert.assertNotNull(target.getMatch());
-        Assert.assertEquals(0, target.getMatch().getMatchEntry().size());
-    }
-
-    /**
-     * convert for OF-1.0, inject into {@link MultipartRequestAggregateBuilder}
-     */
-    @Test
-    public void testMatchConvertorV10_mpRequestAggregate() {
-        MultipartRequestAggregateBuilder target = new MultipartRequestAggregateBuilder();
-        MatchReactor.getInstance().convert(matchBuilder.build(),
-                OFConstants.OFP_VERSION_1_0, target, convertorManager);
-        Assert.assertNotNull(target.getMatchV10());
-    }
-
-
-}
\ No newline at end of file