Bug 4921 - Support Bandwidth Usage object
[bgpcep.git] / pcep / auto-bandwidth-extension / src / main / java / org / opendaylight / protocol / pcep / auto / bandwidth / extension / PcRptMessageCodec.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. 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.protocol.pcep.auto.bandwidth.extension;
10
11 import com.google.common.base.Optional;
12 import com.google.common.base.Predicates;
13 import com.google.common.collect.Iterables;
14 import io.netty.buffer.ByteBuf;
15 import java.util.List;
16 import org.opendaylight.protocol.pcep.ietf.stateful07.Stateful07PCReportMessageParser;
17 import org.opendaylight.protocol.pcep.spi.ObjectRegistry;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.auto.bandwidth.rev160109.Bandwidth1;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.auto.bandwidth.rev160109.Bandwidth1Builder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.auto.bandwidth.rev160109.bandwidth.usage.object.BandwidthUsage;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.auto.bandwidth.rev160109.bandwidth.usage.object.BandwidthUsageBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.pcrpt.message.Reports;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.pcrpt.message.ReportsBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.pcrpt.message.reports.Path;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.pcrpt.message.reports.PathBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.bandwidth.object.Bandwidth;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.bandwidth.object.BandwidthBuilder;
30
31 public class PcRptMessageCodec extends Stateful07PCReportMessageParser {
32
33     public PcRptMessageCodec(final ObjectRegistry registry) {
34         super(registry);
35     }
36
37     @Override
38     protected Reports getValidReports(final List<Object> objects, final List<Message> errors) {
39         final Reports validReports = super.getValidReports(objects, errors);
40         final Optional<Object> find = Iterables.tryFind(objects, Predicates.instanceOf(BandwidthUsage.class));
41         final Path path = validReports.getPath();
42         if (find.isPresent() && path != null) {
43             final Object object = find.get();
44             objects.remove(object);
45             return new ReportsBuilder(validReports).setPath(new PathBuilder(path).setBandwidth(
46                     setBandwidthUsage(path.getBandwidth(), (BandwidthUsage) object)).build()).build();
47         }
48         return validReports;
49     }
50
51     @Override
52     protected void serializeObject(final Object object, final ByteBuf buffer) {
53         super.serializeObject(object, buffer);
54         if (object instanceof Bandwidth) {
55             final Bandwidth1 bw = ((Bandwidth) object).getAugmentation(Bandwidth1.class);
56             if (bw != null) {
57                 super.serializeObject(new BandwidthUsageBuilder().setBwSample(bw.getBwSample()).build(), buffer);
58             }
59
60         }
61     }
62
63     private static Bandwidth setBandwidthUsage(final Bandwidth bandwidth, final BandwidthUsage bwUsage) {
64         final BandwidthBuilder bandwidthBuilder;
65         if (bandwidth != null) {
66             bandwidthBuilder = new BandwidthBuilder(bandwidth);
67         } else {
68             bandwidthBuilder = new BandwidthBuilder();
69         }
70         bandwidthBuilder.addAugmentation(Bandwidth1.class, new Bandwidth1Builder().setBwSample(bwUsage.getBwSample()).build()).build();
71         return bandwidthBuilder.build();
72     }
73
74 }