/**
* Copyright (c) 2010-2016 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.openhab.binding.mqtt.internal;
import org.apache.commons.lang.StringUtils;
import org.openhab.core.binding.BindingConfig;
import org.openhab.core.transform.TransformationHelper;
import org.openhab.core.transform.TransformationService;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Base class for in and outbound MQTT message configurations on an openHAB
* item.
*
* @author Davy Vanherbergen
* @since 1.3.0
*/
public abstract class AbstractMqttMessagePubSub implements BindingConfig {
private static final Logger logger = LoggerFactory.getLogger(AbstractMqttMessagePubSub.class);
private static final String TEMP_COLON_REPLACEMENT = "@COLON@";
public enum MessageType {
COMMAND,
STATE
}
private String broker;
private String topic;
private String transformationRule;
private MessageType messageType;
private String itemName;
private TransformationService transformationService;
/**
* Get the name of broker to use for sending/receiving MQTT messages.
*
* @return name as defined in configuration file.
*/
public String getBroker() {
return broker;
}
/**
* Set the name of broker to use for sending/receiving MQTT messages.
*
* @param broker
* name as defined in configuration file.
*/
public void setBroker(String broker) {
this.broker = broker;
}
/**
* Get the MQTT topic to which to publish/subscribe to.
*
* @return MQTT Topic string
*/
public String getTopic() {
return topic;
}
/**
* Set the MQTT topic to which to publish/subscribe to. Subscription topics
* may contain wild cards.
*
* @param topic
* MQTT topic string.
*/
public void setTopic(String topic) {
this.topic = topic;
}
/**
* @return type of messages supported.
*/
public MessageType getMessageType() {
return messageType;
}
/**
* @return item name for which this publisher/subscriber is used.
*/
public String getItemName() {
return itemName;
}
/**
* @param itemName
* item name for which this publisher/subscriber is used.
*/
public void setItemName(String itemName) {
this.itemName = itemName;
}
/**
* Split the given string into a string array using ':' as the separator. If
* the separator is escaped like '\:', the separator is ignored.
*
* @param configString
* @return configString split into array.
*/
protected String[] splitConfigurationString(String configString) {
if (StringUtils.isEmpty(configString)) {
return new String[0];
}
String[] result = StringUtils
.replaceEachRepeatedly(configString, new String[] { "\\:" }, new String[] { TEMP_COLON_REPLACEMENT })
.split(":");
for (int i = 0; i < result.length; i++) {
result[i] = StringUtils.replaceEachRepeatedly(result[i], new String[] { TEMP_COLON_REPLACEMENT },
new String[] { ":" });
}
return result;
}
/**
* Set the supported message type.
*
* @param messageType
*/
public void setMessageType(MessageType messageType) {
this.messageType = messageType;
}
/**
* @return TransformationService to use to transform message content.
*/
public TransformationService getTransformationService() {
return transformationService;
}
/**
* @param TransformationService
* to use to transform message content.
*/
public void setTransformationService(TransformationService transformationService) {
this.transformationService = transformationService;
}
/**
* @return transformation rule to use on the message content.
*/
public String getTransformationRule() {
return transformationRule;
}
public void setTransformationRule(String transformationRule) {
this.transformationRule = transformationRule;
}
/**
* @return transformation service name as defined in the first part of the
* transformation rule.
*/
public String getTransformationServiceName() {
if (StringUtils.isEmpty(getTransformationRule()) || getTransformationRule().equalsIgnoreCase("default")) {
return null;
}
int pos = getTransformationRule().indexOf('(');
if (pos != -1) {
return getTransformationRule().substring(0, pos);
} else {
return null;
}
}
/**
* @return param to provide to the transformation service.
*/
public String getTransformationServiceParam() {
if (StringUtils.isEmpty(getTransformationServiceName())) {
return null;
}
int pos = getTransformationRule().indexOf('(');
if (pos != -1) {
return getTransformationRule().substring(pos + 1, getTransformationRule().length() - 1);
} else {
return null;
}
}
/**
* Start transformation service.
*/
protected void initTransformService() {
if (getTransformationService() != null || StringUtils.isBlank(getTransformationServiceName())) {
return;
}
BundleContext context = MqttActivator.getContext();
transformationService = TransformationHelper.getTransformationService(context, getTransformationServiceName());
if (transformationService == null) {
logger.debug("No transformation service found for {}", getTransformationServiceName());
}
}
}