6e32f86fa712bc33292947794b3a6f7eb00dfcfc
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / util / ListDeserializer.java
1 /*\r
2  * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 \r
9 package org.opendaylight.openflowjava.protocol.impl.util;\r
10 \r
11 import io.netty.buffer.ByteBuf;\r
12 \r
13 import java.util.ArrayList;\r
14 import java.util.List;\r
15 \r
16 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;\r
17 import org.opendaylight.openflowjava.protocol.api.extensibility.HeaderDeserializer;\r
18 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;\r
19 import org.opendaylight.yangtools.yang.binding.DataObject;\r
20 \r
21 /**\r
22  * @author michal.polkorab\r
23  *\r
24  */\r
25 public final class ListDeserializer {\r
26 \r
27     private ListDeserializer() {\r
28         throw new UnsupportedOperationException("Utility class shouldn't be instantiated");\r
29     }\r
30 \r
31     /**\r
32      * Deserializes items into list\r
33      * @param version openflow wire version\r
34      * @param length length of list in ByteBuf (bytes)\r
35      * @param input input buffer\r
36      * @param keyMaker creates keys for deserializer lookup\r
37      * @param registry stores deserializers\r
38      * @return list of items\r
39      */\r
40     public static <E extends DataObject> List<E> deserializeList(short version, int length,\r
41             ByteBuf input, CodeKeyMaker keyMaker, DeserializerRegistry registry) {\r
42         List<E> items = null;\r
43         if (input.readableBytes() > 0) {\r
44             items = new ArrayList<>();\r
45             int startIndex = input.readerIndex();\r
46             while ((input.readerIndex() - startIndex) < length){\r
47                 OFDeserializer<E> deserializer = registry.getDeserializer(keyMaker.make(input));\r
48                 E item = deserializer.deserialize(input);\r
49                 items.add(item);\r
50             }\r
51         }\r
52         return items;\r
53     }\r
54 \r
55     /**\r
56      * Deserializes headers of items into list\r
57      * @param version openflow wire version\r
58      * @param length length of list in ByteBuf (bytes)\r
59      * @param input input buffer\r
60      * @param keyMaker creates keys for deserializer lookup\r
61      * @param registry stores deserializers\r
62      * @return list of items\r
63      */\r
64     public static <E extends DataObject> List<E> deserializeHeaders(short version, int length,\r
65             ByteBuf input, CodeKeyMaker keyMaker, DeserializerRegistry registry) {\r
66         List<E> items = null;\r
67         if (input.readableBytes() > 0) {\r
68             items = new ArrayList<>();\r
69             int startIndex = input.readerIndex();\r
70             while ((input.readerIndex() - startIndex) < length){\r
71                 HeaderDeserializer<E> deserializer = registry.getDeserializer(keyMaker.make(input));\r
72                 E item = deserializer.deserializeHeader(input);\r
73                 items.add(item);\r
74             }\r
75         }\r
76         return items;\r
77     }\r
78 }\r