Added missing extension registration methods + keys (serialization part) 99/10699/1
authorMichal Polkorab <michal.polkorab@pantheon.sk>
Wed, 3 Sep 2014 12:29:18 +0000 (14:29 +0200)
committerMichal Polkorab <michal.polkorab@pantheon.sk>
Wed, 3 Sep 2014 14:26:12 +0000 (16:26 +0200)
Change-Id: I44bd91a975c8bd6e56e9c13aa152999d34c8546f
Signed-off-by: Michal Polkorab <michal.polkorab@pantheon.sk>
openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/extensibility/SerializerExtensionProvider.java
openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/experimenter/ExperimenterIdDeserializerKey.java
openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/experimenter/ExperimenterIdSerializerKey.java [new file with mode: 0644]
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/connection/SwitchConnectionProviderImpl.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/ExperimenterInputMessageFactory.java [new file with mode: 0644]
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MeterModInputMessageFactory.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MultipartRequestInputFactory.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/OF10StatsRequestInputFactory.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/VendorInputMessageFactory.java [new file with mode: 0644]
util/src/main/java/org/opendaylight/openflowjava/util/ExperimenterSerializerKeyFactory.java [new file with mode: 0644]

index 025e3c2cb056161648506cac7b04a1b0e054fb20..9ee873bfa1162acf3a974a632a2c29c7bd77e1d2 100644 (file)
@@ -10,10 +10,15 @@ package org.opendaylight.openflowjava.protocol.api.extensibility;
 \r
 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;\r
 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey;\r
+import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterIdSerializerKey;\r
 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionSerializerKey;\r
 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterSerializerKey;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCase;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeatureProperties;\r
 \r
 \r
 /**\r
@@ -53,4 +58,36 @@ public interface SerializerExtensionProvider {
      */\r
     public <OXM_CLASS extends OxmClassBase, OXM_TYPE extends MatchField> void registerMatchEntrySerializer(\r
             MatchEntrySerializerKey<OXM_CLASS, OXM_TYPE> key,OFGeneralSerializer serializer);\r
+\r
+    /**\r
+     * Registers experimenter (vendor) message serializer\r
+     * @param key used for serializer lookup\r
+     * @param serializer serializer implementation\r
+     */\r
+    public void registerExperimenterMessageSerializer(ExperimenterIdSerializerKey<ExperimenterInput> key,\r
+            OFSerializer<ExperimenterInput> serializer);\r
+\r
+    /**\r
+     * Registers multipart-request (stats-request) serializer\r
+     * @param key used for serializer lookup\r
+     * @param serializer serializer implementation\r
+     */\r
+    public void registerMultipartRequestSerializer(ExperimenterIdSerializerKey<MultipartRequestExperimenterCase> key,\r
+            OFSerializer<MultipartRequestExperimenterCase> serializer);\r
+\r
+    /**\r
+     * Registers multipart-request table-features serializer\r
+     * @param key used for serializer lookup\r
+     * @param serializer serializer implementation\r
+     */\r
+    public void registerMultipartRequestTFSerializer(ExperimenterIdSerializerKey<TableFeatureProperties> key,\r
+            OFGeneralSerializer serializer);\r
+\r
+    /**\r
+     * Registers meter band serializer (used in meter-mod messages)\r
+     * @param key used for serializer lookup\r
+     * @param serializer serializer implementation\r
+     */\r
+    public void registerMeterBandSerializer(ExperimenterIdSerializerKey<MeterBandExperimenterCase> key,\r
+            OFSerializer<MeterBandExperimenterCase> serializer);\r
 }
\ No newline at end of file
index cfb19c633ca865e0b3099aa6f83e8600661c9b91..d4841f20521f0f91d0d09915316952594efb58dd 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.openflowjava.protocol.api.keys.experimenter;
 \r
 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;\r
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
 \r
 /**\r
  * @author michal.polkorab\r
@@ -25,7 +26,8 @@ public final class ExperimenterIdDeserializerKey extends MessageCodeKey
      * @param experimenterId experimenter / vendor ID\r
      * @param objectClass class of created object\r
      */\r
