merged master

Signed-off-by: asharani-murugesh <asharani.murugesh@in.bosch.com>
This commit is contained in:
asharani-murugesh
2016-02-18 11:52:38 +01:00
33 changed files with 1922 additions and 190 deletions

View File

@@ -1,14 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
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
-->
<!-- 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 -->
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.5.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.5.1/distro-source/core/src/gwt-module.dtd">
<module>
<!-- This file is automatically updated based on new dependencies by the
@@ -16,15 +10,28 @@
<!-- Inherit DefaultWidgetSet -->
<inherits name="com.vaadin.DefaultWidgetSet" />
<inherits
name="org.vaadin.hene.flexibleoptiongroup.widgetset.FlexibleOptionGroupWidgetset" />
<inherits name="org.vaadin.tokenfield.TokenfieldWidgetset" />
<inherits
name="org.vaadin.alump.distributionbar.gwt.DistributionBarWidgetset" />
<inherits name="org.vaadin.peter.contextmenu.ContextmenuWidgetset" />
<inherits
name="org.eclipse.hawkbit.ui.distributionbar.DistributionBarRendererWidgetSet" />
<inherits name="org.eclipse.hawkbit.ui.distributionbar.DistributionBarRendererWidgetSet" />
<inherits name="org.vaadin.hene.flexibleoptiongroup.widgetset.FlexibleOptionGroupWidgetset" />
<inherits name="org.vaadin.tokenfield.TokenfieldWidgetset" />
<inherits name="org.vaadin.alump.distributionbar.gwt.DistributionBarWidgetset" />
<inherits name="org.vaadin.peter.contextmenu.ContextmenuWidgetset" />
</module>

View File

@@ -0,0 +1,17 @@
<module>
<!-- Inherit DefaultWidgetSet -->
<inherits name="com.vaadin.DefaultWidgetSet"/>
<inherits name="org.vaadin.alump.distributionbar.gwt.DistributionBarWidgetset" />
<inherits name="org.eclipse.hawkbit.ui.AppWidgetSet" />
<inherits name="org.vaadin.peter.contextmenu.ContextmenuWidgetset" />
<inherits name="org.vaadin.tokenfield.TokenfieldWidgetset" />
<inherits name="org.vaadin.hene.flexibleoptiongroup.widgetset.FlexibleOptionGroupWidgetset" />
</module>

View File

@@ -0,0 +1,14 @@
package org.eclipse.hawkbit.ui.distributionbar.client;
import com.vaadin.client.connectors.ButtonRendererConnector;
import com.vaadin.shared.ui.Connect;
@Connect(org.eclipse.hawkbit.ui.distributionbar.renderers.HtmlButtonRenderer.class)
public class HtmlButtonRendererConnector extends ButtonRendererConnector {
private static final long serialVersionUID = 7987417436367399331L;
@Override
public org.eclipse.hawkbit.ui.distributionbar.client.renderers.HtmlButtonRenderer getRenderer() {
return (org.eclipse.hawkbit.ui.distributionbar.client.renderers.HtmlButtonRenderer) super.getRenderer();
}
}

View File

@@ -0,0 +1,14 @@
package org.eclipse.hawkbit.ui.distributionbar.client;
import com.vaadin.client.connectors.ButtonRendererConnector;
import com.vaadin.shared.ui.Connect;
@Connect(org.eclipse.hawkbit.ui.distributionbar.renderers.LinkRenderer.class)
public class LinkRendererConnector extends ButtonRendererConnector {
private static final long serialVersionUID = 7987417436367399331L;
@Override
public org.eclipse.hawkbit.ui.distributionbar.client.renderers.LinkRenderer getRenderer() {
return (org.eclipse.hawkbit.ui.distributionbar.client.renderers.LinkRenderer) super.getRenderer();
}
}

View File

@@ -0,0 +1,17 @@
package org.eclipse.hawkbit.ui.distributionbar.client;
import com.vaadin.client.connectors.AbstractRendererConnector;
import com.vaadin.shared.ui.Connect;
@Connect(org.eclipse.hawkbit.ui.distributionbar.renderers.StringDistributionBarRenderer.class)
public class StringDistributionBarRendererConnector extends
AbstractRendererConnector<String> {
private static final long serialVersionUID = 7697966991925490786L;
@Override
public org.eclipse.hawkbit.ui.distributionbar.client.renderers.StringDistributionBarRenderer getRenderer() {
return (org.eclipse.hawkbit.ui.distributionbar.client.renderers.StringDistributionBarRenderer) super.getRenderer();
}
}

View File

@@ -0,0 +1,20 @@
package org.eclipse.hawkbit.ui.distributionbar.client.renderers;
import com.google.gwt.user.client.ui.Button;
import com.vaadin.client.renderers.ButtonRenderer;
import com.vaadin.client.widget.grid.RendererCellReference;
public class HtmlButtonRenderer extends ButtonRenderer {
@Override
public void render(RendererCellReference cell, String text, Button button) {
if (text != null) {
button.setHTML(text);
}
button.setStylePrimaryName("v-button");
button.addStyleName(
"tiny v-button-tiny borderless v-button-borderless icon-only v-button-icon-only button-no-border v-button-button-no-border");
// this is to allow the button to disappear, if the text is null
button.setVisible(text != null);
button.getElement().setId("rollout.action.button.id");
}
}

View File

@@ -0,0 +1,18 @@
package org.eclipse.hawkbit.ui.distributionbar.client.renderers;
import com.google.gwt.user.client.ui.Button;
import com.vaadin.client.renderers.ButtonRenderer;
import com.vaadin.client.widget.grid.RendererCellReference;
public class LinkRenderer extends ButtonRenderer {
@Override
public void render(RendererCellReference cell, String text, Button button) {
button.setText(text);
button.setStylePrimaryName("v-button");
button.addStyleName(
"borderless v-button-borderless small v-button-small on-focus-no-border v-button-on-focus-no-border link v-button-link");
// this is to allow the button to disappear, if the text is null
button.setVisible(text != null);
button.getElement().setId("rollout.action.button.id");
}
}

View File

