Clean up DOMExtensibleService 88/92988/5
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 7 Oct 2020 22:31:01 +0000 (00:31 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 7 Oct 2020 23:28:08 +0000 (01:28 +0200)
Make sure we do not require implementations to deal with extensions,
as the default implementation serves most use cases.

Also introduce ForwardingDOMExtensibleService, so that the forwarding
part is neatly shared by all forwarders -- which points out the fact
we also need a ForwardingDOMDataTreeService.

Change-Id: I10440111a89ad72061779bcb846cfd934d96b2bd
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMExtensibleService.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouter.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/ShardedDOMTransactionChainAdapter.java
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/AbstractDOMSchemaService.java
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMActionProviderService.java
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMActionService.java
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMDataBroker.java
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMDataTreeService.java [new file with mode: 0644]
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMExtensibleService.java [new file with mode: 0644]

index 07adada9898999ff326d58fb7d0ebd1575239262..807ad339cf4d9090094818c7c952ede8a5b3e15f 100644 (file)
@@ -9,6 +9,7 @@ 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 org.eclipse.jdt.annotation.NonNull;
 
 /**
@@ -22,11 +23,12 @@ import org.eclipse.jdt.annotation.NonNull;
 public interface DOMExtensibleService<T extends DOMExtensibleService<T, E>,
     E extends DOMServiceExtension<T, E>> extends DOMService {
     /**
-     * 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 currently-supported extensions, along with accessor services which provide access to the specific
+     * functionality bound to this service. Default implementation reports no extensions.
      *
      * @return A map of supported functionality.
      */
-    // FIXME: make this a default method returning empty
-    @NonNull ClassToInstanceMap<E> getExtensions();
+    default @NonNull ClassToInstanceMap<E> getExtensions() {
+        return ImmutableClassToInstanceMap.of();
+    }
 }
index c6f1acaa5aaca8a494690afe2d2c04d17624c3fe..43d32dd74295fead7b7870cd22448dc9f99351d2 100644 (file)
@@ -50,7 +50,6 @@ import org.opendaylight.mdsal.dom.api.DOMActionImplementation;
 import org.opendaylight.mdsal.dom.api.DOMActionInstance;
 import org.opendaylight.mdsal.dom.api.DOMActionNotAvailableException;
 import org.opendaylight.mdsal.dom.api.DOMActionProviderService;
-import org.opendaylight.mdsal.dom.api.DOMActionProviderServiceExtension;
 import org.opendaylight.mdsal.dom.api.DOMActionResult;
 import org.opendaylight.mdsal.dom.api.DOMActionService;
 import org.opendaylight.mdsal.dom.api.DOMActionServiceExtension;
