Improve InitiatedPCInitiateMessageParser diagnostics
[bgpcep.git] / pcep / ietf-stateful / src / main / java / org / opendaylight / protocol / pcep / ietf / initiated / InitiatedPCInitiateMessageParser.java
index acbd33e1db8833dbee1862a8bd66a01898ed0b41..4853e174feb4786ec22d272b346db6a6b5fcce73 100644 (file)
@@ -13,16 +13,19 @@ import io.netty.buffer.ByteBuf;
 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;
@@ -49,7 +52,7 @@ public class InitiatedPCInitiateMessageParser extends AbstractMessageParser {
     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()) {
@@ -65,16 +68,15 @@ public class InitiatedPCInitiateMessageParser extends AbstractMessageParser {
         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<>();
@@ -85,29 +87,41 @@ public class InitiatedPCInitiateMessageParser extends AbstractMessageParser {
         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) {