From b0423004a8fa34d033a9f83a7f76f687a9456c0a Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 28 Jun 2021 19:25:17 +0200 Subject: [PATCH] Split out OSGiBGPStateConsumer BGPStateCollectorImpl is a weird bit of code. We essentially have an OSGi whiteboard pattern going on here, except we drive it through an otherwise-unused BGPStateProducer interface. Turn GPStateCollectorImpl into a @Singleton for things like Guice et al, but it will need some more integration work to get it operation. Add OSGiBGPStateConsumer which is a trivial OSGi DS whiteboard consumer and thus eliminate a chunk of blueprint wiring. JIRA: BGPCEP-958 Change-Id: I92fd2ecb0ef3f1ecb1069536c8b2a4d6261f23c4 Signed-off-by: Robert Varga --- .../impl/state/AbstractBGPStateConsumer.java | 39 ++++++++++++++++++ .../rib/impl/state/BGPStateCollectorImpl.java | 41 ++++++++++--------- .../rib/impl/state/OSGiBGPStateConsumer.java | 34 +++++++++++++++ .../resources/OSGI-INF/blueprint/bgp-rib.xml | 17 -------- 4 files changed, 94 insertions(+), 37 deletions(-) create mode 100644 bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/AbstractBGPStateConsumer.java create mode 100644 bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/OSGiBGPStateConsumer.java diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/AbstractBGPStateConsumer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/AbstractBGPStateConsumer.java new file mode 100644 index 0000000000..90ee118fcc --- /dev/null +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/AbstractBGPStateConsumer.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.protocol.bgp.rib.impl.state; + +import com.google.common.collect.ImmutableList; +import java.util.List; +import java.util.Objects; +import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState; +import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerStateConsumer; +import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibState; +import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibStateConsumer; +import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateConsumer; + +abstract class AbstractBGPStateConsumer implements BGPStateConsumer { + @Override + public final List getRibStats() { + return bgpRibStates().stream() + .map(BGPRibStateConsumer::getRIBState) + .filter(Objects::nonNull) + .collect(ImmutableList.toImmutableList()); + } + + @Override + public final List getPeerStats() { + return bgpPeerStates().stream() + .map(BGPPeerStateConsumer::getPeerState) + .filter(Objects::nonNull) + .collect(ImmutableList.toImmutableList()); + } + + abstract List bgpRibStates(); + + abstract List bgpPeerStates(); +} diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollectorImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollectorImpl.java index 3b246dae1d..933f141856 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollectorImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/BGPStateCollectorImpl.java @@ -7,51 +7,52 @@ */ package org.opendaylight.protocol.bgp.rib.impl.state; -import com.google.common.collect.ImmutableList; import java.util.List; -import java.util.Objects; import java.util.concurrent.CopyOnWriteArrayList; -import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerState; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerStateConsumer; -import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibState; import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibStateConsumer; -import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateConsumer; import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateProvider; +@Singleton // This class is thread-safe -public class BGPStateCollectorImpl implements BGPStateProvider, BGPStateConsumer { +public final class BGPStateCollectorImpl extends AbstractBGPStateConsumer implements BGPStateProvider { private final List bgpRibStates = new CopyOnWriteArrayList<>(); private final List bgpPeerStates = new CopyOnWriteArrayList<>(); - @Override - public List getRibStats() { - return this.bgpRibStates.stream().map(BGPRibStateConsumer::getRIBState).filter(Objects::nonNull) - .collect(ImmutableList.toImmutableList()); - } - - @Override - public List getPeerStats() { - return this.bgpPeerStates.stream().map(BGPPeerStateConsumer::getPeerState).filter(Objects::nonNull) - .collect(ImmutableList.toImmutableList()); + @Inject + public BGPStateCollectorImpl() { + // Exposed for DI } @Override public void bind(final BGPRibStateConsumer bgpState) { - this.bgpRibStates.add(bgpState); + bgpRibStates.add(bgpState); } @Override public void bind(final BGPPeerStateConsumer bgpState) { - this.bgpPeerStates.add(bgpState); + bgpPeerStates.add(bgpState); } @Override public void unbind(final BGPRibStateConsumer bgpState) { - this.bgpRibStates.remove(bgpState); + bgpRibStates.remove(bgpState); } @Override public void unbind(final BGPPeerStateConsumer bgpState) { - this.bgpPeerStates.remove(bgpState); + bgpPeerStates.remove(bgpState); + } + + @Override + List bgpRibStates() { + return bgpRibStates; + } + + @Override + List bgpPeerStates() { + return bgpPeerStates; } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/OSGiBGPStateConsumer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/OSGiBGPStateConsumer.java new file mode 100644 index 0000000000..878666bbf6 --- /dev/null +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/state/OSGiBGPStateConsumer.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.protocol.bgp.rib.impl.state; + +import java.util.List; +import org.opendaylight.protocol.bgp.rib.spi.state.BGPPeerStateConsumer; +import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibStateConsumer; +import org.opendaylight.protocol.bgp.rib.spi.state.BGPStateConsumer; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferencePolicyOption; + +@Component(immediate = true, service = BGPStateConsumer.class) +public final class OSGiBGPStateConsumer extends AbstractBGPStateConsumer { + @Reference(policyOption = ReferencePolicyOption.GREEDY) + volatile List ribStates; + @Reference(policyOption = ReferencePolicyOption.GREEDY) + volatile List peerStates; + + @Override + List bgpRibStates() { + return ribStates; + } + + @Override + List bgpPeerStates() { + return peerStates; + } +} diff --git a/bgp/rib-impl/src/main/resources/OSGI-INF/blueprint/bgp-rib.xml b/bgp/rib-impl/src/main/resources/OSGI-INF/blueprint/bgp-rib.xml index 9a29802161..2f4b6247fd 100644 --- a/bgp/rib-impl/src/main/resources/OSGI-INF/blueprint/bgp-rib.xml +++ b/bgp/rib-impl/src/main/resources/OSGI-INF/blueprint/bgp-rib.xml @@ -59,21 +59,4 @@ - - - - - - - - - - - - - - - -- 2.36.6