merged master

Signed-off-by: asharani-murugesh <asharani.murugesh@in.bosch.com>
This commit is contained in:
asharani-murugesh
2016-03-04 19:01:37 +01:00
50 changed files with 2102 additions and 1505 deletions

View File

@@ -58,6 +58,24 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<index>true</index>
<manifest>
<addClasspath>true</addClasspath>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
<manifestEntries>
<Implementation-Title>CustomRenderers</Implementation-Title>
<Vaadin-Package-Version>1</Vaadin-Package-Version>
<Vaadin-Widgetsets>org.eclipse.hawkbit.ui.customrenderers.CustomRendererWidgetSet</Vaadin-Widgetsets>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
@@ -153,8 +171,11 @@
<groupId>com.vaadin</groupId>
<artifactId>vaadin-server</artifactId>
</dependency>
<dependency>
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-client</artifactId>
</dependency>
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-push</artifactId>
</dependency>

View File

@@ -16,15 +16,29 @@
<!-- 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.vaadin.hene.flexibleoptiongroup.widgetset.FlexibleOptionGroupWidgetset" />
<inherits
name="org.vaadin.alump.distributionbar.gwt.DistributionBarWidgetset" />
<inherits name="org.eclipse.hawkbit.ui.customrenderers.CustomRendererWidgetSet" />
<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,85 @@
/**
* 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.common.grid;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import com.vaadin.data.Container;
import com.vaadin.data.Container.Indexed;
import com.vaadin.shared.ui.grid.HeightMode;
import com.vaadin.ui.Grid;
import com.vaadin.ui.Label;
import com.vaadin.ui.themes.ValoTheme;
/**
* Abstract table class.
*
*/
public abstract class AbstractGrid extends Grid {
private static final long serialVersionUID = 4856562746502217630L;
/**
* Initialize the components.
*/
protected void init() {
setSizeFull();
setImmediate(true);
setId(getGridId());
setSelectionMode(SelectionMode.NONE);
setColumnReorderingAllowed(true);
addNewContainerDS();
}
public void addNewContainerDS() {
final Container container = createContainer();
setContainerDataSource((Indexed) container);
addContainerProperties();
setColumnExpandRatio();
setColumnProperties();
setColumnHeaderNames();
addColumnRenderes();
CellDescriptionGenerator cellDescriptionGenerator = getDescriptionGenerator();
if (getDescriptionGenerator() != null) {
setCellDescriptionGenerator(cellDescriptionGenerator);
}
// 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 getGridId();
protected abstract void setColumnProperties();
protected abstract void addColumnRenderes();
protected abstract void setHiddenColumns();
protected abstract CellDescriptionGenerator getDescriptionGenerator();
}

View File

@@ -6,7 +6,7 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.common.grid;
import org.eclipse.hawkbit.ui.components.SPUIButton;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
@@ -26,10 +26,10 @@ import com.vaadin.ui.VerticalLayout;
/**
*
* Abstract table header.
* Abstract grid header.
*
*/
public abstract class AbstractSimpleTableHeader extends VerticalLayout {
public abstract class AbstractGridHeader extends VerticalLayout {
private static final long serialVersionUID = -24429876573255519L;

View File

@@ -6,7 +6,7 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.common.grid;
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
@@ -17,22 +17,23 @@ import com.vaadin.ui.VerticalLayout;
/**
*
* Abstract table layout class which builds layout with table
* {@link AbstractSimpleTable} and table header
* {@link AbstractSimpleTableHeader}.
* Abstract grid layout class which builds layout with grid
* {@link AbstractGrid} and table header
* {@link AbstractGridHeader}.
*
*/
public abstract class AbstractSimpleTableLayout extends VerticalLayout {
public abstract class AbstractGridLayout extends VerticalLayout {
private static final long serialVersionUID = 8611248179949245460L;
private AbstractSimpleTableHeader tableHeader;
private AbstractGridHeader tableHeader;
private AbstractGrid grid;
private AbstractSimpleTable table;
protected void init(final AbstractSimpleTableHeader tableHeader, final AbstractSimpleTable table) {
protected void init(final AbstractGridHeader tableHeader,final AbstractGrid grid) {
this.tableHeader = tableHeader;
this.table = table;
this.grid = grid;
buildLayout();
}
@@ -50,9 +51,9 @@ 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);
tableHeaderLayout.addComponent(grid);
tableHeaderLayout.setComponentAlignment(grid, Alignment.TOP_CENTER);
tableHeaderLayout.setExpandRatio(grid, 1.0f);
addComponent(tableHeaderLayout);
@@ -66,10 +67,6 @@ public abstract class AbstractSimpleTableLayout extends VerticalLayout {
}
/**
* @return
*
*/
private HorizontalLayout createCountMessageComponent() {
final HorizontalLayout rolloutGroupTargetsCountLayout = new HorizontalLayout();
final Label countMessageLabel = getCountMessageLabel();
@@ -84,9 +81,14 @@ public abstract class AbstractSimpleTableLayout extends VerticalLayout {
/**
* Only in rollout group targets view count message is displayed.
*
* @return
* @return true if count message has to be displayed
*/
protected abstract boolean hasCountMessage();
/**
* Get the count message label.
*
* @return count message
*/
protected abstract Label getCountMessageLabel();
}

View File

@@ -0,0 +1,27 @@
<?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
-->
<!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>
<!-- 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,22 @@
/**
* 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.customrenderers.client;
import com.vaadin.client.connectors.ButtonRendererConnector;
import com.vaadin.shared.ui.Connect;
@Connect(org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlButtonRenderer.class)
public class HtmlButtonRendererConnector extends ButtonRendererConnector {
private static final long serialVersionUID = 7987417436367399331L;
@Override
public org.eclipse.hawkbit.ui.customrenderers.client.renderers.HtmlButtonRenderer getRenderer() {
return (org.eclipse.hawkbit.ui.customrenderers.client.renderers.HtmlButtonRenderer) super.getRenderer();
}
}

View File

@@ -0,0 +1,24 @@
/**
* 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.customrenderers.client;
import com.vaadin.client.connectors.AbstractRendererConnector;
import com.vaadin.shared.ui.Connect;
@Connect(org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer.class)
public class HtmlLabelRendererConnector extends AbstractRendererConnector<String> {
private static final long serialVersionUID = 7697966991925490786L;
@Override
public org.eclipse.hawkbit.ui.customrenderers.client.renderers.HtmlLabelRenderer getRenderer() {
return (org.eclipse.hawkbit.ui.customrenderers.client.renderers.HtmlLabelRenderer) super.getRenderer();
}
}

View File

@@ -0,0 +1,22 @@
/**
* 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.customrenderers.client;
import com.vaadin.client.connectors.ButtonRendererConnector;
import com.vaadin.shared.ui.Connect;
@Connect(org.eclipse.hawkbit.ui.customrenderers.renderers.LinkRenderer.class)
public class LinkRendererConnector extends ButtonRendererConnector {
private static final long serialVersionUID = 7987417436367399331L;
@Override
public org.eclipse.hawkbit.ui.customrenderers.client.renderers.LinkRenderer getRenderer() {
return (org.eclipse.hawkbit.ui.customrenderers.client.renderers.LinkRenderer) super.getRenderer();
}
}

View File

@@ -0,0 +1,40 @@
/**
* 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.customrenderers.client.renderers;
import com.google.gwt.user.client.ui.Button;
import com.vaadin.client.renderers.ButtonRenderer;
import com.vaadin.client.ui.VButton;
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);
}
applystyles(button);
// this is to allow the button to disappear, if the text is null
button.setVisible(text != null);
button.getElement().setId("rollout.action.button.id");
}
private void applystyles(Button button) {
button.setStyleName(VButton.CLASSNAME);
button.addStyleName(getStyle("tiny"));
button.addStyleName(getStyle("borderless"));
button.addStyleName(getStyle("icon-only"));
button.addStyleName(getStyle("button-no-border"));
}
private String getStyle(final String style) {
return new StringBuilder(style).append(" ").append(VButton.CLASSNAME).append("-").append(style).toString();
}
}

View File

@@ -0,0 +1,65 @@
/**
* 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.customrenderers.client.renderers;
import java.util.HashMap;
import java.util.Map;
import com.google.gwt.core.client.GWT;
import com.vaadin.client.renderers.WidgetRenderer;
import com.vaadin.client.ui.VLabel;
import com.vaadin.client.widget.grid.RendererCellReference;
public class HtmlLabelRenderer extends WidgetRenderer<String, VLabel> {
@Override
public VLabel createWidget() {
return GWT.create(VLabel.class);
}
@Override
public void render(RendererCellReference cell, String input, VLabel label) {
Map<String, String> map = formatInput(input);
String value = map.containsKey("value") ? map.get("value") : null;
String style = map.containsKey("style") ? map.get("style") : null;
String id = map.containsKey("id") ? map.get("id") : null;
if (value != null) {
label.setHTML("<span>&#x" + Integer.toHexString(Integer.parseInt(value)) + ";</span>");
} else {
label.setHTML("<span></span>");
}
applyStyle(label, style);
label.getElement().setId(id);
}
private void applyStyle(VLabel label, String style) {
label.setStyleName(VLabel.CLASSNAME);
label.addStyleName(getStyle("small"));
label.addStyleName(getStyle("font-icon"));
if (style != null) {
label.addStyleName(getStyle(style));
}
}
private String getStyle(final String style) {
return new StringBuilder(style).append(" ").append(VLabel.CLASSNAME).append("-").append(style).toString();
}
private Map<String, String> formatInput(String input) {
Map<String, String> details = new HashMap<>();
String[] tempData = input.split(",");
for (String statusWithCount : tempData) {
String[] statusWithCountList = statusWithCount.split(":");
details.put(statusWithCountList[0], statusWithCountList[1]);
}
return details;
}
}

View File

@@ -0,0 +1,37 @@
/**
* 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.customrenderers.client.renderers;
import com.google.gwt.user.client.ui.Button;
import com.vaadin.client.renderers.ButtonRenderer;
import com.vaadin.client.ui.VButton;
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);
applystyle(button);
// this is to allow the button to disappear, if the text is null
button.setVisible(text != null);
button.getElement().setId(new StringBuilder("link").append(".").append(text).toString());
}
private void applystyle(Button button) {
button.setStyleName(VButton.CLASSNAME);
button.addStyleName(getStyle("borderless"));
button.addStyleName(getStyle("small"));
button.addStyleName(getStyle("on-focus-no-border"));
button.addStyleName(getStyle("link"));
}
private String getStyle(final String style) {
return new StringBuilder(style).append(" ").append(VButton.CLASSNAME).append("-").append(style).toString();
}
}

View File

@@ -0,0 +1,22 @@
/**
* 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.customrenderers.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,22 @@
/**
* 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.customrenderers.renderers;
import com.vaadin.ui.Grid.AbstractRenderer;
public class HtmlLabelRenderer extends AbstractRenderer<String> {
private static final long serialVersionUID = -7675588068526774915L;
/**
* Creates a new text renderer
*/
public HtmlLabelRenderer() {
super(String.class, null);
}
}

View File

@@ -0,0 +1,22 @@
/**
* 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.customrenderers.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

@@ -527,7 +527,7 @@ public class ActionHistoryTable extends TreeTable implements Handler {
} else if (Action.Status.SCHEDULED == status) {
label.setStyleName(statusIconPending);
label.setDescription(i18n.get("label.scheduled"));
label.setValue(FontAwesome.BULLSEYE.getHtml());
label.setValue(FontAwesome.HOURGLASS_1.getHtml());
} else {
label.setDescription("");
label.setValue("");
@@ -578,7 +578,7 @@ public class ActionHistoryTable extends TreeTable implements Handler {
label.setContentMode(ContentMode.HTML);
if (SPUIDefinitions.SCHEDULED.equals(activeValue)) {
label.setDescription("Scheduled");
label.setValue(FontAwesome.BULLSEYE.getHtml());
label.setValue(FontAwesome.HOURGLASS_1.getHtml());
} else if (SPUIDefinitions.ACTIVE.equals(activeValue)) {
label.setDescription("Active");
label.setStyleName("statusIconActive");

View File

@@ -1,116 +0,0 @@
/**
* 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.ui.Table;
import com.vaadin.ui.themes.ValoTheme;
/**
* Abstract table class.
*
*/
public abstract class AbstractSimpleTable extends Table {
private static final long serialVersionUID = 4856562746502217630L;
/**
* Initialize the components.
*/
protected void init() {
addStyleName("sp-table rollout-table");
setSizeFull();
setImmediate(true);
setHeight(100.0f, Unit.PERCENTAGE);
addStyleName(ValoTheme.TABLE_NO_VERTICAL_LINES);
addStyleName(ValoTheme.TABLE_SMALL);
setSortEnabled(false);
setId(getTableId());
addCustomGeneratedColumns();
addNewContainerDS();
setColumnProperties();
addValueChangeListener(event -> onValueChange());
setPageLength(SPUIDefinitions.PAGE_SIZE);
setSelectable(false);
setColumnCollapsingAllowed(true);
setCollapsiblecolumns();
}
private void setColumnProperties() {
final List<TableColumn> columnList = getTableVisibleColumns();
final List<Object> columnIds = new ArrayList<>();
for (final TableColumn column : columnList) {
setColumnHeader(column.getColumnPropertyId(), column.getColumnHeader());
setColumnExpandRatio(column.getColumnPropertyId(), column.getExpandRatio());
columnIds.add(column.getColumnPropertyId());
}
setVisibleColumns(columnIds.toArray());
}
private void addNewContainerDS() {
final Container container = createContainer();
addContainerProperties(container);
setContainerDataSource(container);
int size = 0;
if (container != null) {
size = container.size();
}
if (size == 0) {
setData(SPUIDefinitions.NO_DATA);
}
}
/**
* Based on table state (max/min) columns to be shown are returned.
*
* @return List<TableColumn> list of visible columns
*/
protected abstract List<TableColumn> getTableVisibleColumns();
/**
* Create container of the data to be displayed by the table.
*/
protected abstract Container createContainer();
/**
* Add container properties to the container passed in the reference.
*
* @param container
* reference of {@link Container}
*/
protected abstract void addContainerProperties(Container container);
/**
* Get Id of the table.
*
* @return Id.
*/
protected abstract String getTableId();
/**
* On select of row.
*/
protected abstract void onValueChange();
/**
* Add any generated columns if required.
*/
protected abstract void addCustomGeneratedColumns();
/**
* Set list of columns collapsible.
*/
protected abstract void setCollapsiblecolumns();
}

View File

@@ -0,0 +1,134 @@
/**
* 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.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus.Status;
import org.vaadin.alump.distributionbar.gwt.client.GwtDistributionBar;
/**
* Distribution bar helper to render distribution bar in grid.
*
*/
public final class DistributionBarHelper {
private static final int PARENT_SIZE_IN_PCT = 100;
private static final double MINIMUM_PART_SIZE = 10;
private static final String DISTRIBUTION_BAR_PART_MAIN_STYLE = GwtDistributionBar.CLASSNAME + "-part";
private static final String DISTRIBUTION_BAR_PART_CLASSNAME_PREFIX = GwtDistributionBar.CLASSNAME + "-part-";
private static final String DISTRIBUTION_BAR_PART_VALUE_CLASSNAME = GwtDistributionBar.CLASSNAME + "-value";
private static final String UNINITIALIZED_VALUE_CLASSNAME = GwtDistributionBar.CLASSNAME + "-uninitizalized";
private DistributionBarHelper() {
}
private static String getPartStyle(int partIndex, int noOfParts, String customStyle) {
StringBuilder mainStyle = new StringBuilder();
StringBuilder styleName = new StringBuilder(GwtDistributionBar.CLASSNAME);
if (noOfParts == 1) {
styleName.append("-only");
} else if (partIndex == 1) {
styleName.append("-left");
} else if (partIndex == noOfParts) {
styleName.append("-right");
} else {
styleName.append("-middle");
}
mainStyle.append(styleName).append(" ");
mainStyle.append(DISTRIBUTION_BAR_PART_MAIN_STYLE).append(" ");
mainStyle.append(DISTRIBUTION_BAR_PART_CLASSNAME_PREFIX + partIndex);
if (customStyle != null) {
mainStyle.append(" ").append("status-bar-part-" + customStyle);
}
return mainStyle.toString();
}
private static String getPartWidth(Long value, Long totalValue, int noOfParts) {
final double minTotalSize = MINIMUM_PART_SIZE * noOfParts;
final double availableSize = PARENT_SIZE_IN_PCT - minTotalSize;
double val = MINIMUM_PART_SIZE + (double) value / totalValue * availableSize;
return String.format("%.3f", val) + "%";
}
private static String getPart(int partIndex, Status status, Long value, Long totalValue, int noOfParts) {
String partValue = status.toString().toLowerCase();
// return "<div class=\"" + getPartStyle(partIndex, noOfParts,
// partValue) + "\" style=\"width: "
// + getPartWidth(value, totalValue, noOfParts) + ";\" title = \"" +
// partValue + "\"><span class=\""
// + DISTRIBUTION_BAR_PART_VALUE_CLASSNAME + "\">" + value +
// "</span></div>";
return "<div class=\"" + getPartStyle(partIndex, noOfParts, partValue) + "\" style=\"width: "
+ getPartWidth(value, totalValue, noOfParts) + ";\"><span class=\""
+ DISTRIBUTION_BAR_PART_VALUE_CLASSNAME + "\">" + value + "</span></div>";
}
public static String getDistributionBarAsHTMLString(Map<Status, Long> statusTotalCountMap) {
StringBuilder htmlString = new StringBuilder();
htmlString.append(getParentDivStart());
Long totalValue = getTotalSizes(statusTotalCountMap);
Map<Status, Long> statusMapWithNonZeroValues = getNonZeroStatusList(statusTotalCountMap);
if (statusMapWithNonZeroValues.size() > 0) {
int partIndex = 1;
for (Map.Entry<Status, Long> entry : statusMapWithNonZeroValues.entrySet()) {
if (entry.getValue() > 0) {
htmlString.append(getPart(partIndex, entry.getKey(), entry.getValue(), totalValue,
statusMapWithNonZeroValues.size()));
partIndex++;
}
}
} else {
return getUnintialisedBar();
}
htmlString.append(getParentDivEnd());
return htmlString.toString();
}
public static Map<Status, Long> getNonZeroStatusList(Map<Status, Long> statusTotalCountMap) {
return statusTotalCountMap.entrySet().stream().filter(p -> p.getValue() > 0)
.collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
}
public static String getTooltip(Map<Status, Long> statusCountMap) {
Map<Status, Long> nonZeroStatusCountMap = DistributionBarHelper.getNonZeroStatusList(statusCountMap);
StringBuilder tooltip = new StringBuilder();
for (Entry<Status, Long> entry : nonZeroStatusCountMap.entrySet()) {
tooltip.append(entry.getKey().toString().toLowerCase()).append(" : ").append(entry.getValue())
.append("<br>");
}
return tooltip.toString();
}
private static String getUnintialisedBar() {
return "<div class=\"" + UNINITIALIZED_VALUE_CLASSNAME + "\" style=\"width: 100%;\"><span class=\""
+ DISTRIBUTION_BAR_PART_VALUE_CLASSNAME + "\">uninitialized</span></div>";
}
private static Long getTotalSizes(Map<Status, Long> statusTotalCountMap) {
Long total = 0L;
for (Long value : statusTotalCountMap.values()) {
total = total + value;
}
return total;
}
private static String getParentDivStart() {
return "<div class=\"" + GwtDistributionBar.CLASSNAME
+ "\" style=\"width: 100%; height: 100%;\" id=\"rollout.status.progress.bar.id\">";
}
private static String getParentDivEnd() {
return "</div>";
}
}

View File

@@ -1,361 +0,0 @@
/**
* 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 javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.eventbus.event.RolloutGroupChangeEvent;
import org.eclipse.hawkbit.repository.RolloutGroupManagement;
import org.eclipse.hawkbit.repository.RolloutManagement;
import org.eclipse.hawkbit.repository.SpPermissionChecker;
import org.eclipse.hawkbit.repository.model.RolloutGroup;
import org.eclipse.hawkbit.repository.model.RolloutGroup.RolloutGroupStatus;
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
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.TableColumn;
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.alump.distributionbar.DistributionBar;
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.Property;
import com.vaadin.server.FontAwesome;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.ViewScope;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.Label;
import com.vaadin.ui.themes.ValoTheme;
/**
* Rollout Group Table in List view.
*
*/
@SpringComponent
@ViewScope
public class RolloutGroupListTable extends AbstractSimpleTable {
private static final String IS_ACTION_RECIEVED = "isActionRecieved";
private static final long serialVersionUID = 1182656768844867443L;
@Autowired
private I18N i18n;
@Autowired
private transient EventBus.SessionEventBus eventBus;
@Autowired
private transient RolloutGroupManagement rolloutGroupManagement;
@Autowired
private transient RolloutManagement rolloutManagement;
@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.SHOW_ROLLOUT_GROUPS) {
((LazyQueryContainer) getContainerDataSource()).refresh();
}
}
/**
*
* Handles the RolloutGroupChangeEvent to refresh the item in the table.
*
*
* @param rolloutGroupChangeEvent
* the event which contains the rollout group which has been
* change
*/
@EventBusListenerMethod(scope = EventScope.SESSION)
public void onEvent(final RolloutGroupChangeEvent rolloutGroupChangeEvent) {
final List<Object> visibleItemIds = (List<Object>) getVisibleItemIds();
if (visibleItemIds.contains(rolloutGroupChangeEvent.getRolloutGroupId())) {
final RolloutGroup rolloutGroup = rolloutGroupManagement
.findRolloutGroupWithDetailedStatus(rolloutGroupChangeEvent.getRolloutGroupId());
final TotalTargetCountStatus totalTargetCountStatus = rolloutGroup.getTotalTargetCountStatus();
final LazyQueryContainer rolloutContainer = (LazyQueryContainer) getContainerDataSource();
final Item item = rolloutContainer.getItem(rolloutGroup.getId());
item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).setValue(rolloutGroup.getStatus());
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_RUNNING).setValue(
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.RUNNING));
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_ERROR)
.setValue(totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.ERROR));
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_FINISHED).setValue(
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.FINISHED));
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_NOT_STARTED).setValue(
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.NOTSTARTED));
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_CANCELLED).setValue(
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.CANCELLED));
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_SCHEDULED).setValue(
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.SCHEDULED));
item.getItemProperty(IS_ACTION_RECIEVED)
.setValue(!(Boolean) item.getItemProperty(IS_ACTION_RECIEVED).getValue());
}
}
@Override
protected List<TableColumn> getTableVisibleColumns() {
final List<TableColumn> columnList = new ArrayList<>();
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_GROUP_NAME, i18n.get("header.name"), 0.1f));
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_GROUP_STATUS, i18n.get("header.status"), 0.1f));
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,
i18n.get("header.rolloutgroup.installed.percentage"), 0.1f));
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD,
i18n.get("header.rolloutgroup.threshold.error"), 0.1f));
columnList.add(new TableColumn(SPUIDefinitions.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));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_MODIFIED_DATE, i18n.get("header.modifiedDate"), 0.15f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_MODIFIED_BY, i18n.get("header.modifiedBy"), 0.15f));
return columnList;
}
@Override
protected Container createContainer() {
final BeanQueryFactory<RolloutGroupBeanQuery> rolloutQf = new BeanQueryFactory<>(RolloutGroupBeanQuery.class);
return new LazyQueryContainer(
new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_ID), rolloutQf);
}
@Override
protected void addContainerProperties(final Container container) {
final LazyQueryContainer rolloutTableContainer = (LazyQueryContainer) container;
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_ID, String.class, null, false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false, false);
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,
null, false, false);
rolloutTableContainer.addContainerProperty(SPUIDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD, String.class, null,
false, false);
rolloutTableContainer.addContainerProperty(SPUIDefinitions.ROLLOUT_GROUP_THRESHOLD, String.class, null, false,
false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_DATE, String.class, null, false,
false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_DATE, String.class, null, false,
false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_USER, String.class, null, false,
false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_BY, String.class, null, false,
false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_NOT_STARTED, Long.class, 0L,
false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_RUNNING, Long.class, 0L,
false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_SCHEDULED, Long.class, 0L,
false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_ERROR, Long.class, 0L, false,
false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_FINISHED, Long.class, 0L,
false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_CANCELLED, Long.class, 0L,
false, false);
rolloutTableContainer.addContainerProperty(IS_ACTION_RECIEVED, Boolean.class, false, false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS, String.class, "0", false,
false);
}
@Override
protected String getTableId() {
return SPUIComponetIdProvider.ROLLOUT_GROUP_LIST_TABLE_ID;
}
@Override
protected void onValueChange() {
/**
* No implementation required.
*/
}
@Override
protected void addCustomGeneratedColumns() {
addGeneratedColumn(SPUIDefinitions.ROLLOUT_GROUP_NAME,
(source, itemId, columnId) -> getRolloutNameLink(itemId));
addGeneratedColumn(SPUIDefinitions.ROLLOUT_GROUP_STATUS, (source, itemId, columnId) -> getStatusLabel(itemId));
addGeneratedColumn(SPUIDefinitions.DETAIL_STATUS, (source, itemId, columnId) -> getProgressBar(itemId));
setColumnAlignment(SPUIDefinitions.ROLLOUT_GROUP_STATUS, Align.CENTER);
}
private Label getStatusLabel(final Object itemId) {
final Label statusLabel = new Label();
statusLabel.setHeightUndefined();
statusLabel.setContentMode(ContentMode.HTML);
setStatusIcon(itemId, statusLabel);
statusLabel.setDescription(getDescription(itemId));
statusLabel.setSizeUndefined();
addPropertyChangeListener(itemId, statusLabel);
return statusLabel;
}
private void addPropertyChangeListener(final Object itemId, final Label statusLabel) {
final Property status = getContainerProperty(itemId, SPUILabelDefinitions.VAR_STATUS);
final Property.ValueChangeNotifier notifier = (Property.ValueChangeNotifier) status;
notifier.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(final com.vaadin.data.Property.ValueChangeEvent event) {
setStatusIcon(itemId, statusLabel);
}
});
}
private String getDescription(final Object itemId) {
final Item item = getItem(itemId);
if (item != null) {
final RolloutGroupStatus rolloutGroupStatus = (RolloutGroupStatus) item
.getItemProperty(SPUILabelDefinitions.VAR_STATUS).getValue();
return rolloutGroupStatus.toString().toLowerCase();
}
return null;
}
private void setStatusIcon(final Object itemId, final Label statusLabel) {
final Item item = getItem(itemId);
if (item != null) {
final RolloutGroupStatus rolloutGroupStatus = (RolloutGroupStatus) item
.getItemProperty(SPUILabelDefinitions.VAR_STATUS).getValue();
setRolloutStatusIcon(rolloutGroupStatus, statusLabel);
}
}
private void setRolloutStatusIcon(final RolloutGroupStatus rolloutGroupStatus, final Label statusLabel) {
switch (rolloutGroupStatus) {
case FINISHED:
statusLabel.setValue(FontAwesome.CHECK_CIRCLE.getHtml());
statusLabel.setStyleName("statusIconGreen");
break;
case SCHEDULED:
statusLabel.setValue(FontAwesome.BULLSEYE.getHtml());
statusLabel.setStyleName("statusIconBlue");
break;
case RUNNING:
statusLabel.setValue(FontAwesome.ADJUST.getHtml());
statusLabel.setStyleName("statusIconYellow");
break;
case READY:
statusLabel.setValue(FontAwesome.DOT_CIRCLE_O.getHtml());
statusLabel.setStyleName("statusIconLightBlue");
break;
case ERROR:
statusLabel.setValue(FontAwesome.EXCLAMATION_CIRCLE.getHtml());
statusLabel.setStyleName("statusIconRed");
break;
default:
break;
}
statusLabel.addStyleName(ValoTheme.LABEL_SMALL);
}
private Component getRolloutNameLink(final Object itemId) {
final Item row = getItem(itemId);
final String rolloutGroupName = (String) row.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
if (permissionChecker.hasRolloutTargetsReadPermission()) {
final Button rolloutGroupNameLink = SPUIComponentProvider.getButton(getDetailLinkId(rolloutGroupName),
rolloutGroupName, SPUILabelDefinitions.SHOW_ROLLOUT_GROUP_DETAILS, null, false, null,
SPUIButtonStyleSmallNoBorder.class);
rolloutGroupNameLink.setData(rolloutGroupName);
rolloutGroupNameLink.addStyleName(ValoTheme.LINK_SMALL + " " + "on-focus-no-border link");
rolloutGroupNameLink.addClickListener(event -> showRolloutGroups(itemId));
return rolloutGroupNameLink;
} else {
final Label rolloutGroupNameLabel = new Label();
rolloutGroupNameLabel.setHeightUndefined();
rolloutGroupNameLabel.addStyleName(ValoTheme.LABEL_SMALL);
rolloutGroupNameLabel.setValue(rolloutGroupName);
return rolloutGroupNameLabel;
}
}
private void showRolloutGroups(final Object itemId) {
rolloutUIState.setRolloutGroup(rolloutGroupManagement.findRolloutGroupWithDetailedStatus((Long) itemId));
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUP_TARGETS);
}
private DistributionBar getProgressBar(final Object itemId) {
final DistributionBar bar = new DistributionBar(2);
bar.setSizeFull();
bar.setZeroSizedVisible(false);
HawkbitCommonUtil.initialiseProgressBar(bar, getItem(itemId));
addPropertyChangeListenerOnActionRecieved(itemId, bar);
return bar;
}
private void addPropertyChangeListenerOnActionRecieved(final Object itemId, final DistributionBar bar) {
final Property status = getContainerProperty(itemId, IS_ACTION_RECIEVED);
final Property.ValueChangeNotifier notifier = (Property.ValueChangeNotifier) status;
notifier.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(final com.vaadin.data.Property.ValueChangeEvent event) {
HawkbitCommonUtil.initialiseProgressBar(bar, getItem(itemId));
}
});
}
private static String getDetailLinkId(final String rolloutGroupName) {
return new StringBuilder(SPUIComponetIdProvider.ROLLOUT_GROUP_NAME_LINK_ID).append('.').append(rolloutGroupName)
.toString();
}
@Override
protected void setCollapsiblecolumns() {
setColumnCollapsed(SPUILabelDefinitions.VAR_CREATED_DATE, true);
setColumnCollapsed(SPUILabelDefinitions.VAR_MODIFIED_DATE, true);
setColumnCollapsed(SPUILabelDefinitions.VAR_CREATED_USER, true);
setColumnCollapsed(SPUILabelDefinitions.VAR_MODIFIED_BY, true);
}
}

