160f3be59faeafb320cfd9a1c2533f51df052829
[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 class ListDeserializer {\r
26 \r
27     /**\r
28      * Deserializes items into list\r
29      * @param version openflow wire version\r
30      * @param length length of list in ByteBuf (bytes)\r
31      * @param input input buffer\r
32      * @param keyMaker creates keys for deserializer lookup\r
33      * @param registry stores deserializers\r
34      * @return list of items\r
35      */\r
36     public static <E extends DataObject> List<E> deserializeList(short version, int length,\r
37             ByteBuf input, CodeKeyMaker keyMaker, DeserializerRegistry registry) {\r
38         List<E> items = null;\r
39         if (input.readableBytes() > 0) {\r
40             items = new ArrayList<>();\r
41             int startIndex = input.readerIndex();\r
42             while ((input.readerIndex() - startIndex) < length){\r
43                 OFDeserializer<E> deserializer = registry.getDeserializer(keyMaker.make(input));\r
44                 E item = deserializer.deserialize(input);\r
45                 items.add(item);\r
46             }\r
47         }\r
48         return items;\r
49     }\r
50 \r
51     /**\r
52      * Deserializes headers of items into list\r
53      * @param version openflow wire version\r
54      * @param length length of list in ByteBuf (bytes)\r
55      * @param input input buffer\r
56      * @param keyMaker creates keys for deserializer lookup\r
57      * @param registry stores deserializers\r
58      * @return list of items\r
59      */\r
60     public static <E extends DataObject> List<E> deserializeHeaders(short version, int length,\r
61             ByteBuf input, CodeKeyMaker keyMaker, DeserializerRegistry registry) {\r
62         List<E> items = null;\r
63         if (input.readableBytes() > 0) {\r
64             items = new ArrayList<>();\r
65             int startIndex = input.readerIndex();\r
66             while ((input.readerIndex() - startIndex) < length){\r
67                 HeaderDeserializer<E> deserializer = registry.getDeserializer(keyMaker.make(input));\r
68                 E item = deserializer.deserializeHeader(input);\r
69                 items.add(item);\r
70             }\r
71         }\r
72         return items;\r
73     }\r
74 }\r