]> git.basschouten.com Git - openhab-addons.git/commitdiff
[dynamodb] Changes required after API changes in core framework (#14966)
authorlolodomo <lg.hc@free.fr>
Wed, 10 May 2023 16:13:01 +0000 (18:13 +0200)
committerGitHub <noreply@github.com>
Wed, 10 May 2023 16:13:01 +0000 (18:13 +0200)
Changes in openhab/openhab-core#3481 broke this service due to an
breaking API change in NumberItem class (constructor).

Related to openhab/openhab-core#3600

Signed-off-by: Laurent Garnier <lg.hc@free.fr>
bundles/org.openhab.persistence.dynamodb/src/main/java/org/openhab/persistence/dynamodb/internal/DynamoDBPersistenceService.java
bundles/org.openhab.persistence.dynamodb/src/main/java/org/openhab/persistence/dynamodb/internal/DynamoDBQueryUtils.java
bundles/org.openhab.persistence.dynamodb/src/test/java/org/openhab/persistence/dynamodb/internal/BaseIntegrationTest.java

index 5e58c2e5d32578f6d250176a280ae87b81b55b72..35ad9f4c55c8f37f6467aa15fb4582d978dc38b2 100644 (file)
@@ -36,6 +36,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.core.common.ThreadPoolManager;
 import org.openhab.core.config.core.ConfigurableService;
+import org.openhab.core.i18n.UnitProvider;
 import org.openhab.core.items.GenericItem;
 import org.openhab.core.items.GroupItem;
 import org.openhab.core.items.Item;
@@ -103,7 +104,8 @@ public class DynamoDBPersistenceService implements QueryablePersistenceService {
 
     private static final String DYNAMODB_THREADPOOL_NAME = "dynamodbPersistenceService";
 
-    private ItemRegistry itemRegistry;
+    private final ItemRegistry itemRegistry;
+    private final UnitProvider unitProvider;
     private @Nullable DynamoDbEnhancedAsyncClient client;
     private @Nullable DynamoDbAsyncClient lowLevelClient;
     private static final Logger logger = LoggerFactory.getLogger(DynamoDBPersistenceService.class);
@@ -131,15 +133,19 @@ public class DynamoDBPersistenceService implements QueryablePersistenceService {
     }
 
     @Activate
-    public DynamoDBPersistenceService(final @Reference ItemRegistry itemRegistry) {
+    public DynamoDBPersistenceService(final @Reference ItemRegistry itemRegistry,
+            final @Reference UnitProvider unitProvider) {
         this.itemRegistry = itemRegistry;
+        this.unitProvider = unitProvider;
     }
 
     /**
      * For tests
      */
-    DynamoDBPersistenceService(final ItemRegistry itemRegistry, @Nullable URI endpointOverride) {
+    DynamoDBPersistenceService(final ItemRegistry itemRegistry, final UnitProvider unitProvider,
+            @Nullable URI endpointOverride) {
         this.itemRegistry = itemRegistry;
+        this.unitProvider = unitProvider;
         this.endpointOverride = endpointOverride;
     }
 
@@ -414,7 +420,7 @@ public class DynamoDBPersistenceService implements QueryablePersistenceService {
                     item.getClass().getSimpleName(), dtoClass.getSimpleName(), tableName);
 
             QueryEnhancedRequest queryExpression = DynamoDBQueryUtils.createQueryExpression(dtoClass,
-                    localTableNameResolver.getTableSchema(), item, filter);
+                    localTableNameResolver.getTableSchema(), item, filter, unitProvider);
 
             CompletableFuture<List<DynamoDBItem<?>>> itemsFuture = new CompletableFuture<>();
             final SdkPublisher<? extends DynamoDBItem<?>> itemPublisher = table.query(queryExpression).items();
@@ -523,7 +529,7 @@ public class DynamoDBPersistenceService implements QueryablePersistenceService {
 
         // We do not want to rely item.state since async context below can execute much later.
         // We 'copy' the item for local use. copyItem also normalizes the unit with NumberItems.
-        final GenericItem copiedItem = copyItem(itemTemplate, item, effectiveName, null);
+        final GenericItem copiedItem = copyItem(itemTemplate, item, effectiveName, null, unitProvider);
 
         resolveTableSchema().thenAcceptAsync(resolved -> {
             if (!resolved) {
@@ -613,15 +619,18 @@ public class DynamoDBPersistenceService implements QueryablePersistenceService {
      * @param item item that is used to acquire name and state
      * @param nameOverride name override for the resulting copy
      * @param stateOverride state override for the resulting copy
+     * @param unitProvider the unit provider for number with dimension
      * @throws IllegalArgumentException when state is QuantityType and not compatible with item
      */
     static GenericItem copyItem(Item itemTemplate, Item item, @Nullable String nameOverride,
-            @Nullable State stateOverride) {
+            @Nullable State stateOverride, UnitProvider unitProvider) {
         final GenericItem copiedItem;
         try {
             if (itemTemplate instanceof NumberItem) {
-                copiedItem = (GenericItem) itemTemplate.getClass().getDeclaredConstructor(String.class, String.class)
-                        .newInstance(itemTemplate.getType(), nameOverride == null ? item.getName() : nameOverride);
+                copiedItem = (GenericItem) itemTemplate.getClass()
+                        .getDeclaredConstructor(String.class, String.class, UnitProvider.class)
+                        .newInstance(itemTemplate.getType(), nameOverride == null ? item.getName() : nameOverride,
+                                unitProvider);
             } else {
                 copiedItem = (GenericItem) itemTemplate.getClass().getDeclaredConstructor(String.class)
                         .newInstance(nameOverride == null ? item.getName() : nameOverride);
index fa86f9a098fb36bf28f659ee37fccfb8f8fbe8fe..58a0d5cd54d9783d742ff37311424816b5ca3665 100644 (file)
@@ -17,6 +17,7 @@ import java.time.ZonedDateTime;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.core.i18n.UnitProvider;
 import org.openhab.core.items.GenericItem;
 import org.openhab.core.items.Item;
 import org.openhab.core.persistence.FilterCriteria;
@@ -45,10 +46,11 @@ public class DynamoDBQueryUtils {
      * @param item item corresponding to filter
      * @param filter filter for the query
      * @return DynamoDBQueryExpression corresponding to the given FilterCriteria
+     * @param unitProvider the unit provider for number with dimension
      * @throws IllegalArgumentException when schema is not fully resolved
      */
     public static QueryEnhancedRequest createQueryExpression(Class<? extends DynamoDBItem<?>> dtoClass,
-            ExpectedTableSchema expectedTableSchema, Item item, FilterCriteria filter) {
+            ExpectedTableSchema expectedTableSchema, Item item, FilterCriteria filter, UnitProvider unitProvider) {
         if (!expectedTableSchema.isFullyResolved()) {
             throw new IllegalArgumentException("Schema not resolved");
         }
@@ -59,7 +61,7 @@ public class DynamoDBQueryUtils {
             throw new IllegalArgumentException("Item name not set");
         }
         addFilterbyItemAndTimeFilter(queryBuilder, expectedTableSchema, itemName, filter);
-        addStateFilter(queryBuilder, expectedTableSchema, item, dtoClass, filter);
+        addStateFilter(queryBuilder, expectedTableSchema, item, dtoClass, filter, unitProvider);
         addProjection(dtoClass, expectedTableSchema, queryBuilder);
         return queryBuilder.build();
     }
@@ -94,7 +96,7 @@ public class DynamoDBQueryUtils {
 
     private static void addStateFilter(QueryEnhancedRequest.Builder queryBuilder,
             ExpectedTableSchema expectedTableSchema, Item item, Class<? extends DynamoDBItem<?>> dtoClass,
-            FilterCriteria filter) {
+            FilterCriteria filter, UnitProvider unitProvider) {
         final Expression expression;
         Builder itemStateTypeExpressionBuilder = Expression.builder()
                 .expression(String.format("attribute_exists(#attr)"));
@@ -123,7 +125,7 @@ public class DynamoDBQueryUtils {
             // Following will throw IllegalArgumentException when filter state is not compatible with
             // item. This is acceptable.
             GenericItem stateToFind = DynamoDBPersistenceService.copyItem(item, item, filter.getItemName(),
-                    filter.getState());
+                    filter.getState(), unitProvider);
             acceptAsDTO(stateToFind, legacy, new DynamoDBItemVisitor<@Nullable Void>() {
                 @Override
                 public @Nullable Void visit(DynamoDBStringItem serialized) {
index f3e5d38bdec68dd99467c74aca457138ebd2321d..f975a38646ac7197c94dc8e9c32b0cabe292fb5c 100644 (file)
@@ -39,7 +39,6 @@ import org.mockito.Mockito;
 import org.openhab.core.common.registry.RegistryChangeListener;
 import org.openhab.core.i18n.UnitProvider;
 import org.openhab.core.internal.i18n.I18nProviderImpl;
-import org.openhab.core.items.GenericItem;
 import org.openhab.core.items.GroupItem;
 import org.openhab.core.items.Item;
 import org.openhab.core.items.ItemNotFoundException;
@@ -147,12 +146,12 @@ public class BaseIntegrationTest extends JavaTest {
         ITEMS.put("dimmer", new DimmerItem("dimmer"));
         ITEMS.put("number", new NumberItem("number"));
 
-        NumberItem temperatureItem = new NumberItem("Number:Temperature", "numberTemperature");
+        NumberItem temperatureItem = new NumberItem("Number:Temperature", "numberTemperature", UNIT_PROVIDER);
         ITEMS.put("numberTemperature", temperatureItem);
         GroupItem groupTemperature = new GroupItem("groupNumberTemperature", temperatureItem);
         ITEMS.put("groupNumberTemperature", groupTemperature);
 
-        NumberItem dimensionlessItem = new NumberItem("Number:Dimensionless", "numberDimensionless");
+        NumberItem dimensionlessItem = new NumberItem("Number:Dimensionless", "numberDimensionless", UNIT_PROVIDER);
         ITEMS.put("numberDimensionless", dimensionlessItem);
         GroupItem groupDimensionless = new GroupItem("groupNumberDimensionless", dimensionlessItem);
         ITEMS.put("groupNumberDimensionless", groupDimensionless);
@@ -170,8 +169,6 @@ public class BaseIntegrationTest extends JavaTest {
         ITEMS.put("location", new LocationItem("location"));
         ITEMS.put("player_playpause", new PlayerItem("player_playpause"));
         ITEMS.put("player_rewindfastforward", new PlayerItem("player_rewindfastforward"));
-
-        injectItemServices();
     }
 
     @BeforeAll
@@ -248,7 +245,6 @@ public class BaseIntegrationTest extends JavaTest {
                 if (item == null) {
                     throw new ItemNotFoundException(name);
                 }
-                injectItemServices(item);
                 return item;
             }
 
@@ -326,23 +322,12 @@ public class BaseIntegrationTest extends JavaTest {
             public void removeRegistryHook(RegistryHook<Item> hook) {
                 throw new UnsupportedOperationException();
             }
-        }, localEndpointOverride);
+        }, UNIT_PROVIDER, localEndpointOverride);
 
         service.activate(null, config);
         return service;
     }
 
-    protected static void injectItemServices() {
-        ITEMS.values().forEach(BaseIntegrationTest::injectItemServices);
-    }
-
-    protected static void injectItemServices(Item item) {
-        if (item instanceof GenericItem) {
-            GenericItem genericItem = (GenericItem) item;
-            genericItem.setUnitProvider(UNIT_PROVIDER);
-        }
-    }
-
     private static Map<String, Object> getConfig(@Nullable Boolean legacy, @Nullable String table,
             @Nullable String tablePrefix) {
         Map<String, Object> config = new HashMap<>();