Added missing extension registration methods + keys (deserialization part) 94/10694/2
authorMichal Polkorab <michal.polkorab@pantheon.sk>
Tue, 2 Sep 2014 13:23:08 +0000 (15:23 +0200)
committerMichal Polkorab <michal.polkorab@pantheon.sk>
Wed, 3 Sep 2014 13:55:04 +0000 (15:55 +0200)
Change-Id: Id997a3fc52ab8e4491ee74ba61bddec20d23c2d9
Signed-off-by: Michal Polkorab <michal.polkorab@pantheon.sk>
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/keys/experimenter/ExperimenterIdDeserializerKey.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/deserialization/factories/ErrorMessageFactory.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/ExperimenterMessageFactory.java [new file with mode: 0644]
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/MultipartReplyMessageFactory.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/OF10StatsReplyMessageFactory.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/QueueGetConfigReplyMessageFactory.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/VendorMessageFactory.java [new file with mode: 0644]
util/src/main/java/org/opendaylight/openflowjava/util/ExperimenterDeserializerKeyFactory.java [new file with mode: 0644]

index b821b168dd4f3f5e7948b1adeeab289cfbf6e56c..0d1d9cd6d9b88b58c22bc3748447cc197981ea3b 100644 (file)
@@ -11,7 +11,13 @@ package org.opendaylight.openflowjava.protocol.api.extensibility;
 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;\r
 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionDeserializerKey;\r
 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterDeserializerKey;\r
+import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterIdDeserializerKey;\r
 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionDeserializerKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;\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.queue.property.header.QueueProperty;\r
 \r
 /**\r
  * Provides methods for deserialization part of extensibility\r
@@ -50,4 +56,52 @@ public interface DeserializerExtensionProvider {
      */\r
     public void registerMatchEntryDeserializer(MatchEntryDeserializerKey key,\r
             OFGeneralDeserializer deserializer);\r
-}\r
+\r
+    /**\r
+     * Registers error message deserializer\r
+     * @param key used for deserializer lookup\r
+     * @param deserializer deserializer instance\r
+     */\r
+    void registerErrorDeserializer(ExperimenterIdDeserializerKey key,\r
+            OFDeserializer<ErrorMessage> deserializer);\r
+\r
+    /**\r
+     * Registers experimenter (vendor) message deserializer\r
+     * @param key used for deserializer lookup\r
+     * @param deserializer deserializer instance\r
+     */\r
+    void registerExperimenterMessageDeserializer(ExperimenterIdDeserializerKey key,\r
+            OFDeserializer<ExperimenterMessage> deserializer);\r
+\r
+    /**\r
+     * Registers multipart-reply (stats) message deserializer\r
+     * @param key used for deserializer lookup\r
+     * @param deserializer deserializer instance\r
+     */\r
+    void registerMultipartReplyMessageDeserializer(ExperimenterIdDeserializerKey key,\r
+            OFDeserializer<MultipartReplyMessage> deserializer);\r
+\r
+    /**\r
+     * Registers multipart-reply table-features message deserializer\r
+     * @param key used for deserializer lookup\r
+     * @param deserializer deserializer instance\r
+     */\r
+    void registerMultipartReplyTFDeserializer(ExperimenterIdDeserializerKey key,\r
+            OFGeneralDeserializer deserializer);\r
+\r
+    /**\r
+     * Registers meter band deserializer (used in multipart-reply meter-config)\r
+     * @param key used for deserializer lookup\r
+     * @param deserializer deserializer instance\r
+     */\r
+    void registerMeterBandDeserializer(ExperimenterIdDeserializerKey key,\r
+            OFDeserializer<MeterBandExperimenterCase> deserializer);\r
+\r
+    /**\r
+     * Registers queue property (QUEUE_GET_CONFIG_REPLY message) deserializer\r
+     * @param key used for deserializer lookup\r
+     * @param deserializer deserializer instance\r
+     */\r
+    void registerQueuePropertyDeserializer(ExperimenterIdDeserializerKey key,\r
+            OFDeserializer<QueueProperty> deserializer);\r
+}
\ No newline at end of file
diff --git a/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/experimenter/ExperimenterIdDeserializerKey.java b/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/experimenter/ExperimenterIdDeserializerKey.java
new file mode 100644 (file)
index 0000000..cfb19c6
--- /dev/null
@@ -0,0 +1,63 @@
+/*\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.MessageCodeKey;\r
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public final class ExperimenterIdDeserializerKey extends MessageCodeKey \r
+        implements ExperimenterDeserializerKey {\r
+\r
+    private Long experimenterId;\r
+\r
+    /**\r
+     * @param version protocol wire version\r
+     * @param experimenterId experimenter / vendor ID\r
+     * @param objectClass class of created object\r
+     */\r
+    public ExperimenterIdDeserializerKey(short version, Long experimenterId, Class<?> objectClass) {\r
+        super(version, EncodeConstants.EXPERIMENTER_VALUE, objectClass);\r
+        this.experimenterId = experimenterId;\r
+    }\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 ExperimenterIdDeserializerKey))\r
+            return false;\r
+        ExperimenterIdDeserializerKey other = (ExperimenterIdDeserializerKey) 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 d8c38cd5c08d221f216f8e9b067721a4f182ceb8..706ad538d03547d5827e22ff543ed4fbb106d68f 100644 (file)
@@ -14,6 +14,7 @@ import org.opendaylight.openflowjava.protocol.api.connection.SwitchConnectionHan
 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
 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.SerializerRegistry;
