Bump mdsal to 5.0.2
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / protocol / deserialization / multipart / MultipartReplyGroupFeaturesDeserializer.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart;
9
10 import io.netty.buffer.ByteBuf;
11 import java.util.ArrayList;
12 import java.util.List;
13 import java.util.stream.Collectors;
14 import java.util.stream.IntStream;
15 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Chaining;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.ChainingChecks;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupAll;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupCapability;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupFf;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupIndirect;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupSelect;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupType;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectLiveness;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectWeight;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.reply.MultipartReplyBody;
28 import org.opendaylight.yangtools.yang.common.Uint32;
29
30 public class MultipartReplyGroupFeaturesDeserializer implements OFDeserializer<MultipartReplyBody> {
31
32     private static final int GROUP_TYPES = 4;
33
34     @Override
35     public MultipartReplyBody deserialize(final ByteBuf message) {
36         final MultipartReplyGroupFeaturesBuilder builder = new MultipartReplyGroupFeaturesBuilder();
37
38         return builder
39             .setGroupTypesSupported(readGroupTypes(message))
40             .setGroupCapabilitiesSupported(readGroupCapabilities(message))
41             .setMaxGroups(IntStream
42                     .range(0, GROUP_TYPES)
43                     .mapToObj(i -> Uint32.valueOf(message.readUnsignedInt()))
44                     .collect(Collectors.toList()))
45             .setActions(IntStream
46                     .range(0, GROUP_TYPES)
47                     .mapToObj(i -> Uint32.valueOf(message.readUnsignedInt()))
48                     .collect(Collectors.toList()))
49             .build();
50     }
51
52     private static List<Class<? extends GroupCapability>> readGroupCapabilities(final ByteBuf message) {
53         final List<Class<? extends GroupCapability>> groupCapabilities = new ArrayList<>();
54         final long capabilitiesMask = message.readUnsignedInt();
55
56         final boolean gcSelectWeight = (capabilitiesMask & 1 << 0) != 0;
57         final boolean gcSelectLiveness = (capabilitiesMask & 1 << 1) != 0;
58         final boolean gcChaining = (capabilitiesMask & 1 << 2) != 0;
59         final boolean gcChainingChecks = (capabilitiesMask & 1 << 3) != 0;
60
61         if (gcSelectWeight) {
62             groupCapabilities.add(SelectWeight.class);
63         }
64         if (gcSelectLiveness) {
65             groupCapabilities.add(SelectLiveness.class);
66         }
67         if (gcChaining) {
68             groupCapabilities.add(Chaining.class);
69         }
70         if (gcChainingChecks) {
71             groupCapabilities.add(ChainingChecks.class);
72         }
73
74         return groupCapabilities;
75     }
76
77     private static List<Class<? extends GroupType>> readGroupTypes(final ByteBuf message) {
78         final List<Class<? extends GroupType>> groupTypes = new ArrayList<>();
79         final long typesMask = message.readUnsignedInt();
80
81         final boolean gtAll = (typesMask & 1 << 0) != 0;
82         final boolean gtSelect = (typesMask & 1 << 1) != 0;
83         final boolean gtIndirect = (typesMask & 1 << 2) != 0;
84         final boolean gtFF = (typesMask & 1 << 3) != 0;
85
86         if (gtAll) {
87             groupTypes.add(GroupAll.class);
88         }
89         if (gtSelect) {
90             groupTypes.add(GroupSelect.class);
91         }
92         if (gtIndirect) {
93             groupTypes.add(GroupIndirect.class);
94         }
95         if (gtFF) {
96             groupTypes.add(GroupFf.class);
97         }
98
99         return groupTypes;
100     }
101
102 }