Skip to content

Commit 58f5905

Browse files
authored
[persistence] Implement HistoricItem.getInstant (openhab#17578)
Signed-off-by: Jörg Sautter <[email protected]>
1 parent ec378ab commit 58f5905

File tree

15 files changed

+105
-61
lines changed

15 files changed

+105
-61
lines changed

bundles/org.openhab.persistence.dynamodb/src/main/java/org/openhab/persistence/dynamodb/internal/AbstractDynamoDBItem.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ public static DynamoDBItem<?> fromStateNew(Item item, ZonedDateTime time, @Nulla
451451
if (deserializedState == null) {
452452
return null;
453453
}
454-
return new DynamoDBHistoricItem(getName(), deserializedState, getTime());
454+
return new DynamoDBHistoricItem(getName(), deserializedState, getTime().toInstant());
455455
} catch (Exception e) {
456456
logger.trace("Failed to convert state '{}' to item {} {}: {} {}. Data persisted with incompatible item.",
457457
this.state, item.getClass().getSimpleName(), item.getName(), e.getClass().getSimpleName(),

bundles/org.openhab.persistence.dynamodb/src/main/java/org/openhab/persistence/dynamodb/internal/DynamoDBHistoricItem.java

+11-5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
*/
1313
package org.openhab.persistence.dynamodb.internal;
1414

15+
import java.time.Instant;
1516
import java.time.ZoneId;
1617
import java.time.ZonedDateTime;
1718
import java.time.format.DateTimeFormatter;
@@ -33,12 +34,12 @@ public class DynamoDBHistoricItem implements HistoricItem {
3334

3435
private final String name;
3536
private final State state;
36-
private final ZonedDateTime timestamp;
37+
private final Instant instant;
3738

38-
public DynamoDBHistoricItem(String name, State state, ZonedDateTime timestamp) {
39+
public DynamoDBHistoricItem(String name, State state, Instant instant) {
3940
this.name = name;
4041
this.state = state;
41-
this.timestamp = timestamp;
42+
this.instant = instant;
4243
}
4344

4445
@Override
@@ -48,7 +49,12 @@ public String getName() {
4849

4950
@Override
5051
public ZonedDateTime getTimestamp() {
51-
return timestamp;
52+
return instant.atZone(ZoneId.systemDefault());
53+
}
54+
55+
@Override
56+
public Instant getInstant() {
57+
return instant;
5258
}
5359

5460
@Override
@@ -58,6 +64,6 @@ public State getState() {
5864

5965
@Override
6066
public String toString() {
61-
return name + ": " + DATEFORMATTER.format(timestamp) + ": " + state.toString();
67+
return name + ": " + DATEFORMATTER.format(getTimestamp()) + ": " + state.toString();
6268
}
6369
}

bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/InfluxDBPersistenceService.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import static org.openhab.persistence.influxdb.internal.InfluxDBConstants.*;
1616

1717
import java.time.Instant;
18-
import java.time.ZoneId;
1918
import java.time.ZonedDateTime;
2019
import java.util.ArrayList;
2120
import java.util.HashMap;
@@ -255,8 +254,7 @@ public Iterable<HistoricItem> query(FilterCriteria filter) {
255254

256255
private HistoricItem mapRowToHistoricItem(InfluxDBRepository.InfluxRow row) {
257256
State state = InfluxDBStateConvertUtils.objectToState(row.value(), row.itemName(), itemRegistry);
258-
return new InfluxDBHistoricItem(row.itemName(), state,
259-
ZonedDateTime.ofInstant(row.time(), ZoneId.systemDefault()));
257+
return new InfluxDBHistoricItem(row.itemName(), state, row.time());
260258
}
261259

262260
@Override

bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/InfluxDBHistoricItem.java

+12-5
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
package org.openhab.persistence.influxdb.internal;
1414

1515
import java.text.DateFormat;
16+
import java.time.Instant;
17+
import java.time.ZoneId;
1618
import java.time.ZonedDateTime;
1719

1820
import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -30,12 +32,12 @@ public class InfluxDBHistoricItem implements HistoricItem {
3032

3133
private String name = "";
3234
private final State state;
33-
private final ZonedDateTime timestamp;
35+
private final Instant instant;
3436

35-
public InfluxDBHistoricItem(String name, State state, ZonedDateTime timestamp) {
37+
public InfluxDBHistoricItem(String name, State state, Instant instant) {
3638
this.name = name;
3739
this.state = state;
38-
this.timestamp = timestamp;
40+
this.instant = instant;
3941
}
4042

4143
@Override
@@ -54,11 +56,16 @@ public State getState() {
5456

5557
@Override
5658
public ZonedDateTime getTimestamp() {
57-
return timestamp;
59+
return instant.atZone(ZoneId.systemDefault());
60+
}
61+
62+
@Override
63+
public Instant getInstant() {
64+
return instant;
5865
}
5966

6067
@Override
6168
public String toString() {
62-
return DateFormat.getDateTimeInstance().format(timestamp) + ": " + name + " -> " + state.toString();
69+
return DateFormat.getDateTimeInstance().format(getTimestamp()) + ": " + name + " -> " + state.toString();
6370
}
6471
}

bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/db/JdbcBaseDAO.java

+9-10
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ public List<HistoricItem> doGetHistItemFilterQuery(Item item, FilterCriteria fil
475475
String itemName = item.getName();
476476
Unit<? extends Quantity<?>> unit = item instanceof NumberItem numberItem ? numberItem.getUnit() : null;
477477
return m.stream()
478-
.map(o -> new JdbcHistoricItem(itemName, objectAsState(item, unit, o[1]), objectAsZonedDateTime(o[0])))
478+
.map(o -> new JdbcHistoricItem(itemName, objectAsState(item, unit, o[1]), objectAsInstant(o[0])))
479479
.collect(Collectors.<HistoricItem> toList());
480480
}
481481

@@ -684,7 +684,7 @@ protected State objectAsState(Item item, @Nullable Unit<? extends Quantity<?>> u
684684
}
685685
return unit == null ? DecimalType.valueOf(objectAsString(v)) : QuantityType.valueOf(objectAsString(v));
686686
} else if (item instanceof DateTimeItem) {
687-
return new DateTimeType(objectAsZonedDateTime(v));
687+
return new DateTimeType(objectAsInstant(v).atZone(ZoneId.systemDefault()));
688688
} else if (item instanceof ColorItem) {
689689
return HSBType.valueOf(objectAsString(v));
690690
} else if (item instanceof DimmerItem || item instanceof RollershutterItem) {
@@ -710,20 +710,19 @@ protected State objectAsState(Item item, @Nullable Unit<? extends Quantity<?>> u
710710
}
711711
}
712712

713-
protected ZonedDateTime objectAsZonedDateTime(Object v) {
713+
protected Instant objectAsInstant(Object v) {
714714
if (v instanceof Long) {
715-
return ZonedDateTime.ofInstant(Instant.ofEpochMilli(((Number) v).longValue()), ZoneId.systemDefault());
715+
return Instant.ofEpochMilli(((Number) v).longValue());
716716
} else if (v instanceof java.sql.Date objectAsDate) {
717-
return ZonedDateTime.ofInstant(Instant.ofEpochMilli(objectAsDate.getTime()), ZoneId.systemDefault());
717+
return Instant.ofEpochMilli(objectAsDate.getTime());
718718
} else if (v instanceof LocalDateTime objectAsLocalDateTime) {
719-
return objectAsLocalDateTime.atZone(ZoneId.systemDefault());
719+
return objectAsLocalDateTime.atZone(ZoneId.systemDefault()).toInstant();
720720
} else if (v instanceof Instant objectAsInstant) {
721-
return objectAsInstant.atZone(ZoneId.systemDefault());
721+
return objectAsInstant;
722722
} else if (v instanceof java.sql.Timestamp objectAsTimestamp) {
723-
return objectAsTimestamp.toInstant().atZone(ZoneId.systemDefault());
723+
return objectAsTimestamp.toInstant();
724724
} else if (v instanceof java.lang.String objectAsString) {
725-
return ZonedDateTime.ofInstant(java.sql.Timestamp.valueOf(objectAsString).toInstant(),
726-
ZoneId.systemDefault());
725+
return java.sql.Timestamp.valueOf(objectAsString).toInstant();
727726
}
728727
throw new UnsupportedOperationException("Date of type '" + v.getClass().getName() + "' is not supported");
729728
}

bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/db/JdbcOracleDAO.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
package org.openhab.persistence.jdbc.internal.db;
1414

1515
import java.sql.SQLException;
16+
import java.time.Instant;
1617
import java.time.ZoneId;
1718
import java.time.ZonedDateTime;
1819
import java.util.List;
@@ -287,16 +288,16 @@ protected String resolveTimeFilter(FilterCriteria filter, ZoneId timeZone) {
287288
}
288289

289290
@Override
290-
protected ZonedDateTime objectAsZonedDateTime(Object v) {
291+
protected Instant objectAsInstant(Object v) {
291292
if (v instanceof TIMESTAMP objectAsOracleTimestamp) {
292293
try {
293-
return objectAsOracleTimestamp.timestampValue().toInstant().atZone(ZoneId.systemDefault());
294+
return objectAsOracleTimestamp.timestampValue().toInstant();
294295
} catch (SQLException e) {
295296
throw new UnsupportedOperationException("Date of type '" + v.getClass().getName()
296297
+ "', no Timestamp representation exists for '" + objectAsOracleTimestamp.toString() + "'");
297298
}
298299
} else {
299-
return super.objectAsZonedDateTime(v);
300+
return super.objectAsInstant(v);
300301
}
301302
}
302303
}

bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/dto/JdbcHistoricItem.java

+12-5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
*/
1313
package org.openhab.persistence.jdbc.internal.dto;
1414

15+
import java.time.Instant;
16+
import java.time.ZoneId;
1517
import java.time.ZonedDateTime;
1618

1719
import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -28,12 +30,12 @@ public class JdbcHistoricItem implements HistoricItem {
2830

2931
private final String name;
3032
private final State state;
31-
private final ZonedDateTime timestamp;
33+
private final Instant instant;
3234

33-
public JdbcHistoricItem(String name, State state, ZonedDateTime timestamp) {
35+
public JdbcHistoricItem(String name, State state, Instant instant) {
3436
this.name = name;
3537
this.state = state;
36-
this.timestamp = timestamp;
38+
this.instant = instant;
3739
}
3840

3941
@Override
@@ -48,7 +50,12 @@ public State getState() {
4850

4951
@Override
5052
public ZonedDateTime getTimestamp() {
51-
return timestamp;
53+
return instant.atZone(ZoneId.systemDefault());
54+
}
55+
56+
@Override
57+
public Instant getInstant() {
58+
return instant;
5259
}
5360

5461
@Override
@@ -59,7 +66,7 @@ public String toString() {
5966
builder.append(", state=");
6067
builder.append(state);
6168
builder.append(", timestamp=");
62-
builder.append(timestamp);
69+
builder.append(getTimestamp());
6370
builder.append("]");
6471
return builder.toString();
6572
}

bundles/org.openhab.persistence.jpa/src/main/java/org/openhab/persistence/jpa/internal/JpaHistoricItem.java

+11-6
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ public class JpaHistoricItem implements HistoricItem {
6161

6262
private final String name;
6363
private final State state;
64-
private final ZonedDateTime timestamp;
64+
private final Instant instant;
6565

66-
public JpaHistoricItem(String name, State state, ZonedDateTime timestamp) {
66+
public JpaHistoricItem(String name, State state, Instant instant) {
6767
this.name = name;
6868
this.state = state;
69-
this.timestamp = timestamp;
69+
this.instant = instant;
7070
}
7171

7272
@Override
@@ -76,7 +76,12 @@ public String getName() {
7676

7777
@Override
7878
public ZonedDateTime getTimestamp() {
79-
return timestamp;
79+
return instant.atZone(ZoneId.systemDefault());
80+
}
81+
82+
@Override
83+
public Instant getInstant() {
84+
return instant;
8085
}
8186

8287
@Override
@@ -86,7 +91,7 @@ public State getState() {
8691

8792
@Override
8893
public String toString() {
89-
return DateFormat.getDateTimeInstance().format(timestamp) + ": " + name + " -> " + state.toString();
94+
return DateFormat.getDateTimeInstance().format(getTimestamp()) + ": " + name + " -> " + state;
9095
}
9196

9297
/**
@@ -156,6 +161,6 @@ public static List<HistoricItem> fromResultList(List<JpaPersistentItem> jpaQuery
156161
state = new StringType(pItem.getValue());
157162
}
158163

159-
return new JpaHistoricItem(item.getName(), state, pItem.getTimestamp());
164+
return new JpaHistoricItem(item.getName(), state, pItem.getInstant());
160165
}
161166
}

bundles/org.openhab.persistence.jpa/src/main/java/org/openhab/persistence/jpa/internal/model/JpaPersistentItem.java

+6
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
package org.openhab.persistence.jpa.internal.model;
1414

1515
import java.text.DateFormat;
16+
import java.time.Instant;
1617
import java.time.ZoneId;
1718
import java.time.ZonedDateTime;
1819
import java.util.Date;
@@ -88,6 +89,11 @@ public void setTimestamp(Date timestamp) {
8889
this.timestamp = timestamp;
8990
}
9091

92+
@Override
93+
public Instant getInstant() {
94+
return timestamp.toInstant();
95+
}
96+
9197
public String getValue() {
9298
return value;
9399
}

bundles/org.openhab.persistence.mapdb/src/main/java/org/openhab/persistence/mapdb/internal/MapDbItem.java

+6
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
package org.openhab.persistence.mapdb.internal;
1414

1515
import java.text.DateFormat;
16+
import java.time.Instant;
1617
import java.time.ZoneId;
1718
import java.time.ZonedDateTime;
1819
import java.util.Date;
@@ -64,6 +65,11 @@ public void setTimestamp(Date timestamp) {
6465
this.timestamp = timestamp;
6566
}
6667

68+
@Override
69+
public Instant getInstant() {
70+
return timestamp.toInstant();
71+
}
72+
6773
@Override
6874
public String toString() {
6975
return DateFormat.getDateTimeInstance().format(timestamp) + ": " + name + " -> " + state.toString();

bundles/org.openhab.persistence.mongodb/src/main/java/org/openhab/persistence/mongodb/internal/MongoDBItem.java

+13-6
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
package org.openhab.persistence.mongodb.internal;
1414

1515
import java.text.DateFormat;
16+
import java.time.Instant;
17+
import java.time.ZoneId;
1618
import java.time.ZonedDateTime;
1719
import java.util.Date;
1820

@@ -30,12 +32,12 @@ public class MongoDBItem implements HistoricItem {
3032

3133
private final String name;
3234
private final State state;
33-
private final ZonedDateTime timestamp;
35+
private final Instant instant;
3436

35-
public MongoDBItem(String name, State state, ZonedDateTime timestamp) {
37+
public MongoDBItem(String name, State state, Instant instant) {
3638
this.name = name;
3739
this.state = state;
38-
this.timestamp = timestamp;
40+
this.instant = instant;
3941
}
4042

4143
@Override
@@ -50,12 +52,17 @@ public State getState() {
5052

5153
@Override
5254
public ZonedDateTime getTimestamp() {
53-
return timestamp;
55+
return instant.atZone(ZoneId.systemDefault());
56+
}
57+
58+
@Override
59+
public Instant getInstant() {
60+
return instant;
5461
}
5562

5663
@Override
5764
public String toString() {
58-
Date date = Date.from(timestamp.toInstant());
59-
return DateFormat.getDateTimeInstance().format(date) + ": " + name + " -> " + state.toString();
65+
Date date = Date.from(instant);
66+
return DateFormat.getDateTimeInstance().format(date) + ": " + name + " -> " + state;
6067
}
6168
}

bundles/org.openhab.persistence.mongodb/src/main/java/org/openhab/persistence/mongodb/internal/MongoDBPersistenceService.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
*/
1313
package org.openhab.persistence.mongodb.internal;
1414

15-
import java.time.ZoneId;
1615
import java.time.ZonedDateTime;
1716
import java.util.ArrayList;
1817
import java.util.Collections;
@@ -287,8 +286,7 @@ public Iterable<HistoricItem> query(FilterCriteria filter) {
287286

288287
final State state = MongoDBTypeConversions.getStateFromDocument(item, obj);
289288

290-
items.add(new MongoDBItem(realItemName, state, ZonedDateTime
291-
.ofInstant(obj.getDate(MongoDBFields.FIELD_TIMESTAMP).toInstant(), ZoneId.systemDefault())));
289+
items.add(new MongoDBItem(realItemName, state, obj.getDate(MongoDBFields.FIELD_TIMESTAMP).toInstant()));
292290
}
293291
} finally {
294292
if (cursor != null) {

0 commit comments

Comments
 (0)