From 8b700adf564a29d6f21475771ca1d6b3ffb80acb Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Tue, 22 Nov 2016 11:02:50 +0100 Subject: [PATCH] Add MessageSerializerInjector 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 --- .../MessageSerializerInjector.java | 50 +++++++++++++++++++ .../serialization/SerializerInjector.java | 1 + .../messages/AbstractMessageSerializer.java | 34 +++++++++++++ .../MessageSerializerInjectorTest.java | 47 +++++++++++++++++ 4 files changed, 132 insertions(+) create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/MessageSerializerInjector.java create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/messages/AbstractMessageSerializer.java create mode 100644 openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/serialization/MessageSerializerInjectorTest.java 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 index 0000000000..e0188582f4 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/MessageSerializerInjector.java @@ -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, Consumer>> 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, Consumer>> createInjector(final SerializerExtensionProvider provider, + final byte version) { + return type -> serializer -> + provider.registerSerializer( + new MessageTypeKey<>(version, type), + serializer); + } + +} diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/SerializerInjector.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/SerializerInjector.java index c897a22ba2..0ec19620e6 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/SerializerInjector.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/SerializerInjector.java @@ -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 index 0000000000..a719976367 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/messages/AbstractMessageSerializer.java @@ -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 implements OFSerializer, HeaderSerializer { + + @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 index 0000000000..473e01a8c2 --- /dev/null +++ b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/serialization/MessageSerializerInjectorTest.java @@ -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 ofSerializer; + + private Function, Consumer>> 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 -- 2.36.6