From: Shigeru Yasuda Date: Wed, 8 Apr 2015 13:51:44 +0000 (+0900) Subject: Refactor MD-SAL listener classes. X-Git-Tag: release/lithium~69 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F24%2F17924%2F1;p=vtn.git Refactor MD-SAL listener classes. * Data change listener and notificaiton listener can keep more than one auto-closeables. Change-Id: Ia7100974d382fb9ac35d7257b9a50dd5fab79034 Signed-off-by: Shigeru Yasuda --- diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/config/ConfigListener.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/config/ConfigListener.java index 7e35a5e8..6ed187c1 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/config/ConfigListener.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/config/ConfigListener.java @@ -222,6 +222,8 @@ public final class ConfigListener extends DataStoreListener { return VTNConfigManager.CONFIG_IDENT; } + // CloseableContainer + /** * {@inheritDoc} */ diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/config/OperationalListener.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/config/OperationalListener.java index 5711b14c..51f0b022 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/config/OperationalListener.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/config/OperationalListener.java @@ -174,6 +174,8 @@ public final class OperationalListener return VTNConfigManager.CONFIG_IDENT; } + // CloseableContainer + /** * {@inheritDoc} */ diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/flow/cond/FlowCondManager.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/flow/cond/FlowCondManager.java index f8a1add7..5227414b 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/flow/cond/FlowCondManager.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/flow/cond/FlowCondManager.java @@ -361,6 +361,8 @@ public final class FlowCondManager child(VtnFlowCondition.class).build(); } + // CloseableContainer + /** * {@inheritDoc} */ diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/NodeConnectorListener.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/NodeConnectorListener.java index 98d1d2a2..8b239fdf 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/NodeConnectorListener.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/NodeConnectorListener.java @@ -144,6 +144,8 @@ public final class NodeConnectorListener augmentation(FlowCapableNodeConnector.class).build(); } + // CloseableContainer + /** * {@inheritDoc} */ diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/NodeListener.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/NodeListener.java index 3fe47808..5351b46a 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/NodeListener.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/NodeListener.java @@ -227,14 +227,6 @@ public final class NodeListener augmentation(FlowCapableNode.class).build(); } - /** - * {@inheritDoc} - */ - @Override - protected Logger getLogger() { - return LOG; - } - /** * Return a set of {@link VtnUpdateType} instances that specifies * event types to be listened. @@ -245,4 +237,14 @@ public final class NodeListener protected Set getRequiredEvents() { return REQUIRED_EVENTS; } + + // CloseableContainer + + /** + * {@inheritDoc} + */ + @Override + protected Logger getLogger() { + return LOG; + } } diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/TopologyListener.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/TopologyListener.java index 755eb3db..8f8be7dd 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/TopologyListener.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/TopologyListener.java @@ -222,14 +222,6 @@ public final class TopologyListener child(Topology.class, topoKey).child(Link.class).build(); } - /** - * {@inheritDoc} - */ - @Override - protected Logger getLogger() { - return LOG; - } - /** * Return a set of {@link VtnUpdateType} instances that specifies * event types to be listened. @@ -240,4 +232,14 @@ public final class TopologyListener protected Set getRequiredEvents() { return REQUIRED_EVENTS; } + + // CloseableContainer + + /** + * {@inheritDoc} + */ + @Override + protected Logger getLogger() { + return LOG; + } } diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/VTNInventoryManager.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/VTNInventoryManager.java index 3dda1fb6..8c61c303 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/VTNInventoryManager.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/inventory/VTNInventoryManager.java @@ -341,6 +341,8 @@ public final class VTNInventoryManager child(VtnNode.class).build(); } + // CloseableContainer + /** * {@inheritDoc} */ diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/packet/VTNPacketService.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/packet/VTNPacketService.java index c137a9ee..f3f4116d 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/packet/VTNPacketService.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/packet/VTNPacketService.java @@ -263,7 +263,7 @@ public final class VTNPacketService extends SalNotificationListener } } - // SalNotificationListener + // CloseableContainer /** * {@inheritDoc} diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/routing/PathMapManager.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/routing/PathMapManager.java index a1074fa2..d926eb04 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/routing/PathMapManager.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/routing/PathMapManager.java @@ -363,6 +363,8 @@ public final class PathMapManager child(VtnPathMap.class).build(); } + // CloseableContainer + /** * {@inheritDoc} */ diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/routing/PathPolicyListener.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/routing/PathPolicyListener.java index 8ca173ee..9f028994 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/routing/PathPolicyListener.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/routing/PathPolicyListener.java @@ -366,6 +366,8 @@ final class PathPolicyListener child(VtnPathPolicy.class).build(); } + // CloseableContainer + /** * {@inheritDoc} */ diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/routing/VTNRoutingManager.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/routing/VTNRoutingManager.java index c9c3430f..e2ec2a8b 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/routing/VTNRoutingManager.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/routing/VTNRoutingManager.java @@ -282,14 +282,6 @@ public final class VTNRoutingManager child(VtnLink.class).build(); } - /** - * {@inheritDoc} - */ - @Override - protected Logger getLogger() { - return LOG; - } - /** * Return a set of {@link VtnUpdateType} instances that specifies * event types to be listened. @@ -301,6 +293,16 @@ public final class VTNRoutingManager return REQUIRED_EVENTS; } + // CloseableContainer + + /** + * {@inheritDoc} + */ + @Override + protected Logger getLogger() { + return LOG; + } + // VTNConfigProvider /** diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/AbstractDataChangeListener.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/AbstractDataChangeListener.java index 804968c8..023afb66 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/AbstractDataChangeListener.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/AbstractDataChangeListener.java @@ -13,8 +13,6 @@ import java.util.Collections; import java.util.Map; import java.util.Set; -import org.slf4j.Logger; - import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; @@ -34,17 +32,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vtn.types.rev150209.VtnUpda * @param Type of event context. */ public abstract class AbstractDataChangeListener - implements AutoCloseable, DataChangeListener { + extends CloseableContainer implements DataChangeListener { /** * The type of the target data. */ private final Class targetType; - /** - * A closeable objects to be closed on a {@link #close()} call. - */ - private final CompositeAutoCloseable closeables; - /** * Construct a new instance. * @@ -52,7 +45,6 @@ public abstract class AbstractDataChangeListener */ protected AbstractDataChangeListener(Class cls) { targetType = cls; - closeables = new CompositeAutoCloseable(getLogger()); } /** @@ -90,19 +82,6 @@ public abstract class AbstractDataChangeListener } } - /** - * Add the given closeable object to the closeable object set. - * - *

