blob: e0ee4d37c5739d86282738db01b3b85edaa19893 [file] [log] [blame]
/*
* Copyright (c) 2017 CEA.
* 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
*
* Contributors:
* CEA - initial API and implementation
*/
package org.eclipse.sensinact.gateway.device.openhab.sensinact;
import java.io.IOException;
import java.util.Arrays;
import javax.jmdns.JmDNS;
import javax.jmdns.ServiceInfo;
import javax.jmdns.ServiceListener;
import org.eclipse.sensinact.gateway.device.openhab.common.ServerLocation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class OpenHabServerFinder {
private static final Logger LOG = LoggerFactory.getLogger(OpenHabServerFinder.class);
public static final String OPENHAB_SERVICE_TYPE_PROPERTY_NAME = "org.eclipse.sensinact.gateway.device.openhab.type";
public static final String OPENHAB_SERVICE_NAME_PROPERTY_NAME = "org.eclipse.sensinact.gateway.device.openhab.name";
public static final String OPENHAB_SCHEME_PROPERTY_NAME = "org.eclipse.sensinact.gateway.device.openhab.scheme";
public static final String OPENHAB_IP_PROPERTY_NAME = "org.eclipse.sensinact.gateway.device.openhab.ip";
public static final String OPENHAB_PORT_PROPERTY_NAME = "org.eclipse.sensinact.gateway.device.openhab.port";
public static final String DEFAULT_OPENHAB_SERVICE_TYPE = "_openhab-server._tcp.local.";
public static final String DEFAULT_OPENHAB_SERVICE_SSL_TYPE = "_openhab-server-ssl._tcp local.";
public static final String DEFAULT_OPENHAB_SERVICE_NAME = "openhab";
public static final String DEFAULT_OPENHAB_SERVICE_SSL_NAME = "openhab-ssl";
public static final String DEFAULT_OPENHAB_SCHEME = "http";
public static final String DEFAULT_OPENHAB_SSL_SCHEME = "https";
public static final String DEFAULT_OPENHAB_IP = "127.0.0.1";
public static final int DEFAULT_OPENHAB_PORT = 8080;
public static final int DEFAULT_OPENHAB_SSL_PORT = 8443;
public static final String ACTIVATE_DISCOVERY_PROPERTY_NAME = "org.eclipse.sensinact.gateway.device.openhab.OpenHabDiscovery2.disabled";
public static ServerLocation getServerLocation(OpenHabMediator mediator, ServiceListener serviceListener) throws IOException {
if (isDiscoveryActivated(mediator)) {
String openhabServiceType = getOpenhabServiceType(mediator);
String openhabServiceName = getOpenhabServiceName(mediator);
return findServerLocationUsingDiscovery(mediator, serviceListener, openhabServiceType, openhabServiceName);
} else {
return loadServerLocatioFromProperties(mediator);
}
}
private static ServerLocation loadServerLocatioFromProperties(OpenHabMediator mediator) {
String openhabScheme = null;
String openhabIP = null;
int openhabPort = 0;
String openhabServiceType = getOpenhabServiceType(mediator);
mediator.warn("The openhab2 discovery service was disabled by system property. Using openhab configuration found inside conf/config.properties:");
final String openhabSchemePropertyValue = (String) mediator.getProperty(OPENHAB_SCHEME_PROPERTY_NAME);
if (openhabSchemePropertyValue != null) {
openhabScheme = openhabSchemePropertyValue;
mediator.info("Openhab2 port configurated by %s property set to %s", OPENHAB_SCHEME_PROPERTY_NAME, openhabScheme);
} else {
openhabScheme = DEFAULT_OPENHAB_SERVICE_SSL_TYPE.startsWith(openhabServiceType)?DEFAULT_OPENHAB_SSL_SCHEME:DEFAULT_OPENHAB_SCHEME;
mediator.info("No openhab2 port configurated with %s. Using default port: ", OPENHAB_SCHEME_PROPERTY_NAME, openhabScheme);
}
final String openhabIPPropertyValue = (String) mediator.getProperty(OPENHAB_IP_PROPERTY_NAME);
if (openhabIPPropertyValue != null) {
openhabIP = openhabIPPropertyValue;
mediator.info("Openhab2 ip configurated by %s property set to %s", OPENHAB_IP_PROPERTY_NAME, openhabIP);
} else {
openhabIP = DEFAULT_OPENHAB_IP;
mediator.info("No openhab2 ip configurated with %s. Using default ip: %s", OPENHAB_IP_PROPERTY_NAME, openhabIP);
}
final String openhabPortPropertyValue = (String) mediator.getProperty(OPENHAB_PORT_PROPERTY_NAME);
if (openhabPortPropertyValue != null) {
openhabPort = Integer.parseInt(openhabPortPropertyValue);
mediator.info("Openhab2 port configurated by %s property set to %s", OPENHAB_PORT_PROPERTY_NAME, openhabPort);
} else {
openhabPort = DEFAULT_OPENHAB_SERVICE_SSL_TYPE.startsWith(openhabServiceType)?DEFAULT_OPENHAB_SSL_PORT:DEFAULT_OPENHAB_PORT;
mediator.info("No openhab2 port configurated with %s. Using default port: ", OPENHAB_PORT_PROPERTY_NAME, openhabPort);
}
return new ServerLocation(openhabScheme, openhabIP, openhabPort);
}
private static ServerLocation findServerLocationUsingDiscovery(OpenHabMediator mediator, ServiceListener serviceListener, String openhabServiceType, String openhabServiceName) throws IOException {
String openhabScheme = DEFAULT_OPENHAB_SERVICE_SSL_TYPE.startsWith(openhabServiceType)?DEFAULT_OPENHAB_SSL_SCHEME:DEFAULT_OPENHAB_SCHEME;
String openhabIP = null;
int openhabPort = 0;
mediator.info("Starting openhab2 discovery...");
JmDNS dns = JmDNS.create();
mediator.info("...dns created...");
dns.addServiceListener(openhabServiceType, serviceListener);
mediator.info("...started openhab2 discovery");
mediator.debug("...dns searching service info for type " + openhabServiceType + "...");
ServiceInfo[] list = dns.list(openhabServiceType);
for (ServiceInfo service : list) {
mediator.info("...dns found openhab2 service for type " + openhabServiceType + ": " + service.getName() + " " + service);
}
if (list.length == 0) {
mediator.warn("...no service info found by dns for type " + openhabServiceType);
}
final ServiceInfo info = dns.getServiceInfo(openhabServiceType, openhabServiceName);
if (info == null) {
mediator.error("among the " + list.length + " found openhab2 service(s), unable to find one available with name " + openhabServiceName);
throw new RuntimeException("unable to find any openhab2 service available with " + openhabServiceType + " type and " + openhabServiceName + " name");
}
openhabPort = info.getPort();
final String[] openhabHostAddresses = info.getHostAddresses();
if (openhabHostAddresses.length == 0) {
LOG.error("unexpected empty openhab2 host ip address");
} else {
openhabIP = info.getHostAddresses()[0];
if (openhabHostAddresses.length > 1) {
LOG.warn("unexpected more than one address for openhab2 host: {}. Several openhab2 instances running?. Will use first {}", Arrays.asList(openhabHostAddresses), openhabIP);
}
LOG.debug("Openhab2 binded to ip {} and port {}", openhabIP, openhabPort);
}
return new ServerLocation(openhabScheme, openhabIP, openhabPort);
}
private static String getOpenhabServiceType(OpenHabMediator mediator) {
final String openhabServiceTypePropertyValue = (String) mediator.getProperty(OPENHAB_SERVICE_TYPE_PROPERTY_NAME);
String openhabServiceType = null;
if (openhabServiceTypePropertyValue != null) {
openhabServiceType = openhabServiceTypePropertyValue;
mediator.info("Openhab2 service type configurated by %s property set to %s", OPENHAB_SERVICE_TYPE_PROPERTY_NAME, openhabServiceType);
} else {
openhabServiceType = DEFAULT_OPENHAB_SERVICE_TYPE;
mediator.info("No openhab2 service type configurated. Using default type: " + openhabServiceType);
}
return openhabServiceType;
}
private static String getOpenhabServiceName(OpenHabMediator mediator) {
final String openhabServiceNamePropertyValue = (String) mediator.getProperty(OPENHAB_SERVICE_NAME_PROPERTY_NAME);
String openhabServiceName = null;
if (openhabServiceNamePropertyValue != null) {
openhabServiceName = openhabServiceNamePropertyValue;
mediator.info("Openhab2 service name configurated by %s property set to %s", OPENHAB_SERVICE_NAME_PROPERTY_NAME, openhabServiceName);
} else {
openhabServiceName = DEFAULT_OPENHAB_SERVICE_SSL_TYPE.startsWith(getOpenhabServiceType(mediator))?DEFAULT_OPENHAB_SERVICE_SSL_NAME:DEFAULT_OPENHAB_SERVICE_NAME;
mediator.info("No openhab2 service name configurated. Using default type: " + openhabServiceName);
}
return openhabServiceName;
}
private static boolean isDiscoveryActivated(OpenHabMediator mediator) {
final String activateDiscoveryPropertyValue = (String) mediator.getProperty(ACTIVATE_DISCOVERY_PROPERTY_NAME);
boolean discoveryDescativated = false;
if (activateDiscoveryPropertyValue != null) {
discoveryDescativated = Boolean.parseBoolean(activateDiscoveryPropertyValue);
mediator.info("Openhab2 discovery configurated by %s property set to %s", ACTIVATE_DISCOVERY_PROPERTY_NAME, discoveryDescativated);
} else {
mediator.info("No openhab2 discovery configurated. Default configuration is enabled...");
}
return !discoveryDescativated;
}
}