From: Dana Kutenicsova Date: Fri, 19 Jun 2015 12:40:15 +0000 (+0200) Subject: Start using Codecs and CodecsRegistry instead of RIBSupportContext. X-Git-Tag: release/beryllium~215 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=abe034714f96d78714fc223fef80e5410a53919a;p=bgpcep.git Start using Codecs and CodecsRegistry instead of RIBSupportContext. Change-Id: I27b46f2c8c02b92e2f93cdd2cba5b52f43891991 Signed-off-by: Dana Kutenicsova --- diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibOutListener.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibOutListener.java index 8d16bd6cb1..f0a967548d 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibOutListener.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibOutListener.java @@ -18,7 +18,7 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener; import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService; import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier; -import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry; +import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry; import org.opendaylight.protocol.bgp.rib.spi.RIBSupport; import org.opendaylight.protocol.bgp.rib.spi.RibSupportUtils; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix; @@ -56,23 +56,23 @@ final class AdjRibOutListener implements DOMDataTreeChangeListener { private final YangInstanceIdentifier.NodeIdentifier routeKeyLeaf = new YangInstanceIdentifier.NodeIdentifier(PREFIX_QNAME); private final ChannelOutputLimiter session; - private final RIBSupportContextImpl context; + private final Codecs codecs; private final RIBSupport support; private final boolean mpSupport; - private AdjRibOutListener(final PeerId peerId, final TablesKey tablesKey, final YangInstanceIdentifier ribId, final DOMDataTreeChangeService service, final RIBSupportContextRegistry registry, final ChannelOutputLimiter session, final boolean mpSupport) { + private AdjRibOutListener(final PeerId peerId, final TablesKey tablesKey, final YangInstanceIdentifier ribId, + final CodecsRegistry registry, final RIBSupport support, final DOMDataTreeChangeService service, + final ChannelOutputLimiter session, final boolean mpSupport) { this.session = Preconditions.checkNotNull(session); - this.context = (RIBSupportContextImpl) registry.getRIBSupportContext(tablesKey); - this.support = this.context.getRibSupport(); + this.support = Preconditions.checkNotNull(support); + this.codecs = registry.getCodecs(this.support); this.mpSupport = mpSupport; - final YangInstanceIdentifier adjRibOutId = ribId.node(Peer.QNAME).node(IdentifierUtils.domPeerId(peerId)).node(AdjRibOut.QNAME).node(Tables.QNAME).node(RibSupportUtils.toYangTablesKey(tablesKey)); + final YangInstanceIdentifier adjRibOutId = ribId.node(Peer.QNAME).node(IdentifierUtils.domPeerId(peerId)).node(AdjRibOut.QNAME).node(Tables.QNAME).node(RibSupportUtils.toYangTablesKey(tablesKey)); service.registerDataTreeChangeListener(new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, adjRibOutId), this); } - static AdjRibOutListener create(@Nonnull final PeerId peerId, @Nonnull final TablesKey tablesKey, @Nonnull final YangInstanceIdentifier ribId, - @Nonnull final DOMDataTreeChangeService service, @Nonnull final RIBSupportContextRegistry registry, - @Nonnull final ChannelOutputLimiter session, @Nonnull final boolean mpSupport) { - return new AdjRibOutListener(peerId, tablesKey, ribId, service, registry, session, mpSupport); + static AdjRibOutListener create(@Nonnull final PeerId peerId, @Nonnull final TablesKey tablesKey, @Nonnull final YangInstanceIdentifier ribId, @Nonnull final CodecsRegistry registry, @Nonnull final RIBSupport support, @Nonnull final DOMDataTreeChangeService service, @Nonnull final ChannelOutputLimiter session, @Nonnull final boolean mpSupport) { + return new AdjRibOutListener(peerId, tablesKey, ribId, registry, support, service, session, mpSupport); } @Override @@ -81,7 +81,7 @@ final class AdjRibOutListener implements DOMDataTreeChangeListener { for (final DataTreeCandidate tc : changes) { LOG.trace("Change {} type {}", tc.getRootNode(), tc.getRootNode().getModificationType()); for (final DataTreeCandidateNode child : tc.getRootNode().getChildNodes()) { - for (final DataTreeCandidateNode route : this.context.getRibSupport().changedRoutes(child)) { + for (final DataTreeCandidateNode route : this.support.changedRoutes(child)) { final Update update; switch (route.getModificationType()) { @@ -113,9 +113,8 @@ final class AdjRibOutListener implements DOMDataTreeChangeListener { if (LOG.isDebugEnabled()) { LOG.debug("AdjRibOut parsing route {}", NormalizedNodes.toStringTree(route)); } - final ContainerNode advertisedAttrs = (ContainerNode) NormalizedNodes.findNode(route, this.support.routeAttributesIdentifier()).orNull(); - return this.context.deserializeAttributes(advertisedAttrs); + return this.codecs.deserializeAttributes(advertisedAttrs); } private Update withdraw(final MapEntryNode route) { @@ -123,13 +122,13 @@ final class AdjRibOutListener implements DOMDataTreeChangeListener { } private Update advertise(final MapEntryNode route) { - if (!mpSupport) { + if (!this.mpSupport) { return buildUpdate(Collections.singleton(route), Collections.emptyList(), routeAttributes(route)); } return this.support.buildUpdate(Collections.singleton(route), Collections.emptyList(), routeAttributes(route)); } - private Update buildUpdate(@Nonnull final Collection advertised, @Nonnull final Collection withdrawn, @Nonnull Attributes attr) { + private Update buildUpdate(@Nonnull final Collection advertised, @Nonnull final Collection withdrawn, @Nonnull final Attributes attr) { final UpdateBuilder ub = new UpdateBuilder() .setWithdrawnRoutes(new WithdrawnRoutesBuilder().setWithdrawnRoutes(extractPrefixes(withdrawn)).build()) .setNlri(new NlriBuilder().setNlri(extractPrefixes(advertised)).build()); diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java index 66b3d1c6f4..5ab0d92b90 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java @@ -30,6 +30,7 @@ import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListen import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionStatistics; import org.opendaylight.protocol.bgp.rib.impl.spi.RIB; +import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContext; import org.opendaylight.protocol.bgp.rib.impl.spi.ReusableBGPPeer; import org.opendaylight.protocol.bgp.rib.spi.BGPSession; import org.opendaylight.protocol.bgp.rib.spi.BGPTerminationReason; @@ -207,10 +208,12 @@ public class BGPPeer implements ReusableBGPPeer, Peer, AutoCloseable, BGPPeerRun } private void createAdjRibOutListener(final PeerId peerId, final TablesKey key, final boolean mpSupport) { + final RIBSupportContext context = this.rib.getRibSupportContext().getRIBSupportContext(key); + // not particularly nice - if (session instanceof BGPSessionImpl) { - AdjRibOutListener.create(peerId, key, this.rib.getYangRibId(), ((RIBImpl) this.rib).getService(), - this.rib.getRibSupportContext(), ((BGPSessionImpl) session).getLimiter(), mpSupport); + if (context != null && this.session instanceof BGPSessionImpl) { + AdjRibOutListener.create(peerId, key, this.rib.getYangRibId(), this.rib.getCodecsRegistry(), context.getRibSupport(), ((RIBImpl) this.rib).getService(), + ((BGPSessionImpl) this.session).getLimiter(), mpSupport); } } @@ -322,7 +325,7 @@ public class BGPPeer implements ReusableBGPPeer, Peer, AutoCloseable, BGPPeerRun @Override public void onTransactionChainFailed(final TransactionChain chain, final AsyncTransaction transaction, final Throwable cause) { LOG.error("Transaction chain failed.", cause); - this.dropConnection(); + dropConnection(); this.chain.close(); this.chain = this.rib.createPeerChain(this); } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java index f144512812..d1bda15d14 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java @@ -35,6 +35,7 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; import org.opendaylight.protocol.bgp.rib.DefaultRibReference; import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher; +import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry; import org.opendaylight.protocol.bgp.rib.impl.spi.RIB; import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext; @@ -96,6 +97,7 @@ public final class RIBImpl extends DefaultRibReference implements AutoCloseable, private final RIBExtensionConsumerContext extensions; private final YangInstanceIdentifier yangRibId; private final RIBSupportContextRegistryImpl ribContextRegistry; + private final CodecsRegistryImpl codecsRegistry; private final EffectiveRibInWriter efWriter; private final DOMDataBrokerExtension service; private final List locRibs = new ArrayList<>(); @@ -115,7 +117,8 @@ public final class RIBImpl extends DefaultRibReference implements AutoCloseable, this.dataBroker = dps; this.domDataBroker = Preconditions.checkNotNull(domDataBroker); this.extensions = Preconditions.checkNotNull(extensions); - this.ribContextRegistry = RIBSupportContextRegistryImpl.create(extensions, codecFactory, classStrategy); + this.codecsRegistry = CodecsRegistryImpl.create(codecFactory, classStrategy); + this.ribContextRegistry = RIBSupportContextRegistryImpl.create(extensions, this.codecsRegistry); this.yangRibId = YangInstanceIdentifier.builder().node(BgpRib.QNAME).node(Rib.QNAME).nodeWithKey(Rib.QNAME, RIB_ID_QNAME, ribId.getValue()).build(); LOG.debug("Instantiating RIB table {} at {}", ribId, this.yangRibId); @@ -312,6 +315,11 @@ public final class RIBImpl extends DefaultRibReference implements AutoCloseable, @Override public void onGlobalContextUpdated(final SchemaContext context) { - this.ribContextRegistry.onSchemaContextUpdated(context); + this.codecsRegistry.onSchemaContextUpdated(context); + } + + @Override + public CodecsRegistry getCodecsRegistry() { + return this.codecsRegistry; } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBSupportContextImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBSupportContextImpl.java index c15333b7c4..9d1f75c434 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBSupportContextImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBSupportContextImpl.java @@ -9,131 +9,43 @@ package org.opendaylight.protocol.bgp.rib.impl; import com.google.common.base.Preconditions; import com.google.common.base.Verify; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableSet.Builder; import java.util.Map.Entry; -import java.util.Set; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; +import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry; import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContext; import org.opendaylight.protocol.bgp.rib.spi.RIBSupport; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.ClusterId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.OriginatorId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Update; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.Attributes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.Aggregator; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.AsPath; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.Communities; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.ExtendedCommunities; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.LocalPref; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.MultiExitDisc; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.Origin; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.UnrecognizedAttributes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes1; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.Attributes2; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.BgpRib; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.Route; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.LocRib; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Routes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpAggregator; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Community; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ExtendedCommunity; -import org.opendaylight.yangtools.binding.data.codec.api.BindingCodecTree; -import org.opendaylight.yangtools.binding.data.codec.api.BindingCodecTreeNode; -import org.opendaylight.yangtools.binding.data.codec.api.BindingNormalizedNodeCachingCodec; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; class RIBSupportContextImpl extends RIBSupportContext { private static final ContainerNode EMPTY_TABLE_ATTRIBUTES = ImmutableNodes.containerNode(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.tables.Attributes.QNAME); - private static final Set> ATTRIBUTE_CACHEABLES; - private static final InstanceIdentifier TABLE_BASE_II = InstanceIdentifier.builder(BgpRib.class) - .child(Rib.class) - .child(LocRib.class) - .child(Tables.class) - .build(); - private static final InstanceIdentifier MP_REACH_NLRI_II = InstanceIdentifier.create(Update.class) - .child(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.Attributes.class) - .augmentation(Attributes1.class) - .child(MpReachNlri.class); - private static final InstanceIdentifier MP_UNREACH_NLRI_II = InstanceIdentifier.create(Update.class) - .child(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.Attributes.class) - .augmentation(Attributes2.class) - .child(MpUnreachNlri.class); + private final RIBSupport ribSupport; + private final Codecs codecs; - - static { - final Builder> acb = ImmutableSet.builder(); - acb.add(Aggregator.class); - acb.add(BgpAggregator.class); - acb.add(AsPath.class); - acb.add(ClusterId.class); - acb.add(Community.class); - acb.add(Communities.class); - acb.add(ExtendedCommunity.class); - acb.add(ExtendedCommunities.class); - acb.add(LocalPref.class); - acb.add(MultiExitDisc.class); - acb.add(Origin.class); - acb.add(OriginatorId.class); - acb.add(UnrecognizedAttributes.class); - ATTRIBUTE_CACHEABLES = acb.build(); - } - - private final RIBSupport tableSupport; - private final ImmutableSet> cacheableAttributes; - private BindingNormalizedNodeCachingCodec attributesCodec; - private BindingNormalizedNodeCachingCodec reachNlriCodec; - private BindingNormalizedNodeCachingCodec unreachNlriCodec; - - - public RIBSupportContextImpl(final RIBSupport ribSupport) { - this.tableSupport = Preconditions.checkNotNull(ribSupport); - final Builder> acb = ImmutableSet.builder(); - acb.addAll(ATTRIBUTE_CACHEABLES); - acb.addAll(this.tableSupport.cacheableAttributeObjects()); - this.cacheableAttributes = acb.build(); - - } - - @SuppressWarnings("unchecked") - void onCodecTreeUpdated(final BindingCodecTree tree) { - - @SuppressWarnings("rawtypes") - final BindingCodecTreeNode tableCodecContext = tree.getSubtreeCodec(TABLE_BASE_II); - final BindingCodecTreeNode routeListCodec = tableCodecContext - .streamChild(Routes.class) - .streamChild(this.tableSupport.routesCaseClass()) - .streamChild(this.tableSupport.routesContainerClass()) - .streamChild(this.tableSupport.routesListClass()); - - this.attributesCodec = routeListCodec.streamChild(Attributes.class).createCachingCodec(this.cacheableAttributes); - this.reachNlriCodec = tree.getSubtreeCodec(MP_REACH_NLRI_II).createCachingCodec(this.tableSupport.cacheableNlriObjects()); - this.unreachNlriCodec = tree.getSubtreeCodec(MP_UNREACH_NLRI_II).createCachingCodec(this.tableSupport.cacheableNlriObjects()); + public RIBSupportContextImpl(final RIBSupport ribSupport, final CodecsRegistry codecs) { + this.ribSupport = Preconditions.checkNotNull(ribSupport); + this.codecs = codecs.getCodecs(this.ribSupport); } @Override public void writeRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tableId, final MpReachNlri nlri, final Attributes attributes) { - final ContainerNode domNlri = serialiazeReachNlri(nlri); - final ContainerNode routeAttributes = serializeAttributes(attributes); - this.tableSupport.putRoutes(tx, tableId, domNlri, routeAttributes); + final ContainerNode domNlri = this.codecs.serializeReachNlri(nlri); + final ContainerNode routeAttributes = this.codecs.serializeAttributes(attributes); + this.ribSupport.putRoutes(tx, tableId, domNlri, routeAttributes); } @Override @@ -148,8 +60,8 @@ class RIBSupportContextImpl extends RIBSupportContext { tb.withChild(ImmutableNodes.leafNode(e.getKey(), e.getValue())); } - final ChoiceNode routes = this.tableSupport.emptyRoutes(); - Verify.verifyNotNull(routes, "Null empty routes in %s", this.tableSupport); + final ChoiceNode routes = this.ribSupport.emptyRoutes(); + Verify.verifyNotNull(routes, "Null empty routes in %s", this.ribSupport); Verify.verify(Routes.QNAME.equals(routes.getNodeType()), "Empty routes have unexpected identifier %s, expected %s", routes.getNodeType(), Routes.QNAME); tx.put(LogicalDatastoreType.OPERATIONAL, tableId, tb.withChild(routes).build()); @@ -157,34 +69,11 @@ class RIBSupportContextImpl extends RIBSupportContext { @Override public void deleteRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tableId, final MpUnreachNlri nlri) { - this.tableSupport.deleteRoutes(tx, tableId, serialiazeUnreachNlri(nlri)); - } - - private ContainerNode serialiazeUnreachNlri(final MpUnreachNlri nlri) { - Preconditions.checkState(this.unreachNlriCodec != null, "MpReachNlri codec not available"); - return (ContainerNode) this.unreachNlriCodec.serialize(nlri); - } - - private ContainerNode serialiazeReachNlri(final MpReachNlri nlri) { - Preconditions.checkState(this.reachNlriCodec != null, "MpReachNlri codec not available"); - return (ContainerNode) this.reachNlriCodec.serialize(nlri); - } - - public Attributes deserializeAttributes(final NormalizedNode attributes) { - Preconditions.checkState(this.attributesCodec != null, "Attributes codec not available"); - return this.attributesCodec.deserialize(attributes); - } - - private ContainerNode serializeAttributes(final Attributes pathAttr) { - Preconditions.checkState(this.attributesCodec != null, "Attributes codec not available"); - final AttributesBuilder a = new AttributesBuilder(pathAttr); - a.addAugmentation(Attributes1.class, null); - a.addAugmentation(Attributes2.class, null); - return (ContainerNode) this.attributesCodec.serialize(a.build()); + this.ribSupport.deleteRoutes(tx, tableId, this.codecs.serializeUnreachNlri(nlri)); } @Override public RIBSupport getRibSupport() { - return this.tableSupport; + return this.ribSupport; } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBSupportContextRegistryImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBSupportContextRegistryImpl.java index eb99e69160..e0abb2991c 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBSupportContextRegistryImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBSupportContextRegistryImpl.java @@ -11,47 +11,38 @@ import com.google.common.base.Preconditions; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; +import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry; import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContext; import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext; import org.opendaylight.protocol.bgp.rib.spi.RIBSupport; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey; -import org.opendaylight.yangtools.binding.data.codec.api.BindingCodecTree; -import org.opendaylight.yangtools.binding.data.codec.api.BindingCodecTreeFactory; -import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy; -import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; final class RIBSupportContextRegistryImpl implements RIBSupportContextRegistry { - private static final Logger LOG = LoggerFactory.getLogger(RIBSupportContextRegistryImpl.class); private final LoadingCache contexts = CacheBuilder.newBuilder() .build(new CacheLoader(){ - @Override public RIBSupportContextImpl load(final RIBSupport key) { - return createContext(key); + return createRIBSupportContext(key); } }); private final RIBExtensionConsumerContext extensionContext; - private final BindingCodecTreeFactory codecFactory; - private final GeneratedClassLoadingStrategy classContext; - private volatile BindingCodecTree latestCodecTree; + private final CodecsRegistry codecs; - private RIBSupportContextRegistryImpl(final RIBExtensionConsumerContext extensions, final BindingCodecTreeFactory codecFactory, - final GeneratedClassLoadingStrategy strategy) { + private RIBSupportContextRegistryImpl(final RIBExtensionConsumerContext extensions, final CodecsRegistry codecs) { this.extensionContext = Preconditions.checkNotNull(extensions); - this.codecFactory = Preconditions.checkNotNull(codecFactory); - this.classContext = Preconditions.checkNotNull(strategy); + this.codecs = Preconditions.checkNotNull(codecs); + } + + static RIBSupportContextRegistryImpl create(final RIBExtensionConsumerContext extensions, final CodecsRegistry codecs) { + return new RIBSupportContextRegistryImpl(extensions, codecs); } - static RIBSupportContextRegistryImpl create(final RIBExtensionConsumerContext extensions, - final BindingCodecTreeFactory codecFactory, final GeneratedClassLoadingStrategy classStrategy) { - return new RIBSupportContextRegistryImpl(extensions, codecFactory, classStrategy); + private RIBSupportContextImpl createRIBSupportContext(final RIBSupport support) { + return new RIBSupportContextImpl(support, this.codecs); } @Override @@ -71,26 +62,4 @@ final class RIBSupportContextRegistryImpl implements RIBSupportContextRegistry { } return null; } - - private RIBSupportContextImpl createContext(final RIBSupport ribSupport) { - final RIBSupportContextImpl ribContext = new RIBSupportContextImpl(ribSupport); - if(this.latestCodecTree != null) { - // FIXME: Do we need to recalculate latestCodecTree? E.g. new rib support was added - // after bgp was started. - ribContext.onCodecTreeUpdated(this.latestCodecTree); - } - return ribContext; - } - - void onSchemaContextUpdated(final SchemaContext context) { - final BindingRuntimeContext runtimeContext = BindingRuntimeContext.create(this.classContext, context); - this.latestCodecTree = this.codecFactory.create(runtimeContext); - for(final RIBSupportContextImpl rib : this.contexts.asMap().values()) { - try { - rib.onCodecTreeUpdated(this.latestCodecTree); - } catch (final Exception e) { - LOG.error("Codec creation threw {}", e.getMessage(), e); - } - } - } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java index af80d6ae45..83fc0931d3 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java @@ -73,4 +73,6 @@ public interface RIB { * @return YangInstanceIdentifier */ YangInstanceIdentifier getYangRibId(); + + CodecsRegistry getCodecsRegistry(); }