- * The given object will be closed on a {@link #close()} call. - *

- * - * @param ac An {@link AutoCloseable} instance. - */ - protected final void addCloseable(AutoCloseable ac) { - closeables.add(ac); - } - /** * Verify an instance identifier notified by a data change event. * @@ -298,23 +277,6 @@ public abstract class AbstractDataChangeListener */ protected abstract InstanceIdentifier getWildcardPath(); - /** - * Return a logger instance. - * - * @return A {@link Logger} instance. - */ - protected abstract Logger getLogger(); - - // AutoCloseable - - /** - * Close this listener. - */ - @Override - public void close() { - closeables.close(); - } - // DataChangeListener /** diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/CloseableContainer.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/CloseableContainer.java new file mode 100644 index 00000000..06c1ce89 --- /dev/null +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/CloseableContainer.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2015 NEC Corporation + * 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.vtn.manager.internal.util; + +import org.slf4j.Logger; + +/** + * {@code CloseableContainer} describes a container that contains one or + * more {@link AutoCloseable} instances. + */ +public abstract class CloseableContainer implements AutoCloseable { + /** + * A closeable objects to be closed on a {@link #close()} call. + */ + private final CompositeAutoCloseable closeables; + + /** + * Construct a new instance. + */ + protected CloseableContainer() { + closeables = new CompositeAutoCloseable(getLogger()); + } + + /** + * Add the given closeable object to the closeable object set. + * + *

+ * The given object will be closed on the first {@link #close()} call. + *

+ * + * @param ac An {@link AutoCloseable} instance. + */ + protected final void addCloseable(AutoCloseable ac) { + closeables.add(ac); + } + + /** + * Return a logger instance. + * + *

+ * Note that this method will be called before the constructor returns. + *

+ * + * @return A {@link Logger} instance. + */ + protected abstract Logger getLogger(); + + // AutoCloseable + + /** + * Close all the closeables in this instance. + */ + @Override + public void close() { + closeables.close(); + } +} diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/SalNotificationListener.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/SalNotificationListener.java index 3d083dc6..e9fa45c4 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/SalNotificationListener.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/SalNotificationListener.java @@ -9,32 +9,15 @@ package org.opendaylight.vtn.manager.internal.util; -import java.util.concurrent.atomic.AtomicReference; - -import org.slf4j.Logger; - import org.opendaylight.controller.sal.binding.api.NotificationService; -import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.NotificationListener; /** * Abstract base class for MD-SAL notification listener. */ -public abstract class SalNotificationListener - implements AutoCloseable, NotificationListener { - /** - * Registration of the notification listener. - */ - private final AtomicReference> registration = - new AtomicReference<>(); - - /** - * Construct a new instance. - */ - protected SalNotificationListener() { - } - +public abstract class SalNotificationListener extends CloseableContainer + implements NotificationListener { /** * Register this instance as a SAL notification listener. * @@ -42,7 +25,7 @@ public abstract class SalNotificationListener */ protected final void registerListener(NotificationService nsv) { try { - registration.set(nsv.registerNotificationListener(this)); + addCloseable(nsv.registerNotificationListener(this)); } catch (Exception e) { String msg = "Failed to register notification listener: " + getClass().getName(); @@ -50,31 +33,4 @@ public abstract class SalNotificationListener throw new IllegalStateException(msg, e); } } - - /** - * Return a logger instance. - * - * @return A {@link Logger} instance. - */ - protected abstract Logger getLogger(); - - // AutoCloseable - - /** - * Close this listener. - */ - @Override - public void close() { - ListenerRegistration reg = - registration.getAndSet(null); - if (reg != null) { - try { - reg.close(); - } catch (Exception e) { - String msg = "Failed to unregister notification listener: " + - getClass().getName(); - getLogger().error(msg, e); - } - } - } } diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/vnode/VTenantManager.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/vnode/VTenantManager.java index 0272b5b3..1fe2ff74 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/vnode/VTenantManager.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/vnode/VTenantManager.java @@ -365,6 +365,8 @@ public final class VTenantManager child(Vtn.class).build(); } + // CloseableContainer + /** * {@inheritDoc} */ diff --git a/manager/implementation/src/test/java/org/opendaylight/vtn/manager/internal/util/SalNotificationListenerTest.java b/manager/implementation/src/test/java/org/opendaylight/vtn/manager/internal/util/SalNotificationListenerTest.java index 0d62b88e..7a678080 100644 --- a/manager/implementation/src/test/java/org/opendaylight/vtn/manager/internal/util/SalNotificationListenerTest.java +++ b/manager/implementation/src/test/java/org/opendaylight/vtn/manager/internal/util/SalNotificationListenerTest.java @@ -33,13 +33,19 @@ public class SalNotificationListenerTest extends TestBase { /** * Logger instance. */ - private final Logger logger = Mockito.mock(Logger.class); + private Logger logger; /** * {@inheritDoc} */ + @Override protected Logger getLogger() { - return logger; + Logger log = logger; + if (log == null) { + log = Mockito.mock(Logger.class); + logger = log; + } + return log; } } @@ -148,8 +154,7 @@ public class SalNotificationListenerTest extends TestBase { Mockito.verify(logger, Mockito.never()).error(Mockito.anyString()); // Unregister a listener. - String msg = "Failed to unregister notification listener: " + - listener.getClass().getName(); + String msg = "Failed to close instance: " + reg; IllegalArgumentException iae = new IllegalArgumentException("Bad argument"); Mockito.doThrow(iae).when(reg).close();