/*********************************************************************************** * * Copyright (c) 2014 Kamil Baczkowicz * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v1.0 which accompany this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * * Kamil Baczkowicz - initial API and implementation and/or initial documentation * */ package pl.baczkowicz.mqttspy.daemon.connectivity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import pl.baczkowicz.mqttspy.common.generated.ReconnectionSettings; import pl.baczkowicz.mqttspy.common.generated.SubscriptionDetails; import pl.baczkowicz.mqttspy.connectivity.BaseMqttSubscription; import pl.baczkowicz.mqttspy.connectivity.SimpleMqttConnection; import pl.baczkowicz.mqttspy.daemon.configuration.generated.DaemonMqttConnectionDetails; import pl.baczkowicz.mqttspy.utils.ConnectionUtils; import pl.baczkowicz.spy.common.generated.ScriptDetails; import pl.baczkowicz.spy.scripts.BaseScriptManager; import pl.baczkowicz.spy.utils.ThreadingUtils; /** * This runnable is responsible for establishing a connection. */ public class SimpleMqttConnectionRunnable implements Runnable { /** Diagnostic logger. */ private final static Logger logger = LoggerFactory.getLogger(SimpleMqttConnectionRunnable.class); /** The connection to be used. */ private final SimpleMqttConnection connection; /** The connection settings to be used. */ private final DaemonMqttConnectionDetails connectionSettings; /** The script manager - used for subscription scripts. */ private final BaseScriptManager scriptManager; /** * Creates a ConnectionRunnable. * * @param scriptManager The script manager - used for subscription scripts * @param connection The connection to be used * @param connectionSettings The connection settings to be used */ public SimpleMqttConnectionRunnable(final BaseScriptManager scriptManager, final SimpleMqttConnection connection, final DaemonMqttConnectionDetails connectionSettings) { this.connection = connection; this.connectionSettings = connectionSettings; this.scriptManager = scriptManager; } public void run() { ThreadingUtils.logThreadStarting("Connection " + connection.getMqttConnectionDetails().getName()); // Get reconnection settings final ReconnectionSettings reconnectionSettings = connection.getMqttConnectionDetails().getReconnectionSettings(); final boolean neverStarted = connection.getLastConnectionAttemptTimestamp() == ConnectionUtils.NEVER_STARTED; // If successfully connected, and re-subscription is configured if (connection.connect() && (neverStarted || (reconnectionSettings != null && reconnectionSettings.isResubscribe()))) { // Subscribe to all configured subscriptions for (final SubscriptionDetails subscriptionDetails : connectionSettings.getSubscription()) { if (neverStarted && subscriptionDetails.getScriptFile() != null) { logger.debug("Adding script " + subscriptionDetails.getScriptFile()); scriptManager.addScript(new ScriptDetails(true, false, subscriptionDetails.getScriptFile())); } final BaseMqttSubscription subscription = new BaseMqttSubscription( subscriptionDetails.getTopic(), subscriptionDetails.getQos()); subscription.setDetails(subscriptionDetails); connection.subscribe(subscription); } } ThreadingUtils.logThreadEnding(); } }