Merge "Unify YANG->DTO generation plugin definition"
[bgpcep.git] / bgp / topology-provider / src / main / java / org / opendaylight / bgpcep / bgp / topology / provider / LinkstateTopologyBuilder.java
1 /*
2  * Copyright (c) 2013 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.bgpcep.bgp.topology.provider;
9
10 import java.math.BigDecimal;
11 import java.nio.ByteBuffer;
12 import java.util.ArrayList;
13 import java.util.List;
14
15 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
16 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.NodeIdentifier;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.TopologyIdentifier;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.loc.rib.tables.routes.linkstate.routes.LinkstateRoute;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.loc.rib.tables.routes.linkstate.routes.linkstate.route.Attributes1;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.loc.rib.tables.routes.linkstate.routes.linkstate.route.ObjectType;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.loc.rib.tables.routes.linkstate.routes.linkstate.route.attributes.attribute.type.link.LinkAttributes;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.loc.rib.tables.routes.linkstate.routes.linkstate.route.attributes.attribute.type.node.NodeAttributes;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.loc.rib.tables.routes.linkstate.routes.linkstate.route.attributes.attribute.type.prefix.PrefixAttributes;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.loc.rib.tables.routes.linkstate.routes.linkstate.route.object.type.Link;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.loc.rib.tables.routes.linkstate.routes.linkstate.route.object.type.Node;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.loc.rib.tables.routes.linkstate.routes.linkstate.route.object.type.Prefix;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.CRouterIdentifier;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.c.isis.node.IsisNode;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.node.identifier.c.router.identifier.c.isis.pseudonode.IsisPseudonode;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.route.Attributes;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.Bandwidth;
34 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IsoPseudonodeId;
35 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IsoSystemId;
36 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.IsisLinkAttributesBuilder;
37 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.IsisNodeAttributesBuilder;
38 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.isis.node.attributes.IsoBuilder;
39 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.ted.rev131021.ted.link.attributes.UnreservedBandwidth;
40 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.ted.rev131021.ted.link.attributes.UnreservedBandwidthBuilder;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.ted.rev131021.ted.link.attributes.UnreservedBandwidthKey;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.LinkId;
43 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
44 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
45 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.LinkBuilder;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.LinkKey;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.Link1;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.Link1Builder;
51 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.Node1;
52 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.Node1Builder;
53 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.link.attributes.IgpLinkAttributesBuilder;
54 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.IgpNodeAttributesBuilder;
55 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.igp.node.attributes.PrefixBuilder;
56 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.igp.node.attributes.PrefixKey;
57 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.Prefix1;
58 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.Prefix1Builder;
59 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes.OspfLinkAttributesBuilder;
60 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.OspfNodeAttributesBuilder;
61 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.prefix.attributes.OspfPrefixAttributesBuilder;
62 import org.opendaylight.yangtools.yang.binding.DataObject;
63 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
64 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
65
66 public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder<LinkstateRoute> {
67         public LinkstateTopologyBuilder(final DataProviderService dataProvider, final TopologyId topologyId) {
68                 super(dataProvider, topologyId, LinkstateRoute.class);
69         }
70
71         private String buildNamePrefix(final LinkstateRoute route) {
72                 final StringBuilder sb = new StringBuilder();
73
74                 if (route.getDistinguisher() != null) {
75                         sb.append(route.getDistinguisher().getValue().toString()).append(':');
76                 }
77                 sb.append(route.getProtocolId().toString()).append(':').append(route.getIdentifier().getValue().toString()).append(':');
78                 return sb.toString();
79         }
80
81         private LinkId buildLinkId(final String pfx, final Link link) {
82                 final StringBuilder sb = new StringBuilder(pfx);
83
84                 // FIXME: finish this
85
86                 return new LinkId(sb.toString());
87         }
88
89         private NodeId buildNodeId(final String pfx, final NodeIdentifier node) {
90                 final StringBuilder sb = new StringBuilder(pfx);
91
92                 // FIXME: finish this
93
94                 return new NodeId(sb.toString());
95         }
96
97         private InstanceIdentifier<?> buildLinkIdentifier(final String pfx, final Link l) {
98                 return InstanceIdentifier.builder(getInstanceIdentifier()).child(
99                                 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link.class,
100                                 new LinkKey(buildLinkId(pfx, l))).toInstance();
101         }
102
103         private static Float bandwidthToFloat(final Bandwidth bandwidth) {
104                 return ByteBuffer.wrap(bandwidth.getValue()).getFloat();
105         }
106
107         private static BigDecimal bandwidthToBigDecimal(final Bandwidth bandwidth) {
108                 return BigDecimal.valueOf(bandwidthToFloat(bandwidth));
109         }
110
111         private static List<UnreservedBandwidth> unreservedBandwidthList(final List<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.UnreservedBandwidth> input) {
112                 final List<UnreservedBandwidth> ret = new ArrayList<>(input.size());
113
114                 for (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.UnreservedBandwidth i : input) {
115                         ret.add(new UnreservedBandwidthBuilder().
116                                         setBandwidth(bandwidthToBigDecimal(i.getBandwidth())).
117                                         setKey(new UnreservedBandwidthKey(i.getPriority())).build());
118                 }
119
120                 return ret;
121         }
122
123
124         private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1 isisLinkAttributes(final TopologyIdentifier topologyIdentifier, final LinkAttributes la) {
125                 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.isis.link.attributes.TedBuilder tb =
126                                 new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.isis.link.attributes.TedBuilder();
127
128                 tb.setColor(la.getAdminGroup().getValue());
129                 tb.setTeDefaultMetric(la.getTeMetric().getValue());
130                 tb.setUnreservedBandwidth(unreservedBandwidthList(la.getUnreservedBandwidth()));
131                 tb.setMaxLinkBandwidth(bandwidthToBigDecimal(la.getMaxLinkBandwidth()));
132                 tb.setMaxResvLinkBandwidth(bandwidthToBigDecimal(la.getMaxReservableBandwidth()));
133
134                 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1Builder().setIsisLinkAttributes(
135                                 new IsisLinkAttributesBuilder().setMultiTopologyId(topologyIdentifier.getValue().shortValue()).
136                                 setTed(tb.build()).build()).build();
137         }
138
139
140         private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpLinkAttributes1 ospfLinkAttributes(final TopologyIdentifier topologyIdentifier, final LinkAttributes la) {
141                 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes.ospf.link.attributes.TedBuilder tb =
142                                 new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes.ospf.link.attributes.TedBuilder();
143
144                 tb.setColor(la.getAdminGroup().getValue());
145                 tb.setTeDefaultMetric(la.getTeMetric().getValue());
146                 tb.setUnreservedBandwidth(unreservedBandwidthList(la.getUnreservedBandwidth()));
147                 tb.setMaxLinkBandwidth(bandwidthToBigDecimal(la.getMaxLinkBandwidth()));
148                 tb.setMaxResvLinkBandwidth(bandwidthToBigDecimal(la.getMaxReservableBandwidth()));
149
150                 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpLinkAttributes1Builder().setOspfLinkAttributes(
151                                 new OspfLinkAttributesBuilder().
152                                 setMultiTopologyId(topologyIdentifier.getValue().shortValue()).
153                                 setTed(tb.build()).build()).build();
154         }
155
156         private void createLink(final DataModification<InstanceIdentifier<?>, DataObject> trans, final String pfx, final LinkstateRoute value, final Link l, final Attributes attributes) {
157                 final LinkAttributes la = (LinkAttributes) attributes.getAugmentation(Attributes1.class).getAttributeType();
158
159                 final IgpLinkAttributesBuilder ilab = new IgpLinkAttributesBuilder();
160                 ilab.setMetric(la.getMetric().getValue());
161                 ilab.setName(la.getLinkName());
162
163                 switch (value.getProtocolId()) {
164                 case Direct:
165                 case Static:
166                 case Unknown:
167                         break;
168                 case IsisLevel1:
169                 case IsisLevel2:
170                         ilab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1.class, isisLinkAttributes(l.getLinkDescriptors().getMultiTopologyId(), la));
171                         break;
172                 case Ospf:
173                         ilab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpLinkAttributes1.class, ospfLinkAttributes(l.getLinkDescriptors().getMultiTopologyId(), la));
174                         break;
175                 }
176
177                 final LinkBuilder lb = new LinkBuilder();
178                 lb.setLinkId(buildLinkId(pfx, l));
179                 lb.addAugmentation(Link1.class, new Link1Builder().setIgpLinkAttributes(ilab.build()).build());
180
181                 // FIXME: figure this out
182                 lb.setSource(null);
183                 lb.setDestination(null);
184
185                 trans.putOperationalData(buildLinkIdentifier(pfx, l), lb.build());
186         }
187
188         private void removeLink(final DataModification<InstanceIdentifier<?>, DataObject> trans,  final String pfx, final Link l) {
189                 trans.removeOperationalData(buildLinkIdentifier(pfx, l));
190         }
191
192         private InstanceIdentifierBuilder<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node> nodeIdentifierBuilder(final String pfx, final NodeIdentifier node) {
193                 return InstanceIdentifier.builder(getInstanceIdentifier()).child(
194                                 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.class,
195                                 new NodeKey(buildNodeId(pfx, node)));
196         }
197
198         private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpNodeAttributes1 isisNodeAttributes(final NodeIdentifier node, final NodeAttributes na) {
199                 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.isis.node.attributes.TedBuilder tb =
200                                 new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.isis.node.attributes.TedBuilder();
201                 if (na.getIpv4RouterId() != null) {
202                         tb.setTeRouterIdIpv4(na.getIpv4RouterId());
203                 }
204                 if (na.getIpv6RouterId() != null) {
205                         tb.setTeRouterIdIpv6(na.getIpv6RouterId());
206                 }
207
208                 final IsisNodeAttributesBuilder ab = new IsisNodeAttributesBuilder();
209                 final CRouterIdentifier ri = node.getCRouterIdentifier();
210
211                 if (ri instanceof IsisPseudonode) {
212                         final IsisPseudonode pn = (IsisPseudonode) ri;
213                         ab.setIso(new IsoBuilder().setIsoPseudonodeId(new IsoPseudonodeId(pn.toString())).build());
214                 } else if (ri instanceof IsisNode) {
215                         final IsisNode in = (IsisNode) ri;
216                         ab.setIso(new IsoBuilder().setIsoSystemId(new IsoSystemId(in.getIsoSystemId().toString())).build());
217                 }
218
219                 ab.setTed(tb.build());
220
221                 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpNodeAttributes1Builder().setIsisNodeAttributes(ab.build()).build();
222         }
223
224         private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1 ospfNodeAttributes(final NodeAttributes na) {
225                 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.TedBuilder tb =
226                                 new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.TedBuilder();
227
228                 final OspfNodeAttributesBuilder ab = new OspfNodeAttributesBuilder();
229
230                 ab.setTed(tb.build());
231
232                 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1Builder().setOspfNodeAttributes(ab.build()).build();
233         }
234
235         private void createNode(final DataModification<InstanceIdentifier<?>, DataObject> trans, final String pfx, final LinkstateRoute value, final Node n, final Attributes attributes) {
236                 final NodeAttributes na = (NodeAttributes) attributes.getAugmentation(Attributes1.class).getAttributeType();
237
238
239                 final List<IpAddress> ids = new ArrayList<>();
240                 if (na.getIpv4RouterId() != null) {
241                         ids.add(new IpAddress(na.getIpv4RouterId()));
242                 }
243                 if (na.getIpv6RouterId() != null) {
244                         ids.add(new IpAddress(na.getIpv6RouterId()));
245                 }
246
247                 final IgpNodeAttributesBuilder inab = new IgpNodeAttributesBuilder();
248                 if (!ids.isEmpty()) {
249                         inab.setRouterId(ids);
250                 }
251
252                 switch (value.getProtocolId()) {
253                 case Direct:
254                 case Static:
255                 case Unknown:
256                         break;
257                 case IsisLevel1:
258                 case IsisLevel2:
259                         inab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpNodeAttributes1.class, isisNodeAttributes(n.getNodeDescriptors(), na));
260                         break;
261                 case Ospf:
262                         inab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1.class, ospfNodeAttributes(na));
263                         break;
264                 }
265
266                 final NodeBuilder nb = new NodeBuilder();
267                 nb.setNodeId(buildNodeId(pfx, n.getNodeDescriptors()));
268                 nb.addAugmentation(Node1.class, new Node1Builder().setIgpNodeAttributes(
269                                 inab.build()).build());
270
271                 trans.putOperationalData(nodeIdentifierBuilder(pfx, n.getNodeDescriptors()).toInstance(), nb.build());
272         }
273
274         private void removeNode(final DataModification<InstanceIdentifier<?>, DataObject> trans, final String pfx, final Node n) {
275                 trans.removeOperationalData(nodeIdentifierBuilder(pfx, n.getNodeDescriptors()).toInstance());
276         }
277
278         private InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.igp.node.attributes.Prefix>
279         prefixIdentifier(final String pfx, final Prefix p) {
280                 return nodeIdentifierBuilder(pfx, p.getAdvertisingNodeDescriptors()).
281                                 augmentation(Node1.class).
282                                 child(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.IgpNodeAttributes.class).
283                                 child(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.igp.node.attributes.Prefix.class,
284                                                 new PrefixKey(p.getIpReachabilityInformation())).toInstance();
285         }
286
287         private void createPrefix(final DataModification<InstanceIdentifier<?>, DataObject> trans, final String pfx, final LinkstateRoute value, final Prefix p, final Attributes attributes) {
288                 final PrefixAttributes pa = (PrefixAttributes) attributes.getAugmentation(Attributes1.class).getAttributeType();
289
290                 final PrefixBuilder pb = new PrefixBuilder();
291                 pb.setPrefix(p.getIpReachabilityInformation());
292                 pb.setMetric(pa.getPrefixMetric().getValue());
293
294                 switch (value.getProtocolId()) {
295                 case Direct:
296                 case IsisLevel1:
297                 case IsisLevel2:
298                 case Static:
299                 case Unknown:
300                         break;
301                 case Ospf:
302                         pb.addAugmentation(Prefix1.class, new Prefix1Builder().setOspfPrefixAttributes(
303                                         new OspfPrefixAttributesBuilder().setForwardingAddress(pa.getOspfForwardingAddress()).build()).build());
304                         break;
305                 }
306
307                 trans.putOperationalData(prefixIdentifier(pfx, p), pb.build());
308         }
309
310         private void removePrefix(final DataModification<InstanceIdentifier<?>, DataObject> trans, final String pfx, final Prefix p) {
311                 trans.removeOperationalData(prefixIdentifier(pfx, p));
312         }
313
314         @Override
315         protected void createObject(final DataModification<InstanceIdentifier<?>, DataObject> trans, final InstanceIdentifier<LinkstateRoute> id, final LinkstateRoute value) {
316                 final String pfx = buildNamePrefix(value);
317
318                 final ObjectType t = value.getObjectType();
319                 if (t instanceof Link) {
320                         createLink(trans, pfx, value, (Link)t, value.getAttributes());
321                 } else if (t instanceof Node) {
322                         createNode(trans, pfx, value, (Node)t, value.getAttributes());
323                 } else if (t instanceof Prefix) {
324                         createPrefix(trans, pfx, value, (Prefix)t, value.getAttributes());
325                 } else {
326                         throw new IllegalStateException("Unhandled object class " + t.getImplementedInterface());
327                 }
328         }
329
330         @Override
331         protected void removeObject(final DataModification<InstanceIdentifier<?>, DataObject> trans, final InstanceIdentifier<LinkstateRoute> id, final LinkstateRoute value) {
332                 final String pfx = buildNamePrefix(value);
333
334                 final ObjectType t = value.getObjectType();
335                 if (t instanceof Link) {
336                         removeLink(trans, pfx, (Link)t);
337                 } else if (t instanceof Node) {
338                         removeNode(trans, pfx, (Node)t);
339                 } else if (t instanceof Prefix) {
340                         removePrefix(trans, pfx, (Prefix)t);
341                 } else {
342                         throw new IllegalStateException("Unhandled object class " + t.getImplementedInterface());
343                 }
344         }
345 }