Introduce DOMExtensibleService.getExtensions() 36/73936/4
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 11 Jul 2018 13:02:24 +0000 (15:02 +0200)
committerRobert Varga <nite@hq.sk>
Wed, 11 Jul 2018 14:13:04 +0000 (14:13 +0000)
This adds a properly-typed getExtensions() method, so end users
can acquire extensions in a type-safe manner.

Change-Id: Idab635a970bf9f683d270461cb835c968eaf0755
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
17 files changed:
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataBrokerAdapter.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterLoaderTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMTransactionChainAdapterTest.java
dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMExtensibleService.java
dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMSchemaService.java
dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMService.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/AbstractDOMDataBroker.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataBrokerAdapter.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataTree.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMTransactionChainAdapter.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/schema/ScanningSchemaServiceProvider.java
dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMDataTreeListenerTest.java
dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataBrokerAdapterTest.java
dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/ShardedDOMReadTransactionAdapterTest.java
dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/schema/ScanningSchemaServiceProviderTest.java
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMDataBroker.java
dom/mdsal-dom-spi/src/test/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMDataBrokerTest.java

index c636c81e4bc1921d3a52805d16960813e1192567..283423a498258434cbc33873321a9883837c9a7e 100644 (file)
@@ -46,8 +46,8 @@ public class BindingDOMDataBrokerAdapter extends AbstractForwardedDataBroker imp
 
     public BindingDOMDataBrokerAdapter(final DOMDataBroker domDataBroker, final BindingToNormalizedNodeCodec codec) {
         super(domDataBroker, codec);
-        final DOMDataTreeChangeService domTreeChange
-            = (DOMDataTreeChangeService) domDataBroker.getSupportedExtensions().get(DOMDataTreeChangeService.class);
+        final DOMDataTreeChangeService domTreeChange = domDataBroker.getExtensions()
+                .getInstance(DOMDataTreeChangeService.class);
         if (domTreeChange != null) {
             treeChangeService = BindingDOMDataTreeChangeServiceAdapter.create(codec, domTreeChange);
         } else {
index cd6ca1553b97129136088e09810aebbbbed6e432..f1eb0882270df7eaea42846775b93326386822aa 100644 (file)
@@ -10,8 +10,10 @@ package org.opendaylight.mdsal.binding.dom.adapter;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.MockitoAnnotations.initMocks;
 
+import com.google.common.collect.ImmutableClassToInstanceMap;
 import javax.annotation.Nullable;
 import org.junit.Before;
 import org.junit.Test;
@@ -36,6 +38,8 @@ public class BindingDOMAdapterLoaderTest {
     @Before
     public void setUp() throws Exception {
         initMocks(this);
+
+        doReturn(ImmutableClassToInstanceMap.of()).when(domService).getExtensions();
         bindingDOMAdapterLoader = new BindingDOMAdapterLoader(
                 new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(),
                         mockCodecRegistry)) {
index 18d0caa2a3a8867f8b1bc7fe75a960d4552ba37b..67bfab235833a04781152dc1c5a4c1716ef47260 100644 (file)
@@ -15,6 +15,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.MockitoAnnotations.initMocks;
 
+import com.google.common.collect.ImmutableClassToInstanceMap;
 import javax.annotation.Nullable;
 import org.junit.Before;
 import org.junit.Test;
@@ -45,6 +46,8 @@ public class BindingDOMTransactionChainAdapterTest {
     public void setUp() throws Exception {
         initMocks(this);
         doReturn(transactionChain).when(domService).createTransactionChain(any());
+        doReturn(ImmutableClassToInstanceMap.of()).when(domService).getExtensions();
+
         BindingDOMAdapterLoader bindingDOMAdapterLoader = new BindingDOMAdapterLoader(
                 new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(),
                         mockCodecRegistry)) {
index cc52a5844a5d440cbf370995cc6ee513adc87d40..76ca070f54731ebac7a6d92b28c27b879bcbb6bb 100644 (file)
@@ -8,8 +8,10 @@
 package org.opendaylight.mdsal.dom.api;
 
 import com.google.common.annotations.Beta;
+import com.google.common.collect.ClassToInstanceMap;
+import com.google.common.collect.ImmutableClassToInstanceMap;
 import java.util.Map;
-import javax.annotation.Nonnull;
+import org.eclipse.jdt.annotation.NonNull;
 
 /**
  * Marker interface for services which can support {@link DOMServiceExtension}. Aside for marking
@@ -26,6 +28,18 @@ public interface DOMExtensibleService<T extends DOMExtensibleService<T, E>,
      * which provide access to the specific functionality bound to this service.
      *
      * @return A map of supported functionality.
+     * @deprecated Use {@link #getExtensions()} instead.
      */
-    @Nonnull Map<Class<? extends E>, E> getSupportedExtensions();
+    @Deprecated
+    @NonNull Map<Class<? extends E>, E> getSupportedExtensions();
+
+    /**
+     * Return a map of currently-supported extensions, along with accessor services
+     * which provide access to the specific functionality bound to this service.
+     *
+     * @return A map of supported functionality.
+     */
+    default @NonNull ClassToInstanceMap<E> getExtensions() {
+        return ImmutableClassToInstanceMap.copyOf(getSupportedExtensions());
+    }
 }
index 9ef7ce805b3a946c0a84c3cf243e349f9780d099..39b103b5f1cf55f997a4d01b06f1c0adb57bb68f 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.mdsal.dom.api;
 
-import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableClassToInstanceMap;
 import java.util.Map;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
@@ -37,7 +37,8 @@ public interface DOMSchemaService extends DOMExtensibleService<DOMSchemaService,
     ListenerRegistration<SchemaContextListener> registerSchemaContextListener(SchemaContextListener listener);
 
     @Override
+    @Deprecated
     default Map<Class<? extends DOMSchemaServiceExtension>, DOMSchemaServiceExtension> getSupportedExtensions() {
-        return ImmutableMap.of();
+        return ImmutableClassToInstanceMap.of();
     }
 }
index ba623398f25c0588c5dd892682677e1b81bb45b6..94114bea14323f910fcbcdad8b2273c87798b571 100644 (file)
@@ -5,10 +5,8 @@
  * 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.mdsal.dom.api;
 
-
 /**
  * Marker interface for services which can be obtained from a {@link DOMMountPoint}
  * instance. No further semantics are implied.
index 203f751bba57335195a43fa2c49702f85918152d..f64ff8daf75da3ec019545b96f1cfff9aaab860f 100644 (file)
@@ -8,8 +8,8 @@
 package org.opendaylight.mdsal.dom.broker;
 
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableMap;
-import java.util.Collections;
+import com.google.common.collect.ClassToInstanceMap;
+import com.google.common.collect.ImmutableClassToInstanceMap;
 import java.util.EnumMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -35,7 +35,8 @@ public abstract class AbstractDOMDataBroker extends AbstractDOMForwardedTransact
 
     private final AtomicLong txNum = new AtomicLong();
     private final AtomicLong chainNum = new AtomicLong();
-    private final Map<Class<? extends DOMDataBrokerExtension>, DOMDataBrokerExtension> extensions;
+    private final ClassToInstanceMap<DOMDataBrokerExtension> extensions;
+
     private volatile AutoCloseable closeable;
 
     protected AbstractDOMDataBroker(final Map<LogicalDatastoreType, DOMStore> datastores) {
@@ -50,7 +51,7 @@ public abstract class AbstractDOMDataBroker extends AbstractDOMForwardedTransact
         }
 
         if (treeChange) {
-            extensions = ImmutableMap.<Class<? extends DOMDataBrokerExtension>, DOMDataBrokerExtension>of(
+            extensions = ImmutableClassToInstanceMap.of(
                     DOMDataTreeChangeService.class, new DOMDataTreeChangeService() {
                         @Override
                         public <L extends DOMDataTreeChangeListener> ListenerRegistration<L>
@@ -64,7 +65,7 @@ public abstract class AbstractDOMDataBroker extends AbstractDOMForwardedTransact
                             }
                         });
         } else {
-            extensions = Collections.emptyMap();
+            extensions = ImmutableClassToInstanceMap.of();
         }
     }
 
@@ -92,10 +93,16 @@ public abstract class AbstractDOMDataBroker extends AbstractDOMForwardedTransact
     }
 
     @Override
+    @Deprecated
     public Map<Class<? extends DOMDataBrokerExtension>, DOMDataBrokerExtension> getSupportedExtensions() {
         return extensions;
     }
 
+    @Override
+    public ClassToInstanceMap<DOMDataBrokerExtension> getExtensions() {
+        return extensions;
+    }
+
     @Override
     public DOMTransactionChain createTransactionChain(final TransactionChainListener listener) {
         checkNotClosed();
index 826bb0d4b91d9254a3dfe55298715ad436ccb6ab..8320d9007e058969c5dc6c7061a3357db582a1e9 100644 (file)
@@ -8,7 +8,8 @@
 
 package org.opendaylight.mdsal.dom.broker;
 
-import java.util.Collections;
+import com.google.common.collect.ClassToInstanceMap;
+import com.google.common.collect.ImmutableClassToInstanceMap;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicLong;
 import org.opendaylight.mdsal.common.api.TransactionChainListener;
@@ -31,8 +32,14 @@ public class ShardedDOMDataBrokerAdapter implements DOMDataBroker {
     }
 
     @Override
+    @Deprecated
     public Map<Class<? extends DOMDataBrokerExtension>, DOMDataBrokerExtension> getSupportedExtensions() {
-        return Collections.emptyMap();
+        return ImmutableClassToInstanceMap.of();
+    }
+
+    @Override
+    public ClassToInstanceMap<DOMDataBrokerExtension> getExtensions() {
+        return ImmutableClassToInstanceMap.of();
     }
 
     @Override
index 781780702e417cb75bb3582f4d122b7a9ad736fd..f54f39266fcc913edbebdc87947cf46d2b90f315 100644 (file)
@@ -10,7 +10,8 @@ package org.opendaylight.mdsal.dom.broker;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Verify;
 import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ClassToInstanceMap;
+import com.google.common.collect.ImmutableClassToInstanceMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.ListMultimap;
@@ -133,8 +134,14 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree
     }
 
     @Override
+    @Deprecated
     public Map<Class<? extends DOMDataTreeServiceExtension>, DOMDataTreeServiceExtension> getSupportedExtensions() {
-        return ImmutableMap.of();
+        return ImmutableClassToInstanceMap.of();
+    }
+
+    @Override
+    public ClassToInstanceMap<DOMDataTreeServiceExtension> getExtensions() {
+        return ImmutableClassToInstanceMap.of();
     }
 
     @GuardedBy("this")
index 1252431127cdce22248b43b1c3d442e9b1e7e946..4a88f463a67dd3822ab7d3decdd011b117bc23dd 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.mdsal.dom.broker;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ClassToInstanceMap;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -186,10 +187,16 @@ public class ShardedDOMTransactionChainAdapter implements DOMTransactionChain {
         }
 
         @Override
+        @Deprecated
         public Map<Class<? extends DOMDataTreeServiceExtension>, DOMDataTreeServiceExtension> getSupportedExtensions() {
             return delegateTreeService.getSupportedExtensions();
         }
 
+        @Override
+        public ClassToInstanceMap<DOMDataTreeServiceExtension> getExtensions() {
+            return delegateTreeService.getExtensions();
+        }
+
         @Override
         public DOMDataTreeProducer createProducer(@Nonnull final Collection<DOMDataTreeIdentifier> subtrees) {
             Preconditions.checkState(subtrees.size() == 1);
index ac1471d436e00babcd90cff11b77d4e79326a0d6..7a9f07df184f0135682c3cee9a8eb10e9fae444b 100644 (file)
@@ -8,6 +8,8 @@
 package org.opendaylight.mdsal.dom.broker.schema;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ClassToInstanceMap;
+import com.google.common.collect.ImmutableClassToInstanceMap;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -138,6 +140,12 @@ public class ScanningSchemaServiceProvider
     }
 
     @Override
+    public ClassToInstanceMap<DOMSchemaServiceExtension> getExtensions() {
+        return ImmutableClassToInstanceMap.of(DOMYangTextSourceProvider.class, this);
+    }
+
+    @Override
+    @Deprecated
     public Map<Class<? extends DOMSchemaServiceExtension>, DOMSchemaServiceExtension> getSupportedExtensions() {
         return ImmutableMap.of(DOMYangTextSourceProvider.class, this);
     }
index 0cd97131f7bf16b4564032eaf4eef2870c7336af..fc4f7d15e8113e05706fdf21b4824798fa2fb578 100644 (file)
@@ -33,7 +33,6 @@ import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.common.api.TransactionCommitDeadlockException;
-import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
@@ -414,16 +413,7 @@ public class DOMDataTreeListenerTest {
     }
 
     private DOMDataTreeChangeService getDOMDataTreeChangeService() {
-        final DOMDataBrokerExtension extension = domBroker.getSupportedExtensions()
-                .get(DOMDataTreeChangeService.class);
-        if (extension == null) {
-            return null;
-        }
-        DOMDataTreeChangeService dataTreeChangeService = null;
-        if (extension instanceof DOMDataTreeChangeService) {
-            dataTreeChangeService = (DOMDataTreeChangeService) extension;
-        }
-        return dataTreeChangeService;
+        return domBroker.getExtensions().getInstance(DOMDataTreeChangeService.class);
     }
 
     static class CommitExecutorService extends ForwardingExecutorService {
index 89f3b421ce88bfa2d2c8744affb4c2f80a0550e1..a9d15c9fcf101d6508bf58db190a7f2894d5751a 100644 (file)
@@ -22,7 +22,7 @@ public class ShardedDOMDataBrokerAdapterTest {
         final ShardedDOMDataBrokerAdapter shardedDOMDataBrokerAdapter =
                 new ShardedDOMDataBrokerAdapter(dataTreeService);
 
-        assertTrue(shardedDOMDataBrokerAdapter.getSupportedExtensions().isEmpty());
+        assertTrue(shardedDOMDataBrokerAdapter.getExtensions().isEmpty());
         assertNotNull(shardedDOMDataBrokerAdapter.newWriteOnlyTransaction());
         assertNotNull(shardedDOMDataBrokerAdapter.newReadOnlyTransaction());
         assertNotNull(shardedDOMDataBrokerAdapter.createTransactionChain(null));
index 96c1fe3b1a94abce8a0aa7c77e22cbae9a6bb338..bf956e3deabd5bc8b9d219832020ff3b4ddcfe9f 100644 (file)
@@ -12,7 +12,8 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import com.google.common.base.Optional;
-import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ClassToInstanceMap;
+import com.google.common.collect.ImmutableClassToInstanceMap;
 import com.google.common.collect.Maps;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.Collection;
@@ -64,8 +65,14 @@ public class ShardedDOMReadTransactionAdapterTest {
     private static class TestTreeService implements DOMDataTreeService {
 
         @Override
+        @Deprecated
         public Map<Class<? extends DOMDataTreeServiceExtension>, DOMDataTreeServiceExtension> getSupportedExtensions() {
-            return ImmutableMap.of();
+            return ImmutableClassToInstanceMap.of();
+        }
+
+        @Override
+        public ClassToInstanceMap<DOMDataTreeServiceExtension> getExtensions() {
+            return ImmutableClassToInstanceMap.of();
         }
 
         @Nonnull
index 657e833ff1e0ff2479653f5ea5fda2d281f2cb70..d6bfacdfd5b8f22a466d47d4b102061cd27f4591 100644 (file)
@@ -155,7 +155,7 @@ public class ScanningSchemaServiceProviderTest {
 
     @Test
     public void getSupportedExtensionsTest() {
-        assertEquals(schemaService.getSupportedExtensions().values().iterator().next(), schemaService);
+        assertEquals(schemaService.getExtensions().values().iterator().next(), schemaService);
     }
 
     @Test(expected = UnsupportedOperationException.class)
index 915f4547bd06ab9723f0e73fff3cabfa516d4b79..d71b55d8d6747f06f215254e813bb6417f8a6264 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.mdsal.dom.spi;
 
+import com.google.common.collect.ClassToInstanceMap;
 import com.google.common.collect.ForwardingObject;
 import java.util.Map;
 import javax.annotation.Nonnull;
@@ -49,7 +50,13 @@ public abstract class ForwardingDOMDataBroker extends ForwardingObject implement
     }
 
     @Override
+    @Deprecated
     public Map<Class<? extends DOMDataBrokerExtension>, DOMDataBrokerExtension> getSupportedExtensions() {
         return delegate().getSupportedExtensions();
     }
+
+    @Override
+    public ClassToInstanceMap<DOMDataBrokerExtension> getExtensions() {
+        return delegate().getExtensions();
+    }
 }
index ec721bc162aba43647cf374212c6c3e2d7fa1722..e92e8f43ff76f7eb7d8da38a6be9df8502229d8d 100644 (file)
@@ -12,6 +12,7 @@ import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.verify;
 import static org.mockito.MockitoAnnotations.initMocks;
 
+import com.google.common.collect.ImmutableClassToInstanceMap;
 import javax.annotation.Nonnull;
 import org.junit.Test;
 import org.mockito.Mock;
@@ -31,7 +32,11 @@ public class ForwardingDOMDataBrokerTest extends ForwardingDOMDataBroker {
         this.createTransactionChain(null);
         verify(domDataBroker).createTransactionChain(any());
 
-        doReturn(null).when(domDataBroker).getSupportedExtensions();
+        doReturn(ImmutableClassToInstanceMap.of()).when(domDataBroker).getExtensions();
+        this.getExtensions();
+        verify(domDataBroker).getExtensions();
+
+        doReturn(ImmutableClassToInstanceMap.of()).when(domDataBroker).getSupportedExtensions();
         this.getSupportedExtensions();
         verify(domDataBroker).getSupportedExtensions();