13
13
package org .openhab .core .io .rest .core .internal .item ;
14
14
15
15
import java .time .Instant ;
16
+ import java .time .ZoneId ;
16
17
import java .time .temporal .ChronoUnit ;
17
18
import java .util .ArrayList ;
18
19
import java .util .Arrays ;
57
58
import org .openhab .core .auth .Role ;
58
59
import org .openhab .core .common .registry .RegistryChangedRunnableListener ;
59
60
import org .openhab .core .events .EventPublisher ;
61
+ import org .openhab .core .i18n .TimeZoneProvider ;
60
62
import org .openhab .core .io .rest .DTOMapper ;
61
63
import org .openhab .core .io .rest .JSONResponse ;
62
64
import org .openhab .core .io .rest .LocaleService ;
@@ -180,6 +182,7 @@ private static void respectForwarded(final UriBuilder uriBuilder, final @Context
180
182
private final MetadataRegistry metadataRegistry ;
181
183
private final MetadataSelectorMatcher metadataSelectorMatcher ;
182
184
private final SemanticTagRegistry semanticTagRegistry ;
185
+ private final TimeZoneProvider timeZoneProvider ;
183
186
184
187
private final RegistryChangedRunnableListener <Item > resetLastModifiedItemChangeListener = new RegistryChangedRunnableListener <>(
185
188
() -> lastModified = null );
@@ -198,7 +201,8 @@ public ItemResource(//
198
201
final @ Reference ManagedItemProvider managedItemProvider ,
199
202
final @ Reference MetadataRegistry metadataRegistry ,
200
203
final @ Reference MetadataSelectorMatcher metadataSelectorMatcher ,
201
- final @ Reference SemanticTagRegistry semanticTagRegistry ) {
204
+ final @ Reference SemanticTagRegistry semanticTagRegistry ,
205
+ final @ Reference TimeZoneProvider timeZoneProvider ) {
202
206
this .dtoMapper = dtoMapper ;
203
207
this .eventPublisher = eventPublisher ;
204
208
this .itemBuilderFactory = itemBuilderFactory ;
@@ -208,6 +212,7 @@ public ItemResource(//
208
212
this .metadataRegistry = metadataRegistry ;
209
213
this .metadataSelectorMatcher = metadataSelectorMatcher ;
210
214
this .semanticTagRegistry = semanticTagRegistry ;
215
+ this .timeZoneProvider = timeZoneProvider ;
211
216
212
217
this .itemRegistry .addRegistryChangeListener (resetLastModifiedItemChangeListener );
213
218
this .metadataRegistry .addRegistryChangeListener (resetLastModifiedMetadataChangeListener );
@@ -240,6 +245,7 @@ public Response getItems(final @Context UriInfo uriInfo, final @Context HttpHead
240
245
@ QueryParam ("fields" ) @ Parameter (description = "limit output to the given fields (comma separated)" ) @ Nullable String fields ,
241
246
@ DefaultValue ("false" ) @ QueryParam ("staticDataOnly" ) @ Parameter (description = "provides a cacheable list of values not expected to change regularly and checks the If-Modified-Since header, all other parameters are ignored except \" metadata\" " ) boolean staticDataOnly ) {
242
247
final Locale locale = localeService .getLocale (language );
248
+ final ZoneId zoneId = timeZoneProvider .getTimeZone ();
243
249
final Set <String > namespaces = splitAndFilterNamespaces (namespaceSelector , locale );
244
250
245
251
final UriBuilder uriBuilder = uriBuilder (uriInfo , httpHeaders );
@@ -256,7 +262,7 @@ public Response getItems(final @Context UriInfo uriInfo, final @Context HttpHead
256
262
}
257
263
258
264
Stream <EnrichedItemDTO > itemStream = getItems (type , tags ).stream () //
259
- .map (item -> EnrichedItemDTOMapper .map (item , false , null , uriBuilder , locale )) //
265
+ .map (item -> EnrichedItemDTOMapper .map (item , false , null , uriBuilder , locale , zoneId )) //
260
266
.peek (dto -> addMetadata (dto , namespaces , null )) //
261
267
.peek (dto -> dto .editable = isEditable (dto .name ));
262
268
itemStream = dtoMapper .limitToFields (itemStream ,
@@ -267,7 +273,7 @@ public Response getItems(final @Context UriInfo uriInfo, final @Context HttpHead
267
273
}
268
274
269
275
Stream <EnrichedItemDTO > itemStream = getItems (type , tags ).stream () //
270
- .map (item -> EnrichedItemDTOMapper .map (item , recursive , null , uriBuilder , locale )) //
276
+ .map (item -> EnrichedItemDTOMapper .map (item , recursive , null , uriBuilder , locale , zoneId )) //
271
277
.peek (dto -> addMetadata (dto , namespaces , null )) //
272
278
.peek (dto -> dto .editable = isEditable (dto .name )) //
273
279
.peek (dto -> {
@@ -318,6 +324,7 @@ public Response getItemByName(final @Context UriInfo uriInfo, final @Context Htt
318
324
@ DefaultValue ("true" ) @ QueryParam ("recursive" ) @ Parameter (description = "get member items if the item is a group item" ) boolean recursive ,
319
325
@ PathParam ("itemname" ) @ Parameter (description = "item name" ) String itemname ) {
320
326
final Locale locale = localeService .getLocale (language );
327
+ final ZoneId zoneId = timeZoneProvider .getTimeZone ();
321
328
final Set <String > namespaces = splitAndFilterNamespaces (namespaceSelector , locale );
322
329
323
330
// get item
@@ -326,7 +333,7 @@ public Response getItemByName(final @Context UriInfo uriInfo, final @Context Htt
326
333
// if it exists
327
334
if (item != null ) {
328
335
EnrichedItemDTO dto = EnrichedItemDTOMapper .map (item , recursive , null , uriBuilder (uriInfo , httpHeaders ),
329
- locale );
336
+ locale , zoneId );
330
337
addMetadata (dto , namespaces , null );
331
338
dto .editable = isEditable (dto .name );
332
339
if (dto instanceof EnrichedGroupItemDTO enrichedGroupItemDTO ) {
@@ -424,6 +431,7 @@ public Response putItemState(
424
431
@ PathParam ("itemname" ) @ Parameter (description = "item name" ) String itemname ,
425
432
@ Parameter (description = "valid item state (e.g. ON, OFF)" , required = true ) String value ) {
426
433
final Locale locale = localeService .getLocale (language );
434
+ final ZoneId zoneId = timeZoneProvider .getTimeZone ();
427
435
428
436
// get Item
429
437
Item item = getItem (itemname );
@@ -436,7 +444,7 @@ public Response putItemState(
436
444
if (state != null ) {
437
445
// set State and report OK
438
446
eventPublisher .post (ItemEventFactory .createStateEvent (itemname , state ));
439
- return getItemResponse (null , Status .ACCEPTED , null , locale , null );
447
+ return getItemResponse (null , Status .ACCEPTED , null , locale , zoneId , null );
440
448
} else {
441
449
// State could not be parsed
442
450
return JSONResponse .createErrorResponse (Status .BAD_REQUEST , "State could not be parsed: " + value );
@@ -739,6 +747,7 @@ public Response createOrUpdateItem(final @Context UriInfo uriInfo, final @Contex
739
747
@ PathParam ("itemname" ) @ Parameter (description = "item name" ) String itemname ,
740
748
@ Parameter (description = "item data" , required = true ) @ Nullable GroupItemDTO item ) {
741
749
final Locale locale = localeService .getLocale (language );
750
+ final ZoneId zoneId = timeZoneProvider .getTimeZone ();
742
751
743
752
// If we didn't get an item bean, then return!
744
753
if (item == null ) {
@@ -763,12 +772,12 @@ public Response createOrUpdateItem(final @Context UriInfo uriInfo, final @Contex
763
772
// item does not yet exist, create it
764
773
managedItemProvider .add (newItem );
765
774
return getItemResponse (uriBuilder (uriInfo , httpHeaders ), Status .CREATED , itemRegistry .get (itemname ),
766
- locale , null );
775
+ locale , zoneId , null );
767
776
} else if (managedItemProvider .get (itemname ) != null ) {
768
777
// item already exists as a managed item, update it
769
778
managedItemProvider .update (newItem );
770
779
return getItemResponse (uriBuilder (uriInfo , httpHeaders ), Status .OK , itemRegistry .get (itemname ), locale ,
771
- null );
780
+ zoneId , null );
772
781
} else {
773
782
// Item exists but cannot be updated
774
783
logger .warn ("Cannot update existing item '{}', because is not managed." , itemname );
@@ -872,7 +881,8 @@ public Response getSemanticItem(final @Context UriInfo uriInfo, final @Context H
872
881
@ HeaderParam (HttpHeaders .ACCEPT_LANGUAGE ) @ Parameter (description = "language" ) @ Nullable String language ,
873
882
@ PathParam ("itemName" ) @ Parameter (description = "item name" ) String itemName ,
874
883
@ PathParam ("semanticClass" ) @ Parameter (description = "semantic class" ) String semanticClassName ) {
875
- Locale locale = localeService .getLocale (language );
884
+ final Locale locale = localeService .getLocale (language );
885
+ final ZoneId zoneId = timeZoneProvider .getTimeZone ();
876
886
877
887
Class <? extends org .openhab .core .semantics .Tag > semanticClass = semanticTagRegistry
878
888
.getTagClassById (semanticClassName );
@@ -886,7 +896,7 @@ public Response getSemanticItem(final @Context UriInfo uriInfo, final @Context H
886
896
}
887
897
888
898
EnrichedItemDTO dto = EnrichedItemDTOMapper .map (foundItem , false , null , uriBuilder (uriInfo , httpHeaders ),
889
- locale );
899
+ locale , zoneId );
890
900
dto .editable = isEditable (dto .name );
891
901
return JSONResponse .createResponse (Status .OK , dto , null );
892
902
}
@@ -935,8 +945,8 @@ private static Response getItemNotFoundResponse(String itemname) {
935
945
* @return Response configured to represent the Item in depending on the status
936
946
*/
937
947
private Response getItemResponse (final @ Nullable UriBuilder uriBuilder , Status status , @ Nullable Item item ,
938
- Locale locale , @ Nullable String errormessage ) {
939
- Object entity = null != item ? EnrichedItemDTOMapper .map (item , true , null , uriBuilder , locale ) : null ;
948
+ Locale locale , ZoneId zoneId , @ Nullable String errormessage ) {
949
+ Object entity = null != item ? EnrichedItemDTOMapper .map (item , true , null , uriBuilder , locale , zoneId ) : null ;
940
950
return JSONResponse .createResponse (status , entity , errormessage );
941
951
}
942
952
0 commit comments