View File

@@ -1,231 +0,0 @@
/**
* 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 javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.repository.model.Action.Status;
import org.eclipse.hawkbit.repository.model.RolloutGroup;
import org.eclipse.hawkbit.repository.model.RolloutGroup.RolloutGroupStatus;
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
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.TableColumn;
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.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.server.FontAwesome;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.ViewScope;
import com.vaadin.ui.Label;
import com.vaadin.ui.themes.ValoTheme;
/**
* Rollout Group Targets Table in List view.
*
*/
@SpringComponent
@ViewScope
public class RolloutGroupTargetsListTable extends AbstractSimpleTable {
private static final long serialVersionUID = 7984314603271801746L;
@Autowired
private I18N i18n;
@Autowired
private transient EventBus.SessionEventBus eventBus;
@Autowired
private transient RolloutUIState rolloutUIState;
@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.SHOW_ROLLOUT_GROUP_TARGETS) {
((LazyQueryContainer) getContainerDataSource()).refresh();
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUP_TARGETS_COUNT);
}
}
@Override
protected List<TableColumn> getTableVisibleColumns() {
final List<TableColumn> columnList = new ArrayList<>();
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_NAME, i18n.get("header.name"), 0.15f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_BY, i18n.get("header.createdBy"), 0.15f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_DATE, i18n.get("header.createdDate"), 0.15f));
columnList
.add(new TableColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY, i18n.get("header.modifiedBy"), 0.15f));
columnList.add(
new TableColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE, i18n.get("header.modifiedDate"), 0.15f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_DESC, i18n.get("header.description"), 0.15f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_TARGET_STATUS, i18n.get("header.status"), 0.1f));
return columnList;
}
@Override
protected Container createContainer() {
final BeanQueryFactory<RolloutGroupTargetsBeanQuery> rolloutgrouBeanQueryFactory = new BeanQueryFactory<>(
RolloutGroupTargetsBeanQuery.class);
return new LazyQueryContainer(
new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_ID),
rolloutgrouBeanQueryFactory);
}
@Override
protected void addContainerProperties(final Container container) {
final LazyQueryContainer rolloutGroupTargetTableContainer = (LazyQueryContainer) container;
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_CONT_ID, String.class, "", false,
false);
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false,
true);
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, Status.class,
Status.RETRIEVED, false, false);
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_TARGET_STATUS,
TargetUpdateStatus.class, TargetUpdateStatus.UNKNOWN, false, false);
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.ASSIGNED_DISTRIBUTION_NAME_VER,
String.class, "", false, true);
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_BY, String.class, null,
false, true);
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY, String.class,
null, false, true);
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_DATE, String.class, null,
false, true);
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE, String.class,
null, false, true);
rolloutGroupTargetTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, "", false,
true);
}
@Override
protected String getTableId() {
return SPUIComponetIdProvider.ROLLOUT_GROUP_TARGETS_LIST_TABLE_ID;
}
@Override
protected void onValueChange() {
// No implementation required.
}
@Override
protected void addCustomGeneratedColumns() {
addGeneratedColumn(SPUILabelDefinitions.VAR_TARGET_STATUS,
(source, itemId, columnId) -> getStatusLabel(itemId));
setColumnAlignment(SPUILabelDefinitions.VAR_TARGET_STATUS, Align.CENTER);
}
@Override
protected void setCollapsiblecolumns() {
// No implementation required.
}
private Label getStatusLabel(final Object itemId) {
final Label statusLabel = new Label();
statusLabel.addStyleName(ValoTheme.LABEL_SMALL);
statusLabel.setHeightUndefined();
statusLabel.setContentMode(ContentMode.HTML);
setStatusIcon(itemId, statusLabel);
statusLabel.setSizeUndefined();
return statusLabel;
}
private void setStatusIcon(final Object itemId, final Label statusLabel) {
final Item item = getItem(itemId);
final RolloutGroup rolloutGroup = rolloutUIState.getRolloutGroup().isPresent()
? rolloutUIState.getRolloutGroup().get() : null;
if (item != null) {
final Status status = (Status) item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).getValue();
if (status == null) {
if (rolloutGroup != null && rolloutGroup.getStatus() == RolloutGroupStatus.READY) {
statusLabel.setValue(FontAwesome.DOT_CIRCLE_O.getHtml());
statusLabel.addStyleName("statusIconLightBlue");
statusLabel.setDescription(RolloutGroupStatus.READY.toString().toLowerCase());
} else if (rolloutGroup != null && rolloutGroup.getStatus() == RolloutGroupStatus.FINISHED) {
statusLabel.setValue(FontAwesome.MINUS_CIRCLE.getHtml());
statusLabel.addStyleName("statusIconBlue");
final String dsNameVersion = (String) item
.getItemProperty(SPUILabelDefinitions.ASSIGNED_DISTRIBUTION_NAME_VER).getValue();
statusLabel
.setDescription(i18n.get("message.dist.already.assigned", new Object[] { dsNameVersion }));
}
} else {
setRolloutStatusIcon(status, statusLabel);
statusLabel.setDescription(status.toString().toLowerCase());
}
}
}
private void setRolloutStatusIcon(final Status targetUpdateStatus, final Label statusLabel) {
switch (targetUpdateStatus) {
case ERROR:
statusLabel.setValue(FontAwesome.EXCLAMATION_CIRCLE.getHtml());
statusLabel.addStyleName("statusIconRed");
break;
case SCHEDULED:
statusLabel.setValue(FontAwesome.BULLSEYE.getHtml());
statusLabel.addStyleName("statusIconBlue");
break;
case FINISHED:
statusLabel.setValue(FontAwesome.CHECK_CIRCLE.getHtml());
statusLabel.addStyleName("statusIconGreen");
break;
case RUNNING:
case RETRIEVED:
case WARNING:
case DOWNLOAD:
statusLabel.setValue(FontAwesome.ADJUST.getHtml());
statusLabel.addStyleName("statusIconYellow");
break;
case CANCELED:
statusLabel.setValue(FontAwesome.TIMES_CIRCLE.getHtml());
statusLabel.addStyleName("statusIconGreen");
break;
case CANCELING:
statusLabel.setValue(FontAwesome.TIMES_CIRCLE.getHtml());
statusLabel.addStyleName("statusIconPending");
break;
default:
break;
}
}
}

