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)); } }