From 5f3ff4b8f779df12a7f834647bc3b1835901fad2 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 8 Dec 2023 22:52:37 +0100 Subject: [PATCH] Remove GenericEntityOwnershipCandidateRegistration This interface brings nothing to the table. Use a plain Registration instead, which ends up removing its specializations in both DOM and Binding worlds and bringing them closer together. While we are at it, use constructor injection in mdsal-eos-binding-adapter, so that just have a plain DefaultEntityOwnershipService. JIRA: MDSAL-843 Change-Id: Ic5c27830ce18a1d5be4348fa61cd3994486e4325 Signed-off-by: Robert Varga --- ...gEntityOwnershipCandidateRegistration.java | 37 ------ ...ngEntityOwnershipListenerRegistration.java | 2 +- ...ava => DefaultEntityOwnershipService.java} | 23 ++-- .../adapter/OSGiEntityOwnershipService.java | 77 ----------- ...=> DefaultEntityOwnershipServiceTest.java} | 51 ++++---- .../EntityOwnershipCandidateRegistration.java | 22 ---- .../binding/api/EntityOwnershipService.java | 7 +- ...cEntityOwnershipCandidateRegistration.java | 30 ----- .../api/GenericEntityOwnershipService.java | 5 +- ...cEntityOwnershipCandidateRegistration.java | 29 ----- ...ityOwnershipCandidateRegistrationTest.java | 32 ----- ...MEntityOwnershipCandidateRegistration.java | 22 ---- .../dom/api/DOMEntityOwnershipService.java | 4 +- .../SimpleDOMEntityOwnershipService.java | 54 ++++---- .../di/LocalDOMEntityOwnershipService.java | 4 +- .../SimpleDOMEntityOwnershipServiceTest.java | 123 ++++++++---------- .../ClusterSingletonServiceGroupImpl.java | 6 +- ...AbstractDOMClusterServiceProviderTest.java | 10 +- .../ClusterSingletonServiceGroupImplTest.java | 6 +- 19 files changed, 133 insertions(+), 411 deletions(-) delete mode 100644 entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingEntityOwnershipCandidateRegistration.java rename entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/{BindingDOMEntityOwnershipServiceAdapter.java => DefaultEntityOwnershipService.java} (78%) delete mode 100644 entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/OSGiEntityOwnershipService.java rename entityownership/mdsal-eos-binding-adapter/src/test/java/org/opendaylight/mdsal/eos/binding/dom/adapter/{BindingDOMEntityOwnershipServiceAdapterTest.java => DefaultEntityOwnershipServiceTest.java} (69%) delete mode 100644 entityownership/mdsal-eos-binding-api/src/main/java/org/opendaylight/mdsal/eos/binding/api/EntityOwnershipCandidateRegistration.java delete mode 100644 entityownership/mdsal-eos-common-api/src/main/java/org/opendaylight/mdsal/eos/common/api/GenericEntityOwnershipCandidateRegistration.java delete mode 100644 entityownership/mdsal-eos-common-spi/src/main/java/org/opendaylight/mdsal/eos/common/spi/AbstractGenericEntityOwnershipCandidateRegistration.java delete mode 100644 entityownership/mdsal-eos-common-spi/src/test/java/org/opendaylight/mdsal/eos/common/spi/AbstractGenericEntityOwnershipCandidateRegistrationTest.java delete mode 100644 entityownership/mdsal-eos-dom-api/src/main/java/org/opendaylight/mdsal/eos/dom/api/DOMEntityOwnershipCandidateRegistration.java diff --git a/entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingEntityOwnershipCandidateRegistration.java b/entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingEntityOwnershipCandidateRegistration.java deleted file mode 100644 index 319cc63cef..0000000000 --- a/entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingEntityOwnershipCandidateRegistration.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2015 Brocade Communications Systems, Inc. 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.eos.binding.dom.adapter; - -import static java.util.Objects.requireNonNull; - -import org.opendaylight.mdsal.eos.binding.api.Entity; -import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipCandidateRegistration; -import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipCandidateRegistration; -import org.opendaylight.yangtools.concepts.AbstractObjectRegistration; - -/** - * Implementation of EntityOwnershipCandidateRegistration whose instances are returned from the - * {@link BindingDOMEntityOwnershipServiceAdapter}. - * - * @author Thomas Pantelis - */ -class BindingEntityOwnershipCandidateRegistration extends AbstractObjectRegistration - implements EntityOwnershipCandidateRegistration { - private final DOMEntityOwnershipCandidateRegistration domRegistration; - - BindingEntityOwnershipCandidateRegistration(DOMEntityOwnershipCandidateRegistration domRegistration, - Entity entity) { - super(entity); - this.domRegistration = requireNonNull(domRegistration); - } - - @Override - protected void removeRegistration() { - domRegistration.close(); - } -} \ No newline at end of file diff --git a/entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingEntityOwnershipListenerRegistration.java b/entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingEntityOwnershipListenerRegistration.java index 6d83f19f95..7e09cac2b1 100644 --- a/entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingEntityOwnershipListenerRegistration.java +++ b/entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingEntityOwnershipListenerRegistration.java @@ -16,7 +16,7 @@ import org.opendaylight.yangtools.concepts.AbstractObjectRegistration; /** * Implementation of EntityOwnershipListenerRegistration whose instances are returned from the - * {@link BindingDOMEntityOwnershipServiceAdapter}. + * {@link DefaultEntityOwnershipService}. * * @author Thomas Pantelis */ diff --git a/entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingDOMEntityOwnershipServiceAdapter.java b/entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/DefaultEntityOwnershipService.java similarity index 78% rename from entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingDOMEntityOwnershipServiceAdapter.java rename to entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/DefaultEntityOwnershipService.java index 605276661c..2a17f21b6e 100644 --- a/entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingDOMEntityOwnershipServiceAdapter.java +++ b/entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/DefaultEntityOwnershipService.java @@ -15,7 +15,6 @@ import javax.inject.Singleton; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext; import org.opendaylight.mdsal.eos.binding.api.Entity; -import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipCandidateRegistration; import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipListener; import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipListenerRegistration; import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService; @@ -23,6 +22,10 @@ import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException import org.opendaylight.mdsal.eos.common.api.EntityOwnershipState; import org.opendaylight.mdsal.eos.dom.api.DOMEntity; import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService; +import org.opendaylight.yangtools.concepts.Registration; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; /** * Adapter that bridges between the binding and DOM EntityOwnershipService interfaces. @@ -30,22 +33,22 @@ import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService; * @author Thomas Pantelis */ @Singleton -public class BindingDOMEntityOwnershipServiceAdapter implements EntityOwnershipService, AutoCloseable { +@Component +public final class DefaultEntityOwnershipService implements EntityOwnershipService { private final @NonNull DOMEntityOwnershipService domService; private final @NonNull AdapterContext adapterContext; @Inject - public BindingDOMEntityOwnershipServiceAdapter(final @NonNull DOMEntityOwnershipService domService, - final @NonNull AdapterContext adapterContext) { + @Activate + public DefaultEntityOwnershipService(@Reference final @NonNull DOMEntityOwnershipService domService, + @Reference final @NonNull AdapterContext adapterContext) { this.domService = requireNonNull(domService); this.adapterContext = requireNonNull(adapterContext); } @Override - public EntityOwnershipCandidateRegistration registerCandidate(final Entity entity) - throws CandidateAlreadyRegisteredException { - return new BindingEntityOwnershipCandidateRegistration( - domService.registerCandidate(toDOMEntity(entity)), entity); + public Registration registerCandidate(final Entity entity) throws CandidateAlreadyRegisteredException { + return domService.registerCandidate(toDOMEntity(entity)); } @Override @@ -69,8 +72,4 @@ public class BindingDOMEntityOwnershipServiceAdapter implements EntityOwnershipS return new DOMEntity(entity.getType(), adapterContext.currentSerializer().toYangInstanceIdentifier(entity.getIdentifier())); } - - @Override - public void close() { - } } diff --git a/entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/OSGiEntityOwnershipService.java b/entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/OSGiEntityOwnershipService.java deleted file mode 100644 index 3746d808d7..0000000000 --- a/entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/OSGiEntityOwnershipService.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * 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.eos.binding.dom.adapter; - -import com.google.common.annotations.Beta; -import java.util.Optional; -import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext; -import org.opendaylight.mdsal.eos.binding.api.Entity; -import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipCandidateRegistration; -import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipListener; -import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipListenerRegistration; -import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService; -import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException; -import org.opendaylight.mdsal.eos.common.api.EntityOwnershipState; -import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService; -import org.osgi.service.component.annotations.Activate; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.Deactivate; -import org.osgi.service.component.annotations.Reference; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@Beta -@Component(immediate = true, property = "type=default") -public final class OSGiEntityOwnershipService implements EntityOwnershipService { - private static final Logger LOG = LoggerFactory.getLogger(OSGiEntityOwnershipService.class); - - @Reference - DOMEntityOwnershipService domService = null; - @Reference - AdapterContext adapterContext = null; - - private BindingDOMEntityOwnershipServiceAdapter delegate; - - @Override - public EntityOwnershipCandidateRegistration registerCandidate(final Entity entity) - throws CandidateAlreadyRegisteredException { - return delegate.registerCandidate(entity); - } - - @Override - public EntityOwnershipListenerRegistration registerListener(final String entityType, - final EntityOwnershipListener listener) { - return delegate.registerListener(entityType, listener); - } - - @Override - public Optional getOwnershipState(final Entity forEntity) { - return delegate.getOwnershipState(forEntity); - } - - @Override - public boolean isCandidateRegistered(final Entity forEntity) { - return delegate.isCandidateRegistered(forEntity); - } - - @Activate - void activate() { - LOG.info("Entity Ownership Service adapter starting"); - delegate = new BindingDOMEntityOwnershipServiceAdapter(domService, adapterContext); - LOG.info("Entity Ownership Service adapter started"); - } - - @Deactivate - void deactivate() { - LOG.info("Entity Ownership Service adapter stopping"); - delegate.close(); - delegate = null; - LOG.info("Entity Ownership Service adapter stopped"); - - } -} diff --git a/entityownership/mdsal-eos-binding-adapter/src/test/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingDOMEntityOwnershipServiceAdapterTest.java b/entityownership/mdsal-eos-binding-adapter/src/test/java/org/opendaylight/mdsal/eos/binding/dom/adapter/DefaultEntityOwnershipServiceTest.java similarity index 69% rename from entityownership/mdsal-eos-binding-adapter/src/test/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingDOMEntityOwnershipServiceAdapterTest.java rename to entityownership/mdsal-eos-binding-adapter/src/test/java/org/opendaylight/mdsal/eos/binding/dom/adapter/DefaultEntityOwnershipServiceTest.java index 26379e6213..4c07869c78 100644 --- a/entityownership/mdsal-eos-binding-adapter/src/test/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingDOMEntityOwnershipServiceAdapterTest.java +++ b/entityownership/mdsal-eos-binding-adapter/src/test/java/org/opendaylight/mdsal/eos/binding/dom/adapter/DefaultEntityOwnershipServiceTest.java @@ -28,7 +28,6 @@ import org.mockito.junit.MockitoJUnitRunner; import org.opendaylight.mdsal.binding.dom.adapter.ConstantAdapterContext; import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices; import org.opendaylight.mdsal.eos.binding.api.Entity; -import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipCandidateRegistration; import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipChange; import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipListener; import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipListenerRegistration; @@ -36,11 +35,11 @@ import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException import org.opendaylight.mdsal.eos.common.api.EntityOwnershipChangeState; import org.opendaylight.mdsal.eos.common.api.EntityOwnershipState; import org.opendaylight.mdsal.eos.dom.api.DOMEntity; -import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipCandidateRegistration; import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipChange; import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipListener; import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipListenerRegistration; import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService; +import org.opendaylight.yangtools.concepts.Registration; /** * Unit tests for BindingDOMEntityOwnershipServiceAdapter. @@ -48,9 +47,9 @@ import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService; * @author Thomas Pantelis */ @RunWith(MockitoJUnitRunner.StrictStubs.class) -public class BindingDOMEntityOwnershipServiceAdapterTest { - static Entity BINDING_ENTITY = new Entity("foo", "bar"); - static DOMEntity DOM_ENTITY = new DOMEntity("foo", "bar"); +public class DefaultEntityOwnershipServiceTest { + static final Entity BINDING_ENTITY = new Entity("foo", "bar"); + static final DOMEntity DOM_ENTITY = new DOMEntity("foo", "bar"); @Mock private BindingDOMCodecServices mockCodecRegistry; @@ -58,7 +57,7 @@ public class BindingDOMEntityOwnershipServiceAdapterTest { @Mock private DOMEntityOwnershipService mockDOMService; - private BindingDOMEntityOwnershipServiceAdapter adapter; + private DefaultEntityOwnershipService adapter; @Before public void setup() { @@ -67,32 +66,29 @@ public class BindingDOMEntityOwnershipServiceAdapterTest { doReturn(BINDING_ENTITY.getIdentifier()).when(mockCodecRegistry).fromYangInstanceIdentifier( DOM_ENTITY.getIdentifier()); - this.adapter = new BindingDOMEntityOwnershipServiceAdapter(mockDOMService, + adapter = new DefaultEntityOwnershipService(mockDOMService, new ConstantAdapterContext(mockCodecRegistry)); } @Test public void testRegisterCandidate() throws CandidateAlreadyRegisteredException { - final DOMEntityOwnershipCandidateRegistration mockDOMReg = mock(DOMEntityOwnershipCandidateRegistration.class); - doReturn(mockDOMReg).when(this.mockDOMService).registerCandidate(DOM_ENTITY); + final var mockDOMReg = mock(Registration.class); + doReturn(mockDOMReg).when(mockDOMService).registerCandidate(DOM_ENTITY); - final EntityOwnershipCandidateRegistration reg = this.adapter.registerCandidate(BINDING_ENTITY); - - assertNotNull("registerCandidate returned null", reg); - assertEquals("getInstance", BINDING_ENTITY, reg.getInstance()); - - reg.close(); + try (var reg = adapter.registerCandidate(BINDING_ENTITY)) { + assertNotNull("registerCandidate returned null", reg); + } verify(mockDOMReg).close(); } @Test public void testRegisterListener() { final DOMEntityOwnershipListenerRegistration mockDOMReg = mock(DOMEntityOwnershipListenerRegistration.class); - doReturn(mockDOMReg).when(this.mockDOMService).registerListener(eq(DOM_ENTITY.getType()), + doReturn(mockDOMReg).when(mockDOMService).registerListener(eq(DOM_ENTITY.getType()), any(DOMEntityOwnershipListener.class)); final EntityOwnershipListener mockListener = mock(EntityOwnershipListener.class); - final EntityOwnershipListenerRegistration reg = this.adapter.registerListener( + final EntityOwnershipListenerRegistration reg = adapter.registerListener( BINDING_ENTITY.getType(), mockListener); assertNotNull("registerListener returned null", reg); @@ -101,7 +97,7 @@ public class BindingDOMEntityOwnershipServiceAdapterTest { final ArgumentCaptor domListenerCaptor = ArgumentCaptor.forClass( DOMEntityOwnershipListener.class); - verify(this.mockDOMService).registerListener(eq(DOM_ENTITY.getType()), domListenerCaptor.capture()); + verify(mockDOMService).registerListener(eq(DOM_ENTITY.getType()), domListenerCaptor.capture()); final DOMEntityOwnershipChange domOwnershipChange = new DOMEntityOwnershipChange(DOM_ENTITY, EntityOwnershipChangeState.LOCAL_OWNERSHIP_GRANTED, true); @@ -121,25 +117,24 @@ public class BindingDOMEntityOwnershipServiceAdapterTest { @Test public void testGetOwnershipState() { - final Optional expectedState = Optional.of(EntityOwnershipState.IS_OWNER); - doReturn(expectedState).when(this.mockDOMService).getOwnershipState(DOM_ENTITY); - - final Optional actualState = this.adapter.getOwnershipState(BINDING_ENTITY); + final var expectedState = Optional.of(EntityOwnershipState.IS_OWNER); + doReturn(expectedState).when(mockDOMService).getOwnershipState(DOM_ENTITY); + final var actualState = adapter.getOwnershipState(BINDING_ENTITY); assertSame("getOwnershipState", expectedState, actualState); } @Test public void testIsCandidateRegistered() { - doReturn(true).when(this.mockDOMService).isCandidateRegistered(DOM_ENTITY); - assertEquals("isCandidateRegistered", true, this.adapter.isCandidateRegistered(BINDING_ENTITY)); + doReturn(true).when(mockDOMService).isCandidateRegistered(DOM_ENTITY); + assertEquals("isCandidateRegistered", true, adapter.isCandidateRegistered(BINDING_ENTITY)); } public void testOwnershipChangeWithException() { - final DOMEntityOwnershipListenerAdapter domEntityOwnershipListenerAdapter = - new DOMEntityOwnershipListenerAdapter(mock(EntityOwnershipListener.class), - new ConstantAdapterContext(mockCodecRegistry)); - final DOMEntityOwnershipChange domOwnershipChange = mock(DOMEntityOwnershipChange.class); + final var domEntityOwnershipListenerAdapter = + new DOMEntityOwnershipListenerAdapter(mock(EntityOwnershipListener.class), + new ConstantAdapterContext(mockCodecRegistry)); + final var domOwnershipChange = mock(DOMEntityOwnershipChange.class); doThrow(IllegalStateException.class).when(domOwnershipChange).getEntity(); assertThrows(IllegalStateException.class, () -> domEntityOwnershipListenerAdapter.ownershipChanged(domOwnershipChange)); diff --git a/entityownership/mdsal-eos-binding-api/src/main/java/org/opendaylight/mdsal/eos/binding/api/EntityOwnershipCandidateRegistration.java b/entityownership/mdsal-eos-binding-api/src/main/java/org/opendaylight/mdsal/eos/binding/api/EntityOwnershipCandidateRegistration.java deleted file mode 100644 index 337b99ff81..0000000000 --- a/entityownership/mdsal-eos-binding-api/src/main/java/org/opendaylight/mdsal/eos/binding/api/EntityOwnershipCandidateRegistration.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2015 Brocade Communications Systems, Inc. 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.eos.binding.api; - -import com.google.common.annotations.Beta; -import org.opendaylight.mdsal.eos.common.api.GenericEntityOwnershipCandidateRegistration; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; - -/** - * Binding version of {@link GenericEntityOwnershipCandidateRegistration}. - * - * @author Thomas Pantelis - */ -@Beta -public interface EntityOwnershipCandidateRegistration extends - GenericEntityOwnershipCandidateRegistration, Entity> { -} diff --git a/entityownership/mdsal-eos-binding-api/src/main/java/org/opendaylight/mdsal/eos/binding/api/EntityOwnershipService.java b/entityownership/mdsal-eos-binding-api/src/main/java/org/opendaylight/mdsal/eos/binding/api/EntityOwnershipService.java index a32cb6e101..557b04a1e1 100644 --- a/entityownership/mdsal-eos-binding-api/src/main/java/org/opendaylight/mdsal/eos/binding/api/EntityOwnershipService.java +++ b/entityownership/mdsal-eos-binding-api/src/main/java/org/opendaylight/mdsal/eos/binding/api/EntityOwnershipService.java @@ -12,6 +12,7 @@ import java.util.Optional; import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException; import org.opendaylight.mdsal.eos.common.api.EntityOwnershipState; import org.opendaylight.mdsal.eos.common.api.GenericEntityOwnershipService; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; /** @@ -24,12 +25,10 @@ public interface EntityOwnershipService extends GenericEntityOwnershipService, Entity, EntityOwnershipListener> { @Override - EntityOwnershipCandidateRegistration registerCandidate(Entity entity) - throws CandidateAlreadyRegisteredException; + Registration registerCandidate(Entity entity) throws CandidateAlreadyRegisteredException; @Override - EntityOwnershipListenerRegistration registerListener(String entityType, - EntityOwnershipListener listener); + EntityOwnershipListenerRegistration registerListener(String entityType, EntityOwnershipListener listener); @Override Optional getOwnershipState(Entity forEntity); diff --git a/entityownership/mdsal-eos-common-api/src/main/java/org/opendaylight/mdsal/eos/common/api/GenericEntityOwnershipCandidateRegistration.java b/entityownership/mdsal-eos-common-api/src/main/java/org/opendaylight/mdsal/eos/common/api/GenericEntityOwnershipCandidateRegistration.java deleted file mode 100644 index c56449fd3a..0000000000 --- a/entityownership/mdsal-eos-common-api/src/main/java/org/opendaylight/mdsal/eos/common/api/GenericEntityOwnershipCandidateRegistration.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2015 Brocade Communications Systems, Inc. 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.eos.common.api; - -import org.opendaylight.yangtools.concepts.HierarchicalIdentifier; -import org.opendaylight.yangtools.concepts.ObjectRegistration; - -/** - * An interface that records a request to register a Candidate for a given Entity. Calling close on the - * registration will remove the Candidate from any future ownership considerations for that Entity. - * - * @author Thomas Pantelis - * - * @param

the instance identifier type - * @param the GenericEntity type - */ -public interface GenericEntityOwnershipCandidateRegistration

, - E extends GenericEntity

> extends ObjectRegistration { - - /** - * Unregister the candidate. - */ - @Override - void close(); -} diff --git a/entityownership/mdsal-eos-common-api/src/main/java/org/opendaylight/mdsal/eos/common/api/GenericEntityOwnershipService.java b/entityownership/mdsal-eos-common-api/src/main/java/org/opendaylight/mdsal/eos/common/api/GenericEntityOwnershipService.java index ab5eded6dd..d52ab1cbfa 100644 --- a/entityownership/mdsal-eos-common-api/src/main/java/org/opendaylight/mdsal/eos/common/api/GenericEntityOwnershipService.java +++ b/entityownership/mdsal-eos-common-api/src/main/java/org/opendaylight/mdsal/eos/common/api/GenericEntityOwnershipService.java @@ -10,6 +10,7 @@ package org.opendaylight.mdsal.eos.common.api; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.concepts.HierarchicalIdentifier; +import org.opendaylight.yangtools.concepts.Registration; /** *

@@ -29,7 +30,6 @@ import org.opendaylight.yangtools.concepts.HierarchicalIdentifier; */ public interface GenericEntityOwnershipService

, E extends GenericEntity

, L extends GenericEntityOwnershipListener>> { - /** * Registers a candidate for ownership of the given entity. Only one such request can be made per entity * per process. If multiple requests for registering a candidate for a given entity are received in the @@ -43,8 +43,7 @@ public interface GenericEntityOwnershipService

registerCandidate(@NonNull E entity) - throws CandidateAlreadyRegisteredException; + @NonNull Registration registerCandidate(@NonNull E entity) throws CandidateAlreadyRegisteredException; /** * Registers a listener that is interested in ownership changes for entities of the given entity type. The diff --git a/entityownership/mdsal-eos-common-spi/src/main/java/org/opendaylight/mdsal/eos/common/spi/AbstractGenericEntityOwnershipCandidateRegistration.java b/entityownership/mdsal-eos-common-spi/src/main/java/org/opendaylight/mdsal/eos/common/spi/AbstractGenericEntityOwnershipCandidateRegistration.java deleted file mode 100644 index 2d4459ffb5..0000000000 --- a/entityownership/mdsal-eos-common-spi/src/main/java/org/opendaylight/mdsal/eos/common/spi/AbstractGenericEntityOwnershipCandidateRegistration.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. 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.eos.common.spi; - -import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.mdsal.eos.common.api.GenericEntity; -import org.opendaylight.mdsal.eos.common.api.GenericEntityOwnershipCandidateRegistration; -import org.opendaylight.yangtools.concepts.AbstractObjectRegistration; -import org.opendaylight.yangtools.concepts.HierarchicalIdentifier; - -/** - * Abstract base class for an EntityOwnershipCandidateRegistration. - * - * @param

the instance identifier path type - * @param the GenericEntity type - */ -public abstract class AbstractGenericEntityOwnershipCandidateRegistration

, - E extends GenericEntity

> - extends AbstractObjectRegistration implements GenericEntityOwnershipCandidateRegistration { - - protected AbstractGenericEntityOwnershipCandidateRegistration(final @NonNull E entity) { - super(entity); - } -} diff --git a/entityownership/mdsal-eos-common-spi/src/test/java/org/opendaylight/mdsal/eos/common/spi/AbstractGenericEntityOwnershipCandidateRegistrationTest.java b/entityownership/mdsal-eos-common-spi/src/test/java/org/opendaylight/mdsal/eos/common/spi/AbstractGenericEntityOwnershipCandidateRegistrationTest.java deleted file mode 100644 index e28e47d80a..0000000000 --- a/entityownership/mdsal-eos-common-spi/src/test/java/org/opendaylight/mdsal/eos/common/spi/AbstractGenericEntityOwnershipCandidateRegistrationTest.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. 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.eos.common.spi; - -import static org.junit.Assert.assertNotNull; -import static org.mockito.Mockito.mock; - -import org.junit.Test; -import org.opendaylight.mdsal.eos.common.api.GenericEntity; - -public class AbstractGenericEntityOwnershipCandidateRegistrationTest - extends AbstractGenericEntityOwnershipCandidateRegistration { - - @Test - public void basicTest() { - assertNotNull(this); - } - - public AbstractGenericEntityOwnershipCandidateRegistrationTest() { - super(mock(GenericEntity.class)); - } - - @Override - protected void removeRegistration() { - //NOOP - } -} \ No newline at end of file diff --git a/entityownership/mdsal-eos-dom-api/src/main/java/org/opendaylight/mdsal/eos/dom/api/DOMEntityOwnershipCandidateRegistration.java b/entityownership/mdsal-eos-dom-api/src/main/java/org/opendaylight/mdsal/eos/dom/api/DOMEntityOwnershipCandidateRegistration.java deleted file mode 100644 index 1b99b5189f..0000000000 --- a/entityownership/mdsal-eos-dom-api/src/main/java/org/opendaylight/mdsal/eos/dom/api/DOMEntityOwnershipCandidateRegistration.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2015 Brocade Communications Systems, Inc. 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.eos.dom.api; - -import com.google.common.annotations.Beta; -import org.opendaylight.mdsal.eos.common.api.GenericEntityOwnershipCandidateRegistration; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; - -/** - * DOM version of {@link GenericEntityOwnershipCandidateRegistration}. - * - * @author Thomas Pantelis - */ -@Beta -public interface DOMEntityOwnershipCandidateRegistration extends - GenericEntityOwnershipCandidateRegistration { -} diff --git a/entityownership/mdsal-eos-dom-api/src/main/java/org/opendaylight/mdsal/eos/dom/api/DOMEntityOwnershipService.java b/entityownership/mdsal-eos-dom-api/src/main/java/org/opendaylight/mdsal/eos/dom/api/DOMEntityOwnershipService.java index b844475745..1202a685fe 100644 --- a/entityownership/mdsal-eos-dom-api/src/main/java/org/opendaylight/mdsal/eos/dom/api/DOMEntityOwnershipService.java +++ b/entityownership/mdsal-eos-dom-api/src/main/java/org/opendaylight/mdsal/eos/dom/api/DOMEntityOwnershipService.java @@ -12,6 +12,7 @@ import java.util.Optional; import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException; import org.opendaylight.mdsal.eos.common.api.EntityOwnershipState; import org.opendaylight.mdsal.eos.common.api.GenericEntityOwnershipService; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; /** @@ -23,8 +24,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; public interface DOMEntityOwnershipService extends GenericEntityOwnershipService { @Override - DOMEntityOwnershipCandidateRegistration registerCandidate(DOMEntity entity) - throws CandidateAlreadyRegisteredException; + Registration registerCandidate(DOMEntity entity) throws CandidateAlreadyRegisteredException; @Override DOMEntityOwnershipListenerRegistration registerListener(String entityType, diff --git a/entityownership/mdsal-eos-dom-simple/src/main/java/org/opendaylight/mdsal/eos/dom/simple/SimpleDOMEntityOwnershipService.java b/entityownership/mdsal-eos-dom-simple/src/main/java/org/opendaylight/mdsal/eos/dom/simple/SimpleDOMEntityOwnershipService.java index 4247194c95..64b9a985e5 100644 --- a/entityownership/mdsal-eos-dom-simple/src/main/java/org/opendaylight/mdsal/eos/dom/simple/SimpleDOMEntityOwnershipService.java +++ b/entityownership/mdsal-eos-dom-simple/src/main/java/org/opendaylight/mdsal/eos/dom/simple/SimpleDOMEntityOwnershipService.java @@ -13,7 +13,6 @@ import static org.opendaylight.mdsal.eos.common.api.EntityOwnershipChangeState.L import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; -import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.HashBasedTable; import com.google.common.collect.ImmutableList; @@ -28,20 +27,24 @@ import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException import org.opendaylight.mdsal.eos.common.api.EntityOwnershipChangeState; import org.opendaylight.mdsal.eos.common.api.EntityOwnershipState; import org.opendaylight.mdsal.eos.dom.api.DOMEntity; -import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipCandidateRegistration; import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipChange; import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipListener; import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipListenerRegistration; import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService; +import org.opendaylight.mdsal.eos.dom.simple.di.LocalDOMEntityOwnershipService; import org.opendaylight.yangtools.concepts.AbstractObjectRegistration; +import org.opendaylight.yangtools.concepts.AbstractRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Component @MetaInfServices -@Component(immediate = true) -public class SimpleDOMEntityOwnershipService implements DOMEntityOwnershipService { +public sealed class SimpleDOMEntityOwnershipService implements DOMEntityOwnershipService + permits LocalDOMEntityOwnershipService { private static final Logger LOG = LoggerFactory.getLogger(SimpleDOMEntityOwnershipService.class); @GuardedBy("entities") @@ -52,20 +55,20 @@ public class SimpleDOMEntityOwnershipService implements DOMEntityOwnershipServic private final UUID uuid; + @Activate + public SimpleDOMEntityOwnershipService() { + this(UUID.randomUUID()); + } + @VisibleForTesting SimpleDOMEntityOwnershipService(final UUID uuid) { this.uuid = requireNonNull(uuid); } - public SimpleDOMEntityOwnershipService() { - this(UUID.randomUUID()); - } - @Override - public DOMEntityOwnershipCandidateRegistration registerCandidate(final DOMEntity entity) - throws CandidateAlreadyRegisteredException { + public Registration registerCandidate(final DOMEntity entity) throws CandidateAlreadyRegisteredException { synchronized (entities) { - final DOMEntity prev = entities.get(entity.getType(), entity.getIdentifier()); + final var prev = entities.get(entity.getType(), entity.getIdentifier()); if (prev != null) { throw new CandidateAlreadyRegisteredException(prev); } @@ -75,7 +78,12 @@ public class SimpleDOMEntityOwnershipService implements DOMEntityOwnershipServic } notifyListeners(entity, LOCAL_OWNERSHIP_GRANTED); - return new EntityRegistration(entity); + return new AbstractRegistration() { + @Override + protected void removeRegistration() { + removeEntity(entity); + } + }; } @Override @@ -153,28 +161,14 @@ public class SimpleDOMEntityOwnershipService implements DOMEntityOwnershipServic @Override public String toString() { - final ToStringHelper h = MoreObjects.toStringHelper(SimpleDOMEntityOwnershipService.class).add("uuid", uuid); - + final var helper = MoreObjects.toStringHelper(SimpleDOMEntityOwnershipService.class).add("uuid", uuid); synchronized (entities) { - h.add("entities", entities); + helper.add("entities", entities); } synchronized (listeners) { - h.add("listeners", listeners); - } - - return h.toString(); - } - - private final class EntityRegistration extends AbstractObjectRegistration implements - DOMEntityOwnershipCandidateRegistration { - EntityRegistration(final DOMEntity entity) { - super(entity); - } - - @Override - protected void removeRegistration() { - removeEntity(getInstance()); + helper.add("listeners", listeners); } + return helper.toString(); } private final class ListenerRegistration extends AbstractObjectRegistration diff --git a/entityownership/mdsal-eos-dom-simple/src/main/java/org/opendaylight/mdsal/eos/dom/simple/di/LocalDOMEntityOwnershipService.java b/entityownership/mdsal-eos-dom-simple/src/main/java/org/opendaylight/mdsal/eos/dom/simple/di/LocalDOMEntityOwnershipService.java index 95f7603cf1..03f3ffc119 100644 --- a/entityownership/mdsal-eos-dom-simple/src/main/java/org/opendaylight/mdsal/eos/dom/simple/di/LocalDOMEntityOwnershipService.java +++ b/entityownership/mdsal-eos-dom-simple/src/main/java/org/opendaylight/mdsal/eos/dom/simple/di/LocalDOMEntityOwnershipService.java @@ -16,12 +16,10 @@ import org.opendaylight.mdsal.eos.dom.simple.SimpleDOMEntityOwnershipService; /** * Simple {@link DOMEntityOwnershipService} operating as an isolated island. It has no awareness of the world outside * of itself. - * - * @author Robert Varga */ @Beta @Singleton -public class LocalDOMEntityOwnershipService extends SimpleDOMEntityOwnershipService { +public final class LocalDOMEntityOwnershipService extends SimpleDOMEntityOwnershipService { @Inject public LocalDOMEntityOwnershipService() { // Exposed for DI diff --git a/entityownership/mdsal-eos-dom-simple/src/test/java/org/opendaylight/mdsal/eos/dom/simple/SimpleDOMEntityOwnershipServiceTest.java b/entityownership/mdsal-eos-dom-simple/src/test/java/org/opendaylight/mdsal/eos/dom/simple/SimpleDOMEntityOwnershipServiceTest.java index 2476151516..197f303e92 100644 --- a/entityownership/mdsal-eos-dom-simple/src/test/java/org/opendaylight/mdsal/eos/dom/simple/SimpleDOMEntityOwnershipServiceTest.java +++ b/entityownership/mdsal-eos-dom-simple/src/test/java/org/opendaylight/mdsal/eos/dom/simple/SimpleDOMEntityOwnershipServiceTest.java @@ -7,10 +7,11 @@ */ package org.opendaylight.mdsal.eos.dom.simple; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; @@ -19,102 +20,88 @@ import static org.mockito.Mockito.verify; import java.util.Optional; import java.util.UUID; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException; import org.opendaylight.mdsal.eos.common.api.EntityOwnershipChangeState; import org.opendaylight.mdsal.eos.common.api.EntityOwnershipState; import org.opendaylight.mdsal.eos.dom.api.DOMEntity; -import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipCandidateRegistration; import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipChange; import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipListener; -import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipListenerRegistration; import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService; -@RunWith(MockitoJUnitRunner.StrictStubs.class) -public class SimpleDOMEntityOwnershipServiceTest { - public static final String FOO_TYPE = "foo"; - public static final String BAR_TYPE = "bar"; +@ExtendWith(MockitoExtension.class) +class SimpleDOMEntityOwnershipServiceTest { + private static final String FOO_TYPE = "foo"; + private static final String BAR_TYPE = "bar"; + private static final DOMEntity FOO_FOO_ENTITY = new DOMEntity(FOO_TYPE, "foo"); + private static final DOMEntity FOO_BAR_ENTITY = new DOMEntity(FOO_TYPE, "bar"); - public static final DOMEntity FOO_FOO_ENTITY = new DOMEntity(FOO_TYPE, "foo"); - public static final DOMEntity FOO_BAR_ENTITY = new DOMEntity(FOO_TYPE, "bar"); - - public final DOMEntityOwnershipService service = new SimpleDOMEntityOwnershipService(); + final DOMEntityOwnershipService service = new SimpleDOMEntityOwnershipService(); @Test - public void testNonExistingEntity() { + void testNonExistingEntity() { assertFalse(service.isCandidateRegistered(FOO_FOO_ENTITY)); - final Optional state = service.getOwnershipState(FOO_FOO_ENTITY); - assertNotNull(state); - assertFalse(state.isPresent()); + assertEquals(Optional.empty(), service.getOwnershipState(FOO_FOO_ENTITY)); } @Test - public void testExistingEntity() throws CandidateAlreadyRegisteredException { - final DOMEntityOwnershipCandidateRegistration reg = service.registerCandidate(FOO_FOO_ENTITY); - assertNotNull(reg); - - assertTrue(service.isCandidateRegistered(FOO_FOO_ENTITY)); - assertFalse(service.isCandidateRegistered(FOO_BAR_ENTITY)); + void testExistingEntity() throws Exception { + try (var reg = service.registerCandidate(FOO_FOO_ENTITY)) { + assertNotNull(reg); - final Optional state = service.getOwnershipState(FOO_FOO_ENTITY); - assertNotNull(state); - assertTrue(state.isPresent()); - assertEquals(EntityOwnershipState.IS_OWNER, state.orElseThrow()); + assertTrue(service.isCandidateRegistered(FOO_FOO_ENTITY)); + assertFalse(service.isCandidateRegistered(FOO_BAR_ENTITY)); - reg.close(); + assertEquals(Optional.of(EntityOwnershipState.IS_OWNER), service.getOwnershipState(FOO_FOO_ENTITY)); + } assertFalse(service.isCandidateRegistered(FOO_FOO_ENTITY)); } - @Test(expected = CandidateAlreadyRegisteredException.class) - public void testDuplicateRegistration() throws CandidateAlreadyRegisteredException { - final DOMEntityOwnershipCandidateRegistration reg = service.registerCandidate(FOO_FOO_ENTITY); - assertNotNull(reg); + @Test + void testDuplicateRegistration() throws Exception { + assertNotNull(service.registerCandidate(FOO_FOO_ENTITY)); // Should throw - service.registerCandidate(FOO_FOO_ENTITY); + assertThrows(CandidateAlreadyRegisteredException.class, () -> service.registerCandidate(FOO_FOO_ENTITY)); } @Test - public void testListener() throws CandidateAlreadyRegisteredException { - final DOMEntityOwnershipCandidateRegistration entityReg = service.registerCandidate(FOO_FOO_ENTITY); + void testListener() throws Exception { + final var entityReg = service.registerCandidate(FOO_FOO_ENTITY); assertNotNull(entityReg); // Mismatched type, not triggered - final DOMEntityOwnershipListener barListener = mock(DOMEntityOwnershipListener.class); - final DOMEntityOwnershipListenerRegistration barReg = service.registerListener(BAR_TYPE, barListener); - - // Matching type should be triggered - final DOMEntityOwnershipListener fooListener = mock(DOMEntityOwnershipListener.class); - doNothing().when(fooListener).ownershipChanged(any(DOMEntityOwnershipChange.class)); - final DOMEntityOwnershipListenerRegistration fooReg = service.registerListener(FOO_TYPE, fooListener); - final ArgumentCaptor fooCaptor = ArgumentCaptor.forClass( - DOMEntityOwnershipChange.class); - verify(fooListener).ownershipChanged(fooCaptor.capture()); - - DOMEntityOwnershipChange fooChange = fooCaptor.getValue(); - assertEquals(FOO_FOO_ENTITY, fooChange.getEntity()); - assertEquals(EntityOwnershipChangeState.LOCAL_OWNERSHIP_GRANTED, fooChange.getState()); - - reset(fooListener); - doNothing().when(fooListener).ownershipChanged(any(DOMEntityOwnershipChange.class)); - entityReg.close(); - verify(fooListener).ownershipChanged(fooCaptor.capture()); - fooChange = fooCaptor.getValue(); - assertEquals(FOO_FOO_ENTITY, fooChange.getEntity()); - assertEquals(EntityOwnershipChangeState.LOCAL_OWNERSHIP_LOST_NO_OWNER, fooChange.getState()); - - fooReg.close(); - barReg.close(); + final var barListener = mock(DOMEntityOwnershipListener.class); + try (var barReg = service.registerListener(BAR_TYPE, barListener)) { + // Matching type should be triggered + final var fooListener = mock(DOMEntityOwnershipListener.class); + doNothing().when(fooListener).ownershipChanged(any(DOMEntityOwnershipChange.class)); + try (var fooReg = service.registerListener(FOO_TYPE, fooListener)) { + final var fooCaptor = ArgumentCaptor.forClass(DOMEntityOwnershipChange.class); + verify(fooListener).ownershipChanged(fooCaptor.capture()); + + var fooChange = fooCaptor.getValue(); + assertEquals(FOO_FOO_ENTITY, fooChange.getEntity()); + assertEquals(EntityOwnershipChangeState.LOCAL_OWNERSHIP_GRANTED, fooChange.getState()); + + reset(fooListener); + doNothing().when(fooListener).ownershipChanged(any(DOMEntityOwnershipChange.class)); + entityReg.close(); + verify(fooListener).ownershipChanged(fooCaptor.capture()); + fooChange = fooCaptor.getValue(); + assertEquals(FOO_FOO_ENTITY, fooChange.getEntity()); + assertEquals(EntityOwnershipChangeState.LOCAL_OWNERSHIP_LOST_NO_OWNER, fooChange.getState()); + } + } } @Test - public void testToString() throws CandidateAlreadyRegisteredException { - final UUID uuid = UUID.randomUUID(); - final String expected = String.format("SimpleDOMEntityOwnershipService{uuid=%s, entities={}, listeners={}}", - uuid); + void testToString() throws Exception { + final var uuid = UUID.randomUUID(); + final var expected = String.format("SimpleDOMEntityOwnershipService{uuid=%s, entities={}, listeners={}}", uuid); assertEquals(expected, new SimpleDOMEntityOwnershipService(uuid).toString()); } } diff --git a/singleton-service/mdsal-singleton-dom-impl/src/main/java/org/opendaylight/mdsal/singleton/dom/impl/ClusterSingletonServiceGroupImpl.java b/singleton-service/mdsal-singleton-dom-impl/src/main/java/org/opendaylight/mdsal/singleton/dom/impl/ClusterSingletonServiceGroupImpl.java index 37fa755c88..ba9cdfecce 100644 --- a/singleton-service/mdsal-singleton-dom-impl/src/main/java/org/opendaylight/mdsal/singleton/dom/impl/ClusterSingletonServiceGroupImpl.java +++ b/singleton-service/mdsal-singleton-dom-impl/src/main/java/org/opendaylight/mdsal/singleton/dom/impl/ClusterSingletonServiceGroupImpl.java @@ -37,13 +37,13 @@ import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException; import org.opendaylight.mdsal.eos.common.api.EntityOwnershipChangeState; import org.opendaylight.mdsal.eos.common.api.GenericEntity; -import org.opendaylight.mdsal.eos.common.api.GenericEntityOwnershipCandidateRegistration; import org.opendaylight.mdsal.eos.common.api.GenericEntityOwnershipChange; import org.opendaylight.mdsal.eos.common.api.GenericEntityOwnershipListener; import org.opendaylight.mdsal.eos.common.api.GenericEntityOwnershipService; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; import org.opendaylight.yangtools.concepts.HierarchicalIdentifier; +import org.opendaylight.yangtools.concepts.Registration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -164,7 +164,7 @@ final class ClusterSingletonServiceGroupImpl

* acquire {@link #cleanupEntity}. */ @GuardedBy("this") - private GenericEntityOwnershipCandidateRegistration serviceEntityReg = null; + private Registration serviceEntityReg = null; /** * Service (base) entity last reported state. */ @@ -176,7 +176,7 @@ final class ClusterSingletonServiceGroupImpl

* and startup. */ @GuardedBy("this") - private GenericEntityOwnershipCandidateRegistration cleanupEntityReg; + private Registration cleanupEntityReg; /** * Cleanup (owner) entity last reported state. */ diff --git a/singleton-service/mdsal-singleton-dom-impl/src/test/java/org/opendaylight/mdsal/singleton/dom/impl/AbstractDOMClusterServiceProviderTest.java b/singleton-service/mdsal-singleton-dom-impl/src/test/java/org/opendaylight/mdsal/singleton/dom/impl/AbstractDOMClusterServiceProviderTest.java index 46a600b842..be56f7f41b 100644 --- a/singleton-service/mdsal-singleton-dom-impl/src/test/java/org/opendaylight/mdsal/singleton/dom/impl/AbstractDOMClusterServiceProviderTest.java +++ b/singleton-service/mdsal-singleton-dom-impl/src/test/java/org/opendaylight/mdsal/singleton/dom/impl/AbstractDOMClusterServiceProviderTest.java @@ -28,13 +28,13 @@ import org.mockito.Mock; import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException; import org.opendaylight.mdsal.eos.common.api.EntityOwnershipChangeState; import org.opendaylight.mdsal.eos.dom.api.DOMEntity; -import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipCandidateRegistration; import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipChange; import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipListenerRegistration; import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; +import org.opendaylight.yangtools.concepts.Registration; /** * Abstract {@link DOMClusterSingletonServiceProviderImpl} testing substrate. @@ -70,7 +70,7 @@ public abstract class AbstractDOMClusterServiceProviderTest { @Override public final void instantiateServiceInstance() { - this.serviceState = TestClusterSingletonServiceState.STARTED; + serviceState = TestClusterSingletonServiceState.STARTED; } final TestClusterSingletonServiceState getServiceState() { @@ -79,7 +79,7 @@ public abstract class AbstractDOMClusterServiceProviderTest { @Override public ListenableFuture closeServiceInstance() { - this.serviceState = TestClusterSingletonServiceState.DESTROYED; + serviceState = TestClusterSingletonServiceState.DESTROYED; return Futures.immediateFuture(null); } } @@ -91,9 +91,9 @@ public abstract class AbstractDOMClusterServiceProviderTest { @Mock public DOMEntityOwnershipService mockEos; @Mock - public DOMEntityOwnershipCandidateRegistration mockEntityCandReg; + public Registration mockEntityCandReg; @Mock - public DOMEntityOwnershipCandidateRegistration mockDoubleEntityCandReg; + public Registration mockDoubleEntityCandReg; @Mock public DOMEntityOwnershipListenerRegistration mockEosEntityListReg; @Mock diff --git a/singleton-service/mdsal-singleton-dom-impl/src/test/java/org/opendaylight/mdsal/singleton/dom/impl/ClusterSingletonServiceGroupImplTest.java b/singleton-service/mdsal-singleton-dom-impl/src/test/java/org/opendaylight/mdsal/singleton/dom/impl/ClusterSingletonServiceGroupImplTest.java index ffe0620510..09fb06348e 100644 --- a/singleton-service/mdsal-singleton-dom-impl/src/test/java/org/opendaylight/mdsal/singleton/dom/impl/ClusterSingletonServiceGroupImplTest.java +++ b/singleton-service/mdsal-singleton-dom-impl/src/test/java/org/opendaylight/mdsal/singleton/dom/impl/ClusterSingletonServiceGroupImplTest.java @@ -28,7 +28,6 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException; import org.opendaylight.mdsal.eos.common.api.EntityOwnershipChangeState; -import org.opendaylight.mdsal.eos.common.api.GenericEntityOwnershipCandidateRegistration; import org.opendaylight.mdsal.eos.common.api.GenericEntityOwnershipChange; import org.opendaylight.mdsal.eos.common.api.GenericEntityOwnershipListener; import org.opendaylight.mdsal.eos.common.api.GenericEntityOwnershipService; @@ -37,6 +36,7 @@ import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegist import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; import org.opendaylight.mdsal.singleton.dom.impl.util.TestEntity; import org.opendaylight.mdsal.singleton.dom.impl.util.TestInstanceIdentifier; +import org.opendaylight.yangtools.concepts.Registration; /** * Testing {@link ClusterSingletonServiceGroupImpl}. @@ -54,9 +54,9 @@ public class ClusterSingletonServiceGroupImplTest { @Mock public ClusterSingletonService mockClusterSingletonServiceSecond; @Mock - public GenericEntityOwnershipCandidateRegistration mockEntityCandReg; + public Registration mockEntityCandReg; @Mock - public GenericEntityOwnershipCandidateRegistration mockCloseEntityCandReg; + public Registration mockCloseEntityCandReg; @Mock public GenericEntityOwnershipListener> mockEosListener; -- 2.36.6