View File

@@ -1,552 +0,0 @@
/**
* 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.Arrays;
import java.util.List;
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.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
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.TableColumn;
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.alump.distributionbar.DistributionBar;
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.Property;
import com.vaadin.server.FontAwesome;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.ViewScope;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import com.vaadin.ui.Window;
import com.vaadin.ui.themes.ValoTheme;
/**
*
* Rollout table in list view.
*
*/
@SpringComponent
@ViewScope
public class RolloutListTable extends AbstractSimpleTable {
private static final String IS_ACTION_RECIEVED = "isActionRecieved";
private static final long serialVersionUID = 8141874975649180139L;
@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
*/
@EventBusListenerMethod(scope = EventScope.SESSION)
public void onEvent(final RolloutChangeEvent rolloutChangeEvent) {
final List<Object> visibleItemIds = (List<Object>) getVisibleItemIds();
if (visibleItemIds.contains(rolloutChangeEvent.getRolloutId())) {
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_COUNT_TARGETS_RUNNING).setValue(
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.RUNNING));
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_ERROR).setValue(
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.ERROR));
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_FINISHED).setValue(
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.FINISHED));
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_NOT_STARTED).setValue(
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.NOTSTARTED));
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_CANCELLED).setValue(
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.CANCELLED));
item.getItemProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_SCHEDULED).setValue(
totalTargetCountStatus.getTotalTargetCountByStatus(TotalTargetCountStatus.Status.SCHEDULED));
item.getItemProperty(IS_ACTION_RECIEVED).setValue(
!(Boolean) item.getItemProperty(IS_ACTION_RECIEVED).getValue());
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 List<TableColumn> getTableVisibleColumns() {
final List<TableColumn> columnList = new ArrayList<>();
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_NAME, i18n.get("header.name"), 0.225f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION, i18n.get("header.distributionset"),
0.225f));
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_STATUS, i18n.get("header.status"), 0.07f));
columnList.add(new TableColumn(SPUIDefinitions.DETAIL_STATUS, i18n.get("header.detail.status"), 0.58f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS, i18n.get("header.numberofgroups"),
0.1f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS, i18n.get("header.total.targets"), 0.1f));
columnList.add(new TableColumn(SPUIDefinitions.ROLLOUT_ACTION, i18n.get("upload.action"), 0.1f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_DATE, i18n.get("header.createdDate"), 0.1f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_USER, i18n.get("header.createdBy"), 0.1f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_MODIFIED_DATE, i18n.get("header.modifiedDate"), 0.1f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_MODIFIED_BY, i18n.get("header.modifiedBy"), 0.1f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_DESC, i18n.get("header.description"), 0.1f));
return columnList;
}
@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 Container container) {
final LazyQueryContainer rolloutTableContainer = (LazyQueryContainer) container;
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_ID, String.class, null, false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, null, false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, RolloutStatus.class, null, false,
false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_DIST_NAME_VERSION, String.class, null,
false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_TARGETFILTERQUERY, String.class, null,
false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_DATE, String.class, null, false,
false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_DATE, String.class, null, false,
false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_USER, String.class, null, false,
false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_BY, String.class, null, false,
false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS, Integer.class, 0, false,
false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_NOT_STARTED, Long.class, 0L,
false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_RUNNING, Long.class, 0L,
false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_SCHEDULED, Long.class, 0L,
false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_ERROR, Long.class, 0L, false,
false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_FINISHED, Long.class, 0L,
false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_COUNT_TARGETS_CANCELLED, Long.class, 0L,
false, false);
rolloutTableContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS, String.class, "0", false,
false);
}
@Override
protected String getTableId() {
return SPUIComponetIdProvider.ROLLOUT_LIST_TABLE_ID;
}
@Override
protected void onValueChange() {
/**
* No implementation required.
*/
}
@Override
protected void addCustomGeneratedColumns() {
addGeneratedColumn(SPUIDefinitions.ROLLOUT_NAME, (source, itemId, columnId) -> getRolloutNameLink(itemId));
addGeneratedColumn(SPUIDefinitions.ROLLOUT_STATUS, (source, itemId, columnId) -> getStatusLabel(itemId));
addGeneratedColumn(SPUIDefinitions.DETAIL_STATUS, (source, itemId, columnId) -> getProgressBar(itemId));
addGeneratedColumn(SPUIDefinitions.ROLLOUT_ACTION, (source, itemId, columnId) -> getActionButton(itemId));
setColumnAlignment(SPUIDefinitions.ROLLOUT_STATUS, Align.CENTER);
setColumnAlignment(SPUIDefinitions.DETAIL_STATUS, Align.CENTER);
setColumnAlignment(SPUIDefinitions.ROLLOUT_ACTION, Align.CENTER);
}
@Override
protected void setCollapsiblecolumns() {
setColumnCollapsed(SPUILabelDefinitions.VAR_CREATED_DATE, true);
setColumnCollapsed(SPUILabelDefinitions.VAR_MODIFIED_DATE, true);
setColumnCollapsed(SPUILabelDefinitions.VAR_CREATED_USER, true);
setColumnCollapsed(SPUILabelDefinitions.VAR_MODIFIED_BY, true);
setColumnCollapsed(SPUILabelDefinitions.VAR_DESC, true);
}
private Button getActionButton(final Object itemId) {
final Item row = getItem(itemId);
final String rolloutName = (String) row.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
final Button actionButton = SPUIComponentProvider.getButton(getActionButtonId(rolloutName), "",
SPUILabelDefinitions.ACTION, ValoTheme.BUTTON_TINY + " ", true, FontAwesome.CIRCLE_O,
SPUIButtonStyleSmallNoBorder.class);
actionButton.setData(itemId);
actionButton.setHtmlContentAllowed(true);
actionButton.addClickListener(event -> onAction(event));
addStatusPropertyChangeListener(itemId, actionButton);
final RolloutStatus rolloutStatus = (RolloutStatus) row.getItemProperty(SPUILabelDefinitions.VAR_STATUS)
.getValue();
enableDisableActions(rolloutStatus, actionButton);
return actionButton;
}
private void enableDisableActions(final RolloutStatus rolloutStatus, final Button actionButton) {
final RolloutStatus[] statusList = new RolloutStatus[] { RolloutStatus.FINISHED, RolloutStatus.STARTING,
RolloutStatus.CREATING, RolloutStatus.ERROR_CREATING, RolloutStatus.ERROR_STARTING };
if (Arrays.asList(statusList).contains(rolloutStatus)) {
actionButton.setEnabled(false);
} else {
actionButton.setEnabled(true);
}
}
private void addStatusPropertyChangeListener(final Object itemId, final Button actionButton) {
final Property status = getContainerProperty(itemId, SPUILabelDefinitions.VAR_STATUS);
final Property.ValueChangeNotifier notifier = (Property.ValueChangeNotifier) status;
notifier.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(final com.vaadin.data.Property.ValueChangeEvent event) {
final Item row = getItem(itemId);
final RolloutStatus rolloutStatus = (RolloutStatus) row
.getItemProperty(SPUILabelDefinitions.VAR_STATUS).getValue();
enableDisableActions(rolloutStatus, actionButton);
}
});
}
private ContextMenu createContextMenu(final Long rolloutId) {
final Item row = 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 menuItemClicked(final ContextMenuItemClickEvent event) {
final ContextMenuItem item = (ContextMenuItem) event.getSource();
final ContextMenuData contextMenuData = (ContextMenuData) item.getData();
final Item row = 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 onAction(final ClickEvent event) {
final ContextMenu contextMenu = createContextMenu((Long) event.getButton().getData());
contextMenu.setAsContextMenuOf(event.getButton());
contextMenu.open(event.getClientX(), event.getClientY());
}
private Button getRolloutNameLink(final Object itemId) {
final Item row = getItem(itemId);
final String rolloutName = (String) row.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
final Button updateIcon = SPUIComponentProvider.getButton(getDetailLinkId(rolloutName), rolloutName,
SPUILabelDefinitions.SHOW_ROLLOUT_GROUP_DETAILS, null, false, null, SPUIButtonStyleSmallNoBorder.class);
updateIcon.setData(rolloutName);
updateIcon.addStyleName(ValoTheme.LINK_SMALL + " " + "on-focus-no-border link");
updateIcon.addClickListener(event -> showRolloutGroups(itemId));
return updateIcon;
}
private void showRolloutGroups(final Object itemId) {
rolloutUIState.setRolloutId((long) itemId);
final String rolloutName = (String) getItem(itemId).getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
rolloutUIState.setRolloutName(rolloutName);
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUPS);
}
private static String getActionButtonId(final String rollOutName) {
return new StringBuilder(SPUIComponetIdProvider.ROLLOUT_ACTION_BUTTON_ID).append('.').append(rollOutName)
.toString();
}
private static String getDetailLinkId(final String rollOutName) {
return new StringBuilder(SPUIComponetIdProvider.ROLLOUT_NAME_LINK_ID).append('.').append(rollOutName)
.toString();
}
private DistributionBar getProgressBar(final Object itemId) {
final DistributionBar bar = new DistributionBar(2);
bar.setId(SPUIComponetIdProvider.ROLLOUT_PROGRESS_BAR);
bar.setSizeFull();
bar.setZeroSizedVisible(false);
HawkbitCommonUtil.initialiseProgressBar(bar, getItem(itemId));
addPropertyChangeListenerOnActionRecieved(itemId, bar);
return bar;
}
private void addPropertyChangeListenerOnActionRecieved(final Object itemId, final DistributionBar bar) {
final Property status = getContainerProperty(itemId, IS_ACTION_RECIEVED);
final Property.ValueChangeNotifier notifier = (Property.ValueChangeNotifier) status;
notifier.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(final com.vaadin.data.Property.ValueChangeEvent event) {
HawkbitCommonUtil.initialiseProgressBar(bar, getItem(itemId));
}
});
}
private Label getStatusLabel(final Object itemId) {
final Label statusLabel = new Label();
statusLabel.setHeightUndefined();
statusLabel.setContentMode(ContentMode.HTML);
statusLabel.setId(getRolloutStatusId(itemId));
setStatusIcon(itemId, statusLabel);
statusLabel.setSizeUndefined();
addPropertyChangeListener(itemId, statusLabel);
return statusLabel;
}
private void addPropertyChangeListener(final Object itemId, final Label statusLabel) {
final Property status = getContainerProperty(itemId, SPUILabelDefinitions.VAR_STATUS);
final Property.ValueChangeNotifier notifier = (Property.ValueChangeNotifier) status;
notifier.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(final com.vaadin.data.Property.ValueChangeEvent event) {
setStatusIcon(itemId, statusLabel);
}
});
}
private String getRolloutStatusId(final Object itemId) {
final String rolloutName = (String) getItem(itemId).getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
return new StringBuilder(SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID).append(".").append(rolloutName)
.toString();
}
private void setStatusIcon(final Object itemId, final Label statusLabel) {
final Item item = getItem(itemId);
if (item != null) {
final RolloutStatus rolloutStatus = (RolloutStatus) item.getItemProperty(SPUILabelDefinitions.VAR_STATUS)
.getValue();
setRolloutStatusIcon(rolloutStatus, statusLabel);
}
}
private void setRolloutStatusIcon(final RolloutStatus rolloutStatus, final Label statusLabel) {
statusLabel.setDescription(rolloutStatus.toString().toLowerCase());
switch (rolloutStatus) {
case FINISHED:
statusLabel.setValue(FontAwesome.CHECK_CIRCLE.getHtml());
statusLabel.setStyleName("statusIconGreen");
break;
case PAUSED:
statusLabel.setValue(FontAwesome.PAUSE.getHtml());
statusLabel.setStyleName("statusIconBlue");
break;
case RUNNING:
statusLabel.setValue(null);
statusLabel.setStyleName("yellowSpinner");
break;
case READY:
statusLabel.setValue(FontAwesome.DOT_CIRCLE_O.getHtml());
statusLabel.setStyleName("statusIconLightBlue");
break;
case STOPPED:
statusLabel.setValue(FontAwesome.STOP.getHtml());
statusLabel.setStyleName("statusIconRed");
break;
case CREATING:
statusLabel.setValue(null);
statusLabel.setStyleName("greySpinner");
break;
case STARTING:
statusLabel.setValue(null);
statusLabel.setStyleName("blueSpinner");
break;
case ERROR_CREATING:
statusLabel.setValue(FontAwesome.EXCLAMATION_CIRCLE.getHtml());
statusLabel.setStyleName("statusIconRed");
statusLabel.setDescription(i18n.get("message.error.creating.rollout"));
break;
case ERROR_STARTING:
statusLabel.setValue(FontAwesome.EXCLAMATION_CIRCLE.getHtml());
statusLabel.setStyleName("statusIconRed");
statusLabel.setDescription(i18n.get("message.error.starting.rollout"));
break;
default:
break;
}
statusLabel.addStyleName(ValoTheme.LABEL_SMALL);
}
private void refreshTable() {
final LazyQueryContainer container = (LazyQueryContainer) getContainerDataSource();
container.refresh();
}
enum ACTION {
PAUSE, RESUME, START, UPDATE
}
/**
* Represents data of context menu item.
*
*/
public static class ContextMenuData {
private Long rolloutId;
private ACTION action;
/**
* Set rollout if and action.
*
* @param rolloutId
* id of rollout
* @param action
* user action {@link ACTION}
*/
public ContextMenuData(final Long rolloutId, final ACTION action) {
this.action = action;
this.rolloutId = rolloutId;
}
/**
* @return the rolloutId
*/
public Long getRolloutId() {
return rolloutId;
}
/**
* @param rolloutId
* the rolloutId to set
*/
public void setRolloutId(final Long rolloutId) {
this.rolloutId = rolloutId;
}
/**
* @return the action
*/
public ACTION getAction() {
return action;
}
/**
* @param action
* the action to set
*/
public void setAction(final ACTION action) {
this.action = action;
}
}
}