-    public ExperimenterIdDeserializerKey(short version, Long experimenterId, Class<?> objectClass) {\r
+    public <E extends DataObject> ExperimenterIdDeserializerKey(short version,\r
+            Long experimenterId, Class<E> objectClass) {\r
         super(version, EncodeConstants.EXPERIMENTER_VALUE, objectClass);\r
         this.experimenterId = experimenterId;\r
     }\r
diff --git a/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/experimenter/ExperimenterIdSerializerKey.java b/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/experimenter/ExperimenterIdSerializerKey.java
new file mode 100644 (file)
index 0000000..1e9325e
--- /dev/null
@@ -0,0 +1,62 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.api.keys.experimenter;\r
+\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ * @param <TYPE> class of object to be serialized\r
+ */\r
+public class ExperimenterIdSerializerKey<TYPE extends DataObject> extends MessageTypeKey<TYPE> {\r
+\r
+    private Long experimenterId;\r
+\r
+    /**\r
+     * @param msgVersion protocol wire version\r
+     * @param experimenterId experimenter / vendor ID\r
+     * @param objectClass class of object to be serialized\r
+     */\r
+    public ExperimenterIdSerializerKey(short msgVersion,\r
+            Long experimenterId, Class<TYPE> objectClass) {\r
+        super(msgVersion, objectClass);\r
+        this.experimenterId = experimenterId;\r
+    }\r
+\r
+    @Override\r
+    public int hashCode() {\r
+        final int prime = 31;\r
+        int result = super.hashCode();\r
+        result = prime * result + ((experimenterId == null) ? 0 : experimenterId.hashCode());\r
+        return result;\r
+    }\r
+\r
+    @Override\r
+    public boolean equals(Object obj) {\r
+        if (this == obj)\r
+            return true;\r
+        if (!super.equals(obj))\r
+            return false;\r
+        if (!(obj instanceof ExperimenterIdSerializerKey))\r
+            return false;\r
+        ExperimenterIdSerializerKey<?> other = (ExperimenterIdSerializerKey<?>) obj;\r
+        if (experimenterId == null) {\r
+            if (other.experimenterId != null)\r
+                return false;\r
+        } else if (!experimenterId.equals(other.experimenterId))\r
+            return false;\r
+        return true;\r
+    }\r
+\r
+    @Override\r
+    public String toString() {\r
+        return super.toString() + " experimenterID: " + experimenterId;\r
+    }\r
+}
\ No newline at end of file
index 706ad538d03547d5827e22ff543ed4fbb106d68f..c2072ba51535c387c4397370192c5c1418ffc30a 100644 (file)
@@ -17,6 +17,7 @@ import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer;
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralSerializer;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
@@ -24,6 +25,7 @@ import org.opendaylight.openflowjava.protocol.api.keys.experimenter.Experimenter
 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterDeserializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterIdDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterIdSerializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionDeserializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionSerializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterSerializerKey;
@@ -39,10 +41,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.config.rev140630.T
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.property.header.QueueProperty;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeatureProperties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -241,4 +246,28 @@ public class SwitchConnectionProviderImpl implements SwitchConnectionProvider {
             OFDeserializer<MeterBandExperimenterCase> deserializer) {
         deserializerRegistry.registerDeserializer(key, deserializer);
     }
+
+    @Override
+    public void registerExperimenterMessageSerializer(ExperimenterIdSerializerKey<ExperimenterInput> key,
+            OFSerializer<ExperimenterInput> serializer) {
+        serializerRegistry.registerSerializer(key, serializer);
+    }
+
+    @Override
+    public void registerMultipartRequestSerializer(ExperimenterIdSerializerKey<MultipartRequestExperimenterCase> key,
+            OFSerializer<MultipartRequestExperimenterCase> serializer) {
+        serializerRegistry.registerSerializer(key, serializer);
+    }
+
+    @Override
+    public void registerMultipartRequestTFSerializer(ExperimenterIdSerializerKey<TableFeatureProperties> key,
+            OFGeneralSerializer serializer) {
+        serializerRegistry.registerSerializer(key, serializer);
+    }
+
+    @Override
+    public void registerMeterBandSerializer(ExperimenterIdSerializerKey<MeterBandExperimenterCase> key,
+            OFSerializer<MeterBandExperimenterCase> serializer) {
+        serializerRegistry.registerSerializer(key, serializer);
+    }
 }
