+ public Message validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException {
+ if (objects == null) {
+ throw new IllegalArgumentException("Passed list can't be null.");
+ }
+ if (objects.isEmpty()) {
+ throw new PCEPDeserializerException("Pcrpt message cannot be empty.");
+ }
+
+ final List<Reports> reports = Lists.newArrayList();
+
+ while (!objects.isEmpty()) {
+ final Reports report = getValidReports(objects, errors);
+ if (reports != 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) {
+ final ReportsBuilder builder = new ReportsBuilder();
+ if (objects.get(0) instanceof Srp) {
+ builder.setSrp((Srp) objects.get(0));
+ objects.remove(0);
+ }
+ if (objects.get(0) instanceof Lsp) {
+ builder.setLsp((Lsp) objects.get(0));
+ objects.remove(0);
+ } else {
+ errors.add(createErrorMsg(PCEPErrors.LSP_MISSING));
+ return null;
+ }
+ if (!objects.isEmpty()) {
+ final PathBuilder pBuilder = new PathBuilder();
+ parsePath(objects, pBuilder);
+ builder.setPath(pBuilder.build());
+ }
+ return builder.build();
+ }
+
+ private void parsePath(final List<Object> objects, final PathBuilder builder) {
+ final List<Metrics> pathMetrics = Lists.newArrayList();
+ Object obj;
+ State state = State.Init;
+ while (!objects.isEmpty() && !state.equals(State.End)) {
+ 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);
+ break;
+ }
+ case LspaIn:
+ state = State.BandwidthIn;
+ if (obj instanceof Bandwidth) {
+ builder.setBandwidth((Bandwidth) obj);
+ break;
+ }
+ case BandwidthIn:
+ state = State.MetricIn;
+ if (obj instanceof Metric) {
+ pathMetrics.add(new MetricsBuilder().setMetric((Metric) obj).build());
+ state = State.BandwidthIn;
+ break;
+ }
+ case MetricIn:
+ state = State.IroIn;
+ if (obj instanceof Iro) {
+ builder.setIro((Iro) obj);
+ break;
+ }
+ case IroIn:
+ state = State.RroIn;
+ if (obj instanceof Rro) {
+ builder.setRro((Rro) obj);
+ break;
+ }
+ case RroIn:
+ state = State.End;
+ break;
+ case End:
+ break;
+ }
+ if (!state.equals(State.End)) {
+ objects.remove(0);
+ }
+ }
+ if (!pathMetrics.isEmpty()) {
+ builder.setMetrics(pathMetrics);
+ }
+ }
+
+ private enum State {
+ Init, EroIn, LspaIn, BandwidthIn, MetricIn, IroIn, RroIn, End