X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=pcep%2Fbase-parser%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fprotocol%2Fpcep%2Fparser%2Fmessage%2FPCEPReplyMessageParser.java;fp=pcep%2Fbase-parser%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fprotocol%2Fpcep%2Fparser%2Fmessage%2FPCEPReplyMessageParser.java;h=ca0751d2b5e2310a1c0c1629a3fa2ea724a2682e;hb=a299e6ac11495070cbfa51162d356b49b17d7f9c;hp=e83b792618f167de8f4a703e409822476015703e;hpb=2ffa699ac3f2da2c07a7b98176b150848647b42e;p=bgpcep.git diff --git a/pcep/base-parser/src/main/java/org/opendaylight/protocol/pcep/parser/message/PCEPReplyMessageParser.java b/pcep/base-parser/src/main/java/org/opendaylight/protocol/pcep/parser/message/PCEPReplyMessageParser.java index e83b792618..ca0751d2b5 100644 --- a/pcep/base-parser/src/main/java/org/opendaylight/protocol/pcep/parser/message/PCEPReplyMessageParser.java +++ b/pcep/base-parser/src/main/java/org/opendaylight/protocol/pcep/parser/message/PCEPReplyMessageParser.java @@ -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 = 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 objects, final List errors) throws PCEPDeserializerException { - Preconditions.checkArgument(objects != null, "Passed list can't be null."); + protected Pcrep validate(final Queue objects, final List 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 objects, final List errors) + protected Replies getValidReply(final Queue objects, final List 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 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 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 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 objects) { - objects.remove(0); + private Result handleNoPath(final NoPath noPath, final Queue 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 objects) { + private Result handleEros(final Queue objects) { final SuccessBuilder builder = new SuccessBuilder(); final List 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 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 objects) { + protected void parseAttributes(final FailureCaseBuilder builder, final Queue objects) { final List 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 objects) { + protected void parsePath(final PathsBuilder builder, final Queue objects) { final List 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); }