From 84519b77ab5b593a88be79c959cf2f058935e500 Mon Sep 17 00:00:00 2001 From: SirWayne Date: Wed, 23 Mar 2016 15:12:12 +0100 Subject: [PATCH 01/10] Disable to set the current page first item id Signed-off-by: SirWayne --- .../java/org/eclipse/hawkbit/app/MyUI.java | 3 +- .../org/eclipse/hawkbit/ui/EventProvider.java | 16 +++ .../hawkbit/ui/HawkbitEventProvider.java | 43 ++++++++ .../management/targettable/TargetTable.java | 6 +- .../ui/push/DelayedEventBusPushStrategy.java | 102 ++++++++++++------ 5 files changed, 130 insertions(+), 40 deletions(-) create mode 100644 hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/EventProvider.java create mode 100644 hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java diff --git a/examples/hawkbit-example-app/src/main/java/org/eclipse/hawkbit/app/MyUI.java b/examples/hawkbit-example-app/src/main/java/org/eclipse/hawkbit/app/MyUI.java index e55cb02d2..bbb348961 100644 --- a/examples/hawkbit-example-app/src/main/java/org/eclipse/hawkbit/app/MyUI.java +++ b/examples/hawkbit-example-app/src/main/java/org/eclipse/hawkbit/app/MyUI.java @@ -8,6 +8,7 @@ */ package org.eclipse.hawkbit.app; +import org.eclipse.hawkbit.ui.HawkbitEventProvider; import org.eclipse.hawkbit.ui.HawkbitUI; import org.eclipse.hawkbit.ui.push.DelayedEventBusPushStrategy; import org.springframework.beans.factory.annotation.Autowired; @@ -34,6 +35,6 @@ public class MyUI extends HawkbitUI { @Autowired public MyUI(final EventBus systemEventBus, final org.vaadin.spring.events.EventBus.SessionEventBus eventBus) { - super(new DelayedEventBusPushStrategy(eventBus, systemEventBus)); + super(new DelayedEventBusPushStrategy(eventBus, systemEventBus, new HawkbitEventProvider())); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/EventProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/EventProvider.java new file mode 100644 index 000000000..0ae83af01 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/EventProvider.java @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2011-2016 Bosch Software Innovations GmbH, Germany. All rights reserved. + */ +package org.eclipse.hawkbit.ui; + +import java.util.Set; + +/** + * + */ +public interface EventProvider { + + Set> getSingleEvents(); + + Set> getBulkEvents(); +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java new file mode 100644 index 000000000..8600b8e20 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2011-2016 Bosch Software Innovations GmbH, Germany. All rights reserved. + */ +package org.eclipse.hawkbit.ui; + +import java.util.Set; + +import org.eclipse.hawkbit.eventbus.event.DistributionSetTagCreatedBulkEvent; +import org.eclipse.hawkbit.eventbus.event.DistributionSetTagDeletedEvent; +import org.eclipse.hawkbit.eventbus.event.DistributionSetTagUpdateEvent; +import org.eclipse.hawkbit.eventbus.event.RolloutChangeEvent; +import org.eclipse.hawkbit.eventbus.event.RolloutGroupChangeEvent; +import org.eclipse.hawkbit.eventbus.event.TargetCreatedEvent; +import org.eclipse.hawkbit.eventbus.event.TargetDeletedEvent; +import org.eclipse.hawkbit.eventbus.event.TargetInfoUpdateEvent; +import org.eclipse.hawkbit.eventbus.event.TargetTagCreatedBulkEvent; + +import com.google.common.collect.Sets; + +/** + * @author Dennis Melzer + * + */ +public class HawkbitEventProvider implements EventProvider { + + private static final Set> SINGLE_EVENTS = Sets.newHashSet(TargetTagCreatedBulkEvent.class, + DistributionSetTagCreatedBulkEvent.class, DistributionSetTagDeletedEvent.class, + DistributionSetTagUpdateEvent.class, RolloutGroupChangeEvent.class, RolloutChangeEvent.class); + + private static final Set> BULD_EVENTS = Sets.newHashSet(TargetCreatedEvent.class, + TargetInfoUpdateEvent.class, TargetDeletedEvent.class); + + @Override + public Set> getSingleEvents() { + return SINGLE_EVENTS; + } + + @Override + public Set> getBulkEvents() { + return BULD_EVENTS; + } + +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java index 960553a6a..b8b59cb91 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java @@ -15,7 +15,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -141,8 +140,6 @@ public class TargetTable extends AbstractTable implements Handler { private Boolean isTargetPinned = Boolean.FALSE; private ShortcutAction actionSelectAll; private ShortcutAction actionUnSelectAll; - - @Override @PostConstruct @@ -349,7 +346,8 @@ public class TargetTable extends AbstractTable implements Handler { @Override protected Object getItemIdToSelect() { if (managementUIState.getSelectedTargetIdName().isPresent()) { - setCurrentPageFirstItemId(managementUIState.getLastSelectedTargetIdName()); + LOG.info("****** getItemIdToSelect *********"); + // setCurrentPageFirstItemId(managementUIState.getLastSelectedTargetIdName()); return managementUIState.getSelectedTargetIdName().get(); } return null; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/push/DelayedEventBusPushStrategy.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/push/DelayedEventBusPushStrategy.java index 87fcbe922..5ac9362fe 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/push/DelayedEventBusPushStrategy.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/push/DelayedEventBusPushStrategy.java @@ -8,6 +8,7 @@ */ package org.eclipse.hawkbit.ui.push; +import java.time.Instant; import java.util.LinkedList; import java.util.List; import java.util.Set; @@ -19,15 +20,10 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import org.eclipse.hawkbit.eventbus.event.DistributionSetTagCreatedBulkEvent; import org.eclipse.hawkbit.eventbus.event.EntityEvent; -import org.eclipse.hawkbit.eventbus.event.RolloutChangeEvent; -import org.eclipse.hawkbit.eventbus.event.RolloutGroupChangeEvent; -import org.eclipse.hawkbit.eventbus.event.TargetCreatedEvent; -import org.eclipse.hawkbit.eventbus.event.TargetDeletedEvent; -import org.eclipse.hawkbit.eventbus.event.TargetInfoUpdateEvent; -import org.eclipse.hawkbit.eventbus.event.TargetTagCreatedBulkEvent; +import org.eclipse.hawkbit.eventbus.event.Event; import org.eclipse.hawkbit.im.authentication.TenantAwareAuthenticationDetails; +import org.eclipse.hawkbit.ui.EventProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.context.SecurityContext; @@ -36,7 +32,6 @@ import org.springframework.security.web.context.HttpSessionSecurityContextReposi import org.vaadin.spring.events.EventBus; import org.vaadin.spring.events.EventBus.SessionEventBus; -import com.google.common.collect.Sets; import com.google.common.eventbus.AllowConcurrentEvents; import com.google.common.eventbus.Subscribe; import com.vaadin.server.VaadinSession; @@ -71,12 +66,7 @@ public class DelayedEventBusPushStrategy implements EventPushStrategy { private ScheduledFuture jobHandle; - /** - * only events defined in the set are dispatched to the session event bus. - */ - private static final Set> UI_EVENTS = Sets.newHashSet(TargetInfoUpdateEvent.class, - TargetCreatedEvent.class, TargetDeletedEvent.class, RolloutChangeEvent.class, RolloutGroupChangeEvent.class, - TargetTagCreatedBulkEvent.class, DistributionSetTagCreatedBulkEvent.class); + private final EventProvider eventProvider; /** * Constructor. @@ -88,9 +78,10 @@ public class DelayedEventBusPushStrategy implements EventPushStrategy { * back-end */ public DelayedEventBusPushStrategy(final SessionEventBus eventBus, - final com.google.common.eventbus.EventBus systemEventBus) { + final com.google.common.eventbus.EventBus systemEventBus, final EventProvider eventProvider) { this.eventBus = eventBus; this.systemEventBus = systemEventBus; + this.eventProvider = eventProvider; } /** @@ -105,12 +96,22 @@ public class DelayedEventBusPushStrategy implements EventPushStrategy { @AllowConcurrentEvents public void dispatch(final org.eclipse.hawkbit.eventbus.event.Event event) { // to dispatch too many events which are not interested on the UI - if (UI_EVENTS.contains(event.getClass()) && !queue.offer(event)) { + if (!isEventProvided(event)) { + LOG.trace("Event is not supported in the UI!!! Dropped event is {}", event); + return; + } + + if (!queue.offer(event)) { LOG.warn("Deque limit is reached, cannot add more events!!! Dropped event is {}", event); return; } } + private boolean isEventProvided(final org.eclipse.hawkbit.eventbus.event.Event event) { + return eventProvider.getSingleEvents().contains(event.getClass()) + || eventProvider.getBulkEvents().contains(event.getClass()); + } + @Override public void init(final UI vaadinUI) { LOG.debug("Initialize delayed event push strategy"); @@ -152,6 +153,9 @@ public class DelayedEventBusPushStrategy implements EventPushStrategy { return false; } + private static int addAccess = 0; + private static int startAccess = 0; + private final class DispatchRunnable implements Runnable { private final UI vaadinUI; @@ -206,38 +210,66 @@ public class DelayedEventBusPushStrategy implements EventPushStrategy { final SecurityContext oldContext = SecurityContextHolder.getContext(); try { SecurityContextHolder.setContext(userContext); + + // TODO viele kleine access? + addAccess++; + final int endAddAccess = addAccess; + LOG.info("Add Access to runnable{}", addAccess); vaadinUI.access(() -> { + startAccess++; + final int currentAccess = startAccess; + LOG.info("Started Access {}", currentAccess); + final Instant startAcess = Instant.now(); + if (vaadinSession.getState() != State.OPEN) { return; } - fowardEvents(events, userContext); - - // send a list of events, because ui performance issues - publishEventAsList(events, userContext, TargetInfoUpdateEvent.class); - publishEventAsList(events, userContext, TargetCreatedEvent.class); - publishEventAsList(events, userContext, TargetDeletedEvent.class); + fowardSingleEvents(events, userContext); + fowardBulkEvents(events, userContext); + berechneDauer(startAcess, "End Access " + currentAccess); }); + + LOG.info("End add Access to runnable{}", endAddAccess); } finally { SecurityContextHolder.setContext(oldContext); } } - private void publishEventAsList(final List events, - final SecurityContext userContext, final Class eventType) { - final List bulkEvents = events.stream() - .filter(event -> DelayedEventBusPushStrategy.this.eventSecurityCheck(userContext, event) - && eventType.isInstance(event)) - .collect(Collectors.toList()); - if (bulkEvents.isEmpty()) { - return; - } - eventBus.publish(vaadinUI, bulkEvents); + private void berechneDauer(final Instant start, final String methode) { + final Instant end = Instant.now(); + final long second = end.getEpochSecond() - start.getEpochSecond(); + LOG.info("Dauer {} {} sekunden.", methode, second); } - private void fowardEvents(final List events, + private void fowardBulkEvents(final List events, final SecurityContext userContext) { - events.stream().filter(event -> DelayedEventBusPushStrategy.this.eventSecurityCheck(userContext, event)) - .forEach(event -> eventBus.publish(vaadinUI, event)); + final Set> filterBulkEvenTypes = events.stream().map(Event::getClass) + .filter(eventClass -> eventProvider.getBulkEvents().contains(eventClass)) + .collect(Collectors.toSet()); + publishBulkEvent(events, userContext, filterBulkEvenTypes); + } + + private void publishBulkEvent(final List events, + final SecurityContext userContext, final Set> filterBulkEvenTypes) { + for (final Class bulkType : filterBulkEvenTypes) { + final List listBulkEvents = events.stream() + .filter(event -> DelayedEventBusPushStrategy.this.eventSecurityCheck(userContext, event) + && bulkType.isInstance(event)) + .collect(Collectors.toList()); + if (!listBulkEvents.isEmpty()) { + LOG.info("Publish bulk event"); + eventBus.publish(vaadinUI, listBulkEvents); + } + } + } + + private void fowardSingleEvents(final List events, + final SecurityContext userContext) { + events.stream().filter(event -> DelayedEventBusPushStrategy.this.eventSecurityCheck(userContext, event) + && eventProvider.getSingleEvents().contains(event.getClass())).forEach(event -> { + LOG.info("Publish single event"); + eventBus.publish(vaadinUI, event); + }); } } From 7e75b79cbec808bf3cad9b5a6883427e8880468d Mon Sep 17 00:00:00 2001 From: SirWayne Date: Thu, 24 Mar 2016 12:00:07 +0100 Subject: [PATCH 02/10] Add a event provider which hold the repository events which are provided by the ui. fix the performance issue. Issue was the selection of targets. The table needs very long to calculate the scroll position. Signed-off-by: SirWayne --- .../autoconfigure/ui/UIAutoConfiguration.java | 15 ++++- .../hawkbit/repository/RolloutScheduler.java | 42 +++++++------- .../org/eclipse/hawkbit/ui/EventProvider.java | 16 ------ .../hawkbit/ui/HawkbitEventProvider.java | 37 +++++++----- .../eclipse/hawkbit/ui/UIEventProvider.java | 56 +++++++++++++++++++ .../management/targettable/TargetTable.java | 41 ++------------ .../ui/push/DelayedEventBusPushStrategy.java | 43 +++----------- 7 files changed, 124 insertions(+), 126 deletions(-) delete mode 100644 hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/EventProvider.java create mode 100644 hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UIEventProvider.java diff --git a/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/ui/UIAutoConfiguration.java b/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/ui/UIAutoConfiguration.java index ff73eff7b..7b3302533 100644 --- a/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/ui/UIAutoConfiguration.java +++ b/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/ui/UIAutoConfiguration.java @@ -9,6 +9,8 @@ package org.eclipse.hawkbit.autoconfigure.ui; import org.eclipse.hawkbit.DistributedResourceBundleMessageSource; +import org.eclipse.hawkbit.ui.HawkbitEventProvider; +import org.eclipse.hawkbit.ui.UIEventProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.vaadin.spring.annotation.EnableVaadinExtensions; @@ -17,9 +19,6 @@ import org.vaadin.spring.security.annotation.EnableVaadinSecurity; /** * The hawkbit-ui autoconfiguration. - * - * - * */ @Configuration @EnableVaadinSecurity @@ -37,4 +36,14 @@ public class UIAutoConfiguration { return new DistributedResourceBundleMessageSource(); } + /** + * A event provider bean which hold the supported events for the UI. + * + * @return the provider bean + */ + @Bean + public UIEventProvider eventProvider() { + return new HawkbitEventProvider(); + } + } diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/RolloutScheduler.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/RolloutScheduler.java index 6671ad896..9b45e661f 100644 --- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/RolloutScheduler.java +++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/RolloutScheduler.java @@ -8,8 +8,6 @@ */ package org.eclipse.hawkbit.repository; -import java.util.List; - import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.tenancy.TenantAware; import org.slf4j.Logger; @@ -56,25 +54,25 @@ public class RolloutScheduler { */ @Scheduled(initialDelayString = RolloutProperties.Scheduler.PROP_SCHEDULER_DELAY_PLACEHOLDER, fixedDelayString = RolloutProperties.Scheduler.PROP_SCHEDULER_DELAY_PLACEHOLDER) public void rolloutScheduler() { - logger.debug("rollout schedule checker has been triggered."); - // run this code in system code privileged to have the necessary - // permission to query and create entities. - systemSecurityContext.runAsSystem(() -> { - // workaround eclipselink that is currently not possible to - // execute a query without multitenancy if MultiTenant - // annotation is used. - // https://bugs.eclipse.org/bugs/show_bug.cgi?id=355458. So - // iterate through all tenants and execute the rollout check for - // each tenant seperately. - final List tenants = systemManagement.findTenants(); - logger.info("Checking rollouts for {} tenants", tenants.size()); - for (final String tenant : tenants) { - tenantAware.runAsTenant(tenant, () -> { - rolloutManagement.checkRunningRollouts(rolloutProperties.getScheduler().getFixedDelay()); - return null; - }); - } - return null; - }); + // logger.debug("rollout schedule checker has been triggered."); + // // run this code in system code privileged to have the necessary + // // permission to query and create entities. + // systemSecurityContext.runAsSystem(() -> { + // // workaround eclipselink that is currently not possible to + // // execute a query without multitenancy if MultiTenant + // // annotation is used. + // // https://bugs.eclipse.org/bugs/show_bug.cgi?id=355458. So + // // iterate through all tenants and execute the rollout check for + // // each tenant seperately. + // final List tenants = systemManagement.findTenants(); + // logger.info("Checking rollouts for {} tenants", tenants.size()); + // for (final String tenant : tenants) { + // tenantAware.runAsTenant(tenant, () -> { + // rolloutManagement.checkRunningRollouts(rolloutProperties.getScheduler().getFixedDelay()); + // return null; + // }); + // } + // return null; + // }); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/EventProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/EventProvider.java deleted file mode 100644 index 0ae83af01..000000000 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/EventProvider.java +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) 2011-2016 Bosch Software Innovations GmbH, Germany. All rights reserved. - */ -package org.eclipse.hawkbit.ui; - -import java.util.Set; - -/** - * - */ -public interface EventProvider { - - Set> getSingleEvents(); - - Set> getBulkEvents(); -} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java index 8600b8e20..8afb46ba7 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java @@ -3,11 +3,13 @@ */ package org.eclipse.hawkbit.ui; +import java.util.HashSet; import java.util.Set; import org.eclipse.hawkbit.eventbus.event.DistributionSetTagCreatedBulkEvent; import org.eclipse.hawkbit.eventbus.event.DistributionSetTagDeletedEvent; import org.eclipse.hawkbit.eventbus.event.DistributionSetTagUpdateEvent; +import org.eclipse.hawkbit.eventbus.event.Event; import org.eclipse.hawkbit.eventbus.event.RolloutChangeEvent; import org.eclipse.hawkbit.eventbus.event.RolloutGroupChangeEvent; import org.eclipse.hawkbit.eventbus.event.TargetCreatedEvent; @@ -15,29 +17,38 @@ import org.eclipse.hawkbit.eventbus.event.TargetDeletedEvent; import org.eclipse.hawkbit.eventbus.event.TargetInfoUpdateEvent; import org.eclipse.hawkbit.eventbus.event.TargetTagCreatedBulkEvent; -import com.google.common.collect.Sets; - /** - * @author Dennis Melzer - * + * The default hawkbit event provider. */ -public class HawkbitEventProvider implements EventProvider { +public class HawkbitEventProvider implements UIEventProvider { - private static final Set> SINGLE_EVENTS = Sets.newHashSet(TargetTagCreatedBulkEvent.class, - DistributionSetTagCreatedBulkEvent.class, DistributionSetTagDeletedEvent.class, - DistributionSetTagUpdateEvent.class, RolloutGroupChangeEvent.class, RolloutChangeEvent.class); + private static final Set> SINGLE_EVENTS = new HashSet<>(); - private static final Set> BULD_EVENTS = Sets.newHashSet(TargetCreatedEvent.class, - TargetInfoUpdateEvent.class, TargetDeletedEvent.class); + static { + SINGLE_EVENTS.add(TargetTagCreatedBulkEvent.class); + SINGLE_EVENTS.add(DistributionSetTagCreatedBulkEvent.class); + SINGLE_EVENTS.add(DistributionSetTagDeletedEvent.class); + SINGLE_EVENTS.add(DistributionSetTagUpdateEvent.class); + SINGLE_EVENTS.add(RolloutGroupChangeEvent.class); + SINGLE_EVENTS.add(RolloutChangeEvent.class); + } + + private static final Set> BULK_EVENTS = new HashSet<>(); + + static { + BULK_EVENTS.add(TargetCreatedEvent.class); + BULK_EVENTS.add(TargetInfoUpdateEvent.class); + BULK_EVENTS.add(TargetDeletedEvent.class); + } @Override - public Set> getSingleEvents() { + public Set> getSingleEvents() { return SINGLE_EVENTS; } @Override - public Set> getBulkEvents() { - return BULD_EVENTS; + public Set> getBulkEvents() { + return BULK_EVENTS; } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UIEventProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UIEventProvider.java new file mode 100644 index 000000000..65f907d94 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UIEventProvider.java @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2011-2016 Bosch Software Innovations GmbH, Germany. All rights reserved. + */ +package org.eclipse.hawkbit.ui; + +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.eclipse.hawkbit.eventbus.event.Event; + +/** + * The UI event provider hold all supported repository events which will + * delegated to the UI. A event type can delegated as single event or bulk + * event. Bulk event means, that all events from one type is collected by the + * provider. The delegater and delegated as a list of this events. + */ +public interface UIEventProvider { + + /** + * Return all supported repository single event types. All events which this + * type are delegated to the UI as single event. + * + * @return list of provided event types. Should not be null + */ + default Set> getSingleEvents() { + return Collections.emptySet(); + } + + /** + * Return all supported repository bulk event types. All events which this + * type are delegated to the UI as a list. This list contains all collected + * events from one type. + * + * @return list of provided bulk event types. Should not be null + */ + default Set> getBulkEvents() { + return Collections.emptySet(); + } + + /** + * Return all filtered bulk event types by the given events. The default + * maps the events by class. + * + * @param allEvents + * the events + * @return list of provided bulk event types which are filtered. Should not + * be null + */ + default Set> getFilteredBulkEventsType(final List allEvents) { + return allEvents.stream().map(Event::getClass).filter(eventClass -> getBulkEvents().contains(eventClass)) + .collect(Collectors.toSet()); + } + +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java index b8b59cb91..66417986f 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java @@ -104,12 +104,11 @@ import com.vaadin.ui.themes.ValoTheme; @ViewScope public class TargetTable extends AbstractTable implements Handler { + private static final Logger LOG = LoggerFactory.getLogger(TargetTable.class); private static final String TARGET_PINNED = "targetPinned"; private static final long serialVersionUID = -2300392868806614568L; - private static final Logger LOG = LoggerFactory.getLogger(TargetTable.class); - private static final int PROPERTY_DEPT = 3; private static final String ITEMID = "itemId"; private static final String ACTION_NOT_ALLOWED_MSG = "message.action.not.allowed"; @@ -326,39 +325,20 @@ public class TargetTable extends AbstractTable implements Handler { (source, itemId, columnId) -> getTagetPollTime(itemId)); } - /* - * (non-Javadoc) - * - * @see org.eclipse.hawkbit.server.ui.common.table.AbstractTable# - * isFirstRowSelectedOnLoad () - */ @Override protected boolean isFirstRowSelectedOnLoad() { return !managementUIState.getSelectedTargetIdName().isPresent() || managementUIState.getSelectedTargetIdName().get().isEmpty(); } - /* - * (non-Javadoc) - * - * @see hawkbit.server.ui.common.table.AbstractTable#getItemIdToSelect() - */ @Override protected Object getItemIdToSelect() { if (managementUIState.getSelectedTargetIdName().isPresent()) { - LOG.info("****** getItemIdToSelect *********"); - // setCurrentPageFirstItemId(managementUIState.getLastSelectedTargetIdName()); return managementUIState.getSelectedTargetIdName().get(); } return null; } - /* - * (non-Javadoc) - * - * @see - * org.eclipse.hawkbit.server.ui.common.table.AbstractTable#onValueChange() - */ @Override protected void onValueChange() { eventBus.publish(this, DragEvent.HIDE_DROP_HINT); @@ -378,23 +358,11 @@ public class TargetTable extends AbstractTable implements Handler { } } - /* - * (non-Javadoc) - * - * @see - * org.eclipse.hawkbit.server.ui.common.table.AbstractTable#isMaximized() - */ @Override protected boolean isMaximized() { return managementUIState.isTargetTableMaximized(); } - /* - * (non-Javadoc) - * - * @see hawkbit.server.ui.common.table.AbstractTable#getTableVisibleColumns - * () - */ @Override protected List getTableVisibleColumns() { final List columnList = new ArrayList<>(); @@ -451,14 +419,13 @@ public class TargetTable extends AbstractTable implements Handler { } else { shouldRefreshTargets = true; } - unselect(targetIdName); } + if (shouldRefreshTargets) { refreshOnDelete(); - } else { - targetContainer.commit(); - selectRow(); } + + unSelectAll(); } private void refreshOnDelete() { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/push/DelayedEventBusPushStrategy.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/push/DelayedEventBusPushStrategy.java index 5ac9362fe..4d267167e 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/push/DelayedEventBusPushStrategy.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/push/DelayedEventBusPushStrategy.java @@ -8,7 +8,6 @@ */ package org.eclipse.hawkbit.ui.push; -import java.time.Instant; import java.util.LinkedList; import java.util.List; import java.util.Set; @@ -21,9 +20,8 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import org.eclipse.hawkbit.eventbus.event.EntityEvent; -import org.eclipse.hawkbit.eventbus.event.Event; import org.eclipse.hawkbit.im.authentication.TenantAwareAuthenticationDetails; -import org.eclipse.hawkbit.ui.EventProvider; +import org.eclipse.hawkbit.ui.UIEventProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.context.SecurityContext; @@ -66,7 +64,7 @@ public class DelayedEventBusPushStrategy implements EventPushStrategy { private ScheduledFuture jobHandle; - private final EventProvider eventProvider; + private final UIEventProvider eventProvider; /** * Constructor. @@ -78,7 +76,7 @@ public class DelayedEventBusPushStrategy implements EventPushStrategy { * back-end */ public DelayedEventBusPushStrategy(final SessionEventBus eventBus, - final com.google.common.eventbus.EventBus systemEventBus, final EventProvider eventProvider) { + final com.google.common.eventbus.EventBus systemEventBus, final UIEventProvider eventProvider) { this.eventBus = eventBus; this.systemEventBus = systemEventBus; this.eventProvider = eventProvider; @@ -153,9 +151,6 @@ public class DelayedEventBusPushStrategy implements EventPushStrategy { return false; } - private static int addAccess = 0; - private static int startAccess = 0; - private final class DispatchRunnable implements Runnable { private final UI vaadinUI; @@ -211,41 +206,21 @@ public class DelayedEventBusPushStrategy implements EventPushStrategy { try { SecurityContextHolder.setContext(userContext); - // TODO viele kleine access? - addAccess++; - final int endAddAccess = addAccess; - LOG.info("Add Access to runnable{}", addAccess); vaadinUI.access(() -> { - startAccess++; - final int currentAccess = startAccess; - LOG.info("Started Access {}", currentAccess); - final Instant startAcess = Instant.now(); - if (vaadinSession.getState() != State.OPEN) { return; } fowardSingleEvents(events, userContext); fowardBulkEvents(events, userContext); - berechneDauer(startAcess, "End Access " + currentAccess); }); - - LOG.info("End add Access to runnable{}", endAddAccess); } finally { SecurityContextHolder.setContext(oldContext); } } - private void berechneDauer(final Instant start, final String methode) { - final Instant end = Instant.now(); - final long second = end.getEpochSecond() - start.getEpochSecond(); - LOG.info("Dauer {} {} sekunden.", methode, second); - } - private void fowardBulkEvents(final List events, final SecurityContext userContext) { - final Set> filterBulkEvenTypes = events.stream().map(Event::getClass) - .filter(eventClass -> eventProvider.getBulkEvents().contains(eventClass)) - .collect(Collectors.toSet()); + final Set> filterBulkEvenTypes = eventProvider.getFilteredBulkEventsType(events); publishBulkEvent(events, userContext, filterBulkEvenTypes); } @@ -257,7 +232,6 @@ public class DelayedEventBusPushStrategy implements EventPushStrategy { && bulkType.isInstance(event)) .collect(Collectors.toList()); if (!listBulkEvents.isEmpty()) { - LOG.info("Publish bulk event"); eventBus.publish(vaadinUI, listBulkEvents); } } @@ -265,11 +239,10 @@ public class DelayedEventBusPushStrategy implements EventPushStrategy { private void fowardSingleEvents(final List events, final SecurityContext userContext) { - events.stream().filter(event -> DelayedEventBusPushStrategy.this.eventSecurityCheck(userContext, event) - && eventProvider.getSingleEvents().contains(event.getClass())).forEach(event -> { - LOG.info("Publish single event"); - eventBus.publish(vaadinUI, event); - }); + events.stream() + .filter(event -> DelayedEventBusPushStrategy.this.eventSecurityCheck(userContext, event) + && eventProvider.getSingleEvents().contains(event.getClass())) + .forEach(event -> eventBus.publish(vaadinUI, event)); } } From b837defb13c3e8b48775163bf1a1e144c5a231c0 Mon Sep 17 00:00:00 2001 From: SirWayne Date: Thu, 24 Mar 2016 12:12:28 +0100 Subject: [PATCH 03/10] Revert uncomment code Signed-off-by: SirWayne --- .../hawkbit/repository/RolloutScheduler.java | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/RolloutScheduler.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/RolloutScheduler.java index 9b45e661f..6671ad896 100644 --- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/RolloutScheduler.java +++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/RolloutScheduler.java @@ -8,6 +8,8 @@ */ package org.eclipse.hawkbit.repository; +import java.util.List; + import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.tenancy.TenantAware; import org.slf4j.Logger; @@ -54,25 +56,25 @@ public class RolloutScheduler { */ @Scheduled(initialDelayString = RolloutProperties.Scheduler.PROP_SCHEDULER_DELAY_PLACEHOLDER, fixedDelayString = RolloutProperties.Scheduler.PROP_SCHEDULER_DELAY_PLACEHOLDER) public void rolloutScheduler() { - // logger.debug("rollout schedule checker has been triggered."); - // // run this code in system code privileged to have the necessary - // // permission to query and create entities. - // systemSecurityContext.runAsSystem(() -> { - // // workaround eclipselink that is currently not possible to - // // execute a query without multitenancy if MultiTenant - // // annotation is used. - // // https://bugs.eclipse.org/bugs/show_bug.cgi?id=355458. So - // // iterate through all tenants and execute the rollout check for - // // each tenant seperately. - // final List tenants = systemManagement.findTenants(); - // logger.info("Checking rollouts for {} tenants", tenants.size()); - // for (final String tenant : tenants) { - // tenantAware.runAsTenant(tenant, () -> { - // rolloutManagement.checkRunningRollouts(rolloutProperties.getScheduler().getFixedDelay()); - // return null; - // }); - // } - // return null; - // }); + logger.debug("rollout schedule checker has been triggered."); + // run this code in system code privileged to have the necessary + // permission to query and create entities. + systemSecurityContext.runAsSystem(() -> { + // workaround eclipselink that is currently not possible to + // execute a query without multitenancy if MultiTenant + // annotation is used. + // https://bugs.eclipse.org/bugs/show_bug.cgi?id=355458. So + // iterate through all tenants and execute the rollout check for + // each tenant seperately. + final List tenants = systemManagement.findTenants(); + logger.info("Checking rollouts for {} tenants", tenants.size()); + for (final String tenant : tenants) { + tenantAware.runAsTenant(tenant, () -> { + rolloutManagement.checkRunningRollouts(rolloutProperties.getScheduler().getFixedDelay()); + return null; + }); + } + return null; + }); } } From cbefcb2f53109fab8808e911e549e3e2e06b4d90 Mon Sep 17 00:00:00 2001 From: SirWayne Date: Thu, 24 Mar 2016 12:14:08 +0100 Subject: [PATCH 04/10] Add commit Signed-off-by: SirWayne --- .../eclipse/hawkbit/ui/management/targettable/TargetTable.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java index 66417986f..74e93ab6b 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java @@ -423,6 +423,8 @@ public class TargetTable extends AbstractTable implements Handler { if (shouldRefreshTargets) { refreshOnDelete(); + } else { + targetContainer.commit(); } unSelectAll(); From 18b4ac338d3c08e074a4b0f72ac1fc006bbd5677 Mon Sep 17 00:00:00 2001 From: SirWayne Date: Thu, 24 Mar 2016 12:38:06 +0100 Subject: [PATCH 05/10] Reselect items after deletion Signed-off-by: SirWayne --- .../ui/management/targettable/TargetTable.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java index 74e93ab6b..4b57f48c6 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java @@ -426,8 +426,23 @@ public class TargetTable extends AbstractTable implements Handler { } else { targetContainer.commit(); } + reSelectItemsAfterDeletionEvent(); + } + private void reSelectItemsAfterDeletionEvent() { + Set values = new HashSet<>(); + if (isMultiSelect()) { + values = new HashSet<>((Set) getValue()); + } else { + values.add(getValue()); + } unSelectAll(); + + for (final Object value : values) { + if (getVisibleItemIds().contains(value)) { + select(value); + } + } } private void refreshOnDelete() { From 45f6fb80a389fa514fad891b23948555b4c50a2c Mon Sep 17 00:00:00 2001 From: SirWayne Date: Thu, 24 Mar 2016 12:59:29 +0100 Subject: [PATCH 06/10] Fix event provider autowiring Signed-off-by: SirWayne --- .../src/main/java/org/eclipse/hawkbit/app/MyUI.java | 7 ++++--- .../hawkbit/autoconfigure/ui/UIAutoConfiguration.java | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/hawkbit-example-app/src/main/java/org/eclipse/hawkbit/app/MyUI.java b/examples/hawkbit-example-app/src/main/java/org/eclipse/hawkbit/app/MyUI.java index bbb348961..68d3b2fd9 100644 --- a/examples/hawkbit-example-app/src/main/java/org/eclipse/hawkbit/app/MyUI.java +++ b/examples/hawkbit-example-app/src/main/java/org/eclipse/hawkbit/app/MyUI.java @@ -8,8 +8,8 @@ */ package org.eclipse.hawkbit.app; -import org.eclipse.hawkbit.ui.HawkbitEventProvider; import org.eclipse.hawkbit.ui.HawkbitUI; +import org.eclipse.hawkbit.ui.UIEventProvider; import org.eclipse.hawkbit.ui.push.DelayedEventBusPushStrategy; import org.springframework.beans.factory.annotation.Autowired; @@ -34,7 +34,8 @@ public class MyUI extends HawkbitUI { private static final long serialVersionUID = 1L; @Autowired - public MyUI(final EventBus systemEventBus, final org.vaadin.spring.events.EventBus.SessionEventBus eventBus) { - super(new DelayedEventBusPushStrategy(eventBus, systemEventBus, new HawkbitEventProvider())); + public MyUI(final EventBus systemEventBus, final org.vaadin.spring.events.EventBus.SessionEventBus eventBus, + final UIEventProvider provider) { + super(new DelayedEventBusPushStrategy(eventBus, systemEventBus, provider)); } } diff --git a/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/ui/UIAutoConfiguration.java b/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/ui/UIAutoConfiguration.java index 7b3302533..be66904d5 100644 --- a/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/ui/UIAutoConfiguration.java +++ b/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/ui/UIAutoConfiguration.java @@ -11,6 +11,7 @@ package org.eclipse.hawkbit.autoconfigure.ui; import org.eclipse.hawkbit.DistributedResourceBundleMessageSource; import org.eclipse.hawkbit.ui.HawkbitEventProvider; import org.eclipse.hawkbit.ui.UIEventProvider; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.vaadin.spring.annotation.EnableVaadinExtensions; @@ -42,6 +43,7 @@ public class UIAutoConfiguration { * @return the provider bean */ @Bean + @ConditionalOnMissingBean public UIEventProvider eventProvider() { return new HawkbitEventProvider(); } From 53fbe367e479a84575002d4be2ecb6031cd18c43 Mon Sep 17 00:00:00 2001 From: SirWayne Date: Thu, 24 Mar 2016 13:16:37 +0100 Subject: [PATCH 07/10] Sonar fix Signed-off-by: SirWayne --- .../src/main/java/org/eclipse/hawkbit/ui/UIEventProvider.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UIEventProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UIEventProvider.java index 65f907d94..25890f9f1 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UIEventProvider.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UIEventProvider.java @@ -49,8 +49,7 @@ public interface UIEventProvider { * be null */ default Set> getFilteredBulkEventsType(final List allEvents) { - return allEvents.stream().map(Event::getClass).filter(eventClass -> getBulkEvents().contains(eventClass)) - .collect(Collectors.toSet()); + return allEvents.stream().map(Event::getClass).filter(getBulkEvents()::contains).collect(Collectors.toSet()); } } From 5232058433ffa98ec62be88eedaedb849601e5d5 Mon Sep 17 00:00:00 2001 From: SirWayne Date: Thu, 24 Mar 2016 17:24:58 +0100 Subject: [PATCH 08/10] Add license header Signed-off-by: SirWayne --- .../org/eclipse/hawkbit/ui/HawkbitEventProvider.java | 9 +++++++-- .../java/org/eclipse/hawkbit/ui/UIEventProvider.java | 7 ++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java index 8afb46ba7..885576fef 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java @@ -1,6 +1,11 @@ /** - * Copyright (c) 2011-2016 Bosch Software Innovations GmbH, Germany. All rights reserved. - */ + * Copyright (c) 2015 Bosch Software Innovations GmbH and others. +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*/ package org.eclipse.hawkbit.ui; import java.util.HashSet; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UIEventProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UIEventProvider.java index 25890f9f1..5663ce897 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UIEventProvider.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UIEventProvider.java @@ -1,5 +1,10 @@ /** - * Copyright (c) 2011-2016 Bosch Software Innovations GmbH, Germany. All rights reserved. + * Copyright (c) 2015 Bosch Software Innovations GmbH and others. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html */ package org.eclipse.hawkbit.ui; From c14d534fe143e3cd842b3e58db974c45ae2eb39d Mon Sep 17 00:00:00 2001 From: SirWayne Date: Thu, 24 Mar 2016 18:04:56 +0100 Subject: [PATCH 09/10] Add license header Signed-off-by: SirWayne --- .../org/eclipse/hawkbit/ui/HawkbitEventProvider.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java index 885576fef..f026378b9 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java @@ -1,11 +1,11 @@ /** * Copyright (c) 2015 Bosch Software Innovations GmbH and others. -* -* All rights reserved. This program and the accompanying materials -* are made available under the terms of the Eclipse Public License v1.0 -* which accompanies this distribution, and is available at -* http://www.eclipse.org/legal/epl-v10.html -*/ + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ package org.eclipse.hawkbit.ui; import java.util.HashSet; From d23a1aecb41aa17f8ea88d0aa12999dba7c543cf Mon Sep 17 00:00:00 2001 From: SirWayne Date: Tue, 29 Mar 2016 12:01:27 +0200 Subject: [PATCH 10/10] - Add fixed size for hashset - Use 1 static block Signed-off-by: SirWayne --- .../java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java index f026378b9..12bcaacbc 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/HawkbitEventProvider.java @@ -27,7 +27,8 @@ import org.eclipse.hawkbit.eventbus.event.TargetTagCreatedBulkEvent; */ public class HawkbitEventProvider implements UIEventProvider { - private static final Set> SINGLE_EVENTS = new HashSet<>(); + private static final Set> SINGLE_EVENTS = new HashSet<>(6); + private static final Set> BULK_EVENTS = new HashSet<>(3); static { SINGLE_EVENTS.add(TargetTagCreatedBulkEvent.class); @@ -36,11 +37,7 @@ public class HawkbitEventProvider implements UIEventProvider { SINGLE_EVENTS.add(DistributionSetTagUpdateEvent.class); SINGLE_EVENTS.add(RolloutGroupChangeEvent.class); SINGLE_EVENTS.add(RolloutChangeEvent.class); - } - private static final Set> BULK_EVENTS = new HashSet<>(); - - static { BULK_EVENTS.add(TargetCreatedEvent.class); BULK_EVENTS.add(TargetInfoUpdateEvent.class); BULK_EVENTS.add(TargetDeletedEvent.class);