View File

@@ -13,6 +13,9 @@ import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.repository.SpPermissionChecker;
import org.eclipse.hawkbit.ui.HawkbitUI;
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
import org.eclipse.hawkbit.ui.rollout.rollout.RolloutListView;
import org.eclipse.hawkbit.ui.rollout.rolloutgroup.RolloutGroupsListView;
import org.eclipse.hawkbit.ui.rollout.rolloutgrouptargets.RolloutGroupTargetsListView;
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
import org.springframework.beans.factory.annotation.Autowired;
import org.vaadin.spring.events.EventBus;

View File

@@ -6,7 +6,7 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.rollout.rollout;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -646,7 +646,7 @@ public class AddUpdateRolloutWindowLayout extends CustomComponent {
}
private Container createDsComboContainer() {
final BeanQueryFactory<DistBeanQuery> distributionQF = new BeanQueryFactory<>(DistBeanQuery.class);
final BeanQueryFactory<DistributionBeanQuery> distributionQF = new BeanQueryFactory<>(DistributionBeanQuery.class);
return new LazyQueryContainer(new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE,
SPUILabelDefinitions.VAR_DIST_ID_NAME), distributionQF);

View File

@@ -6,7 +6,7 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.rollout.rollout;
import java.io.IOException;
import java.io.ObjectInputStream;
@@ -34,7 +34,7 @@ import org.vaadin.addons.lazyquerycontainer.QueryDefinition;
* Bean query for distribution set combo.
*
*/
public class DistBeanQuery extends AbstractBeanQuery<ProxyDistribution> {
public class DistributionBeanQuery extends AbstractBeanQuery<ProxyDistribution> {
private static final long serialVersionUID = 5176481314404662215L;
private Sort sort = new Sort(Direction.ASC, "name", "version");
@@ -53,7 +53,7 @@ public class DistBeanQuery extends AbstractBeanQuery<ProxyDistribution> {
* @param sortStates
* as Sort status
*/
public DistBeanQuery(final QueryDefinition definition, final Map<String, Object> queryConfig,
public DistributionBeanQuery(final QueryDefinition definition, final Map<String, Object> queryConfig,
final Object[] sortPropertyIds, final boolean[] sortStates) {
super(definition, queryConfig, sortPropertyIds, sortStates);

View File

@@ -6,10 +6,12 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.rollout.rollout;
import org.eclipse.hawkbit.repository.model.Rollout;
import com.vaadin.server.FontAwesome;
/**
* Proxy rollout with suctome properties.
*
@@ -26,22 +28,10 @@ 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;
/**
* @return the distributionSetNameVersion
*/
@@ -102,81 +92,6 @@ public class ProxyRollout extends Rollout {
this.modifiedDate = modifiedDate;
}
/**
* @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
*/
@@ -192,21 +107,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
*/
@@ -221,4 +121,10 @@ public class ProxyRollout extends Rollout {
public void setTotalTargetsCount(final String totalTargetsCount) {
this.totalTargetsCount = totalTargetsCount;
}
public String getAction() {
return FontAwesome.CIRCLE_O.getHtml();
}
}

View File

@@ -6,7 +6,7 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.rollout.rollout;
import java.util.ArrayList;
import java.util.List;
@@ -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

@@ -0,0 +1,568 @@
/**
* 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.rollout;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
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.ui.common.grid.AbstractGrid;
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlButtonRenderer;
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer;
import org.eclipse.hawkbit.ui.customrenderers.renderers.LinkRenderer;
import org.eclipse.hawkbit.ui.rollout.DistributionBarHelper;
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.SPUIStyleDefinitions;
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 AbstractGrid {
private static final long serialVersionUID = 4060904914954370524L;
private static final String UPDATE_OPTION = "Update";
private static final String RESUME_OPTION = "Resume";
private static final String PAUSE_OPTION = "Pause";
private static final String START_OPTION = "Start";
@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) {
refreshGrid();
}
}
/**
* Handles the RolloutChangeEvent to refresh the item in the grid.
*
* @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.isShowRollOuts()) {
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_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 setColumnExpandRatio() {
getColumn(SPUILabelDefinitions.VAR_NAME).setMinimumWidth(40);
getColumn(SPUILabelDefinitions.VAR_NAME).setMaximumWidth(150);
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setMinimumWidth(40);
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setMaximumWidth(150);
getColumn(SPUILabelDefinitions.VAR_STATUS).setMinimumWidth(75);
getColumn(SPUILabelDefinitions.VAR_STATUS).setMaximumWidth(75);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMinimumWidth(40);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMaximumWidth(100);
getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setMinimumWidth(40);
getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setMaximumWidth(100);
getColumn(SPUILabelDefinitions.ACTION).setMinimumWidth(75);
getColumn(SPUILabelDefinitions.ACTION).setMaximumWidth(75);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setMinimumWidth(280);
setFrozenColumnCount(getColumns().size());
}
@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 String getGridId() {
return SPUIComponetIdProvider.ROLLOUT_LIST_GRID_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.ACTION);
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);
setColumnOrder(columnList.toArray());
alignColumns();
}
@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);
for (Object propertyId : columnsToBeHidden) {
getColumn(propertyId).setHidden(true);
}
}
@Override
protected CellDescriptionGenerator getDescriptionGenerator() {
return cell -> getDescription(cell);
}
@Override
protected void addColumnRenderes() {
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setRenderer(new HtmlRenderer(),
new TotalTargetCountStatusConverter());
getColumn(SPUILabelDefinitions.VAR_STATUS).setRenderer(new HtmlLabelRenderer(), new RolloutStatusConverter());
getColumn(SPUILabelDefinitions.ACTION).setRenderer(new HtmlButtonRenderer(event -> onClickOfActionBtn(event)));
getColumn(SPUILabelDefinitions.VAR_NAME).setRenderer(new LinkRenderer(event -> onClickOfRolloutName(event)));
}
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.ACTION };
if (Arrays.asList(coulmnNames).contains(cellReference.getPropertyId())) {
return "centeralign";
}
return null;
}
});
}
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);
String ds = (String) getContainerDataSource().getItem(event.getItemId())
.getItemProperty(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).getValue();
rolloutUIState.setRolloutDistributionSet(ds);
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_OPTION);
startItem.setData(new ContextMenuData(rolloutId, ACTION.START));
} else if (rolloutStatus == RolloutStatus.RUNNING) {
final ContextMenuItem pauseItem = context.addItem(PAUSE_OPTION);
pauseItem.setData(new ContextMenuData(rolloutId, ACTION.PAUSE));
} else if (rolloutStatus == RolloutStatus.PAUSED) {
final ContextMenuItem resumeItem = context.addItem(RESUME_OPTION);
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_OPTION);
cancelItem.setData(new ContextMenuData(rolloutId, ACTION.UPDATE));
}
return context;
}
private String convertRolloutStatusToString(final RolloutStatus value) {
String result = null;
switch (value) {
case FINISHED:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.CHECK_CIRCLE.getCodepoint()), SPUIStyleDefinitions.STATUS_ICON_GREEN,
SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);
break;
case PAUSED:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(Integer.toString(FontAwesome.PAUSE.getCodepoint()),
SPUIStyleDefinitions.STATUS_ICON_BLUE, SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);
break;
case RUNNING:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(null, SPUIStyleDefinitions.STATUS_SPINNER_YELLOW,
SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);
break;
case READY:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.DOT_CIRCLE_O.getCodepoint()),
SPUIStyleDefinitions.STATUS_ICON_LIGHT_BLUE, SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);
break;
case STOPPED:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(Integer.toString(FontAwesome.STOP.getCodepoint()),
SPUIStyleDefinitions.STATUS_ICON_RED, SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);
break;
case CREATING:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(null, SPUIStyleDefinitions.STATUS_SPINNER_GREY,
SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);
break;
case STARTING:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(null, SPUIStyleDefinitions.STATUS_SPINNER_BLUE,
SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);
break;
case ERROR_CREATING:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.EXCLAMATION_CIRCLE.getCodepoint()),
SPUIStyleDefinitions.STATUS_ICON_RED, SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);
break;
case ERROR_STARTING:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.EXCLAMATION_CIRCLE.getCodepoint()),
SPUIStyleDefinitions.STATUS_ICON_RED, SPUIComponetIdProvider.ROLLOUT_STATUS_LABEL_ID);
break;
default:
break;
}
return result;
}
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 refreshGrid() {
((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;
}
}
private String getDescription(CellReference cell) {
if (SPUILabelDefinitions.VAR_STATUS.equals(cell.getPropertyId())) {
return cell.getProperty().getValue().toString().toLowerCase();
} else if (SPUILabelDefinitions.ACTION.equals(cell.getPropertyId())) {
return SPUILabelDefinitions.ACTION.toLowerCase();
} else if (SPUILabelDefinitions.VAR_NAME.equals(cell.getPropertyId())) {
return cell.getProperty().getValue().toString();
} else if (SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS.equals(cell.getPropertyId())) {
return DistributionBarHelper
.getTooltip(((TotalTargetCountStatus) cell.getValue()).getStatusTotalCountMap());
} else {
return null;
}
}
enum ACTION {
PAUSE, RESUME, START, UPDATE
}
/**
* Represents data of context menu item.
*
*/
public static class ContextMenuData {
private Long rolloutId;
private ACTION action;
/**
* Set rollout if and action.
*
* @param rolloutId
* id of rollout
* @param action
* user action {@link ACTION}
*/
public ContextMenuData(final Long rolloutId, final ACTION action) {
this.action = action;
this.rolloutId = rolloutId;
}
/**
* @return the rolloutId
*/
public Long getRolloutId() {
return rolloutId;
}
/**
* @param rolloutId
* the rolloutId to set
*/
public void setRolloutId(final Long rolloutId) {
this.rolloutId = rolloutId;
}
/**
* @return the action
*/
public ACTION getAction() {
return action;
}
/**
* @param action
* the action to set
*/
public void setAction(final ACTION action) {
this.action = action;
}
}
/**
*
* Converter to convert {@link RolloutStatus} to string.
*
*/
class RolloutStatusConverter implements Converter<String, RolloutStatus> {
private static final long serialVersionUID = -1217685750825632678L;
@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) {
return convertRolloutStatusToString(value);
}
@Override
public Class<RolloutStatus> getModelType() {
return RolloutStatus.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
}
/**
* Converter to convert {@link TotalTargetCountStatus} to formatted string
* with status and count details.
*
*/
class TotalTargetCountStatusConverter implements Converter<String, TotalTargetCountStatus> {
private static final long serialVersionUID = -5794528427855153924L;
@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 DistributionBarHelper.getDistributionBarAsHTMLString(value.getStatusTotalCountMap());
}
@Override
public Class<TotalTargetCountStatus> getModelType() {
return TotalTargetCountStatus.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
}
}

View File

@@ -6,11 +6,12 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.rollout.rollout;
import javax.annotation.PostConstruct;
import org.eclipse.hawkbit.repository.SpPermissionChecker;
import org.eclipse.hawkbit.ui.common.grid.AbstractGridHeader;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
@@ -35,7 +36,7 @@ import com.vaadin.ui.Window;
*/
@SpringComponent
@ViewScope
public class RolloutListHeader extends AbstractSimpleTableHeader {
public class RolloutListHeader extends AbstractGridHeader {
private static final long serialVersionUID = 2365400733081333174L;
@Autowired

View File

@@ -6,10 +6,11 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.rollout.rollout;
import javax.annotation.PostConstruct;
import org.eclipse.hawkbit.ui.common.grid.AbstractGridLayout;
import org.springframework.beans.factory.annotation.Autowired;
import com.vaadin.spring.annotation.SpringComponent;
@@ -23,7 +24,7 @@ import com.vaadin.ui.Label;
*/
@SpringComponent
@ViewScope
public class RolloutListView extends AbstractSimpleTableLayout {
public class RolloutListView extends AbstractGridLayout {
private static final long serialVersionUID = -2703552177439393208L;
@@ -31,24 +32,21 @@ public class RolloutListView extends AbstractSimpleTableLayout {
private RolloutListHeader rolloutListHeader;
@Autowired
private RolloutListTable rolloutListTable;
private RolloutListGrid rolloutListGrid;
@PostConstruct
void init() {
super.init(rolloutListHeader, rolloutListTable);
super.init(rolloutListHeader, rolloutListGrid);
}
@Override
protected boolean hasCountMessage() {
return false;
}
@Override
protected Label getCountMessageLabel() {
return null;
}

View File

@@ -6,7 +6,7 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.rollout.rolloutgroup;
import org.eclipse.hawkbit.repository.model.RolloutGroup;

View File

@@ -6,7 +6,7 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.rollout.rolloutgroup;
import java.util.ArrayList;
import java.util.List;
@@ -15,7 +15,6 @@ import java.util.Map;
import org.eclipse.hawkbit.repository.RolloutGroupManagement;
import org.eclipse.hawkbit.repository.RolloutManagement;
import org.eclipse.hawkbit.repository.model.RolloutGroup;
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
@@ -29,7 +28,8 @@ import org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery;
import org.vaadin.addons.lazyquerycontainer.QueryDefinition;
/**
* @author gah6kor
* Simple implementation of generics bean query which dynamically loads a batch
* of {@link ProxyRolloutGroup} beans.
*
*/
public class RolloutGroupBeanQuery extends AbstractBeanQuery<ProxyRolloutGroup> {
@@ -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

@@ -0,0 +1,392 @@
/**
* 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.rolloutgroup;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.eventbus.event.RolloutGroupChangeEvent;
import org.eclipse.hawkbit.repository.RolloutGroupManagement;
import org.eclipse.hawkbit.repository.SpPermissionChecker;
import org.eclipse.hawkbit.repository.model.RolloutGroup;
import org.eclipse.hawkbit.repository.model.RolloutGroup.RolloutGroupStatus;
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
import org.eclipse.hawkbit.ui.common.grid.AbstractGrid;
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer;
import org.eclipse.hawkbit.ui.customrenderers.renderers.LinkRenderer;
import org.eclipse.hawkbit.ui.rollout.DistributionBarHelper;
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.SPUIStyleDefinitions;
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.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.converter.Converter;
import com.vaadin.server.FontAwesome;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.ViewScope;
import com.vaadin.ui.renderers.ClickableRenderer.RendererClickEvent;
import com.vaadin.ui.renderers.HtmlRenderer;
@SpringComponent
@ViewScope
public class RolloutGroupListGrid extends AbstractGrid {
private static final long serialVersionUID = 4060904914954370524L;
@Autowired
private I18N i18n;
@Autowired
private transient EventBus.SessionEventBus eventBus;
@Autowired
private transient RolloutGroupManagement rolloutGroupManagement;
@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.SHOW_ROLLOUT_GROUPS) {
((LazyQueryContainer) getContainerDataSource()).refresh();
}
}
/**
*
* Handles the RolloutGroupChangeEvent to refresh the item in the grid.
*
*
* @param rolloutGroupChangeEvent
* the event which contains the rollout group which has been
* change
*/
@SuppressWarnings("unchecked")
@EventBusListenerMethod(scope = EventScope.SESSION)
public void onEvent(final RolloutGroupChangeEvent rolloutGroupChangeEvent) {
if (rolloutUIState.isShowRolloutGroups()) {
final RolloutGroup rolloutGroup = rolloutGroupManagement
.findRolloutGroupWithDetailedStatus(rolloutGroupChangeEvent.getRolloutGroupId());
final LazyQueryContainer rolloutContainer = (LazyQueryContainer) getContainerDataSource();
final Item item = rolloutContainer.getItem(rolloutGroup.getId());
if (item != null) {
item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).setValue(rolloutGroup.getStatus());
item.getItemProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS)
.setValue(rolloutGroup.getTotalTargetCountStatus());
}
}
}
@Override
protected Container createContainer() {
final BeanQueryFactory<RolloutGroupBeanQuery> rolloutQf = new BeanQueryFactory<>(RolloutGroupBeanQuery.class);
return new LazyQueryContainer(
new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_ID), rolloutQf);
}
@Override
protected void addContainerProperties() {
final LazyQueryContainer rolloutGroupGridContainer = (LazyQueryContainer) getContainerDataSource();
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false, false);
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, null, false, false);
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, RolloutGroupStatus.class, null,
false, false);
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE,
String.class, null, false, false);
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD, String.class,
null, false, false);
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.ROLLOUT_GROUP_THRESHOLD, String.class, null,
false, false);
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_DATE, String.class, null, false,
false);
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_DATE, String.class, null,
false, false);
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_USER, String.class, null, false,
false);
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_BY, String.class, null, false,
false);
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS, String.class, "0", false,
false);
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS,
TotalTargetCountStatus.class, null, false, false);
}
@Override
protected void setColumnExpandRatio() {
getColumn(SPUILabelDefinitions.VAR_NAME).setMinimumWidth(40);
getColumn(SPUILabelDefinitions.VAR_NAME).setMaximumWidth(200);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMinimumWidth(40);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMaximumWidth(100);
getColumn(SPUILabelDefinitions.VAR_STATUS).setMinimumWidth(75);
getColumn(SPUILabelDefinitions.VAR_STATUS).setMaximumWidth(75);
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE).setMinimumWidth(40);
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE).setMaximumWidth(100);
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD).setMinimumWidth(40);
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD).setMaximumWidth(100);
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_THRESHOLD).setMinimumWidth(40);
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_THRESHOLD).setMaximumWidth(100);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setMinimumWidth(280);
setFrozenColumnCount(7);
}
@Override
protected void setColumnHeaderNames() {
getColumn(SPUILabelDefinitions.VAR_NAME).setHeaderCaption(i18n.get("header.name"));
getColumn(SPUILabelDefinitions.VAR_STATUS).setHeaderCaption(i18n.get("header.status"));
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS)
.setHeaderCaption(i18n.get("header.detail.status"));
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE)
.setHeaderCaption(i18n.get("header.rolloutgroup.installed.percentage"));
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD)
.setHeaderCaption(i18n.get("header.rolloutgroup.threshold.error"));
getColumn(SPUILabelDefinitions.ROLLOUT_GROUP_THRESHOLD)
.setHeaderCaption(i18n.get("header.rolloutgroup.threshold"));
getColumn(SPUILabelDefinitions.VAR_CREATED_USER).setHeaderCaption(i18n.get("header.createdBy"));
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setHeaderCaption(i18n.get("header.createdDate"));
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).setHeaderCaption(i18n.get("header.total.targets"));
}
@Override
protected String getGridId() {
return SPUIComponetIdProvider.ROLLOUT_GROUP_LIST_GRID_ID;
}
@Override
protected void setColumnProperties() {
List<Object> columnList = new ArrayList<>();
columnList.add(SPUILabelDefinitions.VAR_NAME);
columnList.add(SPUILabelDefinitions.VAR_STATUS);
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS);
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS);
columnList.add(SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE);
columnList.add(SPUILabelDefinitions.ROLLOUT_GROUP_ERROR_THRESHOLD);
columnList.add(SPUILabelDefinitions.ROLLOUT_GROUP_THRESHOLD);
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);
setColumnOrder(columnList.toArray());
alignColumns();
}
@Override
protected void addColumnRenderes() {
getColumn(SPUILabelDefinitions.VAR_STATUS).setRenderer(new HtmlLabelRenderer(),
new RolloutGroupStatusConverter());
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setRenderer(new HtmlRenderer(),
new TotalTargetCountStatusConverter());
if (permissionChecker.hasRolloutTargetsReadPermission()) {
getColumn(SPUILabelDefinitions.VAR_NAME)
.setRenderer(new LinkRenderer(event -> onClickOfRolloutGroupName(event)));
}
}
@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);
for (Object propertyId : columnsToBeHidden) {
getColumn(propertyId).setHidden(true);
}
}
@Override
protected CellDescriptionGenerator getDescriptionGenerator() {
return cell -> getDescription(cell);
};
private void onClickOfRolloutGroupName(RendererClickEvent event) {
rolloutUIState
.setRolloutGroup(rolloutGroupManagement.findRolloutGroupWithDetailedStatus((Long) event.getItemId()));
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUP_TARGETS);
}
private String convertRolloutGroupStatusToString(final RolloutGroupStatus value) {
String result = null;
switch (value) {
case FINISHED:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.CHECK_CIRCLE.getCodepoint()), SPUIStyleDefinitions.STATUS_ICON_GREEN,
SPUIComponetIdProvider.ROLLOUT_GROUP_STATUS_LABEL_ID);
break;
case SCHEDULED:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.HOURGLASS_1.getCodepoint()), SPUIStyleDefinitions.STATUS_ICON_PENDING,
SPUIComponetIdProvider.ROLLOUT_GROUP_STATUS_LABEL_ID);
break;
case RUNNING:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.ADJUST.getCodepoint()), SPUIStyleDefinitions.STATUS_ICON_YELLOW,
SPUIComponetIdProvider.ROLLOUT_GROUP_STATUS_LABEL_ID);
break;
case READY:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.DOT_CIRCLE_O.getCodepoint()),
SPUIStyleDefinitions.STATUS_ICON_LIGHT_BLUE, SPUIComponetIdProvider.ROLLOUT_GROUP_STATUS_LABEL_ID);
break;
case ERROR:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.EXCLAMATION_CIRCLE.getCodepoint()),
SPUIStyleDefinitions.STATUS_ICON_RED, SPUIComponetIdProvider.ROLLOUT_GROUP_STATUS_LABEL_ID);
break;
default:
break;
}
return result;
}
private String getDescription(CellReference cell) {
if (SPUILabelDefinitions.VAR_STATUS.equals(cell.getPropertyId())) {
return cell.getProperty().getValue().toString().toLowerCase();
} else if (SPUILabelDefinitions.ACTION.equals(cell.getPropertyId())) {
return SPUILabelDefinitions.ACTION.toLowerCase();
} else if (SPUILabelDefinitions.VAR_NAME.equals(cell.getPropertyId())) {
return cell.getProperty().getValue().toString();
} else if (SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS.equals(cell.getPropertyId())) {
return DistributionBarHelper
.getTooltip(((TotalTargetCountStatus) cell.getValue()).getStatusTotalCountMap());
} else {
return null;
}
}
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 };
if (Arrays.asList(coulmnNames).contains(cellReference.getPropertyId())) {
return "centeralign";
}
return null;
}
});
}
/**
*
* Converts {@link TotalTargetCountStatus} into formatted string with status
* and count details.
*
*/
class TotalTargetCountStatusConverter implements Converter<String, TotalTargetCountStatus> {
private static final long serialVersionUID = -9205943894818450807L;
@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 DistributionBarHelper.getDistributionBarAsHTMLString(value.getStatusTotalCountMap());
}
@Override
public Class<TotalTargetCountStatus> getModelType() {
return TotalTargetCountStatus.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
}
/**
*
* Converts {@link RolloutGroupStatus} to string.
*
*/
class RolloutGroupStatusConverter implements Converter<String, RolloutGroupStatus> {
private static final long serialVersionUID = 5448062736373292820L;
@Override
public RolloutGroupStatus convertToModel(final String value,
final Class<? extends RolloutGroupStatus> targetType, final Locale locale) {
return null;
}
@Override
public String convertToPresentation(final RolloutGroupStatus value, final Class<? extends String> targetType,
final Locale locale) {
return convertRolloutGroupStatusToString(value);
}
@Override
public Class<RolloutGroupStatus> getModelType() {
return RolloutGroupStatus.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
}
}

