Redefine AbstractMessageParser object parsing
[bgpcep.git] / pcep / base-parser / src / main / java / org / opendaylight / protocol / pcep / parser / message / PCEPReplyMessageParser.java
index e83b792618f167de8f4a703e409822476015703e..ca0751d2b5e2310a1c0c1629a3fa2ea724a2682e 100644 (file)
@@ -7,12 +7,14 @@
  */
 package org.opendaylight.protocol.pcep.parser.message;
 
-import com.google.common.base.Preconditions;
+import static com.google.common.base.Preconditions.checkArgument;
+
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.Queue;
 import org.opendaylight.protocol.pcep.parser.util.Util;
 import org.opendaylight.protocol.pcep.spi.AbstractMessageParser;
 import org.opendaylight.protocol.pcep.spi.MessageUtil;
@@ -64,14 +66,15 @@ public class PCEPReplyMessageParser extends AbstractMessageParser {
 
     @Override
     public void serializeMessage(final Message message, final ByteBuf out) {
-        Preconditions.checkArgument(message instanceof Pcrep,
+        checkArgument(message instanceof Pcrep,
                 "Wrong instance of Message. Passed instance of %s. Need Pcrep.", message.getClass());
         final PcrepMessage repMsg = ((Pcrep) message).getPcrepMessage();
-        Preconditions.checkArgument(repMsg.getReplies() != null && !repMsg.getReplies().isEmpty(),
-                "Replies cannot be null or empty.");
+        final List<Replies> replies = repMsg.nonnullReplies();
+
+        checkArgument(!replies.isEmpty(), "Replies cannot be null or empty.");
         final ByteBuf buffer = Unpooled.buffer();
-        for (final Replies reply : repMsg.getReplies()) {
-            Preconditions.checkArgument(reply.getRp() != null, "Reply must contain RP object.");
+        for (final Replies reply : replies) {
+            checkArgument(reply.getRp() != null, "Reply must contain RP object.");
             serializeReply(reply, buffer);
         }
         MessageUtil.formatMessage(TYPE, buffer, out);
@@ -136,15 +139,15 @@ public class PCEPReplyMessageParser extends AbstractMessageParser {
     }
 
     protected void serializeMetricPce(final MetricPce metricPce, final ByteBuf buffer) {
-        Preconditions.checkArgument(metricPce.getPceId() != null, "PCE-ID must be present.");
+        checkArgument(metricPce.getPceId() != null, "PCE-ID must be present.");
         serializeObject(metricPce.getPceId(), buffer);
         serializeObject(metricPce.getProcTime(), buffer);
         serializeObject(metricPce.getOverload(), buffer);
     }
 
     @Override
-    protected Pcrep validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException {
-        Preconditions.checkArgument(objects != null, "Passed list can't be null.");
+    protected Pcrep validate(final Queue<Object> objects, final List<Message> errors) throws PCEPDeserializerException {
+        checkArgument(objects != null, "Passed list can't be null.");
         if (objects.isEmpty()) {
             throw new PCEPDeserializerException("Pcrep message cannot be empty.");
         }
@@ -161,63 +164,74 @@ public class PCEPReplyMessageParser extends AbstractMessageParser {
         return new PcrepBuilder().setPcrepMessage(new PcrepMessageBuilder().setReplies(replies).build()).build();
     }
 
-    protected Replies getValidReply(final List<Object> objects, final List<Message> errors)
+    protected Replies getValidReply(final Queue<Object> objects, final List<Message> errors)
             throws PCEPDeserializerException {
-        Object object = objects.remove(0);
-        if (!(object instanceof Rp)) {
+        Object obj = objects.remove();
+        if (!(obj instanceof Rp)) {
             errors.add(createErrorMsg(PCEPErrors.RP_MISSING, Optional.empty()));
             return null;
         }
-        final Rp rp = (Rp) object;
-        final RepliesBuilder repliesBuilder = new RepliesBuilder();
-        if (!objects.isEmpty() && objects.get(0) instanceof Monitoring) {
-            repliesBuilder.setMonitoring((Monitoring) objects.get(0));
-            objects.remove(0);
+
+        final RepliesBuilder repliesBuilder = new RepliesBuilder().setRp((Rp) obj);
+        obj = objects.peek();
+        if (obj instanceof Monitoring) {
+            repliesBuilder.setMonitoring((Monitoring) obj);
+            objects.remove();
+            obj = objects.peek();
         }
-        if (!objects.isEmpty() && objects.get(0) instanceof PccIdReq) {
-            repliesBuilder.setPccIdReq((PccIdReq) objects.get(0));
-            objects.remove(0);
+        if (obj instanceof PccIdReq) {
+            repliesBuilder.setPccIdReq((PccIdReq) obj);
+            objects.remove();
+            // last option, no need to peek
         }
+
+        // note: this may modify 'objects'
         final List<VendorInformationObject> vendorInfo = addVendorInformationObjects(objects);
-        Result res = null;
-        if (!objects.isEmpty()) {
-            if (objects.get(0) instanceof NoPath) {
-                res = handleNoPath((NoPath) objects.get(0), objects);
-            } else if (objects.get(0) instanceof Ero) {
-                res = handleEros(objects);
-            }
+        if (!vendorInfo.isEmpty()) {
+            repliesBuilder.setVendorInformationObject(vendorInfo);
         }
-        final List<MetricPce> metricPceList = new ArrayList<>();
-        if (!objects.isEmpty() && objects.get(0) instanceof PceId) {
+
+        final Result res;
+        obj = objects.peek();
+        if (obj instanceof NoPath) {
+            objects.remove();
+            res = handleNoPath((NoPath) obj, objects);
+        } else if (obj instanceof Ero) {
+            res = handleEros(objects);
+        } else {
+            res = null;
+        }
+
+        if (objects.peek() instanceof PceId) {
+            final List<MetricPce> metricPceList = new ArrayList<>();
             while (!objects.isEmpty()) {
                 metricPceList.add(Util.validateMonitoringMetrics(objects));
             }
+            if (!metricPceList.isEmpty()) {
+                repliesBuilder.setMetricPce(metricPceList);
+            }
         }
-        if (!vendorInfo.isEmpty()) {
-            repliesBuilder.setVendorInformationObject(vendorInfo);
-        }
-        if (!metricPceList.isEmpty()) {
-            repliesBuilder.setMetricPce(metricPceList);
-        }
-        return repliesBuilder.setRp(rp).setResult(res).build();
+
+        return repliesBuilder.setResult(res).build();
     }
 
-    private Result handleNoPath(final NoPath noPath, final List<Object> objects) {
-        objects.remove(0);
+    private Result handleNoPath(final NoPath noPath, final Queue<Object> objects) {
         final FailureCaseBuilder builder = new FailureCaseBuilder().setNoPath(noPath);
-        while (!objects.isEmpty() && !(objects.get(0) instanceof PceId)) {
+        for (Object obj = objects.peek(); obj != null && !(obj instanceof PceId); obj = objects.peek()) {
             this.parseAttributes(builder, objects);
         }
         return builder.build();
     }
 
-    private Result handleEros(final List<Object> objects) {
+    private Result handleEros(final Queue<Object> objects) {
         final SuccessBuilder builder = new SuccessBuilder();
         final List<Paths> paths = new ArrayList<>();
-        while (!objects.isEmpty() && !(objects.get(0) instanceof PceId)) {
+
+        for (Object obj = objects.peek(); obj != null && !(obj instanceof PceId); obj = objects.peek()) {
             final PathsBuilder pBuilder = new PathsBuilder();
-            if (objects.get(0) instanceof Ero) {
-                pBuilder.setEro((Ero ) objects.remove(0));
+            if (obj instanceof Ero) {
+                pBuilder.setEro((Ero) obj);
+                objects.remove();
             }
             final List<VendorInformationObject> vendorInfoObjects = addVendorInformationObjects(objects);
             if (!vendorInfoObjects.isEmpty()) {
@@ -230,17 +244,17 @@ public class PCEPReplyMessageParser extends AbstractMessageParser {
         return new SuccessCaseBuilder().setSuccess(builder.build()).build();
     }
 
-    protected void parseAttributes(final FailureCaseBuilder builder, final List<Object> objects) {
+    protected void parseAttributes(final FailureCaseBuilder builder, final Queue<Object> objects) {
         final List<Metrics> pathMetrics = 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, pathMetrics);
-            if (!state.equals(State.END)) {
-                objects.remove(0);
+            if (state == State.END) {
+                break;
             }
+
+            objects.remove();
         }
         if (!pathMetrics.isEmpty()) {
             builder.setMetrics(pathMetrics);
@@ -323,18 +337,19 @@ public class PCEPReplyMessageParser extends AbstractMessageParser {
         }
     }
 
-    protected void parsePath(final PathsBuilder builder, final List<Object> objects) {
+    protected void parsePath(final PathsBuilder builder, final Queue<Object> objects) {
         final List<Metrics> pathMetrics = 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, pathMetrics);
-            if (!state.equals(State.END)) {
-                objects.remove(0);
+            if (state == State.END) {
+                break;
             }
+
+            objects.remove();
         }
+
         if (!pathMetrics.isEmpty()) {
             builder.setMetrics(pathMetrics);
         }