@@ -22,6 +23,7 @@ import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionDeserializerKey;
 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.ExperimenterInstructionDeserializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionSerializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterSerializerKey;
@@ -36,6 +38,11 @@ import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionPro
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.config.rev140630.TransportProtocol;
 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.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.queue.property.header.QueueProperty;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -198,4 +205,40 @@ public class SwitchConnectionProviderImpl implements SwitchConnectionProvider {
             OFGeneralDeserializer deserializer) {
         deserializerRegistry.registerDeserializer(key, deserializer);
     }
+
+    @Override
+    public void registerErrorDeserializer(ExperimenterIdDeserializerKey key,
+            OFDeserializer<ErrorMessage> deserializer) {
+        deserializerRegistry.registerDeserializer(key, deserializer);
+    }
+
+    @Override
+    public void registerExperimenterMessageDeserializer(ExperimenterIdDeserializerKey key,
+            OFDeserializer<ExperimenterMessage> deserializer) {
+        deserializerRegistry.registerDeserializer(key, deserializer);
+    }
+
+    @Override
+    public void registerMultipartReplyMessageDeserializer(ExperimenterIdDeserializerKey key,
+            OFDeserializer<MultipartReplyMessage> deserializer) {
+        deserializerRegistry.registerDeserializer(key, deserializer);
+    }
+
+    @Override
+    public void registerMultipartReplyTFDeserializer(ExperimenterIdDeserializerKey key,
+            OFGeneralDeserializer deserializer) {
+        deserializerRegistry.registerDeserializer(key, deserializer);
+    }
+
+    @Override
+    public void registerQueuePropertyDeserializer(ExperimenterIdDeserializerKey key,
+            OFDeserializer<QueueProperty> deserializer) {
+        deserializerRegistry.registerDeserializer(key, deserializer);
+    }
+
+    @Override
+    public void registerMeterBandDeserializer(ExperimenterIdDeserializerKey key,
+            OFDeserializer<MeterBandExperimenterCase> deserializer) {
+        deserializerRegistry.registerDeserializer(key, deserializer);
+    }
 }
