/** * Copyright (c) 2014-2017 by the respective copyright holders. * 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.eclipse.smarthome.io.transport.mdns.internal; import java.io.IOException; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.Executors; import org.eclipse.smarthome.io.transport.mdns.MDNSClient; import org.eclipse.smarthome.io.transport.mdns.MDNSService; import org.eclipse.smarthome.io.transport.mdns.ServiceDescription; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This class starts the JmDNS and implements interface to register and * unregister services. * * @author Victor Belov * */ public class MDNSServiceImpl implements MDNSService { private final Logger logger = LoggerFactory.getLogger(MDNSServiceImpl.class); private MDNSClient mdnsClient; private Set<ServiceDescription> servicesToRegisterQueue = new CopyOnWriteArraySet<>(); public MDNSServiceImpl() { } public void setMDNSClient(MDNSClient client) { this.mdnsClient = client; // register queued services if (servicesToRegisterQueue.size() > 0) { Runnable runnable = new Runnable() { @Override public void run() { logger.debug("Registering {} queued services", servicesToRegisterQueue.size()); for (ServiceDescription description : servicesToRegisterQueue) { try { MDNSClient localClient = mdnsClient; if (localClient != null) { localClient.registerService(description); } else { break; } } catch (IOException e) { logger.error(e.getMessage()); } catch (IllegalStateException e) { logger.debug("Not registering service {}, because service is already deactivated!", description.serviceType); } } servicesToRegisterQueue.clear(); } }; Executors.newSingleThreadExecutor().execute(runnable); } } public void unsetMDNSClient(MDNSClient mdnsClient) { this.mdnsClient = null; mdnsClient.unregisterAllServices(); } /** * @{inheritDoc */ @Override public void registerService(final ServiceDescription description) { if (mdnsClient == null) { // queue the service to register it as soon as the mDNS client is // available servicesToRegisterQueue.add(description); } else { Runnable runnable = new Runnable() { @Override public void run() { try { mdnsClient.registerService(description); } catch (IOException e) { logger.error(e.getMessage()); } catch (IllegalStateException e) { logger.debug("Not registering service {}, because service is already deactivated!", description.serviceType); } } }; Executors.newSingleThreadExecutor().execute(runnable); } } /** * @{inheritDoc */ @Override public void unregisterService(ServiceDescription description) { if (mdnsClient != null) { mdnsClient.unregisterService(description); } } /** * This method unregisters all services from Bonjour/MDNS */ protected void unregisterAllServices() { if (mdnsClient != null) { mdnsClient.unregisterAllServices(); } } public void activate() { } public void deactivate() { unregisterAllServices(); if (mdnsClient != null) { mdnsClient.close(); logger.debug("mDNS service has been stopped"); } } }