View File

@@ -6,11 +6,12 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.rollout.rolloutgroup;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.ui.common.grid.AbstractGridHeader;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
@@ -37,7 +38,7 @@ import com.vaadin.ui.themes.ValoTheme;
*/
@SpringComponent
@ViewScope
public class RolloutGroupsListHeader extends AbstractSimpleTableHeader {
public class RolloutGroupsListHeader extends AbstractGridHeader {
private static final long serialVersionUID = 5077741997839715209L;

View File

@@ -6,10 +6,11 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.rollout.rolloutgroup;
import javax.annotation.PostConstruct;
import org.eclipse.hawkbit.ui.common.grid.AbstractGridLayout;
import org.springframework.beans.factory.annotation.Autowired;
import com.vaadin.spring.annotation.SpringComponent;
@@ -22,7 +23,7 @@ import com.vaadin.ui.Label;
*/
@SpringComponent
@ViewScope
public class RolloutGroupsListView extends AbstractSimpleTableLayout {
public class RolloutGroupsListView extends AbstractGridLayout {
private static final long serialVersionUID = 7252345838154270259L;
@@ -30,22 +31,20 @@ public class RolloutGroupsListView extends AbstractSimpleTableLayout {
private RolloutGroupsListHeader rolloutGroupListHeader;
@Autowired
private RolloutGroupListTable rolloutGroupListTable;
private RolloutGroupListGrid rolloutListGrid;
@PostConstruct
protected void init() {
super.init(rolloutGroupListHeader, rolloutGroupListTable);
super.init(rolloutGroupListHeader, rolloutListGrid);
}
@Override
protected boolean hasCountMessage() {
return false;
}
@Override
protected Label getCountMessageLabel() {
return null;
}

View File

@@ -6,7 +6,7 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.rollout.rolloutgrouptargets;
import java.util.ArrayList;
import java.util.List;

View File

@@ -6,7 +6,7 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.rollout.rolloutgrouptargets;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@@ -37,16 +37,13 @@ import com.vaadin.ui.Label;
@ViewScope
public class RolloutGroupTargetsCountLabelMessage extends Label {
/**
*
*/
private static final long serialVersionUID = -3876685878918411453L;
@Autowired
private transient RolloutUIState rolloutUIState;
@Autowired
private transient RolloutGroupTargetsListTable rolloutGroupTargetsListTable;
private transient RolloutGroupTargetsListGrid rolloutGroupTargetsListGrid;
@Autowired
private I18N i18n;
@@ -93,7 +90,7 @@ public class RolloutGroupTargetsCountLabelMessage extends Label {
}
private void displayRolloutGroupTargetMessage() {
long totalTargetTableEnteries = rolloutGroupTargetsListTable.size();
long totalTargetTableEnteries = rolloutGroupTargetsListGrid.getContainerDataSource().size();
if (rolloutUIState.getRolloutGroupTargetsTruncated() != null) {
// set the icon
setIcon(FontAwesome.INFO_CIRCLE);
@@ -113,7 +110,7 @@ public class RolloutGroupTargetsCountLabelMessage extends Label {
message.append(SPUIDefinitions.MAX_TARGET_TABLE_ENTRIES);
} else {
message.append(i18n.get("label.filter.shown"));
message.append(rolloutGroupTargetsListTable.size());
message.append(rolloutGroupTargetsListGrid.getContainerDataSource().size());
}
message.append(HawkbitCommonUtil.SP_STRING_SPACE);
setCaption(message.toString());

View File

@@ -0,0 +1,309 @@
/**
* 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.rolloutgrouptargets;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.repository.model.Action.Status;
import org.eclipse.hawkbit.repository.model.RolloutGroup;
import org.eclipse.hawkbit.repository.model.RolloutGroup.RolloutGroupStatus;
import org.eclipse.hawkbit.ui.common.grid.AbstractGrid;
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer;
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.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.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.util.converter.Converter;
import com.vaadin.server.FontAwesome;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.ViewScope;
@SpringComponent
@ViewScope
public class RolloutGroupTargetsListGrid extends AbstractGrid {
private static final long serialVersionUID = -2244756637458984597L;
@Autowired
private I18N i18n;
@Autowired
private transient EventBus.SessionEventBus eventBus;
@Autowired
private transient RolloutUIState rolloutUIState;
@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.SHOW_ROLLOUT_GROUP_TARGETS) {
((LazyQueryContainer) getContainerDataSource()).refresh();
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUP_TARGETS_COUNT);
}
}
@Override
protected Container createContainer() {
final BeanQueryFactory<RolloutGroupTargetsBeanQuery> rolloutgrouBeanQueryFactory = new BeanQueryFactory<>(
RolloutGroupTargetsBeanQuery.class);
return new LazyQueryContainer(
new LazyQueryDefinition(true, SPUIDefinitions.PAGE_SIZE, SPUILabelDefinitions.VAR_ID),
rolloutgrouBeanQueryFactory);
}
@Override
protected void addContainerProperties() {
final LazyQueryContainer rolloutGroupTargetGridContainer = (LazyQueryContainer) getContainerDataSource();
rolloutGroupTargetGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false,
true);
rolloutGroupTargetGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, Status.class,
Status.RETRIEVED, false, false);
rolloutGroupTargetGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_BY, String.class, null,
false, true);
rolloutGroupTargetGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY, String.class,
null, false, true);
rolloutGroupTargetGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_CREATED_DATE, String.class, null,
false, true);
rolloutGroupTargetGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE, String.class,
null, false, true);
rolloutGroupTargetGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, "", false,
true);
}
@Override
protected void setColumnExpandRatio() {
getColumn(SPUILabelDefinitions.VAR_NAME).setMinimumWidth(20);
getColumn(SPUILabelDefinitions.VAR_NAME).setMaximumWidth(280);
getColumn(SPUILabelDefinitions.VAR_STATUS).setMinimumWidth(50);
getColumn(SPUILabelDefinitions.VAR_STATUS).setMaximumWidth(80);
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setMaximumWidth(180);
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setMinimumWidth(30);
getColumn(SPUILabelDefinitions.VAR_CREATED_BY).setMaximumWidth(180);
getColumn(SPUILabelDefinitions.VAR_CREATED_BY).setMinimumWidth(50);
getColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE).setMaximumWidth(180);
getColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE).setMinimumWidth(30);
getColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY).setMaximumWidth(180);
getColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY).setMinimumWidth(50);
setFrozenColumnCount(getColumns().size());
}
@Override
protected void setColumnHeaderNames() {
getColumn(SPUILabelDefinitions.VAR_NAME).setHeaderCaption(i18n.get("header.name"));
getColumn(SPUILabelDefinitions.VAR_STATUS).setHeaderCaption(i18n.get("header.status"));
getColumn(SPUILabelDefinitions.VAR_CREATED_DATE).setHeaderCaption(i18n.get("header.createdDate"));
getColumn(SPUILabelDefinitions.VAR_CREATED_BY).setHeaderCaption(i18n.get("header.createdBy"));
getColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE).setHeaderCaption(i18n.get("header.modifiedDate"));
getColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY).setHeaderCaption(i18n.get("header.modifiedBy"));
getColumn(SPUILabelDefinitions.VAR_DESC).setHeaderCaption(i18n.get("header.description"));
}
@Override
protected String getGridId() {
return SPUIComponetIdProvider.ROLLOUT_GROUP_TARGETS_LIST_GRID_ID;
}
@Override
protected void setColumnProperties() {
List<Object> columnList = new ArrayList<>();
columnList.add(SPUILabelDefinitions.VAR_NAME);
columnList.add(SPUILabelDefinitions.VAR_CREATED_DATE);
columnList.add(SPUILabelDefinitions.VAR_CREATED_BY);
columnList.add(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE);
columnList.add(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY);
columnList.add(SPUILabelDefinitions.VAR_STATUS);
columnList.add(SPUILabelDefinitions.VAR_DESC);
setColumnOrder(columnList.toArray());
alignColumns();
}
@Override
protected void addColumnRenderes() {
getColumn(SPUILabelDefinitions.VAR_STATUS).setRenderer(new HtmlLabelRenderer(), new StatusConverter());
}
@Override
protected void setHiddenColumns() {
/**
* No hidden columns.
*/
}
@Override
protected CellDescriptionGenerator getDescriptionGenerator() {
return cell -> getDescription(cell);
};
private void alignColumns() {
setCellStyleGenerator(new CellStyleGenerator() {
private static final long serialVersionUID = 5573570647129792429L;
@Override
public String getStyle(final CellReference cellReference) {
if (SPUILabelDefinitions.VAR_STATUS.equals(cellReference.getPropertyId())) {
return "centeralign";
}
return null;
}
});
}
/**
*
* Converts {@link Status} into string with status icon details.
*
*/
private class StatusConverter implements Converter<String, Status> {
private static final long serialVersionUID = -7467206089699548808L;
@Override
public Status convertToModel(final String value, final Class<? extends Status> targetType,
final Locale locale) {
return null;
}
@Override
public String convertToPresentation(final Status status, final Class<? extends String> targetType,
final Locale locale) {
if (status == null) {
// Actions are not created for targets when
// rollout's status
// is READY and when duplicate assignment is done.
// In these cases display a appropriate status with
// description
return getStatus();
} else {
return processActionStatus(status);
}
}
@Override
public Class<Status> getModelType() {
return Status.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
}
private String processActionStatus(final Status status) {
String result = null;
switch (status) {
case FINISHED:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.CHECK_CIRCLE.getCodepoint()), "statusIconGreen", null);
break;
case SCHEDULED:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.HOURGLASS_1.getCodepoint()), "statusIconPending", null);
break;
case RUNNING:
case RETRIEVED:
case WARNING:
case DOWNLOAD:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.ADJUST.getCodepoint()), "statusIconYellow", null);
break;
case CANCELING:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.TIMES_CIRCLE.getCodepoint()), "statusIconPending", null);
break;
case CANCELED:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.TIMES_CIRCLE.getCodepoint()), "statusIconGreen", null);
break;
case ERROR:
result = HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.EXCLAMATION_CIRCLE.getCodepoint()), "statusIconRed", null);
break;
default:
break;
}
return result;
}
private String getStatus() {
final RolloutGroup rolloutGroup = rolloutUIState.getRolloutGroup().isPresent()
? rolloutUIState.getRolloutGroup().get() : null;
if (rolloutGroup != null && rolloutGroup.getStatus() == RolloutGroupStatus.READY) {
return HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.DOT_CIRCLE_O.getCodepoint()), "statusIconLightBlue", null);
} else if (rolloutGroup != null && rolloutGroup.getStatus() == RolloutGroupStatus.FINISHED) {
return HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.MINUS_CIRCLE.getCodepoint()), "statusIconBlue", null);
} else {
return HawkbitCommonUtil.getStatusLabelDetailsInString(
Integer.toString(FontAwesome.QUESTION_CIRCLE.getCodepoint()), "statusIconBlue", null);
}
}
private String getDescription(CellReference cell) {
if (SPUILabelDefinitions.VAR_STATUS.equals(cell.getPropertyId())) {
if (null != cell.getProperty().getValue()) {
return cell.getProperty().getValue().toString().toLowerCase();
} else {
return getDescriptionWhenNoAction();
}
}
return null;
}
private String getDescriptionWhenNoAction() {
final RolloutGroup rolloutGroup = rolloutUIState.getRolloutGroup().isPresent()
? rolloutUIState.getRolloutGroup().get() : null;
if (rolloutGroup != null && rolloutGroup.getStatus() == RolloutGroupStatus.READY) {
return RolloutGroupStatus.READY.toString().toLowerCase();
} else if (rolloutGroup != null && rolloutGroup.getStatus() == RolloutGroupStatus.FINISHED) {
String ds = rolloutUIState.getRolloutDistributionSet().isPresent()
? rolloutUIState.getRolloutDistributionSet().get() : "";
return i18n.get("message.dist.already.assigned", new Object[] { ds });
} else {
return "unknown";
}
}
}

