*/
package org.openhab.binding.teleinfo.internal.handler;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
-import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.binding.teleinfo.internal.TeleinfoDiscoveryService;
@NonNullByDefault
public abstract class TeleinfoAbstractControllerHandler extends BaseBridgeHandler {
- private List<TeleinfoControllerHandlerListener> listeners = Collections.synchronizedList(new ArrayList<>());
+ private Set<TeleinfoControllerHandlerListener> listeners = new CopyOnWriteArraySet<>();
public TeleinfoAbstractControllerHandler(Bridge bridge) {
super(bridge);
@Override
public void bridgeStatusChanged(ThingStatusInfo bridgeStatusInfo) {
+ TeleinfoAbstractControllerHandler controllerHandler = getControllerHandler();
if (bridgeStatusInfo.getStatus() != ThingStatus.ONLINE) {
+ if (controllerHandler != null) {
+ controllerHandler.removeListener(this);
+ }
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_OFFLINE, ERROR_OFFLINE_CONTROLLER_OFFLINE);
return;
}
- Bridge bridge = getBridge();
- if (bridge != null) {
- TeleinfoAbstractControllerHandler controllerHandler = (TeleinfoAbstractControllerHandler) bridge
- .getHandler();
- if (controllerHandler != null) {
- controllerHandler.addListener(this);
- updateStatus(ThingStatus.ONLINE);
- }
+ if (controllerHandler != null) {
+ controllerHandler.addListener(this);
+ updateStatus(ThingStatus.ONLINE);
}
}
+ @Override
+ public void dispose() {
+ TeleinfoAbstractControllerHandler controllerHandler = getControllerHandler();
+ if (controllerHandler != null) {
+ controllerHandler.removeListener(this);
+ }
+ super.dispose();
+ }
+
+ private @Nullable TeleinfoAbstractControllerHandler getControllerHandler() {
+ Bridge bridge = getBridge();
+ return bridge != null ? (TeleinfoAbstractControllerHandler) bridge.getHandler() : null;
+ }
+
@Override
public void handleCommand(ChannelUID channelUID, Command command) {
// no commands supported