BUG-108: final implementation piece
[bgpcep.git] / bgp / topology-provider / src / main / java / org / opendaylight / bgpcep / topology / provider / bgp / impl / 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.topology.provider.bgp.impl;
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.bgpcep.topology.provider.bgp.AbstractLocRIBListener;
16 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
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.rev130918.NodeIdentifier;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.TopologyIdentifier;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.loc.rib.tables.routes.linkstate.routes.LinkstateRoute;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.loc.rib.tables.routes.linkstate.routes.linkstate.route.Attributes1;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.loc.rib.tables.routes.linkstate.routes.linkstate.route.ObjectType;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.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.rev130918.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.rev130918.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.rev130918.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.rev130918.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.rev130918.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.rev130918.node.identifier.CRouterIdentifier;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.node.identifier.c.router.identifier.c.isis.node.IsisNode;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.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.nps.concepts.rev130930.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.network.topology.Topology;
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.IgpNodeAttributes;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.Link1;
51 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.Link1Builder;
52 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.Node1;
53 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.Node1Builder;
54 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.link.attributes.IgpLinkAttributesBuilder;
55 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.IgpNodeAttributesBuilder;
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.PrefixBuilder;
57 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;
58 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.Prefix1;
59 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.Prefix1Builder;
60 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes.OspfLinkAttributesBuilder;
61 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.OspfNodeAttributesBuilder;
62 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.prefix.attributes.OspfPrefixAttributesBuilder;
63 import org.opendaylight.yangtools.yang.binding.DataObject;
64 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
65 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
66
67 final class LinkstateTopologyBuilder extends AbstractLocRIBListener<LinkstateRoute> {
68         LinkstateTopologyBuilder(final InstanceIdentifier<Topology> topology) {
69                 super(topology, LinkstateRoute.class);
70         }
71
72         private String buildNamePrefix(final LinkstateRoute route) {
73                 final StringBuilder sb = new StringBuilder();
74
75                 if (route.getDistinguisher() != null) {
76                         sb.append(route.getDistinguisher().getValue().toString()).append(':');
77                 }
78                 sb.append(route.getProtocolId().toString()).append(':').append(route.getIdentifier().getValue().toString()).append(':');
79                 return sb.toString();
80         }
81
82         private LinkId buildLinkId(final String pfx, final Link link) {
83                 final StringBuilder sb = new StringBuilder(pfx);
84
85                 // FIXME: finish this
86
87                 return new LinkId(sb.toString());
88         }
89
90         private NodeId buildNodeId(final String pfx, final NodeIdentifier node) {
91                 final StringBuilder sb = new StringBuilder(pfx);
92
93                 // FIXME: finish this
94
95                 return new NodeId(sb.toString());
96         }
97
98         private InstanceIdentifier<?> buildLinkIdentifier(final String pfx, final Link l) {
99                 return InstanceIdentifier.builder(getTopology()).node(
100                                 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link.class,
101                                 new LinkKey(buildLinkId(pfx, l))).toInstance();
102         }
103
104         private static Float bandwidthToFloat(final Bandwidth bandwidth) {
105                 return ByteBuffer.wrap(bandwidth.getValue()).getFloat();
106         }
107
108         private static BigDecimal bandwidthToBigDecimal(final Bandwidth bandwidth) {
109                 return BigDecimal.valueOf(bandwidthToFloat(bandwidth));
110         }
111
112         private static List<UnreservedBandwidth> unreservedBandwidthList(final List<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.UnreservedBandwidth> input) {
113                 final List<UnreservedBandwidth> ret = new ArrayList<>(input.size());
114
115                 for (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev130918.UnreservedBandwidth i : input) {
116                         ret.add(new UnreservedBandwidthBuilder().
117                                         setBandwidth(bandwidthToBigDecimal(i.getBandwidth())).
118                                         setKey(new UnreservedBandwidthKey(i.getPriority())).build());
119                 }
120
121                 return ret;
122         }
123
124
125         private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1 isisLinkAttributes(final TopologyIdentifier topologyIdentifier, final LinkAttributes la) {
126                 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.isis.link.attributes.TedBuilder tb =
127                                 new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.isis.link.attributes.TedBuilder();
128
129                 tb.setColor(la.getAdminGroup().getValue());
130                 tb.setTeDefaultMetric(la.getTeMetric().getValue());
131                 tb.setUnreservedBandwidth(unreservedBandwidthList(la.getUnreservedBandwidth()));
132                 tb.setMaxLinkBandwidth(bandwidthToBigDecimal(la.getMaxLinkBandwidth()));
133                 tb.setMaxResvLinkBandwidth(bandwidthToBigDecimal(la.getMaxReservableBandwidth()));
134
135                 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1Builder().setIsisLinkAttributes(
136                                 new IsisLinkAttributesBuilder().setMultiTopologyId(topologyIdentifier.getValue().shortValue()).
137                                 setTed(tb.build()).build()).build();
138         }
139
140
141         private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpLinkAttributes1 ospfLinkAttributes(final TopologyIdentifier topologyIdentifier, final LinkAttributes la) {
142                 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes.ospf.link.attributes.TedBuilder tb =
143                                 new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes.ospf.link.attributes.TedBuilder();
144
145                 tb.setColor(la.getAdminGroup().getValue());
146                 tb.setTeDefaultMetric(la.getTeMetric().getValue());
147                 tb.setUnreservedBandwidth(unreservedBandwidthList(la.getUnreservedBandwidth()));
148                 tb.setMaxLinkBandwidth(bandwidthToBigDecimal(la.getMaxLinkBandwidth()));
149                 tb.setMaxResvLinkBandwidth(bandwidthToBigDecimal(la.getMaxReservableBandwidth()));
150
151                 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpLinkAttributes1Builder().setOspfLinkAttributes(
152                                 new OspfLinkAttributesBuilder().
153                                 setMultiTopologyId(topologyIdentifier.getValue().shortValue()).
154                                 setTed(tb.build()).build()).build();
155         }
156
157         private void createLink(final DataModification<InstanceIdentifier<?>, DataObject> trans, final String pfx, final LinkstateRoute value, final Link l, final Attributes attributes) {
158                 final LinkAttributes la = (LinkAttributes) attributes.getAugmentation(Attributes1.class).getAttributeType();
159
160                 final IgpLinkAttributesBuilder ilab = new IgpLinkAttributesBuilder();
161                 ilab.setMetric(la.getMetric().getValue());
162                 ilab.setName(la.getLinkName());
163
164                 switch (value.getProtocolId()) {
165                 case Direct:
166                 case Static:
167                 case Unknown:
168                         break;
169                 case IsisLevel1:
170                 case IsisLevel2:
171                         ilab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1.class, isisLinkAttributes(l.getLinkDescriptors().getMultiTopologyId(), la));
172                         break;
173                 case Ospf:
174                         ilab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpLinkAttributes1.class, ospfLinkAttributes(l.getLinkDescriptors().getMultiTopologyId(), la));
175                         break;
176                 }
177
178                 final LinkBuilder lb = new LinkBuilder();
179                 lb.setLinkId(buildLinkId(pfx, l));
180                 lb.addAugmentation(Link1.class, new Link1Builder().setIgpLinkAttributes(ilab.build()).build());
181
182                 // FIXME: figure this out
183                 lb.setSource(null);
184                 lb.setDestination(null);
185
186                 trans.putOperationalData(buildLinkIdentifier(pfx, l), lb.build());
187         }
188
189         private void removeLink(final DataModification<InstanceIdentifier<?>, DataObject> trans,  final String pfx, final Link l) {
190                 trans.removeOperationalData(buildLinkIdentifier(pfx, l));
191         }
192
193         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) {
194                 return InstanceIdentifier.builder(getTopology()).node(
195                                 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.class,
196                                 new NodeKey(buildNodeId(pfx, node)));
197         }
198
199         private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpNodeAttributes1 isisNodeAttributes(final NodeIdentifier node, final NodeAttributes na) {
200                 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.isis.node.attributes.TedBuilder tb =
201                                 new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.isis.node.attributes.TedBuilder();
202                 if (na.getIpv4RouterId() != null) {
203                         tb.setTeRouterIdIpv4(na.getIpv4RouterId());
204                 }
205                 if (na.getIpv6RouterId() != null) {
206                         tb.setTeRouterIdIpv6(na.getIpv6RouterId());
207                 }
208
209                 final IsisNodeAttributesBuilder ab = new IsisNodeAttributesBuilder();
210                 final CRouterIdentifier ri = node.getCRouterIdentifier();
211
212                 if (ri instanceof IsisPseudonode) {
213                         final IsisPseudonode pn = (IsisPseudonode) ri;
214                         ab.setIso(new IsoBuilder().setIsoPseudonodeId(new IsoPseudonodeId(pn.toString())).build());
215                 } else if (ri instanceof IsisNode) {
216                         final IsisNode in = (IsisNode) ri;
217                         ab.setIso(new IsoBuilder().setIsoSystemId(new IsoSystemId(in.getIsoSystemId().toString())).build());
218                 }
219
220                 ab.setTed(tb.build());
221
222                 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpNodeAttributes1Builder().setIsisNodeAttributes(ab.build()).build();
223         }
224
225         private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1 ospfNodeAttributes(final NodeAttributes na) {
226                 final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.TedBuilder tb =
227                                 new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.TedBuilder();
228
229                 final OspfNodeAttributesBuilder ab = new OspfNodeAttributesBuilder();
230
231                 ab.setTed(tb.build());
232
233                 return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1Builder().setOspfNodeAttributes(ab.build()).build();
234         }
235
236         private void createNode(final DataModification<InstanceIdentifier<?>, DataObject> trans, final String pfx, final LinkstateRoute value, final Node n, final Attributes attributes) {
237                 final NodeAttributes na = (NodeAttributes) attributes.getAugmentation(Attributes1.class).getAttributeType();
238
239
240                 final List<IpAddress> ids = new ArrayList<>();
241                 if (na.getIpv4RouterId() != null) {
242                         ids.add(new IpAddress(na.getIpv4RouterId()));
243                 }
244                 if (na.getIpv6RouterId() != null) {
245                         ids.add(new IpAddress(na.getIpv6RouterId()));
246                 }
247
248                 final IgpNodeAttributesBuilder inab = new IgpNodeAttributesBuilder();
249                 if (!ids.isEmpty()) {
250                         inab.setRouterId(ids);
251                 }
252
253                 switch (value.getProtocolId()) {
254                 case Direct:
255                 case Static:
256                 case Unknown:
257                         break;
258                 case IsisLevel1:
259                 case IsisLevel2:
260                         inab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpNodeAttributes1.class, isisNodeAttributes(n.getNodeDescriptors(), na));
261                         break;
262                 case Ospf:
263                         inab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1.class, ospfNodeAttributes(na));
264                         break;
265                 }
266
267                 final NodeBuilder nb = new NodeBuilder();
268                 nb.setNodeId(buildNodeId(pfx, n.getNodeDescriptors()));
269                 nb.addAugmentation(Node1.class, new Node1Builder().setIgpNodeAttributes(
270                                 inab.build()).build());
271
272                 trans.putOperationalData(nodeIdentifierBuilder(pfx, n.getNodeDescriptors()).toInstance(), nb.build());
273         }
274
275         private void removeNode(final DataModification<InstanceIdentifier<?>, DataObject> trans, final String pfx, final Node n) {
276                 trans.removeOperationalData(nodeIdentifierBuilder(pfx, n.getNodeDescriptors()).toInstance());
277         }
278
279         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>
280         prefixIdentifier(final String pfx, final Prefix p) {
281                 return nodeIdentifierBuilder(pfx, p.getAdvertisingNodeDescriptors()).node(
282                                 Node1.class).node(IgpNodeAttributes.class).node(
283                                                 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 }