diff --git a/bundles/org.openhab.core.model.yaml/src/main/java/org/openhab/core/model/yaml/internal/items/fileconverter/YamlItemConverter.java b/bundles/org.openhab.core.model.yaml/src/main/java/org/openhab/core/model/yaml/internal/items/fileconverter/YamlItemConverter.java index d4879108439..a827cf62cda 100644 --- a/bundles/org.openhab.core.model.yaml/src/main/java/org/openhab/core/model/yaml/internal/items/fileconverter/YamlItemConverter.java +++ b/bundles/org.openhab.core.model.yaml/src/main/java/org/openhab/core/model/yaml/internal/items/fileconverter/YamlItemConverter.java @@ -110,14 +110,9 @@ private YamlItemDTO buildItemDTO(Item item, List channelLinks, List channelLinks, List configuration = md.getConfiguration(); - if (configuration.isEmpty()) { - dto.expire = value; // When expire value is empty string, keep it as empty string - } else { - YamlMetadataDTO mdDto = new YamlMetadataDTO(); - mdDto.value = value.isEmpty() ? null : value; - mdDto.config = configuration; - metadataDto.put(namespace, mdDto); - } - } else { - YamlMetadataDTO mdDto = new YamlMetadataDTO(); - mdDto.value = value.isEmpty() ? null : value; - Map configuration = new LinkedHashMap<>(); - String statePattern = null; - for (ConfigParameter param : getConfigurationParameters(md)) { - configuration.put(param.name(), param.value()); - if ("stateDescription".equals(namespace) && "pattern".equals(param.name())) { - statePattern = param.value().toString(); - } + continue; + } + + if ("expire".equals(namespace) && md.getConfiguration().isEmpty()) { + dto.expire = value; // When expire value is empty string, keep it as empty string + continue; + } + + if ("stateDescription".equals(namespace) && (value == null || value.isBlank())) { + Map config = md.getConfiguration(); + + String defaultPattern = getDefaultStatePattern(item); + if (config.isEmpty() && stateFormatter != null && !stateFormatter.equals(defaultPattern)) { + dto.format = stateFormatter; + continue; } - // Ignore state description in case it contains only a state pattern and state pattern was injected - // in field format or is the default pattern - if (!(statePattern != null && configuration.size() == 1 - && (patternSet || statePattern.equals(defaultPattern)))) { - mdDto.config = configuration.isEmpty() ? null : configuration; - metadataDto.put(namespace, mdDto); - if (patternSet && statePattern != null) { - dto.format = null; - } + + if (config.get("pattern") instanceof String pattern && !pattern.isBlank() && config.size() == 1) { + dto.format = pattern; + continue; } } + + YamlMetadataDTO mdDto = new YamlMetadataDTO(); + mdDto.value = value; + Map configuration = new LinkedHashMap<>(); + for (ConfigParameter param : getConfigurationParameters(md)) { + configuration.put(param.name(), param.value()); + } + mdDto.config = configuration.isEmpty() ? null : configuration; + metadataDto.put(namespace, mdDto); } dto.metadata = metadataDto.isEmpty() ? null : metadataDto; diff --git a/bundles/org.openhab.core.model.yaml/src/test/java/org/openhab/core/model/yaml/internal/items/fileconverter/YamlItemConverterTest.java b/bundles/org.openhab.core.model.yaml/src/test/java/org/openhab/core/model/yaml/internal/items/fileconverter/YamlItemConverterTest.java index e02e30db2db..347a60d8551 100644 --- a/bundles/org.openhab.core.model.yaml/src/test/java/org/openhab/core/model/yaml/internal/items/fileconverter/YamlItemConverterTest.java +++ b/bundles/org.openhab.core.model.yaml/src/test/java/org/openhab/core/model/yaml/internal/items/fileconverter/YamlItemConverterTest.java @@ -34,6 +34,7 @@ import org.openhab.core.model.yaml.internal.items.YamlChannelLinkProvider; import org.openhab.core.model.yaml.internal.items.YamlItemDTO; import org.openhab.core.model.yaml.internal.items.YamlItemProvider; +import org.openhab.core.model.yaml.internal.items.YamlMetadataDTO; import org.openhab.core.model.yaml.internal.items.YamlMetadataProvider; @NonNullByDefault @@ -98,6 +99,30 @@ public void testUnitMetadataEmptyStringStaysInShortForm() { assertNull(dto.metadata); } + @Test + public void testStateDescriptionMetadataConvertedToShortForm() { + Metadata stateDescriptionMetadata = new Metadata(new MetadataKey("stateDescription", "item_name"), "", + Map.of("pattern", "%d")); + YamlItemDTO dto = convertWithMetadata(stateDescriptionMetadata, "Number"); + assertEquals("%d", dto.format); + assertNull(dto.metadata); + } + + @Test + public void testStateDescriptionMetadataWithOtherConfigStaysInMetadata() { + Metadata stateDescriptionMetadata = new Metadata(new MetadataKey("stateDescription", "item_name"), "", + Map.of("pattern", "%d", "min", 0, "max", 100)); + YamlItemDTO dto = convertWithMetadata(stateDescriptionMetadata, "Number"); + assertNull(dto.format); + assertNotNull(dto.metadata); + YamlMetadataDTO stateDescDto = dto.metadata.get("stateDescription"); + assertNotNull(stateDescDto); + assertEquals("", stateDescDto.getValue()); + assertEquals("%d", stateDescDto.config.get("pattern")); + assertEquals(0, stateDescDto.config.get("min")); + assertEquals(100, stateDescDto.config.get("max")); + } + private YamlItemDTO convertWithMetadata(Metadata metadata, String itemType) { CapturingYamlModelRepository repository = new CapturingYamlModelRepository(); YamlItemConverter converter = new YamlItemConverter(repository, mock(YamlItemProvider.class),