import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import java.util.Collections;
+import com.google.common.util.concurrent.FluentFuture;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
= InstanceIdentifier.create(RoutingPolicy.class).child(DefinedSets.class)
.augmentation(DefinedSets1.class).child(BgpDefinedSets.class)
.child(CommunitySets.class);
- private final DataBroker databroker;
- protected final LoadingCache<String, List<Communities>> communitySets = CacheBuilder.newBuilder()
+ protected final LoadingCache<String, List<Communities>> communitySets;
+
+ public AbstractCommunityHandler(final DataBroker dataBroker) {
+ requireNonNull(dataBroker);
+ communitySets = CacheBuilder.newBuilder()
.build(new CacheLoader<String, List<Communities>>() {
@Override
public List<Communities> load(final String key) throws ExecutionException, InterruptedException {
- return loadCommunitySet(key);
+ final FluentFuture<Optional<CommunitySet>> future;
+ try (ReadTransaction tr = dataBroker.newReadOnlyTransaction()) {
+ future = tr.read(LogicalDatastoreType.CONFIGURATION,
+ COMMUNITY_SETS_IID.child(CommunitySet.class, new CommunitySetKey(key)));
+ }
+
+ return future.get().map(set -> set.nonnullCommunities().stream()
+ .map(ge -> new CommunitiesBuilder()
+ .setAsNumber(ge.getAsNumber())
+ .setSemantics(ge.getSemantics())
+ .build())
+ .collect(Collectors.toUnmodifiableList()))
+ .orElse(List.of());
}
});
-
- public AbstractCommunityHandler(final DataBroker dataBroker) {
- this.databroker = requireNonNull(dataBroker);
- }
-
- @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD",
- justification = "https://github.com/spotbugs/spotbugs/issues/811")
- private List<Communities> loadCommunitySet(final String key) throws ExecutionException, InterruptedException {
- final ReadTransaction tr = this.databroker.newReadOnlyTransaction();
- final Optional<CommunitySet> result =
- tr.read(LogicalDatastoreType.CONFIGURATION, COMMUNITY_SETS_IID
- .child(CommunitySet.class, new CommunitySetKey(key))).get();
-
-
- if (!result.isPresent()) {
- return Collections.emptyList();
- }
-
- return result.get().getCommunities()
- .stream().map(ge -> new CommunitiesBuilder().setAsNumber(ge.getAsNumber())
- .setSemantics(ge.getSemantics()).build()).collect(Collectors.toList());
}
}
--- /dev/null
+/*
+ * Copyright (c) 2020 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.openconfig.routing.policy.statement;
+
+import static com.google.common.base.Verify.verifyNotNull;
+
+import java.util.List;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.AbstractBGPStatementProviderActivator;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.StatementProviderActivator;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.StatementRegistryProvider;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+
+@Component(immediate = true, service = StatementProviderActivator.class,
+ property = "type=org.opendaylight.protocol.bgp.openconfig.routing.policy.statement.StatementActivator")
+public final class OSGiStatementActivator extends AbstractBGPStatementProviderActivator {
+ @Reference
+ DataBroker dataBroker;
+
+ private StatementActivator delegate;
+
+ @Override
+ protected List<? extends Registration> startImpl(final StatementRegistryProvider context) {
+ return verifyNotNull(delegate).startImpl(context);
+ }
+
+ @Activate
+ void activate() {
+ delegate = new StatementActivator(dataBroker);
+ }
+
+ @Deactivate
+ void deactivate() {
+ delegate = null;
+ }
+}
import static java.util.Objects.requireNonNull;
-import java.util.ArrayList;
+import com.google.common.base.MoreObjects;
import java.util.List;
+import java.util.ServiceLoader;
+import javax.inject.Inject;
+import javax.inject.Singleton;
import org.kohsuke.MetaInfServices;
import org.opendaylight.mdsal.binding.api.DataBroker;
import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.AbstractBGPStatementProviderActivator;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp._default.policy.rev200120.VpnNonMemberCondition;
import org.opendaylight.yangtools.concepts.Registration;
+@Singleton
@MetaInfServices(value = StatementProviderActivator.class)
public final class StatementActivator extends AbstractBGPStatementProviderActivator {
private final DataBroker dataBroker;
- // FIXME: this needs to be properly injected
+ public StatementActivator() {
+ this(ServiceLoader.load(DataBroker.class).findFirst().orElseThrow(
+ () -> new IllegalStateException("No DataBroker found")));
+ }
+
+ @Inject
public StatementActivator(final DataBroker dataBroker) {
this.dataBroker = requireNonNull(dataBroker);
}
@Override
- protected synchronized List<Registration> startImpl(final StatementRegistryProvider provider) {
- final List<Registration> registration = new ArrayList<>(14);
- registerActions(provider, registration);
- registerConditions(provider, registration);
- return registration;
- }
-
- private void registerConditions(final StatementRegistryProvider provider, final List<Registration> registration) {
- registration.add(provider.registerBgpConditionsAugmentationPolicy(MatchRoleSetCondition.class,
- new MatchRoleSetHandler(this.dataBroker)));
-
- registration.add(provider.registerBgpConditionsAugmentationPolicy(MatchOriginatorIdSetCondition.class,
- new MatchOriginatorIdSetHandler(this.dataBroker)));
-
- registration.add(provider.registerBgpConditionsAugmentationPolicy(MatchClusterIdSetCondition.class,
- new MatchClusterIdSetHandler(this.dataBroker)));
-
- registration.add(provider.registerBgpConditionsPolicy(MatchAsPathSet.class,
- new MatchAsPathSetHandler(this.dataBroker)));
-
- registration.add(provider.registerBgpConditionsPolicy(MatchExtCommunitySet.class,
- new MatchExtCommunitySetHandler(this.dataBroker)));
-
- registration.add(provider.registerBgpConditionsPolicy(MatchCommunitySet.class,
- new MatchCommunitySetHandler(this.dataBroker)));
-
- registration.add(provider.registerBgpConditionsAugmentationPolicy(MatchBgpNeighborCondition.class,
- new MatchBgpNeighborSetHandler(this.dataBroker)));
-
- registration.add(provider.registerBgpConditionsAugmentationPolicy(MatchAfiSafiNotInCondition.class,
- MatchAfiSafiNotInHandler.getInstance()));
-
- registration.add(provider.registerBgpConditionsAugmentationPolicy(VpnNonMemberCondition.class,
+ protected synchronized List<Registration> startImpl(final StatementRegistryProvider context) {
+ return List.of(
+ // Register actions
+ context.registerBgpActionPolicy(SetAsPathPrepend.class, AsPathPrepend.getInstance()),
+ context.registerBgpActionAugmentationPolicy(LocalAsPathPrepend.class,
+ LocalAsPathPrependHandler.getInstance()),
+ context.registerBgpActionPolicy(SetCommunity.class, new SetCommunityHandler(dataBroker)),
+ context.registerBgpActionPolicy(SetExtCommunity.class, new SetExtCommunityHandler(dataBroker)),
+ context.registerBgpActionAugmentationPolicy(SetOriginatorIdPrepend.class,
+ SetOriginatorIdPrependHandler.getInstance()),
+ context.registerBgpActionAugmentationPolicy(NonTransitiveAttributesFilter.class,
+ NonTransitiveAttributesFilterHandler.getInstance()),
+ context.registerBgpActionAugmentationPolicy(SetClusterIdPrepend.class,
+ SetClusterIdPrependHandler.getInstance()),
+
+ // Register conditions
+ context.registerBgpConditionsAugmentationPolicy(MatchRoleSetCondition.class,
+ new MatchRoleSetHandler(dataBroker)),
+ context.registerBgpConditionsAugmentationPolicy(MatchOriginatorIdSetCondition.class,
+ new MatchOriginatorIdSetHandler(dataBroker)),
+ context.registerBgpConditionsAugmentationPolicy(MatchClusterIdSetCondition.class,
+ new MatchClusterIdSetHandler(dataBroker)),
+ context.registerBgpConditionsPolicy(MatchAsPathSet.class, new MatchAsPathSetHandler(dataBroker)),
+ context.registerBgpConditionsPolicy(MatchExtCommunitySet.class,
+ new MatchExtCommunitySetHandler(dataBroker)),
+ context.registerBgpConditionsPolicy(MatchCommunitySet.class, new MatchCommunitySetHandler(dataBroker)),
+ context.registerBgpConditionsAugmentationPolicy(MatchBgpNeighborCondition.class,
+ new MatchBgpNeighborSetHandler(dataBroker)),
+ context.registerBgpConditionsAugmentationPolicy(MatchAfiSafiNotInCondition.class,
+ MatchAfiSafiNotInHandler.getInstance()),
+ context.registerBgpConditionsAugmentationPolicy(VpnNonMemberCondition.class,
VpnNonMemberHandler.getInstance()));
}
- private void registerActions(final StatementRegistryProvider provider, final List<Registration> registration) {
- registration.add(provider.registerBgpActionPolicy(SetAsPathPrepend.class, AsPathPrepend.getInstance()));
-
- registration.add(provider.registerBgpActionAugmentationPolicy(LocalAsPathPrepend.class,
- LocalAsPathPrependHandler.getInstance()));
-
- registration.add(provider.registerBgpActionPolicy(SetCommunity.class,
- new SetCommunityHandler(this.dataBroker)));
-
- registration.add(provider.registerBgpActionPolicy(SetExtCommunity.class,
- new SetExtCommunityHandler(this.dataBroker)));
-
- registration.add(provider.registerBgpActionAugmentationPolicy(SetOriginatorIdPrepend.class,
- SetOriginatorIdPrependHandler.getInstance()));
-
- registration.add(provider.registerBgpActionAugmentationPolicy(NonTransitiveAttributesFilter.class,
- NonTransitiveAttributesFilterHandler.getInstance()));
-
- registration.add(provider.registerBgpActionAugmentationPolicy(SetClusterIdPrepend.class,
- SetClusterIdPrependHandler.getInstance()));
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this).add("dataBroker", dataBroker).toString();
}
}