Javadoc update
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / GroupModInputMessageFactory.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
3 \r
4 import io.netty.buffer.ByteBuf;\r
5 \r
6 import java.util.List;\r
7 \r
8 import org.opendaylight.openflowjava.protocol.impl.serialization.OFSerializer;\r
9 import org.opendaylight.openflowjava.protocol.impl.util.ActionsSerializer;\r
10 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.BucketsList;\r
13 \r
14 /**\r
15  * Translates GroupMod messages\r
16  * @author timotej.kubas\r
17  * @author michal.polkorab\r
18  */\r
19 public class GroupModInputMessageFactory implements OFSerializer<GroupModInput> {\r
20     private static final byte MESSAGE_TYPE = 15;\r
21     private static final byte PADDING_IN_GROUP_MOD_MESSAGE = 1;\r
22     private static final int MESSAGE_LENGTH = 16;\r
23     private static final byte LENGTH_OF_BUCKET_STRUCTURE = 16;\r
24     private static GroupModInputMessageFactory instance;\r
25 \r
26     private GroupModInputMessageFactory() {\r
27         // singleton\r
28     }\r
29     \r
30     /**\r
31      * @return singleton factory\r
32      */\r
33     public static synchronized GroupModInputMessageFactory getInstance() {\r
34         if (instance == null) {\r
35             instance = new GroupModInputMessageFactory();\r
36         }\r
37         return instance;\r
38     }\r
39     \r
40     @Override\r
41     public void messageToBuffer(short version, ByteBuf out,\r
42             GroupModInput message) {\r
43         ByteBufUtils.writeOFHeader(instance, message, out);\r
44         out.writeShort(message.getCommand().getIntValue());\r
45         out.writeByte(message.getType().getIntValue());\r
46         ByteBufUtils.padBuffer(PADDING_IN_GROUP_MOD_MESSAGE, out);\r
47         out.writeInt(message.getGroupId().intValue());\r
48         encodeBuckets(message.getBucketsList(), out);\r
49     }\r
50 \r
51     @Override\r
52     public int computeLength(GroupModInput message) {\r
53         return MESSAGE_LENGTH + computeLengthOfBuckets(message.getBucketsList());\r
54     }\r
55 \r
56     @Override\r
57     public byte getMessageType() {\r
58         return MESSAGE_TYPE;\r
59     }\r
60     \r
61     private static void encodeBuckets(List<BucketsList> buckets, ByteBuf outBuffer) {\r
62         final byte PADDING_IN_BUCKET = 4;\r
63         if (buckets != null) {\r
64             for (BucketsList currentBucket : buckets) {\r
65                 outBuffer.writeShort(computeLengthOfBucket(currentBucket));\r
66                 outBuffer.writeShort(currentBucket.getWeight().shortValue());\r
67                 outBuffer.writeInt(currentBucket.getWatchPort().getValue().intValue());\r
68                 outBuffer.writeInt(currentBucket.getWatchGroup().intValue());\r
69                 ByteBufUtils.padBuffer(PADDING_IN_BUCKET, outBuffer);\r
70                 ActionsSerializer.encodeActions(currentBucket.getActionsList(), outBuffer);\r
71             }\r
72         }\r
73     }\r
74     \r
75     private static int computeLengthOfBucket(BucketsList bucket) {\r
76         int lengthOfBuckets = 0;\r
77         if (bucket != null) {\r
78             lengthOfBuckets = LENGTH_OF_BUCKET_STRUCTURE + ActionsSerializer.computeLengthOfActions(bucket.getActionsList());\r
79         }\r
80         return lengthOfBuckets;\r
81     }\r
82     \r
83     private static int computeLengthOfBuckets(List<BucketsList> buckets) {\r
84         int lengthOfBuckets = 0;\r
85         if (buckets != null) {\r
86             for (BucketsList currentBucket : buckets) {\r
87                 lengthOfBuckets += LENGTH_OF_BUCKET_STRUCTURE + ActionsSerializer.computeLengthOfActions(currentBucket.getActionsList());\r
88             }\r
89         }\r
90         return lengthOfBuckets;\r
91     }\r
92 \r
93     \r
94 }\r