Bug-731: PCEPErrors enum with error-type and error-value
[bgpcep.git] / pcep / ietf-stateful07 / src / main / java / org / opendaylight / protocol / pcep / ietf / stateful07 / Stateful07PCReportMessageParser.java
index 9e47f20610f9f9e9da0e29dcd8ed549ae9f6be1f..3b75c77a29d0ce5120c9adad986526ef708a0322 100644 (file)
@@ -7,14 +7,12 @@
  */
 package org.opendaylight.protocol.pcep.ietf.stateful07;
 
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
-
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
-
 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;
@@ -39,11 +37,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.Lspa;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.metric.object.Metric;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.Rro;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.Rp;
 
 /**
  * Parser for {@link Pcrpt}
  */
-public final class Stateful07PCReportMessageParser extends AbstractMessageParser {
+public class Stateful07PCReportMessageParser extends AbstractMessageParser {
 
     public static final int TYPE = 10;
 
@@ -58,33 +57,37 @@ public final class Stateful07PCReportMessageParser extends AbstractMessageParser
         final List<Reports> reports = msg.getPcrptMessage().getReports();
         ByteBuf buffer = Unpooled.buffer();
         for (final Reports report : reports) {
-            if (report.getSrp() != null) {
-                serializeObject(report.getSrp(), buffer);
+            serializeReport(report, buffer);
+        }
+        MessageUtil.formatMessage(TYPE, buffer, out);
+    }
+
+    protected void serializeReport(final Reports report, final ByteBuf buffer) {
+        if (report.getSrp() != null) {
+            serializeObject(report.getSrp(), buffer);
+        }
+        serializeObject(report.getLsp(), buffer);
+        final Path p = report.getPath();
+        if (p != null) {
+            serializeObject(p.getEro(), buffer);
+            if (p.getLspa() != null) {
+                serializeObject(p.getLspa(), buffer);
             }
-            serializeObject(report.getLsp(), buffer);
-            final Path p = report.getPath();
-            if (p != null) {
-                serializeObject(p.getEro(), buffer);
-                if (p.getLspa() != null) {
-                    serializeObject(p.getLspa(), buffer);
-                }
-                if (p.getBandwidth() != null) {
-                    serializeObject(p.getBandwidth(), buffer);
-                }
-                if (p.getMetrics() != null && !p.getMetrics().isEmpty()) {
-                    for (final Metrics m : p.getMetrics()) {
-                        serializeObject(m.getMetric(), buffer);
-                    }
-                }
-                if (p.getIro() != null) {
-                    serializeObject(p.getIro(), buffer);
-                }
-                if (p.getRro() != null) {
-                    serializeObject(p.getRro(), buffer);
+            if (p.getBandwidth() != null) {
+                serializeObject(p.getBandwidth(), buffer);
+            }
+            if (p.getMetrics() != null && !p.getMetrics().isEmpty()) {
+                for (final Metrics m : p.getMetrics()) {
+                    serializeObject(m.getMetric(), buffer);
                 }
             }
+            if (p.getIro() != null) {
+                serializeObject(p.getIro(), buffer);
+            }
+            if (p.getRro() != null) {
+                serializeObject(p.getRro(), buffer);
+            }
         }
-        MessageUtil.formatMessage(TYPE, buffer, out);
     }
 
     @Override
@@ -100,14 +103,15 @@ public final class Stateful07PCReportMessageParser extends AbstractMessageParser
 
         while (!objects.isEmpty()) {
             final Reports report = getValidReports(objects, errors);
-            if (reports != null) {
+            if (report != null) {
                 reports.add(report);
             }
         }
         return new PcrptBuilder().setPcrptMessage(new PcrptMessageBuilder().setReports(reports).build()).build();
     }
 
-    private Reports getValidReports(final List<Object> objects, final List<Message> errors) {
+    protected Reports getValidReports(final List<Object> objects, final List<Message> errors) {
+        boolean isValid = true;
         final ReportsBuilder builder = new ReportsBuilder();
         if (objects.get(0) instanceof Srp) {
             builder.setSrp((Srp) objects.get(0));
@@ -117,15 +121,25 @@ public final class Stateful07PCReportMessageParser extends AbstractMessageParser
             builder.setLsp((Lsp) objects.get(0));
             objects.remove(0);
         } else {
-            errors.add(createErrorMsg(PCEPErrors.LSP_MISSING));
-            return null;
+            errors.add(createErrorMsg(PCEPErrors.LSP_MISSING, Optional.<Rp>absent()));
+            isValid = false;
         }
         if (!objects.isEmpty()) {
             final PathBuilder pBuilder = new PathBuilder();
+            if (objects.get(0) instanceof Ero) {
+                pBuilder.setEro((Ero) objects.get(0));
+                objects.remove(0);
+            } else {
+                errors.add(createErrorMsg(PCEPErrors.ERO_MISSING, Optional.<Rp>absent()));
+                isValid = false;
+            }
             parsePath(objects, pBuilder);
             builder.setPath(pBuilder.build());
         }
-        return builder.build();
+        if(isValid) {
+            return builder.build();
+        }
+        return null;
     }
 
     private void parsePath(final List<Object> objects, final PathBuilder builder) {
@@ -136,12 +150,6 @@ public final class Stateful07PCReportMessageParser extends AbstractMessageParser
             obj = objects.get(0);
             switch (state) {
             case Init:
-                state = State.EroIn;
-                if (obj instanceof Ero) {
-                    builder.setEro((Ero) obj);
-                    break;
-                }
-            case EroIn:
                 state = State.LspaIn;
                 if (obj instanceof Lspa) {
                     builder.setLspa((Lspa) obj);
@@ -188,6 +196,6 @@ public final class Stateful07PCReportMessageParser extends AbstractMessageParser
     }
 
     private enum State {
-        Init, EroIn, LspaIn, BandwidthIn, MetricIn, IroIn, RroIn, End
+        Init, LspaIn, BandwidthIn, MetricIn, IroIn, RroIn, End
     }
 }