/***********************************************************************************
*
* 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.scripts;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.baczkowicz.mqttspy.connectivity.BaseMqttSubscription;
import pl.baczkowicz.mqttspy.connectivity.IMqttConnection;
import pl.baczkowicz.mqttspy.messages.FormattedMqttMessage;
import pl.baczkowicz.spy.eventbus.IKBus;
import pl.baczkowicz.spy.scripts.Script;
import pl.baczkowicz.spy.scripts.ScriptIO;
/**
* Implementation of the interface between a script and the rest of the application.
*/
public class MqttScriptIO extends ScriptIO implements IMqttScriptIO
{
/** Diagnostic logger. */
private final static Logger logger = LoggerFactory.getLogger(MqttScriptIO.class);
/** Reference to the MQTT connection. */
private final IMqttConnection connection;
/**
* Creates the PublicationScriptIO.
*
* @param connection The connection for which the script is executed
* @param eventManager The global event manager
* @param script The script itself
* @param executor Task executor
*/
public MqttScriptIO(
final IMqttConnection connection, final IKBus eventBus,
final Script script, final Executor executor)
{
super(script, executor);
this.connection = connection;
}
@Override
public void publish(final String publicationTopic, final String data)
{
publish(publicationTopic, data, 0, false);
}
@Override
public void publish(final String publicationTopic, final byte[] data, final int qos, final boolean retained)
{
touch();
logger.debug("[JS {}] Publishing message to {} with payload size = {}, qos = {}, retained = {}",
scriptName, publicationTopic, data.length, qos, retained);
final boolean published = connection.publish(publicationTopic, data, qos, retained);
if (published)
{
updatePublished();
}
// TODO: change state to finished?
}
@Override
public void publish(final String publicationTopic, final String data, final int qos, final boolean retained)
{
touch();
logger.debug("[JS {}] Publishing message to {} with payload = {}, qos = {}, retained = {}",
scriptName, publicationTopic, data, qos, retained);
final boolean published = connection.publish(publicationTopic, data, qos, retained);
if (published)
{
updatePublished();
}
// TODO: change state to finished?
}
@Override
public boolean subscribe(final String topic, final int qos)
{
BaseMqttSubscription subscription = connection.getMqttSubscriptionForTopic(topic);
if (subscription == null)
{
subscription = new BaseMqttSubscription(topic, qos, 1, 1000);
}
return connection.subscribe(subscription);
}
@Override
public boolean unsubscribe(final String topic)
{
BaseMqttSubscription subscription = connection.getMqttSubscriptionForTopic(topic);
if (subscription != null)
{
connection.removeSubscription(subscription);
return connection.unsubscribe(topic);
}
return false;
}
// TODO: getAllMessages
@Override
public List<FormattedMqttMessage> getMessages(final String subscriptionTopic)
{
BaseMqttSubscription subscription = connection.getMqttSubscriptionForTopic(subscriptionTopic);
if (subscription != null)
{
return subscription.getStore().getMessages();
}
// No messages, return empty list
return new ArrayList<>();
}
}