*/
package org.opendaylight.protocol.pcep.ietf.stateful07;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
+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 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.protocol.pcep.spi.PCEPErrors;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Pcupd;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PcupdBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.Lsp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcupd.message.PcupdMessageBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcupd.message.pcupd.message.Updates;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcupd.message.pcupd.message.UpdatesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcupd.message.pcupd.message.updates.Path;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcupd.message.pcupd.message.updates.PathBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.Srp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.bandwidth.object.Bandwidth;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.Ero;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.include.route.object.Iro;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.attributes.Metrics;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.attributes.MetricsBuilder;
-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.ietf.stateful.rev181109.Pcupd;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.PcupdBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.object.Lsp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.pcupd.message.PcupdMessageBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.pcupd.message.pcupd.message.Updates;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.pcupd.message.pcupd.message.UpdatesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.pcupd.message.pcupd.message.updates.Path;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.pcupd.message.pcupd.message.updates.PathBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.srp.object.Srp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.Message;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.Object;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.bandwidth.object.Bandwidth;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.explicit.route.object.Ero;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.include.route.object.Iro;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.lsp.attributes.Metrics;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.lsp.attributes.MetricsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.lspa.object.Lspa;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.metric.object.Metric;
/**
- * Parser for {@link Pcupd}
+ * Parser for {@link Pcupd}.
*/
public class Stateful07PCUpdateRequestMessageParser extends AbstractMessageParser {
@Override
public void serializeMessage(final Message message, final ByteBuf out) {
- Preconditions.checkArgument(message instanceof Pcupd, "Wrong instance of Message. Passed instance of %s. Need Pcupd.", message.getClass());
+ checkArgument(message instanceof Pcupd, "Wrong instance of Message. Passed instance of %s. Need Pcupd.",
+ message.getClass());
final Pcupd msg = (Pcupd) message;
final List<Updates> updates = msg.getPcupdMessage().getUpdates();
- ByteBuf buffer = Unpooled.buffer();
+ final ByteBuf buffer = Unpooled.buffer();
for (final Updates update : updates) {
serializeUpdate(update, buffer);
}
final Path p = update.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()) {
+ serializeObject(p.getLspa(), buffer);
+ serializeObject(p.getBandwidth(), buffer);
+ serializeObject(p.getReoptimizationBandwidth(), buffer);
+ if (p.getMetrics() != null) {
for (final Metrics m : p.getMetrics()) {
serializeObject(m.getMetric(), buffer);
}
}
- if (p.getIro() != null) {
- serializeObject(p.getIro(), buffer);
- }
+ serializeObject(p.getIro(), buffer);
}
}
@Override
- protected Message validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException {
- if (objects == null) {
- throw new IllegalArgumentException("Passed list can't be null.");
- }
+ protected Message validate(final List<Object> objects, final List<Message> errors)
+ throws PCEPDeserializerException {
+ checkArgument(objects != null, "Passed list can't be null.");
if (objects.isEmpty()) {
throw new PCEPDeserializerException("Pcup message cannot be empty.");
}
- final List<Updates> updateRequests = Lists.newArrayList();
+ final List<Updates> updateRequests = new ArrayList<>();
while (!objects.isEmpty()) {
final Updates upd = getValidUpdates(objects, errors);
- if(upd != null) {
+ if (upd != null) {
updateRequests.add(upd);
}
}
}
protected Updates getValidUpdates(final List<Object> objects, final List<Message> errors) {
- boolean isValid = true;
final UpdatesBuilder builder = new UpdatesBuilder();
- if (objects.get(0) instanceof Srp) {
- builder.setSrp((Srp) objects.get(0));
- objects.remove(0);
- } else {
- errors.add(createErrorMsg(PCEPErrors.SRP_MISSING));
- isValid = false;
- }
- if (objects.get(0) instanceof Lsp) {
- builder.setLsp((Lsp) objects.get(0));
- objects.remove(0);
- } else {
- errors.add(createErrorMsg(PCEPErrors.LSP_MISSING));
- 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);
+
+ Object object = objects.remove(0);
+ if (object instanceof Srp) {
+ builder.setSrp((Srp) object);
+ if (objects.isEmpty()) {
+ object = null;
} else {
- errors.add(createErrorMsg(PCEPErrors.ERO_MISSING));
- isValid = false;
+ object = objects.remove(0);
}
- parsePath(objects, pBuilder);
- builder.setPath(pBuilder.build());
+ } else {
+ errors.add(createErrorMsg(PCEPErrors.SRP_MISSING, Optional.empty()));
}
- if(isValid) {
+
+ if (validateLsp(object, errors, builder)) {
+ if (!objects.isEmpty()) {
+ if (!validatePath(objects, errors, builder)) {
+ return null;
+ }
+ }
+
return builder.build();
}
return null;
}
- private void parsePath(final List<Object> objects, final PathBuilder pBuilder) {
- final List<Metrics> pathMetrics = Lists.newArrayList();
+ private static boolean validateLsp(final Object object, final List<Message> errors, final UpdatesBuilder builder) {
+ if (object instanceof Lsp) {
+ builder.setLsp((Lsp) object);
+ } else {
+ errors.add(createErrorMsg(PCEPErrors.LSP_MISSING, Optional.empty()));
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean validatePath(final List<Object> objects, final List<Message> errors,
+ final UpdatesBuilder builder) {
+ final PathBuilder pBuilder = new PathBuilder();
+ Object object = objects.remove(0);
+ if (object instanceof Ero) {
+ pBuilder.setEro((Ero) object);
+ } else {
+ errors.add(createErrorMsg(PCEPErrors.ERO_MISSING, Optional.empty()));
+ return false;
+ }
+ parsePath(objects, pBuilder);
+ builder.setPath(pBuilder.build());
+ return true;
+ }
+
+ private static void parsePath(final List<Object> objects, final PathBuilder pathBuilder) {
+ final List<Metrics> pathMetrics = new ArrayList<>();
Object obj;
- State state = State.Init;
- while (!objects.isEmpty() && !state.equals(State.End)) {
+ State state = State.INIT;
+ while (!objects.isEmpty() && !state.equals(State.END)) {
obj = objects.get(0);
- switch (state) {
- case Init:
- state = State.LspaIn;
+ state = insertObject(state,obj, pathBuilder, pathMetrics);
+ if (!state.equals(State.END)) {
+ objects.remove(0);
+ }
+ }
+ if (!pathMetrics.isEmpty()) {
+ pathBuilder.setMetrics(pathMetrics);
+ }
+ }
+
+ private static State insertObject(final State state, final Object obj, final PathBuilder pathBuilder,
+ final List<Metrics> pathMetrics) {
+ switch (state) {
+ case INIT:
if (obj instanceof Lspa) {
- pBuilder.setLspa((Lspa) obj);
- break;
+ pathBuilder.setLspa((Lspa) obj);
+ return State.LSPA_IN;
}
- case LspaIn:
- state = State.BandwidthIn;
+ // fall through
+ case LSPA_IN:
if (obj instanceof Bandwidth) {
- pBuilder.setBandwidth((Bandwidth) obj);
- break;
+ pathBuilder.setBandwidth((Bandwidth) obj);
+ return State.LSPA_IN;
}
- case BandwidthIn:
- state = State.MetricIn;
+ if (obj instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
+ .reoptimization.bandwidth.object.ReoptimizationBandwidth) {
+ pathBuilder.setReoptimizationBandwidth((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns
+ .yang.pcep.types.rev181109.reoptimization.bandwidth.object.ReoptimizationBandwidth) obj);
+ return State.LSPA_IN;
+ }
+ // fall through
+ case BANDWIDTH_IN:
if (obj instanceof Metric) {
pathMetrics.add(new MetricsBuilder().setMetric((Metric) obj).build());
- state = State.BandwidthIn;
- break;
+ return State.BANDWIDTH_IN;
}
- case MetricIn:
- state = State.IroIn;
+ // fall through
+ case METRIC_IN:
if (obj instanceof Iro) {
- pBuilder.setIro((Iro) obj);
- break;
+ pathBuilder.setIro((Iro) obj);
+ return State.IRO_IN;
}
- case IroIn:
- state = State.End;
- break;
- case End:
- break;
- }
- if (!state.equals(State.End)) {
- objects.remove(0);
- }
- }
- if (!pathMetrics.isEmpty()) {
- pBuilder.setMetrics(pathMetrics);
+ // fall through
+ case IRO_IN:
+ case END:
+ return State.END;
+ default:
+ return state;
}
}
private enum State {
- Init, LspaIn, BandwidthIn, MetricIn, IroIn, End
+ INIT, LSPA_IN, BANDWIDTH_IN, METRIC_IN, IRO_IN, END
}
}