Merge "Fix checkstyle warnings for impl/datastore package"
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / protocol / deserialization / multipart / MultipartReplyMeterFeaturesDeserializer.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
9 package org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart;
10
11 import io.netty.buffer.ByteBuf;
12 import java.util.ArrayList;
13 import java.util.List;
14 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
15 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBand;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDrop;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDscpRemark;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBurst;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterCapability;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterKbps;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterPktps;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterStats;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.reply.MultipartReplyBody;
26
27 public class MultipartReplyMeterFeaturesDeserializer implements OFDeserializer<MultipartReplyBody> {
28
29     @Override
30     public MultipartReplyBody deserialize(ByteBuf message) {
31         return new MultipartReplyMeterFeaturesBuilder()
32                 .setMaxMeter(new Counter32(message.readUnsignedInt()))
33                 .setMeterBandSupported(readMeterBands(message))
34                 .setMeterCapabilitiesSupported(readMeterCapabilities(message))
35                 .setMaxBands(message.readUnsignedByte())
36                 .setMaxColor(message.readUnsignedByte())
37                 .build();
38     }
39
40     private static List<Class<? extends MeterBand>> readMeterBands(ByteBuf message) {
41         final List<Class<? extends MeterBand>> bandTypes = new ArrayList<>();
42         final long typesMask = message.readUnsignedInt();
43         final boolean mbtDrop = (typesMask & (1)) != 0;
44         final boolean mbtDscpRemark = (typesMask & (1 << 1)) != 0;
45
46         if (mbtDrop) {
47             bandTypes.add(MeterBandDrop.class);
48         }
49         if (mbtDscpRemark) {
50             bandTypes.add(MeterBandDscpRemark.class);
51         }
52
53         return bandTypes;
54     }
55
56     private static List<Class<? extends MeterCapability>> readMeterCapabilities(ByteBuf message) {
57         final List<Class<? extends MeterCapability>> meterCapabilities = new ArrayList<>();
58         final long capabilitiesMask = message.readUnsignedInt();
59
60         final boolean mfKbps = (capabilitiesMask & (1)) != 0;
61         final boolean mfPktps = (capabilitiesMask & (1 << 1)) != 0;
62         final boolean mfBurst = (capabilitiesMask & (1 << 2)) != 0;
63         final boolean mfStats = (capabilitiesMask & (1 << 3)) != 0;
64
65         if (mfKbps) {
66             meterCapabilities.add(MeterKbps.class);
67         }
68         if (mfPktps) {
69             meterCapabilities.add(MeterPktps.class);
70         }
71         if (mfBurst) {
72             meterCapabilities.add(MeterBurst.class);
73         }
74         if (mfStats) {
75             meterCapabilities.add(MeterStats.class);
76         }
77
78         return meterCapabilities;
79     }
80
81 }