From c68c5a6f5b9a47eadd19baba257813cfc3959fd0 Mon Sep 17 00:00:00 2001 From: Bondar Bogdan <36962546+bogdan-bondar@users.noreply.github.com> Date: Wed, 14 Aug 2019 09:08:23 +0200 Subject: [PATCH] Feature event publishing (#884) * refactored code to use EventPublisherHolder for publishing application events where possible Signed-off-by: Bogdan Bondar * fixed comment Signed-off-by: Bogdan Bondar --- .../hawkbit-eventbus-defaults.properties | 4 +- .../repository/AbstractRolloutManagement.java | 8 +--- .../model/helper/EventPublisherHolder.java | 29 ++++++------- .../jpa/AbstractDsAssignmentStrategy.java | 22 +++++----- .../jpa/JpaControllerManagement.java | 29 +++++++------ .../jpa/JpaDeploymentManagement.java | 15 ++++--- .../jpa/JpaDistributionSetManagement.java | 21 ++++------ .../repository/jpa/JpaRolloutManagement.java | 27 ++++++------ .../repository/jpa/JpaTargetManagement.java | 41 ++++++++++--------- .../jpa/OfflineDsAssignmentStrategy.java | 11 +++-- .../jpa/OnlineDsAssignmentStrategy.java | 27 ++++++------ .../RepositoryApplicationConfiguration.java | 30 ++++++-------- .../test/util/AbstractIntegrationTest.java | 7 ++-- .../ddi/rest/resource/DdiRootController.java | 11 +++-- 14 files changed, 134 insertions(+), 148 deletions(-) diff --git a/hawkbit-autoconfigure/src/main/resources/hawkbit-eventbus-defaults.properties b/hawkbit-autoconfigure/src/main/resources/hawkbit-eventbus-defaults.properties index cfdadd2ec..113fc1b1a 100644 --- a/hawkbit-autoconfigure/src/main/resources/hawkbit-eventbus-defaults.properties +++ b/hawkbit-autoconfigure/src/main/resources/hawkbit-eventbus-defaults.properties @@ -15,6 +15,6 @@ spring.cloud.bus.ack.enabled=false spring.cloud.bus.trace.enabled=false spring.cloud.bus.refresh.enabled=false # Disable Cloud Bus endpoints -endpoints.spring.cloud.bus.refresh.enabled=false -endpoints.spring.cloud.bus.env.enabled=false +management.endpoint.bus-refresh.enabled=false +management.endpoint.bus-env.enabled=false # Spring cloud bus and stream END \ No newline at end of file diff --git a/hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/AbstractRolloutManagement.java b/hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/AbstractRolloutManagement.java index c33cff05d..4a10ff38b 100644 --- a/hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/AbstractRolloutManagement.java +++ b/hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/AbstractRolloutManagement.java @@ -22,7 +22,6 @@ import org.eclipse.hawkbit.repository.model.RolloutGroupsValidation; import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.eclipse.hawkbit.tenancy.TenantAware; import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.integration.support.locks.LockRegistry; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; @@ -45,8 +44,6 @@ public abstract class AbstractRolloutManagement implements RolloutManagement { protected final ApplicationContext context; - protected final ApplicationEventPublisher eventPublisher; - protected final VirtualPropertyReplacer virtualPropertyReplacer; protected final PlatformTransactionManager txManager; @@ -60,15 +57,14 @@ public abstract class AbstractRolloutManagement implements RolloutManagement { protected AbstractRolloutManagement(final TargetManagement targetManagement, final DeploymentManagement deploymentManagement, final RolloutGroupManagement rolloutGroupManagement, final DistributionSetManagement distributionSetManagement, final ApplicationContext context, - final ApplicationEventPublisher eventPublisher, final VirtualPropertyReplacer virtualPropertyReplacer, - final PlatformTransactionManager txManager, final TenantAware tenantAware, final LockRegistry lockRegistry, + final VirtualPropertyReplacer virtualPropertyReplacer, final PlatformTransactionManager txManager, + final TenantAware tenantAware, final LockRegistry lockRegistry, final RolloutApprovalStrategy rolloutApprovalStrategy) { this.targetManagement = targetManagement; this.deploymentManagement = deploymentManagement; this.rolloutGroupManagement = rolloutGroupManagement; this.distributionSetManagement = distributionSetManagement; this.context = context; - this.eventPublisher = eventPublisher; this.virtualPropertyReplacer = virtualPropertyReplacer; this.txManager = txManager; this.tenantAware = tenantAware; diff --git a/hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/model/helper/EventPublisherHolder.java b/hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/model/helper/EventPublisherHolder.java index c9a9f91b3..b5223ad7d 100644 --- a/hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/model/helper/EventPublisherHolder.java +++ b/hawkbit-repository/hawkbit-repository-core/src/main/java/org/eclipse/hawkbit/repository/model/helper/EventPublisherHolder.java @@ -10,26 +10,28 @@ package org.eclipse.hawkbit.repository.model.helper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.bus.BusProperties; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; +import org.springframework.cloud.bus.ServiceMatcher; import org.springframework.context.ApplicationEventPublisher; /** - * A singleton bean which holds the event publisher to have to the cache manager - * in beans not instantiated by spring e.g. JPA entities or - * CacheFieldEntityListener which cannot be autowired. + * A singleton bean which holds the event publisher and service origin Id in + * order to publish remote application events. It can be used in beans not + * instantiated by spring e.g. JPA entities which cannot be auto-wired. */ -public final class EventPublisherHolder implements ApplicationContextAware { +public final class EventPublisherHolder { private static final EventPublisherHolder SINGLETON = new EventPublisherHolder(); @Autowired private ApplicationEventPublisher eventPublisher; - private String applicationId; + @Autowired(required = false) + private ServiceMatcher serviceMatcher; + + @Autowired + private BusProperties bus; private EventPublisherHolder() { - } /** @@ -46,12 +48,11 @@ public final class EventPublisherHolder implements ApplicationContextAware { return eventPublisher; } + /** + * @return the service origin Id coming either from {@link ServiceMatcher} + * when available or {@link BusProperties} otherwise. + */ public String getApplicationId() { - return applicationId; - } - - @Override - public void setApplicationContext(final ApplicationContext applicationContext) { - applicationId = applicationContext.getBean(BusProperties.class).getId(); + return serviceMatcher != null ? serviceMatcher.getServiceId() : bus.getId(); } } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/AbstractDsAssignmentStrategy.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/AbstractDsAssignmentStrategy.java index 4bac7849a..679f6102f 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/AbstractDsAssignmentStrategy.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/AbstractDsAssignmentStrategy.java @@ -32,10 +32,9 @@ import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.DistributionSetAssignmentResult; import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.TargetWithActionType; +import org.eclipse.hawkbit.repository.model.helper.EventPublisherHolder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.cloud.bus.BusProperties; -import org.springframework.context.ApplicationEventPublisher; /** * {@link DistributionSet} to {@link Target} assignment strategy as utility for @@ -48,20 +47,18 @@ public abstract class AbstractDsAssignmentStrategy { protected final TargetRepository targetRepository; protected final AfterTransactionCommitExecutor afterCommit; - protected final ApplicationEventPublisher eventPublisher; - protected final BusProperties bus; + protected final EventPublisherHolder eventPublisherHolder; protected final ActionRepository actionRepository; private final ActionStatusRepository actionStatusRepository; private final QuotaManagement quotaManagement; AbstractDsAssignmentStrategy(final TargetRepository targetRepository, - final AfterTransactionCommitExecutor afterCommit, final ApplicationEventPublisher eventPublisher, - final BusProperties bus, final ActionRepository actionRepository, - final ActionStatusRepository actionStatusRepository, final QuotaManagement quotaManagement) { + final AfterTransactionCommitExecutor afterCommit, final EventPublisherHolder eventPublisherHolder, + final ActionRepository actionRepository, final ActionStatusRepository actionStatusRepository, + final QuotaManagement quotaManagement) { this.targetRepository = targetRepository; this.afterCommit = afterCommit; - this.eventPublisher = eventPublisher; - this.bus = bus; + this.eventPublisherHolder = eventPublisherHolder; this.actionRepository = actionRepository; this.actionStatusRepository = actionStatusRepository; this.quotaManagement = quotaManagement; @@ -126,7 +123,8 @@ public abstract class AbstractDsAssignmentStrategy { abstract void sendDeploymentEvents(final List assignmentResults); protected void sendTargetUpdatedEvent(final JpaTarget target) { - afterCommit.afterCommit(() -> eventPublisher.publishEvent(new TargetUpdatedEvent(target, bus.getId()))); + afterCommit.afterCommit(() -> eventPublisherHolder.getEventPublisher() + .publishEvent(new TargetUpdatedEvent(target, eventPublisherHolder.getApplicationId()))); } /** @@ -197,8 +195,8 @@ public abstract class AbstractDsAssignmentStrategy { * the action id of the assignment */ void cancelAssignDistributionSetEvent(final Target target, final Long actionId) { - afterCommit.afterCommit( - () -> eventPublisher.publishEvent(new CancelTargetAssignmentEvent(target, actionId, bus.getId()))); + afterCommit.afterCommit(() -> eventPublisherHolder.getEventPublisher().publishEvent( + new CancelTargetAssignmentEvent(target, actionId, eventPublisherHolder.getApplicationId()))); } JpaAction createTargetAction(final Map targetsWithActionMap, final JpaTarget target, diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaControllerManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaControllerManagement.java index 2fc88e9f6..30cfc756b 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaControllerManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaControllerManagement.java @@ -76,14 +76,13 @@ import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.repository.model.SoftwareModuleMetadata; import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.TargetUpdateStatus; +import org.eclipse.hawkbit.repository.model.helper.EventPublisherHolder; import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.tenancy.TenantAware; import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationProperties.TenantConfigurationKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.bus.BusProperties; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.dao.ConcurrencyFailureException; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -143,10 +142,7 @@ public class JpaControllerManagement implements ControllerManagement { private EntityFactory entityFactory; @Autowired - private ApplicationEventPublisher eventPublisher; - - @Autowired - private BusProperties bus; + private EventPublisherHolder eventPublisherHolder; @Autowired private AfterTransactionCommitExecutor afterCommit; @@ -397,7 +393,8 @@ public class JpaControllerManagement implements ControllerManagement { .status(TargetUpdateStatus.REGISTERED).lastTargetQuery(System.currentTimeMillis()) .address(Optional.ofNullable(address).map(URI::toString).orElse(null)).build()); - afterCommit.afterCommit(() -> eventPublisher.publishEvent(new TargetPollEvent(result, bus.getId()))); + afterCommit.afterCommit(() -> eventPublisherHolder.getEventPublisher() + .publishEvent(new TargetPollEvent(result, eventPublisherHolder.getApplicationId()))); return result; } catch (final EntityAlreadyExistsException e) { @@ -453,8 +450,8 @@ public class JpaControllerManagement implements ControllerManagement { pollChunks.forEach(chunk -> { setLastTargetQuery(tenant, System.currentTimeMillis(), chunk); - chunk.forEach(controllerId -> afterCommit.afterCommit( - () -> eventPublisher.publishEvent(new TargetPollEvent(controllerId, tenant, bus.getId())))); + chunk.forEach(controllerId -> afterCommit.afterCommit(() -> eventPublisherHolder.getEventPublisher() + .publishEvent(new TargetPollEvent(controllerId, tenant, eventPublisherHolder.getApplicationId())))); }); return null; @@ -508,7 +505,8 @@ public class JpaControllerManagement implements ControllerManagement { toUpdate.setAddress(address.toString()); toUpdate.setLastTargetQuery(System.currentTimeMillis()); - afterCommit.afterCommit(() -> eventPublisher.publishEvent(new TargetPollEvent(toUpdate, bus.getId()))); + afterCommit.afterCommit(() -> eventPublisherHolder.getEventPublisher() + .publishEvent(new TargetPollEvent(toUpdate, eventPublisherHolder.getApplicationId()))); return targetRepository.save(toUpdate); } @@ -678,9 +676,10 @@ public class JpaControllerManagement implements ControllerManagement { target.setRequestControllerAttributes(true); - eventPublisher.publishEvent(new TargetAttributesRequestedEvent(tenantAware.getCurrentTenant(), target.getId(), - target.getControllerId(), target.getAddress() != null ? target.getAddress().toString() : null, - JpaTarget.class.getName(), bus.getId())); + eventPublisherHolder.getEventPublisher() + .publishEvent(new TargetAttributesRequestedEvent(tenantAware.getCurrentTenant(), target.getId(), + target.getControllerId(), target.getAddress() != null ? target.getAddress().toString() : null, + JpaTarget.class.getName(), eventPublisherHolder.getApplicationId())); } private void handleErrorOnAction(final JpaAction mergedAction, final JpaTarget mergedTarget) { @@ -1055,8 +1054,8 @@ public class JpaControllerManagement implements ControllerManagement { } private void cancelAssignDistributionSetEvent(final JpaTarget target, final Long actionId) { - afterCommit.afterCommit( - () -> eventPublisher.publishEvent(new CancelTargetAssignmentEvent(target, actionId, bus.getId()))); + afterCommit.afterCommit(() -> eventPublisherHolder.getEventPublisher().publishEvent( + new CancelTargetAssignmentEvent(target, actionId, eventPublisherHolder.getApplicationId()))); } // for testing diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDeploymentManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDeploymentManagement.java index 452abfb09..e7ab5ed31 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDeploymentManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDeploymentManagement.java @@ -67,13 +67,12 @@ import org.eclipse.hawkbit.repository.model.SoftwareModuleType; import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.TargetUpdateStatus; import org.eclipse.hawkbit.repository.model.TargetWithActionType; +import org.eclipse.hawkbit.repository.model.helper.EventPublisherHolder; import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.tenancy.TenantAware; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.cloud.bus.BusProperties; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.dao.ConcurrencyFailureException; import org.springframework.data.domain.AuditorAware; import org.springframework.data.domain.Page; @@ -138,9 +137,9 @@ public class JpaDeploymentManagement implements DeploymentManagement { protected JpaDeploymentManagement(final EntityManager entityManager, final ActionRepository actionRepository, final DistributionSetRepository distributionSetRepository, final TargetRepository targetRepository, final ActionStatusRepository actionStatusRepository, final TargetManagement targetManagement, - final AuditorAware auditorProvider, final ApplicationEventPublisher eventPublisher, - final BusProperties bus, final AfterTransactionCommitExecutor afterCommit, - final VirtualPropertyReplacer virtualPropertyReplacer, final PlatformTransactionManager txManager, + final AuditorAware auditorProvider, final EventPublisherHolder eventPublisherHolder, + final AfterTransactionCommitExecutor afterCommit, final VirtualPropertyReplacer virtualPropertyReplacer, + final PlatformTransactionManager txManager, final TenantConfigurationManagement tenantConfigurationManagement, final QuotaManagement quotaManagement, final SystemSecurityContext systemSecurityContext, final TenantAware tenantAware, final Database database) { this.entityManager = entityManager; @@ -152,10 +151,10 @@ public class JpaDeploymentManagement implements DeploymentManagement { this.auditorProvider = auditorProvider; this.virtualPropertyReplacer = virtualPropertyReplacer; this.txManager = txManager; - onlineDsAssignmentStrategy = new OnlineDsAssignmentStrategy(targetRepository, afterCommit, eventPublisher, bus, + onlineDsAssignmentStrategy = new OnlineDsAssignmentStrategy(targetRepository, afterCommit, eventPublisherHolder, actionRepository, actionStatusRepository, quotaManagement, this::isMultiAssignmentsEnabled); - offlineDsAssignmentStrategy = new OfflineDsAssignmentStrategy(targetRepository, afterCommit, eventPublisher, - bus, actionRepository, actionStatusRepository, quotaManagement); + offlineDsAssignmentStrategy = new OfflineDsAssignmentStrategy(targetRepository, afterCommit, + eventPublisherHolder, actionRepository, actionStatusRepository, quotaManagement); this.tenantConfigurationManagement = tenantConfigurationManagement; this.quotaManagement = quotaManagement; this.systemSecurityContext = systemSecurityContext; diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java index d89e85d9a..baa2a29b4 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java @@ -55,10 +55,9 @@ import org.eclipse.hawkbit.repository.model.DistributionSetTagAssignmentResult; import org.eclipse.hawkbit.repository.model.DistributionSetType; import org.eclipse.hawkbit.repository.model.MetaData; import org.eclipse.hawkbit.repository.model.SoftwareModule; +import org.eclipse.hawkbit.repository.model.helper.EventPublisherHolder; import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.eclipse.hawkbit.tenancy.TenantAware; -import org.springframework.cloud.bus.BusProperties; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.dao.ConcurrencyFailureException; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -103,9 +102,7 @@ public class JpaDistributionSetManagement implements DistributionSetManagement { private final NoCountPagingRepository criteriaNoCountDao; - private final ApplicationEventPublisher eventPublisher; - - private final BusProperties bus; + private final EventPublisherHolder eventPublisherHolder; private final TenantAware tenantAware; @@ -125,9 +122,8 @@ public class JpaDistributionSetManagement implements DistributionSetManagement { final DistributionSetTypeManagement distributionSetTypeManagement, final QuotaManagement quotaManagement, final DistributionSetMetadataRepository distributionSetMetadataRepository, final TargetFilterQueryRepository targetFilterQueryRepository, final ActionRepository actionRepository, - final NoCountPagingRepository criteriaNoCountDao, final ApplicationEventPublisher eventPublisher, - final BusProperties bus, final TenantAware tenantAware, - final VirtualPropertyReplacer virtualPropertyReplacer, + final NoCountPagingRepository criteriaNoCountDao, final EventPublisherHolder eventPublisherHolder, + final TenantAware tenantAware, final VirtualPropertyReplacer virtualPropertyReplacer, final SoftwareModuleRepository softwareModuleRepository, final DistributionSetTagRepository distributionSetTagRepository, final AfterTransactionCommitExecutor afterCommit, final Database database) { @@ -141,8 +137,7 @@ public class JpaDistributionSetManagement implements DistributionSetManagement { this.targetFilterQueryRepository = targetFilterQueryRepository; this.actionRepository = actionRepository; this.criteriaNoCountDao = criteriaNoCountDao; - this.eventPublisher = eventPublisher; - this.bus = bus; + this.eventPublisherHolder = eventPublisherHolder; this.tenantAware = tenantAware; this.virtualPropertyReplacer = virtualPropertyReplacer; this.softwareModuleRepository = softwareModuleRepository; @@ -283,9 +278,9 @@ public class JpaDistributionSetManagement implements DistributionSetManagement { distributionSetRepository.deleteByIdIn(toHardDelete); } - afterCommit.afterCommit(() -> distributionSetIDs.forEach( - dsId -> eventPublisher.publishEvent(new DistributionSetDeletedEvent(tenantAware.getCurrentTenant(), - dsId, JpaDistributionSet.class.getName(), bus.getId())))); + afterCommit.afterCommit(() -> distributionSetIDs.forEach(dsId -> eventPublisherHolder.getEventPublisher() + .publishEvent(new DistributionSetDeletedEvent(tenantAware.getCurrentTenant(), dsId, + JpaDistributionSet.class.getName(), eventPublisherHolder.getApplicationId())))); } @Override diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutManagement.java index 6b88b8ce9..342fa64ff 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaRolloutManagement.java @@ -79,9 +79,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.bus.BusProperties; import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.dao.ConcurrencyFailureException; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -158,21 +156,20 @@ public class JpaRolloutManagement extends AbstractRolloutManagement { @Autowired private RolloutStatusCache rolloutStatusCache; - private final BusProperties bus; + private final EventPublisherHolder eventPublisherHolder; private final Database database; JpaRolloutManagement(final TargetManagement targetManagement, final DeploymentManagement deploymentManagement, final RolloutGroupManagement rolloutGroupManagement, final DistributionSetManagement distributionSetManagement, final ApplicationContext context, - final BusProperties bus, final ApplicationEventPublisher eventPublisher, - final VirtualPropertyReplacer virtualPropertyReplacer, final PlatformTransactionManager txManager, - final TenantAware tenantAware, final LockRegistry lockRegistry, final Database database, - final RolloutApprovalStrategy rolloutApprovalStrategy) { + final EventPublisherHolder eventPublisherHolder, final VirtualPropertyReplacer virtualPropertyReplacer, + final PlatformTransactionManager txManager, final TenantAware tenantAware, final LockRegistry lockRegistry, + final Database database, final RolloutApprovalStrategy rolloutApprovalStrategy) { super(targetManagement, deploymentManagement, rolloutGroupManagement, distributionSetManagement, context, - eventPublisher, virtualPropertyReplacer, txManager, tenantAware, lockRegistry, rolloutApprovalStrategy); + virtualPropertyReplacer, txManager, tenantAware, lockRegistry, rolloutApprovalStrategy); + this.eventPublisherHolder = eventPublisherHolder; this.database = database; - this.bus = bus; } @Override @@ -322,8 +319,8 @@ public class JpaRolloutManagement extends AbstractRolloutManagement { } private void publishRolloutGroupCreatedEventAfterCommit(final RolloutGroup group, final Rollout rollout) { - afterCommit.afterCommit(() -> eventPublisher - .publishEvent(new RolloutGroupCreatedEvent(group, rollout.getId(), context.getId()))); + afterCommit.afterCommit(() -> eventPublisherHolder.getEventPublisher().publishEvent( + new RolloutGroupCreatedEvent(group, rollout.getId(), eventPublisherHolder.getApplicationId()))); } private void handleCreateRollout(final JpaRollout rollout) { @@ -942,9 +939,9 @@ public class JpaRolloutManagement extends AbstractRolloutManagement { final List groupIds = rollout.getRolloutGroups().stream().map(RolloutGroup::getId) .collect(Collectors.toList()); - afterCommit.afterCommit(() -> groupIds.forEach(rolloutGroupId -> eventPublisher + afterCommit.afterCommit(() -> groupIds.forEach(rolloutGroupId -> eventPublisherHolder.getEventPublisher() .publishEvent(new RolloutGroupDeletedEvent(tenantAware.getCurrentTenant(), rolloutGroupId, - JpaRolloutGroup.class.getName(), bus.getId())))); + JpaRolloutGroup.class.getName(), eventPublisherHolder.getApplicationId())))); } private void hardDeleteRollout(final JpaRollout rollout) { @@ -961,8 +958,8 @@ public class JpaRolloutManagement extends AbstractRolloutManagement { final List actionIds = StreamSupport.stream(iterable.spliterator(), false).map(Action::getId) .collect(Collectors.toList()); actionRepository.deleteByIdIn(actionIds); - afterCommit.afterCommit(() -> eventPublisher.publishEvent( - new RolloutUpdatedEvent(rollout, EventPublisherHolder.getInstance().getApplicationId()))); + afterCommit.afterCommit(() -> eventPublisherHolder.getEventPublisher() + .publishEvent(new RolloutUpdatedEvent(rollout, eventPublisherHolder.getApplicationId()))); } catch (final RuntimeException e) { LOGGER.error("Exception during deletion of actions of rollout {}", rollout, e); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java index cb356fbb5..815e8b475 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java @@ -62,10 +62,9 @@ import org.eclipse.hawkbit.repository.model.TargetMetadata; import org.eclipse.hawkbit.repository.model.TargetTag; import org.eclipse.hawkbit.repository.model.TargetTagAssignmentResult; import org.eclipse.hawkbit.repository.model.TargetUpdateStatus; +import org.eclipse.hawkbit.repository.model.helper.EventPublisherHolder; import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer; import org.eclipse.hawkbit.tenancy.TenantAware; -import org.springframework.cloud.bus.BusProperties; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.dao.ConcurrencyFailureException; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -109,9 +108,7 @@ public class JpaTargetManagement implements TargetManagement { private final NoCountPagingRepository criteriaNoCountDao; - private final ApplicationEventPublisher eventPublisher; - - private final BusProperties bus; + private final EventPublisherHolder eventPublisherHolder; private final TenantAware tenantAware; @@ -127,7 +124,7 @@ public class JpaTargetManagement implements TargetManagement { final DistributionSetRepository distributionSetRepository, final TargetFilterQueryRepository targetFilterQueryRepository, final TargetTagRepository targetTagRepository, final NoCountPagingRepository criteriaNoCountDao, - final ApplicationEventPublisher eventPublisher, final BusProperties bus, final TenantAware tenantAware, + final EventPublisherHolder eventPublisherHolder, final TenantAware tenantAware, final AfterTransactionCommitExecutor afterCommit, final VirtualPropertyReplacer virtualPropertyReplacer, final Database database) { this.entityManager = entityManager; @@ -139,8 +136,7 @@ public class JpaTargetManagement implements TargetManagement { this.targetFilterQueryRepository = targetFilterQueryRepository; this.targetTagRepository = targetTagRepository; this.criteriaNoCountDao = criteriaNoCountDao; - this.eventPublisher = eventPublisher; - this.bus = bus; + this.eventPublisherHolder = eventPublisherHolder; this.tenantAware = tenantAware; this.afterCommit = afterCommit; this.virtualPropertyReplacer = virtualPropertyReplacer; @@ -190,7 +186,8 @@ public class JpaTargetManagement implements TargetManagement { // TargetUpdatedEvent is not sent within the touch() method due to the // "lastModifiedAt" field being ignored in JpaTarget - eventPublisher.publishEvent(new TargetUpdatedEvent(updatedTarget, bus.getId())); + eventPublisherHolder.getEventPublisher() + .publishEvent(new TargetUpdatedEvent(updatedTarget, eventPublisherHolder.getApplicationId())); return createdMetadata; } @@ -239,7 +236,8 @@ public class JpaTargetManagement implements TargetManagement { final JpaTargetMetadata matadata = targetMetadataRepository.save(updatedMetadata); // target update event is set to ignore "lastModifiedAt" field so it is // not send automatically within the touch() method - eventPublisher.publishEvent(new TargetUpdatedEvent(target, bus.getId())); + eventPublisherHolder.getEventPublisher() + .publishEvent(new TargetUpdatedEvent(target, eventPublisherHolder.getApplicationId())); return matadata; } @@ -255,7 +253,8 @@ public class JpaTargetManagement implements TargetManagement { targetMetadataRepository.deleteById(metadata.getId()); // target update event is set to ignore "lastModifiedAt" field so it is // not send automatically within the touch() method - eventPublisher.publishEvent(new TargetUpdatedEvent(target, bus.getId())); + eventPublisherHolder.getEventPublisher() + .publishEvent(new TargetUpdatedEvent(target, eventPublisherHolder.getApplicationId())); } @Override @@ -354,10 +353,12 @@ public class JpaTargetManagement implements TargetManagement { targetRepository.deleteByIdIn(targetIDs); - afterCommit.afterCommit(() -> targets.forEach(target -> eventPublisher.publishEvent( - new TargetDeletedEvent(tenantAware.getCurrentTenant(), target.getId(), target.getControllerId(), - Optional.ofNullable(target.getAddress()).map(URI::toString).orElse(null), - JpaTarget.class.getName(), bus.getId())))); + afterCommit + .afterCommit(() -> targets.forEach(target -> eventPublisherHolder.getEventPublisher() + .publishEvent(new TargetDeletedEvent(tenantAware.getCurrentTenant(), target.getId(), + target.getControllerId(), + Optional.ofNullable(target.getAddress()).map(URI::toString).orElse(null), + JpaTarget.class.getName(), eventPublisherHolder.getApplicationId())))); } @Override @@ -466,7 +467,8 @@ public class JpaTargetManagement implements TargetManagement { .hasInstalledOrAssignedDistributionSet(filterParams.getFilterByDistributionId())); } if (!StringUtils.isEmpty(filterParams.getFilterBySearchText())) { - specList.add(TargetSpecifications.likeIdOrNameOrDescriptionOrAttributeValue(filterParams.getFilterBySearchText())); + specList.add(TargetSpecifications + .likeIdOrNameOrDescriptionOrAttributeValue(filterParams.getFilterBySearchText())); } if (isHasTagsFilterActive(filterParams)) { specList.add(TargetSpecifications.hasTags(filterParams.getFilterByTagNames(), @@ -795,9 +797,10 @@ public class JpaTargetManagement implements TargetManagement { target.setRequestControllerAttributes(true); - eventPublisher.publishEvent(new TargetAttributesRequestedEvent(tenantAware.getCurrentTenant(), target.getId(), - target.getControllerId(), target.getAddress() != null ? target.getAddress().toString() : null, - JpaTarget.class.getName(), bus.getId())); + eventPublisherHolder.getEventPublisher() + .publishEvent(new TargetAttributesRequestedEvent(tenantAware.getCurrentTenant(), target.getId(), + target.getControllerId(), target.getAddress() != null ? target.getAddress().toString() : null, + JpaTarget.class.getName(), eventPublisherHolder.getApplicationId())); } @Override diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/OfflineDsAssignmentStrategy.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/OfflineDsAssignmentStrategy.java index 5bcdef8dd..89ae03eb6 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/OfflineDsAssignmentStrategy.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/OfflineDsAssignmentStrategy.java @@ -30,8 +30,7 @@ import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.DistributionSetAssignmentResult; import org.eclipse.hawkbit.repository.model.TargetUpdateStatus; import org.eclipse.hawkbit.repository.model.TargetWithActionType; -import org.springframework.cloud.bus.BusProperties; -import org.springframework.context.ApplicationEventPublisher; +import org.eclipse.hawkbit.repository.model.helper.EventPublisherHolder; import com.google.common.collect.Lists; @@ -43,10 +42,10 @@ import com.google.common.collect.Lists; public class OfflineDsAssignmentStrategy extends AbstractDsAssignmentStrategy { OfflineDsAssignmentStrategy(final TargetRepository targetRepository, - final AfterTransactionCommitExecutor afterCommit, final ApplicationEventPublisher eventPublisher, - final BusProperties bus, final ActionRepository actionRepository, - final ActionStatusRepository actionStatusRepository, final QuotaManagement quotaManagement) { - super(targetRepository, afterCommit, eventPublisher, bus, actionRepository, actionStatusRepository, + final AfterTransactionCommitExecutor afterCommit, final EventPublisherHolder eventPublisherHolder, + final ActionRepository actionRepository, final ActionStatusRepository actionStatusRepository, + final QuotaManagement quotaManagement) { + super(targetRepository, afterCommit, eventPublisherHolder, actionRepository, actionStatusRepository, quotaManagement); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/OnlineDsAssignmentStrategy.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/OnlineDsAssignmentStrategy.java index 66068972c..407fd7476 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/OnlineDsAssignmentStrategy.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/OnlineDsAssignmentStrategy.java @@ -13,8 +13,8 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.BooleanSupplier; import java.util.function.Function; -import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -35,8 +35,7 @@ import org.eclipse.hawkbit.repository.model.DistributionSetAssignmentResult; import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.TargetUpdateStatus; import org.eclipse.hawkbit.repository.model.TargetWithActionType; -import org.springframework.cloud.bus.BusProperties; -import org.springframework.context.ApplicationEventPublisher; +import org.eclipse.hawkbit.repository.model.helper.EventPublisherHolder; import org.springframework.util.CollectionUtils; import com.google.common.collect.Lists; @@ -47,14 +46,13 @@ import com.google.common.collect.Lists; */ public class OnlineDsAssignmentStrategy extends AbstractDsAssignmentStrategy { - private final Supplier multiAssignmentsConfig; + private final BooleanSupplier multiAssignmentsConfig; OnlineDsAssignmentStrategy(final TargetRepository targetRepository, - final AfterTransactionCommitExecutor afterCommit, final ApplicationEventPublisher eventPublisher, - final BusProperties bus, final ActionRepository actionRepository, - final ActionStatusRepository actionStatusRepository, final QuotaManagement quotaManagement, - final Supplier multiAssignmentsConfig) { - super(targetRepository, afterCommit, eventPublisher, bus, actionRepository, actionStatusRepository, + final AfterTransactionCommitExecutor afterCommit, final EventPublisherHolder eventPublisherHolder, + final ActionRepository actionRepository, final ActionStatusRepository actionStatusRepository, + final QuotaManagement quotaManagement, final BooleanSupplier multiAssignmentsConfig) { + super(targetRepository, afterCommit, eventPublisherHolder, actionRepository, actionStatusRepository, quotaManagement); this.multiAssignmentsConfig = multiAssignmentsConfig; } @@ -185,8 +183,9 @@ public class OnlineDsAssignmentStrategy extends AbstractDsAssignmentStrategy { return; } - afterCommit.afterCommit(() -> eventPublisher.publishEvent(new TargetAssignDistributionSetEvent(tenant, - distributionSetId, actions, bus.getId(), actions.get(0).isMaintenanceWindowAvailable()))); + afterCommit.afterCommit(() -> eventPublisherHolder.getEventPublisher() + .publishEvent(new TargetAssignDistributionSetEvent(tenant, distributionSetId, actions, + eventPublisherHolder.getApplicationId(), actions.get(0).isMaintenanceWindowAvailable()))); } private boolean hasPendingCancellations(final Target target) { @@ -204,12 +203,12 @@ public class OnlineDsAssignmentStrategy extends AbstractDsAssignmentStrategy { * of the targets the event refers to */ private void sendMultiActionEvent(final String tenant, final List controllerIds) { - afterCommit.afterCommit( - () -> eventPublisher.publishEvent(new MultiActionEvent(tenant, bus.getId(), controllerIds))); + afterCommit.afterCommit(() -> eventPublisherHolder.getEventPublisher() + .publishEvent(new MultiActionEvent(tenant, eventPublisherHolder.getApplicationId(), controllerIds))); } private boolean isMultiAssignmentsEnabled() { - return multiAssignmentsConfig.get(); + return multiAssignmentsConfig.getAsBoolean(); } private static Stream filterCancellations(final List actions) { diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/RepositoryApplicationConfiguration.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/RepositoryApplicationConfiguration.java index 033755fca..b11ad34d6 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/RepositoryApplicationConfiguration.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/RepositoryApplicationConfiguration.java @@ -82,6 +82,7 @@ import org.eclipse.hawkbit.repository.model.Rollout; import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.TargetFilterQuery; +import org.eclipse.hawkbit.repository.model.helper.EventPublisherHolder; import org.eclipse.hawkbit.repository.model.helper.SystemManagementHolder; import org.eclipse.hawkbit.repository.model.helper.TenantConfigurationManagementHolder; import org.eclipse.hawkbit.repository.rsql.RsqlValidationOracle; @@ -100,9 +101,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers; -import org.springframework.cloud.bus.BusProperties; import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; @@ -443,15 +442,14 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration { final DistributionSetTypeManagement distributionSetTypeManagement, final QuotaManagement quotaManagement, final DistributionSetMetadataRepository distributionSetMetadataRepository, final TargetFilterQueryRepository targetFilterQueryRepository, final ActionRepository actionRepository, - final NoCountPagingRepository criteriaNoCountDao, final ApplicationEventPublisher eventPublisher, - final BusProperties bus, final TenantAware tenantAware, - final VirtualPropertyReplacer virtualPropertyReplacer, + final NoCountPagingRepository criteriaNoCountDao, final EventPublisherHolder eventPublisherHolder, + final TenantAware tenantAware, final VirtualPropertyReplacer virtualPropertyReplacer, final SoftwareModuleRepository softwareModuleRepository, final DistributionSetTagRepository distributionSetTagRepository, final AfterTransactionCommitExecutor afterCommit, final JpaProperties properties) { return new JpaDistributionSetManagement(entityManager, distributionSetRepository, distributionSetTagManagement, systemManagement, distributionSetTypeManagement, quotaManagement, distributionSetMetadataRepository, - targetFilterQueryRepository, actionRepository, criteriaNoCountDao, eventPublisher, bus, tenantAware, + targetFilterQueryRepository, actionRepository, criteriaNoCountDao, eventPublisherHolder, tenantAware, virtualPropertyReplacer, softwareModuleRepository, distributionSetTagRepository, afterCommit, properties.getDatabase()); @@ -510,12 +508,12 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration { final DistributionSetRepository distributionSetRepository, final TargetFilterQueryRepository targetFilterQueryRepository, final TargetTagRepository targetTagRepository, final NoCountPagingRepository criteriaNoCountDao, - final ApplicationEventPublisher eventPublisher, final BusProperties bus, final TenantAware tenantAware, + final EventPublisherHolder eventPublisherHolder, final TenantAware tenantAware, final AfterTransactionCommitExecutor afterCommit, final VirtualPropertyReplacer virtualPropertyReplacer, final JpaProperties properties) { return new JpaTargetManagement(entityManager, quotaManagement, targetRepository, targetMetadataRepository, rolloutGroupRepository, distributionSetRepository, targetFilterQueryRepository, targetTagRepository, - criteriaNoCountDao, eventPublisher, bus, tenantAware, afterCommit, virtualPropertyReplacer, + criteriaNoCountDao, eventPublisherHolder, tenantAware, afterCommit, virtualPropertyReplacer, properties.getDatabase()); } @@ -620,12 +618,11 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration { RolloutManagement rolloutManagement(final TargetManagement targetManagement, final DeploymentManagement deploymentManagement, final RolloutGroupManagement rolloutGroupManagement, final DistributionSetManagement distributionSetManagement, final ApplicationContext context, - final BusProperties bus, final ApplicationEventPublisher eventPublisher, - final VirtualPropertyReplacer virtualPropertyReplacer, final PlatformTransactionManager txManager, - final TenantAware tenantAware, final LockRegistry lockRegistry, final JpaProperties properties, - final RolloutApprovalStrategy rolloutApprovalStrategy) { + final EventPublisherHolder eventPublisherHolder, final VirtualPropertyReplacer virtualPropertyReplacer, + final PlatformTransactionManager txManager, final TenantAware tenantAware, final LockRegistry lockRegistry, + final JpaProperties properties, final RolloutApprovalStrategy rolloutApprovalStrategy) { return new JpaRolloutManagement(targetManagement, deploymentManagement, rolloutGroupManagement, - distributionSetManagement, context, bus, eventPublisher, virtualPropertyReplacer, txManager, + distributionSetManagement, context, eventPublisherHolder, virtualPropertyReplacer, txManager, tenantAware, lockRegistry, properties.getDatabase(), rolloutApprovalStrategy); } @@ -670,14 +667,13 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration { final ActionRepository actionRepository, final DistributionSetRepository distributionSetRepository, final TargetRepository targetRepository, final ActionStatusRepository actionStatusRepository, final TargetManagement targetManagement, final AuditorAware auditorProvider, - final ApplicationEventPublisher eventPublisher, final BusProperties bus, - final AfterTransactionCommitExecutor afterCommit, final VirtualPropertyReplacer virtualPropertyReplacer, - final PlatformTransactionManager txManager, + final EventPublisherHolder eventPublisherHolder, final AfterTransactionCommitExecutor afterCommit, + final VirtualPropertyReplacer virtualPropertyReplacer, final PlatformTransactionManager txManager, final TenantConfigurationManagement tenantConfigurationManagement, final QuotaManagement quotaManagement, final SystemSecurityContext systemSecurityContext, final TenantAware tenantAware, final JpaProperties properties) { return new JpaDeploymentManagement(entityManager, actionRepository, distributionSetRepository, targetRepository, - actionStatusRepository, targetManagement, auditorProvider, eventPublisher, bus, afterCommit, + actionStatusRepository, targetManagement, auditorProvider, eventPublisherHolder, afterCommit, virtualPropertyReplacer, txManager, tenantConfigurationManagement, quotaManagement, systemSecurityContext, tenantAware, properties.getDatabase()); } diff --git a/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util/AbstractIntegrationTest.java b/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util/AbstractIntegrationTest.java index ed4146458..8b266c54a 100644 --- a/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util/AbstractIntegrationTest.java +++ b/hawkbit-repository/hawkbit-repository-test/src/main/java/org/eclipse/hawkbit/repository/test/util/AbstractIntegrationTest.java @@ -200,7 +200,7 @@ public abstract class AbstractIntegrationTest { protected ServiceMatcher serviceMatcher; @Autowired - private ApplicationEventPublisher eventPublisher; + protected ApplicationEventPublisher eventPublisher; @Rule public final WithSpringAuthorityRule securityRule = new WithSpringAuthorityRule(); @@ -230,9 +230,8 @@ public abstract class AbstractIntegrationTest { protected DistributionSetAssignmentResult assignDistributionSet(final long dsID, final String controllerId, final ActionType actionType) { - return deploymentManagement.assignDistributionSet(dsID, - Collections.singletonList(new TargetWithActionType(controllerId, actionType, - RepositoryModelConstants.NO_FORCE_TIME))); + return deploymentManagement.assignDistributionSet(dsID, Collections.singletonList( + new TargetWithActionType(controllerId, actionType, RepositoryModelConstants.NO_FORCE_TIME))); } /** diff --git a/hawkbit-rest/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootController.java b/hawkbit-rest/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootController.java index c5cd3cdc9..d3c48b5a4 100644 --- a/hawkbit-rest/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootController.java +++ b/hawkbit-rest/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootController.java @@ -63,6 +63,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.bus.BusProperties; +import org.springframework.cloud.bus.ServiceMatcher; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Scope; import org.springframework.http.HttpHeaders; @@ -93,6 +94,9 @@ public class DdiRootController implements DdiRootControllerRestApi { @Autowired private ApplicationEventPublisher eventPublisher; + @Autowired(required = false) + private ServiceMatcher serviceMatcher; + @Autowired private BusProperties bus; @@ -194,9 +198,10 @@ public class DdiRootController implements DdiRootControllerRestApi { result = FileStreamingUtil.writeFileResponse(file, artifact.getFilename(), artifact.getCreatedAt(), requestResponseContextHolder.getHttpServletResponse(), requestResponseContextHolder.getHttpServletRequest(), - (length, shippedSinceLastEvent, total) -> eventPublisher - .publishEvent(new DownloadProgressEvent(tenantAware.getCurrentTenant(), statusId, - shippedSinceLastEvent, bus.getId()))); + (length, shippedSinceLastEvent, + total) -> eventPublisher.publishEvent(new DownloadProgressEvent( + tenantAware.getCurrentTenant(), statusId, shippedSinceLastEvent, + serviceMatcher != null ? serviceMatcher.getServiceId() : bus.getId()))); } }