Remove trailing whitespace
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / HelloMessageFactory.java
index 78ee0ace2b961b81cd2fdf984cc9a7878260483f..ca0a79c8d2271809a4674da4363188ba030a181c 100644 (file)
@@ -1,73 +1,78 @@
-/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
-package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import io.netty.buffer.ByteBuf;\r
-\r
-import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloElementType;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessage;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessageBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.Elements;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.ElementsBuilder;\r
-\r
-/**\r
- * @author michal.polkorab\r
- *\r
- */\r
-public class HelloMessageFactory implements OFDeserializer<HelloMessage> {\r
-\r
-    private static HelloMessageFactory instance;\r
-    \r
-    private HelloMessageFactory() {\r
-        // do nothing, just singleton\r
-    }\r
-    \r
-    /**\r
-     * @return singleton factory\r
-     */\r
-    public static synchronized HelloMessageFactory getInstance() {\r
-        if (instance == null) {\r
-            instance = new HelloMessageFactory();\r
-        }\r
-        return instance;\r
-    }\r
-    \r
-    @Override\r
-    public HelloMessage bufferToMessage(ByteBuf rawMessage, short version) {\r
-        HelloMessageBuilder builder = new HelloMessageBuilder();\r
-        builder.setVersion(version);\r
-        builder.setXid(rawMessage.readUnsignedInt());\r
-        if (rawMessage.readableBytes() > 0) {\r
-            builder.setElements(readElement(rawMessage));\r
-        }\r
-        return builder.build();\r
-    }\r
-    \r
-    private static List<Elements> readElement(ByteBuf input) {\r
-        ElementsBuilder elementsBuilder = new ElementsBuilder();\r
-        List<Elements> elementsList = new ArrayList<>();\r
-        elementsBuilder.setType(HelloElementType.forValue(input.readUnsignedShort()));\r
-        int arrayLength = input.readableBytes()/4;\r
-        int[] versionBitmap = new int[arrayLength];\r
-        for (int i = 0; i < arrayLength; i++) {\r
-            versionBitmap[i] = (int) input.readUnsignedInt();\r
-        }\r
-        elementsBuilder.setVersionBitmap(readVersionBitmap(versionBitmap));\r
-        elementsList.add(elementsBuilder.build());\r
-        return elementsList;\r
-    }\r
-    \r
-    private static List<Boolean> readVersionBitmap(int[] input){\r
-        List<Boolean> versionBitmapList = new ArrayList<>();\r
-        for (int i = 0; i < input.length; i++) {\r
-            int mask = input[i];\r
-            for (int j = 0; j < Integer.SIZE; j++) {\r
-                    versionBitmapList.add((mask & (1<<j)) != 0);\r
-            }\r
-        }\r
-        return versionBitmapList;\r
-    }\r
-}\r
+/*
+ * 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.deserialization.factories;
+
+import io.netty.buffer.ByteBuf;
+
+import java.util.ArrayList;
+import java.util.List;
+
+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.common.types.rev130731.HelloElementType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessageBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.Elements;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.ElementsBuilder;
+
+/**
+ * Translates Hello messages
+ * @author michal.polkorab
+ * @author timotej.kubas
+ */
+public class HelloMessageFactory implements OFDeserializer<HelloMessage> {
+
+    private static final byte HELLO_ELEMENT_HEADER_SIZE = 4;
+    @Override
+    public HelloMessage deserialize(ByteBuf rawMessage) {
+        HelloMessageBuilder builder = new HelloMessageBuilder();
+        builder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
+        builder.setXid(rawMessage.readUnsignedInt());
+        if (rawMessage.readableBytes() > 0) {
+            builder.setElements(readElement(rawMessage));
+        }
+        return builder.build();
+    }
+
+    private static List<Elements> readElement(ByteBuf input) {
+        List<Elements> elementsList = new ArrayList<>();
+        while (input.readableBytes() > 0) {
+            ElementsBuilder elementsBuilder = new ElementsBuilder();
+            int type = input.readUnsignedShort();
+            int elementLength = input.readUnsignedShort();
+            if (type == HelloElementType.VERSIONBITMAP.getIntValue()) {
+                elementsBuilder.setType(HelloElementType.forValue(type));
+                int[] versionBitmap = new int[(elementLength - HELLO_ELEMENT_HEADER_SIZE) / 4];
+                for (int i = 0; i < versionBitmap.length; i++) {
+                    versionBitmap[i] = (int) input.readUnsignedInt();
+                }
+                elementsBuilder.setVersionBitmap(readVersionBitmap(versionBitmap));
+                int paddingRemainder = elementLength % EncodeConstants.PADDING;
+                if (paddingRemainder != 0) {
+                    input.readBytes(EncodeConstants.PADDING - paddingRemainder);
+                }
+            } else {
+                return elementsList;
+            }
+            elementsList.add(elementsBuilder.build());
+        }
+        return elementsList;
+    }
+
+    private static List<Boolean> readVersionBitmap(int[] input){
+        List<Boolean> versionBitmapList = new ArrayList<>();
+        for (int i = 0; i < input.length; i++) {
+            int mask = input[i];
+            for (int j = 0; j < Integer.SIZE; j++) {
+                    versionBitmapList.add((mask & (1<<j)) != 0);
+            }
+        }
+        return versionBitmapList;
+    }
+}