From c8634f7e6f990e3fc0b5e210a234c0aaa663db52 Mon Sep 17 00:00:00 2001 From: J-N-K Date: Sat, 9 Sep 2023 15:08:58 +0200 Subject: [PATCH] [influxdb] Fix exception handling and improve some type conversions (#15452) Signed-off-by: Jan N. Klug --- .../internal/InfluxDBStateConvertUtils.java | 20 +++++++++- .../influx1/InfluxDB1RepositoryImpl.java | 8 ++-- .../InfluxDBStateConvertUtilsTest.java | 40 +++++++++++++++++++ 3 files changed, 62 insertions(+), 6 deletions(-) diff --git a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/InfluxDBStateConvertUtils.java b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/InfluxDBStateConvertUtils.java index d9ce0749a1f..265386d77be 100644 --- a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/InfluxDBStateConvertUtils.java +++ b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/InfluxDBStateConvertUtils.java @@ -29,8 +29,10 @@ import org.openhab.core.library.items.ColorItem; import org.openhab.core.library.items.ContactItem; import org.openhab.core.library.items.DateTimeItem; import org.openhab.core.library.items.DimmerItem; +import org.openhab.core.library.items.ImageItem; import org.openhab.core.library.items.LocationItem; import org.openhab.core.library.items.NumberItem; +import org.openhab.core.library.items.PlayerItem; import org.openhab.core.library.items.RollershutterItem; import org.openhab.core.library.items.SwitchItem; import org.openhab.core.library.types.DateTimeType; @@ -39,10 +41,14 @@ import org.openhab.core.library.types.HSBType; import org.openhab.core.library.types.OnOffType; import org.openhab.core.library.types.OpenClosedType; import org.openhab.core.library.types.PercentType; +import org.openhab.core.library.types.PlayPauseType; import org.openhab.core.library.types.PointType; import org.openhab.core.library.types.QuantityType; +import org.openhab.core.library.types.RawType; +import org.openhab.core.library.types.RewindFastforwardType; import org.openhab.core.library.types.StringType; import org.openhab.core.types.State; +import org.openhab.core.types.UnDefType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -81,7 +87,7 @@ public class InfluxDBStateConvertUtils { } else if (state instanceof DateTimeType) { value = ((DateTimeType) state).getZonedDateTime().toInstant().toEpochMilli(); } else { - value = state.toString(); + value = state.toFullString(); } return value; } @@ -137,9 +143,21 @@ public class InfluxDBStateConvertUtils { Instant i = Instant.ofEpochMilli(new BigDecimal(valueStr).longValue()); ZonedDateTime z = ZonedDateTime.ofInstant(i, TimeZone.getDefault().toZoneId()); return new DateTimeType(z); + } else if (item instanceof PlayerItem) { + try { + return PlayPauseType.valueOf(valueStr); + } catch (IllegalArgumentException ignored) { + } + try { + return RewindFastforwardType.valueOf(valueStr); + } catch (IllegalArgumentException ignored) { + } + } else if (item instanceof ImageItem) { + return RawType.valueOf(valueStr); } else { return new StringType(valueStr); } + return UnDefType.UNDEF; } private static boolean toBoolean(@Nullable Object object) { diff --git a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx1/InfluxDB1RepositoryImpl.java b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx1/InfluxDB1RepositoryImpl.java index 9449bbdac6b..947450d38b9 100644 --- a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx1/InfluxDB1RepositoryImpl.java +++ b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx1/InfluxDB1RepositoryImpl.java @@ -29,8 +29,8 @@ import java.util.concurrent.TimeUnit; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBException; import org.influxdb.InfluxDBFactory; -import org.influxdb.InfluxDBIOException; import org.influxdb.dto.BatchPoints; import org.influxdb.dto.Point; import org.influxdb.dto.Pong; @@ -59,14 +59,12 @@ import com.influxdb.exceptions.InfluxException; public class InfluxDB1RepositoryImpl implements InfluxDBRepository { private final Logger logger = LoggerFactory.getLogger(InfluxDB1RepositoryImpl.class); private final InfluxDBConfiguration configuration; - private final InfluxDBMetadataService influxDBMetadataService; private final FilterCriteriaQueryCreator queryCreator; private @Nullable InfluxDB client; public InfluxDB1RepositoryImpl(InfluxDBConfiguration configuration, InfluxDBMetadataService influxDBMetadataService) { this.configuration = configuration; - this.influxDBMetadataService = influxDBMetadataService; this.queryCreator = new InfluxDB1FilterCriteriaQueryCreatorImpl(configuration, influxDBMetadataService); } @@ -131,7 +129,7 @@ public class InfluxDB1RepositoryImpl implements InfluxDBRepository { BatchPoints batchPoints = BatchPoints.database(configuration.getDatabaseName()) .retentionPolicy(configuration.getRetentionPolicy()).points(points).build(); currentClient.write(batchPoints); - } catch (InfluxException | InfluxDBIOException e) { + } catch (InfluxException | InfluxDBException e) { logger.debug("Writing to database failed", e); return false; } @@ -177,7 +175,7 @@ public class InfluxDB1RepositoryImpl implements InfluxDBRepository { } else { throw new InfluxException("API not present"); } - } catch (InfluxException | InfluxDBIOException e) { + } catch (InfluxException | InfluxDBException e) { logger.warn("Failed to execute query '{}': {}", filter, e.getMessage()); return List.of(); } diff --git a/bundles/org.openhab.persistence.influxdb/src/test/java/org/openhab/persistence/influxdb/internal/InfluxDBStateConvertUtilsTest.java b/bundles/org.openhab.persistence.influxdb/src/test/java/org/openhab/persistence/influxdb/internal/InfluxDBStateConvertUtilsTest.java index 249697475f8..32239144738 100644 --- a/bundles/org.openhab.persistence.influxdb/src/test/java/org/openhab/persistence/influxdb/internal/InfluxDBStateConvertUtilsTest.java +++ b/bundles/org.openhab.persistence.influxdb/src/test/java/org/openhab/persistence/influxdb/internal/InfluxDBStateConvertUtilsTest.java @@ -33,13 +33,18 @@ import org.junit.jupiter.params.provider.ValueSource; import org.openhab.core.i18n.UnitProvider; import org.openhab.core.library.items.ContactItem; import org.openhab.core.library.items.DateTimeItem; +import org.openhab.core.library.items.ImageItem; import org.openhab.core.library.items.NumberItem; +import org.openhab.core.library.items.PlayerItem; import org.openhab.core.library.items.SwitchItem; import org.openhab.core.library.types.DateTimeType; import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.OnOffType; import org.openhab.core.library.types.OpenClosedType; +import org.openhab.core.library.types.PlayPauseType; import org.openhab.core.library.types.QuantityType; +import org.openhab.core.library.types.RawType; +import org.openhab.core.library.types.RewindFastforwardType; import org.openhab.core.library.unit.SIUnits; /** @@ -74,6 +79,24 @@ public class InfluxDBStateConvertUtilsTest { assertThat(InfluxDBStateConvertUtils.stateToObject(type), equalTo(nowInMillis)); } + @Test + public void convertImageState() { + RawType type = new RawType(new byte[] { 0x64, 0x66, 0x55, 0x00, 0x34 }, RawType.DEFAULT_MIME_TYPE); + assertThat(InfluxDBStateConvertUtils.stateToObject(type), is("data:application/octet-stream;base64,ZGZVADQ=")); + } + + @Test + public void convertPlayPauseState() { + assertThat(InfluxDBStateConvertUtils.stateToObject(PlayPauseType.PAUSE), is("PAUSE")); + assertThat(InfluxDBStateConvertUtils.stateToObject(PlayPauseType.PLAY), is("PLAY")); + } + + @Test + public void convertRewindFastForwardState() { + assertThat(InfluxDBStateConvertUtils.stateToObject(RewindFastforwardType.REWIND), is("REWIND")); + assertThat(InfluxDBStateConvertUtils.stateToObject(RewindFastforwardType.FASTFORWARD), is("FASTFORWARD")); + } + @ParameterizedTest @ValueSource(strings = { "1.12", "25" }) public void convertDecimalToState(String number) { @@ -111,4 +134,21 @@ public class InfluxDBStateConvertUtilsTest { ZonedDateTime.ofInstant(Instant.ofEpochMilli(val), ZoneId.systemDefault())); assertThat(InfluxDBStateConvertUtils.objectToState(val, item), equalTo(expected)); } + + @Test + public void convertImageToState() { + ImageItem item = new ImageItem("name"); + RawType type = new RawType(new byte[] { 0x64, 0x66, 0x55, 0x00, 0x34 }, RawType.DEFAULT_MIME_TYPE); + assertThat(InfluxDBStateConvertUtils.objectToState("data:application/octet-stream;base64,ZGZVADQ=", item), + is(type)); + } + + @Test + public void convertPlayerToState() { + PlayerItem item = new PlayerItem("name"); + assertThat(InfluxDBStateConvertUtils.objectToState("PLAY", item), is(PlayPauseType.PLAY)); + assertThat(InfluxDBStateConvertUtils.objectToState("PAUSE", item), is(PlayPauseType.PAUSE)); + assertThat(InfluxDBStateConvertUtils.objectToState("REWIND", item), is(RewindFastforwardType.REWIND)); + assertThat(InfluxDBStateConvertUtils.objectToState("FASTFORWARD", item), is(RewindFastforwardType.FASTFORWARD)); + } }