\ No newline at end of file
diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/ExperimenterInputMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/ExperimenterInputMessageFactory.java
new file mode 100644 (file)
index 0000000..6dd5f66
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2013 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.openflowjava.protocol.impl.serialization.factories;
+
+import io.netty.buffer.ByteBuf;
+
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.openflowjava.util.ExperimenterSerializerKeyFactory;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
+
+/**
+ * Translates Experimenter messages
+ * @author michal.polkorab
+ */
+public class ExperimenterInputMessageFactory implements OFSerializer<ExperimenterInput>,
+        SerializerRegistryInjector {
+
+    private SerializerRegistry registry;
+
+    @Override
+    public void serialize(ExperimenterInput message, ByteBuf outBuffer) {
+        long expId = message.getExperimenter().getValue();
+        OFSerializer<ExperimenterInput> serializer = registry.getSerializer(
+                ExperimenterSerializerKeyFactory.createExperimenterMessageSerializerKey(
+                        EncodeConstants.OF10_VERSION_ID, expId));
+        serializer.serialize(message, outBuffer);
+    }
+
+    @Override
+    public void injectSerializerRegistry(SerializerRegistry serializerRegistry) {
+        this.registry = serializerRegistry;
+    }
+}
\ No newline at end of file
index 0c69f478c54bd5a3fe279c310546faeb5a2203ba..1da3fb3cb71c4204da8855d3c762b0b9be3d45c3 100644 (file)
@@ -12,12 +12,13 @@ import io.netty.buffer.ByteBuf;
 
 import java.util.List;
 
-import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.openflowjava.util.ExperimenterSerializerKeyFactory;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdMeterBand;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterBandCommons;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
@@ -78,11 +79,14 @@ public class MeterModInputMessageFactory implements OFSerializer<MeterModInput>,
                     outBuffer.writeByte(dscpRemarkBand.getPrecLevel());
                     outBuffer.writeZero(PADDING_IN_METER_BAND_DSCP_REMARK);
                 } else if (meterBand instanceof MeterBandExperimenterCase) {
-                    OFSerializer<MeterBandExperimenter> serializer = registry.getSerializer(
-                            new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, MeterBandExperimenter.class));
                     MeterBandExperimenterCase experimenterBandCase = (MeterBandExperimenterCase) meterBand;
                     MeterBandExperimenter experimenterBand = experimenterBandCase.getMeterBandExperimenter();
-                    serializer.serialize(experimenterBand, outBuffer);
+                    long expId = experimenterBand.getAugmentation(ExperimenterIdMeterBand.class)
+                            .getExperimenter().getValue();
+                    OFSerializer<MeterBandExperimenterCase> serializer = registry.getSerializer(
+                            ExperimenterSerializerKeyFactory.createMeterBandSerializerKey(
+                                    EncodeConstants.OF13_VERSION_ID, expId));
+                    serializer.serialize(experimenterBandCase, outBuffer);
                 }
             }
         }
@@ -99,5 +103,4 @@ public class MeterModInputMessageFactory implements OFSerializer<MeterModInput>,
     public void injectSerializerRegistry(final SerializerRegistry serializerRegistry) {
         registry = serializerRegistry;
     }
-
-}
+}
\ No newline at end of file
index fff96d17593239eb4f1050beb6d94fe333d6f3a4..2170eaf264e047ca8063c99a25d339515560692d 100644 (file)
@@ -21,7 +21,10 @@ import org.opendaylight.openflowjava.protocol.impl.util.ListSerializer;
 import org.opendaylight.openflowjava.protocol.impl.util.TypeKeyMaker;
 import org.opendaylight.openflowjava.protocol.impl.util.TypeKeyMakerFactory;
 import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.openflowjava.util.ExperimenterSerializerKeyFactory;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionRelatedTableFeatureProperty;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdMultipartRequest;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdTableFeatureProperty;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.InstructionRelatedTableFeatureProperty;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NextTableRelatedTableFeatureProperty;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmRelatedTableFeatureProperty;
