From 57c716bf80a3f55f113aad1a727a48321866a22c Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Thu, 24 Jun 2021 18:34:24 +0200 Subject: [PATCH] Create a deep copy of the first found fragment before merging other fragments into it (#2412) Signed-off-by: Christoph Weitkamp --- .../core/internal/service/StateDescriptionServiceImpl.java | 3 ++- .../internal/service/StateDescriptionServiceImplTest.java | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/bundles/org.openhab.core/src/main/java/org/openhab/core/internal/service/StateDescriptionServiceImpl.java b/bundles/org.openhab.core/src/main/java/org/openhab/core/internal/service/StateDescriptionServiceImpl.java index ddff2eba3..a8a7bff0d 100644 --- a/bundles/org.openhab.core/src/main/java/org/openhab/core/internal/service/StateDescriptionServiceImpl.java +++ b/bundles/org.openhab.core/src/main/java/org/openhab/core/internal/service/StateDescriptionServiceImpl.java @@ -75,7 +75,8 @@ public class StateDescriptionServiceImpl implements StateDescriptionService { // we pick up the first valid StateDescriptionFragment here: if (result == null) { - result = (StateDescriptionFragmentImpl) fragment; + // create a deep copy of the first found fragment before merging other fragments into it + result = new StateDescriptionFragmentImpl((StateDescriptionFragmentImpl) fragment); } else { result.merge(fragment); } diff --git a/bundles/org.openhab.core/src/test/java/org/openhab/core/internal/service/StateDescriptionServiceImplTest.java b/bundles/org.openhab.core/src/test/java/org/openhab/core/internal/service/StateDescriptionServiceImplTest.java index 039d48984..de3f4a25c 100644 --- a/bundles/org.openhab.core/src/test/java/org/openhab/core/internal/service/StateDescriptionServiceImplTest.java +++ b/bundles/org.openhab.core/src/test/java/org/openhab/core/internal/service/StateDescriptionServiceImplTest.java @@ -114,7 +114,7 @@ public class StateDescriptionServiceImplTest { StateDescription stateDescription = item.getStateDescription(); - assertThat(stateDescription.isReadOnly(), is(stateDescriptionFragment1.isReadOnly())); + assertThat(stateDescription.isReadOnly(), is(stateDescriptionFragment2.isReadOnly())); } @Test @@ -167,8 +167,7 @@ public class StateDescriptionServiceImplTest { .withMinimum(BigDecimal.ZERO) // .withMaximum(BigDecimal.TEN) // .withPattern("pattern") // - .withReadOnly(Boolean.TRUE) // - .withOptions(options).build(); + .withReadOnly(Boolean.TRUE).build(); registerStateDescriptionFragmentProvider(stateDescriptionFragment1, -1); StateDescriptionFragment stateDescriptionFragment2 = StateDescriptionFragmentBuilder.create() @@ -187,6 +186,8 @@ public class StateDescriptionServiceImplTest { assertThat(stateDescription.getPattern(), is("pattern")); assertThat(stateDescription.isReadOnly(), is(true)); assertThat(stateDescription.getOptions(), is(options)); + // check that fragement2 is not merged into fragement1 + assertThat(stateDescriptionFragment1.getOptions().size(), is(0)); } private void registerStateDescriptionFragmentProvider(StateDescriptionFragment stateDescriptionFragment,