From 7e75b79cbec808bf3cad9b5a6883427e8880468d Mon Sep 17 00:00:00 2001 From: SirWayne Date: Thu, 24 Mar 2016 12:00:07 +0100 Subject: [PATCH] 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)); } }