@@ -84,7 +87,6 @@ public class MultipartRequestInputFactory implements OFSerializer<MultipartReque
     private static final byte WRITE_SETFIELD_MISS_CODE = 13;
     private static final byte APPLY_SETFIELD_CODE = 14;
     private static final byte APPLY_SETFIELD_MISS_CODE = 15;
-    private static final byte STRUCTURE_HEADER_LENGTH = 4;
     private static final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01 = 3;
     private static final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02 = 4;
     private static final byte PADDING_IN_MULTIPART_REQUEST_AGREGGATE_BODY_01 = 3;
@@ -142,9 +144,11 @@ public class MultipartRequestInputFactory implements OFSerializer<MultipartReque
         MultipartRequestExperimenterCase expCase =
                 (MultipartRequestExperimenterCase) message.getMultipartRequestBody();
         MultipartRequestExperimenter experimenter = expCase.getMultipartRequestExperimenter();
-        OFSerializer<MultipartRequestExperimenter> serializer = registry.getSerializer(
-                new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, MultipartRequestExperimenter.class));
-        serializer.serialize(experimenter, outBuffer);
+        long expId = experimenter.getAugmentation(ExperimenterIdMultipartRequest.class).getExperimenter().getValue();
+        OFSerializer<MultipartRequestExperimenterCase> serializer = registry.getSerializer(
+                ExperimenterSerializerKeyFactory.createMultipartRequestSerializerKey(
+                        EncodeConstants.OF13_VERSION_ID, expId));
+        serializer.serialize(expCase, outBuffer);
     }
 
     private static int createMultipartRequestFlagsBitmask(final MultipartRequestFlags flags) {
@@ -417,8 +421,10 @@ public class MultipartRequestInputFactory implements OFSerializer<MultipartReque
 
     private void writeExperimenterRelatedTableProperty(final ByteBuf output,
             final TableFeatureProperties property) {
+        long expId = property.getAugmentation(ExperimenterIdTableFeatureProperty.class).getExperimenter().getValue();
         OFSerializer<TableFeatureProperties> serializer = registry.getSerializer(
-                new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, TableFeatureProperties.class));
+                ExperimenterSerializerKeyFactory.createMultipartRequestTFSerializerKey(
+                        EncodeConstants.OF13_VERSION_ID, expId));
         serializer.serialize(property, output);
     }
 
index 840b9966a70e3cedf7adc76a76133532ac1b3de1..74b79359438428988e996986a253e6677a40a83a 100644 (file)
@@ -14,8 +14,10 @@ import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;
-import org.opendaylight.openflowjava.util.ByteBufUtils;
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.openflowjava.util.ExperimenterSerializerKeyFactory;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdMultipartRequest;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
@@ -130,16 +132,17 @@ public class OF10StatsRequestInputFactory implements OFSerializer<MultipartReque
     }
 
     private void serializeExperimenterBody(final MultipartRequestBody multipartRequestBody, final ByteBuf output) {
-        MultipartRequestExperimenterCase experimenterCase = (MultipartRequestExperimenterCase) multipartRequestBody;
-        MultipartRequestExperimenter experimenter = experimenterCase.getMultipartRequestExperimenter();
-        OFSerializer<MultipartRequestExperimenter> expSerializer = registry.getSerializer(
-                       new MessageTypeKey<>(EncodeConstants.OF10_VERSION_ID, MultipartRequestExperimenter.class));
-        expSerializer.serialize(experimenter, output);
+        MultipartRequestExperimenterCase expCase = (MultipartRequestExperimenterCase) multipartRequestBody;
+        MultipartRequestExperimenter experimenter = expCase.getMultipartRequestExperimenter();
+        long expId = experimenter.getAugmentation(ExperimenterIdMultipartRequest.class).getExperimenter().getValue();
+        OFSerializer<MultipartRequestExperimenterCase> serializer = registry.getSerializer(
+                ExperimenterSerializerKeyFactory.createExperimenterMessageSerializerKey(
+                        EncodeConstants.OF10_VERSION_ID, expId));
+        serializer.serialize(expCase, output);
     }
 
     @Override
     public void injectSerializerRegistry(final SerializerRegistry serializerRegistry) {
         this.registry = serializerRegistry;
     }