\ No newline at end of file
index 4b18f2121c0da76ef306670aad05d10fb39b4a64..8e341bd0444ce4c70904c94ceedd3e1c6c6a929c 100644 (file)
@@ -12,10 +12,9 @@ import io.netty.buffer.ByteBuf;
 
 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
-import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdError;
+import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadActionCode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadInstructionCode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadMatchCode;
@@ -48,23 +47,24 @@ public class ErrorMessageFactory implements OFDeserializer<ErrorMessage>,
 
     @Override
     public ErrorMessage deserialize(ByteBuf rawMessage) {
+        int startIndex = rawMessage.readerIndex();
         ErrorMessageBuilder builder = new ErrorMessageBuilder();
         builder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
         builder.setXid(rawMessage.readUnsignedInt());
         int type = rawMessage.readUnsignedShort();
         ErrorType errorType = ErrorType.forValue(type);
         if (ErrorType.EXPERIMENTER.equals(errorType)) {
-            builder.setType(errorType.getIntValue());
-            OFDeserializer<ExperimenterIdError> deserializer = registry.getDeserializer(new MessageCodeKey(
-                    EncodeConstants.OF13_VERSION_ID, EncodeConstants.EXPERIMENTER_VALUE, ErrorMessage.class));
-            ExperimenterIdError error = deserializer.deserialize(rawMessage);
-            builder.addAugmentation(ExperimenterIdError.class, error);
-        } else {
-            decodeType(builder, errorType, type);
-            decodeCode(rawMessage, builder, errorType);
-            if (rawMessage.readableBytes() > 0) {
-                builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());
-            }
+            OFDeserializer<ErrorMessage> deserializer = registry.getDeserializer(
+                    ExperimenterDeserializerKeyFactory.createExperimenterErrorDeserializerKey(
+                            EncodeConstants.OF13_VERSION_ID, rawMessage.getUnsignedInt(
+                                    rawMessage.readerIndex() + EncodeConstants.SIZE_OF_SHORT_IN_BYTES)));
+            rawMessage.readerIndex(startIndex);
+            return deserializer.deserialize(rawMessage);
+        }
+        decodeType(builder, errorType, type);
+        decodeCode(rawMessage, builder, errorType);
+        if (rawMessage.readableBytes() > 0) {
+            builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());
         }
         return builder.build();
     }
diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/ExperimenterMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/ExperimenterMessageFactory.java
new file mode 100644 (file)
index 0000000..effe692
--- /dev/null
@@ -0,0 +1,43 @@
+/*\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.impl.deserialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;\r
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
+import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class ExperimenterMessageFactory implements OFDeserializer<ExperimenterMessage>,\r
+        DeserializerRegistryInjector {\r
+\r
+    private static final byte EXPERIMENTER_ID_INDEX = 8;\r
+    private DeserializerRegistry deserializerRegistry;\r
+\r
+    @Override\r
+    public ExperimenterMessage deserialize(ByteBuf message) {\r
+        long expId = message.getUnsignedInt(message.readerIndex() + EXPERIMENTER_ID_INDEX);\r
+        OFDeserializer<ExperimenterMessage> deserializer = deserializerRegistry.getDeserializer(\r
+                ExperimenterDeserializerKeyFactory.createExperimenterMessageDeserializerKey(\r
+                        EncodeConstants.OF13_VERSION_ID, expId));\r
+        return deserializer.deserialize(message);\r
+    }\r
+\r
+    @Override\r
+    public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {\r
+        this.deserializerRegistry = deserializerRegistry;\r
+    }\r
+}
\ No newline at end of file
index 4074339a535908eb0daa07eebbaa9a19a48669c1..1379071ddefe169cf2989ad095e70daf45549e38 100644 (file)
@@ -18,11 +18,12 @@ import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegi
 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
-import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowjava.protocol.impl.util.CodeKeyMaker;
 import org.opendaylight.openflowjava.protocol.impl.util.CodeKeyMakerFactory;
-import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowjava.protocol.impl.util.ListDeserializer;
+import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionRelatedTableFeatureProperty;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionRelatedTableFeaturePropertyBuilder;
@@ -62,16 +63,14 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsListBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCaseBuilder;
+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.meter.band.header.meter.band.meter.band.drop._case.MeterBandDropBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.dscp.remark._case.MeterBandDscpRemarkBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.experimenter._case.MeterBandExperimenterBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyExperimenterCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyExperimenterCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCase;
@@ -98,7 +97,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableFeaturesCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregateBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.desc._case.MultipartReplyDescBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.experimenter._case.MultipartReplyExperimenterBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlowBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStats;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStatsBuilder;
@@ -378,6 +376,7 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
         List<TableFeatureProperties> properties = new ArrayList<>();
         int tableFeaturesLength = length;
         while (tableFeaturesLength > 0) {
+            int propStartIndex = input.readerIndex();
             TableFeaturePropertiesBuilder builder = new TableFeaturePropertiesBuilder();
             TableFeaturesPropType type = TableFeaturesPropType.forValue(input.readUnsignedShort());
             builder.setType(type);
@@ -430,12 +429,11 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
                 builder.addAugmentation(OxmRelatedTableFeatureProperty.class, oxmBuilder.build());
             } else if (type.equals(TableFeaturesPropType.OFPTFPTEXPERIMENTER)
                     || type.equals(TableFeaturesPropType.OFPTFPTEXPERIMENTERMISS)) {
-                // return index to property start, so that the experimenter properties are deserialized
-                // correctly - as whole ofp_table_feature_prop_experimenter property
-                input.readerIndex(input.readerIndex() - 2 * EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
+                long expId = input.readUnsignedInt();
+                input.readerIndex(propStartIndex);
                 OFDeserializer<TableFeatureProperties> propDeserializer = registry.getDeserializer(
-                        new MessageCodeKey(EncodeConstants.OF13_VERSION_ID,
-                                type.getIntValue(), TableFeatureProperties.class));
+                        ExperimenterDeserializerKeyFactory.createMultipartReplyTFDeserializerKey(
+                                EncodeConstants.OF13_VERSION_ID, expId));
                 TableFeatureProperties expProp = propDeserializer.deserialize(input);
                 properties.add(expProp);
                 continue;
@@ -634,7 +632,7 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
         return caseBuilder.build();
     }
     
-    private static MultipartReplyMeterConfigCase setMeterConfig(ByteBuf input) {
+    private MultipartReplyMeterConfigCase setMeterConfig(ByteBuf input) {
         MultipartReplyMeterConfigCaseBuilder caseBuilder = new MultipartReplyMeterConfigCaseBuilder();
         MultipartReplyMeterConfigBuilder builder = new MultipartReplyMeterConfigBuilder();
         List<MeterConfig> meterConfigList = new ArrayList<>();
@@ -646,6 +644,7 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
             int actualLength = METER_CONFIG_LENGTH;
             List<Bands> bandsList = new ArrayList<>();
             while (actualLength < meterConfigBodyLength) {
+                int bandStartIndex = input.readerIndex();
                 BandsBuilder bandsBuilder = new BandsBuilder();
                 int bandType = input.readUnsignedShort();
                 switch (bandType) {
@@ -673,16 +672,13 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
                         bandsBuilder.setMeterBand(bandDscpRemarkCaseBuilder.build());
                         break;
                     case 0xFFFF:
-                        MeterBandExperimenterCaseBuilder bandExperimenterCaseBuilder = new MeterBandExperimenterCaseBuilder();
-                        MeterBandExperimenterBuilder bandExperimenterBuilder = new MeterBandExperimenterBuilder();
-                        // TODO - implement lookup into registry
-//                        bandExperimenterBuilder.setType(MeterBandType.forValue(bandType));
-//                        actualLength += input.readUnsignedShort();
-//                        bandExperimenterBuilder.setRate(input.readUnsignedInt());
-//                        bandExperimenterBuilder.setBurstSize(input.readUnsignedInt());
-//                        bandExperimenterBuilder.setExperimenter(input.readUnsignedInt());
-//                        bandExperimenterCaseBuilder.setMeterBandExperimenter(bandExperimenterBuilder.build());
-                        bandsBuilder.setMeterBand(bandExperimenterCaseBuilder.build());
+                        actualLength += input.readUnsignedShort();
+                        long expId = input.getUnsignedInt(input.readerIndex() + 2 * EncodeConstants.SIZE_OF_INT_IN_BYTES);
+                        input.readerIndex(bandStartIndex);
+                        OFDeserializer<MeterBandExperimenterCase> deserializer = registry.getDeserializer(
+                                ExperimenterDeserializerKeyFactory.createMeterBandDeserializerKey(
+                                        EncodeConstants.OF13_VERSION_ID, expId));
+                        bandsBuilder.setMeterBand(deserializer.deserialize(input));
                         break;
                     default:
                         break;
@@ -697,17 +693,9 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
         return caseBuilder.build();
     }
     
-    private static MultipartReplyExperimenterCase setExperimenter(ByteBuf input) {
-     // TODO - implement lookup into registry
-       MultipartReplyExperimenterCaseBuilder caseBuilder = new MultipartReplyExperimenterCaseBuilder();
-        MultipartReplyExperimenterBuilder builder = new MultipartReplyExperimenterBuilder();
-//        builder.setExperimenter(input.readUnsignedInt());
-//        builder.setExpType(input.readUnsignedInt());
-//        byte[] data = new byte[input.readableBytes()];
-//        input.readBytes(data);
-//        builder.setData(data);
-        caseBuilder.setMultipartReplyExperimenter(builder.build());
-        return caseBuilder.build();
+    private MultipartReplyExperimenterCase setExperimenter(ByteBuf input) {
+        return registry.getDeserializer(ExperimenterDeserializerKeyFactory.createMultipartReplyMessageDeserializerKey(
+                EncodeConstants.OF13_VERSION_ID, input.readUnsignedInt()));
     }
     
     private static MultipartReplyPortDescCase setPortDesc(ByteBuf input) {
index 5d27bdf5336080deb6414057e329fb7daeefcfc5..f1370acd5484a7699434a27b77eb1e38209579ab 100644 (file)
@@ -18,12 +18,13 @@ import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegi
 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
-import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowjava.protocol.impl.util.CodeKeyMaker;
 import org.opendaylight.openflowjava.protocol.impl.util.CodeKeyMakerFactory;
-import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowjava.protocol.impl.util.ListDeserializer;
 import org.opendaylight.openflowjava.protocol.impl.util.OF10MatchDeserializer;
+import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
@@ -35,7 +36,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyExperimenterCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyExperimenterCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCase;
@@ -46,7 +46,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregateBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.desc._case.MultipartReplyDescBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.experimenter._case.MultipartReplyExperimenterBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlowBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStats;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStatsBuilder;
@@ -295,16 +294,9 @@ public class OF10StatsReplyMessageFactory implements OFDeserializer<MultipartRep
         return caseBuilder.build();
     }
     
-    private static MultipartReplyExperimenterCase setExperimenter(ByteBuf input) {
-        // TODO - implement lookup into registry
-        MultipartReplyExperimenterCaseBuilder caseBuilder = new MultipartReplyExperimenterCaseBuilder();
-        MultipartReplyExperimenterBuilder builder = new MultipartReplyExperimenterBuilder();
-//        builder.setExperimenter(input.readUnsignedInt());
-//        byte[] data = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
-//        input.readBytes(data);
-//        builder.setData(data);
-        caseBuilder.setMultipartReplyExperimenter(builder.build());
-        return caseBuilder.build();
+    private MultipartReplyExperimenterCase setExperimenter(ByteBuf input) {
+        return registry.getDeserializer(ExperimenterDeserializerKeyFactory.createMultipartReplyMessageDeserializerKey(
+                EncodeConstants.OF10_VERSION_ID, input.readUnsignedInt()));
     }
 
     @Override
index ab05b53c9acbc47bed3aee4aa12be78a171d88aa..a85b996e3bd90761dd682f4e161332056cffea77 100644 (file)
@@ -15,9 +15,9 @@ import java.util.List;
 
 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
-import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.RateQueueProperty;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.RateQueuePropertyBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
@@ -43,7 +43,6 @@ public class QueueGetConfigReplyMessageFactory implements OFDeserializer<GetQueu
     private static final byte PADDING_IN_QUEUE_PROPERTY_HEADER = 4;
     private static final int PADDING_IN_RATE_QUEUE_PROPERTY = 6;
     private static final byte PACKET_QUEUE_LENGTH = 16;
-    private static final byte QUEUE_PROP_HEADER_SIZE = 8;
     private DeserializerRegistry registry;
 
     @Override
@@ -75,6 +74,7 @@ public class QueueGetConfigReplyMessageFactory implements OFDeserializer<GetQueu
         int propertiesLength = length;
         List<QueueProperty> propertiesList = new ArrayList<>();
         while (propertiesLength > 0) {
+            int propertyStartIndex = input.readerIndex();
             QueuePropertyBuilder propertiesBuilder = new QueuePropertyBuilder();
             QueueProperties property = QueueProperties.forValue(input.readUnsignedShort());
             propertiesBuilder.setProperty(property);
@@ -87,16 +87,12 @@ public class QueueGetConfigReplyMessageFactory implements OFDeserializer<GetQueu
                 propertiesBuilder.addAugmentation(RateQueueProperty.class, rateBuilder.build());
                 input.skipBytes(PADDING_IN_RATE_QUEUE_PROPERTY);
             } else if (property.equals(QueueProperties.OFPQTEXPERIMENTER)) {
-                // return index to property start, so that the experimenter properties are deserialized
-                // correctly - as whole ofp_queue_prop_experimenter property
-                input.readerIndex(input.readerIndex() - 2 * EncodeConstants.SIZE_OF_SHORT_IN_BYTES
-                        - PADDING_IN_QUEUE_PROPERTY_HEADER);
+                long expId = input.readUnsignedInt();
+                input.readerIndex(propertyStartIndex);
                 OFDeserializer<QueueProperty> deserializer = registry.getDeserializer(
-                        new MessageCodeKey(EncodeConstants.OF13_VERSION_ID,
-                                EncodeConstants.EXPERIMENTER_VALUE, QueueProperty.class));
-                QueueProperty expProp = deserializer.deserialize(input.slice(input.readerIndex(),
-                        currentPropertyLength - QUEUE_PROP_HEADER_SIZE));
-                propertiesList.add(expProp);
+                        ExperimenterDeserializerKeyFactory.createQueuePropertyDeserializerKey(
+                                EncodeConstants.OF13_VERSION_ID, expId));
+                propertiesList.add(deserializer.deserialize(input));
                 continue;
             }
             propertiesList.add(propertiesBuilder.build());
@@ -108,5 +104,4 @@ public class QueueGetConfigReplyMessageFactory implements OFDeserializer<GetQueu
     public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
         this.registry = deserializerRegistry;
     }
-
 }
diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/VendorMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/VendorMessageFactory.java
new file mode 100644 (file)
index 0000000..7c42153
--- /dev/null
@@ -0,0 +1,43 @@
+/*\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.impl.deserialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;\r
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
+import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class VendorMessageFactory implements OFDeserializer<ExperimenterMessage>,\r
+        DeserializerRegistryInjector {\r
+\r
+    private static final byte VENDOR_ID_INDEX = 8;\r
+    private DeserializerRegistry deserializerRegistry;\r
+\r
+    @Override\r
+    public ExperimenterMessage deserialize(ByteBuf message) {\r
+        long expId = message.getUnsignedInt(message.readerIndex() + VENDOR_ID_INDEX);\r
+        OFDeserializer<ExperimenterMessage> deserializer = deserializerRegistry.getDeserializer(\r
+                ExperimenterDeserializerKeyFactory.createExperimenterMessageDeserializerKey(\r
+                        EncodeConstants.OF10_VERSION_ID, expId));\r
+        return deserializer.deserialize(message);\r
+    }\r
+\r
+    @Override\r
+    public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {\r
+        this.deserializerRegistry = deserializerRegistry;\r
+    }\r
+}
\ No newline at end of file
diff --git a/util/src/main/java/org/opendaylight/openflowjava/util/ExperimenterDeserializerKeyFactory.java b/util/src/main/java/org/opendaylight/openflowjava/util/ExperimenterDeserializerKeyFactory.java
new file mode 100644 (file)
index 0000000..1f3b7b2
--- /dev/null
@@ -0,0 +1,84 @@
+/*\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.ExperimenterIdDeserializerKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;\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.queue.property.header.QueueProperty;\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 ExperimenterDeserializerKeyFactory {\r
+\r
+    /**\r
+     * @param version openflow wire version\r
+     * @param experimenterId experimenter / vendor ID\r
+     * @return key instance\r
+     */\r
+    public static ExperimenterIdDeserializerKey createExperimenterErrorDeserializerKey(\r
+            short version, Long experimenterId) {\r
+        return new ExperimenterIdDeserializerKey(version, experimenterId, ErrorMessage.class);\r
+    }\r
+\r
+    /**\r
+     * @param version openflow wire version\r
+     * @param experimenterId experimenter / vendor ID\r
+     * @return key instance\r
+     */\r
+    public static ExperimenterIdDeserializerKey createExperimenterMessageDeserializerKey(\r
+            short version, Long experimenterId) {\r
+        return new ExperimenterIdDeserializerKey(version, experimenterId, ExperimenterMessage.class);\r
+    }\r
+\r
+    /**\r
+     * @param version openflow wire version\r
+     * @param experimenterId experimenter / vendor ID\r
+     * @return key instance\r
+     */\r
+    public static ExperimenterIdDeserializerKey createMultipartReplyMessageDeserializerKey(\r
+            short version, Long experimenterId) {\r
+        return new ExperimenterIdDeserializerKey(version, experimenterId, MultipartReplyMessage.class);\r
+    }\r
+\r
+    /**\r
+     * @param version openflow wire version\r
+     * @param experimenterId experimenter / vendor ID\r
+     * @return key instance\r
+     */\r
+    public static ExperimenterIdDeserializerKey createMultipartReplyTFDeserializerKey(\r
+            short version, Long experimenterId) {\r
+        return new ExperimenterIdDeserializerKey(version, experimenterId, TableFeatureProperties.class);\r
+    }\r
+\r
+    /**\r
+     * @param version openflow wire version\r
+     * @param experimenterId experimenter / vendor ID\r
+     * @return key instance\r
+     */\r
+    public static ExperimenterIdDeserializerKey createQueuePropertyDeserializerKey(\r
+            short version, Long experimenterId) {\r
+        return new ExperimenterIdDeserializerKey(version, experimenterId, QueueProperty.class);\r
+    }\r
+\r
+    /**\r
+     * @param version openflow wire version\r
+     * @param experimenterId experimenter / vendor ID\r
+     * @return key instance\r
+     */\r
+    public static ExperimenterIdDeserializerKey createMeterBandDeserializerKey(\r
+            short version, Long experimenterId) {\r
+        return new ExperimenterIdDeserializerKey(version, experimenterId, MeterBandExperimenterCase.class);\r
+    }\r
+}
\ No newline at end of file