Fixed various small bugs found by Findbugs plugin.
[bgpcep.git] / pcep / ietf-stateful02 / src / main / java / org / opendaylight / protocol / pcep / ietf / stateful02 / Stateful02PCRequestMessageParser.java
1 /*
2  * Copyright (c) 2014 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 package org.opendaylight.protocol.pcep.ietf.stateful02;
9
10 import com.google.common.collect.Lists;
11 import io.netty.buffer.ByteBuf;
12 import java.util.List;
13 import org.opendaylight.protocol.pcep.impl.message.PCEPRequestMessageParser;
14 import org.opendaylight.protocol.pcep.spi.ObjectRegistry;
15 import org.opendaylight.protocol.pcep.spi.PCEPErrors;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.P2p1;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.P2p1Builder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.lsp.object.Lsp;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.bandwidth.object.Bandwidth;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.classtype.object.ClassType;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.exclude.route.object.Xro;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.include.route.object.Iro;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.load.balancing.object.LoadBalancing;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.attributes.Metrics;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.attributes.MetricsBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.Lspa;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.metric.object.Metric;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.object.Of;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.requests.SegmentComputation;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.requests.SegmentComputationBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.requests.segment.computation.P2p;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.requests.segment.computation.P2pBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.requests.segment.computation.p2p.ReportedRoute;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.requests.segment.computation.p2p.ReportedRouteBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.Rro;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.Rp;
39
40 /**
41  * Parser for Pcreq
42  */
43 public final class Stateful02PCRequestMessageParser extends PCEPRequestMessageParser {
44
45     public Stateful02PCRequestMessageParser(final ObjectRegistry registry) {
46         super(registry);
47     }
48
49     @Override
50     protected void serializeP2P(final ByteBuf buffer, final P2p p2p) {
51         if (p2p.getEndpointsObj() != null) {
52             serializeObject(p2p.getEndpointsObj(), buffer);
53         }
54         if (p2p.getAugmentation(P2p1.class) != null && p2p.getAugmentation(P2p1.class).getLsp() != null) {
55             serializeObject(p2p.getAugmentation(P2p1.class).getLsp(), buffer);
56         }
57         if (p2p.getReportedRoute() != null) {
58             final ReportedRoute rr = p2p.getReportedRoute();
59             if (rr.getRro() != null) {
60                 serializeObject(rr.getRro(), buffer);
61             }
62             if (rr.getBandwidth() != null) {
63                 serializeObject(rr.getBandwidth(), buffer);
64             }
65         }
66         if (p2p.getLoadBalancing() != null) {
67             serializeObject(p2p.getLoadBalancing(), buffer);
68         }
69         if (p2p.getLspa() != null) {
70             serializeObject(p2p.getLspa(), buffer);
71         }
72         if (p2p.getBandwidth() != null) {
73             serializeObject(p2p.getBandwidth(), buffer);
74         }
75         if (p2p.getMetrics() != null) {
76             for (final Metrics m : p2p.getMetrics()) {
77                 serializeObject(m.getMetric(), buffer);
78             }
79         }
80         if (p2p.getIro() != null) {
81             serializeObject(p2p.getIro(), buffer);
82         }
83         if (p2p.getRro() != null) {
84             serializeObject(p2p.getRro(), buffer);
85         }
86         if (p2p.getXro() != null) {
87             serializeObject(p2p.getXro(), buffer);
88         }
89         if (p2p.getOf() != null) {
90             serializeObject(p2p.getOf(), buffer);
91         }
92         if (p2p.getClassType() != null) {
93             serializeObject(p2p.getClassType(), buffer);
94         }
95     }
96
97     @Override
98     protected SegmentComputation getSegmentComputation(final P2pBuilder builder, final List<Object> objects, final List<Message> errors,
99             final Rp rp) {
100         final List<Metrics> metrics = Lists.newArrayList();
101
102         State state = State.Init;
103         while (!objects.isEmpty() && state != State.End) {
104             Object obj = objects.get(0);
105
106             switch (state) {
107             case Init:
108                 state = State.LspIn;
109                 if (obj instanceof Lsp) {
110                     builder.addAugmentation(P2p1.class, new P2p1Builder().setLsp((Lsp) obj).build());
111                     break;
112                 }
113             case LspIn:
114                 state = State.ReportedIn;
115                 if (obj instanceof Rro) {
116                     final ReportedRouteBuilder rrBuilder = new ReportedRouteBuilder();
117                     rrBuilder.setRro((Rro) obj);
118                     objects.remove(0);
119                     obj = objects.get(0);
120                     if (obj instanceof Bandwidth) {
121                         rrBuilder.setBandwidth((Bandwidth) obj);
122                     }
123                     break;
124                 }
125             case ReportedIn:
126                 state = State.LoadBIn;
127                 if (obj instanceof LoadBalancing) {
128                     builder.setLoadBalancing((LoadBalancing) obj);
129                     break;
130                 }
131             case LoadBIn:
132                 state = State.LspaIn;
133                 if (obj instanceof Lspa) {
134                     builder.setLspa((Lspa) obj);
135                     break;
136                 }
137             case LspaIn:
138                 state = State.BandwidthIn;
139                 if (obj instanceof Bandwidth) {
140                     builder.setBandwidth((Bandwidth) obj);
141                     break;
142                 }
143             case BandwidthIn:
144                 state = State.MetricIn;
145                 if (obj instanceof Metric) {
146                     metrics.add(new MetricsBuilder().setMetric((Metric) obj).build());
147                     state = State.BandwidthIn;
148                     break;
149                 }
150             case MetricIn:
151                 state = State.IroIn;
152                 if (obj instanceof Iro) {
153                     builder.setIro((Iro) obj);
154                     break;
155                 }
156             case IroIn:
157                 state = State.RroIn;
158                 if (obj instanceof Rro) {
159                     builder.setRro((Rro) obj);
160                     break;
161                 }
162             case RroIn:
163                 state = State.XroIn;
164                 if (obj instanceof Xro) {
165                     builder.setXro((Xro) obj);
166                     break;
167                 }
168             case XroIn:
169                 state = State.OfIn;
170                 if (obj instanceof Of) {
171                     builder.setOf((Of) obj);
172                     break;
173                 }
174             case OfIn:
175                 state = State.CtIn;
176                 if (obj instanceof ClassType) {
177                     final ClassType classType = (ClassType) obj;
178                     if (!classType.isProcessingRule()) {
179                         errors.add(createErrorMsg(PCEPErrors.P_FLAG_NOT_SET, rp));
180                     } else {
181                         builder.setClassType(classType);
182                     }
183                     break;
184                 }
185             case CtIn:
186                 state = State.End;
187                 break;
188             case End:
189                 break;
190             }
191             if (!state.equals(State.End)) {
192                 objects.remove(0);
193             }
194         }
195         if (!metrics.isEmpty()) {
196             builder.setMetrics(metrics);
197         }
198
199         if (rp.isReoptimization()
200                 && builder.getBandwidth() != null
201                 && builder.getReportedRoute().getBandwidth().getBandwidth() != new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.Bandwidth(new byte[] { 0 })
202                 && builder.getReportedRoute().getRro() == null) {
203             errors.add(createErrorMsg(PCEPErrors.RRO_MISSING, rp));
204             return null;
205         }
206         return new SegmentComputationBuilder().setP2p(builder.build()).build();
207     }
208
209     private enum State {
210         Init, LspIn, ReportedIn, LoadBIn, LspaIn, BandwidthIn, MetricIn, IroIn, RroIn, XroIn, OfIn, CtIn, End
211     }
212 }