diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaTarget.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaTarget.java index fd66363be..1ba473819 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaTarget.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaTarget.java @@ -23,6 +23,8 @@ import jakarta.persistence.CascadeType; import jakarta.persistence.CollectionTable; import jakarta.persistence.Column; import jakarta.persistence.ConstraintMode; +import jakarta.persistence.Convert; +import jakarta.persistence.Converter; import jakarta.persistence.ElementCollection; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -48,6 +50,7 @@ import org.eclipse.hawkbit.repository.event.remote.TargetDeletedEvent; import org.eclipse.hawkbit.repository.event.remote.entity.TargetCreatedEvent; import org.eclipse.hawkbit.repository.event.remote.entity.TargetUpdatedEvent; import org.eclipse.hawkbit.repository.jpa.model.helper.SecurityTokenGeneratorHolder; +import org.eclipse.hawkbit.repository.jpa.utils.MapAttributeConverter; import org.eclipse.hawkbit.repository.model.Action; import org.eclipse.hawkbit.repository.model.AutoConfirmationStatus; import org.eclipse.hawkbit.repository.model.DistributionSet; @@ -61,9 +64,6 @@ import org.eclipse.hawkbit.repository.model.helper.EventPublisherHolder; import org.eclipse.hawkbit.repository.model.helper.SystemSecurityContextHolder; import org.eclipse.hawkbit.repository.model.helper.TenantConfigurationManagementHolder; import org.eclipse.hawkbit.security.SystemSecurityContext; -import org.eclipse.persistence.annotations.ConversionValue; -import org.eclipse.persistence.annotations.Convert; -import org.eclipse.persistence.annotations.ObjectTypeConverter; /** * JPA implementation of {@link Target}. @@ -119,14 +119,21 @@ public class JpaTarget extends AbstractJpaNamedEntity implements Target, EventAw @Column(name = "install_date") private Long installationDate; + @Converter + public static class TargetUpdateStatusConverter extends MapAttributeConverter { + + public TargetUpdateStatusConverter() { + super(Map.of( + TargetUpdateStatus.UNKNOWN, 0, + TargetUpdateStatus.IN_SYNC, 1, + TargetUpdateStatus.PENDING, 2, + TargetUpdateStatus.ERROR, 3, + TargetUpdateStatus.REGISTERED, 4 + )); + } + } @Column(name = "update_status", nullable = false) - @ObjectTypeConverter(name = "updateStatus", objectType = TargetUpdateStatus.class, dataType = Integer.class, conversionValues = { - @ConversionValue(objectValue = "UNKNOWN", dataValue = "0"), - @ConversionValue(objectValue = "IN_SYNC", dataValue = "1"), - @ConversionValue(objectValue = "PENDING", dataValue = "2"), - @ConversionValue(objectValue = "ERROR", dataValue = "3"), - @ConversionValue(objectValue = "REGISTERED", dataValue = "4") }) - @Convert("updateStatus") + @Convert(converter = TargetUpdateStatusConverter.class) @NotNull private TargetUpdateStatus updateStatus = TargetUpdateStatus.UNKNOWN; diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ActionTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ActionTest.java index ff33c8d79..fcf334673 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ActionTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ActionTest.java @@ -53,6 +53,7 @@ class ActionTest extends AbstractJpaIntegrationTest { } @Test + @Description("Tests the action type mapping.") void testActionTypeConvert() { final long id = createAction().getId(); for (final ActionType actionType : ActionType.values()) { @@ -66,6 +67,7 @@ class ActionTest extends AbstractJpaIntegrationTest { } @Test + @Description("Tests the status mapping.") void testStatusConvert() { final long id = createAction().getId(); for (final Status status : Status.values()) { @@ -79,6 +81,7 @@ class ActionTest extends AbstractJpaIntegrationTest { } @Test + @Description("Tests the action status status mapping.") void testActionsStatusStatusConvert() { for (final Status status : Status.values()) { final long id = createAction().getId(); diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetManagementTest.java index fefce5375..252d3faaa 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetManagementTest.java @@ -76,6 +76,7 @@ import org.eclipse.hawkbit.repository.model.TargetMetadata; import org.eclipse.hawkbit.repository.model.TargetTag; import org.eclipse.hawkbit.repository.model.TargetType; import org.eclipse.hawkbit.repository.model.TargetTypeAssignmentResult; +import org.eclipse.hawkbit.repository.model.TargetUpdateStatus; import org.eclipse.hawkbit.repository.rsql.RsqlConfigHolder; import org.eclipse.hawkbit.repository.test.matcher.Expect; import org.eclipse.hawkbit.repository.test.matcher.ExpectEvents; @@ -1208,6 +1209,19 @@ class TargetManagementTest extends AbstractJpaIntegrationTest { () -> targetManagement.isTargetMatchingQueryAndDSNotAssignedAndCompatibleAndUpdatable(target, 123, "name==*")); } + @Test + @Description("Test update status convert") + void testUpdateStatusConvert() { + final long id = testdataFactory.createTarget().getId(); + for (final TargetUpdateStatus status : TargetUpdateStatus.values()) { + final JpaTarget target = targetRepository.findById(id).orElseThrow(() -> new IllegalStateException("Target not found")); + target.setUpdateStatus(status); + targetRepository.save(target); + assertThat(targetRepository.findById(target.getId()).orElseThrow(() -> new IllegalStateException("Target not found")) + .getUpdateStatus()).isEqualTo(status); + } + } + @Step private void createAndUpdateTargetWithInvalidDescription(final Target target) {