-
-}
+}
\ No newline at end of file
diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/VendorInputMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/VendorInputMessageFactory.java
new file mode 100644 (file)
index 0000000..1cf2adc
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2013 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.openflowjava.protocol.impl.serialization.factories;
+
+import io.netty.buffer.ByteBuf;
+
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.openflowjava.util.ExperimenterSerializerKeyFactory;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
+
+/**
+ * Translates Vendor messages
+ * @author michal.polkorab
+ */
+public class VendorInputMessageFactory implements OFSerializer<ExperimenterInput>,
+        SerializerRegistryInjector {
+
+    private SerializerRegistry registry;
+
+    @Override
+    public void serialize(ExperimenterInput message, ByteBuf outBuffer) {
+        long expId = message.getExperimenter().getValue();
+        OFSerializer<ExperimenterInput> serializer = registry.getSerializer(
+                ExperimenterSerializerKeyFactory.createExperimenterMessageSerializerKey(
+                        EncodeConstants.OF10_VERSION_ID, expId));
+        serializer.serialize(message, outBuffer);
+    }
+
+    @Override
+    public void injectSerializerRegistry(SerializerRegistry serializerRegistry) {
+        this.registry = serializerRegistry;
+    }
+}
\ No newline at end of file
diff --git a/util/src/main/java/org/opendaylight/openflowjava/util/ExperimenterSerializerKeyFactory.java b/util/src/main/java/org/opendaylight/openflowjava/util/ExperimenterSerializerKeyFactory.java
new file mode 100644 (file)
index 0000000..a164766
--- /dev/null
@@ -0,0 +1,62 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.util;\r
+\r
+import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterIdSerializerKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCase;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeatureProperties;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class ExperimenterSerializerKeyFactory {\r
+\r
+    /**\r
+     * @param msgVersion openflow wire version\r
+     * @param experimenterId experimenter / vendor ID\r
+     * @return key instance\r
+     */\r
+    public static ExperimenterIdSerializerKey<ExperimenterInput> createExperimenterMessageSerializerKey(\r
+            short msgVersion, Long experimenterId) {\r
+        return new ExperimenterIdSerializerKey<>(msgVersion, experimenterId, ExperimenterInput.class);\r
+    }\r
+\r
+    /**\r
+     * @param msgVersion openflow wire version\r
+     * @param experimenterId experimenter / vendor ID\r
+     * @return key instance\r
+     */\r
+    public static ExperimenterIdSerializerKey<MultipartRequestExperimenterCase> createMultipartRequestSerializerKey(\r
+            short msgVersion, Long experimenterId) {\r
+        return new ExperimenterIdSerializerKey<>(msgVersion, experimenterId, MultipartRequestExperimenterCase.class);\r
+    }\r
+\r
+    /**\r
+     * @param msgVersion openflow wire version\r
+     * @param experimenterId experimenter / vendor ID\r
+     * @return key instance\r
+     */\r
+    public static ExperimenterIdSerializerKey<TableFeatureProperties> createMultipartRequestTFSerializerKey(\r
+            short msgVersion, Long experimenterId) {\r
+        return new ExperimenterIdSerializerKey<>(msgVersion, experimenterId, TableFeatureProperties.class);\r
+    }\r
+\r
+    /**\r
+     * @param msgVersion openflow wire version\r
+     * @param experimenterId experimenter / vendor ID\r
+     * @return key instance\r
+     */\r
+    public static ExperimenterIdSerializerKey<MeterBandExperimenterCase> createMeterBandSerializerKey(\r
+            short msgVersion, Long experimenterId) {\r
+        return new ExperimenterIdSerializerKey<>(msgVersion, experimenterId, MeterBandExperimenterCase.class);\r
+    }\r
+}
\ No newline at end of file