@@ -440,11 +439,6 @@ public final class DOMRpcRouter extends AbstractRegistration
 
     @NonNullByDefault
     private final class ActionProviderServiceFacade implements DOMActionProviderService {
-        @Override
-        public ClassToInstanceMap<DOMActionProviderServiceExtension> getExtensions() {
-            return ImmutableClassToInstanceMap.of();
-        }
-
         @Override
         public <T extends DOMActionImplementation> ObjectRegistration<T> registerActionImplementation(
             final T implementation, final Set<DOMActionInstance> instances) {
index fbab9d00614b8c39486860633083611d88be87be..c3591e636559db8c758add92377ec34dddadd1da 100644 (file)
@@ -7,10 +7,7 @@
  */
 package org.opendaylight.mdsal.dom.broker;
 
-import com.google.common.collect.ClassToInstanceMap;
-import com.google.common.collect.ImmutableClassToInstanceMap;
 import java.util.concurrent.atomic.AtomicLong;
-import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeService;
@@ -20,20 +17,14 @@ import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener;
 import org.opendaylight.mdsal.dom.spi.PingPongMergingDOMDataBroker;
 
 public class ShardedDOMDataBrokerAdapter implements PingPongMergingDOMDataBroker {
-
-    private final DOMDataTreeService service;
-    private final AtomicLong txNum = new AtomicLong();
     private final AtomicLong chainNum = new AtomicLong();
+    private final AtomicLong txNum = new AtomicLong();
+    private final DOMDataTreeService service;
 
     public ShardedDOMDataBrokerAdapter(final DOMDataTreeService service) {
         this.service = service;
     }
 
-    @Override
-    public ClassToInstanceMap<DOMDataBrokerExtension> getExtensions() {
-        return ImmutableClassToInstanceMap.of();
-    }
-
     @Override
     public DOMDataTreeReadTransaction newReadOnlyTransaction() {
         return new ShardedDOMReadTransactionAdapter(newTransactionIdentifier(), service);
index 8ffa21b232ff256f5fae4a06f6c75ca920195cb8..c494fdb89c573e308da3b3b8029578b86584edf9 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.mdsal.dom.broker;
 import static com.google.common.base.Preconditions.checkState;
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.collect.ClassToInstanceMap;
 import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.MoreExecutors;
@@ -23,19 +22,16 @@ import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeCursorAwareTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeListener;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeLoopException;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeProducer;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeProducerException;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeService;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeServiceExtension;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.mdsal.dom.spi.ForwardingDOMDataTreeService;
 
 public class ShardedDOMTransactionChainAdapter implements DOMTransactionChain {
 
@@ -158,41 +154,33 @@ public class ShardedDOMTransactionChainAdapter implements DOMTransactionChain {
         finished = true;
     }
 
-    private static class CachedDataTreeService implements DOMDataTreeService {
-
-        private final DOMDataTreeService delegateTreeService;
+    private static final class CachedDataTreeService extends ForwardingDOMDataTreeService {
         private final Map<LogicalDatastoreType, NoopCloseDataProducer> producersMap =
-                new EnumMap<>(LogicalDatastoreType.class);
-
-        CachedDataTreeService(final DOMDataTreeService delegateTreeService) {
-            this.delegateTreeService = delegateTreeService;
-        }
-
-        void closeProducers() {
-            producersMap.values().forEach(NoopCloseDataProducer::closeDelegate);
-        }
-
-        @Override
-        public <T extends DOMDataTreeListener> ListenerRegistration<T> registerListener(final T listener,
-                final Collection<DOMDataTreeIdentifier> subtrees, final boolean allowRxMerges,
-                final Collection<DOMDataTreeProducer> producers) throws DOMDataTreeLoopException {
-            return delegateTreeService.registerListener(listener, subtrees, allowRxMerges, producers);
-        }
+            new EnumMap<>(LogicalDatastoreType.class);
+        private final DOMDataTreeService delegate;
 
-        @Override
-        public ClassToInstanceMap<DOMDataTreeServiceExtension> getExtensions() {
-            return delegateTreeService.getExtensions();
+        CachedDataTreeService(final DOMDataTreeService delegate) {
+            this.delegate = requireNonNull(delegate);
         }
 
         @Override
         public DOMDataTreeProducer createProducer(final Collection<DOMDataTreeIdentifier> subtrees) {
             checkState(subtrees.size() == 1);
             DOMDataTreeIdentifier treeId = subtrees.iterator().next();
-            NoopCloseDataProducer producer = new NoopCloseDataProducer(delegateTreeService.createProducer(
+            NoopCloseDataProducer producer = new NoopCloseDataProducer(delegate.createProducer(
                 Collections.singleton(treeId)));
             producersMap.putIfAbsent(treeId.getDatastoreType(), producer);
             return producer;
         }
+
+        @Override
+        protected DOMDataTreeService delegate() {
+            return delegate;
+        }
+
+        void closeProducers() {
+            producersMap.values().forEach(NoopCloseDataProducer::closeDelegate);
+        }
     }
 
     private static final class NoopCloseDataProducer implements DOMDataTreeProducer {
index a6a48d5370a23d09bfd61a34c055be795d2bba6a..2b0ec4f20c165c4138a642c6bd5d903b71439032 100644 (file)
@@ -45,9 +45,4 @@ public abstract class AbstractDOMSchemaService implements DOMSchemaService, Effe
         // This method should not be implemented
         throw new UnsupportedOperationException();
     }
-
-    @Override
-    public ClassToInstanceMap<DOMSchemaServiceExtension> getExtensions() {
-        return ImmutableClassToInstanceMap.of();
-    }
 }
index 26b14eaf5362569f2d7d9ab78828d8f1d94692e1..2cfa31c3be669425f31be6cbe7c8dead82c7d296 100644 (file)
@@ -8,8 +8,6 @@
 package org.opendaylight.mdsal.dom.spi;
 
 import com.google.common.annotations.Beta;
-import com.google.common.collect.ClassToInstanceMap;
-import com.google.common.collect.ForwardingObject;
 import java.util.Set;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.dom.api.DOMActionImplementation;
@@ -19,18 +17,12 @@ import org.opendaylight.mdsal.dom.api.DOMActionProviderServiceExtension;
 import org.opendaylight.yangtools.concepts.ObjectRegistration;
 
 @Beta
-public abstract class ForwardingDOMActionProviderService extends ForwardingObject implements DOMActionProviderService {
-    @Override
-    public ClassToInstanceMap<DOMActionProviderServiceExtension> getExtensions() {
-        return delegate().getExtensions();
-    }
-
+public abstract class ForwardingDOMActionProviderService
+        extends ForwardingDOMExtensibleService<DOMActionProviderService, DOMActionProviderServiceExtension>
+        implements DOMActionProviderService {
     @Override
     public <T extends @NonNull DOMActionImplementation> ObjectRegistration<T> registerActionImplementation(
             final T implementation, final Set<@NonNull DOMActionInstance> instances) {
         return delegate().registerActionImplementation(implementation, instances);
     }
-
-    @Override
-    protected abstract @NonNull DOMActionProviderService delegate();
 }
index 05136bb9696a41dcb3e271a042e67c453ca3608d..20fdf49b2392eb0bd99ff91702f2d91338a52dec 100644 (file)
@@ -8,10 +8,7 @@
 package org.opendaylight.mdsal.dom.spi;
 
 import com.google.common.annotations.Beta;
-import com.google.common.collect.ClassToInstanceMap;
-import com.google.common.collect.ForwardingObject;
 import com.google.common.util.concurrent.ListenableFuture;
-import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.dom.api.DOMActionResult;
 import org.opendaylight.mdsal.dom.api.DOMActionService;
 import org.opendaylight.mdsal.dom.api.DOMActionServiceExtension;
@@ -20,18 +17,12 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 @Beta
-public abstract class ForwardingDOMActionService extends ForwardingObject implements DOMActionService {
-    @Override
-    public ClassToInstanceMap<DOMActionServiceExtension> getExtensions() {
-        return delegate().getExtensions();
-    }
-
+public abstract class ForwardingDOMActionService
+        extends ForwardingDOMExtensibleService<DOMActionService, DOMActionServiceExtension>
+        implements DOMActionService {
     @Override
     public ListenableFuture<? extends DOMActionResult> invokeAction(final Absolute type,
             final DOMDataTreeIdentifier path, final ContainerNode input) {
         return delegate().invokeAction(type, path, input);
     }
-
-    @Override
-    protected abstract @NonNull DOMActionService delegate();
 }
index cb4e8aedddf149582525010f03708255feb06ec0..5241e1e5377970f0e6042a8c2a53d5e7b7c06018 100644 (file)
@@ -7,9 +7,6 @@
  */
 package org.opendaylight.mdsal.dom.spi;
 
-import com.google.common.collect.ClassToInstanceMap;
-import com.google.common.collect.ForwardingObject;
-import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
@@ -22,11 +19,9 @@ import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener;
  * Utility {@link DOMDataBroker} implementation which forwards all interface
  * method invocation to a delegate instance.
  */
-public abstract class ForwardingDOMDataBroker extends ForwardingObject implements DOMDataBroker {
-
-    @Override
-    protected abstract @NonNull DOMDataBroker delegate();
-
+public abstract class ForwardingDOMDataBroker
+        extends ForwardingDOMExtensibleService<DOMDataBroker, DOMDataBrokerExtension>
+        implements DOMDataBroker {
     @Override
     public DOMDataTreeReadTransaction newReadOnlyTransaction() {
         return delegate().newReadOnlyTransaction();
@@ -51,9 +46,4 @@ public abstract class ForwardingDOMDataBroker extends ForwardingObject implement
     public DOMTransactionChain createMergingTransactionChain(final DOMTransactionChainListener listener) {
         return delegate().createMergingTransactionChain(listener);
     }
-
-    @Override
-    public ClassToInstanceMap<DOMDataBrokerExtension> getExtensions() {
-        return delegate().getExtensions();
-    }
 }
diff --git a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMDataTreeService.java b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMDataTreeService.java
new file mode 100644 (file)
index 0000000..235d46d
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * 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.mdsal.dom.spi;
+
+import com.google.common.annotations.Beta;
+import java.util.Collection;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeListener;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeLoopException;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeProducer;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeService;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeServiceExtension;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+
+@Beta
+public abstract class ForwardingDOMDataTreeService
+        extends ForwardingDOMExtensibleService<DOMDataTreeService, DOMDataTreeServiceExtension>
+        implements DOMDataTreeService {
+    @Override
+    public DOMDataTreeProducer createProducer(final Collection<DOMDataTreeIdentifier> subtrees) {
+        return delegate().createProducer(subtrees);
+    }
+
+    @Override
+    public <T extends DOMDataTreeListener> ListenerRegistration<T> registerListener(final T listener,
+            final Collection<DOMDataTreeIdentifier> subtrees, final boolean allowRxMerges,
+            final Collection<DOMDataTreeProducer> producers) throws DOMDataTreeLoopException {
+        return delegate().registerListener(listener, subtrees, allowRxMerges, producers);
+    }
+}
diff --git a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMExtensibleService.java b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMExtensibleService.java
new file mode 100644 (file)
index 0000000..398b2d3
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * 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.mdsal.dom.spi;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ClassToInstanceMap;
+import com.google.common.collect.ForwardingObject;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.dom.api.DOMExtensibleService;
+import org.opendaylight.mdsal.dom.api.DOMServiceExtension;
+
+@Beta
+public abstract class ForwardingDOMExtensibleService<T extends DOMExtensibleService<T, E>,
+        E extends DOMServiceExtension<T, E>> extends ForwardingObject
+            implements DOMExtensibleService<T, E> {
+    @Override
+    public ClassToInstanceMap<E> getExtensions() {
+        return delegate().getExtensions();
+    }
+
+    @Override
+    protected abstract @NonNull T delegate();
+}