From da922e6c3bb0361c373c66df754cab32d82e15e9 Mon Sep 17 00:00:00 2001 From: "Claudio D. Gasparini" Date: Thu, 19 May 2016 09:01:20 +0200 Subject: [PATCH] Remove duplicated code for rib support Remove ApplyRoute Delete/Put in each ribsupport for an common one since all of them do the same in each extension Change-Id: I1ea02916487beaa71104f294c8a6aafa896a6b31 Signed-off-by: Claudio D. Gasparini --- .../bgp/evpn/impl/EvpnRibSupport.java | 42 +------------------ .../flowspec/AbstractFlowspecRIBSupport.java | 39 ----------------- .../bgp/l3vpn/AbstractVpnRIBSupport.java | 38 +---------------- .../unicast/LabeledUnicastRIBSupport.java | 39 ----------------- .../bgp/linkstate/LinkstateRIBSupport.java | 37 ---------------- .../bgp/rib/impl/AbstractIPRIBSupport.java | 40 ------------------ .../protocol/bgp/rib/impl/IPv4RIBSupport.java | 6 +-- .../bgp/rib/spi/AbstractRIBSupport.java | 36 +++++++++++++++- .../protocol/bgp/rib/spi/RIBSupport.java | 8 ++++ 9 files changed, 48 insertions(+), 237 deletions(-) diff --git a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/EvpnRibSupport.java b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/EvpnRibSupport.java index 8c2e8456f1..3377b4ab27 100644 --- a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/EvpnRibSupport.java +++ b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/EvpnRibSupport.java @@ -18,7 +18,6 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import javax.annotation.Nonnull; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; import org.opendaylight.protocol.bgp.evpn.impl.nlri.EvpnNlriParser; import org.opendaylight.protocol.bgp.rib.spi.AbstractRIBSupport; @@ -48,14 +47,11 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgum 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.DataContainerChild; -import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -67,8 +63,6 @@ final class EvpnRibSupport extends AbstractRIBSupport { private static final NodeIdentifier NLRI_ROUTES_LIST = NodeIdentifier.create(EvpnDestination.QNAME); private static final NodeIdentifier ROUTE = NodeIdentifier.create(EvpnRoute.QNAME); - private static final ApplyRoute DELETE_ROUTE = new DeleteRoute(); - private static final ApplyRoute PUT_ROUTE = new PutRoute(); private static final ChoiceNode EMPTY_ROUTES = Builders.choiceBuilder().withNodeIdentifier(NodeIdentifier.create(Routes.QNAME)) .addChild(Builders.containerBuilder().withNodeIdentifier(NodeIdentifier.create(EvpnRoutes.QNAME)) .addChild(ImmutableNodes.mapNodeBuilder(EvpnRoute.QNAME).build()).build()).build(); @@ -77,38 +71,6 @@ final class EvpnRibSupport extends AbstractRIBSupport { super(EvpnRoutesCase.class, EvpnRoutes.class, EvpnRoute.class); } - private interface ApplyRoute { - void apply(DOMDataWriteTransaction tx, YangInstanceIdentifier base, NodeIdentifierWithPredicates routeKey, DataContainerNode route, - ContainerNode attributes, NodeIdentifier nodeIdentifier); - } - - private static class DeleteRoute implements ApplyRoute { - @Override - public void apply(final DOMDataWriteTransaction tx, final YangInstanceIdentifier base, final NodeIdentifierWithPredicates routeKey, - final DataContainerNode route, final ContainerNode attributes, final NodeIdentifier nodeIdentifier) { - tx.delete(LogicalDatastoreType.OPERATIONAL, base.node(routeKey)); - } - } - - private static final class PutRoute implements ApplyRoute { - private ContainerNode addAttributes(final ContainerNode attributes, final NodeIdentifier routeAttII) { - final DataContainerNodeAttrBuilder cb = Builders.containerBuilder(attributes); - cb.withNodeIdentifier(routeAttII); - return cb.build(); - } - - @Override - public void apply(final DOMDataWriteTransaction tx, final YangInstanceIdentifier base, final NodeIdentifierWithPredicates routeKey, - final DataContainerNode route, final ContainerNode attributes, final NodeIdentifier routeAttII) { - final DataContainerNodeBuilder b = ImmutableNodes.mapEntryBuilder(); - b.withNodeIdentifier(routeKey); - - route.getValue().forEach(b::withChild); - b.withChild(addAttributes(attributes, routeAttII)); - tx.put(LogicalDatastoreType.OPERATIONAL, base.node(routeKey), b.build()); - } - } - static EvpnRibSupport getInstance() { return SINGLETON; } @@ -151,7 +113,7 @@ final class EvpnRibSupport extends AbstractRIBSupport { @Override protected void putDestinationRoutes(final DOMDataWriteTransaction tx, final YangInstanceIdentifier tablePath, final ContainerNode destination, final ContainerNode attributes, final NodeIdentifier routesNodeId) { - processDestination(tx, tablePath.node(routesNodeId), destination, attributes, PUT_ROUTE); + processDestination(tx, tablePath.node(routesNodeId), destination, attributes, putRoute); } @Nonnull @@ -195,7 +157,7 @@ final class EvpnRibSupport extends AbstractRIBSupport { final YangInstanceIdentifier base = routesPath.node(routesContainerIdentifier()).node(ROUTE); for (final UnkeyedListEntryNode e : ((UnkeyedListNode) routes).getValue()) { final NodeIdentifierWithPredicates routeKey = createRouteKey(e); - function.apply(tx, base, routeKey, e, attributes, routeAttributesIdentifier()); + function.apply(tx, base, routeKey, e, attributes); } } else { LOG.warn("Routes {} are not a map", routes); diff --git a/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/AbstractFlowspecRIBSupport.java b/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/AbstractFlowspecRIBSupport.java index 4a19e81fe2..ba6c83ad32 100644 --- a/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/AbstractFlowspecRIBSupport.java +++ b/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/AbstractFlowspecRIBSupport.java @@ -12,7 +12,6 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import java.util.Collection; import javax.annotation.Nullable; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; import org.opendaylight.protocol.bgp.parser.spi.PathIdUtil; import org.opendaylight.protocol.bgp.rib.spi.AbstractRIBSupport; @@ -36,52 +35,14 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; -import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; 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.Builders; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; public abstract class AbstractFlowspecRIBSupport extends AbstractRIBSupport { private static final QName PATHID_QNAME = QName.create(FlowspecRoute.QNAME, "path-id").intern(); private static final NodeIdentifier PATH_ID_NII = new NodeIdentifier(PATHID_QNAME); - protected abstract static class ApplyRoute { - abstract void apply(DOMDataWriteTransaction tx, YangInstanceIdentifier base, NodeIdentifierWithPredicates routeKey, DataContainerNode route, final ContainerNode attributes); - } - - protected static final class DeleteRoute extends ApplyRoute { - @Override - void apply(final DOMDataWriteTransaction tx, final YangInstanceIdentifier base, final NodeIdentifierWithPredicates routeKey, final DataContainerNode route, final ContainerNode attributes) { - tx.delete(LogicalDatastoreType.OPERATIONAL, base.node(routeKey)); - } - } - - protected final class PutRoute extends ApplyRoute { - @Override - void apply(final DOMDataWriteTransaction tx, final YangInstanceIdentifier base, final NodeIdentifierWithPredicates routeKey, - final DataContainerNode route, final ContainerNode attributes) { - final DataContainerNodeBuilder b = ImmutableNodes.mapEntryBuilder(); - b.withNodeIdentifier(routeKey); - - // FIXME: All route children, there should be a utility somewhere to do this - for (final DataContainerChild child : route.getValue()) { - b.withChild(child); - } - // Add attributes - final DataContainerNodeAttrBuilder cb = Builders.containerBuilder(attributes); - cb.withNodeIdentifier(routeAttributesIdentifier()); - b.withChild(cb.build()); - tx.put(LogicalDatastoreType.OPERATIONAL, base.node(routeKey), b.build()); - } - } - private static final QName ROUTE_KEY = QName.create(FlowspecRoute.QNAME, "route-key").intern(); - private static final ApplyRoute DELETE_ROUTE = new DeleteRoute(); - private final ApplyRoute putRoute = new PutRoute(); protected AbstractFlowspecRIBSupport(final Class cazeClass, final Class containerClass, final Class listClass) { diff --git a/bgp/l3vpn/src/main/java/org/opendaylight/protocol/bgp/l3vpn/AbstractVpnRIBSupport.java b/bgp/l3vpn/src/main/java/org/opendaylight/protocol/bgp/l3vpn/AbstractVpnRIBSupport.java index 865e27da08..7b72c90775 100644 --- a/bgp/l3vpn/src/main/java/org/opendaylight/protocol/bgp/l3vpn/AbstractVpnRIBSupport.java +++ b/bgp/l3vpn/src/main/java/org/opendaylight/protocol/bgp/l3vpn/AbstractVpnRIBSupport.java @@ -18,7 +18,6 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import javax.annotation.Nonnull; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; import org.opendaylight.protocol.bgp.labeled.unicast.LabeledUnicastRIBSupport; import org.opendaylight.protocol.bgp.rib.spi.AbstractRIBSupport; @@ -55,8 +54,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -65,7 +62,6 @@ import org.slf4j.LoggerFactory; */ public abstract class AbstractVpnRIBSupport extends AbstractRIBSupport { private static final Logger LOG = LoggerFactory.getLogger(AbstractVpnRIBSupport.class); - private static final ApplyRoute DELETE_ROUTE = new DeleteRoute(); private final NodeIdentifier NLRI_ROUTES_LIST; private final NodeIdentifier PREFIX_TYPE_NID; private final NodeIdentifier LABEL_STACK_NID; @@ -74,7 +70,6 @@ public abstract class AbstractVpnRIBSupport extends AbstractRIBSupport { private final NodeIdentifier DESTINATION; private final QName ROUTE_KEY; private final NodeIdentifier ROUTE; - private final ApplyRoute PUT_ROUTE = new PutRoute(); private final Class ADDRESS_FAMILY_CLAZZ; private final QName CONTAINER_CLASS_QNAME; private final QName LIST_CLASS_QNAME; @@ -164,7 +159,7 @@ public abstract class AbstractVpnRIBSupport extends AbstractRIBSupport { @Override protected void putDestinationRoutes(DOMDataWriteTransaction tx, YangInstanceIdentifier tablePath, ContainerNode destination, ContainerNode attributes, YangInstanceIdentifier.NodeIdentifier routesNodeId) { - processDestination(tx, tablePath.node(routesNodeId), destination, attributes, PUT_ROUTE); + processDestination(tx, tablePath.node(routesNodeId), destination, attributes, putRoute); } protected abstract DestinationType getAdvertizedDestinationType(List dests); @@ -255,35 +250,4 @@ public abstract class AbstractVpnRIBSupport extends AbstractRIBSupport { AbstractVpnNlriParser.serializeNlri(Collections.singletonList(dest), buffer); return new NodeIdentifierWithPredicates(LIST_CLASS_QNAME, ROUTE_KEY, ByteArray.readAllBytes(buffer)); } - - private abstract static class ApplyRoute { - abstract void apply(DOMDataWriteTransaction tx, YangInstanceIdentifier base, YangInstanceIdentifier.NodeIdentifierWithPredicates routeKey, DataContainerNode route, final ContainerNode attributes); - } - - private static final class DeleteRoute extends ApplyRoute { - @Override - void apply(final DOMDataWriteTransaction tx, final YangInstanceIdentifier base, - final NodeIdentifierWithPredicates routeKey, - final DataContainerNode route, final ContainerNode attributes) { - tx.delete(LogicalDatastoreType.OPERATIONAL, base.node(routeKey)); - } - } - - private final class PutRoute extends ApplyRoute { - @Override - void apply(final DOMDataWriteTransaction tx, final YangInstanceIdentifier base, - final NodeIdentifierWithPredicates routeKey, - final DataContainerNode route, final ContainerNode attributes) { - // Build the DataContainer data - final DataContainerNodeBuilder b = ImmutableNodes.mapEntryBuilder(); - b.withNodeIdentifier(routeKey); - - route.getValue().forEach(b::withChild); - // Add attributes - final DataContainerNodeAttrBuilder cb = Builders.containerBuilder(attributes); - cb.withNodeIdentifier(routeAttributesIdentifier()); - b.withChild(cb.build()); - tx.put(LogicalDatastoreType.OPERATIONAL, base.node(routeKey), b.build()); - } - } } diff --git a/bgp/labeled-unicast/src/main/java/org/opendaylight/protocol/bgp/labeled/unicast/LabeledUnicastRIBSupport.java b/bgp/labeled-unicast/src/main/java/org/opendaylight/protocol/bgp/labeled/unicast/LabeledUnicastRIBSupport.java index c0925d5c88..a1a40416bb 100644 --- a/bgp/labeled-unicast/src/main/java/org/opendaylight/protocol/bgp/labeled/unicast/LabeledUnicastRIBSupport.java +++ b/bgp/labeled-unicast/src/main/java/org/opendaylight/protocol/bgp/labeled/unicast/LabeledUnicastRIBSupport.java @@ -17,7 +17,6 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import javax.annotation.Nonnull; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; import org.opendaylight.protocol.bgp.parser.spi.PathIdUtil; import org.opendaylight.protocol.bgp.rib.spi.AbstractRIBSupport; @@ -63,8 +62,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -78,7 +75,6 @@ public final class LabeledUnicastRIBSupport extends AbstractRIBSupport { private static final NodeIdentifier LV_NID = NodeIdentifier.create(QName.create(CLabeledUnicastDestination.QNAME, "label-value").intern()); private static final QName ROUTE_KEY = QName.create(LabeledUnicastRoute.QNAME, "route-key").intern(); - private static final ApplyRoute DELETE_ROUTE = new DeleteRoute(); private static final ChoiceNode EMPTY_ROUTES = Builders.choiceBuilder() .withNodeIdentifier(NodeIdentifier.create(Routes.QNAME)) @@ -89,41 +85,6 @@ public final class LabeledUnicastRIBSupport extends AbstractRIBSupport { private static final NodeIdentifier ROUTE = NodeIdentifier.create(LabeledUnicastRoute.QNAME); private static final NodeIdentifier NLRI_ROUTES_LIST = NodeIdentifier.create(CLabeledUnicastDestination.QNAME); - private final ApplyRoute putRoute = new PutRoute(); - - private abstract static class ApplyRoute { - abstract void apply(DOMDataWriteTransaction tx, YangInstanceIdentifier base, NodeIdentifierWithPredicates routeKey, DataContainerNode route, final ContainerNode attributes); - } - - private static final class DeleteRoute extends ApplyRoute { - @Override - void apply(final DOMDataWriteTransaction tx, final YangInstanceIdentifier base, - final NodeIdentifierWithPredicates routeKey, - final DataContainerNode route, final ContainerNode attributes) { - tx.delete(LogicalDatastoreType.OPERATIONAL, base.node(routeKey)); - } - } - - private final class PutRoute extends ApplyRoute { - @Override - void apply(final DOMDataWriteTransaction tx, final YangInstanceIdentifier base, - final NodeIdentifierWithPredicates routeKey, - final DataContainerNode route, final ContainerNode attributes) { - // Build the DataContainer data - final DataContainerNodeBuilder b = ImmutableNodes.mapEntryBuilder(); - b.withNodeIdentifier(routeKey); - - for (final DataContainerChild child : route.getValue()) { - b.withChild(child); - } - // Add attributes - final DataContainerNodeAttrBuilder cb = Builders.containerBuilder(attributes); - cb.withNodeIdentifier(routeAttributesIdentifier()); - b.withChild(cb.build()); - tx.put(LogicalDatastoreType.OPERATIONAL, base.node(routeKey), b.build()); - } - } - private final Class afiType; public LabeledUnicastRIBSupport(final Class afiType) { diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateRIBSupport.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateRIBSupport.java index 5b052c20d3..afa5b17a9b 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateRIBSupport.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateRIBSupport.java @@ -15,7 +15,6 @@ import io.netty.buffer.Unpooled; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; import org.opendaylight.protocol.bgp.linkstate.nlri.LinkstateNlriParser; import org.opendaylight.protocol.bgp.rib.spi.AbstractRIBSupport; @@ -46,54 +45,19 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgum 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.DataContainerChild; -import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; final class LinkstateRIBSupport extends AbstractRIBSupport { - private abstract static class ApplyRoute { - abstract void apply(DOMDataWriteTransaction tx, YangInstanceIdentifier base, NodeIdentifierWithPredicates routeKey, DataContainerNode route, final ContainerNode attributes); - } - - private static final class DeleteRoute extends ApplyRoute { - @Override - void apply(final DOMDataWriteTransaction tx, final YangInstanceIdentifier base, final NodeIdentifierWithPredicates routeKey, final DataContainerNode route, final ContainerNode attributes) { - tx.delete(LogicalDatastoreType.OPERATIONAL, base.node(routeKey)); - } - } - - private final class PutRoute extends ApplyRoute { - @Override - void apply(final DOMDataWriteTransaction tx, final YangInstanceIdentifier base, final NodeIdentifierWithPredicates routeKey, - final DataContainerNode route, final ContainerNode attributes) { - final DataContainerNodeBuilder b = ImmutableNodes.mapEntryBuilder(); - b.withNodeIdentifier(routeKey); - - // FIXME: All route children, there should be a utility somewhere to do this - for (final DataContainerChild child : route.getValue()) { - b.withChild(child); - } - // Add attributes - final DataContainerNodeAttrBuilder cb = Builders.containerBuilder(attributes); - cb.withNodeIdentifier(routeAttributesIdentifier()); - b.withChild(cb.build()); - tx.put(LogicalDatastoreType.OPERATIONAL, base.node(routeKey), b.build()); - } - } - private static final Logger LOG = LoggerFactory.getLogger(LinkstateRIBSupport.class); private static final QName ROUTE_KEY = QName.create(LinkstateRoute.QNAME, "route-key").intern(); private static final LinkstateRIBSupport SINGLETON = new LinkstateRIBSupport(); - private static final ApplyRoute DELETE_ROUTE = new DeleteRoute(); - private final ChoiceNode emptyRoutes = Builders.choiceBuilder() .withNodeIdentifier(new NodeIdentifier(Routes.QNAME)) .addChild(Builders.containerBuilder() @@ -102,7 +66,6 @@ final class LinkstateRIBSupport extends AbstractRIBSupport { private final NodeIdentifier destination = new NodeIdentifier(DestinationLinkstate.QNAME); private final NodeIdentifier route = new NodeIdentifier(LinkstateRoute.QNAME); private final NodeIdentifier nlriRoutesList = new NodeIdentifier(CLinkstateDestination.QNAME); - private final ApplyRoute putRoute = new PutRoute(); private LinkstateRIBSupport() { super(LinkstateRoutesCase.class, LinkstateRoutes.class, LinkstateRoute.class); diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AbstractIPRIBSupport.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AbstractIPRIBSupport.java index e8c6f8a822..c6faf6b4e4 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AbstractIPRIBSupport.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AbstractIPRIBSupport.java @@ -12,7 +12,6 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableSet; import javax.annotation.Nonnull; -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.spi.AbstractRIBSupport; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.Route; @@ -25,15 +24,9 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; -import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; -import org.opendaylight.yangtools.yang.data.impl.schema.Builders; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,40 +34,7 @@ import org.slf4j.LoggerFactory; * Common {@link org.opendaylight.protocol.bgp.rib.spi.RIBSupport} class for IPv4 and IPv6 addresses. */ abstract class AbstractIPRIBSupport extends AbstractRIBSupport { - private abstract static class ApplyRoute { - abstract void apply(DOMDataWriteTransaction tx, YangInstanceIdentifier base, NodeIdentifierWithPredicates routeKey, DataContainerNode route, final ContainerNode attributes); - } - - private static final class DeleteRoute extends ApplyRoute { - @Override - void apply(final DOMDataWriteTransaction tx, final YangInstanceIdentifier base, final NodeIdentifierWithPredicates routeKey, final DataContainerNode route, final ContainerNode attributes) { - tx.delete(LogicalDatastoreType.OPERATIONAL, base.node(routeKey)); - } - } - - private final class PutRoute extends ApplyRoute { - @Override - void apply(final DOMDataWriteTransaction tx, final YangInstanceIdentifier base, final NodeIdentifierWithPredicates routeKey, final DataContainerNode route, final ContainerNode attributes) { - final DataContainerNodeBuilder b = ImmutableNodes.mapEntryBuilder(); - b.withNodeIdentifier(routeKey); - b.withChild(ImmutableNodes.leafNode(routeKeyLeafIdentifier(), routeKey.getKeyValues().get(routeQName()))); - - // FIXME: All route children, there should be a utility somewhere to do this - for (final DataContainerChild child : route.getValue()) { - b.withChild(child); - } - - // Add attributes - final DataContainerNodeAttrBuilder cb = Builders.containerBuilder(attributes); - cb.withNodeIdentifier(routeAttributesIdentifier()); - b.withChild(cb.build()); - tx.put(LogicalDatastoreType.OPERATIONAL, base.node(routeKey), b.build()); - } - } - private static final Logger LOG = LoggerFactory.getLogger(AbstractIPRIBSupport.class); - private static final ApplyRoute DELETE_ROUTE = new DeleteRoute(); - private final ApplyRoute putRoute = new PutRoute(); protected AbstractIPRIBSupport(final Class cazeClass, final Class containerClass, final Class listClass) { diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/IPv4RIBSupport.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/IPv4RIBSupport.java index 777ad4d13e..38da40cc91 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/IPv4RIBSupport.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/IPv4RIBSupport.java @@ -54,10 +54,8 @@ final class IPv4RIBSupport extends AbstractIPRIBSupport { private static final IPv4RIBSupport SINGLETON = new IPv4RIBSupport(); private static final ImmutableCollection> CACHEABLE_NLRI_OBJECTS = ImmutableSet.of(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.Ipv4Prefix.class); - private final ChoiceNode emptyRoutes = Builders.choiceBuilder() - .withNodeIdentifier(new NodeIdentifier(Routes.QNAME)) - .addChild(Builders.containerBuilder() - .withNodeIdentifier(new NodeIdentifier(Ipv4Routes.QNAME)) + private final ChoiceNode emptyRoutes = Builders.choiceBuilder().withNodeIdentifier(new NodeIdentifier(Routes.QNAME)) + .addChild(Builders.containerBuilder().withNodeIdentifier(new NodeIdentifier(Ipv4Routes.QNAME)) .withChild(ImmutableNodes.mapNodeBuilder(Ipv4Route.QNAME).build()).build()).build(); private final NodeIdentifier destination = new NodeIdentifier(DestinationIpv4.QNAME); private final NodeIdentifier ipv4Route = new NodeIdentifier(Ipv4Route.QNAME); diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBSupport.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBSupport.java index 7168dbb882..a0a9b8ce86 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBSupport.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBSupport.java @@ -14,6 +14,7 @@ import java.util.Collection; import java.util.Collections; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; 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.UpdateBuilder; @@ -36,13 +37,19 @@ import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; 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.DataContainerChild; +import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode; +import org.opendaylight.yangtools.yang.data.impl.schema.Builders; +import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,6 +60,7 @@ public abstract class AbstractRIBSupport implements RIBSupport { private static final NodeIdentifier WITHDRAWN_ROUTES = new NodeIdentifier(WithdrawnRoutes.QNAME); private static final NodeIdentifier DESTINATION_TYPE = new NodeIdentifier(DestinationType.QNAME); private static final NodeIdentifier ROUTES = new NodeIdentifier(Routes.QNAME); + protected static final ApplyRoute DELETE_ROUTE = new DeleteRoute(); private static final long NON_PATH_ID = 0; private final NodeIdentifier routesContainerIdentifier; @@ -61,7 +69,7 @@ public abstract class AbstractRIBSupport implements RIBSupport { private final Class cazeClass; private final Class containerClass; private final Class listClass; - + protected final ApplyRoute putRoute = new PutRoute(); /** * Default constructor. Requires the QName of the container augmented under the routes choice @@ -297,4 +305,30 @@ public abstract class AbstractRIBSupport implements RIBSupport { public Long extractPathId(final NormalizedNode data) { return NON_PATH_ID; } + + + private static class DeleteRoute implements ApplyRoute { + @Override + public void apply(final DOMDataWriteTransaction tx, final YangInstanceIdentifier base, final NodeIdentifierWithPredicates routeKey, + final DataContainerNode route, final ContainerNode attributes) { + tx.delete(LogicalDatastoreType.OPERATIONAL, base.node(routeKey)); + } + } + + private final class PutRoute implements ApplyRoute { + @Override + public void apply(final DOMDataWriteTransaction tx, final YangInstanceIdentifier base, final NodeIdentifierWithPredicates routeKey, + final DataContainerNode route, final ContainerNode attributes) { + // Build the DataContainer data + final DataContainerNodeBuilder b = ImmutableNodes.mapEntryBuilder(); + b.withNodeIdentifier(routeKey); + + route.getValue().forEach(b::withChild); + // Add attributes + final DataContainerNodeAttrBuilder cb = Builders.containerBuilder(attributes); + cb.withNodeIdentifier(routeAttributesIdentifier()); + b.withChild(cb.build()); + tx.put(LogicalDatastoreType.OPERATIONAL, base.node(routeKey), b.build()); + } + } } diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBSupport.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBSupport.java index b022cb421f..c47a7bd231 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBSupport.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBSupport.java @@ -18,9 +18,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib. import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; 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.DataContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode; @@ -164,4 +166,10 @@ public interface RIBSupport extends AddPathRibSupport { * @return Update message ready to be sent out */ @Nonnull Update buildUpdate(@Nonnull Collection advertised, @Nonnull Collection withdrawn, @Nonnull Attributes attr); + + + interface ApplyRoute { + void apply(DOMDataWriteTransaction tx, YangInstanceIdentifier base, NodeIdentifierWithPredicates routeKey, DataContainerNode route, + ContainerNode attributes); + } } -- 2.36.6