Adjustments for nullness annotated TypeParser (#10068)
Signed-off-by: Christoph Weitkamp <github@christophweitkamp.de>
This commit is contained in:
parent
8a2ac82b07
commit
1210fec9f9
|
@ -267,13 +267,15 @@ public class HomieThingHandlerTests {
|
||||||
// Assign old value
|
// Assign old value
|
||||||
Value value = property.getChannelState().getCache();
|
Value value = property.getChannelState().getCache();
|
||||||
Command command = TypeParser.parseCommand(value.getSupportedCommandTypes(), "OLDVALUE");
|
Command command = TypeParser.parseCommand(value.getSupportedCommandTypes(), "OLDVALUE");
|
||||||
property.getChannelState().getCache().update(command);
|
if (command != null) {
|
||||||
// Try to update with new value
|
property.getChannelState().getCache().update(command);
|
||||||
updateValue = new StringType("SOMETHINGNEW");
|
// Try to update with new value
|
||||||
thingHandler.handleCommand(property.channelUID, updateValue);
|
updateValue = new StringType("SOMETHINGNEW");
|
||||||
// Expect old value and no MQTT publish
|
thingHandler.handleCommand(property.channelUID, updateValue);
|
||||||
assertThat(property.getChannelState().getCache().getChannelState().toString(), is("OLDVALUE"));
|
// Expect old value and no MQTT publish
|
||||||
verify(connection, times(1)).publish(any(), any(), anyInt(), anyBoolean());
|
assertThat(property.getChannelState().getCache().getChannelState().toString(), is("OLDVALUE"));
|
||||||
|
verify(connection, times(1)).publish(any(), any(), anyInt(), anyBoolean());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object createSubscriberAnswer(InvocationOnMock invocation) {
|
public Object createSubscriberAnswer(InvocationOnMock invocation) {
|
||||||
|
|
|
@ -22,6 +22,8 @@ import java.util.concurrent.ScheduledFuture;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
|
import org.eclipse.jdt.annotation.Nullable;
|
||||||
import org.openhab.binding.oceanic.internal.NetworkOceanicBindingConfiguration;
|
import org.openhab.binding.oceanic.internal.NetworkOceanicBindingConfiguration;
|
||||||
import org.openhab.binding.oceanic.internal.Throttler;
|
import org.openhab.binding.oceanic.internal.Throttler;
|
||||||
import org.openhab.core.thing.Thing;
|
import org.openhab.core.thing.Thing;
|
||||||
|
@ -36,6 +38,7 @@ import org.slf4j.LoggerFactory;
|
||||||
*
|
*
|
||||||
* @author Karel Goderis - Initial contribution
|
* @author Karel Goderis - Initial contribution
|
||||||
*/
|
*/
|
||||||
|
@NonNullByDefault
|
||||||
public class NetworkOceanicThingHandler extends OceanicThingHandler {
|
public class NetworkOceanicThingHandler extends OceanicThingHandler {
|
||||||
|
|
||||||
private static final int REQUEST_TIMEOUT = 3000;
|
private static final int REQUEST_TIMEOUT = 3000;
|
||||||
|
@ -43,10 +46,10 @@ public class NetworkOceanicThingHandler extends OceanicThingHandler {
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(NetworkOceanicThingHandler.class);
|
private final Logger logger = LoggerFactory.getLogger(NetworkOceanicThingHandler.class);
|
||||||
|
|
||||||
private Socket socket;
|
private @Nullable Socket socket;
|
||||||
private InputStream inputStream;
|
private @Nullable InputStream inputStream;
|
||||||
private OutputStream outputStream;
|
private @Nullable OutputStream outputStream;
|
||||||
protected ScheduledFuture<?> reconnectJob;
|
protected @Nullable ScheduledFuture<?> reconnectJob;
|
||||||
|
|
||||||
public NetworkOceanicThingHandler(Thing thing) {
|
public NetworkOceanicThingHandler(Thing thing) {
|
||||||
super(thing);
|
super(thing);
|
||||||
|
@ -99,7 +102,7 @@ public class NetworkOceanicThingHandler extends OceanicThingHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String requestResponse(String commandAsString) {
|
protected @Nullable String requestResponse(String commandAsString) {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
if (getThing().getStatus() == ThingStatus.ONLINE) {
|
if (getThing().getStatus() == ThingStatus.ONLINE) {
|
||||||
NetworkOceanicBindingConfiguration config = getConfigAs(NetworkOceanicBindingConfiguration.class);
|
NetworkOceanicBindingConfiguration config = getConfigAs(NetworkOceanicBindingConfiguration.class);
|
||||||
|
|
|
@ -13,13 +13,13 @@
|
||||||
package org.openhab.binding.oceanic.internal.handler;
|
package org.openhab.binding.oceanic.internal.handler;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ScheduledFuture;
|
import java.util.concurrent.ScheduledFuture;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNull;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
|
import org.eclipse.jdt.annotation.Nullable;
|
||||||
import org.openhab.binding.oceanic.internal.OceanicBindingConstants.OceanicChannelSelector;
|
import org.openhab.binding.oceanic.internal.OceanicBindingConstants.OceanicChannelSelector;
|
||||||
import org.openhab.core.thing.Channel;
|
import org.openhab.core.thing.Channel;
|
||||||
import org.openhab.core.thing.ChannelUID;
|
import org.openhab.core.thing.ChannelUID;
|
||||||
|
@ -30,7 +30,6 @@ import org.openhab.core.thing.binding.BaseThingHandler;
|
||||||
import org.openhab.core.types.Command;
|
import org.openhab.core.types.Command;
|
||||||
import org.openhab.core.types.RefreshType;
|
import org.openhab.core.types.RefreshType;
|
||||||
import org.openhab.core.types.State;
|
import org.openhab.core.types.State;
|
||||||
import org.openhab.core.types.Type;
|
|
||||||
import org.openhab.core.types.TypeParser;
|
import org.openhab.core.types.TypeParser;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -41,6 +40,7 @@ import org.slf4j.LoggerFactory;
|
||||||
*
|
*
|
||||||
* @author Karel Goderis - Initial contribution
|
* @author Karel Goderis - Initial contribution
|
||||||
*/
|
*/
|
||||||
|
@NonNullByDefault
|
||||||
public abstract class OceanicThingHandler extends BaseThingHandler {
|
public abstract class OceanicThingHandler extends BaseThingHandler {
|
||||||
|
|
||||||
public static final String INTERVAL = "interval";
|
public static final String INTERVAL = "interval";
|
||||||
|
@ -48,10 +48,10 @@ public abstract class OceanicThingHandler extends BaseThingHandler {
|
||||||
private final Logger logger = LoggerFactory.getLogger(OceanicThingHandler.class);
|
private final Logger logger = LoggerFactory.getLogger(OceanicThingHandler.class);
|
||||||
|
|
||||||
protected int bufferSize;
|
protected int bufferSize;
|
||||||
protected ScheduledFuture<?> pollingJob;
|
protected @Nullable ScheduledFuture<?> pollingJob;
|
||||||
protected static String lastLineReceived = "";
|
protected static String lastLineReceived = "";
|
||||||
|
|
||||||
public OceanicThingHandler(@NonNull Thing thing) {
|
public OceanicThingHandler(Thing thing) {
|
||||||
super(thing);
|
super(thing);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,7 +78,9 @@ public abstract class OceanicThingHandler extends BaseThingHandler {
|
||||||
updateProperties(properties);
|
updateProperties(properties);
|
||||||
} else {
|
} else {
|
||||||
State value = createStateForType(selector, response);
|
State value = createStateForType(selector, response);
|
||||||
updateState(theChannelUID, value);
|
if (value != null) {
|
||||||
|
updateState(theChannelUID, value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.warn("Received an empty answer for '{}'", selector.name());
|
logger.warn("Received an empty answer for '{}'", selector.name());
|
||||||
|
@ -138,7 +140,7 @@ public abstract class OceanicThingHandler extends BaseThingHandler {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
String response = requestResponse(commandAsString);
|
String response = requestResponse(commandAsString);
|
||||||
if (response.equals("ERR")) {
|
if ("ERR".equals(response)) {
|
||||||
logger.error("An error occurred while setting '{}' to {}", selector.toString(),
|
logger.error("An error occurred while setting '{}' to {}", selector.toString(),
|
||||||
commandAsString);
|
commandAsString);
|
||||||
}
|
}
|
||||||
|
@ -155,15 +157,10 @@ public abstract class OceanicThingHandler extends BaseThingHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private State createStateForType(OceanicChannelSelector selector, String value) {
|
private @Nullable State createStateForType(OceanicChannelSelector selector, String value) {
|
||||||
Class<? extends Type> typeClass = selector.getTypeClass();
|
return TypeParser.parseState(List.of((Class<? extends State>) selector.getTypeClass()),
|
||||||
List<Class<? extends State>> stateTypeList = new ArrayList<>();
|
selector.convertValue(value));
|
||||||
|
|
||||||
stateTypeList.add((Class<? extends State>) typeClass);
|
|
||||||
State state = TypeParser.parseState(stateTypeList, selector.convertValue(value));
|
|
||||||
|
|
||||||
return state;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract String requestResponse(String commandAsString);
|
protected abstract @Nullable String requestResponse(String commandAsString);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,6 @@ import java.math.BigDecimal;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
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;
|
||||||
|
@ -204,7 +203,9 @@ public class SmartMeterHandler extends BaseThingHandler {
|
||||||
if (!channel.getProperties().containsKey(SmartMeterBindingConstants.CHANNEL_PROPERTY_OBIS)) {
|
if (!channel.getProperties().containsKey(SmartMeterBindingConstants.CHANNEL_PROPERTY_OBIS)) {
|
||||||
addObisPropertyToChannel(obis, channel);
|
addObisPropertyToChannel(obis, channel);
|
||||||
}
|
}
|
||||||
updateState(channel.getUID(), state);
|
if (state != null) {
|
||||||
|
updateState(channel.getUID(), state);
|
||||||
|
}
|
||||||
|
|
||||||
updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE);
|
updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE);
|
||||||
} else {
|
} else {
|
||||||
|
@ -256,7 +257,9 @@ public class SmartMeterHandler extends BaseThingHandler {
|
||||||
MeterValue<?> value = this.smlDevice.getMeterValue(obis);
|
MeterValue<?> value = this.smlDevice.getMeterValue(obis);
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
State state = getStateForObisValue(value, channel);
|
State state = getStateForObisValue(value, channel);
|
||||||
updateState(channel.getUID(), state);
|
if (state != null) {
|
||||||
|
updateState(channel.getUID(), state);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -264,13 +267,14 @@ public class SmartMeterHandler extends BaseThingHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private <Q extends Quantity<Q>> State getStateForObisValue(MeterValue<?> value, @Nullable Channel channel) {
|
private @Nullable <Q extends Quantity<Q>> State getStateForObisValue(MeterValue<?> value,
|
||||||
|
@Nullable Channel channel) {
|
||||||
Unit<?> unit = value.getUnit();
|
Unit<?> unit = value.getUnit();
|
||||||
String valueString = value.getValue();
|
String valueString = value.getValue();
|
||||||
if (unit != null) {
|
if (unit != null) {
|
||||||
valueString += " " + value.getUnit();
|
valueString += " " + value.getUnit();
|
||||||
}
|
}
|
||||||
State state = TypeParser.parseState(Arrays.asList(QuantityType.class, StringType.class), valueString);
|
State state = TypeParser.parseState(List.of(QuantityType.class, StringType.class), valueString);
|
||||||
if (channel != null && state instanceof QuantityType) {
|
if (channel != null && state instanceof QuantityType) {
|
||||||
state = applyConformity(channel, (QuantityType<Q>) state);
|
state = applyConformity(channel, (QuantityType<Q>) state);
|
||||||
Number conversionRatio = (Number) channel.getConfiguration()
|
Number conversionRatio = (Number) channel.getConfiguration()
|
||||||
|
|
Loading…
Reference in New Issue