X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=bgp%2Frib-spi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fprotocol%2Fbgp%2Frib%2Fspi%2FSimpleRIBExtensionProviderContext.java;h=648a49323739d2785a4415c4fe2e4cf6fbe19502;hb=eb74edf3bc56bbbfb29bd401c23bfe55cd1362c6;hp=babf4f4389f435361428de5cc944bd9bf0e63337;hpb=ca047c2df4bd21816145cd1cef0871603304ab1b;p=bgpcep.git diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionProviderContext.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionProviderContext.java index babf4f4389..648a493237 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionProviderContext.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionProviderContext.java @@ -7,105 +7,70 @@ */ package org.opendaylight.protocol.bgp.rib.spi; -import com.google.common.base.Preconditions; -import java.util.HashSet; -import java.util.Set; +import static com.google.common.base.Preconditions.checkArgument; +import static java.util.Objects.requireNonNull; + import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import org.opendaylight.protocol.concepts.AbstractRegistration; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily; -import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy; -import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext; -import org.opendaylight.yangtools.yang.binding.YangModuleInfo; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.Route; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.Tables; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.tables.Routes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.AddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.SubsequentAddressFamily; +import org.opendaylight.yangtools.yang.binding.ChildOf; +import org.opendaylight.yangtools.yang.binding.ChoiceIn; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.Identifiable; +import org.opendaylight.yangtools.yang.binding.Identifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SimpleRIBExtensionProviderContext implements RIBExtensionProviderContext { - private static final Logger LOG = LoggerFactory.getLogger(SimpleRIBExtensionProviderContext.class); - private final ConcurrentMap factories = new ConcurrentHashMap<>(); - private final ConcurrentMap supports = new ConcurrentHashMap<>(); - private final ModuleInfoBackedContext classLoadingStrategy = ModuleInfoBackedContext.create(); - - @Override - public final synchronized AbstractRegistration registerAdjRIBsInFactory(final Class afi, - final Class safi, final AdjRIBsFactory factory) { - final TablesKey key = new TablesKey(afi, safi); - - if (this.factories.containsKey(key)) { - throw new IllegalArgumentException("Specified AFI/SAFI combination is already registered"); - } - - this.factories.put(key, factory); - - return new AbstractRegistration() { - @Override - protected void removeRegistration() { - synchronized (SimpleRIBExtensionProviderContext.this) { - SimpleRIBExtensionProviderContext.this.factories.remove(key); - } - } - }; - } - - @Override - public final synchronized AdjRIBsFactory getAdjRIBsInFactory(final Class afi, - final Class safi) { - return this.factories.get(new TablesKey(afi, safi)); - } + private final ConcurrentMap> supports = new ConcurrentHashMap<>(); + private final ConcurrentMap> domSupports = + new ConcurrentHashMap<>(); @Override - public RIBSupportRegistration registerRIBSupport(final Class afi, - final Class safi, final T support) { + public > RIBSupportRegistration registerRIBSupport( + final Class afi, final Class safi, + final T support) { final TablesKey key = new TablesKey(afi, safi); - final RIBSupport prev = this.supports.putIfAbsent(key, support); - addClassLoadingSupport(afi, safi, support); - Preconditions.checkArgument(prev == null, "AFI %s SAFI %s is already registered with %s", afi, safi, prev); - - return new AbstractRIBSupportRegistration(support) { + final RIBSupport prev = this.supports.putIfAbsent(key, support); + checkArgument(prev == null, "AFI %s SAFI %s is already registered with %s", afi, safi, prev); + this.domSupports.put(RibSupportUtils.toYangTablesKey(afi, safi), support); + return new AbstractRIBSupportRegistration<>(support) { @Override protected void removeRegistration() { + // FIXME: clean up registrations, too SimpleRIBExtensionProviderContext.this.supports.remove(key); } }; } - private void addClassLoadingSupport(Class afi, Class safi, RIBSupport s) { - final Set moduleInfos = - getModuleInfos(afi, safi, s.routesListClass(), s.routesContainerClass(), s.routesCaseClass()); - if(!moduleInfos.isEmpty()) { - classLoadingStrategy.addModuleInfos(moduleInfos); - } - } - - private static Set getModuleInfos(Class... clazzes) { - final Set moduleInfos = new HashSet<>(); - for(Class clz : clazzes) { - try { - moduleInfos.add(BindingReflections.getModuleInfo(clz)); - } catch (Exception e) { - LOG.debug("Could not find module info for class {}", clz, e); - } - } - return moduleInfos; - } - @Override - public RIBSupport getRIBSupport(final Class afi, final Class safi) { + public , S extends ChildOf, + R extends Route & ChildOf & Identifiable, I extends Identifier> RIBSupport getRIBSupport( + final Class afi, final Class safi) { return getRIBSupport(new TablesKey(afi, safi)); } @Override - public RIBSupport getRIBSupport(final TablesKey key) { - return this.supports.get(Preconditions.checkNotNull(key)); + @SuppressWarnings("unchecked") + public , S extends ChildOf, + R extends Route & ChildOf & Identifiable, I extends Identifier> RIBSupport getRIBSupport( + final TablesKey key) { + return (RIBSupport) this.supports.get(requireNonNull(key)); } @Override - public GeneratedClassLoadingStrategy getClassLoadingStrategy() { - return classLoadingStrategy; + @SuppressWarnings("unchecked") + public , S extends ChildOf, + R extends Route & ChildOf & Identifiable, I extends Identifier> RIBSupport getRIBSupport( + final NodeIdentifierWithPredicates key) { + return (RIBSupport) this.domSupports.get(key); } }