[Homematic] Removed Apache Commons (#10035)

Signed-off-by: Martin Herbst <develop@mherbst.de>
This commit is contained in:
Martin Herbst 2021-02-08 23:26:56 +01:00 committed by GitHub
parent a58676dc41
commit ac02141d0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 319 additions and 226 deletions

View File

@ -12,8 +12,6 @@
*/ */
package org.openhab.binding.homematic.internal.common; package org.openhab.binding.homematic.internal.common;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.openhab.binding.homematic.internal.model.HmChannel; import org.openhab.binding.homematic.internal.model.HmChannel;
import org.openhab.binding.homematic.internal.model.HmGatewayInfo; import org.openhab.binding.homematic.internal.model.HmGatewayInfo;
import org.openhab.binding.homematic.internal.model.HmInterface; import org.openhab.binding.homematic.internal.model.HmInterface;
@ -405,14 +403,12 @@ public class HomematicConfig {
@Override @Override
public String toString() { public String toString() {
ToStringBuilder tsb = new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE); return String.format(
tsb.append("gatewayAddress", gatewayAddress).append("callbackHost", callbackHost) "%s[gatewayAddress=%s,callbackHost=%s,bindAddress=%s,xmlCallbackPort=%d,binCallbackPort=%d,"
.append("bindAddress", bindAddress).append("xmlCallbackPort", xmlCallbackPort) + "gatewayType=%s,rfPort=%d,wiredPort=%d,hmIpPort=%d,cuxdPort=%d,groupPort=%d,timeout=%d,"
.append("binCallbackPort", binCallbackPort).append("gatewayType", gatewayType) + "discoveryTimeToLive=%d,installModeDuration=%d,socketMaxAlive=%d]",
.append("rfPort", getRfPort()).append("wiredPort", getWiredPort()).append("hmIpPort", getHmIpPort()) getClass().getSimpleName(), gatewayAddress, callbackHost, bindAddress, xmlCallbackPort, binCallbackPort,
.append("cuxdPort", getCuxdPort()).append("groupPort", getGroupPort()).append("timeout", timeout) gatewayType, getRfPort(), getWiredPort(), getHmIpPort(), getCuxdPort(), getGroupPort(), timeout,
.append("discoveryTimeToLive", discoveryTimeToLive).append("installModeDuration", installModeDuration) discoveryTimeToLive, installModeDuration, socketMaxAlive);
.append("socketMaxAlive", socketMaxAlive);
return tsb.toString();
} }
} }

View File

