+final class LinkstateAdjRIBsIn extends AbstractAdjRIBs<CLinkstateDestination, LinkstateRoute, LinkstateRouteKey> {
+
+ private abstract static class LinkstateRIBEntryData<A extends LinkStateAttribute> extends RIBEntryData<CLinkstateDestination, LinkstateRoute, LinkstateRouteKey> {
+ private final A lsattr;
+
+ protected LinkstateRIBEntryData(final Peer peer, final Attributes attributes, final A lsattr) {
+ super(peer, attributes);
+ this.lsattr = lsattr;
+ }
+
+ protected abstract LinkStateAttribute createAttributes(A lsattr);
+
+ @Override
+ protected final LinkstateRoute getDataObject(final CLinkstateDestination key, final LinkstateRouteKey id) {
+ final LinkstateRouteBuilder builder = new LinkstateRouteBuilder();
+
+ builder.setKey(id);
+ builder.setIdentifier(key.getIdentifier());
+ builder.setProtocolId(key.getProtocolId());
+ builder.setDistinguisher(key.getDistinguisher());
+ builder.setAttributes(new AttributesBuilder(getAttributes()).addAugmentation(Attributes1.class,
+ new Attributes1Builder().setLinkStateAttribute(Preconditions.checkNotNull(createAttributes(this.lsattr))).build()).build());
+ builder.setObjectType(Preconditions.checkNotNull(key.getObjectType()));
+
+ return builder.build();
+ }
+
+ @Override
+ protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
+ return toStringHelper.add("lsattr", this.lsattr);
+ }
+ }
+
+ private static final Logger LOG = LoggerFactory.getLogger(LinkstateAdjRIBsIn.class);
+ private final InstanceIdentifier<LinkstateRoutes> routesBasePath;
+
+ LinkstateAdjRIBsIn(final KeyedInstanceIdentifier<Tables, TablesKey> basePath) {
+ super(basePath);
+ this.routesBasePath = basePath.builder().child((Class)LinkstateRoutes.class).build();
+ }
+
+ @Override
+ @Deprecated
+ public KeyedInstanceIdentifier<LinkstateRoute, LinkstateRouteKey> identifierForKey(final InstanceIdentifier<Tables> basePath, final CLinkstateDestination key) {
+ final ByteBuf keyBuf = Unpooled.buffer();
+ LinkstateNlriParser.serializeNlri(key, keyBuf);
+ return basePath.child((Class)LinkstateRoutes.class).child(LinkstateRoute.class,
+ new LinkstateRouteKey(ByteArray.readAllBytes(keyBuf)));
+ }
+
+ @Override
+ public KeyedInstanceIdentifier<LinkstateRoute, LinkstateRouteKey> identifierForKey(final CLinkstateDestination key) {
+ final ByteBuf keyBuf = Unpooled.buffer();
+ LinkstateNlriParser.serializeNlri(key, keyBuf);
+ return this.routesBasePath.child(LinkstateRoute.class,
+ new LinkstateRouteKey(ByteArray.readAllBytes(keyBuf)));
+ }
+
+ private static LinkstateRIBEntryData<PrefixAttributesCase> createPrefixData(final Peer peer,
+ final Attributes attributes, final LinkStateAttribute lsattr) {
+ return new LinkstateRIBEntryData<PrefixAttributesCase>(peer, attributes, (PrefixAttributesCase) lsattr) {
+ @Override
+ protected LinkStateAttribute createAttributes(final PrefixAttributesCase lsattr) {
+ final PrefixAttributesCaseBuilder b = new PrefixAttributesCaseBuilder();
+ if (lsattr != null && lsattr.getPrefixAttributes() != null) {
+ b.setPrefixAttributes(new PrefixAttributesBuilder(lsattr.getPrefixAttributes()).build());
+ }
+ return b.build();
+ }
+ };
+ }
+
+ private static LinkstateRIBEntryData<LinkAttributesCase> createLinkData(final Peer peer,
+ final Attributes attributes, final LinkStateAttribute lsattr) {
+ return new LinkstateRIBEntryData<LinkAttributesCase>(peer, attributes, (LinkAttributesCase) lsattr) {
+ @Override
+ protected LinkStateAttribute createAttributes(final LinkAttributesCase lsattr) {
+ final LinkAttributesCaseBuilder b = new LinkAttributesCaseBuilder();
+ if (lsattr != null && lsattr.getLinkAttributes() != null) {
+ b.setLinkAttributes(new LinkAttributesBuilder(lsattr.getLinkAttributes()).build());
+ }
+ return b.build();
+ }
+ };
+ }
+
+ private static LinkstateRIBEntryData<NodeAttributesCase> createNodeData(final Peer peer,
+ final Attributes attributes, final LinkStateAttribute lsattr) {
+ return new LinkstateRIBEntryData<NodeAttributesCase>(peer, attributes, (NodeAttributesCase) lsattr) {
+ @Override
+ protected LinkStateAttribute createAttributes(final NodeAttributesCase lsattr) {
+ final NodeAttributesCaseBuilder b = new NodeAttributesCaseBuilder();
+ if (lsattr != null && lsattr.getNodeAttributes() != null) {
+ b.setNodeAttributes(new NodeAttributesBuilder(lsattr.getNodeAttributes()).build());
+ }
+ return b.build();
+ }
+ };
+ }
+
+ @Override
+ public void addRoutes(final AdjRIBsTransaction trans, final Peer peer, final MpReachNlri nlri,
+ final Attributes attributes) {
+ LOG.debug("Passed nlri {}", nlri);
+ final LinkstateDestination keys = ((DestinationLinkstateCase) nlri.getAdvertizedRoutes().getDestinationType()).getDestinationLinkstate();
+ if (keys == null) {
+ LOG.debug("No destinations present in advertized routes");
+ return;
+ }
+ LOG.debug("Iterating over route destinations {}", keys);
+ for (final CLinkstateDestination key : keys.getCLinkstateDestination()) {
+ LOG.debug("Processing route key {}", key);
+ LinkStateAttribute lsattr = null;
+ final Attributes1 pa = attributes.getAugmentation(Attributes1.class);
+ if (pa != null) {
+ lsattr = pa.getLinkStateAttribute();
+ }
+ RIBEntryData<CLinkstateDestination, LinkstateRoute, LinkstateRouteKey> data = null;
+ final ObjectType ot = key.getObjectType();
+ if (ot instanceof LinkCase) {
+ data = createLinkData(peer, attributes, lsattr);
+ } else if (ot instanceof NodeCase) {
+ data = createNodeData(peer, attributes, lsattr);
+ } else if (ot instanceof PrefixCase) {
+ data = createPrefixData(peer, attributes, lsattr);
+ }
+ super.add(trans, peer, key, data);
+ }
+ }
+
+ @Override
+ public void removeRoutes(final AdjRIBsTransaction trans, final Peer peer, final MpUnreachNlri nlri) {
+ final DestinationLinkstate keys = ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCase) nlri.getWithdrawnRoutes().getDestinationType()).getDestinationLinkstate();
+
+ for (final CLinkstateDestination key : keys.getCLinkstateDestination()) {
+ super.remove(trans, peer, key);
+ }
+ }
+
+ @Override
+ public void addAdvertisement(final MpReachNlriBuilder builder, final LinkstateRoute data) {
+ final CLinkstateDestinationBuilder nlri = new CLinkstateDestinationBuilder();
+ nlri.setProtocolId(data.getProtocolId());
+ nlri.setIdentifier(data.getIdentifier());
+ final Attributes a = data.getAttributes();
+ if (a != null && a.getCNextHop() != null) {
+ builder.setCNextHop(a.getCNextHop());
+ }
+ final ObjectType type = data.getObjectType();
+ nlri.setObjectType(type);
+ final AdvertizedRoutes ar = builder.getAdvertizedRoutes();
+ if (ar == null) {
+ builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(
+ new DestinationLinkstateCaseBuilder().setDestinationLinkstate(new DestinationLinkstateBuilder()
+ .setCLinkstateDestination(Lists.newArrayList(nlri.build())).build()).build()).build());
+ } else {
+ ((DestinationLinkstateCase) ar.getDestinationType()).getDestinationLinkstate().getCLinkstateDestination().add(nlri.build());
+ }
+ }
+
+ @Override
+ public void addWithdrawal(final MpUnreachNlriBuilder builder, final CLinkstateDestination id) {
+ final WithdrawnRoutes wr = builder.getWithdrawnRoutes();
+ if (wr == null) {
+ builder.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCaseBuilder().setDestinationLinkstate(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder()
+ .setCLinkstateDestination(Lists.newArrayList(id)).build()).build()).build());
+ } else {
+ ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCase) wr.getDestinationType())
+ .getDestinationLinkstate().getCLinkstateDestination().add(id);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public KeyedInstanceIdentifier<LinkstateRoute, LinkstateRouteKey> routeIdentifier(final InstanceIdentifier<?> id) {
+ return (KeyedInstanceIdentifier<LinkstateRoute, LinkstateRouteKey>)id.firstIdentifierOf(LinkstateRoute.class);
+ }