Merge branch 'master' into fix-set-db-read-uncommited

This commit is contained in:
Kai Zimmermann
2016-04-26 11:00:30 +02:00
89 changed files with 2416 additions and 2860 deletions

View File

@@ -22,7 +22,7 @@ https://hawkbit.eu-gb.mybluemix.net/UI/
# Compile, Run and Getting Started
We are not providing an off the shelf installation ready hawkBit update server. However, we recommend to check out the [Example Application](examples/hawkbit-example-app) for a runtime ready Spring Boot based update server that is empowered by hawkBit.
We are not providing an off the shelf installation ready hawkBit update server. However, we recommend to check out the [Example Application](examples/hawkbit-example-app) for a runtime ready Spring Boot based update server that is empowered by hawkBit. In addition we have [guide](https://github.com/eclipse/hawkbit/wiki/Run-hawkBit) for setting up a complete landscape.
#### Clone and build hawkBit
```

View File

@@ -86,7 +86,10 @@ public class SimulationController {
final String deviceId = name + i;
repository.add(deviceFactory.createSimulatedDevice(deviceId, tenant, protocol, pollDelay, new URL(endpoint),
gatewayToken));
spSenderService.createOrUpdateThing(tenant, deviceId);
if (protocol == Protocol.DMF_AMQP) {
spSenderService.createOrUpdateThing(tenant, deviceId);
}
}
return ResponseEntity.ok("Updated " + amount + " DMF connected targets!");

View File

@@ -11,6 +11,7 @@ package org.eclipse.hawkbit.simulator;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.hawkbit.simulator.AbstractSimulatedDevice.Protocol;
import org.eclipse.hawkbit.simulator.amqp.SpSenderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -52,7 +53,9 @@ public class SimulatorStartup implements ApplicationListener<ContextRefreshedEve
LOGGER.error("Creation of simulated device at startup failed.", e);
}
spSenderService.createOrUpdateThing(autostart.getTenant(), deviceId);
if (autostart.getApi() == Protocol.DMF_AMQP) {
spSenderService.createOrUpdateThing(autostart.getTenant(), deviceId);
}
}
});
}

View File

@@ -166,20 +166,12 @@ public class AmqpMessageHandlerService extends BaseAmqpService {
final LocalArtifact localArtifact = findLocalArtifactByFileResource(fileResource);
if (localArtifact == null) {
LOG.info("target {} requested file resource {} which does not exists to download",
secruityToken.getControllerId(), fileResource);
throw new EntityNotFoundException();
}
// check action for this download purposes, the method will throw an
// EntityNotFoundException in case the controller is not allowed to
// download this file because it's not assigned to an action and not
// assigned to this controller. Otherwise no controllerId is set =
// anonymous download
if (secruityToken.getControllerId() != null) {
final Action action = controllerManagement.getActionForDownloadByTargetAndSoftwareModule(
secruityToken.getControllerId(), localArtifact.getSoftwareModule());
LOG.info("Found action for download authentication request action: {}, resource: {}", action,
secruityToken.getFileResource());
}
checkIfArtifactIsAssignedToTarget(secruityToken, localArtifact);
final Artifact artifact = convertDbArtifact(artifactManagement.loadLocalArtifactBinary(localArtifact));
if (artifact == null) {
@@ -213,6 +205,35 @@ public class AmqpMessageHandlerService extends BaseAmqpService {
return getMessageConverter().toMessage(authentificationResponse, messageProperties);
}
/**
* check action for this download purposes, the method will throw an
* EntityNotFoundException in case the controller is not allowed to download
* this file because it's not assigned to an action and not assigned to this
* controller. Otherwise no controllerId is set = anonymous download
*
* @param secruityToken
* the security token which holds the target ID to check on
* @param localArtifact
* the local artifact to verify if the given target is allowed to
* download this artifact
*/
private void checkIfArtifactIsAssignedToTarget(final TenantSecurityToken secruityToken,
final LocalArtifact localArtifact) {
final String controllerId = secruityToken.getControllerId();
if (controllerId == null) {
LOG.info("anonymous download no authentication check for artifact {}", localArtifact);
return;
}
LOG.debug("no anonymous download request, doing authentication check for target {} and artifact {}",
controllerId, localArtifact);
if (!controllerManagement.hasTargetArtifactAssigned(controllerId, localArtifact)) {
LOG.info("target {} tried to download artifact {} which is not assigned to the target", controllerId,
localArtifact);
throw new EntityNotFoundException();
}
LOG.info("download security check for target {} and artifact {} granted", controllerId, localArtifact);
}
private LocalArtifact findLocalArtifactByFileResource(final FileResource fileResource) {
if (fileResource.getSha1() != null) {
return artifactManagement.findFirstLocalArtifactsBySHA1(fileResource.getSha1());

View File

@@ -313,11 +313,10 @@ public class AmqpMessageHandlerServiceTest {
// mock
final LocalArtifact localArtifactMock = mock(LocalArtifact.class);
final Action actionMock = mock(Action.class);
final DbArtifact dbArtifactMock = mock(DbArtifact.class);
when(artifactManagementMock.findFirstLocalArtifactsBySHA1(anyString())).thenReturn(localArtifactMock);
when(controllerManagementMock.getActionForDownloadByTargetAndSoftwareModule(anyObject(), anyObject()))
.thenReturn(actionMock);
when(controllerManagementMock.hasTargetArtifactAssigned(securityToken.getControllerId(), localArtifactMock))
.thenReturn(true);
when(artifactManagementMock.loadLocalArtifactBinary(localArtifactMock)).thenReturn(dbArtifactMock);
when(dbArtifactMock.getArtifactId()).thenReturn("artifactId");
when(dbArtifactMock.getSize()).thenReturn(1L);

View File

@@ -28,12 +28,14 @@ import org.eclipse.hawkbit.repository.model.Action.Status;
import org.eclipse.hawkbit.repository.model.ActionStatus;
import org.eclipse.hawkbit.repository.model.ActionStatus_;
import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.LocalArtifact;
import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.repository.model.TargetInfo;
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
import org.eclipse.hawkbit.repository.model.Target_;
import org.eclipse.hawkbit.repository.model.TenantConfiguration;
import org.eclipse.hawkbit.repository.specifications.ActionSpecifications;
import org.eclipse.hawkbit.security.HawkbitSecurityProperties;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey;
import org.hibernate.validator.constraints.NotEmpty;
@@ -167,6 +169,31 @@ public class ControllerManagement {
return action.get(0);
}
/**
* Checks if a given target has currently or has even been assigned to the
* given artifact through the action history list. This can e.g. indicate if
* a target is allowed to download a given artifact because it has currently
* assigned or had ever been assigned to the target and so it's visible to a
* specific target e.g. for downloading.
*
* @param targetId
* the ID of the target to check
* @param localArtifact
* the artifact to verify if the given target had even been
* assigned to
* @return {@code true} if the given target has currently or had ever a
* relation to the given artifact through the action history,
* otherwise {@code false}
*/
public boolean hasTargetArtifactAssigned(@NotNull final String targetId,
@NotNull final LocalArtifact localArtifact) {
final Target target = targetRepository.findByControllerId(targetId);
if (target == null) {
return false;
}
return actionRepository.count(ActionSpecifications.hasTargetAssignedArtifact(target, localArtifact)) > 0;
}
/**
* Refreshes the time of the last time the controller has been connected to
* the server.

View File

@@ -0,0 +1,61 @@
/**
* 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.repository.specifications;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.ListJoin;
import javax.persistence.criteria.SetJoin;
import org.eclipse.hawkbit.repository.model.Action;
import org.eclipse.hawkbit.repository.model.Action_;
import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.DistributionSet_;
import org.eclipse.hawkbit.repository.model.LocalArtifact;
import org.eclipse.hawkbit.repository.model.LocalArtifact_;
import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.repository.model.SoftwareModule_;
import org.eclipse.hawkbit.repository.model.Target;
import org.springframework.data.jpa.domain.Specification;
/**
* Utility class for {@link Action}s {@link Specification}s. The class provides
* Spring Data JPQL Specifications.
*
*/
public class ActionSpecifications {
private ActionSpecifications() {
// utility class
}
/**
* Specification which joins all necessary tables to retrieve the dependency
* between a target and a local file assignment through the assigen action
* of the target. All actions are included, not only active actions.
*
* @param target
* the target to verfiy if the given artifact is currently
* assigned or had been assigned
* @param localArtifact
* the local artifact to check wherever the target had ever been
* assigned
* @return a specification to use with spring JPA
*/
public static Specification<Action> hasTargetAssignedArtifact(final Target target,
final LocalArtifact localArtifact) {
return (actionRoot, query, criteriaBuilder) -> {
final Join<Action, DistributionSet> dsJoin = actionRoot.join(Action_.distributionSet);
final SetJoin<DistributionSet, SoftwareModule> modulesJoin = dsJoin.join(DistributionSet_.modules);
final ListJoin<SoftwareModule, LocalArtifact> artifactsJoin = modulesJoin.join(SoftwareModule_.artifacts);
return criteriaBuilder.and(
criteriaBuilder.equal(artifactsJoin.get(LocalArtifact_.filename), localArtifact.getFilename()),
criteriaBuilder.equal(actionRoot.get(Action_.target), target));
};
}
}

34
hawkbit-ui/README.md Normal file
View File

@@ -0,0 +1,34 @@
# hawkBit User Interface
The hawkBit user interface is based on the Vaadin and Vaadin-Spring framework and allows to manage software updates and large scale roll-outs via a user interface.
## Debugging client-side code
### Debug using SuperDevMode
The SuperDevMode can be used to debug client side code without any browser plugin.
#### Using SuperDevMode with chrome :
- Add required maven dependencies
- Add vaadin-client-compiler dependency
- Add jetty dependencies (version : 8.1x)
- Set redirect property in the AppWidgetSet.gwt.xml module descriptor as follows
- < set-configuration-property name="devModeRedirectEnabled" value="true" />
- Create launch configuration for the SuperDevMode
- The main class to execute should be com.google.gwt.dev.codeserver.CodeServer.
- Add fully-qualified class name of widgetset (org.eclipse.hawkbit.ui.AppWidgetSet) as parameter
- Enable debug in chrome
- Chrome inspector window ▸ Click on settings icon ▸ Scripts ▸ Enable source maps option
- Run the SuperDevMode Code Server with the launch configuration created above
- Open http://localhost:8080/UI/?debug .Click on "SuperDev" button in debug console (Alternatively can directly add ?superdevmode parameter to URL)
- Widgetset is compiled and you can see the java code files loaded in 'Chrome inspector window ▸ Source tab'
#### Using SuperDevMode with Eclipse :
- Install the plugin from http://sdbg.github.io/p2
- Start the server and Super Dev Mode as mentioned above
- Create a new launch configuration in Eclipse
- Type is "Launch Chrome"
- http://localhost:8080/UI/?superdevmode
- Launch the new configuration in debug mode
- Now breakpoints in eclipse can be set

View File

@@ -21,6 +21,7 @@ import org.eclipse.hawkbit.eventbus.event.TargetCreatedEvent;
import org.eclipse.hawkbit.eventbus.event.TargetDeletedEvent;
import org.eclipse.hawkbit.eventbus.event.TargetInfoUpdateEvent;
import org.eclipse.hawkbit.eventbus.event.TargetTagCreatedBulkEvent;
import org.eclipse.hawkbit.eventbus.event.TargetTagDeletedEvent;
/**
* The default hawkbit event provider.
@@ -34,6 +35,7 @@ public class HawkbitEventProvider implements UIEventProvider {
SINGLE_EVENTS.add(TargetTagCreatedBulkEvent.class);
SINGLE_EVENTS.add(DistributionSetTagCreatedBulkEvent.class);
SINGLE_EVENTS.add(DistributionSetTagDeletedEvent.class);
SINGLE_EVENTS.add(TargetTagDeletedEvent.class);
SINGLE_EVENTS.add(DistributionSetTagUpdateEvent.class);
SINGLE_EVENTS.add(RolloutGroupChangeEvent.class);
SINGLE_EVENTS.add(RolloutChangeEvent.class);

View File

@@ -15,12 +15,12 @@ import org.eclipse.hawkbit.ui.HawkbitUI;
import org.eclipse.hawkbit.ui.artifacts.details.ArtifactDetailsLayout;
import org.eclipse.hawkbit.ui.artifacts.event.ArtifactDetailsEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType;
import org.eclipse.hawkbit.ui.artifacts.footer.SMDeleteActionsLayout;
import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleTableLayout;
import org.eclipse.hawkbit.ui.artifacts.smtype.SMTypeFilterLayout;
import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState;
import org.eclipse.hawkbit.ui.artifacts.upload.UploadLayout;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.management.event.DragEvent;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
@@ -111,9 +111,9 @@ public class UploadArtifactView extends VerticalLayout implements View, BrowserW
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final SoftwareModuleEvent event) {
if (event.getSoftwareModuleEventType() == SoftwareModuleEventType.MINIMIZED) {
if (BaseEntityEventType.MINIMIZED == event.getEventType()) {
minimizeSwTable();
} else if (event.getSoftwareModuleEventType() == SoftwareModuleEventType.MAXIMIZED) {
} else if (BaseEntityEventType.MAXIMIZED == event.getEventType()) {
maximizeSwTable();
}
}

View File

@@ -24,6 +24,7 @@ import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType;
import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState;
import org.eclipse.hawkbit.ui.common.ConfirmationDialog;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.components.SPUIButton;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
@@ -110,8 +111,6 @@ public class ArtifactDetailsLayout extends VerticalLayout {
private boolean fullWindowMode = false;
private UI ui;
private boolean readOnly = false;
/**
@@ -122,7 +121,6 @@ public class ArtifactDetailsLayout extends VerticalLayout {
createComponents();
buildLayout();
eventBus.subscribe(this);
ui = UI.getCurrent();
if (artifactUploadState.getSelectedBaseSoftwareModule().isPresent()) {
final SoftwareModule selectedSoftwareModule = artifactUploadState.getSelectedBaseSoftwareModule().get();
populateArtifactDetails(selectedSoftwareModule.getId(), HawkbitCommonUtil
@@ -461,23 +459,23 @@ public class ArtifactDetailsLayout extends VerticalLayout {
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final SoftwareModuleEvent softwareModuleEvent) {
if (softwareModuleEvent.getSoftwareModuleEventType() == SoftwareModuleEventType.SELECTED_SOFTWARE_MODULE) {
ui.access(() -> {
if (softwareModuleEvent.getSoftwareModule() != null) {
populateArtifactDetails(softwareModuleEvent.getSoftwareModule().getId(),
HawkbitCommonUtil.getFormattedNameVersion(softwareModuleEvent.getSoftwareModule().getName(),
softwareModuleEvent.getSoftwareModule().getVersion()));
if (BaseEntityEventType.SELECTED_ENTITY == softwareModuleEvent.getEventType()) {
UI.getCurrent().access(() -> {
if (softwareModuleEvent.getEntity() != null) {
populateArtifactDetails(softwareModuleEvent.getEntity().getId(),
HawkbitCommonUtil.getFormattedNameVersion(softwareModuleEvent.getEntity().getName(),
softwareModuleEvent.getEntity().getVersion()));
} else {
populateArtifactDetails(null, null);
}
});
}
if (softwareModuleEvent.getSoftwareModuleEventType() == SoftwareModuleEventType.ARTIFACTS_CHANGED) {
ui.access(() -> {
if (softwareModuleEvent.getSoftwareModule() != null) {
populateArtifactDetails(softwareModuleEvent.getSoftwareModule().getId(),
HawkbitCommonUtil.getFormattedNameVersion(softwareModuleEvent.getSoftwareModule().getName(),
softwareModuleEvent.getSoftwareModule().getVersion()));
UI.getCurrent().access(() -> {
if (softwareModuleEvent.getEntity() != null) {
populateArtifactDetails(softwareModuleEvent.getEntity().getId(),
HawkbitCommonUtil.getFormattedNameVersion(softwareModuleEvent.getEntity().getName(),
softwareModuleEvent.getEntity().getVersion()));
} else {
populateArtifactDetails(null, null);
}

View File

@@ -9,58 +9,53 @@
package org.eclipse.hawkbit.ui.artifacts.event;
import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEvent;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
/**
* Event to represent software add, update or delete.
*
*
*
*/
public class SoftwareModuleEvent {
public class SoftwareModuleEvent extends BaseEntityEvent<SoftwareModule> {
/**
* Software module events in the Upload UI.
*
*
*
*/
public enum SoftwareModuleEventType {
NEW_SOFTWARE_MODULE, UPDATED_SOFTWARE_MODULE, DELETE_SOFTWARE_MODULE, SELECTED_SOFTWARE_MODULE, MAXIMIZED, MINIMIZED, ARTIFACTS_CHANGED, ASSIGN_SOFTWARE_MODULE
ARTIFACTS_CHANGED, ASSIGN_SOFTWARE_MODULE
}
private SoftwareModuleEventType softwareModuleEventType;
private SoftwareModule softwareModule;
/**
* Creates software module event.
*
* @param entityEventType
* the event type
* @param softwareModule
* the module
*/
public SoftwareModuleEvent(final BaseEntityEventType entityEventType, final SoftwareModule softwareModule) {
super(entityEventType, softwareModule);
}
/**
* Creates software module event.
*
* @param softwareModuleEventType
* reference of {@link SoftwareModuleEventType}
* the event type
* @param softwareModule
* reference of {@link SoftwareModule}
* the module
*/
public SoftwareModuleEvent(final SoftwareModuleEventType softwareModuleEventType,
final SoftwareModule softwareModule) {
super();
super(null, softwareModule);
this.softwareModuleEventType = softwareModuleEventType;
this.softwareModule = softwareModule;
}
public SoftwareModuleEventType getSoftwareModuleEventType() {
return softwareModuleEventType;
}
public void setSoftwareModuleEventType(final SoftwareModuleEventType softwareModuleEventType) {
this.softwareModuleEventType = softwareModuleEventType;
}
public SoftwareModule getSoftwareModule() {
return softwareModule;
}
public void setSoftwareModule(final SoftwareModule softwareModule) {
this.softwareModule = softwareModule;
}
}

View File

@@ -8,16 +8,15 @@
*/
package org.eclipse.hawkbit.ui.artifacts.footer;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.hawkbit.ui.artifacts.event.UploadArtifactUIEvent;
import org.eclipse.hawkbit.ui.artifacts.event.UploadViewAcceptCriteria;
import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState;
import org.eclipse.hawkbit.ui.common.footer.AbstractDeleteActionsLayout;
import org.eclipse.hawkbit.ui.common.table.AbstractTable;
import org.eclipse.hawkbit.ui.management.event.DragEvent;
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.spring.events.EventScope;
@@ -28,7 +27,6 @@ import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.ViewScope;
import com.vaadin.ui.Component;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.Table.TableTransferable;
import com.vaadin.ui.UI;
@@ -156,13 +154,9 @@ public class SMDeleteActionsLayout extends AbstractDeleteActionsLayout {
private void addToDeleteList(final Table sourceTable, final TableTransferable transferable) {
@SuppressWarnings("unchecked")
final Set<Long> swModuleSelected = (Set<Long>) sourceTable.getValue();
final Set<Long> swModuleIdNameSet = new HashSet<>();
if (!swModuleSelected.contains(transferable.getData(SPUIDefinitions.ITEMID))) {
swModuleIdNameSet.add((Long) transferable.getData(SPUIDefinitions.ITEMID));
} else {
swModuleIdNameSet.addAll(swModuleSelected);
}
final AbstractTable<?, Long> swTable = (AbstractTable<?, Long>) sourceTable;
final Set<Long> swModuleIdNameSet = swTable.getDeletedEntityByTransferable(transferable);
swModuleIdNameSet.forEach(id -> {
final String swModuleName = (String) sourceTable.getContainerDataSource().getItem(id)
.getItemProperty(SPUILabelDefinitions.NAME_VERSION).getValue();
@@ -191,7 +185,7 @@ public class SMDeleteActionsLayout extends AbstractDeleteActionsLayout {
@Override
protected Component getUnsavedActionsWindowContent() {
uploadViewConfirmationWindowLayout.init();
uploadViewConfirmationWindowLayout.initialize();
return uploadViewConfirmationWindowLayout;
}
@@ -201,33 +195,4 @@ public class SMDeleteActionsLayout extends AbstractDeleteActionsLayout {
|| !artifactUploadState.getSelectedDeleteSWModuleTypes().isEmpty();
}
@Override
protected boolean hasCountMessage() {
return false;
}
@Override
protected Label getCountMessageLabel() {
return null;
}
@Override
protected boolean hasBulkUploadPermission() {
return false;
}
@Override
protected void showBulkUploadWindow() {
/**
* Bulk upload not supported .No implementation required.
*/
}
@Override
protected void restoreBulkUploadStatusCount() {
/**
* Bulk upload not supported .No implementation required.
*/
}
}

View File

@@ -14,23 +14,17 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct;
import org.eclipse.hawkbit.repository.SoftwareManagement;
import org.eclipse.hawkbit.ui.artifacts.event.UploadArtifactUIEvent;
import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState;
import org.eclipse.hawkbit.ui.artifacts.state.CustomFile;
import org.eclipse.hawkbit.ui.common.confirmwindow.layout.AbstractConfirmationWindowLayout;
import org.eclipse.hawkbit.ui.common.confirmwindow.layout.ConfirmationTab;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
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.spring.events.EventBus;
import com.vaadin.data.Container;
import com.vaadin.data.Item;
@@ -39,8 +33,8 @@ import com.vaadin.server.FontAwesome;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.ViewScope;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Table.Align;
import com.vaadin.ui.themes.ValoTheme;
/**
* Abstract layout of confirm actions window.
@@ -62,32 +56,12 @@ public class UploadViewConfirmationWindowLayout extends AbstractConfirmationWind
private static final String DISCARD = "Discard";
@Autowired
private I18N i18n;
@Autowired
private transient SoftwareManagement softwareManagement;
@Autowired
private transient EventBus.SessionEventBus eventBus;
@Autowired
private ArtifactUploadState artifactUploadState;
/**
* Initialze the component.
*/
@PostConstruct
void init() {
super.inittialize();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.hawkbit.server.ui.common.confirmwindow.layout.
* AbstractConfirmationWindowLayout# getConfimrationTabs()
*/
@Override
protected Map<String, ConfirmationTab> getConfimrationTabs() {
final Map<String, ConfirmationTab> tabs = new HashMap<>();
@@ -116,26 +90,13 @@ public class UploadViewConfirmationWindowLayout extends AbstractConfirmationWind
// Add the discard action column
tab.getTable().addGeneratedColumn(SW_DISCARD_CHGS, (source, itemId, columnId) -> {
final Button deleteswIcon = SPUIComponentProvider.getButton("", "", SPUILabelDefinitions.DISCARD,
ValoTheme.BUTTON_TINY + " " + "redicon", true, FontAwesome.REPLY,
SPUIButtonStyleSmallNoBorder.class);
deleteswIcon.setData(itemId);
deleteswIcon.setImmediate(true);
deleteswIcon.addClickListener(event -> discardSoftwareDelete(event, itemId, tab));
return deleteswIcon;
final ClickListener clickListener = event -> discardSoftwareDelete(event, itemId, tab);
return createDiscardButton(itemId, clickListener);
});
// set the visible columns
final List<Object> visibleColumnIds = new ArrayList<>();
final List<String> visibleColumnLabels = new ArrayList<>();
if (visibleColumnIds.isEmpty() && visibleColumnLabels.isEmpty()) {
visibleColumnIds.add(SW_MODULE_NAME_MSG);
visibleColumnIds.add(SW_DISCARD_CHGS);
visibleColumnLabels.add(i18n.get("upload.swModuleTable.header"));
visibleColumnLabels.add(i18n.get("header.second.deletetarget.table"));
}
tab.getTable().setVisibleColumns(visibleColumnIds.toArray());
tab.getTable().setColumnHeaders(visibleColumnLabels.toArray(new String[0]));
tab.getTable().setVisibleColumns(SW_MODULE_NAME_MSG, SW_DISCARD_CHGS);
tab.getTable().setColumnHeaders(i18n.get("upload.swModuleTable.header"),
i18n.get("header.second.deletetarget.table"));
tab.getTable().setColumnExpandRatio(SW_MODULE_NAME_MSG, SPUIDefinitions.TARGET_DISTRIBUTION_COLUMN_WIDTH);
tab.getTable().setColumnExpandRatio(SW_DISCARD_CHGS, SPUIDefinitions.DISCARD_COLUMN_WIDTH);
@@ -233,30 +194,14 @@ public class UploadViewConfirmationWindowLayout extends AbstractConfirmationWind
// Add the discard action column
tab.getTable().addGeneratedColumn(DISCARD, (source, itemId, columnId) -> {
final StringBuilder style = new StringBuilder(ValoTheme.BUTTON_TINY);
style.append(' ');
style.append("redicon");
final Button deleteIcon = SPUIComponentProvider.getButton("", "", SPUILabelDefinitions.DISCARD,
style.toString(), true, FontAwesome.REPLY, SPUIButtonStyleSmallNoBorder.class);
deleteIcon.setData(itemId);
deleteIcon.setImmediate(true);
deleteIcon.addClickListener(event -> discardSoftwareTypeDelete(
(String) ((Button) event.getComponent()).getData(), itemId, tab));
return deleteIcon;
final ClickListener clickListener = event -> discardSoftwareTypeDelete(
(String) ((Button) event.getComponent()).getData(), itemId, tab);
return createDiscardButton(itemId, clickListener);
});
// set the visible columns
final List<Object> visibleColumnIds = new ArrayList<>();
final List<String> visibleColumnLabels = new ArrayList<>();
if (visibleColumnIds.isEmpty() && visibleColumnLabels.isEmpty()) {
visibleColumnIds.add(SW_MODULE_TYPE_NAME);
visibleColumnIds.add(DISCARD);
visibleColumnLabels.add(i18n.get("header.first.delete.swmodule.type.table"));
visibleColumnLabels.add(i18n.get("header.second.delete.swmodule.type.table"));
}
tab.getTable().setVisibleColumns(visibleColumnIds.toArray());
tab.getTable().setColumnHeaders(visibleColumnLabels.toArray(new String[0]));
tab.getTable().setVisibleColumns(SW_MODULE_TYPE_NAME, DISCARD);
tab.getTable().setColumnHeaders(i18n.get("header.first.delete.swmodule.type.table"),
i18n.get("header.second.delete.swmodule.type.table"));
tab.getTable().setColumnExpandRatio(SW_MODULE_TYPE_NAME, 2);
tab.getTable().setColumnExpandRatio(SW_DISCARD_CHGS, SPUIDefinitions.DISCARD_COLUMN_WIDTH);
@@ -264,9 +209,6 @@ public class UploadViewConfirmationWindowLayout extends AbstractConfirmationWind
return tab;
}
/**
* @return
*/
private Container getSWModuleTypeTableContainer() {
final IndexedContainer contactContainer = new IndexedContainer();
contactContainer.addContainerProperty(SW_MODULE_TYPE_NAME, String.class, "");

View File

@@ -13,8 +13,8 @@ import java.io.Serializable;
import org.eclipse.hawkbit.repository.SoftwareManagement;
import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType;
import org.eclipse.hawkbit.ui.common.SoftwareModuleTypeBeanQuery;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
@@ -282,8 +282,8 @@ public class SoftwareModuleAddUpdateWindow implements Serializable {
/* display success message */
uiNotifcation.displaySuccess(i18n.get("message.save.success", new Object[] {
newBaseSoftwareModule.getName() + ":" + newBaseSoftwareModule.getVersion() }));
eventBus.publish(this, new SoftwareModuleEvent(SoftwareModuleEventType.NEW_SOFTWARE_MODULE,
newBaseSoftwareModule));
eventBus.publish(this,
new SoftwareModuleEvent(BaseEntityEventType.NEW_ENTITY, newBaseSoftwareModule));
}
// close the window
closeThisWindow();
@@ -302,8 +302,7 @@ public class SoftwareModuleAddUpdateWindow implements Serializable {
uiNotifcation.displaySuccess(i18n.get("message.save.success",
new Object[] { newSWModule.getName() + ":" + newSWModule.getVersion() }));
eventBus.publish(this,
new SoftwareModuleEvent(SoftwareModuleEventType.UPDATED_SOFTWARE_MODULE, newSWModule));
eventBus.publish(this, new SoftwareModuleEvent(BaseEntityEventType.UPDATED_ENTITY, newSWModule));
}
closeThisWindow();
}

View File

@@ -10,9 +10,8 @@ package org.eclipse.hawkbit.ui.artifacts.smtable;
import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType;
import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState;
import org.eclipse.hawkbit.ui.common.detailslayout.AbstractTableDetailsLayout;
import org.eclipse.hawkbit.ui.common.detailslayout.AbstractNamedVersionedEntityTableDetailsLayout;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
@@ -36,7 +35,7 @@ import com.vaadin.ui.Window;
*/
@SpringComponent
@ViewScope
public class SoftwareModuleDetails extends AbstractTableDetailsLayout {
public class SoftwareModuleDetails extends AbstractNamedVersionedEntityTableDetailsLayout<SoftwareModule> {
private static final long serialVersionUID = -4900381301076646366L;
@@ -46,10 +45,6 @@ public class SoftwareModuleDetails extends AbstractTableDetailsLayout {
@Autowired
private ArtifactUploadState artifactUploadState;
private Long swModuleId;
private SoftwareModule selectedSwModule;
@Override
protected String getEditButtonId() {
return SPUIComponetIdProvider.UPLOAD_SW_MODULE_EDIT_BUTTON;
@@ -57,28 +52,31 @@ public class SoftwareModuleDetails extends AbstractTableDetailsLayout {
@Override
protected void addTabs(final TabSheet detailsTab) {
detailsTab.addTab(createDetailsLayout(), i18n.get("caption.tab.details"), null);
detailsTab.addTab(createDescriptionLayout(), i18n.get("caption.tab.description"), null);
detailsTab.addTab(createLogLayout(), i18n.get("caption.logs.tab"), null);
detailsTab.addTab(createDetailsLayout(), getI18n().get("caption.tab.details"), null);
detailsTab.addTab(createDescriptionLayout(), getI18n().get("caption.tab.description"), null);
detailsTab.addTab(createLogLayout(), getI18n().get("caption.logs.tab"), null);
}
@Override
protected void onEdit(final ClickEvent event) {
final Window addSoftwareModule = softwareModuleAddUpdateWindow.createUpdateSoftwareModuleWindow(swModuleId);
addSoftwareModule.setCaption(i18n.get("upload.caption.update.swmodule"));
final Window addSoftwareModule = softwareModuleAddUpdateWindow
.createUpdateSoftwareModuleWindow(getSelectedBaseEntityId());
addSoftwareModule.setCaption(getI18n().get("upload.caption.update.swmodule"));
UI.getCurrent().addWindow(addSoftwareModule);
addSoftwareModule.setVisible(Boolean.TRUE);
}
private void populateDetails(final SoftwareModule swModule) {
@Override
protected void populateDetailsWidget() {
String maxAssign = HawkbitCommonUtil.SP_STRING_EMPTY;
if (swModule != null) {
if (swModule.getType().getMaxAssignments() == Integer.MAX_VALUE) {
maxAssign = i18n.get("label.multiAssign.type");
if (getSelectedBaseEntity() != null) {
if (getSelectedBaseEntity().getType().getMaxAssignments() == Integer.MAX_VALUE) {
maxAssign = getI18n().get("label.multiAssign.type");
} else {
maxAssign = i18n.get("label.singleAssign.type");
maxAssign = getI18n().get("label.singleAssign.type");
}
updateSoftwareModuleDetailsLayout(swModule.getType().getName(), swModule.getVendor(), maxAssign);
updateSoftwareModuleDetailsLayout(getSelectedBaseEntity().getType().getName(),
getSelectedBaseEntity().getVendor(), maxAssign);
} else {
updateSoftwareModuleDetailsLayout(HawkbitCommonUtil.SP_STRING_EMPTY, HawkbitCommonUtil.SP_STRING_EMPTY,
maxAssign);
@@ -90,67 +88,28 @@ public class SoftwareModuleDetails extends AbstractTableDetailsLayout {
detailsTabLayout.removeAllComponents();
final Label vendorLabel = SPUIComponentProvider.createNameValueLabel(i18n.get("label.dist.details.vendor"),
final Label vendorLabel = SPUIComponentProvider.createNameValueLabel(getI18n().get("label.dist.details.vendor"),
HawkbitCommonUtil.trimAndNullIfEmpty(vendor) == null ? "" : vendor);
vendorLabel.setId(SPUIComponetIdProvider.DETAILS_VENDOR_LABEL_ID);
detailsTabLayout.addComponent(vendorLabel);
if (type != null) {
final Label typeLabel = SPUIComponentProvider.createNameValueLabel(i18n.get("label.dist.details.type"),
final Label typeLabel = SPUIComponentProvider.createNameValueLabel(getI18n().get("label.dist.details.type"),
type);
typeLabel.setId(SPUIComponetIdProvider.DETAILS_TYPE_LABEL_ID);
detailsTabLayout.addComponent(typeLabel);
}
final Label assignLabel = SPUIComponentProvider.createNameValueLabel(i18n.get("label.assigned.type"),
final Label assignLabel = SPUIComponentProvider.createNameValueLabel(getI18n().get("label.assigned.type"),
HawkbitCommonUtil.trimAndNullIfEmpty(maxAssign) == null ? "" : maxAssign);
assignLabel.setId(SPUIComponetIdProvider.SWM_DTLS_MAX_ASSIGN);
detailsTabLayout.addComponent(assignLabel);
}
private void populateLog(final SoftwareModule softwareModule) {
if (null != softwareModule) {
updateLogLayout(getLogLayout(), softwareModule.getLastModifiedAt(), softwareModule.getLastModifiedBy(),
softwareModule.getCreatedAt(), softwareModule.getCreatedBy(), i18n);
} else {
updateLogLayout(getLogLayout(), null, HawkbitCommonUtil.SP_STRING_EMPTY, null, null, i18n);
}
}
public void setSwModuleId(final Long swModuleId) {
this.swModuleId = swModuleId;
}
private void populateDetailsWidget(final SoftwareModule swModule) {
if (swModule != null) {
setSwModuleId(swModule.getId());
setName(getDefaultCaption(),
HawkbitCommonUtil.getFormattedNameVersion(swModule.getName(), swModule.getVersion()));
populateDetails(swModule);
populateDescription(swModule);
populateLog(swModule);
} else {
setSwModuleId(null);
setName(getDefaultCaption(), HawkbitCommonUtil.SP_STRING_EMPTY);
populateDetails(null);
populateDescription(null);
populateLog(null);
}
}
private void populateDescription(final SoftwareModule swModule) {
if (swModule != null) {
updateDescriptionLayout(i18n.get("label.description"), swModule.getDescription());
} else {
updateDescriptionLayout(i18n.get("label.description"), null);
}
}
@Override
protected String getDefaultCaption() {
return i18n.get("upload.swModuleTable.header");
return getI18n().get("upload.swModuleTable.header");
}
@Override
@@ -158,53 +117,21 @@ public class SoftwareModuleDetails extends AbstractTableDetailsLayout {
return artifactUploadState.getSelectedBaseSoftwareModule().isPresent();
}
@Override
protected Boolean onLoadIsTableMaximized() {
return artifactUploadState.isSwModuleTableMaximized();
}
@Override
protected void populateDetailsWidget() {
populateDetailsWidget(selectedSwModule);
}
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final SoftwareModuleEvent softwareModuleEvent) {
if (softwareModuleEvent.getSoftwareModuleEventType() == SoftwareModuleEventType.SELECTED_SOFTWARE_MODULE
|| softwareModuleEvent
.getSoftwareModuleEventType() == SoftwareModuleEventType.UPDATED_SOFTWARE_MODULE) {
ui.access(() -> {
/**
* softwareModuleEvent.getSoftwareModule() is null when table
* has no data.
*/
if (softwareModuleEvent.getSoftwareModule() != null) {
selectedSwModule = softwareModuleEvent.getSoftwareModule();
populateData(true);
} else {
populateData(false);
}
});
} else if (softwareModuleEvent.getSoftwareModuleEventType() == SoftwareModuleEventType.MINIMIZED) {
showLayout();
} else if (softwareModuleEvent.getSoftwareModuleEventType() == SoftwareModuleEventType.MAXIMIZED) {
hideLayout();
}
}
@Override
protected void clearDetails() {
populateDetailsWidget(null);
onBaseEntityEvent(softwareModuleEvent);
}
@Override
protected Boolean hasEditPermission() {
return permissionChecker.hasUpdateDistributionPermission();
return getPermissionChecker().hasUpdateDistributionPermission();
}
@Override
protected String getTabSheetId() {
return null;

View File

@@ -8,29 +8,20 @@
*/
package org.eclipse.hawkbit.ui.artifacts.smtable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.repository.SoftwareManagement;
import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.ui.artifacts.event.SMFilterEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType;
import org.eclipse.hawkbit.ui.artifacts.event.UploadArtifactUIEvent;
import org.eclipse.hawkbit.ui.artifacts.event.UploadViewAcceptCriteria;
import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState;
import org.eclipse.hawkbit.ui.common.table.AbstractTable;
import org.eclipse.hawkbit.ui.common.table.AbstractNamedVersionTable;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
@@ -39,7 +30,6 @@ 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;
@@ -58,45 +48,19 @@ import com.vaadin.ui.UI;
*/
@SpringComponent
@ViewScope
public class SoftwareModuleTable extends AbstractTable {
public class SoftwareModuleTable extends AbstractNamedVersionTable<SoftwareModule, Long> {
private static final long serialVersionUID = 6469417305487144809L;
@Autowired
private I18N i18n;
@Autowired
private ArtifactUploadState artifactUploadState;
@Autowired
private transient EventBus.SessionEventBus eventBus;
@Autowired
private transient SoftwareManagement softwareManagement;
@Autowired
private UploadViewAcceptCriteria uploadViewAcceptCriteria;
/**
* Initialize the filter layout.
*/
@Override
@PostConstruct
protected void init() {
super.init();
eventBus.subscribe(this);
setNoDataAvailable();
}
@PreDestroy
void destroy() {
/*
* It's good manners to do this, even though vaadin-spring will
* automatically unsubscribe when this UI is garbage collected.
*/
eventBus.unsubscribe(this);
}
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final SMFilterEvent filterEvent) {
UI.getCurrent().access(() -> {
@@ -150,74 +114,40 @@ public class SoftwareModuleTable extends AbstractTable {
lqc.addContainerProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE, String.class, null, false, true);
}
@Override
protected void addCustomGeneratedColumns() {
/* No generated columns */
}
@Override
protected boolean isFirstRowSelectedOnLoad() {
return artifactUploadState.getSelectedSoftwareModules().isEmpty();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.hawkbit.server.ui.common.table.SPTable#getItemIdToSelect()
*/
@Override
protected Object getItemIdToSelect() {
return artifactUploadState.getSelectedSoftwareModules();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.hawkbit.server.ui.common.table.SPTable#isMaximized()
*/
@Override
protected boolean isMaximized() {
return artifactUploadState.isSwModuleTableMaximized();
}
@SuppressWarnings("rawtypes")
@Override
protected void onValueChange() {
eventBus.publish(this, UploadArtifactUIEvent.HIDE_DROP_HINTS);
@SuppressWarnings("unchecked")
final Set<Long> values = (Set) getValue();
if (values != null && !values.isEmpty()) {
final Iterator<Long> iterator = values.iterator();
Long value = null;
while (iterator.hasNext()) {
value = iterator.next();
}
if (null != value) {
artifactUploadState.setSelectedBaseSwModuleId(value);
final SoftwareModule baseSoftwareModule = softwareManagement.findSoftwareModuleById(value);
artifactUploadState.setSelectedBaseSoftwareModule(baseSoftwareModule);
artifactUploadState.setSelectedSoftwareModules(values);
eventBus.publish(this,
new SoftwareModuleEvent(SoftwareModuleEventType.SELECTED_SOFTWARE_MODULE, baseSoftwareModule));
}
} else {
artifactUploadState.setSelectedBaseSwModuleId(null);
artifactUploadState.setSelectedBaseSoftwareModule(null);
artifactUploadState.setSelectedSoftwareModules(Collections.emptySet());
eventBus.publish(this, new SoftwareModuleEvent(SoftwareModuleEventType.SELECTED_SOFTWARE_MODULE, null));
}
protected SoftwareModule findEntityByTableValue(final Long entityTableId) {
return softwareManagement.findSoftwareModuleById(entityTableId);
}
@Override
protected ArtifactUploadState getManagmentEntityState() {
return artifactUploadState;
}
@Override
protected void publishEntityAfterValueChange(final SoftwareModule lastSoftwareModule) {
artifactUploadState.setSelectedBaseSoftwareModule(lastSoftwareModule);
eventBus.publish(this, new SoftwareModuleEvent(BaseEntityEventType.SELECTED_ENTITY, lastSoftwareModule));
}
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final SoftwareModuleEvent event) {
if (event.getSoftwareModuleEventType() == SoftwareModuleEventType.MINIMIZED) {
UI.getCurrent().access(() -> applyMinTableSettings());
} else if (event.getSoftwareModuleEventType() == SoftwareModuleEventType.MAXIMIZED) {
UI.getCurrent().access(() -> applyMaxTableSettings());
} else if (event.getSoftwareModuleEventType() == SoftwareModuleEventType.NEW_SOFTWARE_MODULE) {
UI.getCurrent().access(() -> addSoftwareModule(event.getSoftwareModule()));
}
onBaseEntityEvent(event);
}
@EventBusListenerMethod(scope = EventScope.SESSION)
@@ -227,55 +157,35 @@ public class SoftwareModuleTable extends AbstractTable {
}
}
/**
* Add new software module to table.
*
* @param swModule
* new software module
*/
@SuppressWarnings("unchecked")
private void addSoftwareModule(final SoftwareModule swModule) {
final Object addItem = addItem();
final Item item = getItem(addItem);
final String swNameVersion = HawkbitCommonUtil.concatStrings(":", swModule.getName(), swModule.getVersion());
item.getItemProperty(SPUILabelDefinitions.NAME_VERSION).setValue(swNameVersion);
item.getItemProperty("swId").setValue(swModule.getId());
item.getItemProperty(SPUILabelDefinitions.VAR_ID).setValue(swModule.getId());
item.getItemProperty(SPUILabelDefinitions.VAR_DESC).setValue(swModule.getDescription());
item.getItemProperty(SPUILabelDefinitions.VAR_VERSION).setValue(swModule.getVersion());
item.getItemProperty(SPUILabelDefinitions.VAR_NAME).setValue(swModule.getName());
item.getItemProperty(SPUILabelDefinitions.VAR_VENDOR).setValue(swModule.getVendor());
item.getItemProperty(SPUILabelDefinitions.VAR_CREATED_BY).setValue(swModule.getCreatedBy());
item.getItemProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY).setValue(swModule.getLastModifiedBy());
item.getItemProperty(SPUILabelDefinitions.VAR_CREATED_DATE)
.setValue(SPDateTimeUtil.getFormattedDate(swModule.getCreatedAt()));
item.getItemProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE)
.setValue(SPDateTimeUtil.getFormattedDate(swModule.getLastModifiedAt()));
@Override
protected Item addEntity(final SoftwareModule baseEntity) {
final Item item = super.addEntity(baseEntity);
if (!artifactUploadState.getSelectedSoftwareModules().isEmpty()) {
artifactUploadState.getSelectedSoftwareModules().stream().forEach(swmNameId -> unselect(swmNameId));
artifactUploadState.getSelectedSoftwareModules().stream().forEach(this::unselect);
}
select(swModule.getId());
select(baseEntity.getId());
return item;
}
@SuppressWarnings("unchecked")
@Override
protected void updateEntity(final SoftwareModule baseEntity, final Item item) {
final String swNameVersion = HawkbitCommonUtil.concatStrings(":", baseEntity.getName(),
baseEntity.getVersion());
item.getItemProperty(SPUILabelDefinitions.NAME_VERSION).setValue(swNameVersion);
item.getItemProperty("swId").setValue(baseEntity.getId());
item.getItemProperty(SPUILabelDefinitions.VAR_VENDOR).setValue(baseEntity.getVendor());
super.updateEntity(baseEntity, item);
}
@Override
protected List<TableColumn> getTableVisibleColumns() {
final List<TableColumn> columnList = new ArrayList<>();
if (isMaximized()) {
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_NAME, i18n.get("header.name"), 0.2F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_VERSION, i18n.get("header.version"), 0.1F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_VENDOR, i18n.get("header.vendor"), 0.1F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_BY, i18n.get("header.createdBy"), 0.1F));
columnList
.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_DATE, i18n.get("header.createdDate"), 0.1F));
columnList.add(
new TableColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY, i18n.get("header.modifiedBy"), 0.1F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE, i18n.get("header.modifiedDate"),
0.1F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_DESC, i18n.get("header.description"), 0.2F));
} else {
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_NAME, i18n.get("header.name"), 0.8F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_VERSION, i18n.get("header.version"), 0.2F));
final List<TableColumn> columnList = super.getTableVisibleColumns();
if (!isMaximized()) {
return columnList;
}
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_VENDOR, i18n.get("header.vendor"), 0.1F));
return columnList;
}
@@ -297,12 +207,8 @@ public class SoftwareModuleTable extends AbstractTable {
};
}
private void setNoDataAvailable() {
final int containerSize = getContainerDataSource().size();
if (containerSize == 0) {
artifactUploadState.setNoDataAvilableSoftwareModule(true);
} else {
artifactUploadState.setNoDataAvilableSoftwareModule(false);
}
@Override
protected void setDataAvailable(final boolean available) {
artifactUploadState.setNoDataAvilableSoftwareModule(!available);
}
}

View File

@@ -10,10 +10,10 @@ package org.eclipse.hawkbit.ui.artifacts.smtable;
import org.eclipse.hawkbit.ui.artifacts.event.SMFilterEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType;
import org.eclipse.hawkbit.ui.artifacts.event.UploadArtifactUIEvent;
import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState;
import org.eclipse.hawkbit.ui.common.table.AbstractTableHeader;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.vaadin.spring.events.EventScope;
@@ -51,7 +51,6 @@ public class SoftwareModuleTableHeader extends AbstractTableHeader {
}
}
@Override
protected String getHeaderCaption() {
return i18n.get("upload.swModuleTable.header");
@@ -131,14 +130,14 @@ public class SoftwareModuleTableHeader extends AbstractTableHeader {
@Override
public void maximizeTable() {
artifactUploadState.setSwModuleTableMaximized(Boolean.TRUE);
eventbus.publish(this, new SoftwareModuleEvent(SoftwareModuleEventType.MAXIMIZED, null));
eventbus.publish(this, new SoftwareModuleEvent(BaseEntityEventType.MAXIMIZED, null));
}
@Override
public void minimizeTable() {
artifactUploadState.setSwModuleTableMaximized(Boolean.FALSE);
eventbus.publish(this, new SoftwareModuleEvent(SoftwareModuleEventType.MINIMIZED, null));
eventbus.publish(this, new SoftwareModuleEvent(BaseEntityEventType.MINIMIZED, null));
}
@Override

View File

@@ -17,6 +17,7 @@ import java.util.Optional;
import java.util.Set;
import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.ui.common.ManagmentEntityState;
import org.springframework.beans.factory.annotation.Autowired;
import com.vaadin.spring.annotation.SpringComponent;
@@ -29,7 +30,7 @@ import com.vaadin.spring.annotation.VaadinSessionScope;
*/
@VaadinSessionScope
@SpringComponent
public class ArtifactUploadState implements Serializable {
public class ArtifactUploadState implements ManagmentEntityState<Long>, Serializable {
private static final long serialVersionUID = 8273440375917450859L;
@@ -85,30 +86,7 @@ public class ArtifactUploadState implements Serializable {
* @return the selectedBaseSwModuleId
*/
public Optional<Long> getSelectedBaseSwModuleId() {
return selectedBaseSwModuleId != null ? Optional.of(selectedBaseSwModuleId) : Optional.empty();
}
/**
* @param selectedBaseSwModuleId
* the selectedBaseSwModuleId to set
*/
public void setSelectedBaseSwModuleId(final Long selectedBaseSwModuleId) {
this.selectedBaseSwModuleId = selectedBaseSwModuleId;
}
/**
* @return the selectedBaseSoftwareModule
*/
public Optional<SoftwareModule> getSelectedBaseSoftwareModule() {
return selectedBaseSoftwareModule == null ? Optional.empty() : Optional.of(selectedBaseSoftwareModule);
}
/**
* @param selectedBaseSoftwareModule
* the selectedBaseSoftwareModule to set
*/
public void setSelectedBaseSoftwareModule(final SoftwareModule selectedBaseSoftwareModule) {
this.selectedBaseSoftwareModule = selectedBaseSoftwareModule;
return Optional.ofNullable(selectedBaseSwModuleId);
}
/**
@@ -125,12 +103,15 @@ public class ArtifactUploadState implements Serializable {
return selectedSoftwareModules;
}
/**
* @param selectedSoftwareModules
* the selectedSoftwareModules to set
*/
public void setSelectedSoftwareModules(final Set<Long> selectedSoftwareModules) {
this.selectedSoftwareModules = selectedSoftwareModules;
@Override
public void setLastSelectedEntity(final Long value) {
this.selectedBaseSwModuleId = value;
}
@Override
public void setSelectedEnitities(final Set<Long> values) {
this.selectedSoftwareModules = values;
}
/**
@@ -197,4 +178,11 @@ public class ArtifactUploadState implements Serializable {
this.noDataAvilableSoftwareModule = noDataAvilableSoftwareModule;
}
public Optional<SoftwareModule> getSelectedBaseSoftwareModule() {
return Optional.ofNullable(selectedBaseSoftwareModule);
}
public void setSelectedBaseSoftwareModule(final SoftwareModule selectedBaseSoftwareModule) {
this.selectedBaseSoftwareModule = selectedBaseSoftwareModule;
}
}

View File

@@ -0,0 +1,35 @@
/**
* 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;
import java.util.Set;
/**
* Interface for all entity states UI to show the details to a entity.
*/
public interface ManagmentEntityState<T> {
/**
* The selected entities for the detail.
*
* @param values
* the selected entities.
*
*/
void setSelectedEnitities(Set<T> values);
/**
* The last selected value.
*
* @param value
* the value
*/
void setLastSelectedEntity(T value);
}

View File

@@ -11,21 +11,29 @@ package org.eclipse.hawkbit.ui.common.confirmwindow.layout;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
import javax.annotation.PostConstruct;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
import org.springframework.beans.factory.annotation.Autowired;
import org.vaadin.spring.events.EventBus;
import com.vaadin.server.FontAwesome;
import com.vaadin.ui.Accordion;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Label;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.ValoTheme;
/**
* Abstract layout of confirm actions window.
*
*
*
*
*/
public abstract class AbstractConfirmationWindowLayout extends VerticalLayout {
@@ -37,33 +45,25 @@ public abstract class AbstractConfirmationWindowLayout extends VerticalLayout {
private String consolidatedMessage;
protected void inittialize() {
// Remove all components
@Autowired
protected I18N i18n;
@Autowired
protected transient EventBus.SessionEventBus eventBus;
@PostConstruct
public void initialize() {
removeAllComponents();
consolidatedMessage = "";
// create components again
createComponents();
// Build layout.
buildLayout();
}
/**
* Create accordion and add respective tabs.
*/
private void createComponents() {
// create accordion
createAccordian();
// create action message label
createActionMessgaeLabel();
}
/**
* Create a message label to show the results of any actions which user does
* in the confirmation window.
*/
private void createActionMessgaeLabel() {
actionMessage = SPUIComponentProvider.getLabel("", null);
actionMessage.addStyleName(SPUIStyleDefinitions.CONFIRM_WINDOW_INFO_BOX);
@@ -138,4 +138,14 @@ public abstract class AbstractConfirmationWindowLayout extends VerticalLayout {
public String getConsolidatedMessage() {
return consolidatedMessage;
}
protected Button createDiscardButton(final Object itemId, final ClickListener clickListener) {
final Button deletesDsIcon = SPUIComponentProvider.getButton("", "", SPUILabelDefinitions.DISCARD,
ValoTheme.BUTTON_TINY + " " + SPUIStyleDefinitions.REDICON, true, FontAwesome.REPLY,
SPUIButtonStyleSmallNoBorder.class);
deletesDsIcon.setData(itemId);
deletesDsIcon.setImmediate(true);
deletesDsIcon.addClickListener(clickListener);
return deletesDsIcon;
}
}

View File

@@ -0,0 +1,28 @@
/**
* 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.detailslayout;
import org.eclipse.hawkbit.repository.model.NamedVersionedEntity;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
/**
*
*
*/
public abstract class AbstractNamedVersionedEntityTableDetailsLayout<T extends NamedVersionedEntity>
extends AbstractTableDetailsLayout<T> {
private static final long serialVersionUID = 1L;
@Override
protected String getName() {
return HawkbitCommonUtil.getFormattedNameVersion(getSelectedBaseEntity().getName(),
getSelectedBaseEntity().getVersion());
}
}

View File

@@ -13,8 +13,12 @@ import java.util.Map;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.hawkbit.repository.SpPermissionChecker;
import org.eclipse.hawkbit.repository.model.NamedEntity;
import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEvent;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
@@ -37,23 +41,23 @@ import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
/**
*
* Abstract Layout to show the entity details.
*
*/
public abstract class AbstractTableDetailsLayout extends VerticalLayout {
public abstract class AbstractTableDetailsLayout<T extends NamedEntity> extends VerticalLayout {
private static final long serialVersionUID = 4862529368471627190L;
@Autowired
protected I18N i18n;
private I18N i18n;
@Autowired
protected transient EventBus.SessionEventBus eventBus;
private transient EventBus.SessionEventBus eventBus;
@Autowired
protected SpPermissionChecker permissionChecker;
private SpPermissionChecker permissionChecker;
protected UI ui;
private T selectedBaseEntity;
private Label caption;
@@ -74,13 +78,8 @@ public abstract class AbstractTableDetailsLayout extends VerticalLayout {
*/
@PostConstruct
protected void init() {
ui = UI.getCurrent();
createComponents();
buildLayout();
/**
* On load of UI/Refresh details will be loaded based on the row
* selected in table.
*/
restoreState();
eventBus.subscribe(this);
}
@@ -90,10 +89,44 @@ public abstract class AbstractTableDetailsLayout extends VerticalLayout {
eventBus.unsubscribe(this);
}
protected SpPermissionChecker getPermissionChecker() {
return permissionChecker;
}
protected EventBus.SessionEventBus getEventBus() {
return eventBus;
}
protected I18N getI18n() {
return i18n;
}
protected T getSelectedBaseEntity() {
return selectedBaseEntity;
}
public void setSelectedBaseEntity(final T selectedBaseEntity) {
this.selectedBaseEntity = selectedBaseEntity;
}
/**
* Default implementation to handle an entity event.
*
* @param baseEntityEvent
* the event
*/
protected void onBaseEntityEvent(final BaseEntityEvent<T> baseEntityEvent) {
final BaseEntityEventType eventType = baseEntityEvent.getEventType();
if (BaseEntityEventType.SELECTED_ENTITY == eventType || BaseEntityEventType.UPDATED_ENTITY == eventType) {
UI.getCurrent().access(() -> populateData(baseEntityEvent.getEntity()));
} else if (BaseEntityEventType.MINIMIZED == eventType) {
UI.getCurrent().access(() -> setVisible(true));
} else if (BaseEntityEventType.MAXIMIZED == eventType) {
UI.getCurrent().access(() -> setVisible(false));
}
}
private void createComponents() {
/**
* Default caption is set.Reset on selecting table row.
*/
caption = createHeaderCaption();
caption.setImmediate(true);
caption.setContentMode(ContentMode.HTML);
@@ -102,7 +135,7 @@ public abstract class AbstractTableDetailsLayout extends VerticalLayout {
editButton = SPUIComponentProvider.getButton("", "", "", null, false, FontAwesome.PENCIL_SQUARE_O,
SPUIButtonStyleSmallNoBorder.class);
editButton.setId(getEditButtonId());
editButton.addClickListener(event -> onEdit(event));
editButton.addClickListener(this::onEdit);
editButton.setEnabled(false);
@@ -116,7 +149,6 @@ public abstract class AbstractTableDetailsLayout extends VerticalLayout {
}
private void buildLayout() {
final HorizontalLayout nameEditLayout = new HorizontalLayout();
nameEditLayout.setWidth(100.0f, Unit.PERCENTAGE);
nameEditLayout.addComponent(caption);
@@ -156,44 +188,29 @@ public abstract class AbstractTableDetailsLayout extends VerticalLayout {
private void restoreState() {
if (onLoadIsTableRowSelected()) {
populateData(true);
populateData(null);
editButton.setEnabled(true);
}
if (onLoadIsTableMaximized()) {
/**
* If table is maximized hide details layout.
*/
hideLayout();
setVisible(false);
}
}
protected void showLayout() {
setVisible(true);
}
protected void hideLayout() {
setVisible(false);
}
/**
* If no data in table (i,e no row selected),then disable the edit button.
* If row is selected ,enable edit button.
*/
protected void populateData(final Boolean isRowSelected) {
if (isRowSelected) {
populateDetailsWidget();
enableEditButton();
private void populateData(final T selectedBaseEntity) {
this.selectedBaseEntity = selectedBaseEntity;
editButton.setEnabled(selectedBaseEntity != null);
if (selectedBaseEntity == null) {
setName(getDefaultCaption(), StringUtils.EMPTY);
} else {
disableEditButton();
clearDetails();
setName(getDefaultCaption(), getName());
}
}
protected void enableEditButton() {
editButton.setEnabled(true);
}
protected void disableEditButton() {
editButton.setEnabled(false);
populateLog();
populateDescription();
populateDetailsWidget();
}
protected void updateLogLayout(final VerticalLayout changeLogLayout, final Long lastModifiedAt,
@@ -297,13 +314,6 @@ public abstract class AbstractTableDetailsLayout extends VerticalLayout {
protected abstract String getTabSheetId();
/**
* Populate details layout.
*/
protected abstract void populateDetailsWidget();
protected abstract void clearDetails();
protected abstract Boolean hasEditPermission();
public VerticalLayout getDetailsLayout() {
@@ -314,6 +324,31 @@ public abstract class AbstractTableDetailsLayout extends VerticalLayout {
return logLayout;
}
private void populateLog() {
if (selectedBaseEntity == null) {
updateLogLayout(getLogLayout(), null, StringUtils.EMPTY, null, null, i18n);
return;
}
updateLogLayout(getLogLayout(), selectedBaseEntity.getLastModifiedAt(), selectedBaseEntity.getLastModifiedBy(),
selectedBaseEntity.getCreatedAt(), selectedBaseEntity.getCreatedBy(), i18n);
}
private void populateDescription() {
if (selectedBaseEntity != null) {
updateDescriptionLayout(i18n.get("label.description"), selectedBaseEntity.getDescription());
} else {
updateDescriptionLayout(i18n.get("label.description"), null);
}
}
protected abstract void populateDetailsWidget();
protected Long getSelectedBaseEntityId() {
return selectedBaseEntity == null ? null : selectedBaseEntity.getId();
}
protected abstract String getDetailsHeaderCaptionId();
protected abstract String getName();
}

View File

@@ -16,12 +16,12 @@ import org.eclipse.hawkbit.repository.exception.EntityLockedException;
import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.repository.model.SoftwareModuleType;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
import org.eclipse.hawkbit.ui.distributions.event.DistributionsUIEvent;
import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent.DistributionComponentEvent;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
@@ -214,9 +214,8 @@ public class SoftwareModuleDetailsTable extends Table {
.getItem(event.getButton().getId()).getItemProperty(SOFT_MODULE).getValue(), alreadyAssignedSwModules);
final DistributionSet newDistributionSet = distributionSetManagement.unassignSoftwareModule(distributionSet,
unAssignedSw);
manageDistUIState.setLastSelectedDistribution(newDistributionSet.getDistributionSetIdName());
eventBus.publish(this,
new DistributionTableEvent(DistributionComponentEvent.ON_VALUE_CHANGE, newDistributionSet));
manageDistUIState.setLastSelectedEntity(newDistributionSet.getDistributionSetIdName());
eventBus.publish(this, new DistributionTableEvent(BaseEntityEventType.SELECTED_ENTITY, newDistributionSet));
eventBus.publish(this, DistributionsUIEvent.ORDER_BY_DISTRIBUTION);
uiNotification.displaySuccess(i18n.get("message.sw.unassigned", unAssignedSw.getName()));
}

View File

@@ -182,40 +182,45 @@ public abstract class AbstractDeleteActionsLayout extends VerticalLayout impleme
}
protected void setUploadStatusButtonCaption(final Long count) {
if (null != bulkUploadStatusButton) {
bulkUploadStatusButton.setCaption("<div class='unread'>" + count + "</div>");
if (bulkUploadStatusButton == null) {
return;
}
bulkUploadStatusButton.setCaption("<div class='unread'>" + count + "</div>");
}
protected void enableBulkUploadStatusButton() {
if (null != bulkUploadStatusButton) {
bulkUploadStatusButton.setVisible(true);
if (bulkUploadStatusButton == null) {
return;
}
bulkUploadStatusButton.setVisible(true);
}
protected void updateUploadBtnIconToComplete() {
if (null != bulkUploadStatusButton) {
bulkUploadStatusButton.removeStyleName(SPUIStyleDefinitions.BULK_UPLOAD_PROGRESS_INDICATOR_STYLE);
bulkUploadStatusButton.setIcon(FontAwesome.UPLOAD);
if (bulkUploadStatusButton == null) {
return;
}
bulkUploadStatusButton.removeStyleName(SPUIStyleDefinitions.BULK_UPLOAD_PROGRESS_INDICATOR_STYLE);
bulkUploadStatusButton.setIcon(FontAwesome.UPLOAD);
}
protected void updateUploadBtnIconToProgressIndicator() {
if (null != bulkUploadStatusButton) {
bulkUploadStatusButton.addStyleName(SPUIStyleDefinitions.BULK_UPLOAD_PROGRESS_INDICATOR_STYLE);
bulkUploadStatusButton.setIcon(null);
if (bulkUploadStatusButton == null) {
return;
}
bulkUploadStatusButton.addStyleName(SPUIStyleDefinitions.BULK_UPLOAD_PROGRESS_INDICATOR_STYLE);
bulkUploadStatusButton.setIcon(null);
}
protected void actionButtonClicked() {
if (hasUnsavedActions()) {
unsavedActionsWindow = SPUIComponentProvider.getWindow(getUnsavedActionsWindowCaption(),
SPUIComponetIdProvider.SAVE_ACTIONS_POPUP, SPUIDefinitions.CONFIRMATION_WINDOW);
unsavedActionsWindow.addCloseListener(event -> unsavedActionsWindowClosed());
unsavedActionsWindow.setContent(getUnsavedActionsWindowContent());
unsavedActionsWindow.setId(SPUIComponetIdProvider.CONFIRMATION_POPUP_ID);
UI.getCurrent().addWindow(unsavedActionsWindow);
if (!hasUnsavedActions()) {
return;
}
unsavedActionsWindow = SPUIComponentProvider.getWindow(getUnsavedActionsWindowCaption(),
SPUIComponetIdProvider.SAVE_ACTIONS_POPUP, SPUIDefinitions.CONFIRMATION_WINDOW);
unsavedActionsWindow.addCloseListener(event -> unsavedActionsWindowClosed());
unsavedActionsWindow.setContent(getUnsavedActionsWindowContent());
unsavedActionsWindow.setId(SPUIComponetIdProvider.CONFIRMATION_POPUP_ID);
UI.getCurrent().addWindow(unsavedActionsWindow);
}
/**
@@ -225,22 +230,11 @@ public abstract class AbstractDeleteActionsLayout extends VerticalLayout impleme
UI.getCurrent().removeWindow(unsavedActionsWindow);
}
/*
* (non-Javadoc)
*
* @see com.vaadin.event.dd.DropHandler#getAcceptCriterion()
*/
@Override
public AcceptCriterion getAcceptCriterion() {
return getDeleteLayoutAcceptCriteria();
}
/*
* (non-Javadoc)
*
* @see com.vaadin.event.dd.DropHandler#drop(com.vaadin.event.dd.
* DragAndDropEvent)
*/
@Override
public void drop(final DragAndDropEvent event) {
processDroppedComponent(event);
@@ -287,6 +281,42 @@ public abstract class AbstractDeleteActionsLayout extends VerticalLayout impleme
}
}
/**
*
* @return true if the count label is displayed false is not displayed
*/
protected boolean hasCountMessage() {
return false;
}
/**
*
* @return the count message label
*/
protected Label getCountMessageLabel() {
return null;
}
/**
* @return true if bulk upload is allowed and has required create
* permissions.
*/
protected boolean hasBulkUploadPermission() {
// can be overriden
return false;
}
protected void showBulkUploadWindow() {
// can be overriden
}
/**
* restore the upload status count.
*/
protected void restoreBulkUploadStatusCount() {
// can be overriden
}
/**
* Check user has delete permission.
*
@@ -362,11 +392,6 @@ public abstract class AbstractDeleteActionsLayout extends VerticalLayout impleme
*/
protected abstract void restoreActionCount();
/**
* restore the upload status count.
*/
protected abstract void restoreBulkUploadStatusCount();
/**
* This method will be called when unsaved actions window is closed.
*/
@@ -387,21 +412,4 @@ public abstract class AbstractDeleteActionsLayout extends VerticalLayout impleme
*/
protected abstract boolean hasUnsavedActions();
/**
* Only in deployment view count message is displayed.
*
* @return
*/
protected abstract boolean hasCountMessage();
protected abstract Label getCountMessageLabel();
/**
* @return true if bulk upload is allowed and has required create
* permissions.
*/
protected abstract boolean hasBulkUploadPermission();
protected abstract void showBulkUploadWindow();
}

View File

@@ -0,0 +1,47 @@
/**
* 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.table;
import java.util.List;
import org.eclipse.hawkbit.repository.model.NamedVersionedEntity;
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
import org.eclipse.hawkbit.ui.utils.TableColumn;
import com.vaadin.data.Item;
/**
* Abstract table to handling {@link NamedVersionedEntity}
*
* @param <E>
* e is the entity class
* @param <I>
* i is the id of the table
*/
public abstract class AbstractNamedVersionTable<E extends NamedVersionedEntity, I> extends AbstractTable<E, I> {
private static final long serialVersionUID = 780050712209750719L;
@Override
protected List<TableColumn> getTableVisibleColumns() {
final List<TableColumn> columnList = super.getTableVisibleColumns();
final float versionColumnSize = isMaximized() ? 0.1F : 0.2F;
columnList
.add(new TableColumn(SPUILabelDefinitions.VAR_VERSION, i18n.get("header.version"), versionColumnSize));
return columnList;
}
@SuppressWarnings("unchecked")
@Override
protected void updateEntity(final E baseEntity, final Item item) {
super.updateEntity(baseEntity, item);
item.getItemProperty(SPUILabelDefinitions.VAR_VERSION).setValue(baseEntity.getVersion());
}
}

View File

@@ -9,34 +9,65 @@
package org.eclipse.hawkbit.ui.common.table;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.repository.model.NamedEntity;
import org.eclipse.hawkbit.ui.artifacts.event.UploadArtifactUIEvent;
import org.eclipse.hawkbit.ui.common.ManagmentEntityState;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
import org.eclipse.hawkbit.ui.utils.TableColumn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.vaadin.spring.events.EventBus;
import com.google.gwt.thirdparty.guava.common.collect.Iterables;
import com.vaadin.data.Container;
import com.vaadin.data.Item;
import com.vaadin.event.dd.DropHandler;
import com.vaadin.ui.Table;
import com.vaadin.ui.UI;
import com.vaadin.ui.themes.ValoTheme;
/**
* Parent class for table.
*
*
* Abstract table to handling entity
*
* @param <E>
* e is the entity class
* @param <I>
* i is the id of the table
*/
public abstract class AbstractTable extends Table {
public abstract class AbstractTable<E extends NamedEntity, I> extends Table {
private static final long serialVersionUID = 4856562746502217630L;
private static final Logger LOG = LoggerFactory.getLogger(AbstractTable.class);
@Autowired
protected transient EventBus.SessionEventBus eventBus;
@Autowired
protected I18N i18n;
/**
* Initialize the components.
*/
@PostConstruct
protected void init() {
setStyleName("sp-table");
setSizeFull();
setImmediate(true);
setHeight(100.0f, Unit.PERCENTAGE);
setHeight(100.0F, Unit.PERCENTAGE);
addStyleName(ValoTheme.TABLE_NO_VERTICAL_LINES);
addStyleName(ValoTheme.TABLE_SMALL);
setSortEnabled(false);
@@ -48,6 +79,50 @@ public abstract class AbstractTable extends Table {
addValueChangeListener(event -> onValueChange());
selectRow();
setPageLength(SPUIDefinitions.PAGE_SIZE);
setDataAvailable(getContainerDataSource().size() != 0);
eventBus.subscribe(this);
}
@PreDestroy
protected void destroy() {
eventBus.unsubscribe(this);
}
public static <T> Set<T> getTableValue(final Table table) {
@SuppressWarnings("unchecked")
Set<T> values = (Set<T>) table.getValue();
if (values == null) {
values = Collections.emptySet();
}
if (values.contains(null)) {
LOG.warn("Null values in table content. How could this happen?");
}
return values;
}
private void onValueChange() {
eventBus.publish(this, UploadArtifactUIEvent.HIDE_DROP_HINTS);
final Set<I> values = getTableValue(this);
E entity = null;
I lastId = null;
if (!values.isEmpty()) {
lastId = Iterables.getLast(values);
entity = findEntityByTableValue(lastId);
}
setManagementEntitiyStateValues(values, lastId);
publishEntityAfterValueChange(entity);
}
protected void setManagementEntitiyStateValues(final Set<I> values, final I lastId) {
final ManagmentEntityState<I> managmentEntityState = getManagmentEntityState();
if (managmentEntityState == null) {
return;
}
managmentEntityState.setLastSelectedEntity(lastId);
managmentEntityState.setSelectedEnitities(values);
}
private void setDefault() {
@@ -118,6 +193,75 @@ public abstract class AbstractTable extends Table {
selectRow();
}
/**
* Add new software module to table.
*
* @param baseEntity
* new software module
*/
protected Item addEntity(final E baseEntity) {
final Object addItem = addItem();
final Item item = getItem(addItem);
updateEntity(baseEntity, item);
return item;
}
@SuppressWarnings("unchecked")
protected void updateEntity(final E baseEntity, final Item item) {
item.getItemProperty(SPUILabelDefinitions.VAR_NAME).setValue(baseEntity.getName());
item.getItemProperty(SPUILabelDefinitions.VAR_ID).setValue(baseEntity.getId());
item.getItemProperty(SPUILabelDefinitions.VAR_DESC).setValue(baseEntity.getDescription());
item.getItemProperty(SPUILabelDefinitions.VAR_CREATED_BY)
.setValue(HawkbitCommonUtil.getIMUser(baseEntity.getCreatedBy()));
item.getItemProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY)
.setValue(HawkbitCommonUtil.getIMUser(baseEntity.getLastModifiedBy()));
item.getItemProperty(SPUILabelDefinitions.VAR_CREATED_DATE)
.setValue(SPDateTimeUtil.getFormattedDate(baseEntity.getCreatedAt()));
item.getItemProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE)
.setValue(SPDateTimeUtil.getFormattedDate(baseEntity.getLastModifiedAt()));
}
protected void onBaseEntityEvent(final BaseEntityEvent<E> event) {
if (BaseEntityEventType.MINIMIZED == event.getEventType()) {
UI.getCurrent().access(() -> applyMinTableSettings());
} else if (BaseEntityEventType.MAXIMIZED == event.getEventType()) {
UI.getCurrent().access(() -> applyMaxTableSettings());
} else if (BaseEntityEventType.NEW_ENTITY == event.getEventType()) {
UI.getCurrent().access(() -> addEntity(event.getEntity()));
}
}
/**
* Return the entity which should be deleted by a transferable
*
* @param transferable
* the table transferable
* @return set of entities id which will deleted
*/
@SuppressWarnings("unchecked")
public Set<I> getDeletedEntityByTransferable(final TableTransferable transferable) {
final Set<I> selectedEntities = (Set<I>) getTableValue(this);
final Set<I> ids = new HashSet<>();
final Object tranferableData = transferable.getData(SPUIDefinitions.ITEMID);
if (tranferableData == null) {
return ids;
}
if (!selectedEntities.contains(tranferableData)) {
ids.add((I) tranferableData);
} else {
ids.addAll(selectedEntities);
}
return ids;
}
protected abstract E findEntityByTableValue(I lastSelectedId);
protected abstract void publishEntityAfterValueChange(E selectedLastEntity);
protected abstract ManagmentEntityState<I> getManagmentEntityState();
/**
* Get Id of the table.
*
@@ -141,7 +285,9 @@ public abstract class AbstractTable extends Table {
/**
* Add any generated columns if required.
*/
protected abstract void addCustomGeneratedColumns();
protected void addCustomGeneratedColumns() {
// can be overriden
}
/**
* Check if first row should be selected by default on load.
@@ -157,11 +303,6 @@ public abstract class AbstractTable extends Table {
*/
protected abstract Object getItemIdToSelect();
/**
* On select of row.
*/
protected abstract void onValueChange();
/**
* Check if the table is maximized or minimized.
*
@@ -174,7 +315,26 @@ public abstract class AbstractTable extends Table {
*
* @return List<TableColumn> list of visible columns
*/
protected abstract List<TableColumn> getTableVisibleColumns();
protected List<TableColumn> getTableVisibleColumns() {
final List<TableColumn> columnList = new ArrayList<>();
if (!isMaximized()) {
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_NAME, i18n.get("header.name"),
getColumnNameMinimizedSize()));
return columnList;
}
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_NAME, i18n.get("header.name"), 0.2F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_BY, i18n.get("header.createdBy"), 0.1F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_DATE, i18n.get("header.createdDate"), 0.1F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY, i18n.get("header.modifiedBy"), 0.1F));
columnList.add(
new TableColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE, i18n.get("header.modifiedDate"), 0.1F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_DESC, i18n.get("header.description"), 0.2F));
return columnList;
}
protected float getColumnNameMinimizedSize() {
return 0.8F;
}
/**
* Get drop handler for the table.
@@ -183,4 +343,6 @@ public abstract class AbstractTable extends Table {
*/
protected abstract DropHandler getTableDropHandler();
protected abstract void setDataAvailable(boolean available);
}

View File

@@ -0,0 +1,44 @@
/**
* 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.table;
import org.eclipse.hawkbit.repository.model.BaseEntity;
/**
* Event to represent add, update or delete.
*
*/
public class BaseEntityEvent<T extends BaseEntity> {
private final BaseEntityEventType eventType;
private final T entity;
/**
* Base entity event
*
* @param eventType
* the event type
* @param entity
* the entity reference
*/
public BaseEntityEvent(final BaseEntityEventType eventType, final T entity) {
this.eventType = eventType;
this.entity = entity;
}
public T getEntity() {
return entity;
}
public BaseEntityEventType getEventType() {
return eventType;
}
}

View File

@@ -0,0 +1,17 @@
/**
* 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.table;
/**
* Types of the entity event.
*
*/
public enum BaseEntityEventType {
NEW_ENTITY, UPDATED_ENTITY, DELETE_ENTITY, SELECTED_ENTITY, MAXIMIZED, MINIMIZED;
}

View File

@@ -17,6 +17,9 @@ import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.repository.SpPermissionChecker;
import org.eclipse.hawkbit.repository.model.BaseEntity;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEvent;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.management.state.ManagementUIState;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
@@ -35,6 +38,7 @@ import com.vaadin.server.FontAwesome;
import com.vaadin.shared.ui.combobox.FilteringMode;
import com.vaadin.ui.Button;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.UI;
import com.vaadin.ui.themes.ValoTheme;
/**
@@ -44,7 +48,7 @@ import com.vaadin.ui.themes.ValoTheme;
*
*
*/
public abstract class AbstractTagToken implements Serializable {
public abstract class AbstractTagToken<T extends BaseEntity> implements Serializable {
private static final String COLOR_PROPERTY = "color";
@@ -59,7 +63,7 @@ public abstract class AbstractTagToken implements Serializable {
protected final Map<Long, TagData> tokensAdded = new HashMap<>();
protected CssLayout tokenLayout = new CssLayout();
@Autowired
protected SpPermissionChecker checker;
@@ -71,23 +75,37 @@ public abstract class AbstractTagToken implements Serializable {
@Autowired
protected transient EventBus.SessionEventBus eventBus;
@Autowired
protected ManagementUIState managementUIState;
protected T selectedEntity;
@PostConstruct
protected void init() {
createTokenField();
checkIfTagAssignedIsAllowed();
eventBus.subscribe(this);
}
@PreDestroy
void destroy() {
protected void destroy() {
eventBus.unsubscribe(this);
}
protected void onBaseEntityEvent(final BaseEntityEvent<T> baseEntityEvent) {
if (BaseEntityEventType.SELECTED_ENTITY != baseEntityEvent.getEventType()) {
return;
}
UI.getCurrent().access(() -> {
final T entity = baseEntityEvent.getEntity();
if (entity != null) {
selectedEntity = entity;
repopulateToken();
}
});
}
private void createTokenField() {
final Container tokenContainer = createContainer();
tokenField = createTokenField(tokenContainer);

View File

@@ -11,6 +11,7 @@ package org.eclipse.hawkbit.ui.common.tagdetails;
import org.eclipse.hawkbit.eventbus.event.TargetTagCreatedBulkEvent;
import org.eclipse.hawkbit.eventbus.event.TargetTagDeletedEvent;
import org.eclipse.hawkbit.repository.TagManagement;
import org.eclipse.hawkbit.repository.model.BaseEntity;
import org.eclipse.hawkbit.repository.model.TargetTag;
import org.springframework.beans.factory.annotation.Autowired;
import org.vaadin.spring.events.EventScope;
@@ -19,15 +20,13 @@ import org.vaadin.spring.events.annotation.EventBusListenerMethod;
/**
* Abstract class for target tag token layout.
*/
public abstract class AbstractTargetTagToken extends AbstractTagToken {
public abstract class AbstractTargetTagToken<T extends BaseEntity> extends AbstractTagToken<T> {
private static final long serialVersionUID = 7772876588903171201L;
@Autowired
protected transient TagManagement tagManagement;
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEventTargetTagCreated(final TargetTagCreatedBulkEvent event) {
for (final TargetTag tag : event.getEntities()) {

View File

@@ -14,8 +14,6 @@ import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.eventbus.event.DistributionSetTagAssigmentResultEvent;
import org.eclipse.hawkbit.eventbus.event.DistributionSetTagCreatedBulkEvent;
import org.eclipse.hawkbit.eventbus.event.DistributionSetTagDeletedEvent;
@@ -26,7 +24,6 @@ import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.DistributionSetTag;
import org.eclipse.hawkbit.repository.model.DistributionSetTagAssignmentResult;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent.DistributionComponentEvent;
import org.eclipse.hawkbit.ui.management.event.ManagementUIEvent;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.springframework.beans.factory.annotation.Autowired;
@@ -36,7 +33,6 @@ import org.vaadin.spring.events.annotation.EventBusListenerMethod;
import com.vaadin.data.Item;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.ViewScope;
import com.vaadin.ui.UI;
/**
* Implementation of target/ds tag token layout.
@@ -44,7 +40,7 @@ import com.vaadin.ui.UI;
*/
@SpringComponent
@ViewScope
public class DistributionTagToken extends AbstractTagToken {
public class DistributionTagToken extends AbstractTagToken<DistributionSet> {
private static final long serialVersionUID = -8022738301736043396L;
@Autowired
@@ -53,8 +49,6 @@ public class DistributionTagToken extends AbstractTagToken {
@Autowired
private transient DistributionSetManagement distributionSetManagement;
private DistributionSet selectedDS;
// To Be Done : have to set this value based on view???
private static final Boolean NOTAGS_SELECTED = Boolean.FALSE;
@@ -82,9 +76,9 @@ public class DistributionTagToken extends AbstractTagToken {
private DistributionSetTagAssignmentResult toggleAssignment(final String tagNameSelected) {
final Set<Long> distributionList = new HashSet<>();
distributionList.add(selectedDS.getId());
final DistributionSetTagAssignmentResult result = distributionSetManagement.toggleTagAssignment(distributionList,
tagNameSelected);
distributionList.add(selectedEntity.getId());
final DistributionSetTagAssignmentResult result = distributionSetManagement
.toggleTagAssignment(distributionList, tagNameSelected);
uinotification.displaySuccess(HawkbitCommonUtil.createAssignmentMessage(tagNameSelected, result, i18n));
return result;
}
@@ -117,8 +111,8 @@ public class DistributionTagToken extends AbstractTagToken {
@Override
public void displayAlreadyAssignedTags() {
removePreviouslyAddedTokens();
if (selectedDS != null) {
for (final DistributionSetTag tag : selectedDS.getTags()) {
if (selectedEntity != null) {
for (final DistributionSetTag tag : selectedEntity.getTags()) {
addNewToken(tag.getId());
}
}
@@ -134,15 +128,7 @@ public class DistributionTagToken extends AbstractTagToken {
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final DistributionTableEvent distributionTableEvent) {
if (distributionTableEvent.getDistributionComponentEvent() != DistributionComponentEvent.ON_VALUE_CHANGE) {
return;
}
UI.getCurrent().access(() -> {
if (distributionTableEvent.getDistributionSet() != null) {
selectedDS = distributionTableEvent.getDistributionSet();
repopulateToken();
}
});
onBaseEntityEvent(distributionTableEvent);
}
@EventBusListenerMethod(scope = EventScope.SESSION)
@@ -202,10 +188,4 @@ public class DistributionTagToken extends AbstractTagToken {
return false;
}
@Override
@PreDestroy
void destroy() {
eventBus.unsubscribe(this);
}
}

View File

@@ -22,7 +22,6 @@ import org.eclipse.hawkbit.repository.model.TargetTag;
import org.eclipse.hawkbit.repository.model.TargetTagAssignmentResult;
import org.eclipse.hawkbit.ui.management.event.ManagementUIEvent;
import org.eclipse.hawkbit.ui.management.event.TargetTableEvent;
import org.eclipse.hawkbit.ui.management.event.TargetTableEvent.TargetComponentEvent;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.springframework.beans.factory.annotation.Autowired;
@@ -32,7 +31,6 @@ import org.vaadin.spring.events.annotation.EventBusListenerMethod;
import com.vaadin.data.Item;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.ViewScope;
import com.vaadin.ui.UI;
/**
* Implementation of Target tag token.
@@ -41,7 +39,7 @@ import com.vaadin.ui.UI;
*/
@SpringComponent
@ViewScope
public class TargetTagToken extends AbstractTargetTagToken {
public class TargetTagToken extends AbstractTargetTagToken<Target> {
private static final long serialVersionUID = 7124887018280196721L;
@@ -54,8 +52,6 @@ public class TargetTagToken extends AbstractTargetTagToken {
@Autowired
private transient TargetManagement targetManagement;
private Target selectedTarget;
@Override
protected String getTagStyleName() {
return "target-tag-";
@@ -80,7 +76,7 @@ public class TargetTagToken extends AbstractTargetTagToken {
private TargetTagAssignmentResult toggleAssignment(final String tagNameSelected) {
final Set<String> targetList = new HashSet<>();
targetList.add(selectedTarget.getControllerId());
targetList.add(selectedEntity.getControllerId());
final TargetTagAssignmentResult result = targetManagement.toggleTagAssignment(targetList, tagNameSelected);
uinotification.displaySuccess(HawkbitCommonUtil.createAssignmentMessage(tagNameSelected, result, i18n));
return result;
@@ -114,8 +110,8 @@ public class TargetTagToken extends AbstractTargetTagToken {
@Override
protected void displayAlreadyAssignedTags() {
removePreviouslyAddedTokens();
if (selectedTarget != null) {
for (final TargetTag tag : selectedTarget.getTags()) {
if (selectedEntity != null) {
for (final TargetTag tag : selectedEntity.getTags()) {
addNewToken(tag.getId());
}
}
@@ -174,13 +170,7 @@ public class TargetTagToken extends AbstractTargetTagToken {
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final TargetTableEvent targetTableEvent) {
if (targetTableEvent.getTargetComponentEvent() == TargetComponentEvent.SELECTED_TARGET
&& targetTableEvent.getTarget() != null) {
UI.getCurrent().access(() -> {
selectedTarget = targetTableEvent.getTarget();
repopulateToken();
});
}
onBaseEntityEvent(targetTableEvent);
}
}

View File

@@ -1,29 +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.customrenderers.client;
import org.eclipse.hawkbit.ui.customrenderers.renderers.LinkRenderer;
import com.vaadin.client.connectors.ButtonRendererConnector;
import com.vaadin.shared.ui.Connect;
/**
*
* A connector for {@link LinkRenderer}.
*
*/
@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,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;
import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData;
import com.google.web.bindery.event.shared.HandlerRegistration;
import com.vaadin.client.connectors.ClickableRendererConnector;
import com.vaadin.client.renderers.ClickableRenderer.RendererClickHandler;
import com.vaadin.shared.ui.Connect;
import elemental.json.JsonObject;
/**
* A connector for {@link CustomObjectRenderer }.
*
*/
@Connect(org.eclipse.hawkbit.ui.customrenderers.renderers.RolloutRenderer.class)
public class RolloutRendererConnector extends ClickableRendererConnector<RolloutRendererData> {
private static final long serialVersionUID = 7734682321931830566L;
public org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRenderer getRenderer() {
return (org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRenderer) super.getRenderer();
}
@Override
protected HandlerRegistration addClickHandler(
RendererClickHandler<JsonObject> handler) {
return getRenderer().addClickHandler(handler);
}
}

View File

@@ -1,42 +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.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;
/**
*
* Renders link with provided text.
*
*/
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,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 com.google.gwt.core.shared.GWT;
import com.vaadin.client.renderers.ClickableRenderer;
import com.vaadin.client.ui.VButton;
import com.vaadin.client.widget.grid.RendererCellReference;
/**
* Renders button with provided CustomObject.
* Used to display button with link.
*
*/
public class RolloutRenderer extends ClickableRenderer<RolloutRendererData, VButton> {
@Override
public VButton createWidget() {
VButton b = GWT.create(VButton.class);
b.addClickHandler(this);
b.setStylePrimaryName("v-nativebutton");
return b;
}
@Override
public void render(RendererCellReference cell, RolloutRendererData text, VButton button) {
final String creating = "CREATING";
button.setText(text.getName());
applystyle(button);
// this is to allow the button to disappear, if the text is null
button.setVisible(text.getName() != null);
button.getElement().setId(new StringBuilder("link").append(".").append(text.getName()).toString());
/*
* checking Rollout Status for applying button style. If Rollout status
* is not "CREATING", then the Rollout button is applying hyperlink
* style
*/
final boolean isStatusCreate = text.getStatus() != null && creating.equalsIgnoreCase(text.getStatus());
if (isStatusCreate) {
button.addStyleName(getStyle("boldhide"));
button.setEnabled(false);
} else {
button.setEnabled(true);
}
}
private void applystyle(VButton 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,62 @@
/**
* 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.io.Serializable;
/**
* RendererData class with Name and Status.
*
*/
public class RolloutRendererData implements Serializable {
private static final long serialVersionUID = -5018181529953620263L;
private String name;
private String status;
/**
* Initialize the RendererData.
*/
public RolloutRendererData() {
}
/**
* Initialize the RendererData.
*
* @param name
* Name of the Rollout.
* @param status
* Status of Rollout.
*/
public RolloutRendererData(String name, String status) {
super();
this.name = name;
this.status = status;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}

View File

@@ -1,37 +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.customrenderers.renderers;
import com.vaadin.ui.renderers.ButtonRenderer;
/**
*
* Renders link with provided text.
*
*/
public class LinkRenderer extends ButtonRenderer {
private static final long serialVersionUID = -1242995370043404892L;
/**
* Intialise link renderer.
*/
public LinkRenderer() {
super();
}
/**
* Intialise link renderer with {@link RendererClickListener}
*
* @param listener
* RendererClickListener
*/
public LinkRenderer(RendererClickListener listener) {
super(listener);
}
}

View File

@@ -0,0 +1,61 @@
/**
* 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 org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData;
import com.vaadin.ui.renderers.ClickableRenderer;
import elemental.json.JsonValue;
/**
* Renders button with provided CustomObject.
* Used to display button with link.
*
*/
public class RolloutRenderer extends ClickableRenderer<RolloutRendererData> {
private static final long serialVersionUID = -8754180585906263554L;
/**
* Creates a new custom object renderer.
*/
public RolloutRenderer() {
super(RolloutRendererData.class, null);
}
/**
* Initialize custom object renderer with {@link Class<CustomObject>}
*
* @param presentationType
* Class<CustomObject>
*/
public RolloutRenderer(Class<RolloutRendererData> presentationType) {
super(presentationType);
}
/**
* Creates a new custom object renderer and adds the given click listener to it.
*
* @param listener
* the click listener to register
*/
public RolloutRenderer(RendererClickListener listener) {
this();
addClickListener(listener);
}
@Override
public JsonValue encode(RolloutRendererData resource) {
return super.encode(resource, RolloutRendererData.class);
}
}

View File

@@ -13,7 +13,7 @@ import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.repository.SpPermissionChecker;
import org.eclipse.hawkbit.ui.HawkbitUI;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.distributions.disttype.DSTypeFilterLayout;
import org.eclipse.hawkbit.ui.distributions.dstable.DistributionSetTableLayout;
import org.eclipse.hawkbit.ui.distributions.event.DragEvent;
@@ -22,7 +22,6 @@ import org.eclipse.hawkbit.ui.distributions.smtable.SwModuleTableLayout;
import org.eclipse.hawkbit.ui.distributions.smtype.DistSMTypeFilterLayout;
import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent.DistributionComponentEvent;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import org.eclipse.hawkbit.ui.utils.UINotification;
@@ -160,18 +159,18 @@ public class DistributionsView extends VerticalLayout implements View, BrowserWi
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final DistributionTableEvent event) {
if (event.getDistributionComponentEvent() == DistributionComponentEvent.MINIMIZED) {
if (BaseEntityEventType.MINIMIZED == event.getEventType()) {
minimizeDistTable();
} else if (event.getDistributionComponentEvent() == DistributionComponentEvent.MAXIMIZED) {
} else if (BaseEntityEventType.MAXIMIZED == event.getEventType()) {
maximizeDistTable();
}
}
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final SoftwareModuleEvent event) {
if (event.getSoftwareModuleEventType() == SoftwareModuleEventType.MINIMIZED) {
if (BaseEntityEventType.MINIMIZED == event.getEventType()) {
minimizeSwTable();
} else if (event.getSoftwareModuleEventType() == SoftwareModuleEventType.MAXIMIZED) {
} else if (BaseEntityEventType.MAXIMIZED == event.getEventType()) {
maximizeSwTable();
}
}

View File

@@ -21,7 +21,7 @@ import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.repository.model.SoftwareModuleIdName;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType;
import org.eclipse.hawkbit.ui.common.detailslayout.AbstractTableDetailsLayout;
import org.eclipse.hawkbit.ui.common.detailslayout.AbstractNamedVersionedEntityTableDetailsLayout;
import org.eclipse.hawkbit.ui.common.detailslayout.SoftwareModuleDetailsTable;
import org.eclipse.hawkbit.ui.common.tagdetails.DistributionTagToken;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
@@ -31,7 +31,6 @@ import org.eclipse.hawkbit.ui.distributions.event.SoftwareModuleAssignmentDiscar
import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState;
import org.eclipse.hawkbit.ui.management.dstable.DistributionAddUpdateWindowLayout;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent.DistributionComponentEvent;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
import org.springframework.beans.factory.annotation.Autowired;
@@ -58,7 +57,7 @@ import com.vaadin.ui.Window;
*/
@SpringComponent
@ViewScope
public class DistributionSetDetails extends AbstractTableDetailsLayout {
public class DistributionSetDetails extends AbstractNamedVersionedEntityTableDetailsLayout<DistributionSet> {
private static final long serialVersionUID = -4595004466943546669L;
@@ -85,10 +84,6 @@ public class DistributionSetDetails extends AbstractTableDetailsLayout {
private VerticalLayout tagsLayout;
private DistributionSet selectedDsModule;
private Long dsId;
Map<String, StringBuilder> assignedSWModule = new HashMap<>();
/**
@@ -97,7 +92,8 @@ public class DistributionSetDetails extends AbstractTableDetailsLayout {
@Override
protected void init() {
softwareModuleTable = new SoftwareModuleDetailsTable();
softwareModuleTable.init(i18n, true, permissionChecker, distributionSetManagement, eventBus, manageDistUIState);
softwareModuleTable.init(getI18n(), true, getPermissionChecker(), distributionSetManagement, getEventBus(),
manageDistUIState);
super.init();
}
@@ -106,28 +102,15 @@ public class DistributionSetDetails extends AbstractTableDetailsLayout {
return tagsLayout;
}
private void populateDetailsWidget(final DistributionSet ds) {
if (ds != null) {
setDsId(ds.getId());
setName(getDefaultCaption(), HawkbitCommonUtil.getFormattedNameVersion(ds.getName(), ds.getVersion()));
populateDetails(ds);
populateDescription(ds);
populateLog(ds);
populteModule(ds);
populateTags(ds);
} else {
setDsId(null);
setName(getDefaultCaption(), HawkbitCommonUtil.SP_STRING_EMPTY);
populateDetails(null);
populateDescription(null);
populteModule(null);
populateTags(null);
populateLog(null);
}
@Override
protected void populateDetailsWidget() {
populateDetails();
populateModule();
populateTags();
}
private void populteModule(final DistributionSet distributionSet) {
softwareModuleTable.populateModule(distributionSet);
private void populateModule() {
softwareModuleTable.populateModule(getSelectedBaseEntity());
showUnsavedAssignment();
}
@@ -159,7 +142,7 @@ public class DistributionSetDetails extends AbstractTableDetailsLayout {
assignedSWModule.put(softwareModule.getType().getName(),
new StringBuilder().append("<I>").append(
getUnsavedAssigedSwModule(softwareModule.getName(), softwareModule.getVersion()))
.append("<I>"));
.append("<I>"));
}
}
@@ -175,12 +158,8 @@ public class DistributionSetDetails extends AbstractTableDetailsLayout {
}
}
/**
* @param item
* @param entry
*/
private void assignSoftModuleButton(final Item item, final Map.Entry<String, StringBuilder> entry) {
if (permissionChecker.hasUpdateDistributionPermission() && distributionSetManagement
if (getPermissionChecker().hasUpdateDistributionPermission() && distributionSetManagement
.findDistributionSetById(manageDistUIState.getLastSelectedDistribution().get().getId())
.getAssignedTargets().isEmpty()) {
final Button reassignSoftModule = SPUIComponentProvider.getButton(entry.getKey(), "", "", "", true,
@@ -243,69 +222,46 @@ public class DistributionSetDetails extends AbstractTableDetailsLayout {
return softwareLayout;
}
private void populateTags(final DistributionSet ds) {
private void populateTags() {
tagsLayout.removeAllComponents();
if (null != ds) {
tagsLayout.addComponent(distributionTagToken.getTokenField());
if (getSelectedBaseEntity() == null) {
return;
}
tagsLayout.addComponent(distributionTagToken.getTokenField());
}
private void populateLog(final DistributionSet ds) {
if (null != ds) {
updateLogLayout(getLogLayout(), ds.getLastModifiedAt(), ds.getLastModifiedBy(), ds.getCreatedAt(),
ds.getCreatedBy(), i18n);
} else {
updateLogLayout(getLogLayout(), null, HawkbitCommonUtil.SP_STRING_EMPTY, null, null, i18n);
}
}
private void populateDetails(final DistributionSet ds) {
if (ds != null) {
updateDistributionSetDetailsLayout(ds.getType().getName(), ds.isRequiredMigrationStep());
private void populateDetails() {
if (getSelectedBaseEntity() != null) {
updateDistributionSetDetailsLayout(getSelectedBaseEntity().getType().getName(),
getSelectedBaseEntity().isRequiredMigrationStep());
} else {
updateDistributionSetDetailsLayout(null, null);
}
}
private void populateDescription(final DistributionSet ds) {
if (ds != null) {
updateDescriptionLayout(i18n.get("label.description"), ds.getDescription());
} else {
updateDescriptionLayout(i18n.get("label.description"), null);
}
}
private void updateDistributionSetDetailsLayout(final String type, final Boolean isMigrationRequired) {
final VerticalLayout detailsTabLayout = getDetailsLayout();
detailsTabLayout.removeAllComponents();
if (type != null) {
final Label typeLabel = SPUIComponentProvider.createNameValueLabel(i18n.get("label.dist.details.type"),
final Label typeLabel = SPUIComponentProvider.createNameValueLabel(getI18n().get("label.dist.details.type"),
type);
typeLabel.setId(SPUIComponetIdProvider.DETAILS_TYPE_LABEL_ID);
detailsTabLayout.addComponent(typeLabel);
}
if (isMigrationRequired != null) {
detailsTabLayout.addComponent(
SPUIComponentProvider.createNameValueLabel(i18n.get("checkbox.dist.migration.required"),
isMigrationRequired.equals(Boolean.TRUE) ? i18n.get("label.yes") : i18n.get("label.no")));
detailsTabLayout.addComponent(SPUIComponentProvider.createNameValueLabel(
getI18n().get("checkbox.dist.migration.required"),
isMigrationRequired.equals(Boolean.TRUE) ? getI18n().get("label.yes") : getI18n().get("label.no")));
}
}
public Long getDsId() {
return dsId;
}
public void setDsId(final Long dsId) {
this.dsId = dsId;
}
@Override
protected void onEdit(final ClickEvent event) {
final Window newDistWindow = distributionAddUpdateWindowLayout.getWindow();
distributionAddUpdateWindowLayout.populateValuesOfDistribution(getDsId());
newDistWindow.setCaption(i18n.get("caption.update.dist"));
distributionAddUpdateWindowLayout.populateValuesOfDistribution(getSelectedBaseEntityId());
newDistWindow.setCaption(getI18n().get("caption.update.dist"));
UI.getCurrent().addWindow(newDistWindow);
newDistWindow.setVisible(Boolean.TRUE);
}
@@ -326,91 +282,62 @@ public class DistributionSetDetails extends AbstractTableDetailsLayout {
return manageDistUIState.isDsTableMaximized();
}
@Override
protected void populateDetailsWidget() {
populateDetailsWidget(selectedDsModule);
}
@Override
protected String getDefaultCaption() {
return i18n.get("distribution.details.header");
return getI18n().get("distribution.details.header");
}
@Override
protected void addTabs(final TabSheet detailsTab) {
detailsTab.addTab(createDetailsLayout(), i18n.get("caption.tab.details"), null);
detailsTab.addTab(createDescriptionLayout(), i18n.get("caption.tab.description"), null);
detailsTab.addTab(createSoftwareModuleTab(), i18n.get("caption.softwares.distdetail.tab"), null);
detailsTab.addTab(createTagsLayout(), i18n.get("caption.tags.tab"), null);
detailsTab.addTab(createLogLayout(), i18n.get("caption.logs.tab"), null);
}
@Override
protected void clearDetails() {
populateDetailsWidget(null);
detailsTab.addTab(createDetailsLayout(), getI18n().get("caption.tab.details"), null);
detailsTab.addTab(createDescriptionLayout(), getI18n().get("caption.tab.description"), null);
detailsTab.addTab(createSoftwareModuleTab(), getI18n().get("caption.softwares.distdetail.tab"), null);
detailsTab.addTab(createTagsLayout(), getI18n().get("caption.tags.tab"), null);
detailsTab.addTab(createLogLayout(), getI18n().get("caption.logs.tab"), null);
}
@Override
protected Boolean hasEditPermission() {
return permissionChecker.hasUpdateDistributionPermission();
return getPermissionChecker().hasUpdateDistributionPermission();
}
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final SoftwareModuleEvent event) {
if (event.getSoftwareModuleEventType() == SoftwareModuleEventType.ASSIGN_SOFTWARE_MODULE) {
ui.access(() -> updateSoftwareModule(event.getSoftwareModule()));
UI.getCurrent().access(() -> updateSoftwareModule(event.getEntity()));
}
}
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final DistributionTableEvent distributionTableEvent) {
if (distributionTableEvent.getDistributionComponentEvent() == DistributionComponentEvent.ON_VALUE_CHANGE
|| distributionTableEvent
.getDistributionComponentEvent() == DistributionComponentEvent.EDIT_DISTRIBUTION) {
assignedSWModule.clear();
ui.access(() -> {
/**
* distributionTableEvent.getDistributionSet() is null when
* table has no data.
*/
if (distributionTableEvent.getDistributionSet() != null) {
selectedDsModule = distributionTableEvent.getDistributionSet();
populateData(true);
} else {
populateData(false);
}
});
} else if (distributionTableEvent.getDistributionComponentEvent() == DistributionComponentEvent.MINIMIZED) {
ui.access(() -> showLayout());
} else if (distributionTableEvent.getDistributionComponentEvent() == DistributionComponentEvent.MAXIMIZED) {
ui.access(() -> hideLayout());
}
onBaseEntityEvent(distributionTableEvent);
}
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final SoftwareModuleAssignmentDiscardEvent softwareModuleAssignmentDiscardEvent) {
if (softwareModuleAssignmentDiscardEvent.getDistributionSetIdName() != null) {
ui.access(() -> {
UI.getCurrent().access(() -> {
final DistributionSetIdName distIdName = softwareModuleAssignmentDiscardEvent
.getDistributionSetIdName();
if (distIdName.getId().equals(selectedDsModule.getId())
&& distIdName.getName().equals(selectedDsModule.getName())) {
selectedDsModule = distributionSetManagement
.findDistributionSetByIdWithDetails(selectedDsModule.getId());
populteModule(selectedDsModule);
if (distIdName.getId().equals(getSelectedBaseEntityId())
&& distIdName.getName().equals(getSelectedBaseEntity().getName())) {
setSelectedBaseEntity(
distributionSetManagement.findDistributionSetByIdWithDetails(getSelectedBaseEntityId()));
populateModule();
}
});
}
}
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final SaveActionWindowEvent saveActionWindowEvent) {
if ((saveActionWindowEvent == SaveActionWindowEvent.SAVED_ASSIGNMENTS
|| saveActionWindowEvent == SaveActionWindowEvent.DISCARD_ALL_ASSIGNMENTS)
&& selectedDsModule != null) {
&& getSelectedBaseEntity() != null) {
assignedSWModule.clear();
selectedDsModule = distributionSetManagement.findDistributionSetByIdWithDetails(selectedDsModule.getId());
ui.access(() -> populteModule(selectedDsModule));
setSelectedBaseEntity(
distributionSetManagement.findDistributionSetByIdWithDetails(getSelectedBaseEntityId()));
UI.getCurrent().access(() -> populateModule());
}
}

View File

@@ -12,15 +12,11 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.SoftwareManagement;
import org.eclipse.hawkbit.repository.SpPermissionChecker;
@@ -32,23 +28,21 @@ import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.repository.model.SoftwareModuleIdName;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType;
import org.eclipse.hawkbit.ui.common.table.AbstractNamedVersionTable;
import org.eclipse.hawkbit.ui.common.table.AbstractTable;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.distributions.event.DistributionsUIEvent;
import org.eclipse.hawkbit.ui.distributions.event.DistributionsViewAcceptCriteria;
import org.eclipse.hawkbit.ui.distributions.event.DragEvent;
import org.eclipse.hawkbit.ui.distributions.event.SaveActionWindowEvent;
import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent.DistributionComponentEvent;
import org.eclipse.hawkbit.ui.management.event.DistributionTableFilterEvent;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
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.TableColumn;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -56,7 +50,6 @@ 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;
@@ -77,7 +70,7 @@ import com.vaadin.ui.UI;
*/
@SpringComponent
@ViewScope
public class DistributionSetTable extends AbstractTable {
public class DistributionSetTable extends AbstractNamedVersionTable<DistributionSet, DistributionSetIdName> {
private static final long serialVersionUID = -7731776093470487988L;
@@ -86,18 +79,12 @@ public class DistributionSetTable extends AbstractTable {
private static final List<Object> DISPLAY_DROP_HINT_EVENTS = new ArrayList<>(
Arrays.asList(DragEvent.SOFTWAREMODULE_DRAG));
@Autowired
private I18N i18n;
@Autowired
private SpPermissionChecker permissionChecker;
@Autowired
private ManageDistUIState manageDistUIState;
@Autowired
private transient EventBus.SessionEventBus eventBus;
@Autowired
private transient DistributionSetManagement distributionSetManagement;
@@ -117,12 +104,9 @@ public class DistributionSetTable extends AbstractTable {
* Initialize the component.
*/
@Override
@PostConstruct
protected void init() {
super.init();
addTableStyleGenerator();
setNoDataAvailable();
eventBus.subscribe(this);
}
@EventBusListenerMethod(scope = EventScope.SESSION)
@@ -171,13 +155,6 @@ public class DistributionSetTable extends AbstractTable {
Boolean.class, null, false, true);
}
@Override
protected void addCustomGeneratedColumns() {
/**
* No generated columns.
*/
}
@Override
protected boolean isFirstRowSelectedOnLoad() {
return !manageDistUIState.getSelectedDistributions().isPresent()
@@ -193,37 +170,19 @@ public class DistributionSetTable extends AbstractTable {
}
@Override
protected void onValueChange() {
eventBus.publish(this, DragEvent.HIDE_DROP_HINT);
@SuppressWarnings("unchecked")
final Set<DistributionSetIdName> values = (Set<DistributionSetIdName>) getValue();
DistributionSetIdName value = null;
if (values != null && !values.isEmpty()) {
final Iterator<DistributionSetIdName> iterator = values.iterator();
protected DistributionSet findEntityByTableValue(final DistributionSetIdName entityTableId) {
return distributionSetManagement.findDistributionSetByIdWithDetails(entityTableId.getId());
}
while (iterator.hasNext()) {
value = iterator.next();
}
/**
* Adding null check to make to avoid NPE.Its weird that at times
* getValue returns null.
*/
if (null != value) {
manageDistUIState.setSelectedDistributions(values);
manageDistUIState.setLastSelectedDistribution(value);
@Override
protected ManageDistUIState getManagmentEntityState() {
return manageDistUIState;
}
final DistributionSet lastSelectedDistSet = distributionSetManagement
.findDistributionSetByIdWithDetails(value.getId());
eventBus.publish(this,
new DistributionTableEvent(DistributionComponentEvent.ON_VALUE_CHANGE, lastSelectedDistSet));
}
} else {
manageDistUIState.setSelectedDistributions(null);
manageDistUIState.setLastSelectedDistribution(null);
eventBus.publish(this, new DistributionTableEvent(DistributionComponentEvent.ON_VALUE_CHANGE, null));
}
@Override
protected void publishEntityAfterValueChange(final DistributionSet distributionSet) {
eventBus.publish(this, new DistributionTableEvent(BaseEntityEventType.SELECTED_ENTITY, distributionSet));
eventBus.publish(this, DistributionsUIEvent.ORDER_BY_DISTRIBUTION);
}
@Override
@@ -231,11 +190,6 @@ public class DistributionSetTable extends AbstractTable {
return manageDistUIState.isDsTableMaximized();
}
@Override
protected List<TableColumn> getTableVisibleColumns() {
return HawkbitCommonUtil.getTableVisibleColumns(isMaximized(), false, i18n);
}
@Override
protected DropHandler getTableDropHandler() {
return new DropHandler() {
@@ -257,15 +211,9 @@ public class DistributionSetTable extends AbstractTable {
private void onDrop(final DragAndDropEvent event) {
final TableTransferable transferable = (TableTransferable) event.getTransferable();
final Table source = transferable.getSourceComponent();
final Set<Long> softwareModuleSelected = (Set<Long>) source.getValue();
final Set<Long> softwareModulesIdList = new HashSet<>();
if (!softwareModuleSelected.contains(transferable.getData("itemId"))) {
softwareModulesIdList.add((Long) transferable.getData("itemId"));
} else {
softwareModulesIdList.addAll(softwareModuleSelected);
}
@SuppressWarnings("unchecked")
final AbstractTable<?, Long> source = (AbstractTable<SoftwareModule, Long>) transferable.getSourceComponent();
final Set<Long> softwareModulesIdList = source.getDeletedEntityByTransferable(transferable);
final AbstractSelectTargetDetails dropData = (AbstractSelectTargetDetails) event.getTargetDetails();
@@ -276,11 +224,6 @@ public class DistributionSetTable extends AbstractTable {
}
}
/**
* @param source
* @param softwareModulesIdList
* @param item
*/
private void handleDropEvent(final Table source, final Set<Long> softwareModulesIdList, final Item item) {
final Long distId = (Long) item.getItemProperty("id").getValue();
final String distName = (String) item.getItemProperty("name").getValue();
@@ -331,10 +274,6 @@ public class DistributionSetTable extends AbstractTable {
updateDropedDetails(distributionSetIdName, softwareModules);
}
/**
* @param distId
* @param softwareModule
*/
private void publishAssignEvent(final Long distId, final SoftwareModule softwareModule) {
if (manageDistUIState.getLastSelectedDistribution().isPresent()
&& manageDistUIState.getLastSelectedDistribution().get().getId().equals(distId)) {
@@ -343,11 +282,6 @@ public class DistributionSetTable extends AbstractTable {
}
}
/**
* @param map
* @param softwareModule
* @param softwareModuleIdName
*/
private void handleFirmwareCase(final Map<Long, HashSet<SoftwareModuleIdName>> map,
final SoftwareModule softwareModule, final SoftwareModuleIdName softwareModuleIdName) {
if (softwareModule.getType().getMaxAssignments() == 1) {
@@ -361,11 +295,6 @@ public class DistributionSetTable extends AbstractTable {
}
}
/**
* @param map
* @param softwareModule
* @param softwareModuleIdName
*/
private void handleSoftwareCase(final Map<Long, HashSet<SoftwareModuleIdName>> map,
final SoftwareModule softwareModule, final SoftwareModuleIdName softwareModuleIdName) {
if (softwareModule.getType().getMaxAssignments() == Integer.MAX_VALUE) {
@@ -475,37 +404,6 @@ public class DistributionSetTable extends AbstractTable {
return true;
}
/**
* Add new software module to table.
*
* @param swModule
* new software module
*/
@SuppressWarnings("unchecked")
private void addDistributionSet(final DistributionSet distributionSet) {
final Object addItem = addItem();
final Item item = getItem(addItem);
item.getItemProperty(SPUILabelDefinitions.VAR_NAME).setValue(distributionSet.getName());
item.getItemProperty(SPUILabelDefinitions.DIST_ID).setValue(distributionSet.getId());
item.getItemProperty(SPUILabelDefinitions.VAR_ID).setValue(distributionSet.getId());
item.getItemProperty(SPUILabelDefinitions.VAR_DESC).setValue(distributionSet.getDescription());
item.getItemProperty(SPUILabelDefinitions.VAR_VERSION).setValue(distributionSet.getVersion());
item.getItemProperty(SPUILabelDefinitions.VAR_CREATED_BY)
.setValue(HawkbitCommonUtil.getIMUser(distributionSet.getCreatedBy()));
item.getItemProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY)
.setValue(HawkbitCommonUtil.getIMUser(distributionSet.getLastModifiedBy()));
item.getItemProperty(SPUILabelDefinitions.VAR_CREATED_DATE)
.setValue(SPDateTimeUtil.getFormattedDate(distributionSet.getCreatedAt()));
item.getItemProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE)
.setValue(SPDateTimeUtil.getFormattedDate(distributionSet.getLastModifiedAt()));
item.getItemProperty(SPUILabelDefinitions.VAR_IS_DISTRIBUTION_COMPLETE).setValue(distributionSet.isComplete());
if (manageDistUIState.getSelectedDistributions().isPresent()) {
manageDistUIState.getSelectedDistributions().get().stream().forEach(dsNameId -> unselect(dsNameId));
}
select(distributionSet.getDistributionSetIdName());
}
private void addTableStyleGenerator() {
setCellStyleGenerator((source, itemId, propertyId) -> {
if (propertyId == null) {
@@ -525,13 +423,7 @@ public class DistributionSetTable extends AbstractTable {
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final DistributionTableEvent event) {
if (event.getDistributionComponentEvent() == DistributionComponentEvent.MINIMIZED) {
UI.getCurrent().access(() -> applyMinTableSettings());
} else if (event.getDistributionComponentEvent() == DistributionComponentEvent.MAXIMIZED) {
UI.getCurrent().access(() -> applyMaxTableSettings());
} else if (event.getDistributionComponentEvent() == DistributionComponentEvent.ADD_DISTRIBUTION) {
UI.getCurrent().access(() -> addDistributionSet(event.getDistributionSet()));
}
onBaseEntityEvent(event);
}
@EventBusListenerMethod(scope = EventScope.SESSION)
@@ -556,21 +448,28 @@ public class DistributionSetTable extends AbstractTable {
}
}
@PreDestroy
void destroy() {
/*
* It's good manners to do this, even though vaadin-spring will
* automatically unsubscribe when this UI is garbage collected.
*/
eventBus.unsubscribe(this);
@Override
protected Item addEntity(final DistributionSet baseEntity) {
final Item item = super.addEntity(baseEntity);
if (manageDistUIState.getSelectedDistributions().isPresent()) {
manageDistUIState.getSelectedDistributions().get().stream().forEach(this::unselect);
}
select(baseEntity.getDistributionSetIdName());
return item;
}
private void setNoDataAvailable() {
final int containerSize = getContainerDataSource().size();
if (containerSize == 0) {
manageDistUIState.setNoDataAvailableDist(true);
} else {
manageDistUIState.setNoDataAvailableDist(false);
}
@Override
@SuppressWarnings("unchecked")
protected void updateEntity(final DistributionSet baseEntity, final Item item) {
item.getItemProperty(SPUILabelDefinitions.DIST_ID).setValue(baseEntity.getId());
item.getItemProperty(SPUILabelDefinitions.VAR_IS_DISTRIBUTION_COMPLETE).setValue(baseEntity.isComplete());
super.updateEntity(baseEntity, item);
}
@Override
protected void setDataAvailable(final boolean available) {
manageDistUIState.setNoDataAvailableDist(!available);
}
}

View File

@@ -9,12 +9,12 @@
package org.eclipse.hawkbit.ui.distributions.dstable;
import org.eclipse.hawkbit.ui.common.table.AbstractTableHeader;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.distributions.event.DistributionsUIEvent;
import org.eclipse.hawkbit.ui.distributions.event.DragEvent;
import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState;
import org.eclipse.hawkbit.ui.management.dstable.DistributionAddUpdateWindowLayout;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent.DistributionComponentEvent;
import org.eclipse.hawkbit.ui.management.event.DistributionTableFilterEvent;
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
import org.springframework.beans.factory.annotation.Autowired;
@@ -125,13 +125,13 @@ public class DistributionSetTableHeader extends AbstractTableHeader {
@Override
public void maximizeTable() {
manageDistUIstate.setDsTableMaximized(Boolean.TRUE);
eventbus.publish(this, new DistributionTableEvent(DistributionComponentEvent.MAXIMIZED, null));
eventbus.publish(this, new DistributionTableEvent(BaseEntityEventType.MAXIMIZED, null));
}
@Override
public void minimizeTable() {
manageDistUIstate.setDsTableMaximized(Boolean.FALSE);
eventbus.publish(this, new DistributionTableEvent(DistributionComponentEvent.MINIMIZED, null));
eventbus.publish(this, new DistributionTableEvent(BaseEntityEventType.MINIMIZED, null));
}
@Override

View File

@@ -20,6 +20,7 @@ import org.eclipse.hawkbit.repository.model.DistributionSetIdName;
import org.eclipse.hawkbit.repository.model.DistributionSetType;
import org.eclipse.hawkbit.repository.model.SoftwareModuleIdName;
import org.eclipse.hawkbit.ui.common.footer.AbstractDeleteActionsLayout;
import org.eclipse.hawkbit.ui.common.table.AbstractTable;
import org.eclipse.hawkbit.ui.distributions.event.DistributionsUIEvent;
import org.eclipse.hawkbit.ui.distributions.event.DistributionsViewAcceptCriteria;
import org.eclipse.hawkbit.ui.distributions.event.DragEvent;
@@ -37,7 +38,6 @@ import com.vaadin.event.dd.DragAndDropEvent;
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
import com.vaadin.spring.annotation.ViewScope;
import com.vaadin.ui.Component;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.Table.TableTransferable;
import com.vaadin.ui.UI;
@@ -189,13 +189,8 @@ public class DSDeleteActionsLayout extends AbstractDeleteActionsLayout {
private void addInDeleteDistributionList(final Table sourceTable, final TableTransferable transferable) {
@SuppressWarnings("unchecked")
final Set<DistributionSetIdName> distSelected = (Set<DistributionSetIdName>) sourceTable.getValue();
final Set<DistributionSetIdName> distributionIdNameSet = new HashSet<>();
if (!distSelected.contains(transferable.getData(SPUIDefinitions.ITEMID))) {
distributionIdNameSet.add((DistributionSetIdName) transferable.getData(SPUIDefinitions.ITEMID));
} else {
distributionIdNameSet.addAll(distSelected);
}
final AbstractTable<?, DistributionSetIdName> table = (AbstractTable<?, DistributionSetIdName>) sourceTable;
final Set<DistributionSetIdName> distributionIdNameSet = table.getDeletedEntityByTransferable(transferable);
/*
* Flags to identify whether all dropped distributions are already in
* the deleted list (or) some distributions are already in the deleted
@@ -225,15 +220,10 @@ public class DSDeleteActionsLayout extends AbstractDeleteActionsLayout {
}
private void addToSWDeleteList(final Table sourceTable, final TableTransferable transferable) {
@SuppressWarnings("unchecked")
final Set<Long> swModuleSelected = (Set<Long>) sourceTable.getValue();
final Set<Long> swModuleIdNameSet = new HashSet<>();
if (!swModuleSelected.contains(transferable.getData(SPUIDefinitions.ITEMID))) {
swModuleIdNameSet.add((Long) transferable.getData(SPUIDefinitions.ITEMID));
} else {
swModuleIdNameSet.addAll(swModuleSelected);
}
final AbstractTable<?, Long> swTable = (AbstractTable<?, Long>) sourceTable;
final Set<Long> swModuleIdNameSet = swTable.getDeletedEntityByTransferable(transferable);
swModuleIdNameSet.forEach(id -> {
final String swModuleName = (String) sourceTable.getContainerDataSource().getItem(id)
.getItemProperty(SPUILabelDefinitions.NAME_VERSION).getValue();
@@ -296,7 +286,7 @@ public class DSDeleteActionsLayout extends AbstractDeleteActionsLayout {
@Override
protected Component getUnsavedActionsWindowContent() {
distConfirmationWindowLayout.init();
distConfirmationWindowLayout.initialize();
return distConfirmationWindowLayout;
}
@@ -316,35 +306,6 @@ public class DSDeleteActionsLayout extends AbstractDeleteActionsLayout {
return unSavedActionsTables || unSavedActionsTypes;
}
@Override
protected boolean hasCountMessage() {
return false;
}
@Override
protected Label getCountMessageLabel() {
return null;
}
@Override
protected boolean hasBulkUploadPermission() {
return false;
}
@Override
protected void showBulkUploadWindow() {
/**
* Bulk upload not supported No implementation required.
*/
}
@Override
protected void restoreBulkUploadStatusCount() {
/**
* No implementation required.As no bulk upload in Distribution view.
*/
}
private DistributionSetType getCurrentDistributionSetType() {
return systemManagement.getTenantMetadata().getDefaultDsType();
}

View File

@@ -8,7 +8,6 @@
*/
package org.eclipse.hawkbit.ui.distributions.footer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -17,8 +16,6 @@ import java.util.Map.Entry;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.PostConstruct;
import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.SoftwareManagement;
import org.eclipse.hawkbit.repository.model.DistributionSet;
@@ -32,13 +29,11 @@ import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
import org.eclipse.hawkbit.ui.distributions.event.SaveActionWindowEvent;
import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState;
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.spring.events.EventBus;
import org.vaadin.spring.events.EventScope;
import org.vaadin.spring.events.annotation.EventBusListenerMethod;
@@ -48,6 +43,7 @@ import com.vaadin.data.util.IndexedContainer;
import com.vaadin.server.FontAwesome;
import com.vaadin.spring.annotation.ViewScope;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Table.Align;
import com.vaadin.ui.themes.ValoTheme;
@@ -83,12 +79,6 @@ public class DistributionsConfirmationWindowLayout extends AbstractConfirmationW
private ConfirmationTab assignmnetTab;
@Autowired
private I18N i18n;
@Autowired
private transient EventBus.SessionEventBus eventBus;
@Autowired
private transient DistributionSetManagement dsManagement;
@@ -98,20 +88,6 @@ public class DistributionsConfirmationWindowLayout extends AbstractConfirmationW
@Autowired
private ManageDistUIState manageDistUIState;
/**
* Initialze the component.
*/
@PostConstruct
public void init() {
super.inittialize();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.hawkbit.server.ui.common.confirmwindow.layout.
* AbstractConfirmationWindowLayout# getConfimrationTabs()
*/
@Override
protected Map<String, ConfirmationTab> getConfimrationTabs() {
final Map<String, ConfirmationTab> tabs = new HashMap<>();
@@ -161,26 +137,13 @@ public class DistributionsConfirmationWindowLayout extends AbstractConfirmationW
/* Add the discard action column */
tab.getTable().addGeneratedColumn(SW_DISCARD_CHGS, (source, itemId, columnId) -> {
final Button deleteswIcon = SPUIComponentProvider.getButton("", "", SPUILabelDefinitions.DISCARD,
ValoTheme.BUTTON_TINY + " " + SPUIStyleDefinitions.REDICON, true, FontAwesome.REPLY,
SPUIButtonStyleSmallNoBorder.class);
deleteswIcon.setData(itemId);
deleteswIcon.setImmediate(true);
deleteswIcon.addClickListener(event -> discardSoftwareDelete(event, itemId, tab));
return deleteswIcon;
final ClickListener clickListener = event -> discardSoftwareDelete(event, itemId, tab);
return createDiscardButton(itemId, clickListener);
});
/* set the visible columns */
final List<Object> visibleColumnIds = new ArrayList<>();
final List<String> visibleColumnLabels = new ArrayList<>();
if (visibleColumnIds.isEmpty() && visibleColumnLabels.isEmpty()) {
visibleColumnIds.add(SW_MODULE_NAME_MSG);
visibleColumnIds.add(SW_DISCARD_CHGS);
visibleColumnLabels.add(i18n.get("upload.swModuleTable.header"));
visibleColumnLabels.add(i18n.get("header.second.deletetarget.table"));
}
tab.getTable().setVisibleColumns(visibleColumnIds.toArray());
tab.getTable().setColumnHeaders(visibleColumnLabels.toArray(new String[0]));
tab.getTable().setVisibleColumns(SW_MODULE_NAME_MSG, SW_DISCARD_CHGS);
tab.getTable().setColumnHeaders(i18n.get("upload.swModuleTable.header"),
i18n.get("header.second.deletetarget.table"));
tab.getTable().setColumnExpandRatio(SW_MODULE_NAME_MSG, SPUIDefinitions.TARGET_DISTRIBUTION_COLUMN_WIDTH);
tab.getTable().setColumnExpandRatio(SW_DISCARD_CHGS, SPUIDefinitions.DISCARD_COLUMN_WIDTH);
@@ -295,18 +258,9 @@ public class DistributionsConfirmationWindowLayout extends AbstractConfirmationW
return deleteIcon;
});
// set the visible columns
final List<Object> visibleColumnIds = new ArrayList<>();
final List<String> visibleColumnLabels = new ArrayList<>();
if (visibleColumnIds.isEmpty() && visibleColumnLabels.isEmpty()) {
visibleColumnIds.add(SW_MODULE_TYPE_NAME);
visibleColumnIds.add(DISCARD);
visibleColumnLabels.add(i18n.get("header.first.delete.swmodule.type.table"));
visibleColumnLabels.add(i18n.get("header.second.delete.swmodule.type.table"));
}
tab.getTable().setVisibleColumns(visibleColumnIds.toArray());
tab.getTable().setColumnHeaders(visibleColumnLabels.toArray(new String[0]));
tab.getTable().setVisibleColumns(SW_MODULE_TYPE_NAME, DISCARD);
tab.getTable().setColumnHeaders(i18n.get("header.first.delete.swmodule.type.table"),
i18n.get("header.second.delete.swmodule.type.table"));
tab.getTable().setColumnExpandRatio(SW_MODULE_TYPE_NAME, 2);
tab.getTable().setColumnExpandRatio(SW_DISCARD_CHGS, SPUIDefinitions.DISCARD_COLUMN_WIDTH);
@@ -383,26 +337,14 @@ public class DistributionsConfirmationWindowLayout extends AbstractConfirmationW
/* Add the discard action column */
tab.getTable().addGeneratedColumn(DISCARD, (source, itemId, columnId) -> {
final Button deleteswIcon = SPUIComponentProvider.getButton("", "", SPUILabelDefinitions.DISCARD,
ValoTheme.BUTTON_TINY + " " + SPUIStyleDefinitions.REDICON, true, FontAwesome.REPLY,
SPUIButtonStyleSmallNoBorder.class);
deleteswIcon.setData(itemId);
deleteswIcon.setImmediate(true);
deleteswIcon.addClickListener(event -> discardDistDelete(event, itemId, tab));
return deleteswIcon;
final ClickListener clickListener = event -> discardDistDelete(event, itemId, tab);
return createDiscardButton(itemId, clickListener);
});
/* set the visible columns */
final List<Object> visibleColumnIds = new ArrayList<>();
final List<String> visibleColumnLabels = new ArrayList<>();
if (visibleColumnIds.isEmpty() && visibleColumnLabels.isEmpty()) {
visibleColumnIds.add(DIST_NAME);
visibleColumnIds.add(DISCARD);
visibleColumnLabels.add(i18n.get("header.one.deletedist.table"));
visibleColumnLabels.add(i18n.get("header.second.deletedist.table"));
}
tab.getTable().setVisibleColumns(visibleColumnIds.toArray());
tab.getTable().setColumnHeaders(visibleColumnLabels.toArray(new String[0]));
tab.getTable().setVisibleColumns(DIST_NAME, DISCARD);
tab.getTable().setColumnHeaders(i18n.get("header.one.deletedist.table"),
i18n.get("header.second.deletedist.table"));
tab.getTable().setColumnExpandRatio(DIST_NAME, SPUIDefinitions.TARGET_DISTRIBUTION_COLUMN_WIDTH);
tab.getTable().setColumnExpandRatio(DISCARD, SPUIDefinitions.DISCARD_COLUMN_WIDTH);
@@ -495,30 +437,15 @@ public class DistributionsConfirmationWindowLayout extends AbstractConfirmationW
// Add the discard action column
tab.getTable().addGeneratedColumn(DISCARD, (source, itemId, columnId) -> {
final StringBuilder style = new StringBuilder(ValoTheme.BUTTON_TINY);
style.append(' ');
style.append(SPUIStyleDefinitions.REDICON);
final Button deleteIcon = SPUIComponentProvider.getButton("", "", SPUILabelDefinitions.DISCARD,
style.toString(), true, FontAwesome.REPLY, SPUIButtonStyleSmallNoBorder.class);
deleteIcon.setData(itemId);
deleteIcon.setImmediate(true);
deleteIcon.addClickListener(
event -> discardDistTypeDelete((String) ((Button) event.getComponent()).getData(), itemId, tab));
return deleteIcon;
final ClickListener clickListener = event -> discardDistTypeDelete(
(String) ((Button) event.getComponent()).getData(), itemId, tab);
return createDiscardButton(itemId, clickListener);
});
// set the visible columns
final List<Object> visibleColumnIds = new ArrayList<>();
final List<String> visibleColumnLabels = new ArrayList<>();
if (visibleColumnIds.isEmpty() && visibleColumnLabels.isEmpty()) {
visibleColumnIds.add(DIST_SET_NAME);
visibleColumnIds.add(DISCARD);
visibleColumnLabels.add(i18n.get("header.first.delete.dist.type.table"));
visibleColumnLabels.add(i18n.get("header.second.delete.dist.type.table"));
}
tab.getTable().setVisibleColumns(visibleColumnIds.toArray());
tab.getTable().setColumnHeaders(visibleColumnLabels.toArray(new String[0]));
tab.getTable().setVisibleColumns(DIST_SET_NAME, DISCARD);
tab.getTable().setColumnHeaders(i18n.get("header.first.delete.dist.type.table"),
i18n.get("header.second.delete.dist.type.table"));
tab.getTable().setColumnExpandRatio(DIST_SET_NAME, 2);
tab.getTable().setColumnExpandRatio(DISCARD, SPUIDefinitions.DISCARD_COLUMN_WIDTH);
@@ -610,20 +537,9 @@ public class DistributionsConfirmationWindowLayout extends AbstractConfirmationW
return deleteIcon;
});
// set the visible columns
final List<Object> visibleColumnIds = new ArrayList<>();
final List<String> visibleColumnLabels = new ArrayList<>();
if (visibleColumnIds.isEmpty() && visibleColumnLabels.isEmpty()) {
visibleColumnIds.add(DIST_NAME);
visibleColumnIds.add(SOFTWARE_MODULE_NAME);
visibleColumnIds.add(DISCARD);
visibleColumnLabels.add(i18n.get("header.dist.first.assignment.table"));
visibleColumnLabels.add(i18n.get("header.dist.second.assignment.table"));
visibleColumnLabels.add(i18n.get("header.third.assignment.table"));
}
assignmnetTab.getTable().setVisibleColumns(visibleColumnIds.toArray());
assignmnetTab.getTable().setColumnHeaders(visibleColumnLabels.toArray(new String[0]));
assignmnetTab.getTable().setVisibleColumns(DIST_NAME, SOFTWARE_MODULE_NAME, DISCARD);
assignmnetTab.getTable().setColumnHeaders(i18n.get("header.dist.first.assignment.table"),
i18n.get("header.dist.second.assignment.table"), i18n.get("header.third.assignment.table"));
assignmnetTab.getTable().setColumnExpandRatio(DIST_NAME, 2);
assignmnetTab.getTable().setColumnExpandRatio(SOFTWARE_MODULE_NAME, 2);

View File

@@ -10,9 +10,8 @@ package org.eclipse.hawkbit.ui.distributions.smtable;
import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType;
import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleAddUpdateWindow;
import org.eclipse.hawkbit.ui.common.detailslayout.AbstractTableDetailsLayout;
import org.eclipse.hawkbit.ui.common.detailslayout.AbstractNamedVersionedEntityTableDetailsLayout;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
@@ -36,7 +35,7 @@ import com.vaadin.ui.Window;
*/
@SpringComponent
@ViewScope
public class SwModuleDetails extends AbstractTableDetailsLayout {
public class SwModuleDetails extends AbstractNamedVersionedEntityTableDetailsLayout<SoftwareModule> {
private static final long serialVersionUID = -1052279281066089812L;
@@ -46,38 +45,16 @@ public class SwModuleDetails extends AbstractTableDetailsLayout {
@Autowired
private ManageDistUIState manageDistUIState;
private Long swModuleId;
private SoftwareModule selectedSwModule;
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final SoftwareModuleEvent softwareModuleEvent) {
if (softwareModuleEvent.getSoftwareModuleEventType() == SoftwareModuleEventType.SELECTED_SOFTWARE_MODULE
|| softwareModuleEvent
.getSoftwareModuleEventType() == SoftwareModuleEventType.UPDATED_SOFTWARE_MODULE) {
ui.access(() -> {
/**
* softwareModuleEvent.getSoftwareModule() is null when table
* has no data.
*/
if (softwareModuleEvent.getSoftwareModule() != null) {
selectedSwModule = softwareModuleEvent.getSoftwareModule();
populateData(true);
} else {
populateData(false);
}
});
} else if (softwareModuleEvent.getSoftwareModuleEventType() == SoftwareModuleEventType.MINIMIZED) {
showLayout();
} else if (softwareModuleEvent.getSoftwareModuleEventType() == SoftwareModuleEventType.MAXIMIZED) {
hideLayout();
}
onBaseEntityEvent(softwareModuleEvent);
}
@Override
protected void onEdit(final ClickEvent event) {
final Window addSoftwareModule = softwareModuleAddUpdateWindow.createUpdateSoftwareModuleWindow(swModuleId);
addSoftwareModule.setCaption(i18n.get("upload.caption.update.swmodule"));
final Window addSoftwareModule = softwareModuleAddUpdateWindow
.createUpdateSoftwareModuleWindow(getSelectedBaseEntityId());
addSoftwareModule.setCaption(getI18n().get("upload.caption.update.swmodule"));
UI.getCurrent().addWindow(addSoftwareModule);
addSoftwareModule.setVisible(Boolean.TRUE);
}
@@ -89,14 +66,14 @@ public class SwModuleDetails extends AbstractTableDetailsLayout {
@Override
protected void addTabs(final TabSheet detailsTab) {
detailsTab.addTab(createDetailsLayout(), i18n.get("caption.tab.details"), null);
detailsTab.addTab(createDescriptionLayout(), i18n.get("caption.tab.description"), null);
detailsTab.addTab(createLogLayout(), i18n.get("caption.logs.tab"), null);
detailsTab.addTab(createDetailsLayout(), getI18n().get("caption.tab.details"), null);
detailsTab.addTab(createDescriptionLayout(), getI18n().get("caption.tab.description"), null);
detailsTab.addTab(createLogLayout(), getI18n().get("caption.logs.tab"), null);
}
@Override
protected String getDefaultCaption() {
return i18n.get("upload.swModuleTable.header");
return getI18n().get("upload.swModuleTable.header");
}
@Override
@@ -109,19 +86,9 @@ public class SwModuleDetails extends AbstractTableDetailsLayout {
return manageDistUIState.isSwModuleTableMaximized();
}
@Override
protected void populateDetailsWidget() {
populateDetailsWidget(selectedSwModule);
}
@Override
protected void clearDetails() {
populateDetailsWidget(null);
}
@Override
protected Boolean hasEditPermission() {
return permissionChecker.hasUpdateDistributionPermission();
return getPermissionChecker().hasUpdateDistributionPermission();
}
@Override
@@ -129,81 +96,49 @@ public class SwModuleDetails extends AbstractTableDetailsLayout {
return null;
}
private void populateDetails(final SoftwareModule swModule) {
private void populateDetails() {
String maxAssign = HawkbitCommonUtil.SP_STRING_EMPTY;
if (swModule != null) {
if (swModule.getType().getMaxAssignments() == Integer.MAX_VALUE) {
maxAssign = i18n.get("label.multiAssign.type");
if (getSelectedBaseEntity() != null) {
if (getSelectedBaseEntity().getType().getMaxAssignments() == Integer.MAX_VALUE) {
maxAssign = getI18n().get("label.multiAssign.type");
} else {
maxAssign = i18n.get("label.singleAssign.type");
maxAssign = getI18n().get("label.singleAssign.type");
}
updateSwModuleDetailsLayout(swModule.getType().getName(), swModule.getVendor(), maxAssign);
updateSwModuleDetailsLayout(getSelectedBaseEntity().getType().getName(),
getSelectedBaseEntity().getVendor(), maxAssign);
} else {
updateSwModuleDetailsLayout(HawkbitCommonUtil.SP_STRING_EMPTY, HawkbitCommonUtil.SP_STRING_EMPTY,
maxAssign);
}
}
private void populateDescription(final SoftwareModule sw) {
if (sw != null) {
updateDescriptionLayout(i18n.get("label.description"), sw.getDescription());
} else {
updateDescriptionLayout(i18n.get("label.description"), null);
}
}
private void updateSwModuleDetailsLayout(final String type, final String vendor, final String maxAssign) {
final VerticalLayout detailsTabLayout = getDetailsLayout();
detailsTabLayout.removeAllComponents();
final Label vendorLabel = SPUIComponentProvider.createNameValueLabel(i18n.get("label.dist.details.vendor"),
final Label vendorLabel = SPUIComponentProvider.createNameValueLabel(getI18n().get("label.dist.details.vendor"),
HawkbitCommonUtil.trimAndNullIfEmpty(vendor) == null ? "" : vendor);
vendorLabel.setId(SPUIComponetIdProvider.DETAILS_VENDOR_LABEL_ID);
detailsTabLayout.addComponent(vendorLabel);
if (type != null) {
final Label typeLabel = SPUIComponentProvider.createNameValueLabel(i18n.get("label.dist.details.type"),
final Label typeLabel = SPUIComponentProvider.createNameValueLabel(getI18n().get("label.dist.details.type"),
type);
typeLabel.setId(SPUIComponetIdProvider.DETAILS_TYPE_LABEL_ID);
detailsTabLayout.addComponent(typeLabel);
}
final Label assignLabel = SPUIComponentProvider.createNameValueLabel(i18n.get("label.assigned.type"),
final Label assignLabel = SPUIComponentProvider.createNameValueLabel(getI18n().get("label.assigned.type"),
HawkbitCommonUtil.trimAndNullIfEmpty(maxAssign) == null ? "" : maxAssign);
assignLabel.setId(SPUIComponetIdProvider.SWM_DTLS_MAX_ASSIGN);
detailsTabLayout.addComponent(assignLabel);
}
private void populateLog(final SoftwareModule softwareModule) {
if (null != softwareModule) {
updateLogLayout(getLogLayout(), softwareModule.getLastModifiedAt(), softwareModule.getLastModifiedBy(),
softwareModule.getCreatedAt(), softwareModule.getCreatedBy(), i18n);
} else {
updateLogLayout(getLogLayout(), null, HawkbitCommonUtil.SP_STRING_EMPTY, null, null, i18n);
}
}
public void setSwModuleId(final Long swModuleId) {
this.swModuleId = swModuleId;
}
private void populateDetailsWidget(final SoftwareModule swModule) {
if (swModule != null) {
setSwModuleId(swModule.getId());
setName(getDefaultCaption(),
HawkbitCommonUtil.getFormattedNameVersion(swModule.getName(), swModule.getVersion()));
populateDetails(swModule);
populateDescription(swModule);
populateLog(swModule);
} else {
setSwModuleId(null);
setName(getDefaultCaption(), HawkbitCommonUtil.SP_STRING_EMPTY);
populateDetails(null);
populateDescription(null);
populateLog(null);
}
@Override
protected void populateDetailsWidget() {
populateDetails();
}
@Override

View File

@@ -8,34 +8,26 @@
*/
package org.eclipse.hawkbit.ui.distributions.smtable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.repository.SoftwareManagement;
import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.ui.artifacts.details.ArtifactDetailsLayout;
import org.eclipse.hawkbit.ui.artifacts.event.SMFilterEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType;
import org.eclipse.hawkbit.ui.common.table.AbstractTable;
import org.eclipse.hawkbit.ui.common.ManagmentEntityState;
import org.eclipse.hawkbit.ui.common.table.AbstractNamedVersionTable;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
import org.eclipse.hawkbit.ui.distributions.event.DistributionsUIEvent;
import org.eclipse.hawkbit.ui.distributions.event.DistributionsViewAcceptCriteria;
import org.eclipse.hawkbit.ui.distributions.event.DragEvent;
import org.eclipse.hawkbit.ui.distributions.event.SaveActionWindowEvent;
import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
@@ -45,7 +37,6 @@ 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;
@@ -71,19 +62,13 @@ import com.vaadin.ui.Window;
*/
@SpringComponent
@ViewScope
public class SwModuleTable extends AbstractTable {
public class SwModuleTable extends AbstractNamedVersionTable<SoftwareModule, Long> {
private static final long serialVersionUID = 6785314784507424750L;
@Autowired
private I18N i18n;
@Autowired
private ManageDistUIState manageDistUIState;
@Autowired
private transient EventBus.SessionEventBus eventBus;
@Autowired
private transient SoftwareManagement softwareManagement;
@@ -97,21 +82,9 @@ public class SwModuleTable extends AbstractTable {
* Initialize the filter layout.
*/
@Override
@PostConstruct
protected void init() {
super.init();
eventBus.subscribe(this);
styleTableOnDistSelection();
setNoDataAvailable();
}
@PreDestroy
void destroy() {
/*
* It's good manners to do this, even though vaadin-spring will
* automatically unsubscribe when this UI is garbage collected.
*/
eventBus.unsubscribe(this);
}
/* All event Listeners */
@@ -148,13 +121,7 @@ public class SwModuleTable extends AbstractTable {
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final SoftwareModuleEvent event) {
if (event.getSoftwareModuleEventType() == SoftwareModuleEventType.MINIMIZED) {
UI.getCurrent().access(() -> applyMinTableSettings());
} else if (event.getSoftwareModuleEventType() == SoftwareModuleEventType.MAXIMIZED) {
UI.getCurrent().access(() -> applyMaxTableSettings());
} else if (event.getSoftwareModuleEventType() == SoftwareModuleEventType.NEW_SOFTWARE_MODULE) {
UI.getCurrent().access(() -> addSoftwareModule(event.getSoftwareModule()));
}
onBaseEntityEvent(event);
}
@Override
@@ -237,56 +204,43 @@ public class SwModuleTable extends AbstractTable {
return manageDistUIState.isSwModuleTableMaximized();
}
@SuppressWarnings("rawtypes")
@Override
protected void onValueChange() {
eventBus.publish(this, DragEvent.HIDE_DROP_HINT);
@SuppressWarnings("unchecked")
final Set<Long> values = (Set) getValue();
if (values != null && !values.isEmpty()) {
final Iterator<Long> iterator = values.iterator();
Long value = null;
while (iterator.hasNext()) {
value = iterator.next();
}
if (null != value) {
manageDistUIState.setSelectedBaseSwModuleId(value);
final SoftwareModule baseSoftwareModule = softwareManagement.findSoftwareModuleById(value);
manageDistUIState.setSelectedSoftwareModules(values);
eventBus.publish(this,
new SoftwareModuleEvent(SoftwareModuleEventType.SELECTED_SOFTWARE_MODULE, baseSoftwareModule));
}
} else {
manageDistUIState.setSelectedBaseSwModuleId(null);
manageDistUIState.setSelectedSoftwareModules(Collections.emptySet());
eventBus.publish(this, new SoftwareModuleEvent(SoftwareModuleEventType.SELECTED_SOFTWARE_MODULE, null));
}
protected void publishEntityAfterValueChange(final SoftwareModule selectedLastEntity) {
eventBus.publish(this, new SoftwareModuleEvent(BaseEntityEventType.SELECTED_ENTITY, selectedLastEntity));
}
@Override
protected void setManagementEntitiyStateValues(final Set<Long> values, final Long lastId) {
manageDistUIState.setSelectedBaseSwModuleId(lastId);
manageDistUIState.setSelectedSoftwareModules(values);
}
@Override
protected SoftwareModule findEntityByTableValue(final Long lastSelectedId) {
return softwareManagement.findSoftwareModuleById(lastSelectedId);
}
@Override
protected ManagmentEntityState<Long> getManagmentEntityState() {
return null;
}
@Override
protected List<TableColumn> getTableVisibleColumns() {
final List<TableColumn> columnList = new ArrayList<>();
final List<TableColumn> columnList = super.getTableVisibleColumns();
if (isMaximized()) {
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_NAME, i18n.get("header.name"), 0.2F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_VERSION, i18n.get("header.version"), 0.1F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_VENDOR, i18n.get("header.vendor"), 0.1f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_BY, i18n.get("header.createdBy"), 0.1F));
columnList
.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_DATE, i18n.get("header.createdDate"), 0.1F));
columnList.add(
new TableColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY, i18n.get("header.modifiedBy"), 0.1F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE, i18n.get("header.modifiedDate"),
0.1F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_DESC, i18n.get("header.description"), 0.2F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_VENDOR, i18n.get("header.vendor"), 0.1F));
} else {
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_NAME, i18n.get("header.name"), 0.7F));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_VERSION, i18n.get("header.version"), 0.2F));
columnList.add(new TableColumn(SPUILabelDefinitions.ARTIFACT_ICON, "", 0.1F));
}
return columnList;
}
@Override
protected float getColumnNameMinimizedSize() {
return 0.7F;
}
@Override
protected DropHandler getTableDropHandler() {
return new DropHandler() {
@@ -369,30 +323,27 @@ public class SwModuleTable extends AbstractTable {
return name + "." + version;
}
@SuppressWarnings("unchecked")
private void addSoftwareModule(final SoftwareModule swModule) {
final Object addItem = addItem();
final Item item = getItem(addItem);
final String swNameVersion = HawkbitCommonUtil.concatStrings(":", swModule.getName(), swModule.getVersion());
item.getItemProperty(SPUILabelDefinitions.NAME_VERSION).setValue(swNameVersion);
item.getItemProperty("swId").setValue(swModule.getId());
item.getItemProperty(SPUILabelDefinitions.VAR_ID).setValue(swModule.getId());
item.getItemProperty(SPUILabelDefinitions.VAR_DESC).setValue(swModule.getDescription());
item.getItemProperty(SPUILabelDefinitions.VAR_VERSION).setValue(swModule.getVersion());
item.getItemProperty(SPUILabelDefinitions.VAR_NAME).setValue(swModule.getName());
item.getItemProperty(SPUILabelDefinitions.VAR_VENDOR).setValue(swModule.getVendor());
item.getItemProperty(SPUILabelDefinitions.VAR_CREATED_BY).setValue(swModule.getCreatedBy());
item.getItemProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY).setValue(swModule.getLastModifiedBy());
item.getItemProperty(SPUILabelDefinitions.VAR_CREATED_DATE)
.setValue(SPDateTimeUtil.getFormattedDate(swModule.getCreatedAt()));
item.getItemProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE)
.setValue(SPDateTimeUtil.getFormattedDate(swModule.getLastModifiedAt()));
@Override
protected Item addEntity(final SoftwareModule baseEntity) {
final Item item = super.addEntity(baseEntity);
item.getItemProperty(SPUILabelDefinitions.VAR_COLOR).setValue(swModule.getType().getColour());
if (!manageDistUIState.getSelectedSoftwareModules().isEmpty()) {
manageDistUIState.getSelectedSoftwareModules().stream().forEach(swmNameId -> unselect(swmNameId));
manageDistUIState.getSelectedSoftwareModules().stream().forEach(this::unselect);
}
select(swModule.getId());
select(baseEntity.getId());
return item;
}
@Override
@SuppressWarnings("unchecked")
protected void updateEntity(final SoftwareModule baseEntity, final Item item) {
final String swNameVersion = HawkbitCommonUtil.concatStrings(":", baseEntity.getName(),
baseEntity.getVersion());
item.getItemProperty(SPUILabelDefinitions.NAME_VERSION).setValue(swNameVersion);
item.getItemProperty("swId").setValue(baseEntity.getId());
item.getItemProperty(SPUILabelDefinitions.VAR_VENDOR).setValue(baseEntity.getVendor());
item.getItemProperty(SPUILabelDefinitions.VAR_COLOR).setValue(baseEntity.getType().getColour());
super.updateEntity(baseEntity, item);
}
private void showArtifactDetailsWindow(final Long itemId, final String nameVersionStr) {
@@ -431,13 +382,10 @@ public class SwModuleTable extends AbstractTable {
UI.getCurrent().addWindow(atrifactDtlsWindow);
}
private void setNoDataAvailable() {
final int conatinerSize = getContainerDataSource().size();
if (conatinerSize == 0) {
manageDistUIState.setNoDataAvilableSwModule(true);
} else {
manageDistUIState.setNoDataAvilableSwModule(false);
}
@Override
protected void setDataAvailable(final boolean available) {
manageDistUIState.setNoDataAvilableSwModule(!available);
}
}

View File

@@ -10,9 +10,9 @@ package org.eclipse.hawkbit.ui.distributions.smtable;
import org.eclipse.hawkbit.ui.artifacts.event.SMFilterEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent;
import org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleEvent.SoftwareModuleEventType;
import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleAddUpdateWindow;
import org.eclipse.hawkbit.ui.common.table.AbstractTableHeader;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.distributions.event.DistributionsUIEvent;
import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState;
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
@@ -37,7 +37,6 @@ public class SwModuleTableHeader extends AbstractTableHeader {
private static final long serialVersionUID = 242961845006626297L;
@Autowired
private ManageDistUIState manageDistUIState;
@@ -123,14 +122,14 @@ public class SwModuleTableHeader extends AbstractTableHeader {
@Override
public void maximizeTable() {
manageDistUIState.setSwModuleTableMaximized(Boolean.TRUE);
eventbus.publish(this, new SoftwareModuleEvent(SoftwareModuleEventType.MAXIMIZED, null));
eventbus.publish(this, new SoftwareModuleEvent(BaseEntityEventType.MAXIMIZED, null));
}
@Override
public void minimizeTable() {
manageDistUIState.setSwModuleTableMaximized(Boolean.FALSE);
eventbus.publish(this, new SoftwareModuleEvent(SoftwareModuleEventType.MINIMIZED, null));
eventbus.publish(this, new SoftwareModuleEvent(BaseEntityEventType.MINIMIZED, null));
}
@Override

View File

@@ -18,6 +18,7 @@ import java.util.Set;
import org.eclipse.hawkbit.repository.model.DistributionSetIdName;
import org.eclipse.hawkbit.repository.model.SoftwareModuleIdName;
import org.eclipse.hawkbit.ui.common.ManagmentEntityState;
import org.springframework.beans.factory.annotation.Autowired;
import com.vaadin.spring.annotation.SpringComponent;
@@ -30,7 +31,7 @@ import com.vaadin.spring.annotation.VaadinSessionScope;
*/
@SpringComponent
@VaadinSessionScope
public class ManageDistUIState implements Serializable {
public class ManageDistUIState implements ManagmentEntityState<DistributionSetIdName>, Serializable {
private static final long serialVersionUID = -7569047247017742928L;
@@ -101,26 +102,23 @@ public class ManageDistUIState implements Serializable {
* @return the slectedDistributions
*/
public Optional<Set<DistributionSetIdName>> getSelectedDistributions() {
return selectedDistributions == null ? Optional.empty() : Optional.of(selectedDistributions);
return Optional.ofNullable(selectedDistributions);
}
/**
* @return the lastSelectedDistribution
*/
public Optional<DistributionSetIdName> getLastSelectedDistribution() {
return lastSelectedDistribution == null ? Optional.empty() : Optional.of(lastSelectedDistribution);
return Optional.ofNullable(lastSelectedDistribution);
}
/**
* @param lastSelectedDistribution
* the lastSelectedDistribution to set
*/
public void setLastSelectedDistribution(final DistributionSetIdName lastSelectedDistribution) {
this.lastSelectedDistribution = lastSelectedDistribution;
@Override
public void setLastSelectedEntity(final DistributionSetIdName value) {
this.lastSelectedDistribution = value;
}
public void setSelectedDistributions(final Set<DistributionSetIdName> slectedDistributions) {
selectedDistributions = slectedDistributions;
public void setSelectedEnitities(final Set<DistributionSetIdName> values) {
selectedDistributions = values;
}
/**
@@ -141,7 +139,7 @@ public class ManageDistUIState implements Serializable {
* @return the selectedBaseSwModuleId
*/
public Optional<Long> getSelectedBaseSwModuleId() {
return selectedBaseSwModuleId != null ? Optional.of(selectedBaseSwModuleId) : Optional.empty();
return Optional.ofNullable(selectedBaseSwModuleId);
}
/**

View File

@@ -12,6 +12,7 @@ import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.repository.SpPermissionChecker;
import org.eclipse.hawkbit.ui.HawkbitUI;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.management.actionhistory.ActionHistoryComponent;
import org.eclipse.hawkbit.ui.management.dstable.DistributionTableLayout;
import org.eclipse.hawkbit.ui.management.dstag.DistributionTagLayout;
@@ -108,19 +109,18 @@ public class DeploymentView extends VerticalLayout implements View, BrowserWindo
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final DistributionTableEvent event) {
if (event.getDistributionComponentEvent() == DistributionTableEvent.DistributionComponentEvent.MINIMIZED) {
if (BaseEntityEventType.MINIMIZED == event.getEventType()) {
minimizeDistTable();
} else if (event
.getDistributionComponentEvent() == DistributionTableEvent.DistributionComponentEvent.MAXIMIZED) {
} else if (BaseEntityEventType.MAXIMIZED == event.getEventType()) {
maximizeDistTable();
}
}
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final TargetTableEvent event) {
if (event.getTargetComponentEvent() == TargetTableEvent.TargetComponentEvent.MINIMIZED) {
if (BaseEntityEventType.MINIMIZED == event.getEventType()) {
minimizeTargetTable();
} else if (event.getTargetComponentEvent() == TargetTableEvent.TargetComponentEvent.MAXIMIZED) {
} else if (BaseEntityEventType.MAXIMIZED == event.getEventType()) {
maximizeTargetTable();
}
}

View File

@@ -12,8 +12,8 @@ import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.management.event.TargetTableEvent;
import org.eclipse.hawkbit.ui.management.event.TargetTableEvent.TargetComponentEvent;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import org.springframework.beans.factory.annotation.Autowired;
import org.vaadin.spring.events.EventBus;
@@ -62,9 +62,9 @@ public class ActionHistoryComponent extends VerticalLayout {
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final TargetTableEvent targetUIEvent) {
if (targetUIEvent.getTargetComponentEvent() == TargetComponentEvent.SELECTED_TARGET) {
if (BaseEntityEventType.SELECTED_ENTITY == targetUIEvent.getEventType()) {
setData(SPUIDefinitions.DATA_AVAILABLE);
UI.getCurrent().access(() -> populateActionHistoryDetails(targetUIEvent.getTarget()));
UI.getCurrent().access(() -> populateActionHistoryDetails(targetUIEvent.getEntity()));
}
}

View File

@@ -25,11 +25,11 @@ import org.eclipse.hawkbit.repository.model.ActionStatus;
import org.eclipse.hawkbit.repository.model.ActionWithStatusCount;
import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.ui.common.ConfirmationDialog;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.management.event.ManagementUIEvent;
import org.eclipse.hawkbit.ui.management.event.PinUnpinEvent;
import org.eclipse.hawkbit.ui.management.event.TargetTableEvent;
import org.eclipse.hawkbit.ui.management.event.TargetTableEvent.TargetComponentEvent;
import org.eclipse.hawkbit.ui.management.state.ManagementUIState;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.I18N;
@@ -855,11 +855,7 @@ public class ActionHistoryTable extends TreeTable implements Handler {
}
private void updateTargetAndDsTable() {
/*
* Update the target status in the Target table and update the color
* settings for DS in DS table.
*/
eventBus.publish(this, new TargetTableEvent(TargetComponentEvent.EDIT_TARGET, target));
eventBus.publish(this, new TargetTableEvent(BaseEntityEventType.UPDATED_ENTITY, target));
updateDistributionTableStyle();
}

View File

@@ -23,10 +23,10 @@ import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.DistributionSetType;
import org.eclipse.hawkbit.repository.model.TenantMetaData;
import org.eclipse.hawkbit.ui.common.DistributionSetTypeBeanQuery;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent.DistributionComponentEvent;
import org.eclipse.hawkbit.ui.management.event.DragEvent;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.I18N;
@@ -260,8 +260,7 @@ public class DistributionAddUpdateWindowLayout extends VerticalLayout {
notificationMessage.displaySuccess(i18n.get("message.new.dist.save.success",
new Object[] { currentDS.getName(), currentDS.getVersion() }));
// update table row+details layout
eventBus.publish(this,
new DistributionTableEvent(DistributionComponentEvent.EDIT_DISTRIBUTION, currentDS));
eventBus.publish(this, new DistributionTableEvent(BaseEntityEventType.UPDATED_ENTITY, currentDS));
} catch (final EntityAlreadyExistsException entityAlreadyExistsException) {
LOG.error("Update distribution failed {}", entityAlreadyExistsException);
notificationMessage.displayValidationError(
@@ -307,7 +306,7 @@ public class DistributionAddUpdateWindowLayout extends VerticalLayout {
/* close the window */
closeThisWindow();
eventBus.publish(this, new DistributionTableEvent(DistributionComponentEvent.ADD_DISTRIBUTION, newDist));
eventBus.publish(this, new DistributionTableEvent(BaseEntityEventType.NEW_ENTITY, newDist));
}
}

View File

@@ -9,14 +9,12 @@
package org.eclipse.hawkbit.ui.management.dstable;
import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.ui.common.detailslayout.AbstractTableDetailsLayout;
import org.eclipse.hawkbit.ui.common.detailslayout.AbstractNamedVersionedEntityTableDetailsLayout;
import org.eclipse.hawkbit.ui.common.detailslayout.SoftwareModuleDetailsTable;
import org.eclipse.hawkbit.ui.common.tagdetails.DistributionTagToken;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent.DistributionComponentEvent;
import org.eclipse.hawkbit.ui.management.state.ManagementUIState;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.vaadin.spring.events.EventScope;
@@ -36,11 +34,10 @@ import com.vaadin.ui.Window;
*/
@SpringComponent
@ViewScope
public class DistributionDetails extends AbstractTableDetailsLayout {
public class DistributionDetails extends AbstractNamedVersionedEntityTableDetailsLayout<DistributionSet> {
private static final long serialVersionUID = 350360207334118826L;
@Autowired
private ManagementUIState managementUIState;
@@ -52,61 +49,37 @@ public class DistributionDetails extends AbstractTableDetailsLayout {
private SoftwareModuleDetailsTable softwareModuleTable;
private Long dsId;
private DistributionSet selectedDsModule;
@Override
protected void init() {
softwareModuleTable = new SoftwareModuleDetailsTable();
softwareModuleTable.init(i18n, false, permissionChecker, null, null, null);
softwareModuleTable.init(getI18n(), false, getPermissionChecker(), null, null, null);
super.init();
}
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final DistributionTableEvent distributionTableEvent) {
if (distributionTableEvent.getDistributionComponentEvent() == DistributionComponentEvent.ON_VALUE_CHANGE
|| distributionTableEvent
.getDistributionComponentEvent() == DistributionComponentEvent.EDIT_DISTRIBUTION) {
ui.access(() -> {
/**
* distributionTableEvent.getDistributionSet() is null when
* table has no data.
*/
if (distributionTableEvent.getDistributionSet() != null) {
selectedDsModule = distributionTableEvent.getDistributionSet();
populateData(true);
} else {
populateData(false);
}
});
} else if (distributionTableEvent.getDistributionComponentEvent() == DistributionComponentEvent.MINIMIZED) {
ui.access(() -> showLayout());
} else if (distributionTableEvent.getDistributionComponentEvent() == DistributionComponentEvent.MAXIMIZED) {
ui.access(() -> hideLayout());
}
onBaseEntityEvent(distributionTableEvent);
}
@Override
protected String getDefaultCaption() {
return i18n.get("distribution.details.header");
return getI18n().get("distribution.details.header");
}
@Override
protected void addTabs(final TabSheet detailsTab) {
detailsTab.addTab(createDetailsLayout(), i18n.get("caption.tab.details"), null);
detailsTab.addTab(createDescriptionLayout(), i18n.get("caption.tab.description"), null);
detailsTab.addTab(createSoftwareModuleTab(), i18n.get("caption.softwares.distdetail.tab"), null);
detailsTab.addTab(createTagsLayout(), i18n.get("caption.tags.tab"), null);
detailsTab.addTab(createLogLayout(), i18n.get("caption.logs.tab"), null);
detailsTab.addTab(createDetailsLayout(), getI18n().get("caption.tab.details"), null);
detailsTab.addTab(createDescriptionLayout(), getI18n().get("caption.tab.description"), null);
detailsTab.addTab(createSoftwareModuleTab(), getI18n().get("caption.softwares.distdetail.tab"), null);
detailsTab.addTab(createTagsLayout(), getI18n().get("caption.tags.tab"), null);
detailsTab.addTab(createLogLayout(), getI18n().get("caption.logs.tab"), null);
}
@Override
protected void onEdit(final ClickEvent event) {
final Window newDistWindow = distributionAddUpdateWindowLayout.getWindow();
distributionAddUpdateWindowLayout.populateValuesOfDistribution(getDsId());
newDistWindow.setCaption(i18n.get("caption.update.dist"));
distributionAddUpdateWindowLayout.populateValuesOfDistribution(getSelectedBaseEntityId());
newDistWindow.setCaption(getI18n().get("caption.update.dist"));
UI.getCurrent().addWindow(newDistWindow);
newDistWindow.setVisible(Boolean.TRUE);
}
@@ -127,19 +100,9 @@ public class DistributionDetails extends AbstractTableDetailsLayout {
return managementUIState.isDsTableMaximized();
}
@Override
protected void populateDetailsWidget() {
populateDetailsWidget(selectedDsModule);
}
@Override
protected void clearDetails() {
populateDetailsWidget(null);
}
@Override
protected Boolean hasEditPermission() {
return permissionChecker.hasUpdateDistributionPermission();
return getPermissionChecker().hasUpdateDistributionPermission();
}
@Override
@@ -147,31 +110,11 @@ public class DistributionDetails extends AbstractTableDetailsLayout {
return SPUIComponetIdProvider.DISTRIBUTION_DETAILS_TABSHEET;
}
private void populateDetailsWidget(final DistributionSet dist) {
if (dist != null) {
setDsId(dist.getId());
setName(getDefaultCaption(), HawkbitCommonUtil.getFormattedNameVersion(dist.getName(), dist.getVersion()));
populateDetails(dist);
populateDescription(dist);
populateLog(dist);
softwareModuleTable.populateModule(dist);
} else {
setDsId(null);
setName(getDefaultCaption(), HawkbitCommonUtil.SP_STRING_EMPTY);
populateDetails(null);
populateDescription(null);
softwareModuleTable.populateModule(null);
populateLog(null);
}
}
@Override
protected void populateDetailsWidget() {
softwareModuleTable.populateModule(getSelectedBaseEntity());
populateDetails(getSelectedBaseEntity());
private void populateLog(final DistributionSet ds) {
if (null != ds) {
updateLogLayout(getLogLayout(), ds.getLastModifiedAt(), ds.getLastModifiedBy(), ds.getCreatedAt(),
ds.getCreatedBy(), i18n);
} else {
updateLogLayout(getLogLayout(), null, HawkbitCommonUtil.SP_STRING_EMPTY, null, null, i18n);
}
}
private void populateDetails(final DistributionSet ds) {
@@ -182,29 +125,21 @@ public class DistributionDetails extends AbstractTableDetailsLayout {
}
}
private void populateDescription(final DistributionSet ds) {
if (ds != null) {
updateDescriptionLayout(i18n.get("label.description"), ds.getDescription());
} else {
updateDescriptionLayout(i18n.get("label.description"), null);
}
}
private void updateDistributionDetailsLayout(final String type, final Boolean isMigrationRequired) {
final VerticalLayout detailsTabLayout = getDetailsLayout();
detailsTabLayout.removeAllComponents();
if (type != null) {
final Label typeLabel = SPUIComponentProvider.createNameValueLabel(i18n.get("label.dist.details.type"),
final Label typeLabel = SPUIComponentProvider.createNameValueLabel(getI18n().get("label.dist.details.type"),
type);
typeLabel.setId(SPUIComponetIdProvider.DETAILS_TYPE_LABEL_ID);
detailsTabLayout.addComponent(typeLabel);
}
if (isMigrationRequired != null) {
detailsTabLayout.addComponent(
SPUIComponentProvider.createNameValueLabel(i18n.get("checkbox.dist.migration.required"),
isMigrationRequired.equals(Boolean.TRUE) ? i18n.get("label.yes") : i18n.get("label.no")));
detailsTabLayout.addComponent(SPUIComponentProvider.createNameValueLabel(
getI18n().get("checkbox.dist.migration.required"),
isMigrationRequired.equals(Boolean.TRUE) ? getI18n().get("label.yes") : getI18n().get("label.no")));
}
}
@@ -221,14 +156,6 @@ public class DistributionDetails extends AbstractTableDetailsLayout {
return tagsLayout;
}
public Long getDsId() {
return dsId;
}
public void setDsId(final Long dsId) {
this.dsId = dsId;
}
@Override
protected String getDetailsHeaderCaptionId() {
return SPUIComponetIdProvider.DISTRIBUTION_DETAILS_HEADER_LABEL_ID;

View File

@@ -11,15 +11,12 @@ package org.eclipse.hawkbit.ui.management.dstable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.SpPermissionChecker;
import org.eclipse.hawkbit.repository.TargetManagement;
@@ -28,10 +25,11 @@ import org.eclipse.hawkbit.repository.model.DistributionSetIdName;
import org.eclipse.hawkbit.repository.model.DistributionSetTagAssignmentResult;
import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.repository.model.TargetIdName;
import org.eclipse.hawkbit.ui.common.table.AbstractNamedVersionTable;
import org.eclipse.hawkbit.ui.common.table.AbstractTable;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent.DistributionComponentEvent;
import org.eclipse.hawkbit.ui.management.event.DistributionTableFilterEvent;
import org.eclipse.hawkbit.ui.management.event.DragEvent;
import org.eclipse.hawkbit.ui.management.event.ManagementUIEvent;
@@ -40,8 +38,6 @@ import org.eclipse.hawkbit.ui.management.event.PinUnpinEvent;
import org.eclipse.hawkbit.ui.management.event.SaveActionWindowEvent;
import org.eclipse.hawkbit.ui.management.state.ManagementUIState;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
@@ -52,7 +48,6 @@ 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;
@@ -76,22 +71,16 @@ import com.vaadin.ui.UI;
*/
@SpringComponent
@ViewScope
public class DistributionTable extends AbstractTable {
public class DistributionTable extends AbstractNamedVersionTable<DistributionSet, DistributionSetIdName> {
private static final long serialVersionUID = -1928335256399519494L;
@Autowired
private I18N i18n;
@Autowired
private SpPermissionChecker permissionChecker;
@Autowired
private UINotification notification;
@Autowired
private transient EventBus.SessionEventBus eventBus;
@Autowired
private ManagementUIState managementUIState;
@@ -111,17 +100,9 @@ public class DistributionTable extends AbstractTable {
private Button distributinPinnedBtn;
@Override
@PostConstruct
protected void init() {
super.init();
eventBus.subscribe(this);
notAllowedMsg = i18n.get("message.action.not.allowed");
setNoDataAvailable();
}
@PreDestroy
void destroy() {
eventBus.unsubscribe(this);
}
/**
@@ -151,13 +132,12 @@ public class DistributionTable extends AbstractTable {
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final DistributionTableEvent event) {
if (event.getDistributionComponentEvent() == DistributionComponentEvent.MINIMIZED) {
UI.getCurrent().access(() -> applyMinTableSettings());
} else if (event.getDistributionComponentEvent() == DistributionComponentEvent.MAXIMIZED) {
UI.getCurrent().access(() -> applyMaxTableSettings());
} else if (event.getDistributionComponentEvent() == DistributionComponentEvent.EDIT_DISTRIBUTION) {
UI.getCurrent().access(() -> updateDistributionInTable(event.getDistributionSet()));
onBaseEntityEvent(event);
if (BaseEntityEventType.UPDATED_ENTITY != event.getEventType()) {
return;
}
UI.getCurrent().access(() -> updateDistributionInTable(event.getEntity()));
}
@EventBusListenerMethod(scope = EventScope.SESSION)
@@ -194,24 +174,11 @@ public class DistributionTable extends AbstractTable {
});
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.hawkbit.server.ui.common.table.AbstractTable#getTableId()
*/
@Override
protected String getTableId() {
return SPUIComponetIdProvider.DIST_TABLE_ID;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.hawkbit.server.ui.common.table.AbstractTable#createContainer(
* )
*/
@Override
protected Container createContainer() {
final Map<String, Object> queryConfiguration = prepareQueryConfigFilters();
@@ -272,31 +239,18 @@ public class DistributionTable extends AbstractTable {
}
@Override
protected void onValueChange() {
eventBus.publish(this, DragEvent.HIDE_DROP_HINT);
final Set<DistributionSetIdName> values = HawkbitCommonUtil.getSelectedDSDetails(this);
DistributionSetIdName value = null;
if (values != null && !values.isEmpty()) {
final Iterator<DistributionSetIdName> iterator = values.iterator();
protected DistributionSet findEntityByTableValue(final DistributionSetIdName lastSelectedId) {
return distributionSetManagement.findDistributionSetByIdWithDetails(lastSelectedId.getId());
}
while (iterator.hasNext()) {
value = iterator.next();
}
if (null != value) {
managementUIState.setSelectedDsIdName(values);
managementUIState.setLastSelectedDsIdName(value);
final DistributionSet lastSelectedDistSet = distributionSetManagement
.findDistributionSetByIdWithDetails(value.getId());
eventBus.publish(this,
new DistributionTableEvent(DistributionComponentEvent.ON_VALUE_CHANGE, lastSelectedDistSet));
}
} else {
managementUIState.setSelectedDsIdName(null);
managementUIState.setLastSelectedDsIdName(null);
eventBus.publish(this, new DistributionTableEvent(DistributionComponentEvent.ON_VALUE_CHANGE, null));
}
@Override
protected void publishEntityAfterValueChange(final DistributionSet selectedLastEntity) {
eventBus.publish(this, new DistributionTableEvent(BaseEntityEventType.SELECTED_ENTITY, selectedLastEntity));
}
@Override
protected ManagementUIState getManagmentEntityState() {
return managementUIState;
}
@Override
@@ -306,7 +260,17 @@ public class DistributionTable extends AbstractTable {
@Override
protected List<TableColumn> getTableVisibleColumns() {
return HawkbitCommonUtil.getTableVisibleColumns(isMaximized(), true, i18n);
final List<TableColumn> columnList = super.getTableVisibleColumns();
if (isMaximized()) {
return columnList;
}
columnList.add(new TableColumn(SPUILabelDefinitions.PIN_COLUMN, StringUtils.EMPTY, 0.1F));
return columnList;
}
@Override
protected float getColumnNameMinimizedSize() {
return 0.7F;
}
@Override
@@ -345,7 +309,7 @@ public class DistributionTable extends AbstractTable {
private void assignDsTag(final DragAndDropEvent event) {
final com.vaadin.event.dd.TargetDetails taregtDet = event.getTargetDetails();
final Table distTable = (Table) taregtDet.getTarget();
final Set<DistributionSetIdName> distsSelected = HawkbitCommonUtil.getSelectedDSDetails(distTable);
final Set<DistributionSetIdName> distsSelected = getTableValue(distTable);
final Set<Long> distList = new HashSet<>();
final AbstractSelectTargetDetails dropData = (AbstractSelectTargetDetails) event.getTargetDetails();
@@ -387,17 +351,12 @@ public class DistributionTable extends AbstractTable {
}
}
@SuppressWarnings("unchecked")
private void assignTargetToDs(final DragAndDropEvent event) {
final TableTransferable transferable = (TableTransferable) event.getTransferable();
final Table source = transferable.getSourceComponent();
final Set<TargetIdName> targetsSelected = HawkbitCommonUtil.getSelectedTargetDetails(source);
final Set<TargetIdName> targetDetailsList = new HashSet<>();
if (!targetsSelected.contains(transferable.getData("itemId"))) {
targetDetailsList.add((TargetIdName) transferable.getData("itemId"));
} else {
targetDetailsList.addAll(targetsSelected);
}
final AbstractTable<?, TargetIdName> source = (AbstractTable<?, TargetIdName>) transferable
.getSourceComponent();
final Set<TargetIdName> targetDetailsList = source.getDeletedEntityByTransferable(transferable);
final AbstractSelectTargetDetails dropData = (AbstractSelectTargetDetails) event.getTargetDetails();
@@ -502,17 +461,7 @@ public class DistributionTable extends AbstractTable {
private void updateDistributionInTable(final DistributionSet editedDs) {
final Item item = getContainerDataSource()
.getItem(new DistributionSetIdName(editedDs.getId(), editedDs.getName(), editedDs.getVersion()));
item.getItemProperty(SPUILabelDefinitions.VAR_NAME).setValue(editedDs.getName());
item.getItemProperty(SPUILabelDefinitions.VAR_VERSION).setValue(editedDs.getVersion());
item.getItemProperty(SPUILabelDefinitions.VAR_CREATED_BY)
.setValue(HawkbitCommonUtil.getIMUser(editedDs.getCreatedBy()));
item.getItemProperty(SPUILabelDefinitions.VAR_CREATED_DATE)
.setValue(SPDateTimeUtil.getFormattedDate(editedDs.getCreatedAt()));
item.getItemProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY)
.setValue(HawkbitCommonUtil.getIMUser(editedDs.getLastModifiedBy()));
item.getItemProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE)
.setValue(SPDateTimeUtil.getFormattedDate(editedDs.getLastModifiedAt()));
item.getItemProperty(SPUILabelDefinitions.VAR_DESC).setValue(editedDs.getDescription());
updateEntity(editedDs, item);
}
private void restoreDistributionTableStyle() {
@@ -703,12 +652,10 @@ public class DistributionTable extends AbstractTable {
this.distributinPinnedBtn = distributinPinnedBtn;
}
private void setNoDataAvailable() {
final int size = getContainerDataSource().size();
if (size == 0) {
managementUIState.setNoDataAvailableDistribution(true);
} else {
managementUIState.setNoDataAvailableDistribution(false);
}
@Override
protected void setDataAvailable(final boolean available) {
managementUIState.setNoDataAvailableDistribution(!available);
}
}

View File

@@ -9,8 +9,8 @@
package org.eclipse.hawkbit.ui.management.dstable;
import org.eclipse.hawkbit.ui.common.table.AbstractTableHeader;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent;
import org.eclipse.hawkbit.ui.management.event.DistributionTableEvent.DistributionComponentEvent;
import org.eclipse.hawkbit.ui.management.event.DistributionTableFilterEvent;
import org.eclipse.hawkbit.ui.management.event.DragEvent;
import org.eclipse.hawkbit.ui.management.event.ManagementUIEvent;
@@ -127,13 +127,13 @@ public class DistributionTableHeader extends AbstractTableHeader {
@Override
public void maximizeTable() {
managementUIState.setDsTableMaximized(Boolean.TRUE);
eventbus.publish(this, new DistributionTableEvent(DistributionComponentEvent.MAXIMIZED, null));
eventbus.publish(this, new DistributionTableEvent(BaseEntityEventType.MAXIMIZED, null));
}
@Override
public void minimizeTable() {
managementUIState.setDsTableMaximized(Boolean.FALSE);
eventbus.publish(this, new DistributionTableEvent(DistributionComponentEvent.MINIMIZED, null));
eventbus.publish(this, new DistributionTableEvent(BaseEntityEventType.MINIMIZED, null));
}
@Override

View File

@@ -9,50 +9,26 @@
package org.eclipse.hawkbit.ui.management.event;
import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEvent;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
/**
*
*
*
*/
public class DistributionTableEvent {
public class DistributionTableEvent extends BaseEntityEvent<DistributionSet> {
/**
*
*
* Constructor.
*
* @param eventType
* the event type
* @param entity
* the distribution set
*/
public enum DistributionComponentEvent {
ADD_DISTRIBUTION, EDIT_DISTRIBUTION, DELETE_DISTRIBUTION, ON_VALUE_CHANGE, MAXIMIZED, MINIMIZED
}
private DistributionComponentEvent distributionComponentEvent;
private DistributionSet distributionSet;
/**
* @param distributionComponentEvent
* @param distributionSet
*/
public DistributionTableEvent(final DistributionComponentEvent distributionComponentEvent,
final DistributionSet distributionSet) {
this.distributionComponentEvent = distributionComponentEvent;
this.distributionSet = distributionSet;
}
public DistributionComponentEvent getDistributionComponentEvent() {
return distributionComponentEvent;
}
public void setDistributionComponentEvent(final DistributionComponentEvent distributionComponentEvent) {
this.distributionComponentEvent = distributionComponentEvent;
}
public DistributionSet getDistributionSet() {
return distributionSet;
}
public void setDistributionSet(final DistributionSet distributionSet) {
this.distributionSet = distributionSet;
public DistributionTableEvent(final BaseEntityEventType eventType, final DistributionSet entity) {
super(eventType, entity);
}
}

View File

@@ -8,7 +8,6 @@
*/
package org.eclipse.hawkbit.ui.management.event;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@@ -17,6 +16,7 @@ import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.SpPermissionChecker;
import org.eclipse.hawkbit.repository.model.DistributionSetIdName;
import org.eclipse.hawkbit.repository.model.DistributionSetTagAssignmentResult;
import org.eclipse.hawkbit.ui.common.table.AbstractTable;
import org.eclipse.hawkbit.ui.management.state.DistributionTableFilters;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.I18N;
@@ -68,8 +68,6 @@ public class DistributionTagDropEvent implements DropHandler {
@Autowired
private ManagementViewAcceptCriteria managementViewAcceptCriteria;
private static final String ITEMID = "itemId";
@Override
public void drop(final DragAndDropEvent event) {
if (validate(event) && isNoTagAssigned(event)) {
@@ -132,23 +130,20 @@ public class DistributionTagDropEvent implements DropHandler {
final com.vaadin.event.dd.TargetDetails targetDetails = event.getTargetDetails();
final TableTransferable transferable = (TableTransferable) event.getTransferable();
final Table source = transferable.getSourceComponent();
@SuppressWarnings("unchecked")
final Set<DistributionSetIdName> distSelected = (Set<DistributionSetIdName>) source.getValue();
final Set<Long> distributionList = new HashSet<>();
if (!distSelected.contains(transferable.getData(ITEMID))) {
distributionList.add(((DistributionSetIdName) transferable.getData(ITEMID)).getId());
} else {
distributionList.addAll(distSelected.stream().map(t -> t.getId()).collect(Collectors.toList()));
}
final AbstractTable<?, DistributionSetIdName> source = (AbstractTable<?, DistributionSetIdName>) transferable
.getSourceComponent();
final Set<DistributionSetIdName> distSelected = source.getDeletedEntityByTransferable(transferable);
final Set<Long> distributionList = distSelected.stream().map(entity -> entity.getId())
.collect(Collectors.toSet());
final String distTagName = HawkbitCommonUtil.removePrefix(targetDetails.getTarget().getId(),
SPUIDefinitions.DISTRIBUTION_TAG_ID_PREFIXS);
final List<String> tagsClickedList = distFilterParameters.getDistSetTags();
final DistributionSetTagAssignmentResult result = distributionSetManagement.toggleTagAssignment(distributionList,
distTagName);
final DistributionSetTagAssignmentResult result = distributionSetManagement
.toggleTagAssignment(distributionList, distTagName);
notification.displaySuccess(HawkbitCommonUtil.createAssignmentMessage(distTagName, result, i18n));
if (result.getUnassigned() >= 1 && !tagsClickedList.isEmpty()) {

View File

@@ -9,7 +9,8 @@
package org.eclipse.hawkbit.ui.management.event;
import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.ui.management.event.TargetTableEvent.TargetComponentEvent;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEvent;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
/**
*
@@ -17,34 +18,18 @@ import org.eclipse.hawkbit.ui.management.event.TargetTableEvent.TargetComponentE
*
*
*/
public class TargetAddUpdateWindowEvent {
private final TargetComponentEvent targetComponentEvent;
private final Target target;
public class TargetAddUpdateWindowEvent extends BaseEntityEvent<Target> {
/**
* Constructor.
*
* @param eventType
* the event type
* @param target
* the target which has been created or modified
* @param entity
* the entity
*/
public TargetAddUpdateWindowEvent(final TargetComponentEvent eventType, final Target target) {
this.targetComponentEvent = eventType;
this.target = target;
public TargetAddUpdateWindowEvent(final BaseEntityEventType eventType, final Target entity) {
super(eventType, entity);
}
/**
* @return the targetComponentEvent
*/
public TargetComponentEvent getTargetComponentEvent() {
return targetComponentEvent;
}
/**
* @return the target
*/
public Target getTarget() {
return target;
}
}

View File

@@ -9,77 +9,51 @@
package org.eclipse.hawkbit.ui.management.event;
import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.repository.model.TargetIdName;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEvent;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
/**
*
*
*
*/
public class TargetTableEvent {
public class TargetTableEvent extends BaseEntityEvent<Target> {
/**
* Target table components events.
*
*/
public enum TargetComponentEvent {
REFRESH_TARGETS, EDIT_TARGET, DELETE_TARGET, SELECTED_TARGET, MAXIMIZED, MINIMIZED, SELLECT_ALL, BULK_TARGET_CREATED, BULK_UPLOAD_COMPLETED, BULK_TARGET_UPLOAD_STARTED, BULK_UPLOAD_PROCESS_STARTED
REFRESH_TARGETS, SELLECT_ALL, BULK_TARGET_CREATED, BULK_UPLOAD_COMPLETED, BULK_TARGET_UPLOAD_STARTED, BULK_UPLOAD_PROCESS_STARTED
}
private TargetComponentEvent targetComponentEvent;
private Target target;
private TargetIdName targetIdName;
/**
* Constructor.
*
* @param eventType
* the event type.
* @param entity
* the entity
*/
public TargetTableEvent(final BaseEntityEventType eventType, final Target entity) {
super(eventType, entity);
}
/**
* The component event.
*
* @param targetComponentEvent
* the target component event.
*/
public TargetTableEvent(final TargetComponentEvent targetComponentEvent) {
super();
super(null, null);
this.targetComponentEvent = targetComponentEvent;
}
/**
* @param targetComponentEvent
* @param target
*/
public TargetTableEvent(final TargetComponentEvent targetComponentEvent, final Target target) {
this(targetComponentEvent);
this.target = target;
}
/**
* @param targetComponentEvent
* @param targetIdName
*/
public TargetTableEvent(final TargetComponentEvent targetComponentEvent, final TargetIdName targetIdName) {
this(targetComponentEvent);
this.targetIdName = targetIdName;
}
public TargetComponentEvent getTargetComponentEvent() {
return targetComponentEvent;
}
public void setTargetComponentEvent(final TargetComponentEvent targetComponentEvent) {
this.targetComponentEvent = targetComponentEvent;
}
public Target getTarget() {
return target;
}
public void setTarget(final Target target) {
this.target = target;
}
public TargetIdName getTargetIdName() {
return targetIdName;
}
public void setTargetIdName(final TargetIdName targetIdName) {
this.targetIdName = targetIdName;
}
}

View File

@@ -95,8 +95,8 @@ public class CountMessageLabel extends Label {
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final TargetTableEvent event) {
if (event.getTargetComponentEvent() == TargetTableEvent.TargetComponentEvent.SELLECT_ALL
|| event.getTargetComponentEvent() == TargetComponentEvent.REFRESH_TARGETS) {
if (TargetTableEvent.TargetComponentEvent.SELLECT_ALL == event.getTargetComponentEvent()
|| TargetComponentEvent.REFRESH_TARGETS == event.getTargetComponentEvent()) {
displayTargetCountStatus();
}

View File

@@ -8,13 +8,13 @@
*/
package org.eclipse.hawkbit.ui.management.footer;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.hawkbit.repository.TagManagement;
import org.eclipse.hawkbit.repository.model.DistributionSetIdName;
import org.eclipse.hawkbit.repository.model.TargetIdName;
import org.eclipse.hawkbit.ui.common.footer.AbstractDeleteActionsLayout;
import org.eclipse.hawkbit.ui.common.table.AbstractTable;
import org.eclipse.hawkbit.ui.management.event.BulkUploadPopupEvent;
import org.eclipse.hawkbit.ui.management.event.DragEvent;
import org.eclipse.hawkbit.ui.management.event.ManagementUIEvent;
@@ -211,7 +211,7 @@ public class DeleteActionsLayout extends AbstractDeleteActionsLayout {
@Override
protected Component getUnsavedActionsWindowContent() {
manangementConfirmationWindowLayout.init();
manangementConfirmationWindowLayout.initialize();
return manangementConfirmationWindowLayout;
}
@@ -257,14 +257,9 @@ public class DeleteActionsLayout extends AbstractDeleteActionsLayout {
}
private void addInDeleteDistributionList(final Table sourceTable, final TableTransferable transferable) {
final Set<DistributionSetIdName> distSelected = HawkbitCommonUtil.getSelectedDSDetails(sourceTable);
final Set<DistributionSetIdName> distributionIdNameSet = new HashSet<>();
if (!distSelected.contains(transferable.getData(SPUIDefinitions.ITEMID))) {
distributionIdNameSet.add((DistributionSetIdName) transferable.getData(SPUIDefinitions.ITEMID));
} else {
distributionIdNameSet.addAll(distSelected);
}
@SuppressWarnings("unchecked")
final AbstractTable<?, DistributionSetIdName> distTable = (AbstractTable<?, DistributionSetIdName>) sourceTable;
final Set<DistributionSetIdName> distributionIdNameSet = distTable.getDeletedEntityByTransferable(transferable);
final DistributionSetIdName dsInBulkUpload = managementUIState.getTargetTableFilters().getBulkUpload()
.getDsNameAndVersion();
@@ -272,32 +267,38 @@ public class DeleteActionsLayout extends AbstractDeleteActionsLayout {
distributionIdNameSet.remove(dsInBulkUpload);
}
if (!distributionIdNameSet.isEmpty()) {
/*
* Flags to identify whether all dropped distributions are already
* in the deleted list (or) some distributions are already in the
* deleted distribution list.
*/
final int existingDeletedDistributionsSize = managementUIState.getDeletedDistributionList().size();
managementUIState.getDeletedDistributionList().addAll(distributionIdNameSet);
final int newDeletedDistributionsSize = managementUIState.getDeletedDistributionList().size();
if (newDeletedDistributionsSize == existingDeletedDistributionsSize) {
/*
* No new distributions are added, all distributions dropped now
* are already available in the delete list. Hence display
* warning message accordingly.
*/
notification.displayValidationError(i18n.get("message.targets.already.deleted"));
} else if (newDeletedDistributionsSize - existingDeletedDistributionsSize != distributionIdNameSet.size()) {
/*
* Not the all distributions dropped now are added to the delete
* list. There are some distributions are already there in the
* delete list. Hence display warning message accordingly.
*/
notification.displayValidationError(i18n.get("message.dist.deleted.pending"));
}
if (distributionIdNameSet.isEmpty()) {
return;
}
checkDeletedDistributionSets(distributionIdNameSet);
}
private void checkDeletedDistributionSets(final Set<DistributionSetIdName> distributionIdNameSet) {
final int existingDeletedDistributionsSize = managementUIState.getDeletedDistributionList().size();
managementUIState.getDeletedDistributionList().addAll(distributionIdNameSet);
final int newDeletedDistributionsSize = managementUIState.getDeletedDistributionList().size();
showAlreadyDeletedDistributionSetNotfication(existingDeletedDistributionsSize, newDeletedDistributionsSize,
"message.dists.already.deleted");
showPendingDeletedNotifaction(distributionIdNameSet, existingDeletedDistributionsSize,
newDeletedDistributionsSize, "message.dist.deleted.pending");
}
private void showPendingDeletedNotifaction(final Set<?> currentValues, final int existingDeletedSize,
final int newDeletedSize, final String messageKey) {
if (newDeletedSize - existingDeletedSize == currentValues.size()) {
return;
}
notification.displayValidationError(i18n.get(messageKey));
}
private void showAlreadyDeletedDistributionSetNotfication(final int existingDeletedSize, final int newDeletedSize,
final String messageKey) {
if (newDeletedSize != existingDeletedSize) {
return;
}
notification.displayValidationError(i18n.get(messageKey));
}
private boolean isDsInUseInBulkUpload(final Set<DistributionSetIdName> distributionIdNameSet,
@@ -311,38 +312,23 @@ public class DeleteActionsLayout extends AbstractDeleteActionsLayout {
}
private void addInDeleteTargetList(final Table sourceTable, final TableTransferable transferable) {
final Set<TargetIdName> targetSelected = HawkbitCommonUtil.getSelectedTargetDetails(sourceTable);
@SuppressWarnings("unchecked")
final AbstractTable<?, TargetIdName> targetTable = (AbstractTable<?, TargetIdName>) sourceTable;
final Set<TargetIdName> targetIdNameSet = targetTable.getDeletedEntityByTransferable(transferable);
final Set<TargetIdName> targetIdNameSet = new HashSet<>();
if (!targetSelected.contains(transferable.getData(SPUIDefinitions.ITEMID))) {
targetIdNameSet.add((TargetIdName) transferable.getData(SPUIDefinitions.ITEMID));
} else {
targetIdNameSet.addAll(targetSelected);
}
checkDeletedTargets(targetIdNameSet);
}
/*
* Flags to identify whether all dropped targets are already in the
* deleted list (or) some target are already in the deleted distribution
* list.
*/
private void checkDeletedTargets(final Set<TargetIdName> targetIdNameSet) {
final int existingDeletedTargetsSize = managementUIState.getDeletedTargetList().size();
managementUIState.getDeletedTargetList().addAll(targetIdNameSet);
final int newDeletedTargetsSize = managementUIState.getDeletedTargetList().size();
if (newDeletedTargetsSize == existingDeletedTargetsSize) {
/*
* No new targets are added, all targets dropped now are already
* available in the delete list. Hence display warning message
* accordingly.
*/
notification.displayValidationError(i18n.get("message.targets.already.deleted"));
} else if (newDeletedTargetsSize - existingDeletedTargetsSize != targetIdNameSet.size()) {
/*
* Not the all targets dropped now are added to the delete list.
* There are some targets are already there in the delete list.
* Hence display warning message accordingly.
*/
notification.displayValidationError(i18n.get("message.target.deleted.pending"));
}
showAlreadyDeletedDistributionSetNotfication(existingDeletedTargetsSize, newDeletedTargetsSize,
"message.targets.already.deleted");
showPendingDeletedNotifaction(targetIdNameSet, existingDeletedTargetsSize, newDeletedTargetsSize,
"message.target.deleted.pending");
}
private void updateActionCount() {

View File

@@ -19,8 +19,6 @@ import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.PostConstruct;
import org.eclipse.hawkbit.repository.DeploymentManagement;
import org.eclipse.hawkbit.repository.DistributionSetAssignmentResult;
import org.eclipse.hawkbit.repository.DistributionSetManagement;
@@ -31,20 +29,15 @@ import org.eclipse.hawkbit.repository.model.DistributionSetIdName;
import org.eclipse.hawkbit.repository.model.TargetIdName;
import org.eclipse.hawkbit.ui.common.confirmwindow.layout.AbstractConfirmationWindowLayout;
import org.eclipse.hawkbit.ui.common.confirmwindow.layout.ConfirmationTab;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
import org.eclipse.hawkbit.ui.management.event.PinUnpinEvent;
import org.eclipse.hawkbit.ui.management.event.SaveActionWindowEvent;
import org.eclipse.hawkbit.ui.management.footer.ActionTypeOptionGroupLayout.ActionTypeOption;
import org.eclipse.hawkbit.ui.management.state.ManagementUIState;
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.spring.events.EventBus;
import com.vaadin.data.Item;
import com.vaadin.data.util.IndexedContainer;
@@ -52,8 +45,8 @@ import com.vaadin.server.FontAwesome;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.ViewScope;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Table.Align;
import com.vaadin.ui.themes.ValoTheme;
/**
* Confirmation window for target/ds delete and assignment.
@@ -79,12 +72,6 @@ public class ManangementConfirmationWindowLayout extends AbstractConfirmationWin
@Autowired
private ManagementUIState managementUIState;
@Autowired
private I18N i18n;
@Autowired
private transient EventBus.SessionEventBus eventBus;
@Autowired
private transient TargetManagement targetManagement;
@@ -99,14 +86,6 @@ public class ManangementConfirmationWindowLayout extends AbstractConfirmationWin
private ConfirmationTab assignmnetTab;
/**
* Initialze the component.
*/
@PostConstruct
public void init() {
super.inittialize();
}
@Override
protected Map<String, ConfirmationTab> getConfimrationTabs() {
final Map<String, ConfirmationTab> tabs = new HashMap<>();
@@ -130,6 +109,7 @@ public class ManangementConfirmationWindowLayout extends AbstractConfirmationWin
assignmnetTab.getConfirmAll().setIcon(FontAwesome.SAVE);
assignmnetTab.getConfirmAll().setCaption(i18n.get("button.assign.all"));
assignmnetTab.getConfirmAll().addClickListener(event -> saveAllAssignments(assignmnetTab));
assignmnetTab.getDiscardAll().setCaption(i18n.get(SPUILabelDefinitions.BUTTON_DISCARD_ALL));
assignmnetTab.getDiscardAll().setId(SPUIComponetIdProvider.DISCARD_ASSIGNMENT);
assignmnetTab.getDiscardAll().addClickListener(event -> discardAllAssignments(assignmnetTab));
@@ -139,35 +119,17 @@ public class ManangementConfirmationWindowLayout extends AbstractConfirmationWin
// Add the discard action column
assignmnetTab.getTable().addGeneratedColumn(DISCARD_CHANGES, (source, itemId, columnId) -> {
final StringBuilder style = new StringBuilder(ValoTheme.BUTTON_TINY);
style.append(' ');
style.append(SPUIStyleDefinitions.REDICON);
final Button deleteIcon = SPUIComponentProvider.getButton("", "", SPUILabelDefinitions.DISCARD,
style.toString(), true, FontAwesome.REPLY, SPUIButtonStyleSmallNoBorder.class);
deleteIcon.setData(itemId);
deleteIcon.setImmediate(true);
deleteIcon.addClickListener(event -> discardAssignment(
(TargetIdName) ((Button) event.getComponent()).getData(), assignmnetTab));
return deleteIcon;
final ClickListener clickListener = event -> discardAssignment(
(TargetIdName) ((Button) event.getComponent()).getData(), assignmnetTab);
return createDiscardButton(itemId, clickListener);
});
// set the visible columns
final List<Object> visibleColumnIds = new ArrayList<>();
final List<String> visibleColumnLabels = new ArrayList<>();
if (visibleColumnIds.isEmpty() && visibleColumnLabels.isEmpty()) {
visibleColumnIds.add(TARGET_NAME);
visibleColumnIds.add(DISTRIBUTION_NAME);
visibleColumnIds.add(DISCARD_CHANGES);
visibleColumnLabels.add(i18n.get("header.first.assignment.table"));
visibleColumnLabels.add(i18n.get("header.second.assignment.table"));
visibleColumnLabels.add(i18n.get("header.third.assignment.table"));
}
assignmnetTab.getTable().setColumnExpandRatio(TARGET_NAME, 2);
assignmnetTab.getTable().setColumnExpandRatio(DISTRIBUTION_NAME, 2);
assignmnetTab.getTable().setColumnExpandRatio(DISCARD_CHANGES, 1);
assignmnetTab.getTable().setVisibleColumns(visibleColumnIds.toArray());
assignmnetTab.getTable().setColumnHeaders(visibleColumnLabels.toArray(new String[0]));
assignmnetTab.getTable().setVisibleColumns(TARGET_NAME, DISTRIBUTION_NAME, DISCARD_CHANGES);
assignmnetTab.getTable().setColumnHeaders(i18n.get("header.first.assignment.table"),
i18n.get("header.second.assignment.table"), i18n.get("header.third.assignment.table"));
assignmnetTab.getTable().setColumnAlignment(DISCARD_CHANGES, Align.CENTER);
actionTypeOptionGroupLayout.selectDefaultOption();
@@ -326,27 +288,15 @@ public class ManangementConfirmationWindowLayout extends AbstractConfirmationWin
/* Add the discard action column */
tab.getTable().addGeneratedColumn(DISCARD_CHANGES, (source, itemId, columnId) -> {
final Button deletestargetIcon = SPUIComponentProvider.getButton("", "", SPUILabelDefinitions.DISCARD,
ValoTheme.BUTTON_TINY + " " + SPUIStyleDefinitions.REDICON, true, FontAwesome.REPLY,
SPUIButtonStyleSmallNoBorder.class);
deletestargetIcon.setData(itemId);
deletestargetIcon.setImmediate(true);
deletestargetIcon.addClickListener(event -> discardTargetDelete(
(TargetIdName) ((Button) event.getComponent()).getData(), itemId, tab));
return deletestargetIcon;
final ClickListener clickListener = event -> discardTargetDelete(
(TargetIdName) ((Button) event.getComponent()).getData(), itemId, tab);
return createDiscardButton(itemId, clickListener);
});
/* set the visible columns */
final List<Object> visibleColumnIds = new ArrayList<>();
final List<String> visibleColumnLabels = new ArrayList<>();
if (visibleColumnIds.isEmpty() && visibleColumnLabels.isEmpty()) {
visibleColumnIds.add(TARGET_NAME);
visibleColumnIds.add(DISCARD_CHANGES);
visibleColumnLabels.add(i18n.get("header.first.deletetarget.table"));
visibleColumnLabels.add(i18n.get("header.second.deletetarget.table"));
}
tab.getTable().setVisibleColumns(visibleColumnIds.toArray());
tab.getTable().setColumnHeaders(visibleColumnLabels.toArray(new String[0]));
tab.getTable().setVisibleColumns(TARGET_NAME, DISCARD_CHANGES);
tab.getTable().setColumnHeaders(i18n.get("header.first.deletetarget.table"),
i18n.get("header.second.deletetarget.table"));
tab.getTable().setColumnExpandRatio(TARGET_NAME, SPUIDefinitions.TARGET_DISTRIBUTION_COLUMN_WIDTH);
tab.getTable().setColumnExpandRatio(DISCARD_CHANGES, SPUIDefinitions.DISCARD_COLUMN_WIDTH);
@@ -371,30 +321,17 @@ public class ManangementConfirmationWindowLayout extends AbstractConfirmationWin
/* Add the discard action column */
tab.getTable().addGeneratedColumn(DISCARD_CHANGES, (source, itemId, columnId) -> {
final Button deletesDsIcon = SPUIComponentProvider.getButton("", "", SPUILabelDefinitions.DISCARD,
ValoTheme.BUTTON_TINY + " " + SPUIStyleDefinitions.REDICON, true, FontAwesome.REPLY,
SPUIButtonStyleSmallNoBorder.class);
deletesDsIcon.setData(itemId);
deletesDsIcon.setImmediate(true);
deletesDsIcon.addClickListener(event -> discardDSDelete(
(DistributionSetIdName) ((Button) event.getComponent()).getData(), itemId, tab));
return deletesDsIcon;
});
final ClickListener clickListener = event -> discardDSDelete(
(DistributionSetIdName) ((Button) event.getComponent()).getData(), itemId, tab);
return createDiscardButton(itemId, clickListener);
/* set the visible columns */
final List<Object> visibleColumnIds = new ArrayList<>();
final List<String> visibleColumnLabels = new ArrayList<>();
if (visibleColumnIds.isEmpty() && visibleColumnLabels.isEmpty()) {
visibleColumnIds.add(DISTRIBUTION_NAME);
visibleColumnIds.add(DISCARD_CHANGES);
visibleColumnLabels.add(i18n.get("header.one.deletedist.table"));
visibleColumnLabels.add(i18n.get("header.second.deletedist.table"));
}
});
tab.getTable().setColumnExpandRatio(DISTRIBUTION_NAME, SPUIDefinitions.TARGET_DISTRIBUTION_COLUMN_WIDTH);
tab.getTable().setColumnExpandRatio(DISCARD_CHANGES, SPUIDefinitions.DISCARD_COLUMN_WIDTH);
tab.getTable().setVisibleColumns(visibleColumnIds.toArray());
tab.getTable().setColumnHeaders(visibleColumnLabels.toArray(new String[0]));
tab.getTable().setVisibleColumns(DISTRIBUTION_NAME, DISCARD_CHANGES);
tab.getTable().setColumnHeaders(i18n.get("header.one.deletedist.table"),
i18n.get("header.second.deletedist.table"));
tab.getTable().setColumnAlignment(DISCARD_CHANGES, Align.CENTER);
return tab;
}

View File

@@ -19,6 +19,7 @@ import java.util.concurrent.atomic.AtomicLong;
import org.eclipse.hawkbit.repository.model.DistributionSetIdName;
import org.eclipse.hawkbit.repository.model.TargetIdName;
import org.eclipse.hawkbit.ui.common.ManagmentEntityState;
import org.springframework.beans.factory.annotation.Autowired;
import com.vaadin.spring.annotation.SpringComponent;
@@ -31,7 +32,7 @@ import com.vaadin.spring.annotation.VaadinSessionScope;
*/
@VaadinSessionScope
@SpringComponent
public class ManagementUIState implements Serializable {
public class ManagementUIState implements ManagmentEntityState<DistributionSetIdName>, Serializable {
private static final long serialVersionUID = 7301409196969723794L;
@@ -170,7 +171,7 @@ public class ManagementUIState implements Serializable {
}
public Optional<Set<TargetIdName>> getSelectedTargetIdName() {
return selectedTargetIdName == null ? Optional.empty() : Optional.of(selectedTargetIdName);
return Optional.ofNullable(selectedTargetIdName);
}
public void setSelectedTargetIdName(final Set<TargetIdName> selectedTargetIdName) {
@@ -266,16 +267,19 @@ public class ManagementUIState implements Serializable {
return lastSelectedDsIdName;
}
public void setLastSelectedDsIdName(final DistributionSetIdName lastSelectedDsIdName) {
this.lastSelectedDsIdName = lastSelectedDsIdName;
@Override
public void setLastSelectedEntity(final DistributionSetIdName value) {
this.lastSelectedDsIdName = value;
}
public void setSelectedDsIdName(final Set<DistributionSetIdName> selectedDsIdName) {
this.selectedDsIdName = selectedDsIdName;
@Override
public void setSelectedEnitities(final Set<DistributionSetIdName> values) {
this.selectedDsIdName = values;
}
public Optional<Set<DistributionSetIdName>> getSelectedDsIdName() {
return selectedDsIdName == null ? Optional.empty() : Optional.of(selectedDsIdName);
return Optional.ofNullable(selectedDsIdName);
}
/**

View File

@@ -14,11 +14,11 @@ import java.util.Set;
import org.eclipse.hawkbit.repository.TargetManagement;
import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.repository.model.TargetIdName;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
import org.eclipse.hawkbit.ui.management.event.DragEvent;
import org.eclipse.hawkbit.ui.management.event.TargetTableEvent;
import org.eclipse.hawkbit.ui.management.event.TargetTableEvent.TargetComponentEvent;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
@@ -56,6 +56,8 @@ import com.vaadin.ui.themes.ValoTheme;
@SpringComponent
@VaadinSessionScope
public class TargetAddUpdateWindowLayout extends CustomComponent {
private static final long serialVersionUID = -6659290471705262389L;
@Autowired
private I18N i18n;
@@ -68,7 +70,6 @@ public class TargetAddUpdateWindowLayout extends CustomComponent {
@Autowired
private transient UINotification uINotification;
private static final long serialVersionUID = -6659290471705262389L;
private TextField controllerIDTextField;
private TextField nameTextField;
private TextArea descTextArea;
@@ -218,7 +219,7 @@ public class TargetAddUpdateWindowLayout extends CustomComponent {
/* display success msg */
uINotification.displaySuccess(i18n.get("message.update.success", new Object[] { latestTarget.getName() }));
// publishing through event bus
eventBus.publish(this, new TargetTableEvent(TargetComponentEvent.EDIT_TARGET, latestTarget));
eventBus.publish(this, new TargetTableEvent(BaseEntityEventType.UPDATED_ENTITY, latestTarget));
/* close the window */
closeThisWindow();

View File

@@ -18,7 +18,6 @@ import org.eclipse.hawkbit.ui.common.detailslayout.AbstractTableDetailsLayout;
import org.eclipse.hawkbit.ui.common.tagdetails.TargetTagToken;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.management.event.TargetTableEvent;
import org.eclipse.hawkbit.ui.management.event.TargetTableEvent.TargetComponentEvent;
import org.eclipse.hawkbit.ui.management.state.ManagementUIState;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
@@ -44,13 +43,10 @@ import com.vaadin.ui.themes.ValoTheme;
/**
* Target details layout.
*
*
*
*/
@SpringComponent
@ViewScope
public class TargetDetails extends AbstractTableDetailsLayout {
public class TargetDetails extends AbstractTableDetailsLayout<Target> {
private static final long serialVersionUID = 4571732743399605843L;
@@ -63,14 +59,9 @@ public class TargetDetails extends AbstractTableDetailsLayout {
@Autowired
private TargetTagToken targetTagToken;
private Target selectedTarget = null;
private VerticalLayout assignedDistLayout;
private VerticalLayout installedDistLayout;
/**
* Initialize the Target details.
*/
@Override
public void init() {
super.init();
@@ -79,18 +70,18 @@ public class TargetDetails extends AbstractTableDetailsLayout {
@Override
protected String getDefaultCaption() {
return i18n.get("target.details.header");
return getI18n().get("target.details.header");
}
@Override
protected void addTabs(final TabSheet detailsTab) {
detailsTab.addTab(createDetailsLayout(), i18n.get("caption.tab.details"), null);
detailsTab.addTab(createDescriptionLayout(), i18n.get("caption.tab.description"), null);
detailsTab.addTab(createAttributesLayout(), i18n.get("caption.attributes.tab"), null);
detailsTab.addTab(createAssignedDistLayout(), i18n.get("header.target.assigned"), null);
detailsTab.addTab(createInstalledDistLayout(), i18n.get("header.target.installed"), null);
detailsTab.addTab(createTagsLayout(), i18n.get("caption.tags.tab"), null);
detailsTab.addTab(createLogLayout(), i18n.get("caption.logs.tab"), null);
detailsTab.addTab(createDetailsLayout(), getI18n().get("caption.tab.details"), null);
detailsTab.addTab(createDescriptionLayout(), getI18n().get("caption.tab.description"), null);
detailsTab.addTab(createAttributesLayout(), getI18n().get("caption.attributes.tab"), null);
detailsTab.addTab(createAssignedDistLayout(), getI18n().get("header.target.assigned"), null);
detailsTab.addTab(createInstalledDistLayout(), getI18n().get("header.target.installed"), null);
detailsTab.addTab(createTagsLayout(), getI18n().get("caption.tags.tab"), null);
detailsTab.addTab(createLogLayout(), getI18n().get("caption.logs.tab"), null);
}
@@ -112,13 +103,14 @@ public class TargetDetails extends AbstractTableDetailsLayout {
@Override
protected void onEdit(final ClickEvent event) {
if (selectedTarget != null) {
final Window newDistWindow = targetAddUpdateWindowLayout.getWindow();
targetAddUpdateWindowLayout.populateValuesOfTarget(selectedTarget.getControllerId());
newDistWindow.setCaption(i18n.get("caption.update.dist"));
UI.getCurrent().addWindow(newDistWindow);
newDistWindow.setVisible(Boolean.TRUE);
if (getSelectedBaseEntity() == null) {
return;
}
final Window newDistWindow = targetAddUpdateWindowLayout.getWindow();
targetAddUpdateWindowLayout.populateValuesOfTarget(getSelectedBaseEntity().getControllerId());
newDistWindow.setCaption(getI18n().get("caption.update.dist"));
UI.getCurrent().addWindow(newDistWindow);
newDistWindow.setVisible(Boolean.TRUE);
}
@Override
@@ -138,50 +130,24 @@ public class TargetDetails extends AbstractTableDetailsLayout {
@Override
protected void populateDetailsWidget() {
if (selectedTarget != null) {
setName(getDefaultCaption(), selectedTarget.getName());
}
populateDetailsWidget(selectedTarget);
}
private void populateDetailsWidget(final Target target) {
if (target != null) {
setName(getDefaultCaption(), target.getName());
updateDetailsLayout(target.getControllerId(), target.getTargetInfo().getAddress(),
target.getSecurityToken(),
SPDateTimeUtil.getFormattedDate(target.getTargetInfo().getLastTargetQuery()));
populateDescription(target);
populateDistributionDtls(installedDistLayout, target.getTargetInfo().getInstalledDistributionSet());
populateDistributionDtls(assignedDistLayout, target.getAssignedDistributionSet());
updateLogLayout(getLogLayout(), target.getLastModifiedAt(), target.getLastModifiedBy(),
target.getCreatedAt(), target.getCreatedBy(), i18n);
populateAttributes(target);
if (getSelectedBaseEntity() != null) {
updateDetailsLayout(getSelectedBaseEntity().getControllerId(),
getSelectedBaseEntity().getTargetInfo().getAddress(), getSelectedBaseEntity().getSecurityToken(),
SPDateTimeUtil.getFormattedDate(getSelectedBaseEntity().getTargetInfo().getLastTargetQuery()));
populateDistributionDtls(installedDistLayout,
getSelectedBaseEntity().getTargetInfo().getInstalledDistributionSet());
populateDistributionDtls(assignedDistLayout, getSelectedBaseEntity().getAssignedDistributionSet());
} else {
setName(getDefaultCaption(), HawkbitCommonUtil.SP_STRING_EMPTY);
updateDetailsLayout(null, null, null, null);
populateDescription(null);
populateDistributionDtls(installedDistLayout, null);
populateDistributionDtls(assignedDistLayout, null);
updateLogLayout(getLogLayout(), null, HawkbitCommonUtil.SP_STRING_EMPTY, null, null, i18n);
populateAttributes(null);
}
updateAttributesLayout(getSelectedBaseEntity());
}
private void populateAttributes(final Target target) {
if (target != null) {
updateAttributesLayout(target);
} else {
updateAttributesLayout(null);
}
}
private void populateDescription(final Target target) {
if (target != null) {
updateDescriptionLayout(i18n.get("label.description"), target.getDescription());
} else {
updateDescriptionLayout(i18n.get("label.description"), null);
}
@Override
protected String getName() {
return getSelectedBaseEntity().getName();
}
private void updateDetailsLayout(final String controllerId, final URI address, final String securityToken,
@@ -189,17 +155,18 @@ public class TargetDetails extends AbstractTableDetailsLayout {
final VerticalLayout detailsTabLayout = getDetailsLayout();
detailsTabLayout.removeAllComponents();
final Label controllerLabel = SPUIComponentProvider.createNameValueLabel(i18n.get("label.target.id"),
final Label controllerLabel = SPUIComponentProvider.createNameValueLabel(getI18n().get("label.target.id"),
HawkbitCommonUtil.trimAndNullIfEmpty(controllerId) == null ? "" : controllerId);
controllerLabel.setId(SPUIComponetIdProvider.TARGET_CONTROLLER_ID);
detailsTabLayout.addComponent(controllerLabel);
final Label lastPollDtLabel = SPUIComponentProvider.createNameValueLabel(i18n.get("label.target.lastpolldate"),
final Label lastPollDtLabel = SPUIComponentProvider.createNameValueLabel(
getI18n().get("label.target.lastpolldate"),
HawkbitCommonUtil.trimAndNullIfEmpty(lastQueryDate) == null ? "" : lastQueryDate);
lastPollDtLabel.setId(SPUIComponetIdProvider.TARGET_LAST_QUERY_DT);
detailsTabLayout.addComponent(lastPollDtLabel);
final Label typeLabel = SPUIComponentProvider.createNameValueLabel(i18n.get("label.ip"),
final Label typeLabel = SPUIComponentProvider.createNameValueLabel(getI18n().get("label.ip"),
address == null ? StringUtils.EMPTY : address.toString());
typeLabel.setId(SPUIComponetIdProvider.TARGET_IP_ADDRESS);
detailsTabLayout.addComponent(typeLabel);
@@ -215,7 +182,7 @@ public class TargetDetails extends AbstractTableDetailsLayout {
final HorizontalLayout securityTokenLayout = new HorizontalLayout();
final Label securityTableLbl = new Label(
SPUIComponentProvider.getBoldHTMLText(i18n.get("label.target.security.token")), ContentMode.HTML);
SPUIComponentProvider.getBoldHTMLText(getI18n().get("label.target.security.token")), ContentMode.HTML);
securityTableLbl.addStyleName(SPUIDefinitions.TEXT_STYLE);
securityTableLbl.addStyleName("label-style");
@@ -235,18 +202,17 @@ public class TargetDetails extends AbstractTableDetailsLayout {
private void populateDistributionDtls(final VerticalLayout layout, final DistributionSet distributionSet) {
layout.removeAllComponents();
if (distributionSet != null) {
// Display distribution set name
layout.addComponent(SPUIComponentProvider.createNameValueLabel(i18n.get("label.dist.details.name"),
distributionSet.getName()));
layout.addComponent(SPUIComponentProvider.createNameValueLabel(i18n.get("label.dist.details.version"),
distributionSet.getVersion()));
/* Module info */
distributionSet.getModules()
.forEach(module -> layout.addComponent(getSWModlabel(module.getType().getName(), module)));
if (distributionSet == null) {
return;
}
layout.addComponent(SPUIComponentProvider.createNameValueLabel(getI18n().get("label.dist.details.name"),
distributionSet.getName()));
layout.addComponent(SPUIComponentProvider.createNameValueLabel(getI18n().get("label.dist.details.version"),
distributionSet.getVersion()));
distributionSet.getModules()
.forEach(module -> layout.addComponent(getSWModlabel(module.getType().getName(), module)));
}
/**
@@ -262,37 +228,14 @@ public class TargetDetails extends AbstractTableDetailsLayout {
return SPUIComponentProvider.createNameValueLabel(labelName + " : ", swModule.getName(), swModule.getVersion());
}
@Override
protected void clearDetails() {
populateDetailsWidget(null);
}
@Override
protected Boolean hasEditPermission() {
return permissionChecker.hasUpdateTargetPermission();
return getPermissionChecker().hasUpdateTargetPermission();
}
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final TargetTableEvent targetTableEvent) {
// Get the event type
final TargetComponentEvent event = targetTableEvent.getTargetComponentEvent();
if (event == TargetComponentEvent.SELECTED_TARGET || event == TargetComponentEvent.EDIT_TARGET) {
UI.getCurrent().access(() -> {
// If selected or edited, populate the fresh details.
if (targetTableEvent.getTarget() != null) {
selectedTarget = targetTableEvent.getTarget();
} else {
selectedTarget = null;
}
populateData(selectedTarget != null);
});
} else if (event == TargetComponentEvent.MINIMIZED) {
UI.getCurrent().access(() -> showLayout());
} else if (event == TargetComponentEvent.MAXIMIZED) {
UI.getCurrent().access(() -> hideLayout());
}
onBaseEntityEvent(targetTableEvent);
}
@Override

View File

@@ -18,9 +18,6 @@ import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.eclipse.hawkbit.eventbus.event.TargetCreatedEvent;
import org.eclipse.hawkbit.eventbus.event.TargetDeletedEvent;
import org.eclipse.hawkbit.eventbus.event.TargetInfoUpdateEvent;
@@ -34,7 +31,9 @@ import org.eclipse.hawkbit.repository.model.TargetIdName;
import org.eclipse.hawkbit.repository.model.TargetInfo;
import org.eclipse.hawkbit.repository.model.TargetTagAssignmentResult;
import org.eclipse.hawkbit.repository.model.TargetUpdateStatus;
import org.eclipse.hawkbit.ui.common.ManagmentEntityState;
import org.eclipse.hawkbit.ui.common.table.AbstractTable;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.filter.FilterExpression;
import org.eclipse.hawkbit.ui.filter.Filters;
import org.eclipse.hawkbit.ui.filter.target.CustomTargetFilter;
@@ -53,7 +52,6 @@ import org.eclipse.hawkbit.ui.management.event.TargetTableEvent.TargetComponentE
import org.eclipse.hawkbit.ui.management.state.ManagementUIState;
import org.eclipse.hawkbit.ui.management.state.TargetTableFilters;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
@@ -69,7 +67,6 @@ import org.springframework.data.domain.Sort;
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;
@@ -102,7 +99,7 @@ import com.vaadin.ui.themes.ValoTheme;
*/
@SpringComponent
@ViewScope
public class TargetTable extends AbstractTable implements Handler {
public class TargetTable extends AbstractTable<Target, TargetIdName> implements Handler {
private static final Logger LOG = LoggerFactory.getLogger(TargetTable.class);
private static final String TARGET_PINNED = "targetPinned";
@@ -110,15 +107,11 @@ public class TargetTable extends AbstractTable implements Handler {
private static final long serialVersionUID = -2300392868806614568L;
private static final int PROPERTY_DEPT = 3;
private static final String ITEMID = "itemId";
private static final String ACTION_NOT_ALLOWED_MSG = "message.action.not.allowed";
@Autowired
private transient TargetManagement targetManagement;
@Autowired
private I18N i18n;
@Autowired
private ManagementUIState managementUIState;
@@ -128,9 +121,6 @@ public class TargetTable extends AbstractTable implements Handler {
@Autowired
private UINotification notification;
@Autowired
private transient EventBus.SessionEventBus eventBus;
@Autowired
private ManagementViewAcceptCriteria managementViewAcceptCriteria;
@@ -141,19 +131,11 @@ public class TargetTable extends AbstractTable implements Handler {
private ShortcutAction actionUnSelectAll;
@Override
@PostConstruct
protected void init() {
super.init();
addActionHandler(this);
actionSelectAll = new ShortcutAction(i18n.get("action.target.table.selectall"));
actionUnSelectAll = new ShortcutAction(i18n.get("action.target.table.clear"));
eventBus.subscribe(this);
setNoDataAvailable();
}
@PreDestroy
void destroy() {
eventBus.unsubscribe(this);
}
/**
@@ -199,9 +181,10 @@ public class TargetTable extends AbstractTable implements Handler {
@EventBusListenerMethod(scope = EventScope.SESSION)
void addOrEditEvent(final TargetAddUpdateWindowEvent targetUIEvent) {
if (targetUIEvent.getTargetComponentEvent() == TargetComponentEvent.EDIT_TARGET) {
UI.getCurrent().access(() -> updateTarget(targetUIEvent.getTarget()));
if (BaseEntityEventType.UPDATED_ENTITY != targetUIEvent.getEventType()) {
return;
}
UI.getCurrent().access(() -> updateTarget(targetUIEvent.getEntity()));
}
@EventBusListenerMethod(scope = EventScope.SESSION)
@@ -239,33 +222,14 @@ public class TargetTable extends AbstractTable implements Handler {
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final TargetTableEvent event) {
if (event.getTargetComponentEvent() == TargetComponentEvent.MINIMIZED) {
UI.getCurrent().access(() -> applyMinTableSettings());
} else if (event.getTargetComponentEvent() == TargetComponentEvent.MAXIMIZED) {
UI.getCurrent().access(() -> applyMaxTableSettings());
} else if (event.getTargetComponentEvent() == TargetComponentEvent.EDIT_TARGET) {
UI.getCurrent().access(() -> updateTarget(event.getTarget()));
}
onBaseEntityEvent(event);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.hawkbit.server.ui.common.table.AbstractTable#getTableId()
*/
@Override
protected String getTableId() {
return SPUIComponetIdProvider.TARGET_TABLE_ID;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.hawkbit.server.ui.common.table.AbstractTable#createContainer(
* )
*/
@Override
protected Container createContainer() {
// ADD all the filters to the query config
@@ -311,12 +275,6 @@ public class TargetTable extends AbstractTable implements Handler {
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.hawkbit.server.ui.common.table.AbstractTable#
* addCustomGeneratedColumns ()
*/
@Override
protected void addCustomGeneratedColumns() {
addGeneratedColumn(SPUIDefinitions.TARGET_STATUS_PIN_TOGGLE_ICON,
@@ -340,22 +298,24 @@ public class TargetTable extends AbstractTable implements Handler {
}
@Override
protected void onValueChange() {
eventBus.publish(this, DragEvent.HIDE_DROP_HINT);
@SuppressWarnings("unchecked")
final Set<TargetIdName> values = HawkbitCommonUtil.getSelectedTargetDetails(this);
if (values != null && !values.isEmpty()) {
final TargetIdName lastSelectedItem = getLastSelectedItem(values);
managementUIState.setSelectedTargetIdName(values);
managementUIState.setLastSelectedTargetIdName(lastSelectedItem);
final Target target = targetManagement
.findTargetByControllerIDWithDetails(lastSelectedItem.getControllerId());
eventBus.publish(this, new TargetTableEvent(TargetComponentEvent.SELECTED_TARGET, target));
} else {
managementUIState.setSelectedTargetIdName(null);
managementUIState.setLastSelectedTargetIdName(null);
eventBus.publish(this, new TargetTableEvent(TargetComponentEvent.SELECTED_TARGET, (Target) null));
}
protected void publishEntityAfterValueChange(final Target selectedLastEntity) {
eventBus.publish(this, new TargetTableEvent(BaseEntityEventType.SELECTED_ENTITY, selectedLastEntity));
}
@Override
protected Target findEntityByTableValue(final TargetIdName lastSelectedId) {
return targetManagement.findTargetByControllerIDWithDetails(lastSelectedId.getControllerId());
}
@Override
protected void setManagementEntitiyStateValues(final Set<TargetIdName> values, final TargetIdName lastId) {
managementUIState.setSelectedTargetIdName(values);
managementUIState.setLastSelectedTargetIdName(lastId);
}
@Override
protected ManagmentEntityState<TargetIdName> getManagmentEntityState() {
return null;
}
@Override
@@ -365,30 +325,15 @@ public class TargetTable extends AbstractTable implements Handler {
@Override
protected List<TableColumn> getTableVisibleColumns() {
final List<TableColumn> columnList = new ArrayList<>();
if (isMaximized()) {
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_NAME, i18n.get("header.name"), 0.2f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_BY, i18n.get("header.createdBy"), 0.1f));
columnList
.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_DATE, i18n.get("header.createdDate"), 0.1f));
columnList.add(
new TableColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY, i18n.get("header.modifiedBy"), 0.1f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE, i18n.get("header.modifiedDate"),
0.1f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_DESC, i18n.get("header.description"), 0.2f));
} else {
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_NAME, i18n.get("header.name"), 0.8f));
columnList.add(new TableColumn(SPUIDefinitions.TARGET_STATUS_POLL_TIME, "", 0.0f));
columnList.add(new TableColumn(SPUIDefinitions.TARGET_STATUS_PIN_TOGGLE_ICON, "", 0.0f));
final List<TableColumn> columnList = super.getTableVisibleColumns();
if (!isMaximized()) {
columnList.add(new TableColumn(SPUIDefinitions.TARGET_STATUS_POLL_TIME, "", 0.0F));
columnList.add(new TableColumn(SPUIDefinitions.TARGET_STATUS_PIN_TOGGLE_ICON, "", 0.0F));
}
return columnList;
}
/*
* (non-Javadoc)
*
* @see hawkbit.server.ui.common.table.AbstractTable#getTableDropHandler()
*/
@Override
protected DropHandler getTableDropHandler() {
return new DropHandler() {
@@ -630,7 +575,7 @@ public class TargetTable extends AbstractTable implements Handler {
private void tagAssignment(final DragAndDropEvent event) {
final com.vaadin.event.dd.TargetDetails taregtDet = event.getTargetDetails();
final Table targetTable = (Table) taregtDet.getTarget();
final Set<TargetIdName> targetSelected = HawkbitCommonUtil.getSelectedTargetDetails(targetTable);
final Set<TargetIdName> targetSelected = getTableValue(targetTable);
final Set<String> targetList = new HashSet<>();
final AbstractSelectTargetDetails dropData = (AbstractSelectTargetDetails) event.getTargetDetails();
final Object targetItemId = dropData.getItemIdOver();
@@ -688,14 +633,9 @@ public class TargetTable extends AbstractTable implements Handler {
private static Set<DistributionSetIdName> getDraggedDistributionSet(final TableTransferable transferable,
final Table source) {
final Set<DistributionSetIdName> distSelected = HawkbitCommonUtil.getSelectedDSDetails(source);
final Set<DistributionSetIdName> distributionIdSet = new HashSet<>();
if (!distSelected.contains(transferable.getData(ITEMID))) {
distributionIdSet.add((DistributionSetIdName) transferable.getData(ITEMID));
} else {
distributionIdSet.addAll(distSelected);
}
return distributionIdSet;
@SuppressWarnings("unchecked")
final AbstractTable<?, DistributionSetIdName> distTable = (AbstractTable<?, DistributionSetIdName>) source;
return distTable.getDeletedEntityByTransferable(transferable);
}
private Boolean validateDragAndDropWrapper(final Component compsource) {
@@ -912,6 +852,7 @@ public class TargetTable extends AbstractTable implements Handler {
eventBus.publish(this, new TargetTableEvent(TargetComponentEvent.REFRESH_TARGETS));
}
@SuppressWarnings("unchecked")
private void updateVisibleItemOnEvent(final TargetInfo targetInfo, final Target target,
final TargetIdName targetIdName) {
final LazyQueryContainer targetContainer = (LazyQueryContainer) getContainerDataSource();
@@ -934,8 +875,8 @@ public class TargetTable extends AbstractTable implements Handler {
* @param targetInfoUpdateEvents
* list of target info update event
*/
@SuppressWarnings("unchecked")
private void onTargetInfoUpdateEvents(final List<TargetInfoUpdateEvent> targetInfoUpdateEvents) {
@SuppressWarnings("unchecked")
final List<Object> visibleItemIds = (List<Object>) getVisibleItemIds();
boolean shoulTargetsUpdated = false;
Target lastSelectedTarget = null;
@@ -962,7 +903,7 @@ public class TargetTable extends AbstractTable implements Handler {
refreshTargets();
}
if (lastSelectedTarget != null) {
eventBus.publish(this, new TargetTableEvent(TargetComponentEvent.SELECTED_TARGET, lastSelectedTarget));
eventBus.publish(this, new TargetTableEvent(BaseEntityEventType.SELECTED_ENTITY, lastSelectedTarget));
}
}
@@ -1042,13 +983,9 @@ public class TargetTable extends AbstractTable implements Handler {
setValue(null);
}
private void setNoDataAvailable() {
final int tableSize = getContainerDataSource().size();
if (tableSize == 0) {
managementUIState.setNoDataAvilableTarget(true);
} else {
managementUIState.setNoDataAvilableTarget(false);
}
@Override
protected void setDataAvailable(final boolean available) {
managementUIState.setNoDataAvilableTarget(!available);
}
/**

View File

@@ -8,11 +8,12 @@
*/
package org.eclipse.hawkbit.ui.management.targettable;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.hawkbit.repository.model.DistributionSetIdName;
import org.eclipse.hawkbit.ui.common.table.AbstractTable;
import org.eclipse.hawkbit.ui.common.table.AbstractTableHeader;
import org.eclipse.hawkbit.ui.common.table.BaseEntityEventType;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmallNoBorder;
import org.eclipse.hawkbit.ui.management.event.BulkUploadPopupEvent;
@@ -254,13 +255,13 @@ public class TargetTableHeader extends AbstractTableHeader {
@Override
public void maximizeTable() {
managementUIState.setTargetTableMaximized(Boolean.TRUE);
eventBus.publish(this, new TargetTableEvent(TargetComponentEvent.MAXIMIZED));
eventBus.publish(this, new TargetTableEvent(BaseEntityEventType.MAXIMIZED,null));
}
@Override
public void minimizeTable() {
managementUIState.setTargetTableMaximized(Boolean.FALSE);
eventBus.publish(this, new TargetTableEvent(TargetComponentEvent.MINIMIZED));
eventBus.publish(this, new TargetTableEvent(BaseEntityEventType.MINIMIZED,null));
}
@Override
@@ -377,16 +378,9 @@ public class TargetTableHeader extends AbstractTableHeader {
}
private Set<DistributionSetIdName> getDropppedDistributionDetails(final TableTransferable transferable) {
final Set<DistributionSetIdName> distSelected = HawkbitCommonUtil
.getSelectedDSDetails(transferable.getSourceComponent());
final Set<DistributionSetIdName> distributionIdSet = new HashSet<>();
if (!distSelected.contains(transferable.getData("itemId"))) {
distributionIdSet.add((DistributionSetIdName) transferable.getData("itemId"));
} else {
distributionIdSet.addAll(distSelected);
}
return distributionIdSet;
@SuppressWarnings("unchecked")
final AbstractTable<?, DistributionSetIdName> distTable = (AbstractTable<?, DistributionSetIdName>) transferable.getSourceComponent();
return distTable.getDeletedEntityByTransferable(transferable);
}
private void addFilterTextField(final DistributionSetIdName distributionSetIdName) {

View File

@@ -8,7 +8,6 @@
*/
package org.eclipse.hawkbit.ui.management.targettag;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@@ -22,6 +21,7 @@ import org.eclipse.hawkbit.repository.model.TargetIdName;
import org.eclipse.hawkbit.repository.model.TargetTag;
import org.eclipse.hawkbit.repository.model.TargetTagAssignmentResult;
import org.eclipse.hawkbit.ui.common.filterlayout.AbstractFilterButtons;
import org.eclipse.hawkbit.ui.common.table.AbstractTable;
import org.eclipse.hawkbit.ui.management.event.DragEvent;
import org.eclipse.hawkbit.ui.management.event.ManagementUIEvent;
import org.eclipse.hawkbit.ui.management.event.ManagementViewAcceptCriteria;
@@ -78,8 +78,6 @@ public class TargetTagFilterButtons extends AbstractFilterButtons {
@Autowired
private transient TargetManagement targetManagement;
private static final String ITEMID = "itemId";
TargetTagFilterButtonClick filterButtonClickBehaviour;
/**
@@ -212,35 +210,46 @@ public class TargetTagFilterButtons extends AbstractFilterButtons {
}
private void processTargetDrop(final DragAndDropEvent event) {
final com.vaadin.event.dd.TargetDetails targetDetails = event.getTargetDetails();
final TableTransferable transferable = (TableTransferable) event.getTransferable();
final Table source = transferable.getSourceComponent();
@SuppressWarnings("unchecked")
final AbstractTable<?, TargetIdName> targetTable = (AbstractTable<?, TargetIdName>) transferable
.getSourceComponent();
final Set<TargetIdName> targetSelected = HawkbitCommonUtil.getSelectedTargetDetails(source);
final Set<String> targetList = new HashSet<>();
if (transferable.getData(ITEMID) != null) {
if (!targetSelected.contains(transferable.getData(ITEMID))) {
targetList.add(((TargetIdName) transferable.getData(ITEMID)).getControllerId());
} else {
targetList.addAll(targetSelected.stream().map(t -> t.getControllerId()).collect(Collectors.toList()));
}
final Set<TargetIdName> targetSelected = targetTable.getDeletedEntityByTransferable(transferable);
final Set<String> targetList = targetSelected.stream().map(t -> t.getControllerId())
.collect(Collectors.toSet());
final String targTagName = HawkbitCommonUtil.removePrefix(targetDetails.getTarget().getId(),
SPUIDefinitions.TARGET_TAG_ID_PREFIXS);
final String targTagName = HawkbitCommonUtil.removePrefix(targetDetails.getTarget().getId(),
SPUIDefinitions.TARGET_TAG_ID_PREFIXS);
final List<String> tagsClickedList = managementUIState.getTargetTableFilters().getClickedTargetTags();
final TargetTagAssignmentResult result = targetManagement.toggleTagAssignment(targetList, targTagName);
notification.displaySuccess(HawkbitCommonUtil.createAssignmentMessage(targTagName, result, i18n));
final TargetTagAssignmentResult result = targetManagement.toggleTagAssignment(targetList, targTagName);
notification.displaySuccess(HawkbitCommonUtil.createAssignmentMessage(targTagName, result, i18n));
publishAssignTargetTagEvent(result);
if (result.getAssigned() >= 1 && managementUIState.getTargetTableFilters().isNoTagSelected()) {
eventBus.publish(this, ManagementUIEvent.ASSIGN_TARGET_TAG);
}
if (result.getUnassigned() >= 1 && !tagsClickedList.isEmpty() && tagsClickedList.contains(targTagName)) {
eventBus.publish(this, ManagementUIEvent.UNASSIGN_TARGET_TAG);
}
publishUnAssignTargetTagEvent(targTagName, result);
}
private void publishUnAssignTargetTagEvent(final String targTagName, final TargetTagAssignmentResult result) {
final List<String> tagsClickedList = managementUIState.getTargetTableFilters().getClickedTargetTags();
final boolean isTargetTagUnAssigned = result.getUnassigned() >= 1 && !tagsClickedList.isEmpty()
&& tagsClickedList.contains(targTagName);
if (!isTargetTagUnAssigned) {
return;
}
eventBus.publish(this, ManagementUIEvent.UNASSIGN_TARGET_TAG);
}
private void publishAssignTargetTagEvent(final TargetTagAssignmentResult result) {
final boolean isNewTargetTagAssigned = result.getAssigned() >= 1
&& managementUIState.getTargetTableFilters().isNoTagSelected();
if (!isNewTargetTagAssigned) {
return;
}
eventBus.publish(this, ManagementUIEvent.ASSIGN_TARGET_TAG);
}
private boolean validateIfSourceisTargetTable(final Table source) {
@@ -287,6 +296,7 @@ public class TargetTagFilterButtons extends AbstractFilterButtons {
}
}
@SuppressWarnings("unchecked")
private void addNewTargetTag(final TargetTag newTargetTag) {
final LazyQueryContainer targetTagContainer = (LazyQueryContainer) getContainerDataSource();
final Object addItem = targetTagContainer.addItem();

View File

@@ -9,122 +9,133 @@
package org.eclipse.hawkbit.ui.rollout.rollout;
import org.eclipse.hawkbit.repository.model.Rollout;
import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData;
import com.vaadin.server.FontAwesome;
/**
* Proxy rollout with suctome properties.
* Proxy rollout with custom properties.
*
*/
public class ProxyRollout extends Rollout {
private static final long serialVersionUID = 4539849939617681918L;
private static final long serialVersionUID = 4539849939617681918L;
private String distributionSetNameVersion;
private String distributionSetNameVersion;
private String createdDate;
private String createdDate;
private String modifiedDate;
private String modifiedDate;
private Long numberOfGroups;
private Long numberOfGroups;
private Boolean isActionRecieved = Boolean.FALSE;
private Boolean isActionRecieved = Boolean.FALSE;
private String totalTargetsCount;
/**
* @return the distributionSetNameVersion
*/
public String getDistributionSetNameVersion() {
return distributionSetNameVersion;
}
private String totalTargetsCount;
/**
* @param distributionSetNameVersion
* the distributionSetNameVersion to set
*/
public void setDistributionSetNameVersion(final String distributionSetNameVersion) {
this.distributionSetNameVersion = distributionSetNameVersion;
}
private RolloutRendererData rolloutRendererData;
/**
* @return the numberOfGroups
*/
public Long getNumberOfGroups() {
return numberOfGroups;
}
/**
* @param numberOfGroups
* the numberOfGroups to set
*/
public void setNumberOfGroups(final Long numberOfGroups) {
this.numberOfGroups = numberOfGroups;
}
public RolloutRendererData getRolloutRendererData() {
return rolloutRendererData;
}
/**
* @return the createdDate
*/
public String getCreatedDate() {
return createdDate;
}
public void setRolloutRendererData(RolloutRendererData rendererData) {
this.rolloutRendererData = rendererData;
}
/**
* @param createdDate
* the createdDate to set
*/
public void setCreatedDate(final String createdDate) {
this.createdDate = createdDate;
}
/**
* @return the distributionSetNameVersion
*/
public String getDistributionSetNameVersion() {
return distributionSetNameVersion;
}
/**
* @return the modifiedDate
*/
public String getModifiedDate() {
return modifiedDate;
}
/**
* @param distributionSetNameVersion
* the distributionSetNameVersion to set
*/
public void setDistributionSetNameVersion(final String distributionSetNameVersion) {
this.distributionSetNameVersion = distributionSetNameVersion;
}
/**
* @param modifiedDate
* the modifiedDate to set
*/
public void setModifiedDate(final String modifiedDate) {
this.modifiedDate = modifiedDate;
}
/**
* @return the numberOfGroups
*/
public Long getNumberOfGroups() {
return numberOfGroups;
}
/**
* @return the isActionRecieved
*/
public Boolean getIsActionRecieved() {
return isActionRecieved;
}
/**
* @param numberOfGroups
* the numberOfGroups to set
*/
public void setNumberOfGroups(final Long numberOfGroups) {
this.numberOfGroups = numberOfGroups;
}
/**
* @param isActionRecieved
* the isActionRecieved to set
*/
public void setIsActionRecieved(final Boolean isActionRecieved) {
this.isActionRecieved = isActionRecieved;
}
/**
* @return the createdDate
*/
public String getCreatedDate() {
return createdDate;
}
/**
* @return the totalTargetsCount
*/
public String getTotalTargetsCount() {
return totalTargetsCount;
}
/**
* @param createdDate
* the createdDate to set
*/
public void setCreatedDate(final String createdDate) {
this.createdDate = createdDate;
}
/**
* @return the modifiedDate
*/
public String getModifiedDate() {
return modifiedDate;
}
/**
* @param modifiedDate
* the modifiedDate to set
*/
public void setModifiedDate(final String modifiedDate) {
this.modifiedDate = modifiedDate;
}
/**
* @return the isActionRecieved
*/
public Boolean getIsActionRecieved() {
return isActionRecieved;
}
/**
* @param isActionRecieved
* the isActionRecieved to set
*/
public void setIsActionRecieved(final Boolean isActionRecieved) {
this.isActionRecieved = isActionRecieved;
}
/**
* @return the totalTargetsCount
*/
public String getTotalTargetsCount() {
return totalTargetsCount;
}
/**
* @param totalTargetsCount
* the totalTargetsCount to set
*/
public void setTotalTargetsCount(final String totalTargetsCount) {
this.totalTargetsCount = totalTargetsCount;
}
public String getAction() {
return FontAwesome.CIRCLE_O.getHtml();
}
/**
* @param totalTargetsCount
* the totalTargetsCount to set
*/
public void setTotalTargetsCount(final String totalTargetsCount) {
this.totalTargetsCount = totalTargetsCount;
}
public String getAction() {
return FontAwesome.CIRCLE_O.getHtml();
}
}

View File

@@ -17,6 +17,7 @@ import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.Rollout;
import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus;
import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData;
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
@@ -39,163 +40,165 @@ import com.google.common.base.Strings;
*/
public class RolloutBeanQuery extends AbstractBeanQuery<ProxyRollout> {
private static final long serialVersionUID = 4027879794344836185L;
private static final long serialVersionUID = 4027879794344836185L;
private final String searchText;
private final String searchText;
private Sort sort = new Sort(Direction.ASC, "createdAt");
private Sort sort = new Sort(Direction.ASC, "createdAt");
private transient RolloutManagement rolloutManagement;
private transient RolloutManagement rolloutManagement;
private transient TargetFilterQueryManagement filterQueryManagement;
private transient TargetFilterQueryManagement filterQueryManagement;
private transient RolloutUIState rolloutUIState;
private transient RolloutUIState rolloutUIState;
/**
* Parametric Constructor.
*
* @param definition
* as QueryDefinition
* @param queryConfig
* as Config
* @param sortIds
* as sort
* @param sortStates
* as Sort status
*/
public RolloutBeanQuery(final QueryDefinition definition, final Map<String, Object> queryConfig,
final Object[] sortIds, final boolean[] sortStates) {
super(definition, queryConfig, sortIds, sortStates);
/**
* Parametric Constructor.
*
* @param definition
* as QueryDefinition
* @param queryConfig
* as Config
* @param sortIds
* as sort
* @param sortStates
* as Sort status
*/
public RolloutBeanQuery(final QueryDefinition definition, final Map<String, Object> queryConfig,
final Object[] sortIds, final boolean[] sortStates) {
super(definition, queryConfig, sortIds, sortStates);
searchText = getSearchText();
searchText = getSearchText();
if (HawkbitCommonUtil.checkBolArray(sortStates)) {
// Initalize Sor
sort = new Sort(sortStates[0] ? Direction.ASC : Direction.DESC, (String) sortIds[0]);
// Add sort.
for (int targetId = 1; targetId < sortIds.length; targetId++) {
sort.and(new Sort(sortStates[targetId] ? Direction.ASC : Direction.DESC, (String) sortIds[targetId]));
}
}
}
if (HawkbitCommonUtil.checkBolArray(sortStates)) {
// Initalize Sor
sort = new Sort(sortStates[0] ? Direction.ASC : Direction.DESC, (String) sortIds[0]);
// Add sort.
for (int targetId = 1; targetId < sortIds.length; targetId++) {
sort.and(new Sort(sortStates[targetId] ? Direction.ASC : Direction.DESC, (String) sortIds[targetId]));
}
}
}
private String getSearchText() {
if (getRolloutUIState().getSearchText().isPresent()) {
return String.format("%%%s%%", getRolloutUIState().getSearchText().get());
}
return null;
}
private String getSearchText() {
if (getRolloutUIState().getSearchText().isPresent()) {
return String.format("%%%s%%", getRolloutUIState().getSearchText().get());
}
return null;
}
@Override
protected ProxyRollout constructBean() {
return new ProxyRollout();
}
@Override
protected ProxyRollout constructBean() {
return new ProxyRollout();
}
/*
* (non-Javadoc)
*
* @see
* org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery#loadBeans(int,
* int)
*/
@Override
protected List<ProxyRollout> loadBeans(final int startIndex, final int count) {
final Slice<Rollout> rolloutBeans;
if (Strings.isNullOrEmpty(searchText)) {
rolloutBeans = getRolloutManagement().findAllRolloutsWithDetailedStatus(
new PageRequest(startIndex / SPUIDefinitions.PAGE_SIZE, SPUIDefinitions.PAGE_SIZE, sort));
} else {
rolloutBeans = getRolloutManagement().findRolloutByFilters(
new PageRequest(startIndex / SPUIDefinitions.PAGE_SIZE, SPUIDefinitions.PAGE_SIZE, sort),
searchText);
}
return getProxyRolloutList(rolloutBeans);
}
/*
* (non-Javadoc)
*
* @see
* org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery#loadBeans(int,
* int)
*/
@Override
protected List<ProxyRollout> loadBeans(final int startIndex, final int count) {
final Slice<Rollout> rolloutBeans;
if (Strings.isNullOrEmpty(searchText)) {
rolloutBeans = getRolloutManagement().findAllRolloutsWithDetailedStatus(
new PageRequest(startIndex / SPUIDefinitions.PAGE_SIZE, SPUIDefinitions.PAGE_SIZE, sort));
} else {
rolloutBeans = getRolloutManagement().findRolloutByFilters(
new PageRequest(startIndex / SPUIDefinitions.PAGE_SIZE, SPUIDefinitions.PAGE_SIZE, sort),
searchText);
}
return getProxyRolloutList(rolloutBeans);
}
private List<ProxyRollout> getProxyRolloutList(final Slice<Rollout> rolloutBeans) {
final List<ProxyRollout> proxyRolloutList = new ArrayList<>();
for (final Rollout rollout : rolloutBeans) {
final ProxyRollout proxyRollout = new ProxyRollout();
proxyRollout.setName(rollout.getName());
proxyRollout.setDescription(rollout.getDescription());
final DistributionSet distributionSet = rollout.getDistributionSet();
proxyRollout.setDistributionSetNameVersion(HawkbitCommonUtil.getFormattedNameVersion(
distributionSet.getName(), distributionSet.getVersion()));
proxyRollout.setDistributionSet(distributionSet);
proxyRollout.setNumberOfGroups(Long.valueOf(rollout.getRolloutGroups().size()));
proxyRollout.setCreatedDate(SPDateTimeUtil.getFormattedDate(rollout.getCreatedAt()));
proxyRollout.setModifiedDate(SPDateTimeUtil.getFormattedDate(rollout.getLastModifiedAt()));
proxyRollout.setCreatedBy(HawkbitCommonUtil.getIMUser(rollout.getCreatedBy()));
proxyRollout.setLastModifiedBy(HawkbitCommonUtil.getIMUser(rollout.getLastModifiedBy()));
proxyRollout.setForcedTime(rollout.getForcedTime());
proxyRollout.setId(rollout.getId());
proxyRollout.setStatus(rollout.getStatus());
private List<ProxyRollout> getProxyRolloutList(final Slice<Rollout> rolloutBeans) {
final List<ProxyRollout> proxyRolloutList = new ArrayList<>();
for (final Rollout rollout : rolloutBeans) {
final ProxyRollout proxyRollout = new ProxyRollout();
proxyRollout.setName(rollout.getName());
proxyRollout.setDescription(rollout.getDescription());
final DistributionSet distributionSet = rollout.getDistributionSet();
proxyRollout.setDistributionSetNameVersion(
HawkbitCommonUtil.getFormattedNameVersion(distributionSet.getName(), distributionSet.getVersion()));
proxyRollout.setDistributionSet(distributionSet);
proxyRollout.setNumberOfGroups(Long.valueOf(rollout.getRolloutGroups().size()));
proxyRollout.setCreatedDate(SPDateTimeUtil.getFormattedDate(rollout.getCreatedAt()));
proxyRollout.setModifiedDate(SPDateTimeUtil.getFormattedDate(rollout.getLastModifiedAt()));
proxyRollout.setCreatedBy(HawkbitCommonUtil.getIMUser(rollout.getCreatedBy()));
proxyRollout.setLastModifiedBy(HawkbitCommonUtil.getIMUser(rollout.getLastModifiedBy()));
proxyRollout.setForcedTime(rollout.getForcedTime());
proxyRollout.setId(rollout.getId());
proxyRollout.setStatus(rollout.getStatus());
proxyRollout.setRolloutRendererData(new RolloutRendererData(rollout.getName(), rollout.getStatus().toString()));
final TotalTargetCountStatus totalTargetCountActionStatus = rollout.getTotalTargetCountStatus();
proxyRollout.setTotalTargetCountStatus(totalTargetCountActionStatus);
proxyRollout.setTotalTargetsCount(String.valueOf(rollout.getTotalTargets()));
proxyRolloutList.add(proxyRollout);
}
return proxyRolloutList;
}
final TotalTargetCountStatus totalTargetCountActionStatus = rollout.getTotalTargetCountStatus();
proxyRollout.setTotalTargetCountStatus(totalTargetCountActionStatus);
proxyRollout.setTotalTargetsCount(String.valueOf(rollout.getTotalTargets()));
/*
* (non-Javadoc)
*
* @see
* org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery#saveBeans(java
* .util.List, java.util.List, java.util.List)
*/
@Override
protected void saveBeans(final List<ProxyRollout> arg0, final List<ProxyRollout> arg1, final List<ProxyRollout> arg2) {
/**
* CRUD operations on Target will be done through repository methods
*/
}
proxyRolloutList.add(proxyRollout);
}
return proxyRolloutList;
}
/*
* (non-Javadoc)
*
* @see org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery#size()
*/
@Override
public int size() {
int size = getRolloutManagement().countRolloutsAll().intValue();
if (!Strings.isNullOrEmpty(searchText)) {
size = getRolloutManagement().countRolloutsAllByFilters(searchText).intValue();
}
return size;
}
/*
* (non-Javadoc)
*
* @see
* org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery#saveBeans(java
* .util.List, java.util.List, java.util.List)
*/
@Override
protected void saveBeans(final List<ProxyRollout> arg0, final List<ProxyRollout> arg1,
final List<ProxyRollout> arg2) {
/**
* CRUD operations on Target will be done through repository methods
*/
}
/**
* @return the rolloutManagement
*/
public RolloutManagement getRolloutManagement() {
if (null == rolloutManagement) {
rolloutManagement = SpringContextHelper.getBean(RolloutManagement.class);
}
return rolloutManagement;
}
/*
* (non-Javadoc)
*
* @see org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery#size()
*/
@Override
public int size() {
int size = getRolloutManagement().countRolloutsAll().intValue();
if (!Strings.isNullOrEmpty(searchText)) {
size = getRolloutManagement().countRolloutsAllByFilters(searchText).intValue();
}
return size;
}
/**
* @return the filterQueryManagement
*/
public TargetFilterQueryManagement getFilterQueryManagement() {
if (null == filterQueryManagement) {
filterQueryManagement = SpringContextHelper.getBean(TargetFilterQueryManagement.class);
}
return filterQueryManagement;
}
/**
* @return the rolloutManagement
*/
public RolloutManagement getRolloutManagement() {
if (null == rolloutManagement) {
rolloutManagement = SpringContextHelper.getBean(RolloutManagement.class);
}
return rolloutManagement;
}
/**
* @return the rolloutUIState
*/
public RolloutUIState getRolloutUIState() {
if (null == rolloutUIState) {
rolloutUIState = SpringContextHelper.getBean(RolloutUIState.class);
}
return rolloutUIState;
}
/**
* @return the filterQueryManagement
*/
public TargetFilterQueryManagement getFilterQueryManagement() {
if (null == filterQueryManagement) {
filterQueryManagement = SpringContextHelper.getBean(TargetFilterQueryManagement.class);
}
return filterQueryManagement;
}
/**
* @return the rolloutUIState
*/
public RolloutUIState getRolloutUIState() {
if (null == rolloutUIState) {
rolloutUIState = SpringContextHelper.getBean(RolloutUIState.class);
}
return rolloutUIState;
}
}

View File

@@ -22,9 +22,10 @@ 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.client.renderers.RolloutRendererData;
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.customrenderers.renderers.RolloutRenderer;
import org.eclipse.hawkbit.ui.rollout.DistributionBarHelper;
import org.eclipse.hawkbit.ui.rollout.StatusFontIcon;
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
@@ -77,6 +78,7 @@ public class RolloutListGrid extends AbstractGrid {
private static final String START_OPTION = "Start";
private static final String ROLLOUT_RENDERER_DATA = "rolloutRendererData";
@Autowired
private transient RolloutManagement rolloutManagement;
@@ -95,7 +97,10 @@ public class RolloutListGrid extends AbstractGrid {
private transient Map<RolloutStatus, StatusFontIcon> statusIconMap = new EnumMap<>(RolloutStatus.class);
/**
* Handles the RolloutEvent to refresh Grid.
*
*/
@EventBusListenerMethod(scope = EventScope.SESSION)
void onEvent(final RolloutEvent event) {
switch (event) {
@@ -132,10 +137,16 @@ public class RolloutListGrid extends AbstractGrid {
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 (rollout.getRolloutGroups() != null && groupCount != rollout.getRolloutGroups().size()) {
final int groupsCreated = rollout.getRolloutGroupsCreated();
if (groupsCreated != 0) {
item.getItemProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setValue(Long.valueOf(groupsCreated));
} else if (rollout.getRolloutGroups() != null && groupCount != rollout.getRolloutGroups().size()) {
item.getItemProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS)
.setValue(Long.valueOf(rollout.getRolloutGroups().size()));
}
item.getItemProperty(ROLLOUT_RENDERER_DATA)
.setValue(new RolloutRendererData(rollout.getName(), rollout.getStatus().toString()));
}
@Override
@@ -149,6 +160,7 @@ public class RolloutListGrid extends AbstractGrid {
protected void addContainerProperties() {
final LazyQueryContainer rolloutGridContainer = (LazyQueryContainer) getContainerDataSource();
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false, false);
rolloutGridContainer.addContainerProperty(ROLLOUT_RENDERER_DATA, RolloutRendererData.class, null, false, false);
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, null, false, false);
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, RolloutStatus.class, null, false,
false);
@@ -163,7 +175,7 @@ public class RolloutListGrid extends AbstractGrid {
false);
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_MODIFIED_BY, String.class, null, false,
false);
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS, Integer.class, 0, false,
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS, Long.class, 0, false,
false);
rolloutGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS, String.class, "0", false,
false);
@@ -177,8 +189,9 @@ public class RolloutListGrid extends AbstractGrid {
@Override
protected void setColumnExpandRatio() {
getColumn(SPUILabelDefinitions.VAR_NAME).setMinimumWidth(40);
getColumn(SPUILabelDefinitions.VAR_NAME).setMaximumWidth(150);
getColumn(ROLLOUT_RENDERER_DATA).setMinimumWidth(40);
getColumn(ROLLOUT_RENDERER_DATA).setMaximumWidth(150);
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setMinimumWidth(40);
getColumn(SPUILabelDefinitions.VAR_DIST_NAME_VERSION).setMaximumWidth(150);
@@ -202,7 +215,7 @@ public class RolloutListGrid extends AbstractGrid {
@Override
protected void setColumnHeaderNames() {
getColumn(SPUILabelDefinitions.VAR_NAME).setHeaderCaption(i18n.get("header.name"));
getColumn(ROLLOUT_RENDERER_DATA).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"));
@@ -225,7 +238,7 @@ public class RolloutListGrid extends AbstractGrid {
@Override
protected void setColumnProperties() {
final List<Object> columnList = new ArrayList<>();
columnList.add(SPUILabelDefinitions.VAR_NAME);
columnList.add(ROLLOUT_RENDERER_DATA);
columnList.add(SPUILabelDefinitions.VAR_DIST_NAME_VERSION);
columnList.add(SPUILabelDefinitions.VAR_STATUS);
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS);
@@ -245,6 +258,7 @@ public class RolloutListGrid extends AbstractGrid {
@Override
protected void setHiddenColumns() {
final List<Object> columnsToBeHidden = new ArrayList<>();
columnsToBeHidden.add(SPUILabelDefinitions.VAR_NAME);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_DATE);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_USER);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);
@@ -263,6 +277,8 @@ public class RolloutListGrid extends AbstractGrid {
@Override
protected void addColumnRenderes() {
getColumn(SPUILabelDefinitions.VAR_NUMBER_OF_GROUPS).setRenderer(new HtmlRenderer(),
new TotalTargetGroupsConverter());
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS).setRenderer(new HtmlRenderer(),
new TotalTargetCountStatusConverter());
@@ -270,7 +286,11 @@ public class RolloutListGrid extends AbstractGrid {
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)));
final RolloutRenderer customObjectRenderer = new RolloutRenderer(RolloutRendererData.class);
customObjectRenderer.addClickListener(event -> onClickOfRolloutName(event));
getColumn(ROLLOUT_RENDERER_DATA).setRenderer(customObjectRenderer);
}
private void createRolloutStatusToFontMap() {
@@ -403,6 +423,9 @@ public class RolloutListGrid extends AbstractGrid {
((LazyQueryContainer) getContainerDataSource()).refresh();
}
/**
* Generator to generate fontIcon by String.
*/
public final class FontIconGenerator extends PropertyValueGenerator<String> {
private static final long serialVersionUID = 2544026030795375748L;
@@ -428,8 +451,8 @@ public class RolloutListGrid extends AbstractGrid {
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 (ROLLOUT_RENDERER_DATA.equals(cell.getPropertyId())) {
return ((RolloutRendererData) cell.getProperty().getValue()).getName();
} else if (SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS.equals(cell.getPropertyId())) {
return DistributionBarHelper
.getTooltip(((TotalTargetCountStatus) cell.getValue()).getStatusTotalCountMap());
@@ -546,14 +569,14 @@ public class RolloutListGrid extends AbstractGrid {
@Override
public TotalTargetCountStatus convertToModel(final String value,
final Class<? extends TotalTargetCountStatus> targetType, final Locale locale)
throws com.vaadin.data.util.converter.Converter.ConversionException {
throws com.vaadin.data.util.converter.Converter.ConversionException {
return null;
}
@Override
public String convertToPresentation(final TotalTargetCountStatus value,
final Class<? extends String> targetType, final Locale locale)
throws com.vaadin.data.util.converter.Converter.ConversionException {
throws com.vaadin.data.util.converter.Converter.ConversionException {
return DistributionBarHelper.getDistributionBarAsHTMLString(value.getStatusTotalCountMap());
}
@@ -568,4 +591,39 @@ public class RolloutListGrid extends AbstractGrid {
}
}
/**
* Converter to convert 0 to empty, if total target groups is zero.
*
*/
class TotalTargetGroupsConverter implements Converter<String, Long> {
private static final long serialVersionUID = 6589305227035220369L;
@Override
public Long convertToModel(final String value, final Class<? extends Long> targetType, final Locale locale)
throws com.vaadin.data.util.converter.Converter.ConversionException {
return null;
}
@Override
public String convertToPresentation(final Long value, final Class<? extends String> targetType,
final Locale locale) throws com.vaadin.data.util.converter.Converter.ConversionException {
if (value == 0) {
return "";
}
return value.toString();
}
@Override
public Class<Long> getModelType() {
return Long.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
}
}

View File

@@ -9,200 +9,211 @@
package org.eclipse.hawkbit.ui.rollout.rolloutgroup;
import org.eclipse.hawkbit.repository.model.RolloutGroup;
import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData;
/**
* Proxy rollout group with suctome properties.
* Proxy rollout group with renderer properties.
*
*/
public class ProxyRolloutGroup extends RolloutGroup {
private static final long serialVersionUID = -2745056813306692356L;
private static final long serialVersionUID = -2745056813306692356L;
private String createdDate;
private String createdDate;
private String modifiedDate;
private String modifiedDate;
private String finishedPercentage;
private String finishedPercentage;
private Long runningTargetsCount;
private Long runningTargetsCount;
private Long scheduledTargetsCount;
private Long scheduledTargetsCount;
private Long cancelledTargetsCount;
private Long cancelledTargetsCount;
private Long errorTargetsCount;
private Long errorTargetsCount;
private Long finishedTargetsCount;
private Long finishedTargetsCount;
private Long notStartedTargetsCount;
private Long notStartedTargetsCount;
private Boolean isActionRecieved = Boolean.FALSE;
private Boolean isActionRecieved = Boolean.FALSE;
private String totalTargetsCount;
private String totalTargetsCount;
/**
* @return the createdDate
*/
public String getCreatedDate() {
return createdDate;
}
private RolloutRendererData rolloutRendererData;
/**
* @param createdDate
* the createdDate to set
*/
public void setCreatedDate(final String createdDate) {
this.createdDate = createdDate;
}
public RolloutRendererData getRolloutRendererData() {
return rolloutRendererData;
}
/**
* @return the modifiedDate
*/
public String getModifiedDate() {
return modifiedDate;
}
public void setRolloutRendererData(RolloutRendererData rendererData) {
this.rolloutRendererData = rendererData;
}
/**
* @param modifiedDate
* the modifiedDate to set
*/
public void setModifiedDate(final String modifiedDate) {
this.modifiedDate = modifiedDate;
}
/**
* @return the createdDate
*/
public String getCreatedDate() {
return createdDate;
}
/**
* @return the finishedPercentage
*/
public String getFinishedPercentage() {
return finishedPercentage;
}
/**
* @param createdDate
* the createdDate to set
*/
public void setCreatedDate(final String createdDate) {
this.createdDate = createdDate;
}
/**
* @param finishedPercentage
* the finishedPercentage to set
*/
public void setFinishedPercentage(final String finishedPercentage) {
this.finishedPercentage = finishedPercentage;
}
/**
* @return the modifiedDate
*/
public String getModifiedDate() {
return modifiedDate;
}
/**
* @return the runningTargetsCount
*/
public Long getRunningTargetsCount() {
return runningTargetsCount;
}
/**
* @param modifiedDate
* the modifiedDate to set
*/
public void setModifiedDate(final String modifiedDate) {
this.modifiedDate = modifiedDate;
}
/**
* @param runningTargetsCount
* the runningTargetsCount to set
*/
public void setRunningTargetsCount(final Long runningTargetsCount) {
this.runningTargetsCount = runningTargetsCount;
}
/**
* @return the finishedPercentage
*/
public String getFinishedPercentage() {
return finishedPercentage;
}
/**
* @return the scheduledTargetsCount
*/
public Long getScheduledTargetsCount() {
return scheduledTargetsCount;
}
/**
* @param finishedPercentage
* the finishedPercentage to set
*/
public void setFinishedPercentage(final String finishedPercentage) {
this.finishedPercentage = finishedPercentage;
}
/**
* @param scheduledTargetsCount
* the scheduledTargetsCount to set
*/
public void setScheduledTargetsCount(final Long scheduledTargetsCount) {
this.scheduledTargetsCount = scheduledTargetsCount;
}
/**
* @return the runningTargetsCount
*/
public Long getRunningTargetsCount() {
return runningTargetsCount;
}
/**
* @return the cancelledTargetsCount
*/
public Long getCancelledTargetsCount() {
return cancelledTargetsCount;
}
/**
* @param runningTargetsCount
* the runningTargetsCount to set
*/
public void setRunningTargetsCount(final Long runningTargetsCount) {
this.runningTargetsCount = runningTargetsCount;
}
/**
* @param cancelledTargetsCount
* the cancelledTargetsCount to set
*/
public void setCancelledTargetsCount(final Long cancelledTargetsCount) {
this.cancelledTargetsCount = cancelledTargetsCount;
}
/**
* @return the scheduledTargetsCount
*/
public Long getScheduledTargetsCount() {
return scheduledTargetsCount;
}
/**
* @return the errorTargetsCount
*/
public Long getErrorTargetsCount() {
return errorTargetsCount;
}
/**
* @param scheduledTargetsCount
* the scheduledTargetsCount to set
*/
public void setScheduledTargetsCount(final Long scheduledTargetsCount) {
this.scheduledTargetsCount = scheduledTargetsCount;
}
/**
* @param errorTargetsCount
* the errorTargetsCount to set
*/
public void setErrorTargetsCount(final Long errorTargetsCount) {
this.errorTargetsCount = errorTargetsCount;
}
/**
* @return the cancelledTargetsCount
*/
public Long getCancelledTargetsCount() {
return cancelledTargetsCount;
}
/**
* @return the finishedTargetsCount
*/
public Long getFinishedTargetsCount() {
return finishedTargetsCount;
}
/**
* @param cancelledTargetsCount
* the cancelledTargetsCount to set
*/
public void setCancelledTargetsCount(final Long cancelledTargetsCount) {
this.cancelledTargetsCount = cancelledTargetsCount;
}
/**
* @param finishedTargetsCount
* the finishedTargetsCount to set
*/
public void setFinishedTargetsCount(final Long finishedTargetsCount) {
this.finishedTargetsCount = finishedTargetsCount;
}
/**
* @return the errorTargetsCount
*/
public Long getErrorTargetsCount() {
return errorTargetsCount;
}
/**
* @return the notStartedTargetsCount
*/
public Long getNotStartedTargetsCount() {
return notStartedTargetsCount;
}
/**
* @param errorTargetsCount
* the errorTargetsCount to set
*/
public void setErrorTargetsCount(final Long errorTargetsCount) {
this.errorTargetsCount = errorTargetsCount;
}
/**
* @param notStartedTargetsCount
* the notStartedTargetsCount to set
*/
public void setNotStartedTargetsCount(final Long notStartedTargetsCount) {
this.notStartedTargetsCount = notStartedTargetsCount;
}
/**
* @return the finishedTargetsCount
*/
public Long getFinishedTargetsCount() {
return finishedTargetsCount;
}
/**
* @return the isActionRecieved
*/
public Boolean getIsActionRecieved() {
return isActionRecieved;
}
/**
* @param finishedTargetsCount
* the finishedTargetsCount to set
*/
public void setFinishedTargetsCount(final Long finishedTargetsCount) {
this.finishedTargetsCount = finishedTargetsCount;
}
/**
* @param isActionRecieved
* the isActionRecieved to set
*/
public void setIsActionRecieved(final Boolean isActionRecieved) {
this.isActionRecieved = isActionRecieved;
}
/**
* @return the notStartedTargetsCount
*/
public Long getNotStartedTargetsCount() {
return notStartedTargetsCount;
}
/**
* @return the totalTargetsCount
*/
public String getTotalTargetsCount() {
return totalTargetsCount;
}
/**
* @param notStartedTargetsCount
* the notStartedTargetsCount to set
*/
public void setNotStartedTargetsCount(final Long notStartedTargetsCount) {
this.notStartedTargetsCount = notStartedTargetsCount;
}
/**
* @param totalTargetsCount
* the totalTargetsCount to set
*/
public void setTotalTargetsCount(final String totalTargetsCount) {
this.totalTargetsCount = totalTargetsCount;
}
/**
* @return the isActionRecieved
*/
public Boolean getIsActionRecieved() {
return isActionRecieved;
}
/**
* @param isActionRecieved
* the isActionRecieved to set
*/
public void setIsActionRecieved(final Boolean isActionRecieved) {
this.isActionRecieved = isActionRecieved;
}
/**
* @return the totalTargetsCount
*/
public String getTotalTargetsCount() {
return totalTargetsCount;
}
/**
* @param totalTargetsCount
* the totalTargetsCount to set
*/
public void setTotalTargetsCount(final String totalTargetsCount) {
this.totalTargetsCount = totalTargetsCount;
}
}

View File

@@ -15,6 +15,7 @@ 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.ui.customrenderers.client.renderers.RolloutRendererData;
import org.eclipse.hawkbit.ui.rollout.state.RolloutUIState;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil;
@@ -34,158 +35,160 @@ import org.vaadin.addons.lazyquerycontainer.QueryDefinition;
*/
public class RolloutGroupBeanQuery extends AbstractBeanQuery<ProxyRolloutGroup> {
private static final long serialVersionUID = 5342450502894318589L;
private static final long serialVersionUID = 5342450502894318589L;
private Sort sort = new Sort(Direction.ASC, "createdAt");
private Sort sort = new Sort(Direction.ASC, "createdAt");
private transient Page<RolloutGroup> firstPageRolloutGroupSets = null;
private transient Page<RolloutGroup> firstPageRolloutGroupSets = null;
private transient RolloutManagement rolloutManagement;
private transient RolloutManagement rolloutManagement;
private transient RolloutGroupManagement rolloutGroupManagement;
private transient RolloutGroupManagement rolloutGroupManagement;
private transient RolloutUIState rolloutUIState;
private transient RolloutUIState rolloutUIState;
private final Long rolloutId;
private final Long rolloutId;
/**
* Parametric Constructor.
*
* @param definition
* as QueryDefinition
* @param queryConfig
* as Config
* @param sortPropertyIds
* as sort
* @param sortStates
* as Sort status
*/
public RolloutGroupBeanQuery(final QueryDefinition definition, final Map<String, Object> queryConfig,
final Object[] sortPropertyIds, final boolean[] sortStates) {
super(definition, queryConfig, sortPropertyIds, sortStates);
/**
* Parametric Constructor.
*
* @param definition
* as QueryDefinition
* @param queryConfig
* as Config
* @param sortPropertyIds
* as sort
* @param sortStates
* as Sort status
*/
public RolloutGroupBeanQuery(final QueryDefinition definition, final Map<String, Object> queryConfig,
final Object[] sortPropertyIds, final boolean[] sortStates) {
super(definition, queryConfig, sortPropertyIds, sortStates);
rolloutId = getRolloutId();
rolloutId = getRolloutId();
if (HawkbitCommonUtil.checkBolArray(sortStates)) {
// Initalize Sor
sort = new Sort(sortStates[0] ? Direction.ASC : Direction.DESC, (String) sortPropertyIds[0]);
// Add sort.
for (int targetId = 1; targetId < sortPropertyIds.length; targetId++) {
sort.and(new Sort(sortStates[targetId] ? Direction.ASC : Direction.DESC,
(String) sortPropertyIds[targetId]));
}
}
}
if (HawkbitCommonUtil.checkBolArray(sortStates)) {
// Initalize Sor
sort = new Sort(sortStates[0] ? Direction.ASC : Direction.DESC, (String) sortPropertyIds[0]);
// Add sort.
for (int targetId = 1; targetId < sortPropertyIds.length; targetId++) {
sort.and(new Sort(sortStates[targetId] ? Direction.ASC : Direction.DESC,
(String) sortPropertyIds[targetId]));
}
}
}
/**
* @return
*/
private Long getRolloutId() {
return getRolloutUIState().getRolloutId().isPresent() ? getRolloutUIState().getRolloutId().get() : null;
}
/**
* @return
*/
private Long getRolloutId() {
return getRolloutUIState().getRolloutId().isPresent() ? getRolloutUIState().getRolloutId().get() : null;
}
@Override
protected ProxyRolloutGroup constructBean() {
return new ProxyRolloutGroup();
}
@Override
protected ProxyRolloutGroup constructBean() {
return new ProxyRolloutGroup();
}
@Override
protected List<ProxyRolloutGroup> loadBeans(final int startIndex, final int count) {
List<RolloutGroup> proxyRolloutGroupsList = new ArrayList<>();
if (startIndex == 0 && firstPageRolloutGroupSets != null) {
proxyRolloutGroupsList = firstPageRolloutGroupSets.getContent();
} else if (null != rolloutId) {
proxyRolloutGroupsList = getRolloutGroupManagement()
.findAllRolloutGroupsWithDetailedStatus(rolloutId, new PageRequest(startIndex / count, count))
.getContent();
}
return getProxyRolloutGroupList(proxyRolloutGroupsList);
}
@Override
protected List<ProxyRolloutGroup> loadBeans(final int startIndex, final int count) {
List<RolloutGroup> proxyRolloutGroupsList = new ArrayList<>();
if (startIndex == 0 && firstPageRolloutGroupSets != null) {
proxyRolloutGroupsList = firstPageRolloutGroupSets.getContent();
} else if (null != rolloutId) {
proxyRolloutGroupsList = getRolloutGroupManagement()
.findAllRolloutGroupsWithDetailedStatus(rolloutId, new PageRequest(startIndex / count, count))
.getContent();
}
return getProxyRolloutGroupList(proxyRolloutGroupsList);
}
private List<ProxyRolloutGroup> getProxyRolloutGroupList(final List<RolloutGroup> rolloutGroupBeans) {
final List<ProxyRolloutGroup> proxyRolloutGroupsList = new ArrayList<>();
for (final RolloutGroup rolloutGroup : rolloutGroupBeans) {
final ProxyRolloutGroup proxyRolloutGroup = new ProxyRolloutGroup();
proxyRolloutGroup.setName(rolloutGroup.getName());
proxyRolloutGroup.setDescription(rolloutGroup.getDescription());
proxyRolloutGroup.setCreatedDate(SPDateTimeUtil.getFormattedDate(rolloutGroup.getCreatedAt()));
proxyRolloutGroup.setModifiedDate(SPDateTimeUtil.getFormattedDate(rolloutGroup.getLastModifiedAt()));
proxyRolloutGroup.setCreatedBy(HawkbitCommonUtil.getIMUser(rolloutGroup.getCreatedBy()));
proxyRolloutGroup.setLastModifiedBy(HawkbitCommonUtil.getIMUser(rolloutGroup.getLastModifiedBy()));
proxyRolloutGroup.setId(rolloutGroup.getId());
proxyRolloutGroup.setStatus(rolloutGroup.getStatus());
proxyRolloutGroup.setErrorAction(rolloutGroup.getErrorAction());
proxyRolloutGroup.setErrorActionExp(rolloutGroup.getErrorActionExp());
proxyRolloutGroup.setErrorCondition(rolloutGroup.getErrorCondition());
proxyRolloutGroup.setErrorConditionExp(rolloutGroup.getErrorConditionExp());
proxyRolloutGroup.setSuccessCondition(rolloutGroup.getSuccessCondition());
proxyRolloutGroup.setSuccessConditionExp(rolloutGroup.getSuccessConditionExp());
proxyRolloutGroup.setFinishedPercentage(calculateFinishedPercentage(rolloutGroup));
private List<ProxyRolloutGroup> getProxyRolloutGroupList(final List<RolloutGroup> rolloutGroupBeans) {
final List<ProxyRolloutGroup> proxyRolloutGroupsList = new ArrayList<>();
for (final RolloutGroup rolloutGroup : rolloutGroupBeans) {
final ProxyRolloutGroup proxyRolloutGroup = new ProxyRolloutGroup();
proxyRolloutGroup.setName(rolloutGroup.getName());
proxyRolloutGroup.setDescription(rolloutGroup.getDescription());
proxyRolloutGroup.setCreatedDate(SPDateTimeUtil.getFormattedDate(rolloutGroup.getCreatedAt()));
proxyRolloutGroup.setModifiedDate(SPDateTimeUtil.getFormattedDate(rolloutGroup.getLastModifiedAt()));
proxyRolloutGroup.setCreatedBy(HawkbitCommonUtil.getIMUser(rolloutGroup.getCreatedBy()));
proxyRolloutGroup.setLastModifiedBy(HawkbitCommonUtil.getIMUser(rolloutGroup.getLastModifiedBy()));
proxyRolloutGroup.setId(rolloutGroup.getId());
proxyRolloutGroup.setStatus(rolloutGroup.getStatus());
proxyRolloutGroup.setErrorAction(rolloutGroup.getErrorAction());
proxyRolloutGroup.setErrorActionExp(rolloutGroup.getErrorActionExp());
proxyRolloutGroup.setErrorCondition(rolloutGroup.getErrorCondition());
proxyRolloutGroup.setErrorConditionExp(rolloutGroup.getErrorConditionExp());
proxyRolloutGroup.setSuccessCondition(rolloutGroup.getSuccessCondition());
proxyRolloutGroup.setSuccessConditionExp(rolloutGroup.getSuccessConditionExp());
proxyRolloutGroup.setFinishedPercentage(calculateFinishedPercentage(rolloutGroup));
proxyRolloutGroup.setTotalTargetsCount(String.valueOf(rolloutGroup.getTotalTargets()));
proxyRolloutGroup.setTotalTargetCountStatus(rolloutGroup.getTotalTargetCountStatus());
proxyRolloutGroup.setRolloutRendererData(new RolloutRendererData(rolloutGroup.getName(), null));
proxyRolloutGroupsList.add(proxyRolloutGroup);
}
return proxyRolloutGroupsList;
}
proxyRolloutGroup.setTotalTargetsCount(String.valueOf(rolloutGroup.getTotalTargets()));
proxyRolloutGroup.setTotalTargetCountStatus(rolloutGroup.getTotalTargetCountStatus());
private String calculateFinishedPercentage(final RolloutGroup rolloutGroup) {
return HawkbitCommonUtil.formattingFinishedPercentage(rolloutGroup, getRolloutManagement()
.getFinishedPercentForRunningGroup(rolloutGroup.getRollout().getId(), rolloutGroup));
}
proxyRolloutGroupsList.add(proxyRolloutGroup);
}
return proxyRolloutGroupsList;
}
@Override
protected void saveBeans(final List<ProxyRolloutGroup> arg0, final List<ProxyRolloutGroup> arg1,
final List<ProxyRolloutGroup> arg2) {
/**
* CRUD operations be done through repository methods.
*/
}
private String calculateFinishedPercentage(final RolloutGroup rolloutGroup) {
return HawkbitCommonUtil.formattingFinishedPercentage(rolloutGroup, getRolloutManagement()
.getFinishedPercentForRunningGroup(rolloutGroup.getRollout().getId(), rolloutGroup));
}
@Override
public int size() {
long size = 0;
if (null != rolloutId) {
firstPageRolloutGroupSets = getRolloutGroupManagement().findAllRolloutGroupsWithDetailedStatus(rolloutId,
new PageRequest(0, SPUIDefinitions.PAGE_SIZE, sort));
size = firstPageRolloutGroupSets.getTotalElements();
}
if (size > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
@Override
protected void saveBeans(final List<ProxyRolloutGroup> arg0, final List<ProxyRolloutGroup> arg1,
final List<ProxyRolloutGroup> arg2) {
/**
* CRUD operations be done through repository methods.
*/
}
return (int) size;
}
@Override
public int size() {
long size = 0;
if (null != rolloutId) {
firstPageRolloutGroupSets = getRolloutGroupManagement().findAllRolloutGroupsWithDetailedStatus(rolloutId,
new PageRequest(0, SPUIDefinitions.PAGE_SIZE, sort));
size = firstPageRolloutGroupSets.getTotalElements();
}
if (size > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
/**
* @return the rolloutManagement
*/
public RolloutManagement getRolloutManagement() {
if (null == rolloutManagement) {
rolloutManagement = SpringContextHelper.getBean(RolloutManagement.class);
}
return rolloutManagement;
}
return (int) size;
}
/**
* @return the rolloutManagement
*/
public RolloutGroupManagement getRolloutGroupManagement() {
if (null == rolloutGroupManagement) {
rolloutGroupManagement = SpringContextHelper.getBean(RolloutGroupManagement.class);
}
return rolloutGroupManagement;
}
/**
* @return the rolloutManagement
*/
public RolloutManagement getRolloutManagement() {
if (null == rolloutManagement) {
rolloutManagement = SpringContextHelper.getBean(RolloutManagement.class);
}
return rolloutManagement;
}
/**
* @return the rolloutUIState
*/
public RolloutUIState getRolloutUIState() {
if (null == rolloutUIState) {
rolloutUIState = SpringContextHelper.getBean(RolloutUIState.class);
}
return rolloutUIState;
}
/**
* @return the rolloutManagement
*/
public RolloutGroupManagement getRolloutGroupManagement() {
if (null == rolloutGroupManagement) {
rolloutGroupManagement = SpringContextHelper.getBean(RolloutGroupManagement.class);
}
return rolloutGroupManagement;
}
/**
* @return the rolloutUIState
*/
public RolloutUIState getRolloutUIState() {
if (null == rolloutUIState) {
rolloutUIState = SpringContextHelper.getBean(RolloutUIState.class);
}
return rolloutUIState;
}
}

View File

@@ -17,13 +17,15 @@ import java.util.Map;
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.common.grid.AbstractGrid;
import org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRendererData;
import org.eclipse.hawkbit.ui.customrenderers.renderers.HtmlLabelRenderer;
import org.eclipse.hawkbit.ui.customrenderers.renderers.LinkRenderer;
import org.eclipse.hawkbit.ui.customrenderers.renderers.RolloutRenderer;
import org.eclipse.hawkbit.ui.rollout.DistributionBarHelper;
import org.eclipse.hawkbit.ui.rollout.StatusFontIcon;
import org.eclipse.hawkbit.ui.rollout.event.RolloutEvent;
@@ -59,9 +61,14 @@ import com.vaadin.ui.renderers.HtmlRenderer;
public class RolloutGroupListGrid extends AbstractGrid {
private static final long serialVersionUID = 4060904914954370524L;
private static final String ROLLOUT_RENDERER_DATA = "rolloutRendererData";
@Autowired
private transient RolloutGroupManagement rolloutGroupManagement;
@Autowired
private transient RolloutManagement rolloutManagement;
@Autowired
private transient RolloutUIState rolloutUIState;
@@ -103,6 +110,13 @@ public class RolloutGroupListGrid extends AbstractGrid {
item.getItemProperty(SPUILabelDefinitions.VAR_STATUS).setValue(rolloutGroup.getStatus());
item.getItemProperty(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS)
.setValue(rolloutGroup.getTotalTargetCountStatus());
item.getItemProperty(SPUILabelDefinitions.ROLLOUT_GROUP_INSTALLED_PERCENTAGE)
.setValue(calculateFinishedPercentage(rolloutGroup));
}
private String calculateFinishedPercentage(final RolloutGroup rolloutGroup) {
return HawkbitCommonUtil.formattingFinishedPercentage(rolloutGroup,
rolloutManagement.getFinishedPercentForRunningGroup(rolloutGroup.getRollout().getId(), rolloutGroup));
}
@Override
@@ -116,6 +130,9 @@ public class RolloutGroupListGrid extends AbstractGrid {
protected void addContainerProperties() {
final LazyQueryContainer rolloutGroupGridContainer = (LazyQueryContainer) getContainerDataSource();
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, "", false, false);
rolloutGroupGridContainer.addContainerProperty(ROLLOUT_RENDERER_DATA, RolloutRendererData.class, null, false,
false);
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_DESC, String.class, null, false, false);
rolloutGroupGridContainer.addContainerProperty(SPUILabelDefinitions.VAR_STATUS, RolloutGroupStatus.class, null,
false, false);
@@ -145,8 +162,8 @@ public class RolloutGroupListGrid extends AbstractGrid {
@Override
protected void setColumnExpandRatio() {
getColumn(SPUILabelDefinitions.VAR_NAME).setMinimumWidth(40);
getColumn(SPUILabelDefinitions.VAR_NAME).setMaximumWidth(200);
getColumn(ROLLOUT_RENDERER_DATA).setMinimumWidth(40);
getColumn(ROLLOUT_RENDERER_DATA).setMaximumWidth(200);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMinimumWidth(40);
getColumn(SPUILabelDefinitions.VAR_TOTAL_TARGETS).setMaximumWidth(100);
@@ -170,7 +187,7 @@ public class RolloutGroupListGrid extends AbstractGrid {
@Override
protected void setColumnHeaderNames() {
getColumn(SPUILabelDefinitions.VAR_NAME).setHeaderCaption(i18n.get("header.name"));
getColumn(ROLLOUT_RENDERER_DATA).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"));
@@ -196,7 +213,7 @@ public class RolloutGroupListGrid extends AbstractGrid {
@Override
protected void setColumnProperties() {
final List<Object> columnList = new ArrayList<>();
columnList.add(SPUILabelDefinitions.VAR_NAME);
columnList.add(ROLLOUT_RENDERER_DATA);
columnList.add(SPUILabelDefinitions.VAR_STATUS);
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS);
columnList.add(SPUILabelDefinitions.VAR_TOTAL_TARGETS);
@@ -221,14 +238,15 @@ public class RolloutGroupListGrid extends AbstractGrid {
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)));
getColumn(ROLLOUT_RENDERER_DATA)
.setRenderer(new RolloutRenderer(event -> onClickOfRolloutGroupName(event)));
}
}
@Override
protected void setHiddenColumns() {
final List<Object> columnsToBeHidden = new ArrayList<>();
columnsToBeHidden.add(SPUILabelDefinitions.VAR_NAME);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_DATE);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_CREATED_USER);
columnsToBeHidden.add(SPUILabelDefinitions.VAR_MODIFIED_DATE);
@@ -268,8 +286,8 @@ public class RolloutGroupListGrid extends AbstractGrid {
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 (ROLLOUT_RENDERER_DATA.equals(cell.getPropertyId())) {
return ((RolloutRendererData) cell.getProperty().getValue()).getName();
} else if (SPUILabelDefinitions.VAR_TOTAL_TARGETS_COUNT_STATUS.equals(cell.getPropertyId())) {
return DistributionBarHelper
.getTooltip(((TotalTargetCountStatus) cell.getValue()).getStatusTotalCountMap());
@@ -306,14 +324,14 @@ public class RolloutGroupListGrid extends AbstractGrid {
@Override
public TotalTargetCountStatus convertToModel(final String value,
final Class<? extends TotalTargetCountStatus> targetType, final Locale locale)
throws com.vaadin.data.util.converter.Converter.ConversionException {
throws com.vaadin.data.util.converter.Converter.ConversionException {
return null;
}
@Override
public String convertToPresentation(final TotalTargetCountStatus value,
final Class<? extends String> targetType, final Locale locale)
throws com.vaadin.data.util.converter.Converter.ConversionException {
throws com.vaadin.data.util.converter.Converter.ConversionException {
return DistributionBarHelper.getDistributionBarAsHTMLString(value.getStatusTotalCountMap());
}

View File

@@ -11,6 +11,7 @@ package org.eclipse.hawkbit.ui.tenantconfiguration;
import javax.annotation.PostConstruct;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.tenantconfiguration.authentication.AnonymousDownloadAuthenticationConfigurationItem;
import org.eclipse.hawkbit.ui.tenantconfiguration.authentication.AuthenticationConfigurationItem;
import org.eclipse.hawkbit.ui.tenantconfiguration.authentication.CertificateAuthenticationConfigurationItem;
import org.eclipse.hawkbit.ui.tenantconfiguration.authentication.GatewaySecurityTokenAuthenticationConfigurationItem;
@@ -52,12 +53,17 @@ public class AuthenticationConfigurationView extends BaseConfigurationView
@Autowired
private GatewaySecurityTokenAuthenticationConfigurationItem gatewaySecurityTokenAuthenticationConfigurationItem;
@Autowired
private AnonymousDownloadAuthenticationConfigurationItem anonymousDownloadAuthenticationConfigurationItem;
private CheckBox gatewaySecTokenCheckBox;
private CheckBox targetSecTokenCheckBox;
private CheckBox certificateAuthCheckbox;
private CheckBox downloadAnonymousCheckBox;
/**
* Initialize Authentication Configuration layout.
*/
@@ -77,7 +83,7 @@ public class AuthenticationConfigurationView extends BaseConfigurationView
headerDisSetType.addStyleName("config-panel-header");
vLayout.addComponent(headerDisSetType);
final GridLayout gridLayout = new GridLayout(2, 3);
final GridLayout gridLayout = new GridLayout(2, 4);
gridLayout.setSpacing(true);
gridLayout.setImmediate(true);
gridLayout.setColumnExpandRatio(1, 1.0F);
@@ -105,6 +111,14 @@ public class AuthenticationConfigurationView extends BaseConfigurationView
gridLayout.addComponent(gatewaySecTokenCheckBox, 0, 2);
gridLayout.addComponent(gatewaySecurityTokenAuthenticationConfigurationItem, 1, 2);
downloadAnonymousCheckBox = SPUIComponentProvider.getCheckBox("", DIST_CHECKBOX_STYLE, null, false, "");
downloadAnonymousCheckBox.setId("downloadanonymouscheckbox");
downloadAnonymousCheckBox.setValue(targetSecurityTokenAuthenticationConfigurationItem.isConfigEnabled());
downloadAnonymousCheckBox.addValueChangeListener(this);
anonymousDownloadAuthenticationConfigurationItem.addChangeListener(this);
gridLayout.addComponent(downloadAnonymousCheckBox, 0, 3);
gridLayout.addComponent(anonymousDownloadAuthenticationConfigurationItem, 1, 3);
vLayout.addComponent(gridLayout);
rootPanel.setContent(vLayout);
setCompositionRoot(rootPanel);
@@ -115,6 +129,7 @@ public class AuthenticationConfigurationView extends BaseConfigurationView
certificateAuthenticationConfigurationItem.save();
targetSecurityTokenAuthenticationConfigurationItem.save();
gatewaySecurityTokenAuthenticationConfigurationItem.save();
anonymousDownloadAuthenticationConfigurationItem.save();
}
@Override
@@ -122,9 +137,11 @@ public class AuthenticationConfigurationView extends BaseConfigurationView
certificateAuthenticationConfigurationItem.undo();
targetSecurityTokenAuthenticationConfigurationItem.undo();
gatewaySecurityTokenAuthenticationConfigurationItem.undo();
anonymousDownloadAuthenticationConfigurationItem.undo();
certificateAuthCheckbox.setValue(certificateAuthenticationConfigurationItem.isConfigEnabled());
targetSecTokenCheckBox.setValue(targetSecurityTokenAuthenticationConfigurationItem.isConfigEnabled());
gatewaySecTokenCheckBox.setValue(gatewaySecurityTokenAuthenticationConfigurationItem.isConfigEnabled());
downloadAnonymousCheckBox.setValue(anonymousDownloadAuthenticationConfigurationItem.isConfigEnabled());
}
@Override
@@ -150,6 +167,8 @@ public class AuthenticationConfigurationView extends BaseConfigurationView
configurationItem = targetSecurityTokenAuthenticationConfigurationItem;
} else if (checkBox == certificateAuthCheckbox) {
configurationItem = certificateAuthenticationConfigurationItem;
} else if (checkBox == downloadAnonymousCheckBox) {
configurationItem = anonymousDownloadAuthenticationConfigurationItem;
} else {
return;
}

View File

@@ -1,119 +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.tenantconfiguration;
import javax.annotation.PostConstruct;
import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.repository.model.TenantConfigurationValue;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPUIComponetIdProvider;
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
import org.springframework.beans.factory.annotation.Autowired;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.ViewScope;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.GridLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Panel;
import com.vaadin.ui.VerticalLayout;
/**
* View to enable anonymous download.
*/
@SpringComponent
@ViewScope
public class DownloadAnonymousConfigurationView extends BaseConfigurationView
implements ConfigurationItem.ConfigurationItemChangeListener {
private static final String DIST_CHECKBOX_STYLE = "dist-checkbox-style";
private static final long serialVersionUID = 1L;
@Autowired
private I18N i18n;
@Autowired
private transient TenantConfigurationManagement tenantConfigurationManagement;
boolean anonymousDownloadEnabled;
private CheckBox downloadAnonymousCheckBox;
/**
* Initialize Default Download Anonymous layout.
*/
@PostConstruct
public void init() {
final TenantConfigurationValue<Boolean> value = tenantConfigurationManagement
.getConfigurationValue(TenantConfigurationKey.ANONYMOUS_DOWNLOAD_MODE_ENABLED, Boolean.class);
anonymousDownloadEnabled = value.getValue();
final Panel rootPanel = new Panel();
rootPanel.setSizeFull();
rootPanel.addStyleName("config-panel");
final VerticalLayout vLayout = new VerticalLayout();
vLayout.setMargin(true);
vLayout.setSizeFull();
final Label headerDisSetType = new Label(i18n.get("enonymous.download.title"));
headerDisSetType.addStyleName("config-panel-header");
vLayout.addComponent(headerDisSetType);
final GridLayout gridLayout = new GridLayout(2, 1);
gridLayout.setSpacing(true);
gridLayout.setImmediate(true);
gridLayout.setColumnExpandRatio(1, 1.0F);
gridLayout.setSizeFull();
downloadAnonymousCheckBox = SPUIComponentProvider.getCheckBox("", DIST_CHECKBOX_STYLE, null, false, "");
downloadAnonymousCheckBox.setValue(anonymousDownloadEnabled);
downloadAnonymousCheckBox.addValueChangeListener(event -> configurationHasChanged());
downloadAnonymousCheckBox.setId(SPUIComponetIdProvider.SYSTEM_CONFIGURATION_ANONYMOUS_DOWNLOAD_CHECKBOX);
gridLayout.addComponent(downloadAnonymousCheckBox);
final Label configurationLabel = SPUIComponentProvider.getLabel(i18n.get("enonymous.download.label"),
SPUILabelDefinitions.SP_LABEL_SIMPLE);
gridLayout.addComponent(configurationLabel);
gridLayout.setComponentAlignment(configurationLabel, Alignment.MIDDLE_LEFT);
vLayout.addComponent(gridLayout);
rootPanel.setContent(vLayout);
setCompositionRoot(rootPanel);
}
@Override
public void configurationHasChanged() {
anonymousDownloadEnabled = downloadAnonymousCheckBox.getValue();
notifyConfigurationChanged();
}
@Override
public void save() {
tenantConfigurationManagement.addOrUpdateConfiguration(TenantConfigurationKey.ANONYMOUS_DOWNLOAD_MODE_ENABLED,
downloadAnonymousCheckBox.getValue());
}
@Override
public void undo() {
final TenantConfigurationValue<Boolean> value = tenantConfigurationManagement
.getConfigurationValue(TenantConfigurationKey.ANONYMOUS_DOWNLOAD_MODE_ENABLED, Boolean.class);
anonymousDownloadEnabled = value.getValue();
downloadAnonymousCheckBox.setValue(anonymousDownloadEnabled);
}
}

View File

@@ -55,9 +55,6 @@ public class TenantConfigurationDashboardView extends CustomComponent implements
@Autowired
private PollingConfigurationView pollingConfigurationView;
@Autowired
private DownloadAnonymousConfigurationView downloadAnonymousConfigurationView;
@Autowired
private I18N i18n;
@@ -80,7 +77,6 @@ public class TenantConfigurationDashboardView extends CustomComponent implements
configurationViews.add(defaultDistributionSetTypeLayout);
configurationViews.add(authenticationConfigurationView);
configurationViews.add(pollingConfigurationView);
configurationViews.add(downloadAnonymousConfigurationView);
}
@Override

View File

@@ -14,7 +14,9 @@ import java.util.List;
import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
import org.springframework.beans.factory.annotation.Autowired;
import com.vaadin.ui.VerticalLayout;
@@ -30,6 +32,9 @@ abstract class AbstractAuthenticationTenantConfigurationItem extends VerticalLay
private static final long serialVersionUID = 1L;
@Autowired
private I18N i18n;
private final TenantConfigurationKey configurationKey;
private final transient TenantConfigurationManagement tenantConfigurationManagement;
@@ -53,7 +58,7 @@ abstract class AbstractAuthenticationTenantConfigurationItem extends VerticalLay
*/
protected void init(final String labelText) {
setImmediate(true);
addComponent(SPUIComponentProvider.getLabel(labelText, SPUILabelDefinitions.SP_LABEL_SIMPLE));
addComponent(SPUIComponentProvider.getLabel(i18n.get(labelText), SPUILabelDefinitions.SP_LABEL_SIMPLE));
}
@Override

View File

@@ -0,0 +1,72 @@
/**
* 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.tenantconfiguration.authentication;
import javax.annotation.PostConstruct;
import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey;
import org.springframework.beans.factory.annotation.Autowired;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.spring.annotation.ViewScope;
/**
* This class represents the UI item for the anonymous download by in the
* authentication configuration view.
*/
@SpringComponent
@ViewScope
public class AnonymousDownloadAuthenticationConfigurationItem extends AbstractAuthenticationTenantConfigurationItem {
private static final long serialVersionUID = 1L;
private boolean configurationEnabled = false;
private boolean configurationEnabledChange = false;
@Autowired
public AnonymousDownloadAuthenticationConfigurationItem(
final TenantConfigurationManagement tenantConfigurationManagement) {
super(TenantConfigurationKey.ANONYMOUS_DOWNLOAD_MODE_ENABLED, tenantConfigurationManagement);
}
@PostConstruct
public void init() {
super.init("label.configuration.anonymous.download");
configurationEnabled = isConfigEnabled();
}
@Override
public void configEnable() {
configurationEnabledChange = !configurationEnabled;
configurationEnabled = true;
}
@Override
public void configDisable() {
configurationEnabledChange = configurationEnabled;
configurationEnabled = false;
}
@Override
public void save() {
if (!configurationEnabledChange) {
return;
}
getTenantConfigurationManagement().addOrUpdateConfiguration(getConfigurationKey(), configurationEnabled);
}
@Override
public void undo() {
configurationEnabledChange = false;
configurationEnabled = getTenantConfigurationManagement()
.getConfigurationValue(getConfigurationKey(), Boolean.class).getValue();
}
}

View File

@@ -13,7 +13,6 @@ import javax.annotation.PostConstruct;
import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
import org.springframework.beans.factory.annotation.Autowired;
@@ -35,9 +34,6 @@ public class CertificateAuthenticationConfigurationItem extends AbstractAuthenti
private static final long serialVersionUID = 1L;
@Autowired
private I18N i18n;
private boolean configurationEnabled = false;
private boolean configurationEnabledChange = false;
private boolean configurationCaRootAuthorityChanged = false;
@@ -60,7 +56,7 @@ public class CertificateAuthenticationConfigurationItem extends AbstractAuthenti
*/
@PostConstruct
public void init() {
super.init(i18n.get("label.configuration.auth.header"));
super.init("label.configuration.auth.header");
configurationEnabled = isConfigEnabled();
detailLayout = new VerticalLayout();

View File

@@ -15,7 +15,6 @@ import org.eclipse.hawkbit.security.SecurityTokenGenerator;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmall;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
import org.springframework.beans.factory.annotation.Autowired;
@@ -41,8 +40,6 @@ public class GatewaySecurityTokenAuthenticationConfigurationItem extends Abstrac
@Autowired
private transient SecurityTokenGenerator securityTokenGenerator;
@Autowired
private I18N i18n;
private TextField gatewayTokenNameTextField;
@@ -72,7 +69,7 @@ public class GatewaySecurityTokenAuthenticationConfigurationItem extends Abstrac
@PostConstruct
public void init() {
super.init(i18n.get("label.configuration.auth.gatewaytoken"));
super.init("label.configuration.auth.gatewaytoken");
configurationEnabled = isConfigEnabled();
detailLayout = new VerticalLayout();

View File

@@ -12,7 +12,6 @@ import javax.annotation.PostConstruct;
import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.springframework.beans.factory.annotation.Autowired;
import com.vaadin.spring.annotation.SpringComponent;
@@ -28,9 +27,6 @@ public class TargetSecurityTokenAuthenticationConfigurationItem extends Abstract
private static final long serialVersionUID = 1L;
@Autowired
private I18N i18n;
private boolean configurationEnabled = false;
private boolean configurationEnabledChange = false;
@@ -49,7 +45,7 @@ public class TargetSecurityTokenAuthenticationConfigurationItem extends Abstract
*/
@PostConstruct
public void init() {
super.init(i18n.get("label.configuration.auth.targettoken"));
super.init("label.configuration.auth.targettoken");
configurationEnabled = isConfigEnabled();
}

View File

@@ -14,29 +14,23 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
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;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.hawkbit.im.authentication.UserPrincipal;
import org.eclipse.hawkbit.repository.SoftwareManagement;
import org.eclipse.hawkbit.repository.model.AssignmentResult;
import org.eclipse.hawkbit.repository.model.DistributionSetIdName;
import org.eclipse.hawkbit.repository.model.NamedEntity;
import org.eclipse.hawkbit.repository.model.RolloutGroup;
import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.repository.model.SoftwareModuleType;
import org.eclipse.hawkbit.repository.model.TargetIdName;
import org.eclipse.hawkbit.repository.model.TargetInfo.PollStatus;
import org.eclipse.hawkbit.repository.model.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.eclipse.hawkbit.ui.rollout.StatusFontIcon;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -96,8 +90,6 @@ public final class HawkbitCommonUtil {
private static final String COUNT_STYLE = " countStyle = document.createElement('style'); ";
private static final String COUNT_STYLE_ID = " countStyle.id=\"sp-drag-count\"; ";
private static final String APPEND_CHILD = " document.head.appendChild(countStyle);";
private static final String HEADER_VERSION = "header.version";
private static final String HEADER_NAME = "header.name";
private static final String SM_HIGHLIGHT_CREATE_SCRIPT = "smHighlight = document.createElement('style'); smHighlight.id=\"sm-table-highlight\"; document.head.appendChild(smHighlight); ";
private static final String SM_HIGHLIGHT_REMOVE_SCRIPT = "var y = document.getElementById('sm-table-highlight'); if(y) { document.head.removeChild(y); } ";
private static final String SM_HIGHLIGHT_RESET_SCRIPT = SM_HIGHLIGHT_REMOVE_SCRIPT + SM_HIGHLIGHT_CREATE_SCRIPT
@@ -879,8 +871,8 @@ public final class HawkbitCommonUtil {
* I18N
* @return message
*/
public static String createAssignmentMessage(final String tagName, final AssignmentResult<? extends NamedEntity> result,
final I18N i18n) {
public static String createAssignmentMessage(final String tagName,
final AssignmentResult<? extends NamedEntity> result, final I18N i18n) {
final StringBuilder formMsg = new StringBuilder();
final int assignedCount = result.getAssigned();
final int alreadyAssignedCount = result.getAlreadyAssigned();
@@ -960,43 +952,6 @@ public final class HawkbitCommonUtil {
lqc.addContainerProperty(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE, String.class, null, false, true);
}
/**
* Get visible columns in table.
*
* @param isMaximized
* true if table is maximized
* @param isShowPinColumn
* if true pin column will be displayed.
* @param i18n
* I18N
* @return List<TableColumn> list of columns to be displayed.
*/
public static List<TableColumn> getTableVisibleColumns(final Boolean isMaximized, final Boolean isShowPinColumn,
final I18N i18n) {
final List<TableColumn> columnList = new ArrayList<>();
if (isMaximized) {
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_NAME, i18n.get(HEADER_NAME), 0.2f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_VERSION, i18n.get(HEADER_VERSION), 0.1f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_BY, i18n.get("header.createdBy"), 0.1f));
columnList
.add(new TableColumn(SPUILabelDefinitions.VAR_CREATED_DATE, i18n.get("header.createdDate"), 0.1f));
columnList.add(
new TableColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_BY, i18n.get("header.modifiedBy"), 0.1f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_LAST_MODIFIED_DATE, i18n.get("header.modifiedDate"),
0.1f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_DESC, i18n.get("header.description"), 0.2f));
} else if (isShowPinColumn) {
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_NAME, i18n.get(HEADER_NAME), 0.7f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_VERSION, i18n.get(HEADER_VERSION), 0.2f));
columnList.add(new TableColumn(SPUILabelDefinitions.PIN_COLUMN, SP_STRING_EMPTY, 0.1f));
} else {
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_NAME, i18n.get(HEADER_NAME), 0.8f));
columnList.add(new TableColumn(SPUILabelDefinitions.VAR_VERSION, i18n.get(HEADER_VERSION), 0.2f));
}
return columnList;
}
/**
* Reset the software module table rows highlight css.
*
@@ -1103,36 +1058,6 @@ public final class HawkbitCommonUtil {
return DELETE_TAG_DROP_REMOVE_SCRIPT;
}
/**
* Get the details of selected rows of {@link TargetTable}.
*
* @param sourceTable
* @return set of {@link TargetIdName}
*/
public static Set<TargetIdName> getSelectedTargetDetails(final Table sourceTable) {
Set<TargetIdName> targetSelected = null;
if (sourceTable.getValue() != null) {
targetSelected = new LinkedHashSet<>((Set) sourceTable.getValue());
targetSelected.remove(null);
}
return targetSelected;
}
/**
* Get the details of selected rows of {@link DistributionTable}.
*
* @param sourceTable
* @return set of {@link DistributionSetIdName}
*/
public static Set<DistributionSetIdName> getSelectedDSDetails(final Table sourceTable) {
Set<DistributionSetIdName> distSelected = null;
if (sourceTable.getValue() != null) {
distSelected = new LinkedHashSet<>((Set) sourceTable.getValue());
distSelected.remove(null);
}
return distSelected;
}
/**
*
* Add target table container properties.

View File

@@ -19,20 +19,32 @@
}
}
.v-context-menu .v-context-menu-item-basic-icon-container{
height:0px !important;
width:0px !important;
}
.v-context-menu, .v-context-menu .v-context-menu-item-basic{
.v-context-menu .v-context-menu-item-basic{
background-color: #feffff !important;
border-radius: 4px;
font-family : $app-font-family;
font-size : $app-text-font-size;
font-weight : normal;
font-style : normal;
}
.v-context-menu{
background-color: #feffff !important;
border-radius: 4px;
}
.v-context-menu .v-context-menu-item-basic:focus, .v-context-menu .v-context-menu-item-basic-submenu:focus, .v-context-menu .v-context-menu-item-basic-open {
@include valo-gradient($color: $hawkbit-primary-color);
background-color: $hawkbit-primary-color !important;
color: #e8eef3;
height: 30px;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);
}
@@ -77,5 +89,9 @@
border-left: $v-grid-border-size solid $widget-border-color ;
}
.v-button-boldhide{
text-decoration:none;
}
}

View File

@@ -161,6 +161,7 @@ label.tag.name = Tag name
label.configuration.auth.header = Allow targets to authenticate via a certificate authenticated by an reverse proxy
label.configuration.auth.gatewaytoken = Allow a gateway to authenticate and manage multiple targets through a gateway security token
label.configuration.auth.targettoken = Allow targets to authenticate directly with their target security token
label.configuration.anonymous.download = Allow targets to download artifacts without security credentials
label.unsupported.browser.ie=Sorry! current browser is not supported. Please use Internet Explorer 11 and above
# Checkbox label prefix with - checkbox
@@ -401,8 +402,6 @@ configuration.polling.title=Polling Configuration
configuration.polling.time=Polling Time
configuration.polling.overduetime=Polling Overdue Time
configuration.polling.custom.value=use a custom value
enonymous.download.title=Anonymous download
enonymous.download.label=Allow anonymous download. If you enable this option the download server will accept anonymous download requests.
#Calendar
calendar.year=year

View File

@@ -159,6 +159,7 @@ label.tag.name = Tag name
label.configuration.auth.header = Allow targets to authenticate via a certificate authenticated by an reverse proxy
label.configuration.auth.gatewaytoken = Allow a gateway to authenticate and manage multiple targets through a gateway security token
label.configuration.auth.targettoken = Allow targets to authenticate directly with their target security token
label.configuration.anonymous.download = Allow targets to download artifacts without security credentials
label.unsupported.browser.ie=Sorry! current browser is not supported. Please use Internet Explorer 11 and above
# Checkbox label prefix with - checkbox
@@ -389,8 +390,7 @@ configuration.defaultdistributionset.select.label=Wahl des default Distribution
configuration.savebutton.tooltip=Konfigurationen speichern
configuration.cancellbutton.tooltip=Konfigurationen zur<75>cksetzen
configuration.authentication.title=Authentifikationseinstellungen
enonymous.download.title=Anonymes herunterladen
enonymous.download.label=Erlaube anonymes herunterladen. When diese option aktivert ist, wird der download server anonyme download anfragen erlauben.
#Calendar
calendar.year=Jahr
calendar.years=Jahre

View File

@@ -160,6 +160,7 @@ label.tag.name = Tag name
label.configuration.auth.header = Allow targets to authenticate via a certificate authenticated by an reverse proxy
label.configuration.auth.gatewaytoken = Allow a gateway to authenticate and manage multiple targets through a gateway security token
label.configuration.auth.targettoken = Allow targets to authenticate directly with their target security token
label.configuration.anonymous.download = Allow targets to download artifacts without security credentials
label.unsupported.browser.ie=Sorry! current browser is not supported. Please use Internet Explorer 11 and above
# Checkbox label prefix with - checkbox
@@ -383,8 +384,6 @@ configuration.authentication.title=Authentication Configuration
controller.polling.title=Polling Configuration
controller.polling.time=Polling Time
controller.polling.overduetime=Polling Overdue Time
enonymous.download.title=Anonymous download
enonymous.download.label=Allow anonymous download. If you enable this option the download server will accept anonymous download requests.
#Calendar
calendar.year=year