@@ -0,0 +1,85 @@
package org.eclipse.hawkbit.ui.distributionbar.client.renderers;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.vaadin.alump.distributionbar.gwt.client.GwtDistributionBar;
import com.google.gwt.core.client.GWT;
import com.vaadin.client.renderers.WidgetRenderer;
import com.vaadin.client.widget.grid.RendererCellReference;
public class StringDistributionBarRenderer extends WidgetRenderer<String, GwtDistributionBar> {
@Override
public GwtDistributionBar createWidget() {
return GWT.create(GwtDistributionBar.class);
}
@Override
public void render(RendererCellReference cell, String input, GwtDistributionBar widget) {
if (null != input) {
widget.setNumberOfParts(2);
widget.addStyleName("status-bar");
Map<String, Long> map = formatData(input);
if (!map.isEmpty()) {
if (isNoTargets(map.values())) {
setBarPartSize(widget, "SCHEDULED".toLowerCase(), 0, 0);
setBarPartSize(widget, "FINISHED".toLowerCase(), 0, 1);
} else {
widget.setNumberOfParts(getNumberOfParts(map.values()));
int index = 0;
for (Entry<String, Long> entryVal : map.entrySet()) {
Long count = entryVal.getValue();
if (count > 0) {
setBarPartSize(widget, entryVal.getKey().toLowerCase(), count.intValue(), index);
index++;
}
}
}
}
widget.updateParts();
}
}
private Map<String, Long> formatData(String input) {
Map<String, Long> details = new HashMap<>();
String[] tempData = input.split(",");
for (String statusWithCount : tempData) {
String[] statusWithCountList = statusWithCount.split(":");
details.put(statusWithCountList[0], new Long(statusWithCountList[1]));
}
return details;
}
private int getNumberOfParts(Collection<Long> values) {
int count = 0;
for (Long val : values) {
if (val != 0) {
count++;
}
}
return count;
}
private boolean isNoTargets(Collection<Long> values) {
for (Long count : values) {
if (count != 0) {
return false;
}
}
return true;
}
private void setBarPartSize(final GwtDistributionBar bar, final String statusName, final int count,
final int index) {
bar.setPartSize(index, count);
bar.setPartTooltip(index, statusName);
bar.setPartStyleName(index, index, "status-bar-part-" + statusName);
}
}

View File

@@ -0,0 +1,14 @@
package org.eclipse.hawkbit.ui.distributionbar.renderers;
import com.vaadin.ui.renderers.ButtonRenderer;
public class HtmlButtonRenderer extends ButtonRenderer {
private static final long serialVersionUID = -1242995370043404892L;
public HtmlButtonRenderer() {
super();
}
public HtmlButtonRenderer(RendererClickListener listener) {
super(listener);
}
}

View File

@@ -0,0 +1,14 @@
package org.eclipse.hawkbit.ui.distributionbar.renderers;
import com.vaadin.ui.renderers.ButtonRenderer;
public class LinkRenderer extends ButtonRenderer {
private static final long serialVersionUID = -1242995370043404892L;
public LinkRenderer() {
super();
}
public LinkRenderer(RendererClickListener listener) {
super(listener);
}
}

View File

@@ -0,0 +1,18 @@
package org.eclipse.hawkbit.ui.distributionbar.renderers;
import com.vaadin.ui.Grid.AbstractRenderer;
public class StringDistributionBarRenderer extends AbstractRenderer<String> {
private static final long serialVersionUID = -4543220859821576209L;
/**
* Creates a new text renderer
*/
public StringDistributionBarRenderer() {
super(String.class, null);
}
}

View File

@@ -0,0 +1,98 @@
/**
* 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.rollout;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import org.eclipse.hawkbit.ui.utils.TableColumn;
import com.vaadin.data.Container;
import com.vaadin.data.Container.Indexed;
import com.vaadin.ui.Grid;
import com.vaadin.ui.Table;
import com.vaadin.ui.Grid.Column;
import com.vaadin.ui.themes.ValoTheme;
/**
* Abstract table class.
*
*/
public abstract class AbstractSimpleGrid extends Grid {
private static final long serialVersionUID = 4856562746502217630L;
/**
* Initialize the components.
*/
protected void init() {
setSizeFull();
setImmediate(true);
setId(getTableId());
setHeight("200px");
setWidth("200px");
addStyleName("sp-table rollout-table");
addStyleName(ValoTheme.TABLE_NO_VERTICAL_LINES);
addStyleName(ValoTheme.TABLE_SMALL);
addNewContainerDS();
// addValueChangeListener(event -> onValueChange());
// setPageLength(SPUIDefinitions.PAGE_SIZE);
setSelectionMode(SelectionMode.NONE);
// setColumnCollapsingAllowed(true);
addColumnRenderes();
setColumnReorderingAllowed(true);
}
public void addNewContainerDS() {
final Container container = createContainer();
setContainerDataSource((Indexed) container);
addContainerProperties();
setColumnProperties();
setColumnHeaderNames();
setColumnExpandRatio();
//Allow column hiding
for (Column c : getColumns()) {
c.setHidable(true);
}
setHiddenColumns();
int size = 0;
if (container != null) {
size = container.size();
}
if (size == 0) {
setData(SPUIDefinitions.NO_DATA);
}
}
protected abstract Container createContainer();
protected abstract void addContainerProperties();
protected abstract void setColumnExpandRatio() ;
protected abstract void setColumnHeaderNames() ;
protected abstract String getTableId();
protected abstract void setColumnProperties() ;
protected abstract void addColumnRenderes() ;
protected abstract void setHiddenColumns();
}

View File