View File

@@ -6,12 +6,13 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.rollout.rolloutgrouptargets;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.repository.model.RolloutGroup;
import org.eclipse.hawkbit.ui.common.grid.AbstractGridHeader;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
@@ -38,7 +39,7 @@ import com.vaadin.ui.themes.ValoTheme;
*/
@SpringComponent
@ViewScope
public class RolloutGroupTargetsListHeader extends AbstractSimpleTableHeader {
public class RolloutGroupTargetsListHeader extends AbstractGridHeader {
private static final long serialVersionUID = 5613986489156507581L;
@Autowired

View File

@@ -6,10 +6,11 @@
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.ui.rollout;
package org.eclipse.hawkbit.ui.rollout.rolloutgrouptargets;
import javax.annotation.PostConstruct;
import org.eclipse.hawkbit.ui.common.grid.AbstractGridLayout;
import org.springframework.beans.factory.annotation.Autowired;
import com.vaadin.spring.annotation.SpringComponent;
@@ -21,7 +22,7 @@ import com.vaadin.ui.Label;
*/
@SpringComponent
@ViewScope
public class RolloutGroupTargetsListView extends AbstractSimpleTableLayout {
public class RolloutGroupTargetsListView extends AbstractGridLayout {
private static final long serialVersionUID = 26089134783467012L;
@@ -29,28 +30,28 @@ public class RolloutGroupTargetsListView extends AbstractSimpleTableLayout {
private RolloutGroupTargetsListHeader rolloutGroupTargetsListHeader;
@Autowired
private RolloutGroupTargetsListTable rolloutGroupTargetsListTable;
private RolloutGroupTargetsCountLabelMessage rolloutGroupTargetsCountLabelMessage;
@Autowired
private RolloutGroupTargetsCountLabelMessage rolloutGroupTargetsCountLabelMessage;
private RolloutGroupTargetsListGrid rolloutListGrid;
/**
* Initialization of Rollout group component.
*/
@PostConstruct
protected void init() {
super.init(rolloutGroupTargetsListHeader, rolloutGroupTargetsListTable);
super.init(rolloutGroupTargetsListHeader, rolloutListGrid);
}
@Override
protected boolean hasCountMessage() {
return true;
}
@Override
protected Label getCountMessageLabel() {
return rolloutGroupTargetsCountLabelMessage;
}

View File

@@ -44,6 +44,8 @@ public class RolloutUIState implements Serializable {
private long rolloutGroupTargetsTotalCount;
private String rolloutDistributionSet;
/**
* @return the searchText
*/
@@ -178,4 +180,20 @@ public class RolloutUIState implements Serializable {
public void setRolloutGroupTargetsTotalCount(final long rolloutGroupTargetsTotalCount) {
this.rolloutGroupTargetsTotalCount = rolloutGroupTargetsTotalCount;
}
/**
* @return rolloutDistributionSet
*/
public Optional<String> getRolloutDistributionSet() {
return rolloutDistributionSet == null ? Optional.empty() : Optional.of(rolloutDistributionSet);
}
/**
*
* @param rolloutDistributionSet
* the distribution set of the rollout
*/
public void setRolloutDistributionSet(String rolloutDistributionSet) {
this.rolloutDistributionSet = rolloutDistributionSet;
}
}

View File

@@ -17,6 +17,7 @@ import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TimeZone;
@@ -33,6 +34,7 @@ import org.eclipse.hawkbit.repository.model.TargetInfo.PollStatus;
import org.eclipse.hawkbit.repository.model.TargetTagAssigmentResult;
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus.Status;
import org.eclipse.hawkbit.ui.management.dstable.DistributionTable;
import org.eclipse.hawkbit.ui.management.targettable.TargetTable;
import org.slf4j.Logger;
@@ -46,6 +48,7 @@ import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer;
import org.vaadin.addons.lazyquerycontainer.LazyQueryDefinition;
import org.vaadin.alump.distributionbar.DistributionBar;
import com.google.common.base.Strings;
import com.vaadin.data.Container;
import com.vaadin.data.Item;
import com.vaadin.server.Sizeable.Unit;
@@ -1348,4 +1351,48 @@ 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;
}
/**
* Returns a formatted string as needed by label custom render .This string
* holds the properties of a status label.
*
* @param value
* label value
* @param style
* label style
* @param id
* label id
* @return
*/
public static String getStatusLabelDetailsInString(String value, String style, String id) {
StringBuilder val = new StringBuilder();
if (!Strings.isNullOrEmpty(value)) {
val.append("value:").append(value).append(",");
}
if (!Strings.isNullOrEmpty(style)) {
val.append("style:").append(style).append(",");
}
val.append("id:").append(id);
return val.toString();
}
}

View File

@@ -738,19 +738,19 @@ public final class SPUIComponetIdProvider {
public static final String ROLLOUT_ADD_ICON_ID = "rollout.add.button.id";
/**
* Rollout list table id.
* Rollout list grid id.
*/
public static final String ROLLOUT_LIST_TABLE_ID = "rollout.table.id";
public static final String ROLLOUT_LIST_GRID_ID = "rollout.grid.id";
/**
* Rollout group list table id.
* Rollout group list grid id.
*/
public static final String ROLLOUT_GROUP_LIST_TABLE_ID = "rollout.group.table.id";
public static final String ROLLOUT_GROUP_LIST_GRID_ID = "rollout.group.grid.id";
/**
* Rollout group list table id.
* Rollout group list grid id.
*/
public static final String ROLLOUT_GROUP_TARGETS_LIST_TABLE_ID = "rollout.group.targets.table.id";
public static final String ROLLOUT_GROUP_TARGETS_LIST_GRID_ID = "rollout.group.targets.grid.id";
/**
* Rollout delete button id.
@@ -827,6 +827,11 @@ public final class SPUIComponetIdProvider {
* Rollout status label id.
*/
public static final String ROLLOUT_STATUS_LABEL_ID = "rollout.status.id";
/**
* Rollout group status label id.
*/
public static final String ROLLOUT_GROUP_STATUS_LABEL_ID = "rollout.group.status.id";
/**
* Rollout % or count option group id.

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

@@ -249,6 +249,51 @@ public final class SPUIStyleDefinitions {
*/
public static final String TARGET_FILTER_SEARCH_PROGRESS_INDICATOR_STYLE = "target-filter-spinner";
/**
* Status icon style - red color.
*/
public static final String STATUS_ICON_RED = "statusIconRed";
/**
* Status icon style - green color.
*/
public static final String STATUS_ICON_GREEN = "statusIconGreen";
/**
* Status icon style - blue color.
*/
public static final String STATUS_ICON_BLUE = "statusIconBlue";
/**
* Status icon spinner style - yellow color.
*/
public static final String STATUS_SPINNER_YELLOW = "yellowSpinner";
/**
* Status icon style - light blue color.
*/
public static final String STATUS_ICON_LIGHT_BLUE = "statusIconLightBlue";
/**
* Status icon spinner style - grey color.
*/
public static final String STATUS_SPINNER_GREY = "greySpinner";
/**
* Status icon spinner style - blue color.
*/
public static final String STATUS_SPINNER_BLUE = "blueSpinner";
/**
* Status icon style - yellow color.
*/
public static final String STATUS_ICON_YELLOW = "statusIconYellow";
/**
* Status pending icon.
*/
public static final String STATUS_ICON_PENDING = "statusIconPending";
/**
* Constructor.
*/

View File

@@ -276,4 +276,10 @@
.links {
padding-left: 22px;
}
.font-icon{
font-family:FontAwesome;
font-style:normal;
font-weight:normal;
}
}

View File

@@ -56,5 +56,26 @@
}
}
.v-grid-cell.centeralign {
text-align: center;
}
.v-grid-cell {
font-size: $v-font-size--small !important;
height: 34px !important;
}
.v-grid-row{
height: 34px !important;
}
.v-grid-cell.frozen{
box-shadow: none !important;
}
.v-grid-cell.frozen + th{
border-left: $v-grid-border-size solid $widget-border-color ;
}
}

View File

@@ -50,15 +50,4 @@
}
&.alump-dbar-tooltip {
background-color: rgba(27, 54, 73, 0.9);
border-radius: 3px;
color: white;
z-index: 100;
padding: 3px;
font-size: 10px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
}
}

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';

View File

@@ -382,6 +382,11 @@
<artifactId>vaadin-push</artifactId>
<version>${vaadin.version}</version>
</dependency>
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-client</artifactId>
<version>${vaadin.version}</version>
</dependency>
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-themes</artifactId>