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