() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public RolloutStatus convertToModel(final String value,
+ final Class extends RolloutStatus> targetType, final Locale locale) {
+ return null;
+ }
+
+ @Override
+ public String convertToPresentation(final RolloutStatus value,
+ final Class extends String> targetType, final Locale locale) {
+ String result = null;
+ switch (value) {
+ case FINISHED:
+ result = "" + FontAwesome.CHECK_CIRCLE.getHtml() + "
";
+ break;
+ case PAUSED:
+ result = "" + FontAwesome.PAUSE.getHtml() + "
";
+ break;
+ case RUNNING:
+ result = "";
+ break;
+ case READY:
+ result = " "
+ + FontAwesome.DOT_CIRCLE_O.getHtml() + "
";
+ break;
+ case STOPPED:
+ result = "" + FontAwesome.STOP.getHtml() + "
";
+ break;
+ case CREATING:
+ result = "";
+ break;
+ case STARTING:
+ result = "";
+ break;
+ case ERROR_CREATING:
+ result = "" + FontAwesome.EXCLAMATION_CIRCLE.getHtml()
+ + "
";
+ break;
+ case ERROR_STARTING:
+ result = "" + FontAwesome.EXCLAMATION_CIRCLE.getHtml()
+ + "
";
+ break;
+ default:
+ break;
+ }
+ return result;
+ }
+
+ @Override
+ public Class getModelType() {
+ return RolloutStatus.class;
+ }
+
+ @Override
+ public Class getPresentationType() {
+ return String.class;
+ }
+ });
+ }
+
+ private String getFormattedString(Map details) {
+ StringBuilder val = new StringBuilder();
+ String finalVal = null;
+ if (null != details && !details.isEmpty()) {
+ for (Entry entry : details.entrySet()) {
+ val.append(entry.getKey()).append(":").append(entry.getValue()).append(",");
+ }
+ finalVal = val.substring(0, val.length() - 1);
+ }
+ return finalVal;
+ }
+
+ private void menuItemClicked(final ContextMenuItemClickEvent event) {
+ final ContextMenuItem item = (ContextMenuItem) event.getSource();
+ final ContextMenuData contextMenuData = (ContextMenuData) item.getData();
+ final Item row = getContainerDataSource().getItem(contextMenuData.getRolloutId());
+ final String rolloutName = (String) row.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
+ if (contextMenuData.getAction() == ACTION.PAUSE) {
+ rolloutManagement.pauseRollout(rolloutManagement.findRolloutById(contextMenuData.getRolloutId()));
+ uiNotification.displaySuccess(i18n.get("message.rollout.paused", rolloutName));
+ } else if (contextMenuData.getAction() == ACTION.RESUME) {
+ rolloutManagement.resumeRollout(rolloutManagement.findRolloutById(contextMenuData.getRolloutId()));
+ uiNotification.displaySuccess(i18n.get("message.rollout.resumed", rolloutName));
+ } else if (contextMenuData.getAction() == ACTION.START) {
+ rolloutManagement.startRolloutAsync(rolloutManagement.findRolloutByName(rolloutName));
+ uiNotification.displaySuccess(i18n.get("message.rollout.started", rolloutName));
+ } else if (contextMenuData.getAction() == ACTION.UPDATE) {
+ addUpdateRolloutWindow.populateData(contextMenuData.getRolloutId());
+ final Window addTargetWindow = addUpdateRolloutWindow.getWindow();
+ addTargetWindow.setCaption(i18n.get("caption.update.rollout"));
+ UI.getCurrent().addWindow(addTargetWindow);
+ addTargetWindow.setVisible(Boolean.TRUE);
+ }
+ }
+
+ private void refreshTable() {
+ ((LazyQueryContainer) getContainerDataSource()).refresh();
+ }
+
+ public final class FontIconGenerator extends PropertyValueGenerator {
+
+ private static final long serialVersionUID = 2544026030795375748L;
+ private final FontAwesome fontIcon;
+
+ public FontIconGenerator(FontAwesome icon) {
+ this.fontIcon = icon;
+ }
+
+ @Override
+ public String getValue(Item item, Object itemId, Object propertyId) {
+ return fontIcon.getHtml();
+ }
+
+ @Override
+ public Class getType() {
+ return String.class;
+ }
+ }
+
+}
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutListGrid3.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutListGrid3.java
new file mode 100644
index 000000000..6a16e7a2b
--- /dev/null
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutListGrid3.java
@@ -0,0 +1,465 @@
+package org.eclipse.hawkbit.ui.rollout;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
+import org.eclipse.hawkbit.eventbus.event.RolloutChangeEvent;
+import org.eclipse.hawkbit.repository.RolloutManagement;
+import org.eclipse.hawkbit.repository.SpPermissionChecker;
+import org.eclipse.hawkbit.repository.model.Rollout;
+import org.eclipse.hawkbit.repository.model.Rollout.RolloutStatus;
+import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
+import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus.Status;
+import org.eclipse.hawkbit.ui.distributionbar.renderers.HtmlButtonRenderer;
+import org.eclipse.hawkbit.ui.distributionbar.renderers.LinkRenderer;
+import org.eclipse.hawkbit.ui.rollout.RolloutListTable.ACTION;
+import org.eclipse.hawkbit.ui.rollout.RolloutListTable.ContextMenuData;
+import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
+import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
+import org.eclipse.hawkbit.ui.utils.I18N;
+import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
+import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
+import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
+import org.eclipse.hawkbit.ui.utils.UINotification;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.vaadin.addons.lazyquerycontainer.BeanQueryFactory;
+import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer;
+import org.vaadin.addons.lazyquerycontainer.LazyQueryDefinition;
+import org.vaadin.peter.contextmenu.ContextMenu;
+import org.vaadin.peter.contextmenu.ContextMenu.ContextMenuItem;
+import org.vaadin.peter.contextmenu.ContextMenu.ContextMenuItemClickEvent;
+import org.vaadin.spring.events.EventBus;
+import org.vaadin.spring.events.EventScope;
+import org.vaadin.spring.events.annotation.EventBusListenerMethod;
+
+import com.vaadin.data.Container;
+import com.vaadin.data.Item;
+import com.vaadin.data.util.PropertyValueGenerator;
+import com.vaadin.data.util.converter.Converter;
+import com.vaadin.server.AbstractClientConnector;
+import com.vaadin.server.FontAwesome;
+import com.vaadin.spring.annotation.SpringComponent;
+import com.vaadin.spring.annotation.ViewScope;
+import com.vaadin.ui.UI;
+import com.vaadin.ui.Window;
+import com.vaadin.ui.renderers.ClickableRenderer.RendererClickEvent;
+import com.vaadin.ui.renderers.HtmlRenderer;
+
+@SpringComponent
+@ViewScope
+public class RolloutListGrid3 extends AbstractSimpleGrid {
+ private static final long serialVersionUID = 4060904914954370524L;
+
+ @Autowired
+ private I18N i18n;
+
+ @Autowired
+ private transient EventBus.SessionEventBus eventBus;
+
+ @Autowired
+ private transient RolloutManagement rolloutManagement;
+
+ @Autowired
+ private AddUpdateRolloutWindowLayout addUpdateRolloutWindow;
+
+ @Autowired
+ private UINotification uiNotification;
+
+ @Autowired
+ private transient RolloutUIState rolloutUIState;
+
+ @Autowired
+ private transient SpPermissionChecker permissionChecker;
+
+ @Override
+ @PostConstruct
+ protected void init() {
+ super.init();
+ eventBus.subscribe(this);
+ }
+
+ @PreDestroy
+ void destroy() {
+ eventBus.unsubscribe(this);
+ }
+
+ @EventBusListenerMethod(scope = EventScope.SESSION)
+ void onEvent(final RolloutEvent event) {
+ if (event == RolloutEvent.FILTER_BY_TEXT || event == RolloutEvent.CREATE_ROLLOUT
+ || event == RolloutEvent.UPDATE_ROLLOUT || event == RolloutEvent.SHOW_ROLLOUTS) {
+ refreshTable();
+ }
+ }
+
+ /**
+ * Handles the RolloutChangeEvent to refresh the item in the table.
+ *
+ * @param rolloutChangeEvent
+ * the event which contains the rollout which has been changed
+ */
+ @SuppressWarnings("unchecked")
+ @EventBusListenerMethod(scope = EventScope.SESSION)
+ public void onEvent(final RolloutChangeEvent rolloutChangeEvent) {
+ final Rollout rollout = rolloutManagement.findRolloutWithDetailedStatus(rolloutChangeEvent.getRolloutId());
+ final TotalTargetCountStatus totalTargetCountStatus = rollout.getTotalTargetCountStatus();
+ final LazyQueryContainer rolloutContainer = (LazyQueryContainer) getContainerDataSource();
+ final Item item = rolloutContainer.getItem(rolloutChangeEvent.getRolloutId());
+ item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).setValue(rollout.getStatus());
+ item.getItemProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setValue(totalTargetCountStatus);
+ final Long groupCount = (Long) item.getItemProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).getValue();
+ if (null != rollout.getRolloutGroups() && groupCount != rollout.getRolloutGroups().size()) {
+ item.getItemProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS)
+ .setValue(Long.valueOf(rollout.getRolloutGroups().size()));
+ }
+ }
+
+ @Override
+ protected String getTableId() {
+ return SPUIComponetIdProvider.ROLLOUT_LIST_TABLE_ID;
+ }
+
+ @Override
+ protected Container createContainer() {
+ final BeanQueryFactory rolloutQf = new BeanQueryFactory<>(RolloutBeanQuery.class);
+ return new LazyQueryContainer(
+ new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_ID), rolloutQf);
+ }
+
+ @Override
+ protected void addContainerProperties() {
+ final LazyQueryContainer rolloutGridContainer = (LazyQueryContainer) getContainerDataSource();
+ rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_ID, String.class, null, false, false);
+ rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false, false);
+ rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, null, false, false);
+ rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, RolloutStatus.class, null, false,
+ false);
+ rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_DIST_NAME_VERSION, String.class, null, false,
+ false);
+ rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_DATE, String.class, null, false,
+ false);
+
+ rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_DATE, String.class, null, false,
+ false);
+ rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_USER, String.class, null, false,
+ false);
+ rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_BY, String.class, null, false,
+ false);
+ rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS, Integer.class, 0, false,
+ false);
+ rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS, String.class, "0", false,
+ false);
+
+ rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS,
+ TotalTargetCountStatus.class, null, false, false);
+
+ rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.ACTION, String.class,
+ FontAwesome.CIRCLE_O.getHtml(), false, false);
+
+ }
+
+ @Override
+ protected void setColumnProperties() {
+ List