import io.netty.buffer.Unpooled;
import java.util.ArrayList;
import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Queue;
import org.opendaylight.protocol.pcep.spi.AbstractMessageParser;
import org.opendaylight.protocol.pcep.spi.MessageUtil;
import org.opendaylight.protocol.pcep.spi.ObjectRegistry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev181109.Pcinitiate;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev181109.PcinitiateBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev181109.pcinitiate.message.PcinitiateMessageBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev181109.pcinitiate.message.pcinitiate.message.Requests;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev181109.pcinitiate.message.pcinitiate.message.RequestsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.object.Lsp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.srp.object.Srp;
+import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.Pcinitiate;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.PcinitiateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.pcinitiate.message.PcinitiateMessageBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.pcinitiate.message.pcinitiate.message.Requests;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.pcinitiate.message.pcinitiate.message.RequestsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.object.Lsp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.srp.object.Srp;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.Message;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.Object;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.bandwidth.object.Bandwidth;
public void serializeMessage(final Message message, final ByteBuf out) {
checkArgument(message instanceof Pcinitiate,
"Wrong instance of Message. Passed instance of %s. Need PcinitiateMessage.", message.getClass());
- final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev181109
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720
.pcinitiate.message.PcinitiateMessage init = ((Pcinitiate) message).getPcinitiateMessage();
final ByteBuf buffer = Unpooled.buffer();
for (final Requests req : init.getRequests()) {
serializeObject(req.getEro(), buffer);
serializeObject(req.getLspa(), buffer);
serializeObject(req.getBandwidth(), buffer);
- if (req.getMetrics() != null) {
- for (final Metrics m : req.getMetrics()) {
- serializeObject(m.getMetric(), buffer);
- }
+ for (final Metrics m : req.nonnullMetrics()) {
+ serializeObject(m.getMetric(), buffer);
}
serializeObject(req.getIro(), buffer);
}
@Override
- protected Message validate(final List<Object> objects, final List<Message> errors) {
+ protected Message validate(final Queue<Object> objects, final List<Message> errors)
+ throws PCEPDeserializerException {
checkArgument(objects != null, "Passed list can't be null.");
final PcinitiateMessageBuilder builder = new PcinitiateMessageBuilder();
final List<Requests> reqs = new ArrayList<>();
return new PcinitiateBuilder().setPcinitiateMessage(builder.build()).build();
}
- protected Requests getValidRequest(final List<Object> objects) {
- final RequestsBuilder builder = new RequestsBuilder();
- builder.setSrp((Srp) objects.get(0));
- objects.remove(0);
-
- builder.setLsp((Lsp) objects.get(0));
- objects.remove(0);
+ protected Requests getValidRequest(final Queue<Object> objects) throws PCEPDeserializerException {
+ final RequestsBuilder builder = new RequestsBuilder()
+ .setSrp(consumeObject(objects, Srp.class))
+ .setLsp(consumeObject(objects, Lsp.class));
final List<Metrics> metrics = new ArrayList<>();
-
- Object obj;
State state = State.INIT;
- while (!objects.isEmpty() && !state.equals(State.END)) {
- obj = objects.get(0);
+ for (Object obj = objects.peek(); obj != null; obj = objects.peek()) {
state = insertObject(state, obj, builder, metrics);
- if (!state.equals(State.END)) {
- objects.remove(0);
+ if (state == State.END) {
+ break;
}
+
+ objects.remove();
}
+
builder.setMetrics(metrics);
return builder.build();
}
+ private static <T extends Object> T consumeObject(final Queue<Object> objects, final Class<T> expectedClass)
+ throws PCEPDeserializerException {
+ final Object obj;
+ try {
+ obj = objects.remove();
+ } catch (NoSuchElementException e) {
+ throw new PCEPDeserializerException("No objects left when expecting " + expectedClass.getSimpleName(), e);
+ }
+ try {
+ return expectedClass.cast(obj);
+ } catch (ClassCastException e) {
+ throw new PCEPDeserializerException("Cannot interpret " + obj, e);
+ }
+ }
+
private static State insertObject(final State state, final Object obj, final RequestsBuilder builder,
final List<Metrics> metrics) {
switch (state) {