Improve InitiatedPCInitiateMessageParser diagnostics 76/97676/1
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 17:23:19 +0000 (19:23 +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>
(cherry picked from commit 3895a10f1aad6ed1855cfd03e689399bfc5e8fb8)

pcep/ietf-stateful/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated/InitiatedPCInitiateMessageParser.java

index 2bc7c4429fd242d0bfab49deeec8a6c289078ae4..a46df416d1a05158e5f6089dccdaae2f2ee7830e 100644 (file)
@@ -16,6 +16,7 @@ import java.util.List;
 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;
@@ -72,7 +73,8 @@ public class InitiatedPCInitiateMessageParser extends AbstractMessageParser {
     }
 
     @Override
-    protected Message validate(final List<Object> objects, final List<Message> errors) {
+    protected Message validate(final List<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<>();
@@ -83,13 +85,10 @@ 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 List<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<>();
 
@@ -106,6 +105,21 @@ public class InitiatedPCInitiateMessageParser extends AbstractMessageParser {
         return builder.build();
     }
 
+    private static <T extends Object> T consumeObject(final List<Object> objects, final Class<T> expectedClass)
+            throws PCEPDeserializerException {
+        final Object obj;
+        try {
+            obj = objects.remove(0);
+        } catch (IndexOutOfBoundsException 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) {