Skip to content

Commit

Permalink
Implement enable/disable in Observable
Browse files Browse the repository at this point in the history
  • Loading branch information
mateusmolina-iese committed Dec 5, 2023
1 parent 265974d commit 47712e5
Show file tree
Hide file tree
Showing 2 changed files with 145 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,14 @@

import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;

/**
* Generic implementation of an Observable. This class contains all common
* operations an Observable is supposed to do. Java generics is used to specify
* which type of Observable is required
*
* @author haque
* @author haque, mateusmolina
*
* @param <T>
* can be Observers which extends IObserver
Expand All @@ -43,6 +44,8 @@ public class Observable<T extends IObserver> {

public Collection<T> observers = new ArrayList<T>();

private boolean notificationsEnabled = true;

/**
* Adds an observer to the subscriber list
*
Expand All @@ -63,4 +66,35 @@ public void addObserver(T observer) {
public boolean removeObserver(T observer) {
return observers.remove(observer);
}

/**
* Disables notification to all observers. After calling this method, observers
* will not be notified of changes until {@link #enableNotifications()} is
* called.
*/
public void disableNotifications() {
notificationsEnabled = false;
}

/**
* Enables notification to all observers. After calling this method, observers
* will again be notified of changes if they were previously disabled using
* {@link #disableNotifications()}.
*/
public void enableNotifications() {
notificationsEnabled = true;
}

/**
* Notifies all observers using the specified notification action if
* notifications are enabled. If notifications are disabled, this method does
* nothing.
*
* @param notificationAction
* The action to perform for each observer.
*/
protected void notifyAll(Consumer<T> notificationAction) {
if (notificationsEnabled)
observers.forEach(notificationAction);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
/*******************************************************************************
* Copyright (C) 2023 the Eclipse BaSyx Authors
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* SPDX-License-Identifier: MIT
******************************************************************************/

package org.eclipse.basyx.testsuite.regression.submodel.observer;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import org.eclipse.basyx.submodel.observer.IObserver;
import org.eclipse.basyx.submodel.observer.Observable;
import org.junit.Before;
import org.junit.Test;

/**
* Test for Observable<?>
*
* @author mateusmolina
*/
public class ObservableTest {

private MockObserver observer;
private MockObservable observable;

@Before
public void setUp() {
observable = new MockObservable();
observer = mock(MockObserver.class);
observable.addObserver(observer);
}

@Test
public void testAddObserver() {
assertEquals(1, observable.observers.size());
}

@Test
public void testRemoveObserver() {
observable.removeObserver(observer);

assertTrue(observable.observers.isEmpty());
}

@Test
public void testDefaultEnabled() {
observable.sendMockEvent();

verify(observer, times(1)).receiveEvent();
}

@Test
public void testDisableNotifications() {
observable.disableNotifications();

observable.sendMockEvent();

verify(observer, never()).receiveEvent();
}

@Test
public void testEnableNotifications() {
observable.disableNotifications();

observable.enableNotifications();

observable.sendMockEvent();

verify(observer, times(1)).receiveEvent();
}

private interface MockObserver extends IObserver {
public void receiveEvent();
}

private class MockObservable extends Observable<MockObserver> {
public MockObservable() {
super();
}

public void sendMockEvent() {
notifyAll(o -> o.receiveEvent());
}
}
}

0 comments on commit 47712e5

Please sign in to comment.