From: Robert Varga Date: Thu, 19 Jan 2023 21:05:13 +0000 (+0100) Subject: Return Registration on registerCapabilityListener() X-Git-Tag: v5.0.1~7 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=bd43a6e3555526bc74e76b7cd6e4ff7f7acd4409;p=netconf.git Return Registration on registerCapabilityListener() Registrations, as a concept resulting via architecture-level fiat, cannot throw exceptions. Codify this in registerCapabilityListener(), which should previously have returned ListenerRegistration. Also clarify nullness of return types. Change-Id: I9f9cd1638568280ee4ae64ea104a665aeaca19e6 Signed-off-by: Robert Varga --- diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/CurrentSchemaContext.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/CurrentSchemaContext.java index c46dfb51d9..3c1c79c776 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/CurrentSchemaContext.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/CurrentSchemaContext.java @@ -73,7 +73,7 @@ public class CurrentSchemaContext implements EffectiveModelContextListener, Auto currentContext.set(null); } - public AutoCloseable registerCapabilityListener(final CapabilityListener listener) { + public Registration registerCapabilityListener(final CapabilityListener listener) { listener.onCapabilitiesChanged(MdsalNetconfOperationServiceFactory.transformCapabilities(currentContext.get(), rootSchemaSourceProvider), Collections.emptySet()); listeners1.add(listener); diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/MdsalNetconfOperationServiceFactory.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/MdsalNetconfOperationServiceFactory.java index d8b5ad86d3..6d2483b685 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/MdsalNetconfOperationServiceFactory.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/MdsalNetconfOperationServiceFactory.java @@ -30,6 +30,7 @@ import org.opendaylight.netconf.api.capability.YangModuleCapability; import org.opendaylight.netconf.api.monitoring.CapabilityListener; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.common.Revision; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.ModuleLike; @@ -166,7 +167,7 @@ public final class MdsalNetconfOperationServiceFactory implements NetconfOperati } @Override - public AutoCloseable registerCapabilityListener(final CapabilityListener listener) { + public Registration registerCapabilityListener(final CapabilityListener listener) { // Advertise validate capability only if DOMDataBroker provides DOMDataTransactionValidator if (dataBroker.getExtensions().get(DOMDataTransactionValidator.class) != null) { listener.onCapabilitiesChanged(Collections.singleton(VALIDATE_CAPABILITY), Collections.emptySet()); diff --git a/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MdsalMonitoringMapperFactory.java b/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MdsalMonitoringMapperFactory.java index 56db7411de..a4fef8b3f5 100644 --- a/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MdsalMonitoringMapperFactory.java +++ b/netconf/mdsal-netconf-monitoring/src/main/java/org/opendaylight/controller/config/yang/netconf/mdsal/monitoring/MdsalMonitoringMapperFactory.java @@ -15,6 +15,7 @@ import org.opendaylight.netconf.mapping.api.NetconfOperation; import org.opendaylight.netconf.mapping.api.NetconfOperationService; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener; +import org.opendaylight.yangtools.concepts.Registration; public final class MdsalMonitoringMapperFactory implements NetconfOperationServiceFactory, AutoCloseable { private final MonitoringToMdsalWriter monitoringToMdsalWriter; @@ -56,7 +57,7 @@ public final class MdsalMonitoringMapperFactory implements NetconfOperationServi } @Override - public AutoCloseable registerCapabilityListener(final CapabilityListener listener) { + public Registration registerCapabilityListener(final CapabilityListener listener) { return () -> { }; } diff --git a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationOperationServiceFactory.java b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationOperationServiceFactory.java index fc01a5fd3f..1f37ccf5c3 100644 --- a/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationOperationServiceFactory.java +++ b/netconf/mdsal-netconf-notification/src/main/java/org/opendaylight/netconf/mdsal/notification/impl/NetconfNotificationOperationServiceFactory.java @@ -16,6 +16,7 @@ import org.opendaylight.netconf.mapping.api.NetconfOperationService; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener; import org.opendaylight.netconf.notifications.NetconfNotificationRegistry; +import org.opendaylight.yangtools.concepts.Registration; public final class NetconfNotificationOperationServiceFactory implements NetconfOperationServiceFactory, AutoCloseable { private final NetconfNotificationRegistry netconfNotificationRegistry; @@ -46,7 +47,7 @@ public final class NetconfNotificationOperationServiceFactory implements Netconf } @Override - public AutoCloseable registerCapabilityListener(final CapabilityListener listener) { + public Registration registerCapabilityListener(final CapabilityListener listener) { return () -> { }; } diff --git a/netconf/netconf-mapping-api/src/main/java/org/opendaylight/netconf/mapping/api/NetconfOperationService.java b/netconf/netconf-mapping-api/src/main/java/org/opendaylight/netconf/mapping/api/NetconfOperationService.java index f7f633de19..e7a903a660 100644 --- a/netconf/netconf-mapping-api/src/main/java/org/opendaylight/netconf/mapping/api/NetconfOperationService.java +++ b/netconf/netconf-mapping-api/src/main/java/org/opendaylight/netconf/mapping/api/NetconfOperationService.java @@ -5,7 +5,6 @@ * 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.netconf.mapping.api; import java.util.Set; @@ -14,7 +13,6 @@ import java.util.Set; * Service of netconf operations. */ public interface NetconfOperationService extends AutoCloseable { - /** * Get set of netconf operations that are handled by this service. */ @@ -25,5 +23,4 @@ public interface NetconfOperationService extends AutoCloseable { */ @Override void close(); - } diff --git a/netconf/netconf-mapping-api/src/main/java/org/opendaylight/netconf/mapping/api/NetconfOperationServiceFactory.java b/netconf/netconf-mapping-api/src/main/java/org/opendaylight/netconf/mapping/api/NetconfOperationServiceFactory.java index 9458476e83..f38c059b59 100644 --- a/netconf/netconf-mapping-api/src/main/java/org/opendaylight/netconf/mapping/api/NetconfOperationServiceFactory.java +++ b/netconf/netconf-mapping-api/src/main/java/org/opendaylight/netconf/mapping/api/NetconfOperationServiceFactory.java @@ -5,12 +5,13 @@ * 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.netconf.mapping.api; import java.util.Set; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.netconf.api.capability.Capability; import org.opendaylight.netconf.api.monitoring.CapabilityListener; +import org.opendaylight.yangtools.concepts.Registration; /** * Factory that must be registered in OSGi service registry in order to be used @@ -18,18 +19,16 @@ import org.opendaylight.netconf.api.monitoring.CapabilityListener; * {@link NetconfOperationService}. */ public interface NetconfOperationServiceFactory { - /** * Get capabilities supported by current operation service. */ - Set getCapabilities(); + @NonNull Set getCapabilities(); /** * Supported capabilities may change over time, registering a listener allows for push based information * retrieval about current notifications. */ - AutoCloseable registerCapabilityListener(CapabilityListener listener); - - NetconfOperationService createService(String netconfSessionIdForReporting); + @NonNull Registration registerCapabilityListener(CapabilityListener listener); + @NonNull NetconfOperationService createService(String netconfSessionIdForReporting); } diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/MdsalOperationProvider.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/MdsalOperationProvider.java index e8452afd57..3685f2172b 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/MdsalOperationProvider.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/MdsalOperationProvider.java @@ -7,7 +7,6 @@ */ package org.opendaylight.netconf.test.tool; -import com.google.common.collect.Sets; import com.google.common.util.concurrent.MoreExecutors; import java.util.EnumMap; import java.util.HashMap; @@ -43,6 +42,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.mon import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.schemas.Schema; import org.opendaylight.yangtools.concepts.AbstractListenerRegistration; import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.util.concurrent.SpecialExecutors; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -85,10 +85,9 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory { } @Override - public AutoCloseable registerCapabilityListener(final CapabilityListener listener) { + public Registration registerCapabilityListener(final CapabilityListener listener) { listener.onCapabilitiesChanged(caps, Set.of()); - return () -> { - }; + return () -> { }; } @Override @@ -143,7 +142,7 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory { final Unlock unLock = new Unlock(currentSessionId); final DiscardChanges discardChanges = new DiscardChanges(currentSessionId, transactionProvider); - return Sets.newHashSet(get, getConfig, editConfig, commit, lock, unLock, discardChanges); + return Set.of(get, getConfig, editConfig, commit, lock, unLock, discardChanges); } @Override diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/SimulatedOperationProvider.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/SimulatedOperationProvider.java index a84268625b..38aabec19f 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/SimulatedOperationProvider.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/SimulatedOperationProvider.java @@ -9,7 +9,6 @@ package org.opendaylight.netconf.test.tool; import com.google.common.collect.Sets; import java.io.File; -import java.util.Collections; import java.util.Optional; import java.util.Set; import org.opendaylight.netconf.api.capability.Capability; @@ -27,6 +26,7 @@ import org.opendaylight.netconf.test.tool.rpc.SimulatedGet; import org.opendaylight.netconf.test.tool.rpc.SimulatedGetConfig; import org.opendaylight.netconf.test.tool.rpc.SimulatedLock; import org.opendaylight.netconf.test.tool.rpc.SimulatedUnLock; +import org.opendaylight.yangtools.concepts.Registration; class SimulatedOperationProvider implements NetconfOperationServiceFactory { private final Set caps; @@ -47,11 +47,9 @@ class SimulatedOperationProvider implements NetconfOperationServiceFactory { } @Override - public AutoCloseable registerCapabilityListener( - final CapabilityListener listener) { - listener.onCapabilitiesChanged(caps, Collections.emptySet()); - return () -> { - }; + public Registration registerCapabilityListener(final CapabilityListener listener) { + listener.onCapabilitiesChanged(caps, Set.of()); + return () -> { }; } @Override diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/customrpc/SettableOperationProvider.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/customrpc/SettableOperationProvider.java index 480643c674..84f2fbeaa4 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/customrpc/SettableOperationProvider.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/customrpc/SettableOperationProvider.java @@ -5,20 +5,18 @@ * 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.netconf.test.tool.customrpc; import java.io.File; -import java.util.Collections; import java.util.Set; import org.opendaylight.netconf.api.capability.Capability; import org.opendaylight.netconf.api.monitoring.CapabilityListener; import org.opendaylight.netconf.mapping.api.NetconfOperation; import org.opendaylight.netconf.mapping.api.NetconfOperationService; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; +import org.opendaylight.yangtools.concepts.Registration; public class SettableOperationProvider implements NetconfOperationServiceFactory { - private final File rpcConfig; public SettableOperationProvider(final File rpcConfig) { @@ -27,14 +25,12 @@ public class SettableOperationProvider implements NetconfOperationServiceFactory @Override public Set getCapabilities() { - return Collections.emptySet(); + return Set.of(); } @Override - public AutoCloseable registerCapabilityListener(final CapabilityListener listener) { - return () -> { - //no op - }; + public Registration registerCapabilityListener(final CapabilityListener listener) { + return () -> { }; } @Override @@ -43,16 +39,15 @@ public class SettableOperationProvider implements NetconfOperationServiceFactory } private static class SettableOperationService implements NetconfOperationService { - private final SettableRpc rpc; SettableOperationService(final File rpcConfig) { - this.rpc = new SettableRpc(rpcConfig); + rpc = new SettableRpc(rpcConfig); } @Override public Set getNetconfOperations() { - return Collections.singleton(rpc); + return Set.of(rpc); } @Override diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/Get.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/Get.java index b47b9e7444..ae504ace81 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/Get.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/Get.java @@ -33,14 +33,6 @@ public class Get extends AbstractNetconfOperation { this.netconfMonitor = netconfMonitor; } - private Element getPlaceholder(final Document innerResult) - throws DocumentedException { - final XmlElement rootElement = XmlElement.fromDomElementWithExpected( - innerResult.getDocumentElement(), XmlNetconfConstants.RPC_REPLY_KEY, - XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0); - return rootElement.getOnlyChildElement(XmlNetconfConstants.DATA_KEY).getDomElement(); - } - @Override protected String getOperationName() { return XmlNetconfConstants.GET; @@ -87,4 +79,11 @@ public class Get extends AbstractNetconfOperation { final NetconfOperationChainedExecution subsequentOperation) { throw new UnsupportedOperationException("Never gets called"); } + + private static Element getPlaceholder(final Document innerResult) throws DocumentedException { + return XmlElement.fromDomElementWithExpected(innerResult.getDocumentElement(), + XmlNetconfConstants.RPC_REPLY_KEY, XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0) + .getOnlyChildElement(XmlNetconfConstants.DATA_KEY) + .getDomElement(); + } } diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/NetconfMonitoringOperationService.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/NetconfMonitoringOperationService.java index 668cf76384..ee89d8b95d 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/NetconfMonitoringOperationService.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/NetconfMonitoringOperationService.java @@ -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.netconf.test.tool.monitoring; -import com.google.common.collect.Sets; import java.util.Set; import org.opendaylight.controller.config.yang.netconf.mdsal.monitoring.GetSchema; import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService; @@ -16,9 +14,6 @@ import org.opendaylight.netconf.mapping.api.NetconfOperation; import org.opendaylight.netconf.mapping.api.NetconfOperationService; public class NetconfMonitoringOperationService implements NetconfOperationService { - - private static final String TESTTOOL_SESSION = "testtool-session"; - private final NetconfMonitoringService monitor; public NetconfMonitoringOperationService(final NetconfMonitoringService monitor) { @@ -27,11 +22,12 @@ public class NetconfMonitoringOperationService implements NetconfOperationServic @Override public Set getNetconfOperations() { - return Sets.newHashSet(new Get(monitor), new GetSchema(TESTTOOL_SESSION, monitor)); + return Set.of(new Get(monitor), new GetSchema("testtool-session", monitor)); } @Override public void close() { + // No-op } } diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/NetconfMonitoringOperationServiceFactory.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/NetconfMonitoringOperationServiceFactory.java index 51820f4750..7f3513a806 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/NetconfMonitoringOperationServiceFactory.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/monitoring/NetconfMonitoringOperationServiceFactory.java @@ -5,27 +5,23 @@ * 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.netconf.test.tool.monitoring; -import java.util.Collections; +import static java.util.Objects.requireNonNull; + import java.util.Set; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.netconf.api.capability.Capability; import org.opendaylight.netconf.api.monitoring.CapabilityListener; import org.opendaylight.netconf.mapping.api.NetconfOperationService; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; +import org.opendaylight.yangtools.concepts.Registration; -public class NetconfMonitoringOperationServiceFactory implements NetconfOperationServiceFactory, - AutoCloseable { - - private final NetconfMonitoringOperationService operationService; - - private static final AutoCloseable AUTO_CLOSEABLE = () -> { - // NOOP - }; +public class NetconfMonitoringOperationServiceFactory implements NetconfOperationServiceFactory, AutoCloseable { + private final @NonNull NetconfMonitoringOperationService operationService; public NetconfMonitoringOperationServiceFactory(final NetconfMonitoringOperationService operationService) { - this.operationService = operationService; + this.operationService = requireNonNull(operationService); } @Override @@ -35,16 +31,17 @@ public class NetconfMonitoringOperationServiceFactory implements NetconfOperatio @Override public Set getCapabilities() { - return Collections.emptySet(); + return Set.of(); } @Override - public AutoCloseable registerCapabilityListener(final CapabilityListener listener) { - return AUTO_CLOSEABLE; + public Registration registerCapabilityListener(final CapabilityListener listener) { + return () -> { }; } @Override public void close() { + // No-op } } diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/operations/OperationsProvider.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/operations/OperationsProvider.java index 9c46c40bbc..6e56e3d5f0 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/operations/OperationsProvider.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/operations/OperationsProvider.java @@ -13,6 +13,7 @@ import org.opendaylight.netconf.api.monitoring.CapabilityListener; import org.opendaylight.netconf.impl.SessionIdProvider; import org.opendaylight.netconf.mapping.api.NetconfOperationService; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; +import org.opendaylight.yangtools.concepts.Registration; public class OperationsProvider implements NetconfOperationServiceFactory { @@ -37,7 +38,7 @@ public class OperationsProvider implements NetconfOperationServiceFactory { } @Override - public AutoCloseable registerCapabilityListener(final CapabilityListener listener) { + public Registration registerCapabilityListener(final CapabilityListener listener) { listener.onCapabilitiesChanged(caps, Set.of()); return () -> { }; } diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/rpchandler/SettableOperationRpcProvider.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/rpchandler/SettableOperationRpcProvider.java index dc74c9d604..bfc4818397 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/rpchandler/SettableOperationRpcProvider.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/rpchandler/SettableOperationRpcProvider.java @@ -8,32 +8,30 @@ package org.opendaylight.netconf.test.tool.rpchandler; -import java.util.Collections; import java.util.Set; import org.opendaylight.netconf.api.capability.Capability; import org.opendaylight.netconf.api.monitoring.CapabilityListener; import org.opendaylight.netconf.mapping.api.NetconfOperation; import org.opendaylight.netconf.mapping.api.NetconfOperationService; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; +import org.opendaylight.yangtools.concepts.Registration; public class SettableOperationRpcProvider implements NetconfOperationServiceFactory { private final RpcHandler rpcHandler; - public SettableOperationRpcProvider(RpcHandler rpcHandler) { + public SettableOperationRpcProvider(final RpcHandler rpcHandler) { this.rpcHandler = rpcHandler; } @Override public Set getCapabilities() { - return Collections.emptySet(); + return Set.of(); } @Override - public AutoCloseable registerCapabilityListener(final CapabilityListener listener) { - return () -> { - //no op - }; + public Registration registerCapabilityListener(final CapabilityListener listener) { + return () -> { }; } @Override @@ -42,16 +40,15 @@ public class SettableOperationRpcProvider implements NetconfOperationServiceFact } private static class SettableOperationService implements NetconfOperationService { - private final SettableRpc rpc; - SettableOperationService(RpcHandler rpcHandler) { - this.rpc = new SettableRpc(rpcHandler); + SettableOperationService(final RpcHandler rpcHandler) { + rpc = new SettableRpc(rpcHandler); } @Override public Set getNetconfOperations() { - return Collections.singleton(rpc); + return Set.of(rpc); } @Override diff --git a/protocol/netconf-impl/src/main/java/org/opendaylight/netconf/impl/osgi/AggregatedNetconfOperationServiceFactory.java b/protocol/netconf-impl/src/main/java/org/opendaylight/netconf/impl/osgi/AggregatedNetconfOperationServiceFactory.java index 9166cc41f6..d1dc45124a 100644 --- a/protocol/netconf-impl/src/main/java/org/opendaylight/netconf/impl/osgi/AggregatedNetconfOperationServiceFactory.java +++ b/protocol/netconf-impl/src/main/java/org/opendaylight/netconf/impl/osgi/AggregatedNetconfOperationServiceFactory.java @@ -9,7 +9,6 @@ package org.opendaylight.netconf.impl.osgi; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableSet.Builder; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import java.util.HashMap; @@ -25,19 +24,16 @@ import org.opendaylight.netconf.mapping.api.NetconfOperationService; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener; import org.opendaylight.netconf.util.CloseableUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.opendaylight.yangtools.concepts.AbstractRegistration; +import org.opendaylight.yangtools.concepts.Registration; /** * NetconfOperationService aggregator. Makes a collection of operation services accessible as one. */ public final class AggregatedNetconfOperationServiceFactory implements NetconfOperationServiceFactory, NetconfOperationServiceFactoryListener, AutoCloseable { - - private static final Logger LOG = LoggerFactory.getLogger(AggregatedNetconfOperationServiceFactory.class); - private final Set factories = ConcurrentHashMap.newKeySet(); - private final Multimap registrations = + private final Multimap registrations = Multimaps.synchronizedMultimap(HashMultimap.create()); private final Set listeners = ConcurrentHashMap.newKeySet(); @@ -53,25 +49,14 @@ public final class AggregatedNetconfOperationServiceFactory factories.add(service); for (final CapabilityListener listener : listeners) { - AutoCloseable reg = service.registerCapabilityListener(listener); - registrations.put(service, reg); + registrations.put(service, service.registerCapabilityListener(listener)); } } - @SuppressWarnings("checkstyle:IllegalCatch") @Override public synchronized void onRemoveNetconfOperationServiceFactory(final NetconfOperationServiceFactory service) { factories.remove(service); - - for (final AutoCloseable autoCloseable : registrations.get(service)) { - try { - autoCloseable.close(); - } catch (Exception e) { - LOG.warn("Unable to close listener registration", e); - } - } - - registrations.removeAll(service); + registrations.removeAll(service).forEach(Registration::close); } @Override @@ -84,21 +69,24 @@ public final class AggregatedNetconfOperationServiceFactory } @Override - public synchronized AutoCloseable registerCapabilityListener(final CapabilityListener listener) { - final Map regs = new HashMap<>(); + public synchronized Registration registerCapabilityListener(final CapabilityListener listener) { + final Map regs = new HashMap<>(); for (final NetconfOperationServiceFactory factory : factories) { - final AutoCloseable reg = factory.registerCapabilityListener(listener); - regs.put(factory, reg); + regs.put(factory, factory.registerCapabilityListener(listener)); } listeners.add(listener); - return () -> { - synchronized (AggregatedNetconfOperationServiceFactory.this) { - listeners.remove(listener); - CloseableUtil.closeAll(regs.values()); - for (final Map.Entry reg : regs.entrySet()) { - registrations.remove(reg.getKey(), reg.getValue()); + return new AbstractRegistration() { + + @Override + protected void removeRegistration() { + synchronized (AggregatedNetconfOperationServiceFactory.this) { + listeners.remove(listener); + regs.values().forEach(Registration::close); + for (var reg : regs.entrySet()) { + registrations.remove(reg.getKey(), reg.getValue()); + } } } }; @@ -110,35 +98,28 @@ public final class AggregatedNetconfOperationServiceFactory } @Override - public synchronized void close() throws Exception { + public synchronized void close() { factories.clear(); - for (AutoCloseable reg : registrations.values()) { - reg.close(); - } + registrations.values().forEach(Registration::close); registrations.clear(); listeners.clear(); } private static final class AggregatedNetconfOperation implements NetconfOperationService { - - private final Set services; + private final ImmutableSet services; AggregatedNetconfOperation(final Set factories, final String netconfSessionIdForReporting) { - final Builder b = ImmutableSet.builder(); - for (final NetconfOperationServiceFactory factory : factories) { - b.add(factory.createService(netconfSessionIdForReporting)); - } - services = b.build(); + services = factories.stream() + .map(factory -> factory.createService(netconfSessionIdForReporting)) + .collect(ImmutableSet.toImmutableSet()); } @Override public Set getNetconfOperations() { - final Set operations = new HashSet<>(); - for (final NetconfOperationService service : services) { - operations.addAll(service.getNetconfOperations()); - } - return operations; + return services.stream() + .flatMap(service -> service.getNetconfOperations().stream()) + .collect(ImmutableSet.toImmutableSet()); } @SuppressWarnings("checkstyle:IllegalCatch") diff --git a/protocol/netconf-impl/src/test/java/org/opendaylight/netconf/impl/ConcurrentClientsTest.java b/protocol/netconf-impl/src/test/java/org/opendaylight/netconf/impl/ConcurrentClientsTest.java index 87a3cef603..f533e6ab1a 100644 --- a/protocol/netconf-impl/src/test/java/org/opendaylight/netconf/impl/ConcurrentClientsTest.java +++ b/protocol/netconf-impl/src/test/java/org/opendaylight/netconf/impl/ConcurrentClientsTest.java @@ -73,6 +73,7 @@ import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessage; import org.opendaylight.netconf.util.messages.NetconfMessageUtil; import org.opendaylight.netconf.util.test.XmlFileLoader; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.CapabilitiesBuilder; +import org.opendaylight.yangtools.concepts.Registration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; @@ -283,9 +284,9 @@ public class ConcurrentClientsTest { } @Override - public AutoCloseable registerCapabilityListener(final CapabilityListener listener) { - return () -> { - }; + public Registration registerCapabilityListener(final CapabilityListener listener) { + // No-op + return () -> { }; } @Override diff --git a/protocol/netconf-impl/src/test/java/org/opendaylight/netconf/impl/mapping/operations/DefaultCloseSessionTest.java b/protocol/netconf-impl/src/test/java/org/opendaylight/netconf/impl/mapping/operations/DefaultCloseSessionTest.java index 44ecfc76e3..da4c9fb60d 100644 --- a/protocol/netconf-impl/src/test/java/org/opendaylight/netconf/impl/mapping/operations/DefaultCloseSessionTest.java +++ b/protocol/netconf-impl/src/test/java/org/opendaylight/netconf/impl/mapping/operations/DefaultCloseSessionTest.java @@ -63,7 +63,7 @@ public class DefaultCloseSessionTest { final ChannelPromise sendFuture = mock(ChannelPromise.class); doAnswer(invocation -> { - invocation.getArgument(0).operationComplete(sendFuture); + invocation.getArgument(0, GenericFutureListener.class).operationComplete(sendFuture); return null; }).when(sendFuture).addListener(any(GenericFutureListener.class)); doReturn(sendFuture).when(channel).newPromise(); diff --git a/protocol/netconf-impl/src/test/java/org/opendaylight/netconf/impl/osgi/AggregatedNetconfOperationServiceFactoryTest.java b/protocol/netconf-impl/src/test/java/org/opendaylight/netconf/impl/osgi/AggregatedNetconfOperationServiceFactoryTest.java index 776fbf21b9..5fa86ef605 100644 --- a/protocol/netconf-impl/src/test/java/org/opendaylight/netconf/impl/osgi/AggregatedNetconfOperationServiceFactoryTest.java +++ b/protocol/netconf-impl/src/test/java/org/opendaylight/netconf/impl/osgi/AggregatedNetconfOperationServiceFactoryTest.java @@ -25,6 +25,7 @@ import org.opendaylight.netconf.api.capability.BasicCapability; import org.opendaylight.netconf.api.capability.Capability; import org.opendaylight.netconf.api.monitoring.CapabilityListener; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; +import org.opendaylight.yangtools.concepts.Registration; @RunWith(MockitoJUnitRunner.StrictStubs.class) public class AggregatedNetconfOperationServiceFactoryTest { @@ -43,11 +44,11 @@ public class AggregatedNetconfOperationServiceFactoryTest { @Mock private NetconfOperationServiceFactory factory2; @Mock - private AutoCloseable autoCloseable1; + private Registration reg1; @Mock - private AutoCloseable autoCloseable2; + private Registration reg2; @Mock - private AutoCloseable autoCloseable3; + private Registration reg3; private AggregatedNetconfOperationServiceFactory aggregatedFactory; @@ -64,19 +65,19 @@ public class AggregatedNetconfOperationServiceFactoryTest { aggregatedFactory.registerCapabilityListener(listener1); aggregatedFactory.registerCapabilityListener(listener2); - doReturn(autoCloseable1).when(factory1).registerCapabilityListener(listener1); - doReturn(autoCloseable2).when(factory1).registerCapabilityListener(listener2); + doReturn(reg1).when(factory1).registerCapabilityListener(listener1); + doReturn(reg2).when(factory1).registerCapabilityListener(listener2); doReturn(factory1Caps).when(factory1).getCapabilities(); - doReturn(autoCloseable1).when(factory2).registerCapabilityListener(listener1); - doReturn(autoCloseable2).when(factory2).registerCapabilityListener(listener2); + doReturn(reg1).when(factory2).registerCapabilityListener(listener1); + doReturn(reg2).when(factory2).registerCapabilityListener(listener2); doReturn(factory2Caps).when(factory2).getCapabilities(); - doNothing().when(autoCloseable1).close(); - doNothing().when(autoCloseable2).close(); + doNothing().when(reg1).close(); + doNothing().when(reg2).close(); - doReturn(autoCloseable3).when(factory1).registerCapabilityListener(listener3); - doReturn(autoCloseable3).when(factory2).registerCapabilityListener(listener3); + doReturn(reg3).when(factory1).registerCapabilityListener(listener3); + doReturn(reg3).when(factory2).registerCapabilityListener(listener3); } @Test @@ -92,8 +93,8 @@ public class AggregatedNetconfOperationServiceFactoryTest { aggregatedFactory.onRemoveNetconfOperationServiceFactory(factory1); aggregatedFactory.onRemoveNetconfOperationServiceFactory(factory2); - verify(autoCloseable1, times(2)).close(); - verify(autoCloseable2, times(2)).close(); + verify(reg1, times(2)).close(); + verify(reg2, times(2)).close(); } @Test @@ -120,7 +121,7 @@ public class AggregatedNetconfOperationServiceFactoryTest { aggregatedFactory.onAddNetconfOperationServiceFactory(factory1); aggregatedFactory.onAddNetconfOperationServiceFactory(factory2); aggregatedFactory.close(); - verify(autoCloseable1, times(2)).close(); - verify(autoCloseable2, times(2)).close(); + verify(reg1, times(2)).close(); + verify(reg2, times(2)).close(); } }