6fa791d3f53574761161eb509e6e04c9066c1555
[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  * @author timotej.kubas\r
16  * @author michal.polkorab\r
17  */\r
18 public class GroupModInputMessageFactory implements OFSerializer<GroupModInput> {\r
19     private static final byte MESSAGE_TYPE = 15;\r
20     private static final byte PADDING_IN_GROUP_MOD_MESSAGE = 1;\r
21     private static final int MESSAGE_LENGTH = 16;\r
22     private static final byte LENGTH_OF_BUCKET_STRUCTURE = 16;\r
23     private static GroupModInputMessageFactory instance;\r
24 \r
25     private GroupModInputMessageFactory() {\r
26         // singleton\r
27     }\r
28     \r
29     /**\r
30      * @return singleton factory\r
31      */\r
32     public static synchronized GroupModInputMessageFactory getInstance() {\r
33         if (instance == null) {\r
34             instance = new GroupModInputMessageFactory();\r
35         }\r
36         return instance;\r
37     }\r
38     \r
39     @Override\r
40     public void messageToBuffer(short version, ByteBuf out,\r
41             GroupModInput message) {\r
42         ByteBufUtils.writeOFHeader(instance, message, out);\r
43         out.writeShort(message.getCommand().getIntValue());\r
44         out.writeByte(message.getType().getIntValue());\r
45         ByteBufUtils.padBuffer(PADDING_IN_GROUP_MOD_MESSAGE, out);\r
46         out.writeInt(message.getGroupId().intValue());\r
47         encodeBuckets(message.getBucketsList(), out);\r
48     }\r
49 \r
50     @Override\r
51     public int computeLength(GroupModInput message) {\r
52         return MESSAGE_LENGTH + computeLengthOfBuckets(message.getBucketsList());\r
53     }\r
54 \r
55     @Override\r
56     public byte getMessageType() {\r
57         return MESSAGE_TYPE;\r
58     }\r
59     \r
60     private static void encodeBuckets(List<BucketsList> buckets, ByteBuf outBuffer) {\r
61         final byte PADDING_IN_BUCKET = 4;\r
62         if (buckets != null) {\r
63             for (BucketsList currentBucket : buckets) {\r
64                 outBuffer.writeShort(computeLengthOfBucket(currentBucket));\r
65                 outBuffer.writeShort(currentBucket.getWeight().shortValue());\r
66                 outBuffer.writeInt(currentBucket.getWatchPort().getValue().intValue());\r
67                 outBuffer.writeInt(currentBucket.getWatchGroup().intValue());\r
68                 ByteBufUtils.padBuffer(PADDING_IN_BUCKET, outBuffer);\r
69                 ActionsSerializer.encodeActions(currentBucket.getActionsList(), outBuffer);\r
70             }\r
71         }\r
72     }\r
73     \r
74     private static int computeLengthOfBucket(BucketsList bucket) {\r
75         int lengthOfBuckets = 0;\r
76         if (bucket != null) {\r
77             lengthOfBuckets = LENGTH_OF_BUCKET_STRUCTURE + ActionsSerializer.computeLengthOfActions(bucket.getActionsList());\r
78         }\r
79         return lengthOfBuckets;\r
80     }\r
81     \r
82     private static int computeLengthOfBuckets(List<BucketsList> buckets) {\r
83         int lengthOfBuckets = 0;\r
84         if (buckets != null) {\r
85             for (BucketsList currentBucket : buckets) {\r
86                 lengthOfBuckets += LENGTH_OF_BUCKET_STRUCTURE + ActionsSerializer.computeLengthOfActions(currentBucket.getActionsList());\r
87             }\r
88         }\r
89         return lengthOfBuckets;\r
90     }\r
91 \r
92     \r
93 }\r