From c9eac6b1385ba22d09cf8f8b81fcca9b8748a6b5 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Mon, 12 Dec 2016 14:48:13 +0100 Subject: [PATCH] Add MessageDeserializerInjector 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 --- .../main/yang/opendaylight-meter-types.yang | 5 ++ .../deserialization/DeserializerInjector.java | 1 + .../MessageDeserializerInjector.java | 52 +++++++++++++++++++ .../MessageDeserializerInjectorTest.java | 50 ++++++++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/MessageDeserializerInjector.java create mode 100644 openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/MessageDeserializerInjectorTest.java diff --git a/model/model-flow-base/src/main/yang/opendaylight-meter-types.yang b/model/model-flow-base/src/main/yang/opendaylight-meter-types.yang index a6c7af67ce..7845c43dfc 100644 --- a/model/model-flow-base/src/main/yang/opendaylight-meter-types.yang +++ b/model/model-flow-base/src/main/yang/opendaylight-meter-types.yang @@ -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; diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/DeserializerInjector.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/DeserializerInjector.java index cf40f1914c..9ec85acb6f 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/DeserializerInjector.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/DeserializerInjector.java @@ -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 index 0000000000..c0e0564219 --- /dev/null +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/MessageDeserializerInjector.java @@ -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, Consumer>>> 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, Consumer>>> 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 index 0000000000..1ad7eafb74 --- /dev/null +++ b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/MessageDeserializerInjectorTest.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.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 ofDeserializer; + + private Function, Consumer>>> 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 -- 2.36.6