*/
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;
@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);
}
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.");
}
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()) {
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);
}
}
- 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);
}