Fix raw RIBSupport reference 51/72551/4
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 1 Jun 2018 10:40:42 +0000 (12:40 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 4 Jun 2018 09:42:19 +0000 (11:42 +0200)
This should be properly parameterized.

Change-Id: Ie4a366d7f2f23b89ddffe37aa84da5503cd0d89d
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
22 files changed:
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/AdjRibOutListener.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/CodecsImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/CodecsRegistryImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/LocRibWriter.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBSupportContextImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBSupportContextRegistryImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RouteEntryDependenciesContainerImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/CodecsRegistry.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIBSupportContextRegistry.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/AbstractRIBTestSetup.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImplTest.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBSupportRegistration.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionConsumerContext.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionProviderContext.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBSupportRegistration.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionProviderContext.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/entry/RouteEntryDependenciesContainer.java
bgp/rib-spi/src/test/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBSupportTest.java
bgp/rib-spi/src/test/java/org/opendaylight/protocol/bgp/rib/spi/RIBSupportTestImp.java
bgp/rib-spi/src/test/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionTest.java

index 53ddca4c194a16274bf26a480aec082739925328..036e2e18350fa5b3b4e7718777068319627a7932 100644 (file)
@@ -73,13 +73,13 @@ final class AdjRibOutListener implements ClusteredDOMDataTreeChangeListener, Pre
 
     private final ChannelOutputLimiter session;
     private final Codecs codecs;
-    private final RIBSupport support;
+    private final RIBSupport<?, ?, ?, ?> support;
     private final boolean mpSupport;
     private final ListenerRegistration<AdjRibOutListener> registerDataTreeChangeListener;
     private final LongAdder prefixesSentCounter = new LongAdder();
 
     private AdjRibOutListener(final PeerId peerId, final TablesKey tablesKey, final YangInstanceIdentifier ribId,
-            final CodecsRegistry registry, final RIBSupport support, final DOMDataTreeChangeService service,
+            final CodecsRegistry registry, final RIBSupport<?, ?, ?, ?> support, final DOMDataTreeChangeService service,
             final ChannelOutputLimiter session, final boolean mpSupport) {
         this.session = requireNonNull(session);
         this.support = requireNonNull(support);
@@ -96,7 +96,7 @@ final class AdjRibOutListener implements ClusteredDOMDataTreeChangeListener, Pre
             @Nonnull final TablesKey tablesKey,
             @Nonnull final YangInstanceIdentifier ribId,
             @Nonnull final CodecsRegistry registry,
-            @Nonnull final RIBSupport support,
+            @Nonnull final RIBSupport<?, ?, ?, ?> support,
             @Nonnull final DOMDataTreeChangeService service,
             @Nonnull final ChannelOutputLimiter session,
             final boolean mpSupport) {
index 109b42fb4da6eac1f6416f6be09617d5119aaa35..1936fd6dc329538c4f2c0cc8f6cbe846d25fc436 100644 (file)
@@ -381,7 +381,7 @@ public class BGPPeer extends AbstractPeer implements BGPSessionListener {
 
     private synchronized void createAdjRibOutListener(final TablesKey key,
             final boolean mpSupport) {
-        final RIBSupport ribSupport = this.rib.getRibSupportContext().getRIBSupport(key);
+        final RIBSupport<?, ?, ?, ?> ribSupport = this.rib.getRibSupportContext().getRIBSupport(key);
 
         // not particularly nice
         if (ribSupport != null && this.session instanceof BGPSessionImpl) {
index 45aa334d22c8213743cdb6fdd45fece08eb50361..ab883877ed21b84c47ba40a51a85aba9d3d1d705 100644 (file)
@@ -89,9 +89,9 @@ public final class CodecsImpl implements Codecs {
     private BindingNormalizedNodeCachingCodec<MpReachNlri> reachNlriCodec;
     private BindingNormalizedNodeCachingCodec<MpUnreachNlri> unreachNlriCodec;
 
-    private final RIBSupport ribSupport;
+    private final RIBSupport<?, ?, ?, ?> ribSupport;
 
-    public CodecsImpl(final RIBSupport ribSupport) {
+    public CodecsImpl(final RIBSupport<?, ?, ?, ?> ribSupport) {
         this.ribSupport = requireNonNull(ribSupport);
         final Builder<Class<? extends DataObject>> acb = ImmutableSet.builder();
         acb.addAll(ATTRIBUTE_CACHEABLES);
index e2a3b91767e8ea33c04c0874728f9e18ab977064..cc135e352bf85b25036779fe603aa2685916ac9c 100644 (file)
@@ -27,11 +27,11 @@ public final class CodecsRegistryImpl implements CodecsRegistry {
 
     private static final Logger LOG = LoggerFactory.getLogger(CodecsRegistryImpl.class);
 
-    private final LoadingCache<RIBSupport, Codecs> contexts = CacheBuilder.newBuilder()
-        .build(new CacheLoader<RIBSupport, Codecs>(){
+    private final LoadingCache<RIBSupport<?, ?, ?, ?>, Codecs> contexts = CacheBuilder.newBuilder()
+        .build(new CacheLoader<RIBSupport<?, ?, ?, ?>, Codecs>(){
 
             @Override
-            public Codecs load(final RIBSupport key) {
+            public Codecs load(final RIBSupport<?, ?, ?, ?> key) {
                 return createContext(key);
             }
         });
@@ -48,7 +48,7 @@ public final class CodecsRegistryImpl implements CodecsRegistry {
         return new CodecsRegistryImpl(codecFactory, classStrategy);
     }
 
-    private Codecs createContext(final RIBSupport ribSupport) {
+    private Codecs createContext(final RIBSupport<?, ?, ?, ?> ribSupport) {
         final Codecs codecs = new CodecsImpl(ribSupport);
         if (this.latestCodecTree != null) {
             // FIXME: Do we need to recalculate latestCodecTree? E.g. new rib support was added
@@ -71,7 +71,7 @@ public final class CodecsRegistryImpl implements CodecsRegistry {
     }
 
     @Override
-    public Codecs getCodecs(final RIBSupport ribSupport) {
+    public Codecs getCodecs(final RIBSupport<?, ?, ?, ?> ribSupport) {
         return this.contexts.getUnchecked(ribSupport);
     }
 }
index eb513690bd1f87668a8e84315454c04baf942f66..bb98822e2994e54a1cd066b6ba6c83cc651084bf 100644 (file)
@@ -79,7 +79,7 @@ final class LocRibWriter implements AutoCloseable, TotalPrefixesCounter, TotalPa
     @GuardedBy("this")
     private ListenerRegistration<LocRibWriter> reg;
 
-    private LocRibWriter(final RIBSupport ribSupport,
+    private LocRibWriter(final RIBSupport<?, ?, ?, ?> ribSupport,
             final BindingTransactionChain chain,
             final KeyedInstanceIdentifier<Rib, RibKey> ribIId,
             final Long ourAs,
@@ -105,7 +105,7 @@ final class LocRibWriter implements AutoCloseable, TotalPrefixesCounter, TotalPa
     }
 
     public static LocRibWriter create(
-            @Nonnull final RIBSupport ribSupport,
+            @Nonnull final RIBSupport<?, ?, ?, ?> ribSupport,
             @Nonnull final TablesKey tablesKey,
             @Nonnull final Class<? extends AfiSafiType> afiSafiType,
             @Nonnull final BindingTransactionChain chain,
@@ -267,7 +267,6 @@ final class LocRibWriter implements AutoCloseable, TotalPrefixesCounter, TotalPa
         updateRoutesEntries(routesChangesContainer.getModifiedChildren(), peerUuid, routes);
     }
 
-    @SuppressWarnings("unchecked")
     private void updateRoutesEntries(
             final Collection<DataObjectModification<? extends DataObject>> routeChanges,
             final UnsignedInteger routerId,
index 1ee8a83c4060c740d639f474afac2ae8c00b680e..19c435a99faaea06920ef28a67076757ab006f9e 100755 (executable)
@@ -190,7 +190,7 @@ public final class RIBImpl extends BGPRIBStateImpl implements RIB, TransactionCh
     }
 
     private synchronized void createLocRibWriter(final TablesKey key) {
-        final RIBSupport ribSupport = this.ribContextRegistry.getRIBSupport(key);
+        final RIBSupport<?, ?, ?, ?> ribSupport = this.ribContextRegistry.getRIBSupport(key);
         if (ribSupport == null) {
             return;
         }
index 6c319077c149dbec4fffc16d7bba4cb48b5472ef..0ef3b83f08552bc2268f34271f21082aac39715a 100644 (file)
@@ -34,10 +34,10 @@ class RIBSupportContextImpl extends RIBSupportContext {
 
     private static final ContainerNode EMPTY_TABLE_ATTRIBUTES = ImmutableNodes.containerNode(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.tables.Attributes.QNAME);
 
-    private final RIBSupport ribSupport;
+    private final RIBSupport<?, ?, ?, ?> ribSupport;
     private final Codecs codecs;
 
-    public RIBSupportContextImpl(final RIBSupport ribSupport, final CodecsRegistry codecs) {
+    public RIBSupportContextImpl(final RIBSupport<?, ?, ?, ?> ribSupport, final CodecsRegistry codecs) {
         this.ribSupport = requireNonNull(ribSupport);
         this.codecs = codecs.getCodecs(this.ribSupport);
     }
index 2f8b888287cbcd7bc18cee0c4659cc2a3961ddaa..b96c90d7c0a928c7d10ad5e5cd9592e9c2c40068 100644 (file)
@@ -17,16 +17,24 @@ import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContext;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
 import org.opendaylight.protocol.bgp.rib.spi.RIBSupport;
+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.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;
 
 final class RIBSupportContextRegistryImpl implements RIBSupportContextRegistry {
 
     private final RIBExtensionConsumerContext extensionContext;
     private final CodecsRegistry codecs;
-    private final LoadingCache<RIBSupport, RIBSupportContextImpl> contexts = CacheBuilder.newBuilder()
-            .build(new CacheLoader<RIBSupport, RIBSupportContextImpl>() {
+    private final LoadingCache<RIBSupport<?, ?, ?, ?>, RIBSupportContextImpl> contexts = CacheBuilder.newBuilder()
+            .build(new CacheLoader<RIBSupport<?, ?, ?, ?>, RIBSupportContextImpl>() {
                 @Override
-                public RIBSupportContextImpl load(final RIBSupport key) {
+                public RIBSupportContextImpl load(final RIBSupport<?, ?, ?, ?> key) {
                     return createRIBSupportContext(key);
                 }
             });
@@ -40,12 +48,14 @@ final class RIBSupportContextRegistryImpl implements RIBSupportContextRegistry {
         return new RIBSupportContextRegistryImpl(extensions, codecs);
     }
 
-    private RIBSupportContextImpl createRIBSupportContext(final RIBSupport support) {
+    private RIBSupportContextImpl createRIBSupportContext(final RIBSupport<?, ?, ?, ?> support) {
         return new RIBSupportContextImpl(support, this.codecs);
     }
 
     @Override
-    public RIBSupport getRIBSupport(final TablesKey key) {
+    public <C extends Routes & DataObject & ChoiceIn<Tables>, S extends ChildOf<? super C>,
+            R extends Route & ChildOf<? super S> & Identifiable<I>, I extends Identifier<R>>
+            RIBSupport<C, S, R, I> getRIBSupport(final TablesKey key) {
         final RIBSupportContext ribSupport = getRIBSupportContext(key);
         if (ribSupport != null) {
             return ribSupport.getRibSupport();
@@ -55,7 +65,7 @@ final class RIBSupportContextRegistryImpl implements RIBSupportContextRegistry {
 
     @Override
     public RIBSupportContext getRIBSupportContext(final TablesKey key) {
-        final RIBSupport ribSupport = this.extensionContext.getRIBSupport(key);
+        final RIBSupport<?, ?, ?, ?> ribSupport = this.extensionContext.getRIBSupport(key);
         if (ribSupport != null) {
             return this.contexts.getUnchecked(ribSupport);
         }
index 014035ad6ff3d97c57060948b61bf1f884044f4a..cc857baa6e0f3436b2cc3ad494b8f982f8a31e06 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.protocol.bgp.rib.impl;
 
 import static java.util.Objects.requireNonNull;
 
-import javax.annotation.Nonnull;
 import org.opendaylight.protocol.bgp.rib.spi.RIBSupport;
 import org.opendaylight.protocol.bgp.rib.spi.entry.RouteEntryDependenciesContainer;
 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRibRoutingPolicy;
@@ -19,14 +18,14 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 
 public final class RouteEntryDependenciesContainerImpl implements RouteEntryDependenciesContainer {
-    private final RIBSupport ribSupport;
+    private final RIBSupport<?, ?, ?, ?> ribSupport;
     private final TablesKey tablesKey;
     private final KeyedInstanceIdentifier<Tables, TablesKey> locRibTarget;
     private final BGPRibRoutingPolicy routingPolicies;
     private final Class<? extends AfiSafiType> afiSafiType;
 
     public RouteEntryDependenciesContainerImpl(
-            final RIBSupport ribSupport,
+            final RIBSupport<?, ?, ?, ?> ribSupport,
             final BGPRibRoutingPolicy routingPolicies,
             final TablesKey tablesKey,
             final Class<? extends AfiSafiType> afiSafiType,
@@ -39,7 +38,7 @@ public final class RouteEntryDependenciesContainerImpl implements RouteEntryDepe
     }
 
     @Override
-    public RIBSupport getRibSupport() {
+    public RIBSupport<?, ?, ?, ?> getRibSupport() {
         return this.ribSupport;
     }
 
index 1a2267261ea9f65ded0acda5a864ad2c0b230659..d49d4fbc3c07242db51f3dcd932ed2f5e27601c3 100644 (file)
@@ -21,5 +21,5 @@ public interface CodecsRegistry {
      * @param ribSupport associated with Codecs class
      * @return Codecs
      */
-    Codecs getCodecs(final RIBSupport ribSupport);
+    Codecs getCodecs(final RIBSupport<?, ?, ?, ?> ribSupport);
 }
index fba9a8de80a1f7e6588ca3742123a414415fba54..f3825bcc6ea0ffa9d104c965403f307c3e58372e 100644 (file)
@@ -9,7 +9,15 @@ package org.opendaylight.protocol.bgp.rib.impl.spi;
 
 import javax.annotation.Nullable;
 import org.opendaylight.protocol.bgp.rib.spi.RIBSupport;
+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.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;
 
 public interface RIBSupportContextRegistry {
 
@@ -21,7 +29,9 @@ public interface RIBSupportContextRegistry {
      * not implemented.
      */
     @Nullable
-    RIBSupport getRIBSupport(TablesKey key);
+    <C extends Routes & DataObject & ChoiceIn<Tables>, S extends ChildOf<? super C>,
+        R extends Route & ChildOf<? super S> & Identifiable<I>,
+        I extends Identifier<R>> RIBSupport<C, S, R, I> getRIBSupport(TablesKey key);
 
     /**
      * Acquire a RIB Support Context for a AFI/SAFI combination.
index 97d487df915dfcfde51134b062143673e679326d..68651b4f6cf4cb349b2463677e55af9d56f778de 100644 (file)
@@ -106,7 +106,7 @@ public class AbstractRIBTestSetup extends DefaultRibPoliciesMockTest {
     private RIBImpl rib;
     private BindingCodecTreeFactory codecFactory;
     private RIBActivator a1;
-    private RIBSupport ribSupport;
+    private RIBSupport<?, ?, ?, ?> ribSupport;
     @Mock
     private BGPDispatcher dispatcher;
 
@@ -158,6 +158,7 @@ public class AbstractRIBTestSetup extends DefaultRibPoliciesMockTest {
         return codec;
     }
 
+    @Override
     @Before
     public void setUp() throws Exception {
         super.setUp();
@@ -271,6 +272,7 @@ public class AbstractRIBTestSetup extends DefaultRibPoliciesMockTest {
         return this.domTransWrite;
     }
 
+    @Override
     @After
     public void tearDown() {
         this.a1.close();
index 3aed418753332eabfd393fc67716041d029287ab..811f3e7d9c49a2449befe2cb4fa3c3c16760a719 100644 (file)
@@ -76,7 +76,7 @@ public class RibImplTest extends AbstractConfig {
     @Mock
     private ListenerRegistration<?> dataTreeRegistration;
     @Mock
-    private RIBSupport ribSupport;
+    private RIBSupport<?, ?, ?, ?> ribSupport;
     @Mock
     private ServiceRegistration<?> serviceRegistration;
 
index 59a75bd539c3940d759494c3e054ff66f9ab6f74..84479bf3e263a97d7aa92fc91b42eaf0a9b32c2e 100644 (file)
@@ -9,7 +9,7 @@ package org.opendaylight.protocol.bgp.rib.spi;
 
 import org.opendaylight.yangtools.concepts.AbstractObjectRegistration;
 
-public abstract class AbstractRIBSupportRegistration<T extends RIBSupport>
+public abstract class AbstractRIBSupportRegistration<T extends RIBSupport<?, ?, ?, ?>>
         extends AbstractObjectRegistration<T> implements RIBSupportRegistration<T> {
     protected AbstractRIBSupportRegistration(final T instance) {
         super(instance);
index 82e68c848c0f90449350270cb7433c185381adcd..d7ff2dcdbbbee843bd8753b0b13514fb3338dbda 100644 (file)
@@ -10,9 +10,17 @@ package org.opendaylight.protocol.bgp.rib.spi;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
+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.rev180329.AddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.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;
 
 /**
@@ -29,7 +37,9 @@ public interface RIBExtensionConsumerContext {
      * @return RIBSupport instance, or null if the AFI/SAFI is not implemented.
      */
     @Nullable
-    RIBSupport getRIBSupport(@Nonnull TablesKey key);
+    <C extends Routes & DataObject & ChoiceIn<Tables>, S extends ChildOf<C>,
+        R extends Route & ChildOf<S> & Identifiable<I>, I extends Identifier<R>> RIBSupport<C, S, R, I> getRIBSupport(
+            @Nonnull TablesKey key);
 
     /**
      * Acquire a RIB implementation factory for a AFI/SAFI combination.
@@ -39,18 +49,20 @@ public interface RIBExtensionConsumerContext {
      * @return RIBSupport instance, or null if the AFI/SAFI is not implemented.
      */
     @Nullable
-    RIBSupport getRIBSupport(@Nonnull Class<? extends AddressFamily> afi,
-        @Nonnull Class<? extends SubsequentAddressFamily> safi);
+    <C extends Routes & DataObject & ChoiceIn<Tables>, S extends ChildOf<C>,
+        R extends Route & ChildOf<S> & Identifiable<I>, I extends Identifier<R>> RIBSupport<C, S, R, I> getRIBSupport(
+            @Nonnull Class<? extends AddressFamily> afi, @Nonnull Class<? extends SubsequentAddressFamily> safi);
 
     /**
      * Acquire a RIB implementation factory for a AFI/SAFI combination.
      *
      * @param key Tables key with AFI/SAFI
-     * @return RIBSupport instance, or null if the AFI/SAFI is
-     *     not implemented.
+     * @return RIBSupport instance, or null if the AFI/SAFI is not implemented.
      */
     @Nullable
-    RIBSupport getRIBSupport(@Nonnull NodeIdentifierWithPredicates key);
+    <C extends Routes & DataObject & ChoiceIn<Tables>, S extends ChildOf<C>,
+        R extends Route & ChildOf<S> & Identifiable<I>, I extends Identifier<R>> RIBSupport<C, S, R, I> getRIBSupport(
+            @Nonnull NodeIdentifierWithPredicates key);
 
 
     /**
@@ -61,4 +73,4 @@ public interface RIBExtensionConsumerContext {
      */
     @Nonnull
     GeneratedClassLoadingStrategy getClassLoadingStrategy();
-}
\ No newline at end of file
+}
index 4928d88883db81b9abc4363b9869f11cd042b029..c0adfa97bb973efb296efcfc99d1ca3c2a7813c4 100644 (file)
@@ -27,7 +27,7 @@ public interface RIBExtensionProviderContext extends RIBExtensionConsumerContext
      * @return Registration handle. Call {@link RIBSupportRegistration#close()} method to remove it.
      * @throws NullPointerException if any of the arguments is null
      */
-    <T extends RIBSupport> RIBSupportRegistration<T> registerRIBSupport(
+    <T extends RIBSupport<?, ?, ?, ?>> RIBSupportRegistration<T> registerRIBSupport(
             @Nonnull Class<? extends AddressFamily> afi,
             @Nonnull Class<? extends SubsequentAddressFamily> safi, T support);
 }
index 1660b7cd6afa88aee830c1e3443228b9f4c14cc2..bc0d47b6ac66c78d350dedc87b880f6271b110b1 100644 (file)
@@ -14,7 +14,6 @@ import org.opendaylight.yangtools.concepts.ObjectRegistration;
  *
  * @param <T> {@link RIBSupport} type
  */
-public interface RIBSupportRegistration<T extends RIBSupport> extends ObjectRegistration<T> {
-    @Override
-    void close();
+public interface RIBSupportRegistration<T extends RIBSupport<?, ?, ?, ?>> extends ObjectRegistration<T> {
+
 }
index 7f1c696aa5a6e7f149e1affd5278774eab2c793d..994100e0cee1d214ea1473de8e1afeaaf831f829 100644 (file)
@@ -16,9 +16,17 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
 import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
+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.rev180329.AddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.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.binding.YangModuleInfo;
 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
@@ -29,16 +37,18 @@ public class SimpleRIBExtensionProviderContext implements RIBExtensionProviderCo
 
     private static final Logger LOG = LoggerFactory.getLogger(SimpleRIBExtensionProviderContext.class);
 
-    private final ConcurrentMap<TablesKey, RIBSupport> supports = new ConcurrentHashMap<>();
-    private final ConcurrentMap<NodeIdentifierWithPredicates, RIBSupport> domSupports = new ConcurrentHashMap<>();
+    private final ConcurrentMap<TablesKey, RIBSupport<?, ?, ?, ?>> supports = new ConcurrentHashMap<>();
+    private final ConcurrentMap<NodeIdentifierWithPredicates, RIBSupport<?, ?, ?, ?>> domSupports =
+            new ConcurrentHashMap<>();
 
     private final ModuleInfoBackedContext classLoadingStrategy = ModuleInfoBackedContext.create();
 
     @Override
-    public <T extends RIBSupport> RIBSupportRegistration<T> registerRIBSupport(final Class<? extends AddressFamily> afi,
-            final Class<? extends SubsequentAddressFamily> safi, final T support) {
+    public <T extends RIBSupport<?, ?, ?, ?>> RIBSupportRegistration<T> registerRIBSupport(
+            final Class<? extends AddressFamily> afi, final Class<? extends SubsequentAddressFamily> safi,
+            final T support) {
         final TablesKey key = new TablesKey(afi, safi);
-        final RIBSupport prev = this.supports.putIfAbsent(key, support);
+        final RIBSupport<?, ?, ?, ?> prev = this.supports.putIfAbsent(key, support);
         Preconditions.checkArgument(prev == null, "AFI %s SAFI %s is already registered with %s",
                 afi, safi, prev);
         this.domSupports.put(RibSupportUtils.toYangTablesKey(afi, safi), support);
@@ -51,7 +61,7 @@ public class SimpleRIBExtensionProviderContext implements RIBExtensionProviderCo
         };
     }
 
-    private void addClassLoadingSupport(final Class<?> afi, final Class<?> safi, final RIBSupport support) {
+    private void addClassLoadingSupport(final Class<?> afi, final Class<?> safi, final RIBSupport<?, ?, ?, ?> support) {
         final Set<YangModuleInfo> moduleInfos = getModuleInfos(afi, safi, support.routesListClass(),
                 support.routesContainerClass(), support.routesCaseClass());
         if (!moduleInfos.isEmpty()) {
@@ -73,24 +83,30 @@ public class SimpleRIBExtensionProviderContext implements RIBExtensionProviderCo
     }
 
     @Override
-    public RIBSupport getRIBSupport(final Class<? extends AddressFamily> afi,
-            final Class<? extends SubsequentAddressFamily> safi) {
+    public <C extends Routes & DataObject & ChoiceIn<Tables>, S extends ChildOf<C>,
+        R extends Route & ChildOf<S> & Identifiable<I>, I extends Identifier<R>> RIBSupport<C, S, R, I> getRIBSupport(
+            final Class<? extends AddressFamily> afi, final Class<? extends SubsequentAddressFamily> safi) {
         return getRIBSupport(new TablesKey(afi, safi));
     }
 
     @Override
-    public RIBSupport getRIBSupport(final TablesKey key) {
-        return this.supports.get(requireNonNull(key));
+    @SuppressWarnings("unchecked")
+    public <C extends Routes & DataObject & ChoiceIn<Tables>, S extends ChildOf<C>,
+        R extends Route & ChildOf<S> & Identifiable<I>, I extends Identifier<R>> RIBSupport<C, S, R, I> getRIBSupport(
+            final TablesKey key) {
+        return (RIBSupport<C, S, R, I>) this.supports.get(requireNonNull(key));
     }
 
     @Override
-    public GeneratedClassLoadingStrategy getClassLoadingStrategy() {
-        return this.classLoadingStrategy;
+    @SuppressWarnings("unchecked")
+    public <C extends Routes & DataObject & ChoiceIn<Tables>, S extends ChildOf<C>,
+        R extends Route & ChildOf<S> & Identifiable<I>, I extends Identifier<R>> RIBSupport<C, S, R, I> getRIBSupport(
+            final NodeIdentifierWithPredicates key) {
+        return (RIBSupport<C, S, R, I>) this.domSupports.get(key);
     }
 
     @Override
-    @SuppressWarnings("checkstyle:OverloadMethodsDeclarationOrder")
-    public RIBSupport getRIBSupport(final NodeIdentifierWithPredicates key) {
-        return this.domSupports.get(key);
+    public GeneratedClassLoadingStrategy getClassLoadingStrategy() {
+        return this.classLoadingStrategy;
     }
 }
index a94f4f9753ccbe7b7d060b364e9b86534279e5ca..57627ac0f2335f6d9a2bbc2070377df7ad314d91 100644 (file)
@@ -11,8 +11,15 @@ import javax.annotation.Nonnull;
 import org.opendaylight.protocol.bgp.rib.spi.RIBSupport;
 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRibRoutingPolicy;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
+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.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.binding.KeyedInstanceIdentifier;
 
 /**
@@ -25,8 +32,9 @@ public interface RouteEntryDependenciesContainer {
      * @return RIBSupport
      */
     @Nonnull
-    RIBSupport getRibSupport();
-
+    <C extends Routes & DataObject & ChoiceIn<Tables>, S extends ChildOf<C>,
+        R extends Route & ChildOf<S> & Identifiable<I>, I extends Identifier<R>>
+            RIBSupport<C, S, R, I> getRibSupport();
 
     /**
      * Returns the table key(AFI/SAFI) corresponding to the Route Entry.
@@ -44,7 +52,6 @@ public interface RouteEntryDependenciesContainer {
     @Nonnull
     Class<? extends AfiSafiType> getAfiSafType();
 
-
     /**
      * Returns the loc-rib table to be updated and to which  corresponds this Route Entry.
      *
index 548f90bb434ea5ed67f819a1231f04c94196d560..69f343880700fc4072be5758a43ab755d96f975e 100644 (file)
@@ -82,7 +82,7 @@ public abstract class AbstractRIBSupportTest<R extends Route> extends AbstractCo
     private AbstractRIBSupport abstractRIBSupport;
     private ModuleInfoBackedContext moduleInfoBackedContext;
 
-    protected final void setUpTestCustomizer(final AbstractRIBSupport ribSupport) throws Exception {
+    protected final void setUpTestCustomizer(final AbstractRIBSupport<?, ?, ?, ?> ribSupport) throws Exception {
         this.abstractRIBSupport = ribSupport;
         this.moduleInfoBackedContext
                 .registerModuleInfo(BindingReflections.getModuleInfo(this.abstractRIBSupport.routesContainerClass()));
@@ -147,6 +147,17 @@ public abstract class AbstractRIBSupportTest<R extends Route> extends AbstractCo
             .getChild(new NodeIdentifier(BindingReflections.findQName(Routes.class))).get();
     }
 
+    protected final Collection<MapEntryNode> createRoutes(final DataObject routes) {
+        Preconditions.checkArgument(routes.getImplementedInterface()
+                .equals(this.abstractRIBSupport.routesContainerClass()));
+        final InstanceIdentifier<DataObject> routesIId = routesIId();
+        final Map.Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalizedNode = this.mappingService
+                .toNormalizedNode(routesIId, routes);
+        final ContainerNode container = (ContainerNode) normalizedNode.getValue();
+        final NodeIdentifier routeNid = new NodeIdentifier(getRouteListQname());
+        return ((MapNode) container.getChild(routeNid).get()).getValue();
+    }
+
     private TablesKey getTablesKey() {
         return new TablesKey(this.abstractRIBSupport.getAfi(), this.abstractRIBSupport.getSafi());
     }
@@ -170,18 +181,6 @@ public abstract class AbstractRIBSupportTest<R extends Route> extends AbstractCo
         return this.mappingService.toYangInstanceIdentifier(routesIId).node(getRouteListQname());
     }
 
-    @SuppressWarnings("checkstyle:OverloadMethodsDeclarationOrder")
-    protected final Collection<MapEntryNode> createRoutes(final DataObject routes) {
-        Preconditions.checkArgument(routes.getImplementedInterface()
-                .equals(this.abstractRIBSupport.routesContainerClass()));
-        final InstanceIdentifier<DataObject> routesIId = routesIId();
-        final Map.Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalizedNode = this.mappingService
-                .toNormalizedNode(routesIId, routes);
-        final ContainerNode container = (ContainerNode) normalizedNode.getValue();
-        final NodeIdentifier routeNid = new NodeIdentifier(getRouteListQname());
-        return ((MapNode) container.getChild(routeNid).get()).getValue();
-    }
-
     private QName getRouteListQname() {
         return BindingReflections.findQName(this.abstractRIBSupport.routesListClass())
                 .withModule(BindingReflections.getQNameModule(this.abstractRIBSupport.routesCaseClass()));
index b5bd3ee65f0cc54fab8f4e6d0992fbaa46211e10..99cddeeba69637f89a6adf0803c9333f8ef5c256 100644 (file)
@@ -29,6 +29,7 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 
 public final class RIBSupportTestImp extends AbstractRIBSupport<Ipv4RoutesCase, Ipv4Routes, Ipv4Route, Ipv4RouteKey> {
     private static final String ROUTE_KEY = "prefix";
@@ -43,12 +44,12 @@ public final class RIBSupportTestImp extends AbstractRIBSupport<Ipv4RoutesCase,
     }
 
     @Override
-    protected DestinationType buildDestination(final Collection routes) {
+    protected DestinationType buildDestination(final Collection<MapEntryNode> routes) {
         return null;
     }
 
     @Override
-    protected DestinationType buildWithdrawnDestination(final Collection routes) {
+    protected DestinationType buildWithdrawnDestination(final Collection<MapEntryNode> routes) {
         return null;
     }
 
index 13de212c6002f09ee524535e825279f4f78988b0..0b9f20cf646e0d5ed83e53e0b1e2a818832825d2 100644 (file)
@@ -49,7 +49,7 @@ public class SimpleRIBExtensionTest extends AbstractConcurrentDataBrokerTest {
         protected List<AutoCloseable> startRIBExtensionProviderImpl(
                 final RIBExtensionProviderContext context,
                 final BindingNormalizedNodeSerializer mappingService) {
-            final RIBSupport support = Mockito.mock(RIBSupport.class);
+            final RIBSupport<?, ?, ?, ?> support = Mockito.mock(RIBSupport.class);
             Mockito.doReturn(Route.class).when(support).routesListClass();
             Mockito.doReturn(DataObject.class).when(support).routesContainerClass();
             Mockito.doReturn(DataObject.class).when(support).routesCaseClass();