/*
* Copyright 2014-2015 JKOOL, LLC.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jkoolcloud.tnt4j.sink.impl.mqtt;
import java.util.Map;
import java.util.Properties;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttPersistenceException;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import com.jkoolcloud.tnt4j.config.ConfigException;
import com.jkoolcloud.tnt4j.format.EventFormatter;
import com.jkoolcloud.tnt4j.format.JSONFormatter;
import com.jkoolcloud.tnt4j.sink.AbstractEventSinkFactory;
import com.jkoolcloud.tnt4j.sink.EventSink;
import com.jkoolcloud.tnt4j.sink.EventSinkFactory;
import com.jkoolcloud.tnt4j.utils.Utils;
/**
* <p>Concrete implementation of {@link EventSinkFactory} interface over MQTT, which
* creates instances of {@link EventSink}. This factory uses {@link MqttEventSink}
* as the underlying provider.</p>
*
*
* @see EventSink
* @see MqttEventSink
*
* @version $Revision: 1 $
*
*/
public class MqttEventSinkFactory extends AbstractEventSinkFactory {
/**
* MQTT server URL
*/
String serverURI;
/**
* MQTT client id
*/
String clientid;
/**
* MQTT user name
*/
String userName;
/**
* MQTT user password
*/
String userPwd;
/**
* MQTT topic
*/
String topic;
/**
* MQTT version
*/
int version = MqttConnectOptions.MQTT_VERSION_DEFAULT;
/**
* MQTT quality of service
*/
int qos = 1;
/**
* MQTT keep alive interval in seconds
*/
int keepAlive = 60;
/**
* MQTT connection timeout in seconds
*/
int connTimeout = 30;
/**
* MQTT connection clean session flag
*/
boolean cleanSession = true;
/**
* MQTT enable SSL
*/
boolean ssl = false;
/**
* MQTT message retention
*/
boolean retainMsg = false;
/**
* MQTT connection options
*/
MqttConnectOptions options = new MqttConnectOptions();
@Override
public EventSink getEventSink(String name) {
return configureSink(new MqttEventSink(this, name, null, new JSONFormatter(false)));
}
@Override
public EventSink getEventSink(String name, Properties props) {
return configureSink(new MqttEventSink(this, name, props, new JSONFormatter(false)));
}
@Override
public EventSink getEventSink(String name, Properties props, EventFormatter frmt) {
return configureSink(new MqttEventSink(this, name, props, frmt));
}
@Override
public void setConfiguration(Map<String, Object> settings) throws ConfigException {
super.setConfiguration(settings);
serverURI = Utils.getString("mqtt-server-url", settings, "tcp://localhost:1883");
clientid = Utils.getString("mqtt-clientid", settings, MqttClient.generateClientId());
version = Utils.getInt("mqtt-version", settings, MqttConnectOptions.MQTT_VERSION_DEFAULT);
topic = Utils.getString("mqtt-topic", settings, topic);
userName = Utils.getString("mqtt-user", settings, userName);
userPwd = Utils.getString("mqtt-pwd", settings, userPwd);
keepAlive = Utils.getInt("mqtt-keepalive", settings, keepAlive);
connTimeout = Utils.getInt("mqtt-timeout", settings, connTimeout);
cleanSession = Utils.getBoolean("mqtt-clean-session", settings, cleanSession);
ssl = Utils.getBoolean("mqtt-ssl", settings, ssl);
// message attributes
qos = Utils.getInt("mqtt-qos", settings, qos);
retainMsg = Utils.getBoolean("mqtt-retain", settings, retainMsg);
if (ssl) {
Properties connProps = new Properties();
connProps.putAll(settings);
options.setSSLProperties(connProps);
}
if (userName != null) {
options.setUserName(userName);
}
if (userPwd != null) {
options.setPassword(userPwd.toCharArray());
}
options.setKeepAliveInterval(keepAlive);
options.setConnectionTimeout(connTimeout);
options.setMqttVersion(version);
options.setCleanSession(cleanSession);
}
/**
* Create and connect MQTT client
*
* @return MQTT client instance, connected
*/
public MqttClient newMqttClient() throws MqttException {
MqttClient client = new MqttClient(serverURI, clientid, new MemoryPersistence());
client.connect(options);
return client;
}
/**
* Create a new MQTT message with specific contents
*
* @param bytes message contents
* @return new MQTT message with specific contents
*/
public MqttMessage newMqttMessage(byte[] bytes) {
MqttMessage msg = new MqttMessage(bytes);
msg.setRetained(retainMsg);
msg.setQos(qos);
return msg;
}
/**
* Create a new MQTT message with specific contents
*
* @param contents message contents
* @return new MQTT message with specific contents
*/
public MqttMessage newMqttMessage(String contents) {
return newMqttMessage(contents.getBytes());
}
/**
* Publish message to a given MQTT client
*
* @param evSink event sink
* @param client MQTT client
* @param msg MQTT message instance
*
*/
public void publish(EventSink evSink, MqttClient client, MqttMessage msg) throws MqttPersistenceException, MqttException {
String mqttTopic = (topic == null? evSink.getName(): topic);
client.publish(mqttTopic, msg);
}
}