Add methods that allows registering any serializer 51/48251/6
authorTomas Slusny <tomas.slusny@pantheon.tech>
Fri, 11 Nov 2016 10:09:47 +0000 (11:09 +0100)
committerTomas Slusny <tomas.slusny@pantheon.tech>
Thu, 8 Dec 2016 14:03:26 +0000 (14:03 +0000)
Add new methods to SwitchConnectionProviderImpl that will allow us
to register any type of OFSerializer and OFDeserializer, so we will
be able to for example register serializers for OpenflowPlugin models
directly in OpenflowPlugin, without requiring changes in
OpenflowJava.
Change HeaderSerializer and HeaderDeserializer to require DataContainer
instead of DataObject.

See also: bug 7136

Change-Id: I002cb787a6db61d864e205d99fafa54692e220a6
Signed-off-by: Tomas Slusny <tomas.slusny@pantheon.tech>
openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/extensibility/DeserializerExtensionProvider.java
openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/extensibility/HeaderDeserializer.java
openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/extensibility/HeaderSerializer.java
openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/extensibility/SerializerExtensionProvider.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/SwitchConnectionProviderImpl.java
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/core/connection/SwitchConnectionProviderImpl02Test.java

index b227453e627f982d188655cac2e66abee4b0b881..6de50c310c431f680570958f80d0cfe0bb7141cd 100644 (file)
@@ -13,6 +13,7 @@ import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterDeserializerK
 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdDeserializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterInstructionDeserializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;
@@ -33,6 +34,20 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
  */
 public interface DeserializerExtensionProvider {
 
+    /**
+     * Registers deserializer.
+     * Throws IllegalStateException when there is
+     * a deserializer already registered under given key.
+     * <p>
+     * If the deserializer implements {@link DeserializerRegistryInjector} interface,
+     * the deserializer is injected with DeserializerRegistry instance.
+     *
+     * @param key          used for deserializer lookup
+     * @param deserializer deserializer instance
+     */
+    void registerDeserializer(MessageCodeKey key,
+                              OFGeneralDeserializer deserializer);
+
     /**
      * Unregisters custom deserializer
      * @param key used for deserializer lookup
index a0fe93913dd125c6b21811903ce0caad13b8e910..c80df7b964867b5d58246337886f007be4b455f0 100644 (file)
@@ -8,13 +8,13 @@
 package org.opendaylight.openflowjava.protocol.api.extensibility;
 
 import io.netty.buffer.ByteBuf;
-import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
 
 /**
  * @author michal.polkorab
  * @param <E> output message type
  */
-public interface HeaderDeserializer<E extends DataObject> extends OFGeneralDeserializer {
+public interface HeaderDeserializer<E extends DataContainer> extends OFGeneralDeserializer {
 
     /**
      * Deserializes byte message headers
index b8b8a029779e4daf33afb062751f08f33b596ab4..427d84ce29b15291d46104d74b6d7d6bcd40841b 100644 (file)
@@ -8,14 +8,14 @@
 package org.opendaylight.openflowjava.protocol.api.extensibility;
 
 import io.netty.buffer.ByteBuf;
-import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
 
 /**
  * Does only-header serialization (such as oxm_ids, action_ids, instruction_ids)
  * @author michal.polkorab
  * @param <T> input message type
  */
-public interface HeaderSerializer<T extends DataObject> extends OFGeneralSerializer {
+public interface HeaderSerializer<T extends DataContainer> extends OFGeneralSerializer {
 
     /**
      * Serializes object headers (e.g. for Multipart message - Table Features)
index f108b7c83effb43487e2586c6207078da80f9d39..366cd3ab9381f6eaa42efa6726beafea4065e226 100755 (executable)
@@ -14,6 +14,7 @@ import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdSerializerK
 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterSerializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.InstructionSerializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmClassBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice;
@@ -34,6 +35,21 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
  */
 public interface SerializerExtensionProvider {
 
+    /**
+     * Registers serializer
+     * Throws IllegalStateException when there is
+     * a serializer already registered under given key.
+     *
+     * If the serializer implements {@link SerializerRegistryInjector} interface,
+     * the serializer is injected with SerializerRegistry instance.
+     *
+     * @param <K> serializer key type
+     * @param key used for serializer lookup
+     * @param serializer serializer implementation
+     */
+    <K> void registerSerializer(MessageTypeKey<K> key,
+            OFGeneralSerializer serializer);
+
     /**
      * Unregisters custom serializer
      * @param key used for serializer lookup
index 7ecc39e143c35c285b9e2d6c1ecef631a946129a..d65a623a63b12a30a082f230d7d8849b31f77ccb 100755 (executable)
@@ -301,4 +301,13 @@ public class SwitchConnectionProviderImpl implements SwitchConnectionProvider, C
         return this.connConfig;
     }
 
+     @Override
+    public <K> void registerSerializer(MessageTypeKey<K> key, OFGeneralSerializer serializer) {
+        serializerRegistry.registerSerializer(key, serializer);
+    }
+
+    @Override
+    public void registerDeserializer(MessageCodeKey key, OFGeneralDeserializer deserializer) {
+       deserializerRegistry.registerDeserializer(key, deserializer);
+    }
 }
index 5b9dc17c09982eabb186339741e81eb9124cb84a..03cc3f990dc3ca3679324cb013b3a2f922154f57 100755 (executable)
@@ -29,6 +29,8 @@ import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterInstructionDe
 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterInstructionSerializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
+import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowjava.protocol.impl.core.ServerFacade;
 import org.opendaylight.openflowjava.protocol.impl.core.SwitchConnectionProviderImpl;
@@ -241,6 +243,12 @@ public class SwitchConnectionProviderImpl02Test {
         provider.registerMatchEntrySerializer(key16, serializer);
         Assert.assertTrue("Wrong -- unregister MatchEntrySerializer", provider.unregisterSerializer(key16));
         Assert.assertFalse("Wrong -- unregister MatchEntrySerializer by not existing key", provider.unregisterSerializer(key15));
+        // -- registerSerializer
+        final MessageTypeKey key17 = new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, TestSubType.class);
+        provider.registerSerializer(key17, serializer);
+        // -- registerDeserializer
+        final MessageCodeKey key18 = new MessageCodeKey(EncodeConstants.OF13_VERSION_ID, 42, TestSubType.class);
+        provider.registerDeserializer(key18, deserializer);
     }
 
     private static class TestSubType extends ExperimenterActionSubType {