From 856fb2ad07efa7958ac5ee6c67ec28efa8b02b54 Mon Sep 17 00:00:00 2001 From: Avgustin Marinov Date: Tue, 3 Dec 2024 12:53:24 +0200 Subject: [PATCH] Small refactoring Signed-off-by: Avgustin Marinov --- .../management/JpaConfirmationManagement.java | 3 +- .../jpa/management/JpaTargetManagement.java | 7 ++-- .../repository/jpa/model/JpaTarget.java | 3 +- .../repository/BaseEntityRepositoryACM.java | 4 +-- .../TargetFilterQueryRepository.java | 19 ++++------- .../management/ControllerManagementTest.java | 11 +++--- .../test/matcher/EventVerifier.java | 34 +++++++------------ 7 files changed, 32 insertions(+), 49 deletions(-) diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaConfirmationManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaConfirmationManagement.java index 89f9abc1a0..4c7a306af7 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaConfirmationManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaConfirmationManagement.java @@ -198,8 +198,7 @@ private ActionStatusCreate createConfirmationActionStatus(final long actionId, f } private List giveConfirmationForActiveActions(final AutoConfirmationStatus autoConfirmationStatus) { - final Target target = autoConfirmationStatus.getTarget(); - return findActiveActionsHavingStatus(target.getControllerId(), Status.WAIT_FOR_CONFIRMATION).stream() + return findActiveActionsHavingStatus(autoConfirmationStatus.getTarget().getControllerId(), Status.WAIT_FOR_CONFIRMATION).stream() .map(action -> autoConfirmAction(action, autoConfirmationStatus)) .collect(Collectors.toList()); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaTargetManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaTargetManagement.java index 358ab19620..9ebaa042c7 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaTargetManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaTargetManagement.java @@ -298,10 +298,11 @@ public long countByRsqlAndNonDSAndCompatibleAndUpdatable(final long distribution final DistributionSet jpaDistributionSet = distributionSetManagement.getOrElseThrowException(distributionSetId); final Long distSetTypeId = jpaDistributionSet.getType().getId(); - return targetRepository.count(AccessController.Operation.UPDATE, + return targetRepository.count( + AccessController.Operation.UPDATE, combineWithAnd(List.of( - RSQLUtility.buildRsqlSpecification(targetFilterQuery, TargetFields.class, - virtualPropertyReplacer, database), + RSQLUtility.buildRsqlSpecification( + targetFilterQuery, TargetFields.class, virtualPropertyReplacer, database), TargetSpecifications.hasNotDistributionSetInActions(distributionSetId), TargetSpecifications.isCompatibleWithDistributionSetType(distSetTypeId)))); } 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 97c1455c5f..9c8f0e5df8 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 @@ -12,7 +12,6 @@ import java.io.Serial; import java.net.URI; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -148,7 +147,7 @@ public class JpaTarget extends AbstractJpaNamedEntity implements Target, EventAw @Setter @Getter - @OneToOne(fetch = FetchType.LAZY, mappedBy = "target", orphanRemoval = true) + @OneToOne(fetch = FetchType.LAZY, mappedBy = "target", cascade = { CascadeType.ALL }, orphanRemoval = true) @PrimaryKeyJoinColumn private JpaAutoConfirmationStatus autoConfirmationStatus; diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/BaseEntityRepositoryACM.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/BaseEntityRepositoryACM.java index 3b1f2ee751..b35dad6f47 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/BaseEntityRepositoryACM.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/BaseEntityRepositoryACM.java @@ -294,8 +294,7 @@ static accessController) { Objects.requireNonNull(repository); Objects.requireNonNull(accessController); - final BaseEntityRepositoryACM repositoryACM = - new BaseEntityRepositoryACM<>(repository, accessController); + final BaseEntityRepositoryACM repositoryACM = new BaseEntityRepositoryACM<>(repository, accessController); final R acmProxy = (R) Proxy.newProxyInstance( Thread.currentThread().getContextClassLoader(), repository.getClass().getInterfaces(), @@ -312,6 +311,7 @@ static ) result) { if (repository.getDomainClass().isAssignableFrom(e.getClass())) { diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/TargetFilterQueryRepository.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/TargetFilterQueryRepository.java index 2de30d1ff6..b37bd66bfd 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/TargetFilterQueryRepository.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/repository/TargetFilterQueryRepository.java @@ -25,8 +25,7 @@ * Spring data repositories for {@link TargetFilterQuery}s. */ @Transactional(readOnly = true) -public interface TargetFilterQueryRepository - extends BaseEntityRepository { +public interface TargetFilterQueryRepository extends BaseEntityRepository { /** * Find customer target filter by name @@ -37,8 +36,7 @@ public interface TargetFilterQueryRepository Optional findByName(String name); /** - * Sets the auto assign distribution sets and action types to null which - * match the ds ids. + * Sets the auto assign distribution sets and action types to null which match the ds ids. *

* No access control applied * @@ -46,12 +44,11 @@ public interface TargetFilterQueryRepository */ @Modifying @Transactional - @Query("update JpaTargetFilterQuery d set d.autoAssignDistributionSet = NULL, d.autoAssignActionType = NULL, d.accessControlContext = NULL where d.autoAssignDistributionSet in :ids") + @Query("UPDATE JpaTargetFilterQuery d SET d.autoAssignDistributionSet = NULL, d.autoAssignActionType = NULL, d.accessControlContext = NULL WHERE d.autoAssignDistributionSet.id IN :ids") void unsetAutoAssignDistributionSetAndActionTypeAndAccessContext(@Param("ids") Long... dsIds); /** - * Counts all target filters that have a given auto assign distribution set - * assigned. + * Counts all target filters that have a given auto assign distribution set assigned. *

* No access control applied * @@ -61,10 +58,8 @@ public interface TargetFilterQueryRepository long countByAutoAssignDistributionSetId(long autoAssignDistributionSetId); /** - * Deletes all {@link TenantAwareBaseEntity} of a given tenant. For safety - * reasons (this is a "delete everything" query after all) we add the tenant - * manually to query even if this will by done by {@link EntityManager} - * anyhow. The DB should take care of optimizing this away. + * Deletes all {@link TenantAwareBaseEntity} of a given tenant. For safety reasons (this is a "delete everything" query after all) we add + * the tenant manually to query even if this will by done by {@link EntityManager} anyhow. The DB should take care of optimizing this away. * * @param tenant to delete data from */ @@ -72,4 +67,4 @@ public interface TargetFilterQueryRepository @Transactional @Query("DELETE FROM JpaTargetFilterQuery t WHERE t.tenant = :tenant") void deleteByTenant(@Param("tenant") String tenant); -} +} \ No newline at end of file diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ControllerManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ControllerManagementTest.java index 99f1c63f71..39b2867b06 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ControllerManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ControllerManagementTest.java @@ -863,21 +863,18 @@ void findOrRegisterTargetIfItDoesNotExistDoesNotThrowExceptionBeforeMaxRetries() @Expect(type = TargetPollEvent.class, count = 3), @Expect(type = TargetUpdatedEvent.class, count = 1) }) void findOrRegisterTargetIfItDoesNotExistDoesUpdateNameOnExistingTargetProperly() { - final String controllerId = "12345"; final String targetName = "UpdatedName"; final Target newTarget = controllerManagement.findOrRegisterTargetIfItDoesNotExist(controllerId, LOCALHOST); assertThat(newTarget.getName()).isEqualTo(controllerId); - final Target firstTimeUpdatedTarget = controllerManagement.findOrRegisterTargetIfItDoesNotExist(controllerId, - LOCALHOST, targetName, null); + final Target firstTimeUpdatedTarget = controllerManagement.findOrRegisterTargetIfItDoesNotExist( + controllerId, LOCALHOST, targetName, null); assertThat(firstTimeUpdatedTarget.getName()).isEqualTo(targetName); - // Name should not change to default (name=targetId) if target is - // updated without new name provided - final Target secondTimeUpdatedTarget = controllerManagement.findOrRegisterTargetIfItDoesNotExist(controllerId, - LOCALHOST); + // Name should not change to default (name=targetId) if target is updated without new name provided + final Target secondTimeUpdatedTarget = controllerManagement.findOrRegisterTargetIfItDoesNotExist(controllerId, LOCALHOST); assertThat(secondTimeUpdatedTarget.getName()).isEqualTo(targetName); } diff --git a/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/matcher/EventVerifier.java b/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/matcher/EventVerifier.java index 2f75ab4a7d..21ba23f9b8 100644 --- a/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/matcher/EventVerifier.java +++ b/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/matcher/EventVerifier.java @@ -40,7 +40,7 @@ import org.springframework.test.context.support.AbstractTestExecutionListener; /** - * Test rule to setup and verify the event count for a method. + * Test rule to set up and verify the event count for a method. */ @Slf4j public class EventVerifier extends AbstractTestExecutionListener { @@ -53,7 +53,7 @@ public class EventVerifier extends AbstractTestExecutionListener { * {@code @Before} annotations which are actually counted to the executed * test-method and maybe fire events which are not covered / recognized by * the test-method itself and reset the counter again. - * + *

* Note that this approach is only working when using a single-thread * executor in the ApplicationEventMultiCaster, so the order of the events * keep the same. @@ -74,7 +74,7 @@ public void beforeTestMethod(final TestContext testContext) { public void afterTestMethod(final TestContext testContext) { final Optional expectedEvents = getExpectationsFrom(testContext.getTestMethod()); try { - expectedEvents.ifPresent(events -> afterTest(events)); + expectedEvents.ifPresent(this::afterTest); } finally { expectedEvents.ifPresent(listener -> removeEventListener(testContext)); } @@ -85,10 +85,8 @@ private Optional getExpectationsFrom(final Method testMethod) { } private void beforeTest(final TestContext testContext) { - final ConfigurableApplicationContext context = (ConfigurableApplicationContext) testContext - .getApplicationContext(); eventCaptor = new EventCaptor(); - context.addApplicationListener(eventCaptor); + ((ConfigurableApplicationContext) testContext.getApplicationContext()).addApplicationListener(eventCaptor); } private void afterTest(final Expect[] expectedEvents) { @@ -97,39 +95,33 @@ private void afterTest(final Expect[] expectedEvents) { } private void verifyRightCountOfEvents(final Expect[] expectedEvents) { - for (final Expect expectedEvent : expectedEvents) { try { - Awaitility.await().atMost(5, TimeUnit.SECONDS) + Awaitility.await() + .atMost(5, TimeUnit.SECONDS) .until(() -> eventCaptor.getCountFor(expectedEvent.type()), equalTo(expectedEvent.count())); - } catch (final ConditionTimeoutException ex) { - fail("Did not receive the expected amount of events form " + expectedEvent.type() + " Expected: " - + expectedEvent.count() + " but was: " + eventCaptor.getCountFor(expectedEvent.type())); + fail(String.format( + "Did not receive the expected amount of events form %s Expected: %d but was: %d", + expectedEvent.type(), expectedEvent.count(), eventCaptor.getCountFor(expectedEvent.type()))); } } } private void verifyAllEventsCounted(final Expect[] expectedEvents) { - final Set> diffSet = eventCaptor.diff(expectedEvents); - if (diffSet.size() > 0) { + if (!diffSet.isEmpty()) { final StringBuilder failMessage = new StringBuilder("Missing event verification for "); - final Iterator> itr = diffSet.iterator(); - while (itr.hasNext()) { - final Class element = itr.next(); + for (final Class element : diffSet) { final int count = eventCaptor.getCountFor(element); - failMessage.append(element + " with count: " + count + " "); + failMessage.append(element).append(" with count: ").append(count).append(" "); } fail(failMessage.toString()); } - } private void removeEventListener(final TestContext testContext) { - final ApplicationEventMulticaster multicaster = testContext.getApplicationContext() - .getBean(ApplicationEventMulticaster.class); - multicaster.removeApplicationListener(eventCaptor); + testContext.getApplicationContext().getBean(ApplicationEventMulticaster.class).removeApplicationListener(eventCaptor); } private static class EventCaptor implements ApplicationListener {