import java.util.Collection;
import java.util.Collections;
+import java.util.List;
import java.util.concurrent.atomic.LongAdder;
import java.util.stream.Collectors;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.protocol.bgp.rib.impl.state.peer.PrefixesSentCounters;
import org.opendaylight.protocol.bgp.rib.spi.IdentifierUtils;
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.rev130715.Ipv4Prefix;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev180329.ipv4.routes.ipv4.routes.Ipv4Route;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.PathId;
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.NormalizedNodes;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode;
+import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
+import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidateNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private final ChannelOutputLimiter session;
private final Codecs codecs;
private final RIBSupport<?, ?> support;
+ // FIXME: this field needs to be eliminated: either subclass this class or create a filtering ribsupport
private final boolean mpSupport;
private final ListenerRegistration<AdjRibOutListener> registerDataTreeChangeListener;
private final LongAdder prefixesSentCounter = new LongAdder();
}
@Override
- public void onDataTreeChanged(final Collection<DataTreeCandidate> changes) {
+ public void onDataTreeChanged(final List<DataTreeCandidate> changes) {
LOG.debug("Data change received for AdjRibOut {}", changes);
for (final DataTreeCandidate tc : changes) {
LOG.trace("Change {} type {}", tc.getRootNode(), tc.getRootNode().getModificationType());
case DELETE:
case DISAPPEARED:
// FIXME: we can batch deletions into a single batch
- update = withdraw((MapEntryNode) route.getDataBefore().get());
+ update = withdraw((MapEntryNode) route.getDataBefore().orElseThrow());
LOG.debug("Withdrawing routes {}", update);
break;
case APPEARED:
case SUBTREE_MODIFIED:
case WRITE:
- update = advertise((MapEntryNode) route.getDataAfter().get());
+ update = advertise((MapEntryNode) route.getDataAfter().orElseThrow());
LOG.debug("Advertising routes {}", update);
break;
default:
}
private Update withdraw(final MapEntryNode route) {
- if (!mpSupport) {
- return buildUpdate(Collections.emptyList(), Collections.singleton(route), routeAttributes(route));
- }
- return support.buildUpdate(Collections.emptyList(), Collections.singleton(route), routeAttributes(route));
+ return mpSupport
+ ? support.buildUpdate(Collections.emptyList(), Collections.singleton(route), routeAttributes(route))
+ : buildUpdate(Collections.emptyList(), Collections.singleton(route), routeAttributes(route));
}
private Update advertise(final MapEntryNode route) {
prefixesSentCounter.increment();
- if (!mpSupport) {
- return buildUpdate(Collections.singleton(route), Collections.emptyList(), routeAttributes(route));
- }
- return support.buildUpdate(Collections.singleton(route), Collections.emptyList(), routeAttributes(route));
+ return mpSupport
+ ? support.buildUpdate(Collections.singleton(route), Collections.emptyList(), routeAttributes(route))
+ : buildUpdate(Collections.singleton(route), Collections.emptyList(), routeAttributes(route));
}
private static Update buildUpdate(