@ -29,7 +29,6 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.HttpClient;
import org.openhab.binding.homematic.internal.common.HomematicConfig; import org.openhab.binding.homematic.internal.common.HomematicConfig;
import org.openhab.binding.homematic.internal.communicator.client.BinRpcClient; import org.openhab.binding.homematic.internal.communicator.client.BinRpcClient;
@ -800,7 +799,7 @@ public abstract class AbstractHomematicGateway implements RpcEventListener, Home
* Creates a virtual device for handling variables, scripts and other special gateway functions. * Creates a virtual device for handling variables, scripts and other special gateway functions.
*/ */
private HmDevice createGatewayDevice() { private HmDevice createGatewayDevice() {
String type = String.format("%s-%s", HmDevice.TYPE_GATEWAY_EXTRAS, StringUtils.upperCase(id)); String type = String.format("%s-%s", HmDevice.TYPE_GATEWAY_EXTRAS, id.toUpperCase());
HmDevice device = new HmDevice(HmDevice.ADDRESS_GATEWAY_EXTRAS, getDefaultInterface(), type, HmDevice device = new HmDevice(HmDevice.ADDRESS_GATEWAY_EXTRAS, getDefaultInterface(), type,
config.getGatewayInfo().getId(), null, null); config.getGatewayInfo().getId(), null, null);
device.setName(HmDevice.TYPE_GATEWAY_EXTRAS); device.setName(HmDevice.TYPE_GATEWAY_EXTRAS);

View File

@ -18,10 +18,9 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.api.ContentResponse; import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.client.util.StringContentProvider; import org.eclipse.jetty.client.util.StringContentProvider;
@ -123,7 +122,7 @@ public class CcuGateway extends AbstractHomematicGateway {
HmDevice device = channel.getDevice(); HmDevice device = channel.getDevice();
String channelName = String.format("%s.%s:%s.", device.getHmInterface().getName(), device.getAddress(), String channelName = String.format("%s.%s:%s.", device.getHmInterface().getName(), device.getAddress(),
channel.getNumber()); channel.getNumber());
String datapointNames = StringUtils.join(dpNames.toArray(), "\\t"); String datapointNames = String.join("\\t", dpNames);
TclScriptDataList resultList = sendScriptByName("getAllChannelValues", TclScriptDataList.class, TclScriptDataList resultList = sendScriptByName("getAllChannelValues", TclScriptDataList.class,
new String[] { "channel_name", "datapoint_names" }, new String[] { "channel_name", "datapoint_names" },
new String[] { channelName, datapointNames }); new String[] { channelName, datapointNames });
@ -151,7 +150,7 @@ public class CcuGateway extends AbstractHomematicGateway {
@Override @Override
protected void setVariable(HmDatapoint dp, Object value) throws IOException { protected void setVariable(HmDatapoint dp, Object value) throws IOException {
String strValue = StringUtils.replace(ObjectUtils.toString(value), "\"", "\\\""); String strValue = Objects.toString(value, "").replace("\"", "\\\"");
if (dp.isStringType()) { if (dp.isStringType()) {
strValue = "\"" + strValue + "\""; strValue = "\"" + strValue + "\"";
} }
@ -184,8 +183,10 @@ public class CcuGateway extends AbstractHomematicGateway {
private <T> T sendScriptByName(String scriptName, Class<T> clazz, String[] variableNames, String[] values) private <T> T sendScriptByName(String scriptName, Class<T> clazz, String[] variableNames, String[] values)
throws IOException { throws IOException {
String script = tclregaScripts.get(scriptName); String script = tclregaScripts.get(scriptName);
for (int i = 0; i < variableNames.length; i++) { if (script != null) {
script = StringUtils.replace(script, "{" + variableNames[i] + "}", values[i]); for (int i = 0; i < variableNames.length; i++) {
script = script.replace("{" + variableNames[i] + "}", values[i]);
}
} }
return sendScript(script, clazz); return sendScript(script, clazz);
} }
@ -196,8 +197,8 @@ public class CcuGateway extends AbstractHomematicGateway {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private synchronized <T> T sendScript(String script, Class<T> clazz) throws IOException { private synchronized <T> T sendScript(String script, Class<T> clazz) throws IOException {
try { try {
script = StringUtils.trim(script); script = script == null ? null : script.trim();
if (StringUtils.isEmpty(script)) { if (script == null || script.isEmpty()) {
throw new RuntimeException("Homematic TclRegaScript is empty!"); throw new RuntimeException("Homematic TclRegaScript is empty!");
} }
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
@ -210,7 +211,10 @@ public class CcuGateway extends AbstractHomematicGateway {
.header(HttpHeader.CONTENT_TYPE, "text/plain;charset=" + config.getEncoding()).send(); .header(HttpHeader.CONTENT_TYPE, "text/plain;charset=" + config.getEncoding()).send();
String result = new String(response.getContent(), config.getEncoding()); String result = new String(response.getContent(), config.getEncoding());
result = StringUtils.substringBeforeLast(result, "<xml><exec>"); int lastPos = result.lastIndexOf("<xml><exec>");
if (lastPos != -1) {
result = result.substring(0, lastPos);
}
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
logger.trace("Result TclRegaScript: {}", result); logger.trace("Result TclRegaScript: {}", result);
} }
@ -231,7 +235,8 @@ public class CcuGateway extends AbstractHomematicGateway {
Map<String, String> result = new HashMap<>(); Map<String, String> result = new HashMap<>();
if (scriptList.getScripts() != null) { if (scriptList.getScripts() != null) {
for (TclScript script : scriptList.getScripts()) { for (TclScript script : scriptList.getScripts()) {
result.put(script.name, StringUtils.trimToNull(script.data)); String value = script.data.trim();
result.put(script.name, value.isEmpty() ? null : value);
} }
} }
return result; return result;

View File

@ -20,7 +20,6 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.openhab.binding.homematic.internal.HomematicBindingConstants; import org.openhab.binding.homematic.internal.HomematicBindingConstants;
import org.openhab.binding.homematic.internal.common.HomematicConfig; import org.openhab.binding.homematic.internal.common.HomematicConfig;
import org.openhab.binding.homematic.internal.communicator.message.RpcRequest; import org.openhab.binding.homematic.internal.communicator.message.RpcRequest;
@ -34,6 +33,7 @@ import org.openhab.binding.homematic.internal.communicator.parser.HomegearLoadDe
import org.openhab.binding.homematic.internal.communicator.parser.ListBidcosInterfacesParser; import org.openhab.binding.homematic.internal.communicator.parser.ListBidcosInterfacesParser;
import org.openhab.binding.homematic.internal.communicator.parser.ListDevicesParser; import org.openhab.binding.homematic.internal.communicator.parser.ListDevicesParser;
import org.openhab.binding.homematic.internal.communicator.parser.RssiInfoParser; import org.openhab.binding.homematic.internal.communicator.parser.RssiInfoParser;
import org.openhab.binding.homematic.internal.misc.MiscUtils;
import org.openhab.binding.homematic.internal.model.HmChannel; import org.openhab.binding.homematic.internal.model.HmChannel;
import org.openhab.binding.homematic.internal.model.HmDatapoint; import org.openhab.binding.homematic.internal.model.HmDatapoint;
import org.openhab.binding.homematic.internal.model.HmDevice; import org.openhab.binding.homematic.internal.model.HmDevice;
@ -233,7 +233,7 @@ public abstract class RpcClient<T> {
try { try {
ddParser = getDeviceDescription(HmInterface.RF); ddParser = getDeviceDescription(HmInterface.RF);
isHomegear = StringUtils.equalsIgnoreCase(ddParser.getType(), "Homegear"); isHomegear = "Homegear".equalsIgnoreCase(ddParser.getType());
} catch (IOException ex) { } catch (IOException ex) {
// can't load gateway infos via RF interface // can't load gateway infos via RF interface
ddParser = new GetDeviceDescriptionParser(); ddParser = new GetDeviceDescriptionParser();
@ -247,21 +247,23 @@ public abstract class RpcClient<T> {
HmGatewayInfo gatewayInfo = new HmGatewayInfo(); HmGatewayInfo gatewayInfo = new HmGatewayInfo();
gatewayInfo.setAddress(biParser.getGatewayAddress()); gatewayInfo.setAddress(biParser.getGatewayAddress());
String gwType = biParser.getType();
if (isHomegear) { if (isHomegear) {
gatewayInfo.setId(HmGatewayInfo.ID_HOMEGEAR); gatewayInfo.setId(HmGatewayInfo.ID_HOMEGEAR);
gatewayInfo.setType(ddParser.getType()); gatewayInfo.setType(ddParser.getType());
gatewayInfo.setFirmware(ddParser.getFirmware()); gatewayInfo.setFirmware(ddParser.getFirmware());
} else if ((StringUtils.startsWithIgnoreCase(biParser.getType(), "CCU") } else if ((MiscUtils.strStartsWithIgnoreCase(gwType, "CCU")
|| StringUtils.startsWithIgnoreCase(biParser.getType(), "HMIP_CCU") || MiscUtils.strStartsWithIgnoreCase(gwType, "HMIP_CCU")
|| StringUtils.startsWithIgnoreCase(ddParser.getType(), "HM-RCV-50") || config.isCCUType()) || MiscUtils.strStartsWithIgnoreCase(ddParser.getType(), "HM-RCV-50") || config.isCCUType())
&& !config.isNoCCUType()) { && !config.isNoCCUType()) {
gatewayInfo.setId(HmGatewayInfo.ID_CCU); gatewayInfo.setId(HmGatewayInfo.ID_CCU);
String type = StringUtils.isBlank(biParser.getType()) ? "CCU" : biParser.getType(); String type = gwType.isBlank() ? "CCU" : gwType;
gatewayInfo.setType(type); gatewayInfo.setType(type);
gatewayInfo.setFirmware(ddParser.getFirmware() != null ? ddParser.getFirmware() : biParser.getFirmware()); gatewayInfo
.setFirmware(!ddParser.getFirmware().isEmpty() ? ddParser.getFirmware() : biParser.getFirmware());
} else { } else {
gatewayInfo.setId(HmGatewayInfo.ID_DEFAULT); gatewayInfo.setId(HmGatewayInfo.ID_DEFAULT);
gatewayInfo.setType(biParser.getType()); gatewayInfo.setType(gwType);
gatewayInfo.setFirmware(biParser.getFirmware()); gatewayInfo.setFirmware(biParser.getFirmware());
} }

View File

@ -29,7 +29,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
import org.apache.commons.lang.ArrayUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -84,7 +83,7 @@ public class BinRpcMessage implements RpcRequest<byte[]>, RpcResponse {
if (length != 4) { if (length != 4) {
throw new EOFException("Only " + length + " bytes received reading message length"); throw new EOFException("Only " + length + " bytes received reading message length");
} }
int datasize = (new BigInteger(ArrayUtils.subarray(sig, 4, 8))).intValue(); int datasize = (new BigInteger(Arrays.copyOfRange(sig, 4, 8))).intValue();
byte payload[] = new byte[datasize]; byte payload[] = new byte[datasize];
int offset = 0; int offset = 0;
int currentLength; int currentLength;
@ -96,7 +95,10 @@ public class BinRpcMessage implements RpcRequest<byte[]>, RpcResponse {
throw new EOFException("Only " + offset + " bytes received while reading message payload, expected " throw new EOFException("Only " + offset + " bytes received while reading message payload, expected "
+ datasize + " bytes"); + datasize + " bytes");
} }
byte[] message = ArrayUtils.addAll(sig, payload); byte[] message = new byte[sig.length + payload.length];
System.arraycopy(sig, 0, message, 0, sig.length);
System.arraycopy(payload, 0, message, sig.length, payload.length);
decodeMessage(message, methodHeader); decodeMessage(message, methodHeader);
} }

View File

@ -23,8 +23,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import org.apache.commons.lang.StringEscapeUtils;
/** /**
* A XML-RPC request for sending data to the Homematic server. * A XML-RPC request for sending data to the Homematic server.
* *
@ -124,7 +122,7 @@ public class XmlRpcRequest implements RpcRequest<String> {
} else { } else {
Class<?> clazz = value.getClass(); Class<?> clazz = value.getClass();
if (clazz == String.class || clazz == Character.class) { if (clazz == String.class || clazz == Character.class) {
sb.append(StringEscapeUtils.escapeXml(value.toString())); sb.append(escapeXml(value.toString()));
} else if (clazz == Long.class || clazz == Integer.class || clazz == Short.class || clazz == Byte.class) { } else if (clazz == Long.class || clazz == Integer.class || clazz == Short.class || clazz == Byte.class) {
tag("int", value.toString()); tag("int", value.toString());
} else if (clazz == Double.class) { } else if (clazz == Double.class) {
@ -176,4 +174,30 @@ public class XmlRpcRequest implements RpcRequest<String> {
} }
} }
} }
private StringBuilder escapeXml(String inValue) {
StringBuilder outValue = new StringBuilder(inValue.length());
for (int i = 0; i < inValue.length(); i++) {
switch (inValue.charAt(i)) {
case '<':
outValue.append("&lt;");
break;
case '>':
outValue.append("&gt;");
break;
case '&':
outValue.append("&amp;");
break;
case '\'':
outValue.append("&apost;");
break;
case '"':
outValue.append("&quot;");
break;
default:
outValue.append(inValue.charAt(i));
}
}
return outValue;
}
} }

View File

@ -14,7 +14,6 @@ package org.openhab.binding.homematic.internal.communicator.parser;
import java.io.IOException; import java.io.IOException;
import org.apache.commons.lang.StringUtils;
import org.openhab.binding.homematic.internal.model.HmChannel; import org.openhab.binding.homematic.internal.model.HmChannel;
import org.openhab.binding.homematic.internal.model.HmDatapoint; import org.openhab.binding.homematic.internal.model.HmDatapoint;
import org.openhab.binding.homematic.internal.model.HmInterface; import org.openhab.binding.homematic.internal.model.HmInterface;
@ -52,7 +51,7 @@ public class CcuParamsetDescriptionParser extends CommonRpcParser<TclScriptDataL
} }
private String[] toOptionList(String options) { private String[] toOptionList(String options) {
String[] result = StringUtils.splitByWholeSeparatorPreserveAllTokens(options, ";"); String[] result = options == null ? null : options.split(";");
return result == null || result.length == 0 ? null : result; return result == null || result.length == 0 ? null : result;
} }
} }

View File

@ -14,7 +14,6 @@ package org.openhab.binding.homematic.internal.communicator.parser;
import java.io.IOException; import java.io.IOException;
import org.apache.commons.lang.StringUtils;
import org.openhab.binding.homematic.internal.model.HmChannel; import org.openhab.binding.homematic.internal.model.HmChannel;
import org.openhab.binding.homematic.internal.model.HmDatapoint; import org.openhab.binding.homematic.internal.model.HmDatapoint;
import org.openhab.binding.homematic.internal.model.HmParamsetType; import org.openhab.binding.homematic.internal.model.HmParamsetType;
@ -57,8 +56,7 @@ public class CcuVariablesAndScriptsParser extends CommonRpcParser<TclScriptDataL
} }
dp.setReadOnly(entry.readOnly); dp.setReadOnly(entry.readOnly);
dp.setUnit(entry.unit); dp.setUnit(entry.unit);
String[] result = entry.options == null ? null : entry.options.split(";");
String[] result = StringUtils.splitByWholeSeparatorPreserveAllTokens(entry.options, ";");
dp.setOptions(result == null || result.length == 0 ? null : result); dp.setOptions(result == null || result.length == 0 ? null : result);
if (dp.getOptions() != null) { if (dp.getOptions() != null) {

View File

@ -13,11 +13,9 @@
package org.openhab.binding.homematic.internal.communicator.parser; package org.openhab.binding.homematic.internal.communicator.parser;
import java.io.IOException; import java.io.IOException;
import java.util.Objects;
import org.apache.commons.lang.BooleanUtils; import org.eclipse.jdt.annotation.NonNull;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.openhab.binding.homematic.internal.misc.MiscUtils; import org.openhab.binding.homematic.internal.misc.MiscUtils;
import org.openhab.binding.homematic.internal.model.HmDatapoint; import org.openhab.binding.homematic.internal.model.HmDatapoint;
import org.openhab.binding.homematic.internal.model.HmParamsetType; import org.openhab.binding.homematic.internal.model.HmParamsetType;
@ -38,7 +36,8 @@ public abstract class CommonRpcParser<M, R> implements RpcParser<M, R> {
* Converts the object to a string. * Converts the object to a string.
*/ */
protected String toString(Object object) { protected String toString(Object object) {
return StringUtils.trimToNull(ObjectUtils.toString(object)); String value = Objects.toString(object, "").trim();
return value.isEmpty() ? null : value;
} }
/** /**
@ -49,7 +48,7 @@ public abstract class CommonRpcParser<M, R> implements RpcParser<M, R> {
return (Integer) object; return (Integer) object;
} }
try { try {
return Double.valueOf(ObjectUtils.toString(object)).intValue(); return Double.valueOf(object.toString()).intValue();
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {
logger.debug("Failed converting {} to a Double", object, ex); logger.debug("Failed converting {} to a Double", object, ex);
return null; return null;
@ -64,7 +63,7 @@ public abstract class CommonRpcParser<M, R> implements RpcParser<M, R> {
return (Double) object; return (Double) object;
} }
try { try {
return Double.valueOf(ObjectUtils.toString(object)); return Double.valueOf(object.toString());
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {
logger.debug("Failed converting {} to a Double", object, ex); logger.debug("Failed converting {} to a Double", object, ex);
return null; return null;
@ -79,7 +78,12 @@ public abstract class CommonRpcParser<M, R> implements RpcParser<M, R> {
return (Number) object; return (Number) object;
} }
try { try {
return NumberUtils.createNumber(ObjectUtils.toString(object)); String value = object.toString();
if (value.contains(".")) {
return Float.parseFloat(value);
} else {
return Integer.parseInt(value);
}
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {
logger.debug("Failed converting {} to a Number", object, ex); logger.debug("Failed converting {} to a Number", object, ex);
return null; return null;
@ -93,7 +97,7 @@ public abstract class CommonRpcParser<M, R> implements RpcParser<M, R> {
if (object == null || object instanceof Boolean) { if (object == null || object instanceof Boolean) {
return (Boolean) object; return (Boolean) object;
} }
return BooleanUtils.toBoolean(ObjectUtils.toString(object)); return "true".equals(object.toString().toLowerCase());
} }
/** /**
@ -114,9 +118,10 @@ public abstract class CommonRpcParser<M, R> implements RpcParser<M, R> {
/** /**
* Returns the address of a device, replacing group address identifier and illegal characters. * Returns the address of a device, replacing group address identifier and illegal characters.
*/ */
@NonNull
protected String getSanitizedAddress(Object object) { protected String getSanitizedAddress(Object object) {
String address = StringUtils.trimToNull(StringUtils.replaceOnce(toString(object), "*", "T-")); String address = Objects.toString(object, "").trim().replaceFirst("\\*", "T-");
return MiscUtils.validateCharacters(address, "Address", "_"); return MiscUtils.validateCharacters(address.isEmpty() ? null : address, "Address", "_");
} }
/** /**
@ -167,8 +172,11 @@ public abstract class CommonRpcParser<M, R> implements RpcParser<M, R> {
HmDatapoint dp = new HmDatapoint(); HmDatapoint dp = new HmDatapoint();
dp.setName(name); dp.setName(name);
dp.setDescription(name); dp.setDescription(name);
dp.setUnit(StringUtils.replace(StringUtils.trimToNull(unit), "\ufffd", "°")); if (unit != null) {
if (dp.getUnit() == null && StringUtils.startsWith(dp.getName(), "RSSI_")) { unit = unit.trim().replace("\ufffd", "°");
}
dp.setUnit(unit == null || unit.isEmpty() ? null : unit);
if (dp.getUnit() == null && dp.getName() != null && dp.getName().startsWith("RSSI_")) {
dp.setUnit("dBm"); dp.setUnit("dBm");
} }
@ -210,7 +218,7 @@ public abstract class CommonRpcParser<M, R> implements RpcParser<M, R> {
* Converts a string value to the type. * Converts a string value to the type.
*/ */
protected Object convertToType(String value) { protected Object convertToType(String value) {
if (StringUtils.isBlank(value)) { if (value == null || value.isBlank()) {
return null; return null;
} }
if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("on")) { if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("on")) {

View File

@ -16,7 +16,7 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.commons.lang.StringUtils; import org.openhab.binding.homematic.internal.misc.MiscUtils;
/** /**
* Parses a delete device event received from a Homematic gateway. * Parses a delete device event received from a Homematic gateway.
@ -31,12 +31,9 @@ public class DeleteDevicesParser extends CommonRpcParser<Object[], List<String>>
Object[] data = (Object[]) message[1]; Object[] data = (Object[]) message[1];
for (int i = 0; i < message.length; i++) { for (int i = 0; i < message.length; i++) {
String address = getSanitizedAddress(data[i]); String address = getSanitizedAddress(data[i]);
boolean isDevice = !StringUtils.contains(address, ":") if (MiscUtils.isDevice(address)) {
&& !StringUtils.startsWithIgnoreCase(address, "BidCos");
if (isDevice) {
adresses.add(address); adresses.add(address);
} }
} }
} }
return adresses; return adresses;

View File

@ -16,10 +16,9 @@ import static org.openhab.binding.homematic.internal.misc.HomematicConstants.*;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.openhab.binding.homematic.internal.model.HmChannel; import org.openhab.binding.homematic.internal.model.HmChannel;
import org.openhab.binding.homematic.internal.model.HmDatapoint; import org.openhab.binding.homematic.internal.model.HmDatapoint;
import org.openhab.binding.homematic.internal.model.HmDatapointInfo; import org.openhab.binding.homematic.internal.model.HmDatapointInfo;
@ -36,7 +35,7 @@ import org.slf4j.LoggerFactory;
public class DisplayOptionsParser extends CommonRpcParser<Object, Void> { public class DisplayOptionsParser extends CommonRpcParser<Object, Void> {
private final Logger logger = LoggerFactory.getLogger(DisplayOptionsParser.class); private final Logger logger = LoggerFactory.getLogger(DisplayOptionsParser.class);
private static final String[] onOff = new String[] { "ON", "OFF" }; private static final String[] onOff = new String[] { "ON", "OFF" };
private static final int IDX_NOT_FOUND = -1;
private HmChannel channel; private HmChannel channel;
private String text; private String text;
private int beep = 0; private int beep = 0;
@ -50,7 +49,8 @@ public class DisplayOptionsParser extends CommonRpcParser<Object, Void> {
@Override @Override
public Void parse(Object value) throws IOException { public Void parse(Object value) throws IOException {
String optionsString = StringUtils.remove(toString(value), ' '); String valueString = toString(value);
String optionsString = valueString == null ? null : valueString.replace(" ", "");
if (optionsString != null) { if (optionsString != null) {
int idxFirstSep = optionsString.indexOf(","); int idxFirstSep = optionsString.indexOf(",");
if (idxFirstSep == -1) { if (idxFirstSep == -1) {
@ -61,7 +61,7 @@ public class DisplayOptionsParser extends CommonRpcParser<Object, Void> {
optionsString = optionsString.substring(idxFirstSep + 1); optionsString = optionsString.substring(idxFirstSep + 1);
} }
String[] options = StringUtils.split(optionsString, ","); String[] options = optionsString.split(",");
String[] availableSymbols = getAvailableSymbols(channel); String[] availableSymbols = getAvailableSymbols(channel);
String[] availableBeepOptions = getAvailableOptions(channel, DATAPOINT_NAME_BEEP); String[] availableBeepOptions = getAvailableOptions(channel, DATAPOINT_NAME_BEEP);
@ -87,7 +87,7 @@ public class DisplayOptionsParser extends CommonRpcParser<Object, Void> {
DATAPOINT_NAME_BACKLIGHT, deviceAddress); DATAPOINT_NAME_BACKLIGHT, deviceAddress);
unit = getIntParameter(availableUnitOptions, unit, parameter, DATAPOINT_NAME_UNIT, deviceAddress); unit = getIntParameter(availableUnitOptions, unit, parameter, DATAPOINT_NAME_UNIT, deviceAddress);
if (ArrayUtils.contains(availableSymbols, parameter)) { if (findInArray(availableSymbols, parameter) != IDX_NOT_FOUND) {
logger.debug("Symbol '{}' found for remote control '{}'", parameter, deviceAddress); logger.debug("Symbol '{}' found for remote control '{}'", parameter, deviceAddress);
symbols.add(parameter); symbols.add(parameter);
} }
@ -102,8 +102,8 @@ public class DisplayOptionsParser extends CommonRpcParser<Object, Void> {
*/ */
private int getIntParameter(String[] options, int currentValue, String parameter, String parameterName, private int getIntParameter(String[] options, int currentValue, String parameter, String parameterName,
String deviceAddress) { String deviceAddress) {
int idx = ArrayUtils.indexOf(options, parameter); int idx = findInArray(options, parameter);
if (idx != -1) { if (idx != IDX_NOT_FOUND) {
if (currentValue == 0) { if (currentValue == 0) {
logger.debug("{} option '{}' found at index {} for remote control '{}'", parameterName, parameter, logger.debug("{} option '{}' found at index {} for remote control '{}'", parameterName, parameter,
idx + 1, deviceAddress); idx + 1, deviceAddress);
@ -125,10 +125,12 @@ public class DisplayOptionsParser extends CommonRpcParser<Object, Void> {
HmDatapointInfo dpInfo = HmDatapointInfo.createValuesInfo(channel, datapointName); HmDatapointInfo dpInfo = HmDatapointInfo.createValuesInfo(channel, datapointName);
HmDatapoint dp = channel.getDatapoint(dpInfo); HmDatapoint dp = channel.getDatapoint(dpInfo);
if (dp != null) { if (dp != null) {
String[] options = (String[]) ArrayUtils.remove(dp.getOptions(), 0); String[] dpOpts = dp.getOptions();
String[] options = new String[dpOpts.length - 1];
options = Arrays.copyOfRange(dpOpts, 1, dpOpts.length);
for (String onOffString : onOff) { for (String onOffString : onOff) {
int onIdx = ArrayUtils.indexOf(options, onOffString); int onIdx = findInArray(options, onOffString);
if (onIdx != -1) { if (onIdx != IDX_NOT_FOUND) {
options[onIdx] = datapointName + "_" + onOffString; options[onIdx] = datapointName + "_" + onOffString;
} }
} }
@ -137,6 +139,18 @@ public class DisplayOptionsParser extends CommonRpcParser<Object, Void> {
return new String[0]; return new String[0];
} }
private int findInArray(String[] arr, String searchString) {
if (arr.length == 0) {
return IDX_NOT_FOUND;
}
for (int i = 0; i < arr.length; i++) {
if (arr[i].equals(searchString)) {
return i;
}
}
return IDX_NOT_FOUND;
}
/** /**
* Returns all possible symbols from the remote control. * Returns all possible symbols from the remote control.
*/ */

View File

@ -14,8 +14,6 @@ package org.openhab.binding.homematic.internal.communicator.parser;
import java.io.IOException; import java.io.IOException;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.openhab.binding.homematic.internal.model.HmChannel; import org.openhab.binding.homematic.internal.model.HmChannel;
import org.openhab.binding.homematic.internal.model.HmDatapointInfo; import org.openhab.binding.homematic.internal.model.HmDatapointInfo;
import org.openhab.binding.homematic.internal.model.HmDevice; import org.openhab.binding.homematic.internal.model.HmDevice;
@ -38,10 +36,11 @@ public class EventParser extends CommonRpcParser<Object[], HmDatapointInfo> {
address = HmDevice.ADDRESS_GATEWAY_EXTRAS; address = HmDevice.ADDRESS_GATEWAY_EXTRAS;
channel = HmChannel.CHANNEL_NUMBER_VARIABLE; channel = HmChannel.CHANNEL_NUMBER_VARIABLE;
} else { } else {
String[] configParts = StringUtils.trimToEmpty(addressWithChannel).split(":"); String addrChannel = addressWithChannel == null ? "" : addressWithChannel.trim();
String[] configParts = addrChannel.split(":");
address = getSanitizedAddress(configParts[0]); address = getSanitizedAddress(configParts[0]);
if (configParts.length > 1) { if (configParts.length > 1) {
channel = NumberUtils.createInteger(configParts[1]); channel = configParts[1] == null ? null : Integer.valueOf(configParts[1]);
} }
} }

View File

@ -13,8 +13,8 @@
package org.openhab.binding.homematic.internal.communicator.parser; package org.openhab.binding.homematic.internal.communicator.parser;
import java.io.IOException; import java.io.IOException;
import java.util.Objects;
import org.apache.commons.lang.ObjectUtils;
import org.openhab.binding.homematic.internal.model.HmChannel; import org.openhab.binding.homematic.internal.model.HmChannel;
import org.openhab.binding.homematic.internal.model.HmDatapoint; import org.openhab.binding.homematic.internal.model.HmDatapoint;
import org.openhab.binding.homematic.internal.model.HmParamsetType; import org.openhab.binding.homematic.internal.model.HmParamsetType;
@ -36,7 +36,7 @@ public class GetAllScriptsParser extends CommonRpcParser<Object[], Void> {
public Void parse(Object[] message) throws IOException { public Void parse(Object[] message) throws IOException {
message = (Object[]) message[0]; message = (Object[]) message[0];
for (int i = 0; i < message.length; i++) { for (int i = 0; i < message.length; i++) {
String scriptName = ObjectUtils.toString(message[i]); String scriptName = Objects.toString(message[i], "");
HmDatapoint dpScript = new HmDatapoint(scriptName, scriptName, HmValueType.BOOL, Boolean.FALSE, false, HmDatapoint dpScript = new HmDatapoint(scriptName, scriptName, HmValueType.BOOL, Boolean.FALSE, false,
HmParamsetType.VALUES); HmParamsetType.VALUES);
dpScript.setInfo(scriptName); dpScript.setInfo(scriptName);

View File

@ -50,7 +50,7 @@ public class ListBidcosInterfacesParser extends CommonRpcParser<Object[], ListBi
* Returns the parsed type. * Returns the parsed type.
*/ */
public String getType() { public String getType() {
return type; return type == null ? "" : type;
} }
/** /**

View File

@ -19,7 +19,6 @@ import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.openhab.binding.homematic.internal.common.HomematicConfig; import org.openhab.binding.homematic.internal.common.HomematicConfig;
import org.openhab.binding.homematic.internal.misc.MiscUtils; import org.openhab.binding.homematic.internal.misc.MiscUtils;
import org.openhab.binding.homematic.internal.model.HmChannel; import org.openhab.binding.homematic.internal.model.HmChannel;
@ -48,9 +47,7 @@ public class ListDevicesParser extends CommonRpcParser<Object[], Collection<HmDe
for (int i = 0; i < message.length; i++) { for (int i = 0; i < message.length; i++) {
Map<String, ?> data = (Map<String, ?>) message[i]; Map<String, ?> data = (Map<String, ?>) message[i];
boolean isDevice = !StringUtils.contains(toString(data.get("ADDRESS")), ":"); if (MiscUtils.isDevice(toString(data.get("ADDRESS")), true)) {
if (isDevice) {
String address = getSanitizedAddress(data.get("ADDRESS")); String address = getSanitizedAddress(data.get("ADDRESS"));
String type = MiscUtils.validateCharacters(toString(data.get("TYPE")), "Device type", "-"); String type = MiscUtils.validateCharacters(toString(data.get("TYPE")), "Device type", "-");
String id = toString(data.get("ID")); String id = toString(data.get("ID"));

View File

@ -17,7 +17,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.commons.lang.StringUtils; import org.openhab.binding.homematic.internal.misc.MiscUtils;
/** /**
* Parses a new device event received from a Homematic gateway. * Parses a new device event received from a Homematic gateway.
@ -35,9 +35,7 @@ public class NewDevicesParser extends CommonRpcParser<Object[], List<String>> {
Map<String, ?> data = (Map<String, ?>) message[i]; Map<String, ?> data = (Map<String, ?>) message[i];
String address = toString(data.get("ADDRESS")); String address = toString(data.get("ADDRESS"));
boolean isDevice = !StringUtils.contains(address, ":") if (MiscUtils.isDevice(address)) {
&& !StringUtils.startsWithIgnoreCase(address, "BidCos");
if (isDevice) {
adresses.add(getSanitizedAddress(address)); adresses.add(getSanitizedAddress(address));
} }
} }

View File

@ -15,7 +15,6 @@ package org.openhab.binding.homematic.internal.communicator.parser;
import java.io.IOException; import java.io.IOException;
import java.util.Map; import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.openhab.binding.homematic.internal.communicator.client.UnknownParameterSetException; import org.openhab.binding.homematic.internal.communicator.client.UnknownParameterSetException;
import org.openhab.binding.homematic.internal.communicator.client.UnknownRpcFailureException; import org.openhab.binding.homematic.internal.communicator.client.UnknownRpcFailureException;
import org.openhab.binding.homematic.internal.communicator.message.RpcRequest; import org.openhab.binding.homematic.internal.communicator.message.RpcRequest;
@ -43,9 +42,9 @@ public class RpcResponseParser extends CommonRpcParser<Object[], Object[]> {
Number faultCode = toNumber(map.get("faultCode")); Number faultCode = toNumber(map.get("faultCode"));
String faultString = toString(map.get("faultString")); String faultString = toString(map.get("faultString"));
String faultMessage = String.format("%s %s (sending %s)", faultCode, faultString, request); String faultMessage = String.format("%s %s (sending %s)", faultCode, faultString, request);
if (faultCode.intValue() == -1 && StringUtils.equals("Failure", faultString)) { if (faultCode.intValue() == -1 && "Failure".equals(faultString)) {
throw new UnknownRpcFailureException(faultMessage); throw new UnknownRpcFailureException(faultMessage);
} else if (faultCode.intValue() == -3 && StringUtils.equals("Unknown paramset", faultString)) { } else if (faultCode.intValue() == -3 && "Unknown paramset".equals(faultString)) {
throw new UnknownParameterSetException(faultMessage); throw new UnknownParameterSetException(faultMessage);
} }
throw new IOException(faultMessage); throw new IOException(faultMessage);

View File

@ -18,8 +18,8 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import org.apache.commons.lang.ObjectUtils;
import org.openhab.binding.homematic.internal.communicator.message.RpcRequest; import org.openhab.binding.homematic.internal.communicator.message.RpcRequest;
import org.openhab.binding.homematic.internal.communicator.parser.DeleteDevicesParser; import org.openhab.binding.homematic.internal.communicator.parser.DeleteDevicesParser;
import org.openhab.binding.homematic.internal.communicator.parser.EventParser; import org.openhab.binding.homematic.internal.communicator.parser.EventParser;
@ -63,7 +63,7 @@ public abstract class RpcResponseHandler<T> {
for (Object o : (Object[]) responseData[0]) { for (Object o : (Object[]) responseData[0]) {
Map<?, ?> call = (Map<?, ?>) o; Map<?, ?> call = (Map<?, ?>) o;
if (call != null) { if (call != null) {
String method = ObjectUtils.toString(call.get("methodName")); String method = Objects.toString(call.get("methodName"), "");
Object[] data = (Object[]) call.get("params"); Object[] data = (Object[]) call.get("params");
handleMethodCall(method, data); handleMethodCall(method, data);
} }

View File

@ -14,13 +14,13 @@ package org.openhab.binding.homematic.internal.communicator.virtual;
import static org.openhab.binding.homematic.internal.misc.HomematicConstants.VIRTUAL_DATAPOINT_NAME_BUTTON; import static org.openhab.binding.homematic.internal.misc.HomematicConstants.VIRTUAL_DATAPOINT_NAME_BUTTON;
import org.apache.commons.lang.StringUtils;
import org.openhab.binding.homematic.internal.misc.MiscUtils; import org.openhab.binding.homematic.internal.misc.MiscUtils;
import org.openhab.binding.homematic.internal.model.HmChannel; import org.openhab.binding.homematic.internal.model.HmChannel;
import org.openhab.binding.homematic.internal.model.HmDatapoint; import org.openhab.binding.homematic.internal.model.HmDatapoint;
import org.openhab.binding.homematic.internal.model.HmDevice; import org.openhab.binding.homematic.internal.model.HmDevice;
import org.openhab.binding.homematic.internal.model.HmValueType; import org.openhab.binding.homematic.internal.model.HmValueType;
import org.openhab.core.thing.CommonTriggerEvents; import org.openhab.core.thing.CommonTriggerEvents;
import org.openhab.core.thing.DefaultSystemChannelTypeProvider;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -59,7 +59,8 @@ public class ButtonVirtualDatapointHandler extends AbstractVirtualDatapointHandl
public void handleEvent(VirtualGateway gateway, HmDatapoint dp) { public void handleEvent(VirtualGateway gateway, HmDatapoint dp) {
HmDatapoint vdp = getVirtualDatapoint(dp.getChannel()); HmDatapoint vdp = getVirtualDatapoint(dp.getChannel());
if (MiscUtils.isTrueValue(dp.getValue())) { if (MiscUtils.isTrueValue(dp.getValue())) {
String pressType = StringUtils.substringAfter(dp.getName(), "_"); int usPos = dp.getName().indexOf("_");
String pressType = usPos == -1 ? dp.getName() : dp.getName().substring(usPos + 1);
switch (pressType) { switch (pressType) {
case "SHORT": case "SHORT":
if (dp.getValue() == null || !dp.getValue().equals(dp.getPreviousValue())) { if (dp.getValue() == null || !dp.getValue().equals(dp.getPreviousValue())) {

View File

@ -16,7 +16,6 @@ import static org.openhab.binding.homematic.internal.misc.HomematicConstants.VIR
import java.io.IOException; import java.io.IOException;
import org.apache.commons.lang.StringUtils;
import org.openhab.binding.homematic.internal.misc.HomematicClientException; import org.openhab.binding.homematic.internal.misc.HomematicClientException;
import org.openhab.binding.homematic.internal.model.HmDatapoint; import org.openhab.binding.homematic.internal.model.HmDatapoint;
import org.openhab.binding.homematic.internal.model.HmDatapointConfig; import org.openhab.binding.homematic.internal.model.HmDatapointConfig;
@ -61,7 +60,7 @@ public class DeleteDeviceModeVirtualDatapointHandler extends AbstractVirtualData
public void handleCommand(VirtualGateway gateway, HmDatapoint dp, HmDatapointConfig dpConfig, Object value) public void handleCommand(VirtualGateway gateway, HmDatapoint dp, HmDatapointConfig dpConfig, Object value)
throws IOException, HomematicClientException { throws IOException, HomematicClientException {
dp.setValue(value); dp.setValue(value);
if (!StringUtils.equals(dp.getOptionValue(), MODE_LOCKED)) { if (!MODE_LOCKED.equals(dp.getOptionValue())) {
gateway.disableDatapoint(dp, DELETE_MODE_DURATION); gateway.disableDatapoint(dp, DELETE_MODE_DURATION);
} }
} }

View File

@ -16,7 +16,6 @@ import static org.openhab.binding.homematic.internal.misc.HomematicConstants.*;
import java.io.IOException; import java.io.IOException;
import org.apache.commons.lang.StringUtils;
import org.openhab.binding.homematic.internal.communicator.parser.DisplayOptionsParser; import org.openhab.binding.homematic.internal.communicator.parser.DisplayOptionsParser;
import org.openhab.binding.homematic.internal.misc.HomematicClientException; import org.openhab.binding.homematic.internal.misc.HomematicClientException;
import org.openhab.binding.homematic.internal.model.HmChannel; import org.openhab.binding.homematic.internal.model.HmChannel;
@ -60,8 +59,9 @@ public class DisplayOptionsVirtualDatapointHandler extends AbstractVirtualDatapo
DisplayOptionsParser rcOptionsParser = new DisplayOptionsParser(channel); DisplayOptionsParser rcOptionsParser = new DisplayOptionsParser(channel);
rcOptionsParser.parse(value); rcOptionsParser.parse(value);
if (StringUtils.isNotBlank(rcOptionsParser.getText())) { String dpNameText = rcOptionsParser.getText();
sendDatapoint(gateway, channel, DATAPOINT_NAME_TEXT, rcOptionsParser.getText()); if (dpNameText != null && !dpNameText.isBlank()) {
sendDatapoint(gateway, channel, DATAPOINT_NAME_TEXT, dpNameText);
} }
sendDatapoint(gateway, channel, DATAPOINT_NAME_BEEP, rcOptionsParser.getBeep()); sendDatapoint(gateway, channel, DATAPOINT_NAME_BEEP, rcOptionsParser.getBeep());

View File

@ -21,9 +21,8 @@ import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.openhab.binding.homematic.internal.misc.HomematicClientException; import org.openhab.binding.homematic.internal.misc.HomematicClientException;
import org.openhab.binding.homematic.internal.misc.MiscUtils; import org.openhab.binding.homematic.internal.misc.MiscUtils;
import org.openhab.binding.homematic.internal.model.HmChannel; import org.openhab.binding.homematic.internal.model.HmChannel;
@ -328,9 +327,9 @@ public class DisplayTextVirtualDatapoint extends AbstractVirtualDatapointHandler
} }
for (int i = 1; i <= getLineCount(channel.getDevice()); i++) { for (int i = 1; i <= getLineCount(channel.getDevice()); i++) {
String line = ObjectUtils.toString( String line = Objects.toString(
channel.getDatapoint(HmParamsetType.VALUES, DATAPOINT_NAME_DISPLAY_LINE + i).getValue()); channel.getDatapoint(HmParamsetType.VALUES, DATAPOINT_NAME_DISPLAY_LINE + i).getValue(), "");
if (StringUtils.isEmpty(line)) { if (line.isEmpty()) {
line = " "; line = " ";
} }
message.add(LINE); message.add(LINE);
@ -340,12 +339,12 @@ public class DisplayTextVirtualDatapoint extends AbstractVirtualDatapointHandler
.getOptionValue(); .getOptionValue();
message.add(COLOR); message.add(COLOR);
String colorCode = Color.getCode(color); String colorCode = Color.getCode(color);
message.add(StringUtils.isBlank(colorCode) ? Color.WHITE.getCode() : colorCode); message.add(colorCode == null || colorCode.isBlank() ? Color.WHITE.getCode() : colorCode);
} }
String icon = channel.getDatapoint(HmParamsetType.VALUES, DATAPOINT_NAME_DISPLAY_ICON + i) String icon = channel.getDatapoint(HmParamsetType.VALUES, DATAPOINT_NAME_DISPLAY_ICON + i)
.getOptionValue(); .getOptionValue();
String iconCode = Icon.getCode(icon); String iconCode = Icon.getCode(icon);
if (StringUtils.isNotBlank(iconCode)) { if (iconCode != null && !iconCode.isBlank()) {
message.add(ICON); message.add(ICON);
message.add(iconCode); message.add(iconCode);
} }
@ -374,7 +373,7 @@ public class DisplayTextVirtualDatapoint extends AbstractVirtualDatapointHandler
message.add(STOP); message.add(STOP);
gateway.sendDatapoint(channel.getDatapoint(HmParamsetType.VALUES, DATAPOINT_NAME_SUBMIT), gateway.sendDatapoint(channel.getDatapoint(HmParamsetType.VALUES, DATAPOINT_NAME_SUBMIT),
new HmDatapointConfig(), StringUtils.join(message, ","), null); new HmDatapointConfig(), String.join(",", message), null);
} }
} }

View File

@ -12,9 +12,6 @@
*/ */
package org.openhab.binding.homematic.internal.discovery.eq3udp; package org.openhab.binding.homematic.internal.discovery.eq3udp;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/** /**
* Extracts a UDP response from a Homematic CCU gateway. * Extracts a UDP response from a Homematic CCU gateway.
* *
@ -86,7 +83,7 @@ public class Eq3UdpResponse {
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("deviceTypeId", deviceTypeId) return String.format("%s[deviceTypeId=%s,serialNumber=%s]", getClass().getSimpleName(), deviceTypeId,
.append("serialNumber", serialNumber).toString(); serialNumber);
} }
} }

View File

@ -23,11 +23,9 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.openhab.binding.homematic.internal.HomematicBindingConstants; import org.openhab.binding.homematic.internal.HomematicBindingConstants;
import org.openhab.binding.homematic.internal.common.HomematicConfig; import org.openhab.binding.homematic.internal.common.HomematicConfig;
import org.openhab.binding.homematic.internal.communicator.HomematicGateway; import org.openhab.binding.homematic.internal.communicator.HomematicGateway;
@ -216,8 +214,8 @@ public class HomematicThingHandler extends BaseThingHandler {
private static boolean containsChannel(List<Channel> channels, ChannelUID channelUID) { private static boolean containsChannel(List<Channel> channels, ChannelUID channelUID) {
for (Channel channel : channels) { for (Channel channel : channels) {
ChannelUID uid = channel.getUID(); ChannelUID uid = channel.getUID();
if (StringUtils.equals(channelUID.getGroupId(), uid.getGroupId()) if (Objects.equals(channelUID.getGroupId(), uid.getGroupId())
&& StringUtils.equals(channelUID.getId(), uid.getId())) { && Objects.equals(channelUID.getId(), uid.getId())) {
return true; return true;
} }
} }
@ -232,7 +230,7 @@ public class HomematicThingHandler extends BaseThingHandler {
HmDatapoint dp = channelZero HmDatapoint dp = channelZero
.getDatapoint(new HmDatapointInfo(HmParamsetType.VALUES, channelZero, datapointName)); .getDatapoint(new HmDatapointInfo(HmParamsetType.VALUES, channelZero, datapointName));
if (dp != null) { if (dp != null) {
properties.put(propertyName, ObjectUtils.toString(dp.getValue())); properties.put(propertyName, Objects.toString(dp.getValue(), ""));
} }
} }
@ -375,7 +373,7 @@ public class HomematicThingHandler extends BaseThingHandler {
throws IOException, GatewayNotAvailableException, ConverterException { throws IOException, GatewayNotAvailableException, ConverterException {
if (dp.isTrigger()) { if (dp.isTrigger()) {
if (dp.getValue() != null) { if (dp.getValue() != null) {
triggerChannel(channel.getUID(), ObjectUtils.toString(dp.getValue())); triggerChannel(channel.getUID(), dp.getValue() == null ? "" : dp.getValue().toString());
} }
} else if (isLinked(channel)) { } else if (isLinked(channel)) {
loadHomematicChannelValues(dp.getChannel()); loadHomematicChannelValues(dp.getChannel());
@ -495,9 +493,10 @@ public class HomematicThingHandler extends BaseThingHandler {
Object newValue = configurationParameter.getValue(); Object newValue = configurationParameter.getValue();
if (key.startsWith("HMP_")) { if (key.startsWith("HMP_")) {
key = StringUtils.removeStart(key, "HMP_"); key = key.substring(4);
Integer channelNumber = NumberUtils.toInt(StringUtils.substringBefore(key, "_")); int sepPos = key.indexOf("_");
String dpName = StringUtils.substringAfter(key, "_"); Integer channelNumber = Integer.valueOf(key.substring(0, sepPos));
String dpName = key.substring(sepPos + 1);
HmDatapointInfo dpInfo = new HmDatapointInfo(device.getAddress(), HmParamsetType.MASTER, HmDatapointInfo dpInfo = new HmDatapointInfo(device.getAddress(), HmParamsetType.MASTER,
channelNumber, dpName); channelNumber, dpName);
@ -514,8 +513,7 @@ public class HomematicThingHandler extends BaseThingHandler {
newValue = decimal.doubleValue(); newValue = decimal.doubleValue();
} }
} }
if (ObjectUtils.notEqual(dp.isEnumType() ? dp.getOptionValue() : dp.getValue(), if (!Objects.equals(dp.isEnumType() ? dp.getOptionValue() : dp.getValue(), newValue)) {
newValue)) {
sendDatapoint(dp, new HmDatapointConfig(), newValue); sendDatapoint(dp, new HmDatapointConfig(), newValue);
} }
} }

View File

@ -50,4 +50,62 @@ public class MiscUtils {
public static boolean isFalseValue(Object value) { public static boolean isFalseValue(Object value) {
return value != null && value == Boolean.FALSE; return value != null && value == Boolean.FALSE;
} }
/**
* Returns true, if str starts with search. Check is done case-insensitive.
*/
public static boolean strStartsWithIgnoreCase(String str, String search) {
if (str == null || search == null || search.length() > str.length()) {
return false;
}
return str.substring(0, search.length()).equalsIgnoreCase(search);
}
/**
* Returns true if address is a device
*/
public static boolean isDevice(String address) {
return isDevice(address, false);
}
/**
* Returns true if address is a device. If allowBidCos ist true then addresses starting with "BidCos" classified as
* devices, too.
*/
public static boolean isDevice(String address, boolean allowBidCos) {
if (address == null) {
return false;
}
if (address.contains(":")) {
return false;
}
if (allowBidCos && strStartsWithIgnoreCase(address.trim(), "BidCos")) {
return true;
}
return !strStartsWithIgnoreCase(address.trim(), "BidCos");
}
/**
* Changes all characters after whitespace to upper-case and all other character to lower case.
*/
public static String capitalize(String value) {
if (value == null) {
return null;
}
char[] chars = value.toCharArray();
boolean capitalizeNextChar = true;
for (int i = 0; i < chars.length; i++) {
if (Character.isWhitespace(chars[i])) {
capitalizeNextChar = true;
} else {
if (capitalizeNextChar) {
chars[i] = Character.toTitleCase(chars[i]);
capitalizeNextChar = false;
} else {
chars[i] = Character.toLowerCase(chars[i]);
}
}
}
return new String(chars);
}
} }

View File

@ -18,8 +18,6 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.openhab.binding.homematic.internal.misc.HomematicConstants; import org.openhab.binding.homematic.internal.misc.HomematicConstants;
/** /**
@ -216,7 +214,6 @@ public class HmChannel {
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("number", number).append("type", type) return String.format("%s[number=%d,initialized=%b]", getClass().getSimpleName(), number, initialized);
.append("initialized", initialized).toString();
} }
} }

View File

@ -12,9 +12,6 @@
*/ */
package org.openhab.binding.homematic.internal.model; package org.openhab.binding.homematic.internal.model;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.openhab.binding.homematic.internal.misc.MiscUtils; import org.openhab.binding.homematic.internal.misc.MiscUtils;
/** /**
@ -431,11 +428,10 @@ public class HmDatapoint implements Cloneable {
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("name", name).append("value", value) return String.format("%s[name=%s,value=%s,defaultValue=%s,type=%s,minValue=%s,maxValue=%s,step=%s,options=%s,"
.append("defaultValue", defaultValue).append("type", type).append("minValue", minValue) + "readOnly=%b,readable=%b,unit=%s,description=%s,info=%s,paramsetType=%s,virtual=%b,trigger=%b]",
.append("maxValue", maxValue).append("step", step).append("options", StringUtils.join(options, ";")) getClass().getSimpleName(), name, value, defaultValue, type, minValue, maxValue, step,
.append("readOnly", readOnly).append("readable", readable).append("unit", unit) (options == null ? null : String.join(";", options)), readOnly, readable, unit, description, info,
.append("description", description).append("info", info).append("paramsetType", paramsetType) paramsetType, virtual, trigger);
.append("virtual", virtual).append("trigger", trigger).toString();
} }
} }

View File

@ -12,9 +12,6 @@
*/ */
package org.openhab.binding.homematic.internal.model; package org.openhab.binding.homematic.internal.model;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/** /**
* Configuration object for sending a datapoint. * Configuration object for sending a datapoint.
* *
@ -54,7 +51,6 @@ public class HmDatapointConfig {
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("delay", delay) return String.format("%s[delay=%f,receiveDelay=%f]", getClass().getSimpleName(), delay, receiveDelay);
.append("receiveDelay", receiveDelay).toString();
} }
} }

View File

@ -12,8 +12,7 @@
*/ */
package org.openhab.binding.homematic.internal.model; package org.openhab.binding.homematic.internal.model;
import org.apache.commons.lang.builder.EqualsBuilder; import java.util.Objects;
import org.apache.commons.lang.builder.HashCodeBuilder;
/** /**
* Simple representation of a datapoint. * Simple representation of a datapoint.
@ -92,7 +91,7 @@ public class HmDatapointInfo {
@Override @Override
public int hashCode() { public int hashCode() {
return new HashCodeBuilder().append(address).append(paramsetType).append(channel).append(name).toHashCode(); return Objects.hash(address, paramsetType, channel, name);
} }
@Override @Override
@ -101,8 +100,8 @@ public class HmDatapointInfo {
return false; return false;
} }
HmDatapointInfo comp = (HmDatapointInfo) obj; HmDatapointInfo comp = (HmDatapointInfo) obj;
return new EqualsBuilder().append(address, comp.getAddress()).append(paramsetType, comp.getParamsetType()) return Objects.equals(address, comp.getAddress()) && Objects.equals(paramsetType, comp.getParamsetType())
.append(channel, comp.getChannel()).append(name, comp.getName()).isEquals(); && Objects.equals(channel, comp.getChannel()) && Objects.equals(name, comp.getName());
} }
@Override @Override

View File

@ -16,11 +16,8 @@ import static org.openhab.binding.homematic.internal.misc.HomematicConstants.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.openhab.binding.homematic.internal.misc.MiscUtils; import org.openhab.binding.homematic.internal.misc.MiscUtils;
/** /**
@ -202,7 +199,7 @@ public class HmDevice {
@Override @Override
public int hashCode() { public int hashCode() {
return new HashCodeBuilder().append(address).toHashCode(); return Objects.hash(address);
} }
@Override @Override
@ -211,13 +208,12 @@ public class HmDevice {
return false; return false;
} }
HmDevice comp = (HmDevice) obj; HmDevice comp = (HmDevice) obj;
return new EqualsBuilder().append(address, comp.getAddress()).isEquals(); return Objects.equals(address, comp.getAddress());
} }
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("hmInterface", hmInterface) return String.format("%s[hmInterface=%s,address=%s,type=%s,name=%s,firmware=%s,gatewayId=%s]",
.append("address", address).append("type", type).append("name", name).append("firmware", firmware) getClass().getSimpleName(), hmInterface, address, type, name, firmware, gatewayId);
.append("gatewayId", gatewayId).toString();
} }
} }

View File

@ -12,9 +12,6 @@
*/ */
package org.openhab.binding.homematic.internal.model; package org.openhab.binding.homematic.internal.model;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/** /**
* Info object which holds gateway specific informations. * Info object which holds gateway specific informations.
* *
@ -184,9 +181,8 @@ public class HmGatewayInfo {
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("id", id).append("type", type) return String.format("%s[id=%s,type=%s,firmware=%s,address=%s,rf=%b,wired=%b,hmip=%b,cuxd=%b,group=%b]",
.append("firmware", firmware).append("address", address).append("rf", rfInterface) getClass().getSimpleName(), id, type, firmware, address, rfInterface, wiredInterface, hmipInterface,
.append("wired", wiredInterface).append("hmip", hmipInterface).append("cuxd", cuxdInterface) cuxdInterface, groupInterface);
.append("group", groupInterface).toString();
} }
} }

View File

@ -12,9 +12,6 @@
*/ */
package org.openhab.binding.homematic.internal.model; package org.openhab.binding.homematic.internal.model;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/** /**
* Object that holds the rssi infos for a RF device. * Object that holds the rssi infos for a RF device.
* *
@ -65,7 +62,6 @@ public class HmRssiInfo {
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("address", address) return String.format("%s[address=%s,device=%d,peer=%i]", getClass().getSimpleName(), address, device, peer);
.append("device", device).append("peer", peer).toString();
} }
} }

View File

@ -23,11 +23,10 @@ import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import org.apache.commons.lang.ObjectUtils; import org.openhab.binding.homematic.internal.misc.MiscUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.WordUtils;
import org.openhab.binding.homematic.internal.model.HmChannel; import org.openhab.binding.homematic.internal.model.HmChannel;
import org.openhab.binding.homematic.internal.model.HmDatapoint; import org.openhab.binding.homematic.internal.model.HmDatapoint;
import org.openhab.binding.homematic.internal.model.HmDevice; import org.openhab.binding.homematic.internal.model.HmDevice;
@ -171,7 +170,7 @@ public class HomematicTypeGeneratorImpl implements HomematicTypeGenerator {
ChannelGroupType groupType = channelGroupTypeProvider.getInternalChannelGroupType(groupTypeUID); ChannelGroupType groupType = channelGroupTypeProvider.getInternalChannelGroupType(groupTypeUID);
if (groupType == null || device.isGatewayExtras()) { if (groupType == null || device.isGatewayExtras()) {
String groupLabel = String.format("%s", String groupLabel = String.format("%s",
WordUtils.capitalizeFully(StringUtils.replace(channel.getType(), "_", " "))); MiscUtils.capitalize(channel.getType().replace("_", " ")));
groupType = ChannelGroupTypeBuilder.instance(groupTypeUID, groupLabel) groupType = ChannelGroupTypeBuilder.instance(groupTypeUID, groupLabel)
.withChannelDefinitions(channelDefinitions).build(); .withChannelDefinitions(channelDefinitions).build();
channelGroupTypeProvider.addChannelGroupType(groupType); channelGroupTypeProvider.addChannelGroupType(groupType);
@ -195,7 +194,7 @@ public class HomematicTypeGeneratorImpl implements HomematicTypeGenerator {
"Multiple firmware versions for device type '{}' found ({}). " "Multiple firmware versions for device type '{}' found ({}). "
+ "Make sure, all devices of the same type have the same firmware version, " + "Make sure, all devices of the same type have the same firmware version, "
+ "otherwise you MAY have channel and/or datapoint errors in the logfile", + "otherwise you MAY have channel and/or datapoint errors in the logfile",
deviceType, StringUtils.join(firmwares, ", ")); deviceType, String.join(", ", firmwares));
} }
} }
} }
@ -204,7 +203,7 @@ public class HomematicTypeGeneratorImpl implements HomematicTypeGenerator {
* Adds the firmware version for validation. * Adds the firmware version for validation.
*/ */
private void addFirmware(HmDevice device) { private void addFirmware(HmDevice device) {
if (!StringUtils.equals(device.getFirmware(), "?") && !DEVICE_TYPE_VIRTUAL.equals(device.getType()) if (!"?".equals(device.getFirmware()) && !DEVICE_TYPE_VIRTUAL.equals(device.getType())
&& !DEVICE_TYPE_VIRTUAL_WIRED.equals(device.getType())) { && !DEVICE_TYPE_VIRTUAL_WIRED.equals(device.getType())) {
Set<String> firmwares = firmwaresByType.get(device.getType()); Set<String> firmwares = firmwaresByType.get(device.getType());
if (firmwares == null) { if (firmwares == null) {
@ -237,7 +236,8 @@ public class HomematicTypeGeneratorImpl implements HomematicTypeGenerator {
List<ChannelGroupDefinition> groupDefinitions = new ArrayList<>(); List<ChannelGroupDefinition> groupDefinitions = new ArrayList<>();
for (ChannelGroupType groupType : groupTypes) { for (ChannelGroupType groupType : groupTypes) {
String id = StringUtils.substringAfterLast(groupType.getUID().getId(), "_"); int usPos = groupType.getUID().getId().lastIndexOf("_");
String id = usPos == -1 ? groupType.getUID().getId() : groupType.getUID().getId().substring(usPos + 1);
groupDefinitions.add(new ChannelGroupDefinition(id, groupType.getUID())); groupDefinitions.add(new ChannelGroupDefinition(id, groupType.getUID()));
} }
@ -337,7 +337,7 @@ public class HomematicTypeGeneratorImpl implements HomematicTypeGenerator {
MetadataUtils.getParameterName(dp), MetadataUtils.getConfigDescriptionParameterType(dp)); MetadataUtils.getParameterName(dp), MetadataUtils.getConfigDescriptionParameterType(dp));
builder.withLabel(MetadataUtils.getLabel(dp)); builder.withLabel(MetadataUtils.getLabel(dp));
builder.withDefault(ObjectUtils.toString(dp.getDefaultValue())); builder.withDefault(Objects.toString(dp.getDefaultValue(), ""));
builder.withDescription(MetadataUtils.getDatapointDescription(dp)); builder.withDescription(MetadataUtils.getDatapointDescription(dp));
if (dp.isEnumType()) { if (dp.isEnumType()) {
@ -383,6 +383,11 @@ public class HomematicTypeGeneratorImpl implements HomematicTypeGenerator {
* Returns true, if the given datapoint can be ignored for metadata generation. * Returns true, if the given datapoint can be ignored for metadata generation.
*/ */
public static boolean isIgnoredDatapoint(HmDatapoint dp) { public static boolean isIgnoredDatapoint(HmDatapoint dp) {
return StringUtils.indexOfAny(dp.getName(), IGNORE_DATAPOINT_NAMES) != -1; for (String testValue : IGNORE_DATAPOINT_NAMES) {
if (dp.getName().indexOf(testValue) > -1) {
return true;
}
}
return false;
} }
} }

View File

@ -21,6 +21,7 @@ import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -29,8 +30,7 @@ import java.util.Map;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.Set; import java.util.Set;
import org.apache.commons.lang.StringUtils; import org.openhab.binding.homematic.internal.misc.MiscUtils;
import org.apache.commons.lang.WordUtils;
import org.openhab.binding.homematic.internal.model.HmDatapoint; import org.openhab.binding.homematic.internal.model.HmDatapoint;
import org.openhab.binding.homematic.internal.model.HmDevice; import org.openhab.binding.homematic.internal.model.HmDevice;
import org.openhab.core.config.core.ConfigDescriptionParameter.Type; import org.openhab.core.config.core.ConfigDescriptionParameter.Type;
@ -77,9 +77,16 @@ public class MetadataUtils {
BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) { BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) {
String line; String line;
while ((line = reader.readLine()) != null) { while ((line = reader.readLine()) != null) {
if (StringUtils.trimToNull(line) != null && !StringUtils.startsWith(line, "#")) { if (!line.trim().isEmpty() && !line.startsWith("#")) {
String channelType = StringUtils.trimToNull(StringUtils.substringBefore(line, "|")); String[] parts = line.split("\\|");
String datapointName = StringUtils.trimToNull(StringUtils.substringAfter(line, "|")); String channelType = null;
String datapointName = null;
if (parts.length > 0) {
channelType = parts[0].trim();
if (parts.length > 1) {
datapointName = parts[1].trim();
}
}
Set<String> channelDatapoints = standardDatapoints.get(channelType); Set<String> channelDatapoints = standardDatapoints.get(channelType);
if (channelDatapoints == null) { if (channelDatapoints == null) {
@ -142,8 +149,7 @@ public class MetadataUtils {
*/ */
public static String getUnit(HmDatapoint dp) { public static String getUnit(HmDatapoint dp) {
if (dp.getUnit() != null) { if (dp.getUnit() != null) {
String unit = StringUtils.replace(dp.getUnit(), "100%", "%"); return dp.getUnit().replace("100%", "%").replace("%", "%%");
return StringUtils.replace(unit, "%", "%%");
} }
return null; return null;
} }
@ -182,7 +188,7 @@ public class MetadataUtils {
* Returns the label string for the given Datapoint. * Returns the label string for the given Datapoint.
*/ */
public static String getLabel(HmDatapoint dp) { public static String getLabel(HmDatapoint dp) {
return WordUtils.capitalizeFully(StringUtils.replace(dp.getName(), "_", " ")); return MiscUtils.capitalize(dp.getName().replace("_", " "));
} }
/** /**
@ -198,7 +204,7 @@ public class MetadataUtils {
public static String getDescription(String... keys) { public static String getDescription(String... keys) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (int startIdx = 0; startIdx < keys.length; startIdx++) { for (int startIdx = 0; startIdx < keys.length; startIdx++) {
String key = StringUtils.join(keys, "|", startIdx, keys.length); String key = String.join("|", Arrays.copyOfRange(keys, startIdx, keys.length));
if (key.endsWith("|")) { if (key.endsWith("|")) {
key = key.substring(0, key.length() - 1); key = key.substring(0, key.length() - 1);
} }
@ -209,7 +215,7 @@ public class MetadataUtils {
sb.append(key).append(", "); sb.append(key).append(", ");
} }
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
logger.trace("Description not found for: {}", StringUtils.substring(sb.toString(), 0, -2)); logger.trace("Description not found for: {}", sb.toString().substring(0, sb.length() - 2));
} }
return null; return null;
} }
@ -224,9 +230,8 @@ public class MetadataUtils {
String deviceDescription = null; String deviceDescription = null;
boolean isTeam = device.getType().endsWith("-Team"); boolean isTeam = device.getType().endsWith("-Team");
String type = isTeam ? StringUtils.remove(device.getType(), "-Team") : device.getType(); String type = isTeam ? device.getType().replace("-Team", "") : device.getType();
deviceDescription = getDescription(type); deviceDescription = getDescription(type);
if (deviceDescription != null && isTeam) { if (deviceDescription != null && isTeam) {
deviceDescription += " Team"; deviceDescription += " Team";
} }
@ -276,7 +281,10 @@ public class MetadataUtils {
*/ */
public static String getItemType(HmDatapoint dp) { public static String getItemType(HmDatapoint dp) {
String dpName = dp.getName(); String dpName = dp.getName();
String channelType = StringUtils.defaultString(dp.getChannel().getType()); String channelType = dp.getChannel().getType();
if (channelType == null) {
channelType = "";
}
if (dp.isBooleanType()) { if (dp.isBooleanType()) {
if (((dpName.equals(DATAPOINT_NAME_STATE) || dpName.equals(VIRTUAL_DATAPOINT_NAME_STATE_CONTACT)) if (((dpName.equals(DATAPOINT_NAME_STATE) || dpName.equals(VIRTUAL_DATAPOINT_NAME_STATE_CONTACT))
@ -359,7 +367,10 @@ public class MetadataUtils {
*/ */
public static String getCategory(HmDatapoint dp, String itemType) { public static String getCategory(HmDatapoint dp, String itemType) {
String dpName = dp.getName(); String dpName = dp.getName();
String channelType = StringUtils.defaultString(dp.getChannel().getType()); String channelType = dp.getChannel().getType();
if (channelType == null) {
channelType = "";
}
if (dpName.equals(DATAPOINT_NAME_BATTERY_TYPE) || dpName.equals(DATAPOINT_NAME_LOWBAT) if (dpName.equals(DATAPOINT_NAME_BATTERY_TYPE) || dpName.equals(DATAPOINT_NAME_LOWBAT)
|| dpName.equals(DATAPOINT_NAME_LOWBAT_IP)) { || dpName.equals(DATAPOINT_NAME_LOWBAT_IP)) {

View File

@ -14,7 +14,6 @@ package org.openhab.binding.homematic.internal.type;
import static org.openhab.binding.homematic.internal.HomematicBindingConstants.BINDING_ID; import static org.openhab.binding.homematic.internal.HomematicBindingConstants.BINDING_ID;
import org.apache.commons.lang.math.NumberUtils;
import org.openhab.binding.homematic.internal.model.HmChannel; import org.openhab.binding.homematic.internal.model.HmChannel;
import org.openhab.binding.homematic.internal.model.HmDatapoint; import org.openhab.binding.homematic.internal.model.HmDatapoint;
import org.openhab.binding.homematic.internal.model.HmDatapointInfo; import org.openhab.binding.homematic.internal.model.HmDatapointInfo;
@ -83,8 +82,15 @@ public class UidUtils {
* Generates the HmDatapointInfo for the given thing and channelUID. * Generates the HmDatapointInfo for the given thing and channelUID.
*/ */
public static HmDatapointInfo createHmDatapointInfo(ChannelUID channelUID) { public static HmDatapointInfo createHmDatapointInfo(ChannelUID channelUID) {
return new HmDatapointInfo(channelUID.getThingUID().getId(), HmParamsetType.VALUES, int value;
NumberUtils.toInt(channelUID.getGroupId()), channelUID.getIdWithoutGroup()); try {
String groupID = channelUID.getGroupId();
value = groupID == null ? 0 : Integer.parseInt(groupID);
} catch (NumberFormatException e) {
value = 0;
}
return new HmDatapointInfo(channelUID.getThingUID().getId(), HmParamsetType.VALUES, value,
channelUID.getIdWithoutGroup());
} }
/** /**

View File

@ -25,9 +25,6 @@ import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.TreeMap; import java.util.TreeMap;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
/** /**
* The CcuMetadataExtractor loads some JavaScript files from the CCU and generates the device and datapoint * The CcuMetadataExtractor loads some JavaScript files from the CCU and generates the device and datapoint
* descriptions into the file generated-descriptions.properties. * descriptions into the file generated-descriptions.properties.
@ -122,7 +119,7 @@ public class CcuMetadataExtractor {
*/ */
private Map<String, String> loadJsonLangDescriptionFile(String url, String lang) throws IOException { private Map<String, String> loadJsonLangDescriptionFile(String url, String lang) throws IOException {
final Map<String, String> descriptions = new TreeMap<>(); final Map<String, String> descriptions = new TreeMap<>();
String descriptionUrl = StringUtils.replace(url, "{LANGUAGE}", lang); String descriptionUrl = url.replace("{LANGUAGE}", lang);
String startLine = " \"" + lang + "\" : {"; String startLine = " \"" + lang + "\" : {";
String endLine = " },"; String endLine = " },";
@ -132,7 +129,7 @@ public class CcuMetadataExtractor {
public void line(String line) { public void line(String line) {
String[] entry = handleStringTable(line); String[] entry = handleStringTable(line);
if (entry != null) { if (entry != null) {
descriptions.put(StringUtils.trim(entry[0]), unescape(StringUtils.trim(entry[1]))); descriptions.put(entry[0].trim(), unescape(entry[1].trim()));
} }
} }
}; };
@ -150,20 +147,24 @@ public class CcuMetadataExtractor {
@Override @Override
public void line(String line) { public void line(String line) {
if (line.startsWith("elvST['")) { if (line.startsWith("elvST['")) {
line = StringUtils.remove(line, "elvST['"); line = line.replace("elvST['", "");
line = StringUtils.replace(line, "'] = '", "="); line = line.replace("'] = '", "=");
line = StringUtils.remove(line, "';"); line = line.replace("';", "");
line = StringUtils.remove(line, "$"); line = line.replace("$", "");
line = StringUtils.remove(line, "{"); line = line.replace("{", "");
line = StringUtils.remove(line, "}"); line = line.replace("}", "");
int count = StringUtils.countMatches(line, "="); int count = 0;
if (count > 1) { for (int i = 0; i < line.length(); i++) {
line = StringUtils.replace(line, "=", "|", 1); if (line.charAt(i) == '=') {
count++;
}
} }
if (count > 1) {
String[] split = StringUtils.split(line, "=", 2); line = line.replaceFirst("=", "|");
deviceKeys.put(StringUtils.trim(split[0]), StringUtils.trim(split[1])); }
String[] split = line.split("=", 2);
deviceKeys.put(split[0].trim(), split[1].trim());
} }
} }
}; };
@ -174,11 +175,11 @@ public class CcuMetadataExtractor {
* Splits a JSON JavaScript entry. * Splits a JSON JavaScript entry.
*/ */
private String[] handleStringTable(String line) { private String[] handleStringTable(String line) {
line = StringUtils.remove(line, " \""); line = line.replace(" \"", "");
line = StringUtils.remove(line, "\","); line = line.replace("\",", "");
line = StringUtils.remove(line, "\""); line = line.replace("\"", "");
String[] splitted = StringUtils.split(line, ":", 2); String[] splitted = line.split(":", 2);
return splitted.length != 2 ? null : splitted; return splitted.length != 2 ? null : splitted;
} }
@ -186,16 +187,21 @@ public class CcuMetadataExtractor {
* Transforms a string for a Java property file. * Transforms a string for a Java property file.
*/ */
private String unescape(String str) { private String unescape(String str) {
str = StringUtils.replace(str, "%FC", "ü"); str = str.replace("%FC", "ü");
str = StringUtils.replace(str, "%DC", "Ü"); str = str.replace("%DC", "Ü");
str = StringUtils.replace(str, "%E4", "ä"); str = str.replace("%E4", "ä");
str = StringUtils.replace(str, "%C4", "Ä"); str = str.replace("%C4", "Ä");
str = StringUtils.replace(str, "%F6", "ö"); str = str.replace("%F6", "ö");
str = StringUtils.replace(str, "%D6", "Ö"); str = str.replace("%D6", "Ö");
str = StringUtils.replace(str, "%DF", "ß"); str = str.replace("%DF", "ß");
str = StringUtils.remove(str, "&nbsp;"); str = str.replace("&nbsp;", "");
str = StringUtils.replace(str, "<br/>", " "); str = str.replace("<br/>", " ");
str = StringEscapeUtils.unescapeHtml(str); str = str.replace("&uuml;", "ü");
str = str.replace("&auml;", "ä");
str = str.replace("&ouml;", "ö");
str = str.replace("&Uuml;", "Ü");
str = str.replace("&Auml;", "Ä");
str = str.replace("&Ouml;", "Ö");
return str; return str;
} }
@ -222,7 +228,7 @@ public class CcuMetadataExtractor {
includeLine = false; includeLine = false;
} }
} }
if ((includeLine == null || includeLine) && StringUtils.isNotBlank(line)) { if ((includeLine == null || includeLine) && !line.isBlank()) {
line(line); line(line);
} }
} }