Add MessageDeserializerInjector 48/49248/10
authorTomas Slusny <tomas.slusny@pantheon.tech>
Mon, 12 Dec 2016 13:48:13 +0000 (14:48 +0100)
committerTomas Slusny <tomas.slusny@pantheon.tech>
Wed, 15 Feb 2017 15:13:41 +0000 (16:13 +0100)
Add injector where all message deserializers will be registered and call
it from general DeserializerInjector
Add unit tests for MessageDeserializerInjector

See also: bug 7140

Change-Id: I28e2795148597a1c15cb52dec46728a4324a4d0a
Signed-off-by: Tomas Slusny <tomas.slusny@pantheon.tech>
model/model-flow-base/src/main/yang/opendaylight-meter-types.yang
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/DeserializerInjector.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/MessageDeserializerInjector.java [new file with mode: 0644]
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/MessageDeserializerInjectorTest.java [new file with mode: 0644]

index a6c7af67cebfc8eb22d2f6a894b82092dd7a5e8c..7845c43dfc44d74c99c3a1d3ec0bf36cbe78da3f 100644 (file)
@@ -103,6 +103,11 @@ module opendaylight-meter-types {
             }
             
             case experimenter {
+                leaf experimenter-type {
+                    description "Meter band type";
+                    type meter-band-type;
+                }
+
                 leaf experimenter-rate {
                     description "Rate for remarking packets";
                     type uint32;
index cf40f1914ce121414fc33889aab548fef11bd009..9ec85acb6f1bb422e08b51fb8b70b7669afb748b 100644 (file)
@@ -21,5 +21,6 @@ public class DeserializerInjector {
      */
     public static void injectDeserializers(final DeserializerExtensionProvider provider) {
         // Inject new deserializers here
+        MessageDeserializerInjector.injectDeserializers(provider);
     }
 }
diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/MessageDeserializerInjector.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/MessageDeserializerInjector.java
new file mode 100644 (file)
index 0000000..c0e0564
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2016 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.impl.protocol.deserialization;
+
+import com.google.common.annotations.VisibleForTesting;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
+import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
+import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+
+public class MessageDeserializerInjector {
+
+    /**
+     * Injects message deserializers into provided {@link org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider}
+     * @param provider OpenflowJava deserializer extension provider
+     */
+    static void injectDeserializers(final DeserializerExtensionProvider provider) {
+        // Inject new message deserializers here using injector created by createInjector method
+        final Function<Integer, Function<Class<? extends OfHeader>, Consumer<OFDeserializer<? extends OfHeader>>>> injector =
+                createInjector(provider, EncodeConstants.OF13_VERSION_ID);
+    }
+
+    /**
+     * Create injector that will inject new deserializers into #{@link org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider}
+     * @param provider OpenflowJava deserializer extension provider
+     * @param version Openflow version
+     * @return injector
+     */
+    @VisibleForTesting
+    static Function<Integer, Function<Class<? extends OfHeader>, Consumer<OFDeserializer<? extends OfHeader>>>> createInjector(
+            final DeserializerExtensionProvider provider,
+            final short version) {
+        return code -> retType -> deserializer -> {
+            provider.unregisterDeserializerMapping(new TypeToClassKey(version, code));
+            provider.registerDeserializerMapping(new TypeToClassKey(version, code), retType);
+            provider.registerDeserializer(
+                    new MessageCodeKey(version, code, retType),
+                    deserializer);
+        };
+    }
+
+}
\ No newline at end of file
diff --git a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/MessageDeserializerInjectorTest.java b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/MessageDeserializerInjectorTest.java
new file mode 100644 (file)
index 0000000..1ad7eaf
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2016 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.impl.protocol.deserialization;
+
+import static org.mockito.Mockito.verify;
+
+import java.util.function.Consumer;
+import java.util.function.Function;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
+import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
+import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+
+@RunWith(MockitoJUnitRunner.class)
+public class MessageDeserializerInjectorTest {
+    @Mock
+    private SwitchConnectionProvider switchConnectionProvider;
+
+    @Mock
+    private OFDeserializer<OfHeader> ofDeserializer;
+
+    private Function<Integer, Function<Class<? extends OfHeader>, Consumer<OFDeserializer<? extends OfHeader>>>> injector;
+
+    @Before
+    public void setUp() throws Exception {
+        injector = MessageDeserializerInjector.createInjector(switchConnectionProvider, EncodeConstants.OF13_VERSION_ID);
+    }
+
+    @Test
+    public void injectDeserializers() throws Exception {
+        injector.apply(10).apply(OfHeader.class).accept(ofDeserializer);
+        verify(switchConnectionProvider).unregisterDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 10));
+        verify(switchConnectionProvider).registerDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 10), OfHeader.class);
+        verify(switchConnectionProvider).registerDeserializer(new MessageCodeKey(EncodeConstants.OF13_VERSION_ID, 10, OfHeader.class), ofDeserializer);
+    }
+
+}
\ No newline at end of file