Skip to content

Commit

Permalink
[mihome] Fix NPE, add null annotations and name threads (openhab#7474)
Browse files Browse the repository at this point in the history
Fixes openhab#7425

Signed-off-by: Wouter Born <github@maindrain.net>
Signed-off-by: Daan Meijer <daan@studioseptember.nl>
  • Loading branch information
wborn authored and DaanMeijer committed Sep 1, 2020
1 parent d4b3856 commit 8dd6e86
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 147 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.util.Map;
import java.util.Set;

import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.smarthome.config.discovery.AbstractDiscoveryService;
import org.eclipse.smarthome.config.discovery.DiscoveryResultBuilder;
import org.eclipse.smarthome.config.discovery.DiscoveryService;
Expand All @@ -38,23 +39,23 @@
* @author Patrick Boos - Initial contribution
* @author Kuba Wolanin - logger fixes
*/
@NonNullByDefault
@Component(service = DiscoveryService.class, immediate = true, configurationPid = "discovery.mihome")
public class XiaomiBridgeDiscoveryService extends AbstractDiscoveryService implements XiaomiSocketListener {

private static final Set<ThingTypeUID> SUPPORTED_THING_TYPES = Collections.singleton(THING_TYPE_BRIDGE);
private static final int DISCOVERY_TIMEOUT_SEC = 30;

private final Logger logger = LoggerFactory.getLogger(XiaomiBridgeDiscoveryService.class);
private XiaomiDiscoverySocket socket;
private final XiaomiDiscoverySocket socket = new XiaomiDiscoverySocket("discovery");

public XiaomiBridgeDiscoveryService() {
super(SUPPORTED_THING_TYPES, DISCOVERY_TIMEOUT_SEC, false);
}

@Override
protected void startScan() {
socket = (socket == null) ? new XiaomiDiscoverySocket() : socket;
socket.intialize();
socket.initialize();
logger.debug("Start scan for bridges");
socket.registerListener(this);
discoverGateways();
Expand All @@ -65,17 +66,13 @@ protected synchronized void stopScan() {
super.stopScan();
logger.debug("Stop scan");
removeOlderResults(getTimestampOfLastScan());
if (socket != null) {
socket.unregisterListener(this);
}
socket.unregisterListener(this);
}

@Override
public void deactivate() {
super.deactivate();
if (socket != null) {
socket.unregisterListener(this);
}
socket.unregisterListener(this);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,8 @@ public void initialize() {
return;
}
logger.debug("Init socket on Port: {}", port);
socket = new XiaomiBridgeSocket(port);
socket.intialize();
socket = new XiaomiBridgeSocket(port, getThing().getUID().getId());
socket.initialize();
socket.registerListener(this);

scheduler.schedule(() -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@
package org.openhab.binding.mihome.internal.socket;

import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;

import org.eclipse.jdt.annotation.NonNullByDefault;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -26,35 +26,37 @@
* @author Dieter Schmidt - Initial contribution
*
*/
@NonNullByDefault
public class XiaomiBridgeSocket extends XiaomiSocket {

private final Logger logger = LoggerFactory.getLogger(XiaomiBridgeSocket.class);

public XiaomiBridgeSocket(int port) {
super(port);
public XiaomiBridgeSocket(int port, String owner) {
super(port, owner);
}

/**
* Sets up the {@link XiaomiBridgeSocket}.
*
* Connects the socket to the specific multicast address and port.
* Starts the {@link ReceiverThread} for the socket.
*/
@Override
synchronized DatagramSocket setupSocket() {
DatagramSocket openSocket = getOpenSockets().get(getPort());
if (openSocket != null) {
return openSocket;
protected synchronized void setupSocket() {
MulticastSocket socket = (MulticastSocket) getSocket();
if (socket != null) {
logger.debug("Socket already setup");
return;
}

try {
logger.debug("Setup socket");
setSocket(new MulticastSocket(getPort())); // must bind receive side
((MulticastSocket) getSocket()).joinGroup(InetAddress.getByName(MCAST_ADDR));
logger.debug("Initialized socket to {}:{} on {}:{}", getSocket().getRemoteSocketAddress(),
getSocket().getPort(), getSocket().getLocalAddress(), getSocket().getLocalPort());
socket = new MulticastSocket(getPort());
setSocket(socket); // must bind receive side
socket.joinGroup(InetAddress.getByName(MCAST_ADDR));
logger.debug("Initialized socket to {}:{} on {}:{}", socket.getRemoteSocketAddress(), socket.getPort(),
socket.getLocalAddress(), socket.getLocalPort());
} catch (IOException e) {
logger.error("Setup socket error", e);
}
return getSocket();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import java.net.InetAddress;
import java.net.UnknownHostException;

import org.eclipse.jdt.annotation.NonNullByDefault;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -26,35 +27,35 @@
* @author Dieter Schmidt - Initial contribution
*
*/
@NonNullByDefault
public class XiaomiDiscoverySocket extends XiaomiSocket {

private static final int MCAST_PORT = 4321;

private final Logger logger = LoggerFactory.getLogger(XiaomiDiscoverySocket.class);

public XiaomiDiscoverySocket() {
super();
public XiaomiDiscoverySocket(String owner) {
super(owner);
}

/**
* Sets up the {@link XiaomiDiscoverySocket}.
*
* Connects the socket to the specific multicast address and port.
* Starts the {@link ReceiverThread} for the socket.
*/
@Override
DatagramSocket setupSocket() {
protected void setupSocket() {
synchronized (XiaomiDiscoverySocket.class) {
try {
logger.debug("Setup discovery socket");
setSocket(new DatagramSocket(0));
logger.debug("Initialized socket to {}:{} on {}:{}", getSocket().getInetAddress(),
getSocket().getPort(), getSocket().getLocalAddress(), getSocket().getLocalPort());
DatagramSocket socket = new DatagramSocket(0);
setSocket(socket);
logger.debug("Initialized socket to {}:{} on {}:{}", socket.getInetAddress(), socket.getPort(),
socket.getLocalAddress(), socket.getLocalPort());
} catch (IOException e) {
logger.error("Setup socket error", e);
}
}
return getSocket();
}

/**
Expand Down
Loading

0 comments on commit 8dd6e86

Please sign in to comment.