Rename stateful07 handlers
[bgpcep.git] / pcep / ietf-stateful07 / src / main / java / org / opendaylight / protocol / pcep / ietf / stateful07 / Stateful07PCReportMessageParser.java
1 /*
2  * Copyright (c) 2013 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.stateful07;
9
10 import io.netty.buffer.ByteBuf;
11
12 import java.util.List;
13
14 import org.opendaylight.protocol.pcep.spi.AbstractMessageParser;
15 import org.opendaylight.protocol.pcep.spi.ObjectHandlerRegistry;
16 import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
17 import org.opendaylight.protocol.pcep.spi.PCEPErrors;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Pcrpt;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PcrptBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.Lsp;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.PcrptMessageBuilder;
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.ietf.stateful.rev131222.srp.object.Srp;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.bandwidth.object.Bandwidth;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.Ero;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.include.route.object.Iro;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.attributes.Metrics;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.attributes.MetricsBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.Lspa;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.metric.object.Metric;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.Rro;
37
38 import com.google.common.collect.Lists;
39
40 /**
41  * Parser for {@link Pcrpt}
42  */
43 public class Stateful07PCReportMessageParser extends AbstractMessageParser {
44
45         public static final int TYPE = 10;
46
47         public Stateful07PCReportMessageParser(final ObjectHandlerRegistry registry) {
48                 super(registry);
49         }
50
51         @Override
52         public void serializeMessage(final Message message, final ByteBuf buffer) {
53                 if (!(message instanceof Pcrpt)) {
54                         throw new IllegalArgumentException("Wrong instance of Message. Passed instance of " + message.getClass()
55                                         + ". Nedded PcrptMessage.");
56                 }
57                 final Pcrpt msg = (Pcrpt) message;
58                 final List<Reports> reports = msg.getPcrptMessage().getReports();
59                 for (final Reports report : reports) {
60                         if (report.getSrp() != null) {
61                                 buffer.writeBytes(serializeObject(report.getSrp()));
62                         }
63                         buffer.writeBytes(serializeObject(report.getLsp()));
64                         final Path p = report.getPath();
65                         if (p != null) {
66                                 buffer.writeBytes(serializeObject(p.getEro()));
67                                 if (p.getLspa() != null) {
68                                         buffer.writeBytes(serializeObject(p.getLspa()));
69                                 }
70                                 if (p.getBandwidth() != null) {
71                                         buffer.writeBytes(serializeObject(p.getBandwidth()));
72                                 }
73                                 if (p.getMetrics() != null && !p.getMetrics().isEmpty()) {
74                                         for (final Metrics m : p.getMetrics()) {
75                                                 buffer.writeBytes(serializeObject(m.getMetric()));
76                                         }
77                                 }
78                                 if (p.getIro() != null) {
79                                         buffer.writeBytes(serializeObject(p.getIro()));
80                                 }
81                                 if (p.getRro() != null) {
82                                         buffer.writeBytes(serializeObject(p.getRro()));
83                                 }
84                         }
85                 }
86         }
87
88         @Override
89         public Message validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException {
90                 if (objects == null) {
91                         throw new IllegalArgumentException("Passed list can't be null.");
92                 }
93                 if (objects.isEmpty()) {
94                         throw new PCEPDeserializerException("Pcrpt message cannot be empty.");
95                 }
96
97                 final List<Reports> reports = Lists.newArrayList();
98
99                 while (!objects.isEmpty()) {
100                         final Reports report = getValidReports(objects, errors);
101                         if (reports != null) {
102                                 reports.add(report);
103                         }
104                 }
105                 return new PcrptBuilder().setPcrptMessage(new PcrptMessageBuilder().setReports(reports).build()).build();
106         }
107
108         private Reports getValidReports(final List<Object> objects, final List<Message> errors) {
109                 final ReportsBuilder builder = new ReportsBuilder();
110                 if (objects.get(0) instanceof Srp) {
111                         builder.setSrp((Srp) objects.get(0));
112                         objects.remove(0);
113                 }
114                 if (objects.get(0) instanceof Lsp) {
115                         builder.setLsp((Lsp) objects.get(0));
116                         objects.remove(0);
117                 } else {
118                         errors.add(createErrorMsg(PCEPErrors.LSP_MISSING));
119                         return null;
120                 }
121                 if (!objects.isEmpty()) {
122                         final PathBuilder pBuilder = new PathBuilder();
123                         parsePath(objects, pBuilder);
124                         builder.setPath(pBuilder.build());
125                 }
126                 return builder.build();
127         }
128
129         private void parsePath(final List<Object> objects, final PathBuilder builder) {
130                 final List<Metrics> pathMetrics = Lists.newArrayList();
131                 Object obj;
132                 State state = State.Init;
133                 while (!objects.isEmpty() && !state.equals(State.End)) {
134                         obj = objects.get(0);
135                         switch (state) {
136                         case Init:
137                                 state = State.EroIn;
138                                 if (obj instanceof Ero) {
139                                         builder.setEro((Ero) obj);
140                                         break;
141                                 }
142                         case EroIn:
143                                 state = State.LspaIn;
144                                 if (obj instanceof Lspa) {
145                                         builder.setLspa((Lspa) obj);
146                                         break;
147                                 }
148                         case LspaIn:
149                                 state = State.BandwidthIn;
150                                 if (obj instanceof Bandwidth) {
151                                         builder.setBandwidth((Bandwidth) obj);
152                                         break;
153                                 }
154                         case BandwidthIn:
155                                 state = State.MetricIn;
156                                 if (obj instanceof Metric) {
157                                         pathMetrics.add(new MetricsBuilder().setMetric((Metric) obj).build());
158                                         state = State.BandwidthIn;
159                                         break;
160                                 }
161                         case MetricIn:
162                                 state = State.IroIn;
163                                 if (obj instanceof Iro) {
164                                         builder.setIro((Iro) obj);
165                                         break;
166                                 }
167                         case IroIn:
168                                 state = State.RroIn;
169                                 if (obj instanceof Rro) {
170                                         builder.setRro((Rro) obj);
171                                         break;
172                                 }
173                         case RroIn:
174                                 state = State.End;
175                                 break;
176                         case End:
177                                 break;
178                         }
179                         if (!state.equals(State.End)) {
180                                 objects.remove(0);
181                         }
182                 }
183                 if (!pathMetrics.isEmpty()) {
184                         builder.setMetrics(pathMetrics);
185                 }
186         }
187
188         private enum State {
189                 Init, EroIn, LspaIn, BandwidthIn, MetricIn, IroIn, RroIn, End
190         }
191
192         @Override
193         public int getMessageType() {
194                 return TYPE;
195         }
196 }