@@ -29,10 +29,14 @@ public abstract class AbstractSimpleTableLayout extends VerticalLayout {
private AbstractSimpleTableHeader tableHeader;
private AbstractSimpleTable table;
private AbstractSimpleGrid grid;
protected void init(final AbstractSimpleTableHeader tableHeader, final AbstractSimpleTable table) {
protected void init(final AbstractSimpleTableHeader tableHeader, final AbstractSimpleTable table,final AbstractSimpleGrid grid) {
this.tableHeader = tableHeader;
this.table = table;
this.grid = grid;
buildLayout();
}
@@ -50,9 +54,10 @@ public abstract class AbstractSimpleTableLayout extends VerticalLayout {
tableHeaderLayout.addComponent(tableHeader);
tableHeaderLayout.setComponentAlignment(tableHeader, Alignment.TOP_CENTER);
tableHeaderLayout.addComponent(table);
tableHeaderLayout.setComponentAlignment(table, Alignment.TOP_CENTER);
tableHeaderLayout.setExpandRatio(table, 1.0f);
grid.setSizeFull();
tableHeaderLayout.addComponent(grid);
tableHeaderLayout.setComponentAlignment(grid, Alignment.TOP_CENTER);
tableHeaderLayout.setExpandRatio(grid, 1.0f);
addComponent(tableHeaderLayout);
@@ -66,10 +71,6 @@ public abstract class AbstractSimpleTableLayout extends VerticalLayout {
}
/**
* @return
*
*/
private HorizontalLayout createCountMessageComponent() {
final HorizontalLayout rolloutGroupTargetsCountLayout = new HorizontalLayout();
final Label countMessageLabel = getCountMessageLabel();

View File

@@ -0,0 +1,23 @@
package org.eclipse.hawkbit.ui.rollout;
import java.util.HashMap;
import java.util.Map;
public class DistributionBarDetails {
private Map<String,Long> details = new HashMap<>();
public DistributionBarDetails( Map<String,Long> details){
this.details = details;
}
public Map<String, Long> getDetails() {
return details;
}
public void setDetails(Map<String, Long> details) {
this.details = details;
}
}

View File

@@ -8,8 +8,14 @@
*/
package org.eclipse.hawkbit.ui.rollout;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.hawkbit.repository.model.Rollout;
import com.vaadin.server.FontAwesome;
import com.vaadin.ui.Label;
/**
* Proxy rollout with suctome properties.
*
@@ -30,21 +36,16 @@ public class ProxyRollout extends Rollout {
private Long numberOfGroups;
private Long runningTargetsCount;
private Long scheduledTargetsCount;
private Long cancelledTargetsCount;
private Long errorTargetsCount;
private Long finishedTargetsCount;
private Long notStartedTargetsCount;
private Boolean isActionRecieved = Boolean.FALSE;
private String totalTargetsCount;
//TODO remove this
private DistributionBarDetails distributionBarDetails ;
//TODO remove this
private Map<String,Long> statusTotalCountMap = new HashMap<>();
/**
* @return the distributionSetNameVersion
@@ -136,81 +137,6 @@ public class ProxyRollout extends Rollout {
this.lastModifiedBy = lastModifiedBy;
}
/**
* @return the runningTargetsCount
*/
public Long getRunningTargetsCount() {
return runningTargetsCount;
}
/**
* @param runningTargetsCount
* the runningTargetsCount to set
*/
public void setRunningTargetsCount(final Long runningTargetsCount) {
this.runningTargetsCount = runningTargetsCount;
}
/**
* @return the scheduledTargetsCount
*/
public Long getScheduledTargetsCount() {
return scheduledTargetsCount;
}
/**
* @param scheduledTargetsCount
* the scheduledTargetsCount to set
*/
public void setScheduledTargetsCount(final Long scheduledTargetsCount) {
this.scheduledTargetsCount = scheduledTargetsCount;
}
/**
* @return the cancelledTargetsCount
*/
public Long getCancelledTargetsCount() {
return cancelledTargetsCount;
}
/**
* @param cancelledTargetsCount
* the cancelledTargetsCount to set
*/
public void setCancelledTargetsCount(final Long cancelledTargetsCount) {
this.cancelledTargetsCount = cancelledTargetsCount;
}
/**
* @return the errorTargetsCount
*/
public Long getErrorTargetsCount() {
return errorTargetsCount;
}
/**
* @param errorTargetsCount
* the errorTargetsCount to set
*/
public void setErrorTargetsCount(final Long errorTargetsCount) {
this.errorTargetsCount = errorTargetsCount;
}
/**
* @return the finishedTargetsCount
*/
public Long getFinishedTargetsCount() {
return finishedTargetsCount;
}
/**
* @param finishedTargetsCount
* the finishedTargetsCount to set
*/
public void setFinishedTargetsCount(final Long finishedTargetsCount) {
this.finishedTargetsCount = finishedTargetsCount;
}
/**
* @return the isActionRecieved
*/
@@ -226,21 +152,6 @@ public class ProxyRollout extends Rollout {
this.isActionRecieved = isActionRecieved;
}
/**
* @return the notStartedTargetsCount
*/
public Long getNotStartedTargetsCount() {
return notStartedTargetsCount;
}
/**
* @param notStartedTargetsCount
* the notStartedTargetsCount to set
*/
public void setNotStartedTargetsCount(final Long notStartedTargetsCount) {
this.notStartedTargetsCount = notStartedTargetsCount;
}
/**
* @return the totalTargetsCount
*/
@@ -255,4 +166,27 @@ public class ProxyRollout extends Rollout {
public void setTotalTargetsCount(final String totalTargetsCount) {
this.totalTargetsCount = totalTargetsCount;
}
public Map<String, Long> getStatusTotalCountMap() {
return statusTotalCountMap;
}
public void setStatusTotalCountMap(Map<String, Long> statusTotalCountMap) {
this.statusTotalCountMap = statusTotalCountMap;
}
public DistributionBarDetails getDistributionBarDetails() {
return distributionBarDetails;
}
public void setDistributionBarDetails(DistributionBarDetails distributionBarDetails) {
this.distributionBarDetails = distributionBarDetails;
}
public String getAction() {
return FontAwesome.CIRCLE_O.getHtml();
}
}

View File

@@ -132,23 +132,10 @@ public class RolloutBeanQuery extends AbstractBeanQuery<ProxyRollout> {
proxyRollout.setStatus(rollout.getStatus());
final TotalTargetCountStatus totalTargetCountActionStatus = rollout.getTotalTargetCountStatus();
proxyRollout.setRunningTargetsCount(totalTargetCountActionStatus
.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.RUNNING));
proxyRollout.setErrorTargetsCount(totalTargetCountActionStatus
.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.ERROR));
proxyRollout.setCancelledTargetsCount(totalTargetCountActionStatus
.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.CANCELLED));
proxyRollout.setFinishedTargetsCount(totalTargetCountActionStatus
.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.FINISHED));
proxyRollout.setScheduledTargetsCount(totalTargetCountActionStatus
.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.SCHEDULED));
proxyRollout.setNotStartedTargetsCount(totalTargetCountActionStatus
.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.NOTSTARTED));
proxyRolloutList.add(proxyRollout);
proxyRollout.setTotalTargetCountStatus(totalTargetCountActionStatus);
proxyRollout.setTotalTargetsCount(String.valueOf(rollout.getTotalTargets()));
proxyRolloutList.add(proxyRollout);
}
return proxyRolloutList;
}

View File

@@ -122,22 +122,8 @@ public class RolloutGroupBeanQuery extends AbstractBeanQuery<ProxyRolloutGroup>
proxyRolloutGroup.setSuccessConditionExp(rolloutGroup.getSuccessConditionExp());
proxyRolloutGroup.setFinishedPercentage(calculateFinishedPercentage(rolloutGroup));
final TotalTargetCountStatus totalTargetCountActionStatus = rolloutGroup.getTotalTargetCountStatus();
proxyRolloutGroup.setRunningTargetsCount(
totalTargetCountActionStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.RUNNING));
proxyRolloutGroup.setErrorTargetsCount(
totalTargetCountActionStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.ERROR));
proxyRolloutGroup.setCancelledTargetsCount(
totalTargetCountActionStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.CANCELLED));
proxyRolloutGroup.setFinishedTargetsCount(
totalTargetCountActionStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.FINISHED));
proxyRolloutGroup.setScheduledTargetsCount(
totalTargetCountActionStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.SCHEDULED));
proxyRolloutGroup.setNotStartedTargetsCount(
totalTargetCountActionStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.NOTSTARTED));
proxyRolloutGroup.setTotalTargetsCount(String.valueOf(rolloutGroup.getTotalTargets()));
proxyRolloutGroup.setTotalTargetCountStatus(rolloutGroup.getTotalTargetCountStatus());
proxyRolloutGroupsList.add(proxyRolloutGroup);
}

