Improve InitiatedPCInitiateMessageParser diagnostics 63/97663/2
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 28 Sep 2021 12:37:20 +0000 (14:37 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 28 Sep 2021 13:01:27 +0000 (15:01 +0200)
Unlike everywhere else we are just stomping over the object queue
here, leading to the cryptic CCE. Add a simple utility which turns
mismatches into properly-reported exceptions.

JIRA: BGPCEP-981
Change-Id: I0edcde9e285bab2926cdcc6f368db487e2b18bef
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
pcep/ietf-stateful/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated/InitiatedPCInitiateMessageParser.java

index a4809c46aa511cf6e095c1a5c7463e7e37ba6d62..4853e174feb4786ec22d272b346db6a6b5fcce73 100644 (file)
@@ -13,10 +13,12 @@ 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.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;
@@ -73,7 +75,8 @@ public class InitiatedPCInitiateMessageParser extends AbstractMessageParser {
     }
 
     @Override
-    protected Message validate(final Queue<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<>();
@@ -84,10 +87,10 @@ public class InitiatedPCInitiateMessageParser extends AbstractMessageParser {
         return new PcinitiateBuilder().setPcinitiateMessage(builder.build()).build();
     }
 
-    protected Requests getValidRequest(final Queue<Object> objects) {
+    protected Requests getValidRequest(final Queue<Object> objects) throws PCEPDeserializerException {
         final RequestsBuilder builder = new RequestsBuilder()
-            .setSrp((Srp) objects.remove())
-            .setLsp((Lsp) objects.remove());
+            .setSrp(consumeObject(objects, Srp.class))
+            .setLsp(consumeObject(objects, Lsp.class));
 
         final List<Metrics> metrics = new ArrayList<>();
         State state = State.INIT;
@@ -104,6 +107,21 @@ public class InitiatedPCInitiateMessageParser extends AbstractMessageParser {
         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) {