4ea0f233c3eddb7f943e247fd56683ac0eedc8e9
[bgpcep.git] / pcep / ietf-stateful02 / src / main / java / org / opendaylight / protocol / pcep / crabbe / initiated00 / PcinitiateMessageParser.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.protocol.pcep.crabbe.initiated00;
9
10 import com.google.common.base.Preconditions;
11 import com.google.common.collect.Lists;
12
13 import io.netty.buffer.ByteBuf;
14 import io.netty.buffer.Unpooled;
15
16 import java.util.List;
17
18 import org.opendaylight.protocol.pcep.spi.AbstractMessageParser;
19 import org.opendaylight.protocol.pcep.spi.MessageUtil;
20 import org.opendaylight.protocol.pcep.spi.ObjectRegistry;
21 import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Pcinitiate;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.PcinitiateBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.pcinitiate.message.PcinitiateMessageBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.pcinitiate.message.pcinitiate.message.Requests;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.pcinitiate.message.pcinitiate.message.RequestsBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.bandwidth.object.Bandwidth;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.object.EndpointsObj;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.Ero;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.attributes.Metrics;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.attributes.MetricsBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.Lspa;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.metric.object.Metric;
36
37 /**
38  * Parser for {@link Pcinitiate}
39  */
40 public class PcinitiateMessageParser extends AbstractMessageParser {
41     public static final int TYPE = 12;
42
43     public PcinitiateMessageParser(final ObjectRegistry registry) {
44         super(registry);
45     }
46
47     @Override
48     public void serializeMessage(final Message message, final ByteBuf out) {
49         Preconditions.checkArgument(message instanceof Pcinitiate, "Wrong instance of Message. Passed instance of %s. Need Pcinitiate.", message.getClass());
50         final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.pcinitiate.message.PcinitiateMessage init = ((Pcinitiate) message).getPcinitiateMessage();
51         ByteBuf buffer = Unpooled.buffer();
52         for (final Requests req : init.getRequests()) {
53             serializeObject(req.getEndpointsObj(), buffer);
54             serializeObject(req.getLspa(), buffer);
55             if (req.getEro() != null) {
56                 serializeObject(req.getEro(), buffer);
57             }
58             if (req.getBandwidth() != null) {
59                 serializeObject(req.getBandwidth(), buffer);
60             }
61             if (req.getMetrics() != null && !req.getMetrics().isEmpty()) {
62                 for (final Metrics m : req.getMetrics()) {
63                     serializeObject(m.getMetric(), buffer);
64                 }
65             }
66         }
67         MessageUtil.formatMessage(TYPE, buffer, out);
68     }
69
70     @Override
71     protected Message validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException {
72         if (objects == null) {
73             throw new IllegalArgumentException("Passed list can't be null.");
74         }
75         final PcinitiateMessageBuilder builder = new PcinitiateMessageBuilder();
76         final List<Requests> reqs = Lists.newArrayList();
77         Requests req = null;
78         while (!objects.isEmpty()) {
79             req = this.getValidRequest(objects);
80             if (req == null) {
81                 break;
82             }
83             reqs.add(req);
84         }
85         builder.setRequests(reqs);
86         return new PcinitiateBuilder().setPcinitiateMessage(builder.build()).build();
87     }
88
89     private Requests getValidRequest(final List<Object> objects) {
90         final RequestsBuilder builder = new RequestsBuilder();
91         builder.setEndpointsObj((EndpointsObj) objects.get(0));
92         objects.remove(0);
93
94         builder.setLspa((Lspa) objects.get(0));
95         objects.remove(0);
96         final List<Metrics> metrics = Lists.newArrayList();
97
98         Object obj;
99         State state = State.Init;
100         while (!objects.isEmpty() && !state.equals(State.End)) {
101             obj = objects.get(0);
102
103             switch (state) {
104             case Init:
105                 state = State.EroIn;
106                 if (obj instanceof Ero) {
107                     builder.setEro((Ero) obj);
108                     break;
109                 }
110             case EroIn:
111                 state = State.BandwidthIn;
112                 if (obj instanceof Bandwidth) {
113                     builder.setBandwidth((Bandwidth) obj);
114                     break;
115                 }
116             case BandwidthIn:
117                 state = State.MetricIn;
118                 if (obj instanceof Metric) {
119                     metrics.add(new MetricsBuilder().setMetric((Metric) obj).build());
120                     state = State.BandwidthIn;
121                     break;
122                 }
123             case MetricIn:
124                 state = State.End;
125                 break;
126             case End:
127                 break;
128             }
129             if (!state.equals(State.End)) {
130                 objects.remove(0);
131             }
132         }
133         builder.setMetrics(metrics);
134         return builder.build();
135     }
136
137     private enum State {
138         Init, EroIn, BandwidthIn, MetricIn, End
139     }
140 }