View File

@@ -145,11 +145,11 @@ public class RolloutGroupListTable extends AbstractSimpleTable {
columnList.add(new TableColumn(SPUIDefinitions.DETAIL_STATUS, i18n.get("header.detail.status"), 0.42f));
columnList
.add(new TableColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS, i18n.get("header.total.targets"), 0.08f));
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE,
columnList.add(new TableColumn(SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE,
i18n.get("header.rolloutgroup.installed.percentage"), 0.1f));
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD,
columnList.add(new TableColumn(SPUILabelDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD,
i18n.get("header.rolloutgroup.threshold.error"), 0.1f));
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_GROUP_THRESHOLD,
columnList.add(new TableColumn(SPUILabelDefinitions.ROLLOUT_GROUP_THRESHOLD,
i18n.get("header.rolloutgroup.threshold"), 0.1f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_DATE, i18n.get("header.createdDate"), 0.15f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_USER, i18n.get("header.createdBy"), 0.15f));
@@ -173,12 +173,12 @@ public class RolloutGroupListTable extends AbstractSimpleTable {
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, null, false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, RolloutGroupStatus.class, null,
false, false);
rolloutTableContainer.addContainerProperty(SPUIDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE, String.class,
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE, String.class,
null, false, false);
rolloutTableContainer.addContainerProperty(SPUIDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD, String.class, null,
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD, String.class, null,
false, false);
rolloutTableContainer.addContainerProperty(SPUIDefinitions.ROLLOUT_GROUP_THRESHOLD, String.class, null, false,
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.ROLLOUT_GROUP_THRESHOLD, String.class, null, false,
false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_DATE, String.class, null, false,

View File

@@ -196,7 +196,7 @@ public class RolloutGroupTargetsListTable extends AbstractSimpleTable {
}
}
private void setRolloutStatusIcon(final Status targetUpdateStatus, final Label statusLabel) {
private void setRolloutStatusIcon(final Status targetUpdateStatus, final Label statusLabel) {
switch (targetUpdateStatus) {
case ERROR:
statusLabel.setValue(FontAwesome.EXCLAMATION_CIRCLE.getHtml());

View File

@@ -33,13 +33,14 @@ public class RolloutGroupTargetsListView extends AbstractSimpleTableLayout {
@Autowired
private RolloutGroupTargetsCountLabelMessage rolloutGroupTargetsCountLabelMessage;
@Autowired
private RolloutGroupTargetsListGrid rolloutListGrid;
/**
* Initialization of Rollout group component.
*/
@PostConstruct
protected void init() {
super.init(rolloutGroupTargetsListHeader, rolloutGroupTargetsListTable);
super.init(rolloutGroupTargetsListHeader, rolloutGroupTargetsListTable,rolloutListGrid);
}
@Override

View File

@@ -31,21 +31,23 @@ public class RolloutGroupsListView extends AbstractSimpleTableLayout {
@Autowired
private RolloutGroupListTable rolloutGroupListTable;
@Autowired
private RolloutGroupListGrid rolloutListGrid;
@PostConstruct
protected void init() {
super.init(rolloutGroupListHeader, rolloutGroupListTable);
super.init(rolloutGroupListHeader, rolloutGroupListTable,rolloutListGrid);
}
@Override
protected boolean hasCountMessage() {
return false;
}
@Override
protected Label getCountMessageLabel() {
return null;
}

View File

@@ -0,0 +1,459 @@
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.HawkbitCommonUtil;
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 RolloutListGrid 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) {
if (rolloutUIState.isShowRolloutGroups()) {
final Rollout rollout = rolloutManagement.findRolloutWithDetailedStatus(rolloutChangeEvent.getRolloutId());
final TotalTargetCountStatus totalTargetCountStatus = rollout.getTotalTargetCountStatus();
final LazyQueryContainer rolloutContainer = (LazyQueryContainer) getContainerDataSource();
final Item item = rolloutContainer.getItem(rolloutChangeEvent.getRolloutId());
if (null != item) {
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 Container createContainer() {
final BeanQueryFactory<RolloutBeanQuery> 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 String getTableId() {
return SPUIComponetIdProvider.ROLLOUT_LIST_TABLE_ID;
}
@Override
protected void setColumnProperties() {
List<Object> columnList = new ArrayList<>();
columnList.add(SPUILabelDefinitions.VAR_NAME);
columnList.add(SPUILabelDefinitions.VAR_DIST_NAME_VERSION);
columnList.add(SPUILabelDefinitions.VAR_STATUS);
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS);
columnList.add(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS);
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS);
columnList.add(SPUILabelDefinitions.VAR_CREATED_DATE);
columnList.add(SPUILabelDefinitions.VAR_CREATED_USER);
columnList.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);
columnList.add(SPUILabelDefinitions.VAR_MODIFIED_BY);
columnList.add(SPUILabelDefinitions.VAR_DESC);
columnList.add(SPUILabelDefinitions.ACTION);
setColumnOrder(columnList.toArray());
alignColumns();
}
private void alignColumns() {
setCellStyleGenerator(new CellStyleGenerator() {
private static final long serialVersionUID = 5573570647129792429L;
@Override
public String getStyle(final CellReference cellReference) {
String[] coulmnNames = { SPUILabelDefinitions.VAR_STATUS,
SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS, SPUILabelDefinitions.ACTION };
if (Arrays.asList(coulmnNames).contains(cellReference.getPropertyId())) {
return "centeralign";
}
return null;
}
});
}
@Override
protected void setHiddenColumns() {
List<Object> columnsToBeHidden = new ArrayList<>();
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_DATE);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_USER);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_BY);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_DESC);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_ID);
for (Object propertyId : columnsToBeHidden) {
getColumn(propertyId).setHidden(true);
}
}
@Override
protected void setColumnHeaderNames() {
getColumn(SPUILabelDefinitions.VAR_NAME).setHeaderCaption(i18n.get("header.name"));
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setHeaderCaption(i18n.get("header.distributionset"));
getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setHeaderCaption(i18n.get("header.numberofgroups"));
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setHeaderCaption(i18n.get("header.total.targets"));
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setHeaderCaption(i18n.get("header.createdDate"));
getColumn(SPUILabelDefinitions.VAR_CREATED_USER).setHeaderCaption(i18n.get("header.createdBy"));
getColumn(SPUILabelDefinitions.VAR_MODIFIED_DATE).setHeaderCaption(i18n.get("header.modifiedDate"));
getColumn(SPUILabelDefinitions.VAR_MODIFIED_BY).setHeaderCaption(i18n.get("header.modifiedBy"));
getColumn(SPUILabelDefinitions.VAR_DESC).setHeaderCaption(i18n.get("header.description"));
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS)
.setHeaderCaption(i18n.get("header.detail.status"));
getColumn(SPUILabelDefinitions.VAR_STATUS).setHeaderCaption(i18n.get("header.status"));
getColumn(SPUILabelDefinitions.ACTION).setHeaderCaption(i18n.get("upload.action"));
}
@Override
protected void setColumnExpandRatio() {
getColumn(SPUILabelDefinitions.VAR_NAME).setExpandRatio(1);
getColumn(SPUILabelDefinitions.VAR_NAME).setMaximumWidth(300);
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setExpandRatio(1);
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setMaximumWidth(300);
getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMinimumWidth(95);
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_CREATED_USER).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_MODIFIED_DATE).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_MODIFIED_BY).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_DESC).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_STATUS).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_STATUS).setMinimumWidth(75);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setExpandRatio(2);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setMinimumWidth(600);
getColumn(SPUILabelDefinitions.ACTION).setExpandRatio(0);
getColumn(SPUILabelDefinitions.ACTION).setMinimumWidth(90);
}
@Override
protected void addColumnRenderes() {
addDetailStatusColumn();
addStatusCoulmn();
getColumn(SPUILabelDefinitions.ACTION).setRenderer(new HtmlButtonRenderer(event -> onClickOfActionBtn(event)));
getColumn(SPUILabelDefinitions.VAR_NAME).setRenderer(new LinkRenderer(event -> onClickOfRolloutName(event)));
}
private void onClickOfRolloutName(RendererClickEvent event) {
rolloutUIState.setRolloutId((long) event.getItemId());
final String rolloutName = (String) getContainerDataSource().getItem(event.getItemId())
.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
rolloutUIState.setRolloutName(rolloutName);
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUPS);
}
private void onClickOfActionBtn(RendererClickEvent event) {
final ContextMenu contextMenu = createContextMenu((Long) event.getItemId());
contextMenu.setAsContextMenuOf((AbstractClientConnector) event.getComponent());
contextMenu.open(event.getClientX(), event.getClientY());
}
private ContextMenu createContextMenu(final Long rolloutId) {
final Item row = getContainerDataSource().getItem(rolloutId);
final RolloutStatus rolloutStatus = (RolloutStatus) row.getItemProperty(SPUILabelDefinitions.VAR_STATUS)
.getValue();
final ContextMenu context = new ContextMenu();
context.addItemClickListener(event -> menuItemClicked(event));
if (rolloutStatus == RolloutStatus.READY) {
final ContextMenuItem startItem = context.addItem("Start");
startItem.setData(new ContextMenuData(rolloutId, ACTION.START));
} else if (rolloutStatus == RolloutStatus.RUNNING) {
final ContextMenuItem pauseItem = context.addItem("Pause");
pauseItem.setData(new ContextMenuData(rolloutId, ACTION.PAUSE));
} else if (rolloutStatus == RolloutStatus.PAUSED) {
final ContextMenuItem resumeItem = context.addItem("Resume");
resumeItem.setData(new ContextMenuData(rolloutId, ACTION.RESUME));
} else if (rolloutStatus == RolloutStatus.STARTING || rolloutStatus == RolloutStatus.CREATING) {
return context;
}
if (permissionChecker.hasRolloutUpdatePermission()) {
final ContextMenuItem cancelItem = context.addItem("Update");
cancelItem.setData(new ContextMenuData(rolloutId, ACTION.UPDATE));
}
return context;
}
private void addDetailStatusColumn() {
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setRenderer(
new org.eclipse.hawkbit.ui.distributionbar.renderers.StringDistributionBarRenderer(),
new Converter<String, TotalTargetCountStatus>() {
private static final long serialVersionUID = 2660476405836705932L;
@Override
public TotalTargetCountStatus convertToModel(String value,
Class<? extends TotalTargetCountStatus> targetType, Locale locale)
throws com.vaadin.data.util.converter.Converter.ConversionException {
return null;
}
@Override
public String convertToPresentation(TotalTargetCountStatus value,
Class<? extends String> targetType, Locale locale)
throws com.vaadin.data.util.converter.Converter.ConversionException {
return HawkbitCommonUtil.getFormattedString(value.getStatusTotalCountMap());
}
@Override
public Class<TotalTargetCountStatus> getModelType() {
return TotalTargetCountStatus.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
});
}
private void addStatusCoulmn() {
getColumn(SPUILabelDefinitions.VAR_STATUS).setRenderer(new HtmlRenderer(),
new Converter<String, RolloutStatus>() {
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 = "<div class=\"statusIconGreen\">" + FontAwesome.CHECK_CIRCLE.getHtml() + "</div>";
break;
case PAUSED:
result = "<div class=\"statusIconBlue\">" + FontAwesome.PAUSE.getHtml() + "</div>";
break;
case RUNNING:
result = "<div class=\"yellowSpinner\"></div>";
break;
case READY:
result = "<div class=\"statusIconLightBlue\"> <span title=\"xxx\">"
+ FontAwesome.DOT_CIRCLE_O.getHtml() + "</span></div>";
break;
case STOPPED:
result = "<div class=\"statusIconRed\">" + FontAwesome.STOP.getHtml() + "</div>";
break;
case CREATING:
result = "<div class=\"greySpinner\"></div>";
break;
case STARTING:
result = "<div class=\"blueSpinner\"></div>";
break;
case ERROR_CREATING:
result = "<div class=\"statusIconRed\">" + FontAwesome.EXCLAMATION_CIRCLE.getHtml()
+ "</div>";
break;
case ERROR_STARTING:
result = "<div class=\"statusIconRed\">" + FontAwesome.EXCLAMATION_CIRCLE.getHtml()
+ "</div>";
break;
default:
break;
}
return result;
}
@Override
public Class<RolloutStatus> getModelType() {
return RolloutStatus.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
});
}
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<String> {
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<String> getType() {
return String.class;
}
}
}

