Add MessageSerializerInjector 62/48562/10
authorTomas Slusny <tomas.slusny@pantheon.tech>
Tue, 22 Nov 2016 10:02:50 +0000 (11:02 +0100)
committerTomas Slusny <tomas.slusny@pantheon.tech>
Mon, 12 Dec 2016 14:45:01 +0000 (14:45 +0000)
Add injector where all message serializers will be registered
and call it from general SerializerInjector
Add AbstractMessageSerializer to unify all message serializers
Add unit tests for MessageSerializerInjector

See also: bug 7138

Change-Id: Ie5f0652e31316ca33b6b6fb10d84bf9972a1fed5
Signed-off-by: Tomas Slusny <tomas.slusny@pantheon.tech>
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/MessageSerializerInjector.java [new file with mode: 0644]
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/SerializerInjector.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/messages/AbstractMessageSerializer.java [new file with mode: 0644]
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/serialization/MessageSerializerInjectorTest.java [new file with mode: 0644]

diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/MessageSerializerInjector.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/MessageSerializerInjector.java
new file mode 100644 (file)
index 0000000..e018858
--- /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.serialization;
+
+import com.google.common.annotations.VisibleForTesting;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerExtensionProvider;
+import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+
+/**
+ * Util class for injecting new message serializers into OpenflowJava
+ */
+class MessageSerializerInjector {
+
+    /**
+     * Injects message serializers into provided {@link org.opendaylight.openflowjava.protocol.api.extensibility.SerializerExtensionProvider}
+     * @param provider OpenflowJava serializer extension provider
+     */
+    static void injectSerializers(final SerializerExtensionProvider provider) {
+        // Inject new message serializers here using injector created by createInjector method
+        final Function<Class<?>, Consumer<OFSerializer<? extends OfHeader>>> injector =
+                createInjector(provider, EncodeConstants.OF13_VERSION_ID);
+    }
+
+    /**
+     * Create injector that will inject new serializers into #{@link org.opendaylight.openflowjava.protocol.api.extensibility.SerializerExtensionProvider}
+     * @param provider OpenflowJava serializer extension provider
+     * @param version Openflow version
+     * @return injector
+     */
+    @VisibleForTesting
+    static Function<Class<?>, Consumer<OFSerializer<? extends OfHeader>>> createInjector(final SerializerExtensionProvider provider,
+                                                                                                 final byte version) {
+        return type -> serializer ->
+                provider.registerSerializer(
+                        new MessageTypeKey<>(version, type),
+                        serializer);
+    }
+
+}
index c897a22ba2a43e37c5a689ff43e50294b861345d..0ec19620e6e5db016fcf457825e95bddd2050b8c 100644 (file)
@@ -21,5 +21,6 @@ public class SerializerInjector {
      */
     public static void injectSerializers(final SerializerExtensionProvider provider) {
         // Inject new serializers here
+        MessageSerializerInjector.injectSerializers(provider);
     }
 }
diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/messages/AbstractMessageSerializer.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/messages/AbstractMessageSerializer.java
new file mode 100644 (file)
index 0000000..a719976
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * 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.serialization.messages;
+
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.openflowjava.protocol.api.extensibility.HeaderSerializer;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+
+public abstract class AbstractMessageSerializer<T extends OfHeader> implements OFSerializer<T>, HeaderSerializer<T> {
+
+    @Override
+    public void serialize(T message, ByteBuf outBuffer) {
+        serializeHeader(message, outBuffer);
+    }
+
+    @Override
+    public void serializeHeader(T message, ByteBuf outBuffer) {
+        ByteBufUtils.writeOFHeader(getMessageType(), message, outBuffer, EncodeConstants.EMPTY_LENGTH);
+    }
+
+    /**
+     * @return of message type
+     */
+    protected abstract byte getMessageType();
+}
diff --git a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/serialization/MessageSerializerInjectorTest.java b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/serialization/MessageSerializerInjectorTest.java
new file mode 100644 (file)
index 0000000..473e01a
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * 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.serialization;
+
+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.OFSerializer;
+import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
+import org.opendaylight.openflowplugin.api.OFConstants;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+
+@RunWith(MockitoJUnitRunner.class)
+public class MessageSerializerInjectorTest {
+    @Mock
+    private SwitchConnectionProvider switchConnectionProvider;
+
+    @Mock
+    private OFSerializer<OfHeader> ofSerializer;
+
+    private Function<Class<?>, Consumer<OFSerializer<? extends OfHeader>>> injector;
+
+    @Before
+    public void setUp() {
+        injector = MessageSerializerInjector.createInjector(switchConnectionProvider, EncodeConstants.OF13_VERSION_ID);
+    }
+
+    @Test
+    public void injectSerializers() throws Exception {
+        injector.apply(OfHeader.class).accept(ofSerializer);
+        verify(switchConnectionProvider).registerSerializer(new MessageTypeKey<>(OFConstants.OFP_VERSION_1_3, OfHeader.class), ofSerializer);
+    }
+}
\ No newline at end of file