View File

@@ -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 RolloutListGrid2 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<RolloutBeanQuery> 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<Object> columnList = new ArrayList<>();
columnList.add(SPUILabelDefinitions.VAR_NAME);
columnList.add(SPUILabelDefinitions.VAR_DIST_NAME_VERSION);
columnList.add(SPUILabelDefinitions.VAR_STATUS);
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS);
columnList.add(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS);
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS);
columnList.add(SPUILabelDefinitions.VAR_CREATED_DATE);
columnList.add(SPUILabelDefinitions.VAR_CREATED_USER);
columnList.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);
columnList.add(SPUILabelDefinitions.VAR_MODIFIED_BY);
columnList.add(SPUILabelDefinitions.VAR_DESC);
columnList.add(SPUILabelDefinitions.ACTION);
setColumnOrder(columnList.toArray());
alignColumns();
}
private void alignColumns() {
setCellStyleGenerator(new CellStyleGenerator() {
private static final long serialVersionUID = 5573570647129792429L;
@Override
public String getStyle(final CellReference cellReference) {
String[] coulmnNames = { SPUILabelDefinitions.VAR_STATUS,
SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS, SPUILabelDefinitions.ACTION };
if (Arrays.asList(coulmnNames).contains(cellReference.getPropertyId())) {
return "centeralign";
}
return null;
}
});
}
@Override
protected void setHiddenColumns() {
List<Object> columnsToBeHidden = new ArrayList<>();
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_DATE);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_USER);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_BY);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_DESC);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_ID);
for (Object propertyId : columnsToBeHidden) {
getColumn(propertyId).setHidden(true);
}
}
@Override
protected void setColumnHeaderNames() {
getColumn(SPUILabelDefinitions.VAR_NAME).setHeaderCaption(i18n.get("header.name"));
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setHeaderCaption(i18n.get("header.distributionset"));
getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setHeaderCaption(i18n.get("header.numberofgroups"));
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setHeaderCaption(i18n.get("header.total.targets"));
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setHeaderCaption(i18n.get("header.createdDate"));
getColumn(SPUILabelDefinitions.VAR_CREATED_USER).setHeaderCaption(i18n.get("header.createdBy"));
getColumn(SPUILabelDefinitions.VAR_MODIFIED_DATE).setHeaderCaption(i18n.get("header.modifiedDate"));
getColumn(SPUILabelDefinitions.VAR_MODIFIED_BY).setHeaderCaption(i18n.get("header.modifiedBy"));
getColumn(SPUILabelDefinitions.VAR_DESC).setHeaderCaption(i18n.get("header.description"));
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS)
.setHeaderCaption(i18n.get("header.detail.status"));
getColumn(SPUILabelDefinitions.VAR_STATUS).setHeaderCaption(i18n.get("header.status"));
getColumn(SPUILabelDefinitions.ACTION).setHeaderCaption(i18n.get("upload.action"));
}
@Override
protected void setColumnExpandRatio() {
getColumn(SPUILabelDefinitions.VAR_NAME).setExpandRatio(1);
getColumn(SPUILabelDefinitions.VAR_NAME).setMaximumWidth(300);
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setExpandRatio(1);
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setMaximumWidth(300);
getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMinimumWidth(95);
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_CREATED_USER).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_MODIFIED_DATE).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_MODIFIED_BY).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_DESC).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_STATUS).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_STATUS).setMinimumWidth(75);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setExpandRatio(2);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setMinimumWidth(600);
getColumn(SPUILabelDefinitions.ACTION).setExpandRatio(0);
getColumn(SPUILabelDefinitions.ACTION).setMinimumWidth(90);
}
@Override
protected void addColumnRenderes() {
setEditorEnabled(true);
addDetailStatusColumn();
addStatusCoulmn();
getColumn(SPUILabelDefinitions.ACTION).setRenderer(new HtmlButtonRenderer(event -> onClickOfActionBtn(event)));
getColumn(SPUILabelDefinitions.VAR_NAME).setRenderer(new LinkRenderer(event -> onClickOfRolloutName(event)));
}
private void onClickOfRolloutName(RendererClickEvent event) {
rolloutUIState.setRolloutId((long) event.getItemId());
final String rolloutName = (String) getContainerDataSource().getItem(event.getItemId())
.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
rolloutUIState.setRolloutName(rolloutName);
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUPS);
}
private void onClickOfActionBtn(RendererClickEvent event) {
final ContextMenu contextMenu = createContextMenu((Long) event.getItemId());
contextMenu.setAsContextMenuOf((AbstractClientConnector) event.getComponent());
contextMenu.open(event.getClientX(), event.getClientY());
}
private ContextMenu createContextMenu(final Long rolloutId) {
final Item row = getContainerDataSource().getItem(rolloutId);
final RolloutStatus rolloutStatus = (RolloutStatus) row.getItemProperty(SPUILabelDefinitions.VAR_STATUS)
.getValue();
final ContextMenu context = new ContextMenu();
context.addItemClickListener(event -> menuItemClicked(event));
if (rolloutStatus == RolloutStatus.READY) {
final ContextMenuItem startItem = context.addItem("Start");
startItem.setData(new ContextMenuData(rolloutId, ACTION.START));
} else if (rolloutStatus == RolloutStatus.RUNNING) {
final ContextMenuItem pauseItem = context.addItem("Pause");
pauseItem.setData(new ContextMenuData(rolloutId, ACTION.PAUSE));
} else if (rolloutStatus == RolloutStatus.PAUSED) {
final ContextMenuItem resumeItem = context.addItem("Resume");
resumeItem.setData(new ContextMenuData(rolloutId, ACTION.RESUME));
} else if (rolloutStatus == RolloutStatus.STARTING || rolloutStatus == RolloutStatus.CREATING) {
return context;
}
if (permissionChecker.hasRolloutUpdatePermission()) {
final ContextMenuItem cancelItem = context.addItem("Update");
cancelItem.setData(new ContextMenuData(rolloutId, ACTION.UPDATE));
}
return context;
}
private void addDetailStatusColumn() {
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setRenderer(
new org.eclipse.hawkbit.ui.distributionbar.renderers.StringDistributionBarRenderer(),
new Converter<String, TotalTargetCountStatus>() {
private static final long serialVersionUID = 2660476405836705932L;
@Override
public TotalTargetCountStatus convertToModel(String value,
Class<? extends TotalTargetCountStatus> targetType, Locale locale)
throws com.vaadin.data.util.converter.Converter.ConversionException {
return null;
}
@Override
public String convertToPresentation(TotalTargetCountStatus value,
Class<? extends String> targetType, Locale locale)
throws com.vaadin.data.util.converter.Converter.ConversionException {
return getFormattedString(value.getStatusTotalCountMap());
}
@Override
public Class<TotalTargetCountStatus> getModelType() {
return TotalTargetCountStatus.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
});
}
private void addStatusCoulmn() {
getColumn(SPUILabelDefinitions.VAR_STATUS).setRenderer(new HtmlRenderer(),
new Converter<String, RolloutStatus>() {
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 = "<div class=\"statusIconGreen\">" + FontAwesome.CHECK_CIRCLE.getHtml() + "</div>";
break;
case PAUSED:
result = "<div class=\"statusIconBlue\">" + FontAwesome.PAUSE.getHtml() + "</div>";
break;
case RUNNING:
result = "<div class=\"yellowSpinner\"></div>";
break;
case READY:
result = "<div class=\"statusIconLightBlue\"> <span title=\"xxx\">"
+ FontAwesome.DOT_CIRCLE_O.getHtml() + "</span></div>";
break;
case STOPPED:
result = "<div class=\"statusIconRed\">" + FontAwesome.STOP.getHtml() + "</div>";
break;
case CREATING:
result = "<div class=\"greySpinner\"></div>";
break;
case STARTING:
result = "<div class=\"blueSpinner\"></div>";
break;
case ERROR_CREATING:
result = "<div class=\"statusIconRed\">" + FontAwesome.EXCLAMATION_CIRCLE.getHtml()
+ "</div>";
break;
case ERROR_STARTING:
result = "<div class=\"statusIconRed\">" + FontAwesome.EXCLAMATION_CIRCLE.getHtml()
+ "</div>";
break;
default:
break;
}
return result;
}
@Override
public Class<RolloutStatus> getModelType() {
return RolloutStatus.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
});
}
private String getFormattedString(Map<Status, Long> details) {
StringBuilder val = new StringBuilder();
String finalVal = null;
if (null != details && !details.isEmpty()) {
for (Entry<Status, Long> 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<String> {
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<String> getType() {
return String.class;
}
}
}

View File

@@ -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<RolloutBeanQuery> 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<Object> columnList = new ArrayList<>();
columnList.add(SPUILabelDefinitions.VAR_NAME);
columnList.add(SPUILabelDefinitions.VAR_DIST_NAME_VERSION);
columnList.add(SPUILabelDefinitions.VAR_STATUS);
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS);
columnList.add(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS);
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS);
columnList.add(SPUILabelDefinitions.VAR_CREATED_DATE);
columnList.add(SPUILabelDefinitions.VAR_CREATED_USER);
columnList.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);
columnList.add(SPUILabelDefinitions.VAR_MODIFIED_BY);
columnList.add(SPUILabelDefinitions.VAR_DESC);
columnList.add(SPUILabelDefinitions.ACTION);
setColumnOrder(columnList.toArray());
alignColumns();
}
private void alignColumns() {
setCellStyleGenerator(new CellStyleGenerator() {
private static final long serialVersionUID = 5573570647129792429L;
@Override
public String getStyle(final CellReference cellReference) {
String[] coulmnNames = { SPUILabelDefinitions.VAR_STATUS,
SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS, SPUILabelDefinitions.ACTION };
if (Arrays.asList(coulmnNames).contains(cellReference.getPropertyId())) {
return "centeralign";
}
return null;
}
});
}
@Override
protected void setHiddenColumns() {
List<Object> columnsToBeHidden = new ArrayList<>();
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_DATE);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_USER);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_BY);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_DESC);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_ID);
for (Object propertyId : columnsToBeHidden) {
getColumn(propertyId).setHidden(true);
}
}
@Override
protected void setColumnHeaderNames() {
getColumn(SPUILabelDefinitions.VAR_NAME).setHeaderCaption(i18n.get("header.name"));
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setHeaderCaption(i18n.get("header.distributionset"));
getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setHeaderCaption(i18n.get("header.numberofgroups"));
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setHeaderCaption(i18n.get("header.total.targets"));
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setHeaderCaption(i18n.get("header.createdDate"));
getColumn(SPUILabelDefinitions.VAR_CREATED_USER).setHeaderCaption(i18n.get("header.createdBy"));
getColumn(SPUILabelDefinitions.VAR_MODIFIED_DATE).setHeaderCaption(i18n.get("header.modifiedDate"));
getColumn(SPUILabelDefinitions.VAR_MODIFIED_BY).setHeaderCaption(i18n.get("header.modifiedBy"));
getColumn(SPUILabelDefinitions.VAR_DESC).setHeaderCaption(i18n.get("header.description"));
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS)
.setHeaderCaption(i18n.get("header.detail.status"));
getColumn(SPUILabelDefinitions.VAR_STATUS).setHeaderCaption(i18n.get("header.status"));
getColumn(SPUILabelDefinitions.ACTION).setHeaderCaption(i18n.get("upload.action"));
}
@Override
protected void setColumnExpandRatio() {
getColumn(SPUILabelDefinitions.VAR_NAME).setExpandRatio(1);
getColumn(SPUILabelDefinitions.VAR_NAME).setMaximumWidth(300);
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setExpandRatio(1);
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setMaximumWidth(300);
getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMinimumWidth(95);
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_CREATED_USER).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_MODIFIED_DATE).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_MODIFIED_BY).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_DESC).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_STATUS).setExpandRatio(0);
getColumn(SPUILabelDefinitions.VAR_STATUS).setMinimumWidth(75);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setExpandRatio(2);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setMinimumWidth(600);
getColumn(SPUILabelDefinitions.ACTION).setExpandRatio(0);
getColumn(SPUILabelDefinitions.ACTION).setMinimumWidth(90);
}
@Override
protected void addColumnRenderes() {
setEditorEnabled(true);
addDetailStatusColumn();
addStatusCoulmn();
getColumn(SPUILabelDefinitions.ACTION).setRenderer(new HtmlButtonRenderer(event -> onClickOfActionBtn(event)));
getColumn(SPUILabelDefinitions.VAR_NAME).setRenderer(new LinkRenderer(event -> onClickOfRolloutName(event)));
}
private void onClickOfRolloutName(RendererClickEvent event) {
rolloutUIState.setRolloutId((long) event.getItemId());
final String rolloutName = (String) getContainerDataSource().getItem(event.getItemId())
.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
rolloutUIState.setRolloutName(rolloutName);
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUPS);
}
private void onClickOfActionBtn(RendererClickEvent event) {
final ContextMenu contextMenu = createContextMenu((Long) event.getItemId());
contextMenu.setAsContextMenuOf((AbstractClientConnector) event.getComponent());
contextMenu.open(event.getClientX(), event.getClientY());
}
private ContextMenu createContextMenu(final Long rolloutId) {
final Item row = getContainerDataSource().getItem(rolloutId);
final RolloutStatus rolloutStatus = (RolloutStatus) row.getItemProperty(SPUILabelDefinitions.VAR_STATUS)
.getValue();
final ContextMenu context = new ContextMenu();
context.addItemClickListener(event -> menuItemClicked(event));
if (rolloutStatus == RolloutStatus.READY) {
final ContextMenuItem startItem = context.addItem("Start");
startItem.setData(new ContextMenuData(rolloutId, ACTION.START));
} else if (rolloutStatus == RolloutStatus.RUNNING) {
final ContextMenuItem pauseItem = context.addItem("Pause");
pauseItem.setData(new ContextMenuData(rolloutId, ACTION.PAUSE));
} else if (rolloutStatus == RolloutStatus.PAUSED) {
final ContextMenuItem resumeItem = context.addItem("Resume");
resumeItem.setData(new ContextMenuData(rolloutId, ACTION.RESUME));
} else if (rolloutStatus == RolloutStatus.STARTING || rolloutStatus == RolloutStatus.CREATING) {
return context;
}
if (permissionChecker.hasRolloutUpdatePermission()) {
final ContextMenuItem cancelItem = context.addItem("Update");
cancelItem.setData(new ContextMenuData(rolloutId, ACTION.UPDATE));
}
return context;
}
private void addDetailStatusColumn() {
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setRenderer(
new org.eclipse.hawkbit.ui.distributionbar.renderers.StringDistributionBarRenderer(),
new Converter<String, TotalTargetCountStatus>() {
private static final long serialVersionUID = 2660476405836705932L;
@Override
public TotalTargetCountStatus convertToModel(String value,
Class<? extends TotalTargetCountStatus> targetType, Locale locale)
throws com.vaadin.data.util.converter.Converter.ConversionException {
return null;
}
@Override
public String convertToPresentation(TotalTargetCountStatus value,
Class<? extends String> targetType, Locale locale)
throws com.vaadin.data.util.converter.Converter.ConversionException {
return getFormattedString(value.getStatusTotalCountMap());
}
@Override
public Class<TotalTargetCountStatus> getModelType() {
return TotalTargetCountStatus.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
});
}
private void addStatusCoulmn() {
getColumn(SPUILabelDefinitions.VAR_STATUS).setRenderer(new HtmlRenderer(),
new Converter<String, RolloutStatus>() {
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 = "<div class=\"statusIconGreen\">" + FontAwesome.CHECK_CIRCLE.getHtml() + "</div>";
break;
case PAUSED:
result = "<div class=\"statusIconBlue\">" + FontAwesome.PAUSE.getHtml() + "</div>";
break;
case RUNNING:
result = "<div class=\"yellowSpinner\"></div>";
break;
case READY:
result = "<div class=\"statusIconLightBlue\"> <span title=\"xxx\">"
+ FontAwesome.DOT_CIRCLE_O.getHtml() + "</span></div>";
break;
case STOPPED:
result = "<div class=\"statusIconRed\">" + FontAwesome.STOP.getHtml() + "</div>";
break;
case CREATING:
result = "<div class=\"greySpinner\"></div>";
break;
case STARTING:
result = "<div class=\"blueSpinner\"></div>";
break;
case ERROR_CREATING:
result = "<div class=\"statusIconRed\">" + FontAwesome.EXCLAMATION_CIRCLE.getHtml()
+ "</div>";
break;
case ERROR_STARTING:
result = "<div class=\"statusIconRed\">" + FontAwesome.EXCLAMATION_CIRCLE.getHtml()
+ "</div>";
break;
default:
break;
}
return result;
}
@Override
public Class<RolloutStatus> getModelType() {
return RolloutStatus.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
});
}
private String getFormattedString(Map<Status, Long> details) {
StringBuilder val = new StringBuilder();
String finalVal = null;
if (null != details && !details.isEmpty()) {
for (Entry<Status, Long> 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<String> {
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<String> getType() {
return String.class;
}
}
}

View File

@@ -32,10 +32,13 @@ public class RolloutListView extends AbstractSimpleTableLayout {
@Autowired
private RolloutListTable rolloutListTable;
@Autowired
private RolloutListGrid rolloutListGrid;
@PostConstruct
void init() {
super.init(rolloutListHeader, rolloutListTable);
super.init(rolloutListHeader, rolloutListTable,rolloutListGrid);
}

View File

@@ -19,6 +19,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import java.util.Map.Entry;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.hawkbit.im.authentication.UserPrincipal;
@@ -30,6 +31,7 @@ import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.repository.model.SoftwareModuleType;
import org.eclipse.hawkbit.repository.model.TargetIdName;
import org.eclipse.hawkbit.repository.model.TargetInfo.PollStatus;
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus.Status;
import org.eclipse.hawkbit.repository.model.TargetTagAssigmentResult;
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
@@ -1348,4 +1350,24 @@ public final class HawkbitCommonUtil {
private static Long getStatusCount(final String propertName, final Item item) {
return (Long) item.getItemProperty(propertName).getValue();
}
/**
* Get the formatted string of status and target count details.
*
* @param details
* details of status and count
* @return String
*/
public static String getFormattedString(Map<Status, Long> details) {
StringBuilder val = new StringBuilder();
String finalVal = null;
if (null != details && !details.isEmpty()) {
for (Entry<Status, Long> entry : details.entrySet()) {
val.append(entry.getKey()).append(":").append(entry.getValue()).append(",");
}
finalVal = val.substring(0, val.length() - 1);
}
return finalVal;
}
}

View File

@@ -1001,20 +1001,6 @@ public final class SPUIDefinitions {
*/
public static final String ROLLOUT_GROUP_STARTED_DATE = "Started date";
/**
* Rollout group started date column property.
*/
public static final String ROLLOUT_GROUP_ERROR_THRESHOLD = "errorConditionExp";
/**
* Rollout group started date column property.
*/
public static final String ROLLOUT_GROUP_THRESHOLD = "successConditionExp";
/**
* Rollout group installed percentage column property.
*/
public static final String ROLLOUT_GROUP_INSTALLED_PERCENTAGE = "finishedPercentage";
/**
* Rollout group status column property.

View File

@@ -539,6 +539,27 @@ public final class SPUILabelDefinitions {
* Total target coulmn property name.
*/
public static final String VAR_TOTAL_TARGETS = "totalTargetsCount";
/**
* Total target count status coulmn property name.
*/
public static final String VAR_TOTAL_TARGETS_COUNT_STATUS = "totalTargetCountStatus";
/**
* Rollout group started date column property.
*/
public static final String ROLLOUT_GROUP_ERROR_THRESHOLD = "errorConditionExp";
/**
* Rollout group started date column property.
*/
public static final String ROLLOUT_GROUP_THRESHOLD = "successConditionExp";
/**
* Rollout group installed percentage column property.
*/
public static final String ROLLOUT_GROUP_INSTALLED_PERCENTAGE = "finishedPercentage";
/**
* Constructor.

View File

@@ -56,5 +56,8 @@
}
}
.v-grid-cell.centeralign {
text-align: center;
}
}

View File

@@ -61,4 +61,9 @@
-moz-box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
}
.status-bar{
width:100%;
height:100%;
}
}

View File

@@ -30,7 +30,13 @@ $v-selection-color: $app-selection-color;
$v-app-background-color: $app-background-color;
//Table header,body border colors are calculated based on this
$v-table-border-color: $widget-border-color;
$v-table-border-color: $widget-border-color ;
$v-grid-border:$v-grid-border-size solid $widget-border-color ;
$v-grid-cell-vertical-border: 0px ;
$v-grid-cell-horizontal-border: 0px ;
$v-grid-cell-focused-border: 0px ;
$v-grid-cell-padding-horizontal:6px;
@import '../valo/valo';
@import 'customstyles/table';