Merge remote-tracking branch 'origin/master' into fix_migration_to_new_spring_boot_version_merge_master

Signed-off-by: Ammar Bikic <ammar.bikic@bosch.io>
This commit is contained in:
Ammar Bikic
2020-11-09 16:12:03 +01:00
159 changed files with 3413 additions and 3765 deletions

View File

@@ -20,10 +20,9 @@
<name>hawkBit :: Repository :: JPA Implementation</name> <name>hawkBit :: Repository :: JPA Implementation</name>
<properties> <properties>
<javassist.version>3.20.0-GA</javassist.version>
<jaxb.api.version>2.3.0</jaxb.api.version>
<javax.annotation.version>1.3.1</javax.annotation.version>
<apt.source.dir>${project.build.directory}/generated-sources/apt/</apt.source.dir> <apt.source.dir>${project.build.directory}/generated-sources/apt/</apt.source.dir>
<classgraph.version>4.8.90</classgraph.version>
<eclipselink.maven.plugin.version>2.7.5.1</eclipselink.maven.plugin.version>
</properties> </properties>
<dependencies> <dependencies>
@@ -97,7 +96,7 @@
<plugin> <plugin>
<groupId>com.ethlo.persistence.tools</groupId> <groupId>com.ethlo.persistence.tools</groupId>
<artifactId>eclipselink-maven-plugin</artifactId> <artifactId>eclipselink-maven-plugin</artifactId>
<version>2.7.1.1</version> <version>${eclipselink.maven.plugin.version}</version>
<executions> <executions>
<execution> <execution>
<id>modelgen</id> <id>modelgen</id>
@@ -118,25 +117,24 @@
</configuration> </configuration>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>javax.xml.bind</groupId> <!--
<artifactId>jaxb-api</artifactId> Required for Java 11 since plugin version is build on
<version>${jaxb.api.version}</version> EclipseLink 2.7.5 (which doesn't have latest fixes for Java 11)
</dependency> -->
<dependency>
<groupId>org.eclipse.persistence</groupId> <groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.jpa</artifactId> <artifactId>org.eclipse.persistence.jpa</artifactId>
<version>${eclipselink.version}</version> <version>${eclipselink.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.javassist</groupId> <!--
<artifactId>javassist</artifactId> Required for Java 11 since plugin uses older version (4.8.21)
<version>${javassist.version}</version> which suffer from NPE while weaving. We require at least 4.8.48
</dependency> see: https://github.com/ethlo/eclipselink-maven-plugin/issues/31
<dependency> -->
<groupId>javax.annotation</groupId> <groupId>io.github.classgraph</groupId>
<artifactId>javax.annotation-api</artifactId> <artifactId>classgraph</artifactId>
<version>${javax.annotation.version}</version> <version>${classgraph.version}</version>
</dependency> </dependency>
</dependencies> </dependencies>
</plugin> </plugin>
<plugin> <plugin>

View File

@@ -16,7 +16,6 @@ import java.time.ZoneId;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -161,7 +160,7 @@ public class JpaTarget extends AbstractJpaNamedEntity implements Target, EventAw
@MapKeyColumn(name = "attribute_key", nullable = false, length = Target.CONTROLLER_ATTRIBUTE_KEY_SIZE) @MapKeyColumn(name = "attribute_key", nullable = false, length = Target.CONTROLLER_ATTRIBUTE_KEY_SIZE)
@CollectionTable(name = "sp_target_attributes", joinColumns = { @CollectionTable(name = "sp_target_attributes", joinColumns = {
@JoinColumn(name = "target_id", nullable = false, updatable = false) }, foreignKey = @ForeignKey(value = ConstraintMode.CONSTRAINT, name = "fk_targ_attrib_target")) @JoinColumn(name = "target_id", nullable = false, updatable = false) }, foreignKey = @ForeignKey(value = ConstraintMode.CONSTRAINT, name = "fk_targ_attrib_target"))
private final Map<String, String> controllerAttributes = Collections.synchronizedMap(new HashMap<String, String>()); private Map<String, String> controllerAttributes;
// set default request controller attributes to true, because we want to // set default request controller attributes to true, because we want to
// request them the first // request them the first

View File

@@ -153,7 +153,6 @@ public final class RSQLUtility {
try { try {
LOGGER.debug("parsing rsql string {}", rsql); LOGGER.debug("parsing rsql string {}", rsql);
final Set<ComparisonOperator> operators = RSQLOperators.defaultOperators(); final Set<ComparisonOperator> operators = RSQLOperators.defaultOperators();
operators.add(new ComparisonOperator("=li=", false));
return new RSQLParser(operators).parse(rsql); return new RSQLParser(operators).parse(rsql);
} catch (final IllegalArgumentException e) { } catch (final IllegalArgumentException e) {
throw new RSQLParameterSyntaxException("rsql filter must not be null", e); throw new RSQLParameterSyntaxException("rsql filter must not be null", e);

View File

@@ -24,6 +24,7 @@ import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.artifacts.details.ArtifactDetailsGridLayout; import org.eclipse.hawkbit.ui.artifacts.details.ArtifactDetailsGridLayout;
import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleGridLayout; import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleGridLayout;
import org.eclipse.hawkbit.ui.artifacts.smtype.filter.SMTypeFilterLayout; import org.eclipse.hawkbit.ui.artifacts.smtype.filter.SMTypeFilterLayout;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.event.EventViewAware; import org.eclipse.hawkbit.ui.common.event.EventViewAware;
@@ -77,14 +78,17 @@ public class UploadArtifactView extends VerticalLayout implements View, BrowserW
this.permChecker = permChecker; this.permChecker = permChecker;
this.artifactUploadState = artifactUploadState; this.artifactUploadState = artifactUploadState;
final CommonUiDependencies uiDependencies = new CommonUiDependencies(i18n, entityFactory, eventBus, uiNotification,
permChecker);
if (permChecker.hasReadRepositoryPermission()) { if (permChecker.hasReadRepositoryPermission()) {
this.smTypeFilterLayout = new SMTypeFilterLayout(i18n, permChecker, eventBus, entityFactory, uiNotification, this.smTypeFilterLayout = new SMTypeFilterLayout(uiDependencies, softwareModuleTypeManagement,
softwareModuleTypeManagement, artifactUploadState.getSmTypeFilterLayoutUiState()); artifactUploadState.getSmTypeFilterLayoutUiState(), EventView.UPLOAD);
this.smGridLayout = new SoftwareModuleGridLayout(i18n, permChecker, uiNotification, eventBus, this.smGridLayout = new SoftwareModuleGridLayout(uiDependencies, softwareModuleManagement,
softwareModuleManagement, softwareModuleTypeManagement, entityFactory, softwareModuleTypeManagement, artifactUploadState.getSmTypeFilterLayoutUiState(),
artifactUploadState.getSmTypeFilterLayoutUiState(), artifactUploadState.getSmGridLayoutUiState()); artifactUploadState.getSmGridLayoutUiState());
this.artifactDetailsGridLayout = new ArtifactDetailsGridLayout(i18n, eventBus, permChecker, uiNotification, this.artifactDetailsGridLayout = new ArtifactDetailsGridLayout(uiDependencies, artifactUploadState,
artifactUploadState, artifactUploadState.getArtifactDetailsGridLayoutUiState(), artifactManagement, artifactUploadState.getArtifactDetailsGridLayoutUiState(), artifactManagement,
softwareModuleManagement, multipartConfigElement); softwareModuleManagement, multipartConfigElement);
final Map<EventLayout, VisibilityHandler> layoutVisibilityHandlers = new EnumMap<>(EventLayout.class); final Map<EventLayout, VisibilityHandler> layoutVisibilityHandlers = new EnumMap<>(EventLayout.class);

View File

@@ -14,7 +14,7 @@ import java.util.stream.Collectors;
import org.eclipse.hawkbit.artifact.repository.model.AbstractDbArtifact; import org.eclipse.hawkbit.artifact.repository.model.AbstractDbArtifact;
import org.eclipse.hawkbit.repository.ArtifactManagement; import org.eclipse.hawkbit.repository.ArtifactManagement;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder; import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder;
import org.eclipse.hawkbit.ui.common.data.mappers.ArtifactToProxyArtifactMapper; import org.eclipse.hawkbit.ui.common.data.mappers.ArtifactToProxyArtifactMapper;
import org.eclipse.hawkbit.ui.common.data.providers.ArtifactDataProvider; import org.eclipse.hawkbit.ui.common.data.providers.ArtifactDataProvider;
@@ -33,8 +33,6 @@ import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification; import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.icons.VaadinIcons; import com.vaadin.icons.VaadinIcons;
import com.vaadin.server.FileDownloader; import com.vaadin.server.FileDownloader;
@@ -65,23 +63,15 @@ public class ArtifactDetailsGrid extends AbstractGrid<ProxyArtifact, Long> {
/** /**
* Constructor * Constructor
* *
* @param eventBus * @param uiDependencies
* UIEventBus * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param permissionChecker
* SpPermissionChecker
* @param notification
* UINotification
* @param artifactManagement * @param artifactManagement
* ArtifactManagement * ArtifactManagement
*/ */
public ArtifactDetailsGrid(final UIEventBus eventBus, final VaadinMessageSource i18n, public ArtifactDetailsGrid(final CommonUiDependencies uiDependencies, final ArtifactManagement artifactManagement) {
final SpPermissionChecker permissionChecker, final UINotification notification, super(uiDependencies.getI18n(), uiDependencies.getEventBus(), uiDependencies.getPermChecker());
final ArtifactManagement artifactManagement) {
super(i18n, eventBus, permissionChecker);
this.notification = notification; this.notification = uiDependencies.getUiNotification();
this.artifactManagement = artifactManagement; this.artifactManagement = artifactManagement;
this.artifactDeleteSupport = new DeleteSupport<>(this, i18n, notification, "artifact.details.header", this.artifactDeleteSupport = new DeleteSupport<>(this, i18n, notification, "artifact.details.header",

View File

@@ -8,6 +8,7 @@
*/ */
package org.eclipse.hawkbit.ui.artifacts.details; package org.eclipse.hawkbit.ui.artifacts.details;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.eclipse.hawkbit.ui.common.event.CommandTopics; import org.eclipse.hawkbit.ui.common.event.CommandTopics;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
@@ -19,8 +20,6 @@ import org.eclipse.hawkbit.ui.common.grid.header.support.ResizeHeaderSupport;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions; import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Header for ArtifactDetails with maximize-support. * Header for ArtifactDetails with maximize-support.
@@ -35,16 +34,14 @@ public class ArtifactDetailsGridHeader extends AbstractMasterAwareGridHeader<Pro
/** /**
* Constructor * Constructor
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param eventBus
* UIEventBus
* @param artifactDetailsGridLayoutUiState * @param artifactDetailsGridLayoutUiState
* ArtifactDetailsGridLayoutUiState * ArtifactDetailsGridLayoutUiState
*/ */
public ArtifactDetailsGridHeader(final VaadinMessageSource i18n, final UIEventBus eventBus, public ArtifactDetailsGridHeader(final CommonUiDependencies uiDependencies,
final ArtifactDetailsGridLayoutUiState artifactDetailsGridLayoutUiState) { final ArtifactDetailsGridLayoutUiState artifactDetailsGridLayoutUiState) {
super(i18n, null, eventBus); super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus());
this.artifactDetailsGridLayoutUiState = artifactDetailsGridLayoutUiState; this.artifactDetailsGridLayoutUiState = artifactDetailsGridLayoutUiState;

View File

@@ -15,10 +15,10 @@ import javax.servlet.MultipartConfigElement;
import org.eclipse.hawkbit.repository.ArtifactManagement; import org.eclipse.hawkbit.repository.ArtifactManagement;
import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SoftwareModuleManagement;
import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.artifacts.ArtifactUploadState; import org.eclipse.hawkbit.ui.artifacts.ArtifactUploadState;
import org.eclipse.hawkbit.ui.artifacts.upload.FileUploadProgress; import org.eclipse.hawkbit.ui.artifacts.upload.FileUploadProgress;
import org.eclipse.hawkbit.ui.artifacts.upload.UploadDropAreaLayout; import org.eclipse.hawkbit.ui.artifacts.upload.UploadDropAreaLayout;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
import org.eclipse.hawkbit.ui.common.event.EventLayoutViewAware; import org.eclipse.hawkbit.ui.common.event.EventLayoutViewAware;
@@ -28,9 +28,6 @@ import org.eclipse.hawkbit.ui.common.layout.AbstractGridComponentLayout;
import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent; import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent;
import org.eclipse.hawkbit.ui.common.layout.listener.GenericEventListener; import org.eclipse.hawkbit.ui.common.layout.listener.GenericEventListener;
import org.eclipse.hawkbit.ui.common.layout.listener.SelectionChangedListener; import org.eclipse.hawkbit.ui.common.layout.listener.SelectionChangedListener;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Display the details of the artifacts for a selected software module. * Display the details of the artifacts for a selected software module.
@@ -48,38 +45,29 @@ public class ArtifactDetailsGridLayout extends AbstractGridComponentLayout {
/** /**
* Constructor for ArtifactDetailsLayout * Constructor for ArtifactDetailsLayout
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param eventBus
* UIEventBus
* @param permChecker
* SpPermissionChecker
* @param notification
* UINotification
* @param artifactUploadState * @param artifactUploadState
* ArtifactUploadState * ArtifactUploadState
* @param artifactDetailsGridLayoutUiState * @param artifactDetailsGridLayoutUiState
* ArtifactDetailsGridLayoutUiState * ArtifactDetailsGridLayoutUiState
* @param artifactManagement * @param artifactManagement
* ArtifactManagement * ArtifactManagement
* @param softwareManagement * @param softwareManagement
* SoftwareModuleManagement * SoftwareModuleManagement
* @param multipartConfigElement * @param multipartConfigElement
* MultipartConfigElement * MultipartConfigElement
*/ */
public ArtifactDetailsGridLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, public ArtifactDetailsGridLayout(final CommonUiDependencies uiDependencies, final ArtifactUploadState artifactUploadState,
final SpPermissionChecker permChecker, final UINotification notification,
final ArtifactUploadState artifactUploadState,
final ArtifactDetailsGridLayoutUiState artifactDetailsGridLayoutUiState, final ArtifactDetailsGridLayoutUiState artifactDetailsGridLayoutUiState,
final ArtifactManagement artifactManagement, final SoftwareModuleManagement softwareManagement, final ArtifactManagement artifactManagement, final SoftwareModuleManagement softwareManagement,
final MultipartConfigElement multipartConfigElement) { final MultipartConfigElement multipartConfigElement) {
this.artifactDetailsHeader = new ArtifactDetailsGridHeader(i18n, eventBus, artifactDetailsGridLayoutUiState); this.artifactDetailsHeader = new ArtifactDetailsGridHeader(uiDependencies, artifactDetailsGridLayoutUiState);
this.artifactDetailsGrid = new ArtifactDetailsGrid(eventBus, i18n, permChecker, notification, this.artifactDetailsGrid = new ArtifactDetailsGrid(uiDependencies, artifactManagement);
artifactManagement);
if (permChecker.hasCreateRepositoryPermission()) { if (uiDependencies.getPermChecker().hasCreateRepositoryPermission()) {
this.uploadDropAreaLayout = new UploadDropAreaLayout(i18n, eventBus, notification, artifactUploadState, this.uploadDropAreaLayout = new UploadDropAreaLayout(uiDependencies, artifactUploadState, multipartConfigElement,
multipartConfigElement, softwareManagement, artifactManagement); softwareManagement, artifactManagement);
buildLayout(artifactDetailsHeader, artifactDetailsGrid, uploadDropAreaLayout); buildLayout(artifactDetailsHeader, artifactDetailsGrid, uploadDropAreaLayout);
} else { } else {
@@ -89,10 +77,10 @@ public class ArtifactDetailsGridLayout extends AbstractGridComponentLayout {
} }
final EventLayoutViewAware masterLayoutView = new EventLayoutViewAware(EventLayout.SM_LIST, EventView.UPLOAD); final EventLayoutViewAware masterLayoutView = new EventLayoutViewAware(EventLayout.SM_LIST, EventView.UPLOAD);
this.selectionChangedListener = new SelectionChangedListener<>(eventBus, masterLayoutView, this.selectionChangedListener = new SelectionChangedListener<>(uiDependencies.getEventBus(), masterLayoutView,
getMasterEntityAwareComponents()); getMasterEntityAwareComponents());
this.fileUploadChangedListener = new GenericEventListener<>(eventBus, EventTopics.FILE_UPLOAD_CHANGED, this.fileUploadChangedListener = new GenericEventListener<>(uiDependencies.getEventBus(),
this::onUploadChanged); EventTopics.FILE_UPLOAD_CHANGED, this::onUploadChanged);
} }
private List<MasterEntityAwareComponent<ProxySoftwareModule>> getMasterEntityAwareComponents() { private List<MasterEntityAwareComponent<ProxySoftwareModule>> getMasterEntityAwareComponents() {
@@ -103,7 +91,7 @@ public class ArtifactDetailsGridLayout extends AbstractGridComponentLayout {
* Checks progress on file upload * Checks progress on file upload
* *
* @param fileUploadProgress * @param fileUploadProgress
* FileUploadProgress * FileUploadProgress
*/ */
public void onUploadChanged(final FileUploadProgress fileUploadProgress) { public void onUploadChanged(final FileUploadProgress fileUploadProgress) {
if (uploadDropAreaLayout != null) { if (uploadDropAreaLayout != null) {

View File

@@ -8,59 +8,38 @@
*/ */
package org.eclipse.hawkbit.ui.artifacts.smtable; package org.eclipse.hawkbit.ui.artifacts.smtable;
import javax.validation.ConstraintViolationException;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SoftwareModuleManagement;
import org.eclipse.hawkbit.repository.builder.SoftwareModuleCreate; import org.eclipse.hawkbit.repository.builder.SoftwareModuleCreate;
import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; import org.eclipse.hawkbit.ui.common.AbstractAddNamedEntityWindowController;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.EntityWindowLayout;
import org.eclipse.hawkbit.ui.common.data.mappers.SoftwareModuleToProxyMapper; import org.eclipse.hawkbit.ui.common.data.mappers.SoftwareModuleToProxyMapper;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.eclipse.hawkbit.ui.common.event.CommandTopics;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload; import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload;
import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload.SelectionChangedEventType; import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload.SelectionChangedEventType;
import org.eclipse.hawkbit.ui.utils.UINotification; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Controller for populating and saving data in Add Software Module Window. * Controller for populating and saving data in Add Software Module Window.
*/ */
public class AddSmWindowController extends AbstractEntityWindowController<ProxySoftwareModule, ProxySoftwareModule> { public class AddSmWindowController
private static final Logger LOG = LoggerFactory.getLogger(AddSmWindowController.class); extends AbstractAddNamedEntityWindowController<ProxySoftwareModule, ProxySoftwareModule, SoftwareModule> {
private final VaadinMessageSource i18n;
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final SoftwareModuleManagement smManagement; private final SoftwareModuleManagement smManagement;
private final SmWindowLayout layout; private final SmWindowLayout layout;
private final EventView view; private final EventView view;
private final ProxySmValidator validator;
/** /**
* Constructor * Constructor
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param smManagement * @param smManagement
* SoftwareModuleManagement * SoftwareModuleManagement
* @param layout * @param layout
@@ -68,26 +47,18 @@ public class AddSmWindowController extends AbstractEntityWindowController<ProxyS
* @param view * @param view
* EventView * EventView
*/ */
public AddSmWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, public AddSmWindowController(final CommonUiDependencies uiDependencies, final SoftwareModuleManagement smManagement,
final UIEventBus eventBus, final UINotification uiNotification, final SoftwareModuleManagement smManagement,
final SmWindowLayout layout, final EventView view) { final SmWindowLayout layout, final EventView view) {
this.i18n = i18n; super(uiDependencies);
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.smManagement = smManagement; this.smManagement = smManagement;
this.layout = layout; this.layout = layout;
this.view = view; this.view = view;
this.validator = new ProxySmValidator(uiDependencies);
} }
/**
* @return software module layout
*/
@Override @Override
public AbstractEntityWindowLayout<ProxySoftwareModule> getLayout() { public EntityWindowLayout<ProxySoftwareModule> getLayout() {
return layout; return layout;
} }
@@ -99,48 +70,42 @@ public class AddSmWindowController extends AbstractEntityWindowController<ProxyS
} }
@Override @Override
protected void persistEntity(final ProxySoftwareModule entity) { protected SoftwareModule persistEntityInRepository(final ProxySoftwareModule entity) {
final SoftwareModuleCreate smCreate = entityFactory.softwareModule().create() final SoftwareModuleCreate smCreate = getEntityFactory().softwareModule().create()
.type(entity.getTypeInfo().getKey()).name(entity.getName()).version(entity.getVersion()) .type(entity.getTypeInfo().getKey()).name(entity.getName()).version(entity.getVersion())
.vendor(entity.getVendor()).description(entity.getDescription()); .vendor(entity.getVendor()).description(entity.getDescription());
final SoftwareModule newSoftwareModule; return smManagement.create(smCreate);
try { }
newSoftwareModule = smManagement.create(smCreate);
} catch (final ConstraintViolationException ex) {
LOG.trace("Create of software module failed in UI: {}", ex.getMessage());
uiNotification.displayValidationError(
i18n.getMessage("message.save.fail", entity.getName() + ":" + entity.getVersion()));
return;
}
uiNotification.displaySuccess(i18n.getMessage("message.save.success", @Override
newSoftwareModule.getName() + ":" + newSoftwareModule.getVersion())); protected String getDisplayableName(final SoftwareModule entity) {
eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( return HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion());
EntityModifiedEventType.ENTITY_ADDED, ProxySoftwareModule.class, newSoftwareModule.getId())); }
final ProxySoftwareModule addedItem = new SoftwareModuleToProxyMapper().map(newSoftwareModule); @Override
eventBus.publish(CommandTopics.SELECT_GRID_ENTITY, this, new SelectionChangedEventPayload<>( protected String getDisplayableNameForFailedMessage(final ProxySoftwareModule entity) {
SelectionChangedEventType.ENTITY_SELECTED, addedItem, EventLayout.SM_LIST, view)); return HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion());
}
@Override
protected Class<? extends ProxyIdentifiableEntity> getEntityClass() {
return ProxySoftwareModule.class;
}
@Override
protected void selectPersistedEntity(final SoftwareModule entity) {
final ProxySoftwareModule addedItem = new SoftwareModuleToProxyMapper().map(entity);
publishSelectionEvent(new SelectionChangedEventPayload<>(SelectionChangedEventType.ENTITY_SELECTED, addedItem,
EventLayout.SM_LIST, view));
} }
@Override @Override
protected boolean isEntityValid(final ProxySoftwareModule entity) { protected boolean isEntityValid(final ProxySoftwareModule entity) {
if (!StringUtils.hasText(entity.getName()) || !StringUtils.hasText(entity.getVersion())
|| entity.getTypeInfo() == null) {
uiNotification.displayValidationError(i18n.getMessage("message.error.missing.nameorversionortype"));
return false;
}
final String trimmedName = StringUtils.trimWhitespace(entity.getName()); final String trimmedName = StringUtils.trimWhitespace(entity.getName());
final String trimmedVersion = StringUtils.trimWhitespace(entity.getVersion()); final String trimmedVersion = StringUtils.trimWhitespace(entity.getVersion());
final Long typeId = entity.getTypeInfo().getId(); final Long typeId = entity.getTypeInfo().getId();
if (smManagement.getByNameAndVersionAndType(trimmedName, trimmedVersion, typeId).isPresent()) { return validator.isEntityValid(entity,
uiNotification.displayValidationError( () -> smManagement.getByNameAndVersionAndType(trimmedName, trimmedVersion, typeId).isPresent());
i18n.getMessage("message.duplicate.softwaremodule", trimmedName, trimmedVersion));
return false;
}
return true;
} }
} }

View File

@@ -0,0 +1,50 @@
/**
* Copyright (c) 2020 Bosch.IO 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.artifacts.smtable;
import java.util.function.BooleanSupplier;
import org.eclipse.hawkbit.ui.common.EntityValidator;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.springframework.util.StringUtils;
/**
* Validator used in SoftwareModule window controllers to validate
* {@link ProxySoftwareModule}.
*/
public class ProxySmValidator extends EntityValidator {
/**
* Constructor
*
* @param uiDependencies
* {@link CommonUiDependencies}
*/
public ProxySmValidator(final CommonUiDependencies uiDependencies) {
super(uiDependencies);
}
boolean isEntityValid(final ProxySoftwareModule entity, final BooleanSupplier duplicateCheck) {
if (!StringUtils.hasText(entity.getName()) || !StringUtils.hasText(entity.getVersion())
|| entity.getTypeInfo() == null) {
displayValidationError("message.error.missing.nameorversionortype");
return false;
}
final String trimmedName = StringUtils.trimWhitespace(entity.getName());
final String trimmedVersion = StringUtils.trimWhitespace(entity.getVersion());
if (duplicateCheck.getAsBoolean()) {
displayValidationError("message.duplicate.softwaremodule", trimmedName, trimmedVersion);
return false;
}
return true;
}
}

View File

@@ -8,14 +8,10 @@
*/ */
package org.eclipse.hawkbit.ui.artifacts.smtable; package org.eclipse.hawkbit.ui.artifacts.smtable;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SoftwareModuleManagement;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData;
import org.eclipse.hawkbit.ui.common.detailslayout.AbstractMetaDataWindowBuilder; import org.eclipse.hawkbit.ui.common.detailslayout.AbstractMetaDataWindowBuilder;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -23,38 +19,19 @@ import com.vaadin.ui.Window;
* Builder for Software module meta data windows * Builder for Software module meta data windows
*/ */
public class SmMetaDataWindowBuilder extends AbstractMetaDataWindowBuilder<Long> { public class SmMetaDataWindowBuilder extends AbstractMetaDataWindowBuilder<Long> {
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final SpPermissionChecker permChecker;
private final SoftwareModuleManagement smManagement; private final SoftwareModuleManagement smManagement;
/** /**
* Constructor for SmMetaDataWindowBuilder * Constructor for SmMetaDataWindowBuilder
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param permChecker
* SpPermissionChecker
* @param smManagement * @param smManagement
* SoftwareModuleManagement * SoftwareModuleManagement
*/ */
public SmMetaDataWindowBuilder(final VaadinMessageSource i18n, final EntityFactory entityFactory, public SmMetaDataWindowBuilder(final CommonUiDependencies uiDependencies, final SoftwareModuleManagement smManagement) {
final UIEventBus eventBus, final UINotification uiNotification, final SpPermissionChecker permChecker, super(uiDependencies);
final SoftwareModuleManagement smManagement) {
super(i18n);
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.permChecker = permChecker;
this.smManagement = smManagement; this.smManagement = smManagement;
} }
@@ -86,8 +63,6 @@ public class SmMetaDataWindowBuilder extends AbstractMetaDataWindowBuilder<Long>
* @return software module window * @return software module window
*/ */
public Window getWindowForShowSmMetaData(final Long smId, final String name, final ProxyMetaData proxyMetaData) { public Window getWindowForShowSmMetaData(final Long smId, final String name, final ProxyMetaData proxyMetaData) {
return getWindowForShowMetaData( return getWindowForShowMetaData(new SmMetaDataWindowLayout(uiDependencies, smManagement), smId, name, proxyMetaData);
new SmMetaDataWindowLayout(i18n, eventBus, permChecker, uiNotification, entityFactory, smManagement),
smId, name, proxyMetaData);
} }
} }

View File

@@ -8,10 +8,9 @@
*/ */
package org.eclipse.hawkbit.ui.artifacts.smtable; package org.eclipse.hawkbit.ui.artifacts.smtable;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SoftwareModuleManagement;
import org.eclipse.hawkbit.repository.model.MetaData; import org.eclipse.hawkbit.repository.model.MetaData;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.providers.SmMetaDataDataProvider; import org.eclipse.hawkbit.ui.common.data.providers.SmMetaDataDataProvider;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
@@ -23,9 +22,6 @@ import org.eclipse.hawkbit.ui.common.detailslayout.UpdateMetaDataWindowControlle
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Class for metadata add/update window layout. * Class for metadata add/update window layout.
@@ -34,7 +30,6 @@ public class SmMetaDataWindowLayout extends AbstractMetaDataWindowLayout<Long> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final transient SoftwareModuleManagement smManagement; private final transient SoftwareModuleManagement smManagement;
private final transient EntityFactory entityFactory;
private final MetaDataWindowGrid<Long> smMetaDataWindowGrid; private final MetaDataWindowGrid<Long> smMetaDataWindowGrid;
@@ -45,36 +40,25 @@ public class SmMetaDataWindowLayout extends AbstractMetaDataWindowLayout<Long> {
/** /**
* Constructor for AbstractTagWindowLayout * Constructor for AbstractTagWindowLayout
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param eventBus
* UIEventBus
* @param permChecker
* SpPermissionChecker
* @param uiNotification
* UINotification
* @param entityFactory
* EntityFactory
* @param smManagement * @param smManagement
* SoftwareModuleManagement * SoftwareModuleManagement
*/ */
public SmMetaDataWindowLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, public SmMetaDataWindowLayout(final CommonUiDependencies uiDependencies,
final SpPermissionChecker permChecker, final UINotification uiNotification, final SoftwareModuleManagement smManagement) {
final EntityFactory entityFactory, final SoftwareModuleManagement smManagement) { super(uiDependencies);
super(i18n, eventBus, uiNotification, permChecker);
this.smManagement = smManagement; this.smManagement = smManagement;
this.entityFactory = entityFactory;
this.smMetaDataWindowGrid = new MetaDataWindowGrid<>(i18n, eventBus, permChecker, uiNotification, this.smMetaDataWindowGrid = new MetaDataWindowGrid<>(uiDependencies, new SmMetaDataDataProvider(smManagement),
new SmMetaDataDataProvider(smManagement), this::hasMetadataChangePermission, this::deleteMetaData); this::hasMetadataChangePermission, this::deleteMetaData);
this.smMetaDataAddUpdateWindowLayout = new SmMetaDataAddUpdateWindowLayout(i18n, this.smMetaDataAddUpdateWindowLayout = new SmMetaDataAddUpdateWindowLayout(i18n,this::hasMetadataChangePermission);
this::hasMetadataChangePermission); this.addSmMetaDataWindowController = new AddMetaDataWindowController(uiDependencies,
this.addSmMetaDataWindowController = new AddMetaDataWindowController(i18n, uiNotification,
smMetaDataAddUpdateWindowLayout, this::createMetaData, this::isDuplicate); smMetaDataAddUpdateWindowLayout, this::createMetaData, this::isDuplicate);
this.updateSmMetaDataWindowController = new UpdateMetaDataWindowController(i18n, uiNotification, this.updateSmMetaDataWindowController = new UpdateMetaDataWindowController(uiDependencies,
smMetaDataAddUpdateWindowLayout, this::updateMetaData); smMetaDataAddUpdateWindowLayout, this::updateMetaData, this::isDuplicate);
buildLayout(); buildLayout();
addGridSelectionListener(); addGridSelectionListener();
@@ -87,14 +71,15 @@ public class SmMetaDataWindowLayout extends AbstractMetaDataWindowLayout<Long> {
@Override @Override
protected MetaData doCreateMetaData(final ProxyMetaData entity) { protected MetaData doCreateMetaData(final ProxyMetaData entity) {
return smManagement.createMetaData(entityFactory.softwareModuleMetadata().create(masterEntityFilter) return smManagement
.key(entity.getKey()).value(entity.getValue()).targetVisible(entity.isVisibleForTargets())); .createMetaData(uiDependencies.getEntityFactory().softwareModuleMetadata().create(masterEntityFilter)
.key(entity.getKey()).value(entity.getValue()).targetVisible(entity.isVisibleForTargets()));
} }
@Override @Override
protected MetaData doUpdateMetaData(final ProxyMetaData entity) { protected MetaData doUpdateMetaData(final ProxyMetaData entity) {
return smManagement return smManagement.updateMetaData(
.updateMetaData(entityFactory.softwareModuleMetadata().update(masterEntityFilter, entity.getKey()) uiDependencies.getEntityFactory().softwareModuleMetadata().update(masterEntityFilter, entity.getKey())
.value(entity.getValue()).targetVisible(entity.isVisibleForTargets())); .value(entity.getValue()).targetVisible(entity.isVisibleForTargets()));
} }

View File

@@ -8,16 +8,13 @@
*/ */
package org.eclipse.hawkbit.ui.artifacts.smtable; package org.eclipse.hawkbit.ui.artifacts.smtable;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SoftwareModuleManagement;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder; import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -25,9 +22,6 @@ import com.vaadin.ui.Window;
* Builder for Software module windows * Builder for Software module windows
*/ */
public class SmWindowBuilder extends AbstractEntityWindowBuilder<ProxySoftwareModule> { public class SmWindowBuilder extends AbstractEntityWindowBuilder<ProxySoftwareModule> {
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final SoftwareModuleManagement smManagement; private final SoftwareModuleManagement smManagement;
private final SoftwareModuleTypeManagement smTypeManagement; private final SoftwareModuleTypeManagement smTypeManagement;
@@ -37,29 +31,18 @@ public class SmWindowBuilder extends AbstractEntityWindowBuilder<ProxySoftwareMo
/** /**
* Constructor for SmWindowBuilder * Constructor for SmWindowBuilder
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param smManagement * @param smManagement
* SoftwareModuleManagement * SoftwareModuleManagement
* @param smTypeManagement * @param smTypeManagement
* SoftwareModuleTypeManagement * SoftwareModuleTypeManagement
* @param view * @param view
* EventView * EventView
*/ */
public SmWindowBuilder(final VaadinMessageSource i18n, final EntityFactory entityFactory, final UIEventBus eventBus, public SmWindowBuilder(final CommonUiDependencies uiDependencies, final SoftwareModuleManagement smManagement,
final UINotification uiNotification, final SoftwareModuleManagement smManagement,
final SoftwareModuleTypeManagement smTypeManagement, final EventView view) { final SoftwareModuleTypeManagement smTypeManagement, final EventView view) {
super(i18n); super(uiDependencies);
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.smManagement = smManagement; this.smManagement = smManagement;
this.smTypeManagement = smTypeManagement; this.smTypeManagement = smTypeManagement;
@@ -77,20 +60,20 @@ public class SmWindowBuilder extends AbstractEntityWindowBuilder<ProxySoftwareMo
*/ */
@Override @Override
public Window getWindowForAdd() { public Window getWindowForAdd() {
return getWindowForNewEntity(new AddSmWindowController(i18n, entityFactory, eventBus, uiNotification, return getWindowForNewEntity(
smManagement, new SmWindowLayout(i18n, smTypeManagement), view)); new AddSmWindowController(uiDependencies, smManagement, new SmWindowLayout(getI18n(), smTypeManagement), view));
} }
/** /**
* @param proxySm * @param proxySm
* ProxySoftwareModule * ProxySoftwareModule
* *
* @return update window for software module * @return update window for software module
*/ */
@Override @Override
public Window getWindowForUpdate(final ProxySoftwareModule proxySm) { public Window getWindowForUpdate(final ProxySoftwareModule proxySm) {
return getWindowForEntity(proxySm, new UpdateSmWindowController(i18n, entityFactory, eventBus, uiNotification, return getWindowForEntity(proxySm,
smManagement, new SmWindowLayout(i18n, smTypeManagement))); new UpdateSmWindowController(uiDependencies, smManagement, new SmWindowLayout(getI18n(), smTypeManagement)));
} }
} }

View File

@@ -16,8 +16,8 @@ import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SoftwareModuleManagement;
import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.artifacts.upload.FileUploadProgress; import org.eclipse.hawkbit.ui.artifacts.upload.FileUploadProgress;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder; import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder;
import org.eclipse.hawkbit.ui.common.data.filters.SwFilterParams; import org.eclipse.hawkbit.ui.common.data.filters.SwFilterParams;
import org.eclipse.hawkbit.ui.common.data.mappers.AssignedSoftwareModuleToProxyMapper; import org.eclipse.hawkbit.ui.common.data.mappers.AssignedSoftwareModuleToProxyMapper;
@@ -42,8 +42,6 @@ import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState;
import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState; import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification; import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Button; import com.vaadin.ui.Button;
@@ -75,14 +73,8 @@ public class SoftwareModuleGrid extends AbstractGrid<ProxySoftwareModule, SwFilt
/** /**
* Constructor for SoftwareModuleGrid * Constructor for SoftwareModuleGrid
* *
* @param eventBus * @param uiDependencies
* UIEventBus * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param permissionChecker
* SpPermissionChecker
* @param notification
* UINotification
* @param smTypeFilterLayoutUiState * @param smTypeFilterLayoutUiState
* TypeFilterLayoutUiState * TypeFilterLayoutUiState
* @param smGridLayoutUiState * @param smGridLayoutUiState
@@ -92,15 +84,14 @@ public class SoftwareModuleGrid extends AbstractGrid<ProxySoftwareModule, SwFilt
* @param view * @param view
* EventView * EventView
*/ */
public SoftwareModuleGrid(final UIEventBus eventBus, final VaadinMessageSource i18n, public SoftwareModuleGrid(final CommonUiDependencies uiDependencies, final TypeFilterLayoutUiState smTypeFilterLayoutUiState,
final SpPermissionChecker permissionChecker, final UINotification notification, final GridLayoutUiState smGridLayoutUiState, final SoftwareModuleManagement softwareModuleManagement,
final TypeFilterLayoutUiState smTypeFilterLayoutUiState, final GridLayoutUiState smGridLayoutUiState, final EventView view) {
final SoftwareModuleManagement softwareModuleManagement, final EventView view) { super(uiDependencies.getI18n(), uiDependencies.getEventBus(), uiDependencies.getPermChecker());
super(i18n, eventBus, permissionChecker);
this.smTypeFilterLayoutUiState = smTypeFilterLayoutUiState; this.smTypeFilterLayoutUiState = smTypeFilterLayoutUiState;
this.smGridLayoutUiState = smGridLayoutUiState; this.smGridLayoutUiState = smGridLayoutUiState;
this.notification = notification; this.notification = uiDependencies.getUiNotification();
this.softwareModuleManagement = softwareModuleManagement; this.softwareModuleManagement = softwareModuleManagement;
this.softwareModuleToProxyMapper = new SoftwareModuleToProxyMapper(); this.softwareModuleToProxyMapper = new SoftwareModuleToProxyMapper();

View File

@@ -8,7 +8,7 @@
*/ */
package org.eclipse.hawkbit.ui.artifacts.smtable; package org.eclipse.hawkbit.ui.artifacts.smtable;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
@@ -17,8 +17,6 @@ import org.eclipse.hawkbit.ui.common.grid.header.AbstractEntityGridHeader;
import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState; import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState;
import org.eclipse.hawkbit.ui.common.state.HidableLayoutUiState; import org.eclipse.hawkbit.ui.common.state.HidableLayoutUiState;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Header of Software module table. * Header of Software module table.
@@ -32,26 +30,21 @@ public class SoftwareModuleGridHeader extends AbstractEntityGridHeader {
/** /**
* Constructor for SoftwareModuleGridHeader * Constructor for SoftwareModuleGridHeader
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param permChecker
* SpPermissionChecker
* @param eventBus
* UIEventBus
* @param smTypeFilterLayoutUiState * @param smTypeFilterLayoutUiState
* HidableLayoutUiState * HidableLayoutUiState
* @param smGridLayoutUiState * @param smGridLayoutUiState
* GridLayoutUiState * GridLayoutUiState
* @param smWindowBuilder * @param smWindowBuilder
* SmWindowBuilder * SmWindowBuilder
* @param view * @param view
* EventView * EventView
*/ */
public SoftwareModuleGridHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, public SoftwareModuleGridHeader(final CommonUiDependencies uiDependencies,
final UIEventBus eventBus, final HidableLayoutUiState smTypeFilterLayoutUiState, final HidableLayoutUiState smTypeFilterLayoutUiState, final GridLayoutUiState smGridLayoutUiState,
final GridLayoutUiState smGridLayoutUiState, final SmWindowBuilder smWindowBuilder, final EventView view) { final SmWindowBuilder smWindowBuilder, final EventView view) {
super(i18n, permChecker, eventBus, smTypeFilterLayoutUiState, smGridLayoutUiState, EventLayout.SM_TYPE_FILTER, super(uiDependencies, smTypeFilterLayoutUiState, smGridLayoutUiState, EventLayout.SM_TYPE_FILTER, view);
view);
addAddHeaderSupport(smWindowBuilder); addAddHeaderSupport(smWindowBuilder);
} }

View File

@@ -11,11 +11,10 @@ package org.eclipse.hawkbit.ui.artifacts.smtable;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SoftwareModuleManagement;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.artifacts.upload.FileUploadProgress; import org.eclipse.hawkbit.ui.artifacts.upload.FileUploadProgress;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.eclipse.hawkbit.ui.common.detailslayout.SoftwareModuleDetails; import org.eclipse.hawkbit.ui.common.detailslayout.SoftwareModuleDetails;
import org.eclipse.hawkbit.ui.common.detailslayout.SoftwareModuleDetailsHeader; import org.eclipse.hawkbit.ui.common.detailslayout.SoftwareModuleDetailsHeader;
@@ -24,7 +23,6 @@ import org.eclipse.hawkbit.ui.common.event.EventLayoutViewAware;
import org.eclipse.hawkbit.ui.common.event.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.event.EventViewAware; import org.eclipse.hawkbit.ui.common.event.EventViewAware;
import org.eclipse.hawkbit.ui.common.layout.AbstractGridComponentLayout;
import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent; import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent;
import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener; import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener;
import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener.EntityModifiedAwareSupport; import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener.EntityModifiedAwareSupport;
@@ -34,16 +32,14 @@ import org.eclipse.hawkbit.ui.common.layout.listener.SelectGridEntityListener;
import org.eclipse.hawkbit.ui.common.layout.listener.SelectionChangedListener; import org.eclipse.hawkbit.ui.common.layout.listener.SelectionChangedListener;
import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGridRefreshAwareSupport; import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGridRefreshAwareSupport;
import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedSelectionAwareSupport; import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedSelectionAwareSupport;
import org.eclipse.hawkbit.ui.common.softwaremodule.AbstractSoftwareModuleGridLayout;
import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState; import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState;
import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState; import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Software module table layout. (Upload Management) * Software module table layout. (Upload Management)
*/ */
public class SoftwareModuleGridLayout extends AbstractGridComponentLayout { public class SoftwareModuleGridLayout extends AbstractSoftwareModuleGridLayout {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final SoftwareModuleGridHeader softwareModuleGridHeader; private final SoftwareModuleGridHeader softwareModuleGridHeader;
@@ -51,71 +47,51 @@ public class SoftwareModuleGridLayout extends AbstractGridComponentLayout {
private final SoftwareModuleDetailsHeader softwareModuleDetailsHeader; private final SoftwareModuleDetailsHeader softwareModuleDetailsHeader;
private final SoftwareModuleDetails softwareModuleDetails; private final SoftwareModuleDetails softwareModuleDetails;
private final transient FilterChangedListener<ProxySoftwareModule> smFilterListener;
private final transient SelectionChangedListener<ProxySoftwareModule> masterSmChangedListener;
private final transient SelectGridEntityListener<ProxySoftwareModule> selectSmListener;
private final transient EntityModifiedListener<ProxySoftwareModule> smModifiedListener;
private final transient GenericEventListener<FileUploadProgress> fileUploadChangedListener;
/** /**
* Constructor for SoftwareModuleGridLayout * Constructor for SoftwareModuleGridLayout
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param permChecker
* SpPermissionChecker
* @param uiNotification
* UINotification
* @param eventBus
* UIEventBus
* @param softwareModuleManagement * @param softwareModuleManagement
* SoftwareModuleManagement * SoftwareModuleManagement
* @param softwareModuleTypeManagement * @param softwareModuleTypeManagement
* SoftwareModuleTypeManagement * SoftwareModuleTypeManagement
* @param entityFactory
* EntityFactory
* @param smTypeFilterLayoutUiState * @param smTypeFilterLayoutUiState
* TypeFilterLayoutUiState * TypeFilterLayoutUiState
* @param smGridLayoutUiState * @param smGridLayoutUiState
* GridLayoutUiState * GridLayoutUiState
*/ */
public SoftwareModuleGridLayout(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, public SoftwareModuleGridLayout(final CommonUiDependencies uiDependencies,
final UINotification uiNotification, final UIEventBus eventBus,
final SoftwareModuleManagement softwareModuleManagement, final SoftwareModuleManagement softwareModuleManagement,
final SoftwareModuleTypeManagement softwareModuleTypeManagement, final EntityFactory entityFactory, final SoftwareModuleTypeManagement softwareModuleTypeManagement,
final TypeFilterLayoutUiState smTypeFilterLayoutUiState, final GridLayoutUiState smGridLayoutUiState) { final TypeFilterLayoutUiState smTypeFilterLayoutUiState, final GridLayoutUiState smGridLayoutUiState) {
super(); super(uiDependencies, softwareModuleManagement, softwareModuleTypeManagement, EventView.UPLOAD);
final SmWindowBuilder smWindowBuilder = new SmWindowBuilder(i18n, entityFactory, eventBus, uiNotification, this.softwareModuleGridHeader = new SoftwareModuleGridHeader(uiDependencies, smTypeFilterLayoutUiState,
softwareModuleManagement, softwareModuleTypeManagement, EventView.UPLOAD); smGridLayoutUiState, getSmWindowBuilder(), getEventView());
final SmMetaDataWindowBuilder smMetaDataWindowBuilder = new SmMetaDataWindowBuilder(i18n, entityFactory,
eventBus, uiNotification, permChecker, softwareModuleManagement);
this.softwareModuleGridHeader = new SoftwareModuleGridHeader(i18n, permChecker, eventBus,
smTypeFilterLayoutUiState, smGridLayoutUiState, smWindowBuilder, EventView.UPLOAD);
this.softwareModuleGridHeader.buildHeader(); this.softwareModuleGridHeader.buildHeader();
this.softwareModuleGrid = new SoftwareModuleGrid(eventBus, i18n, permChecker, uiNotification, this.softwareModuleGrid = new SoftwareModuleGrid(uiDependencies, smTypeFilterLayoutUiState, smGridLayoutUiState,
smTypeFilterLayoutUiState, smGridLayoutUiState, softwareModuleManagement, EventView.UPLOAD); softwareModuleManagement, getEventView());
this.softwareModuleGrid.init(); this.softwareModuleGrid.init();
this.softwareModuleDetailsHeader = new SoftwareModuleDetailsHeader(i18n, permChecker, eventBus, uiNotification, this.softwareModuleDetailsHeader = new SoftwareModuleDetailsHeader(uiDependencies, getSmWindowBuilder(),
smWindowBuilder, smMetaDataWindowBuilder); getSmMetaDataWindowBuilder());
this.softwareModuleDetailsHeader.buildHeader(); this.softwareModuleDetailsHeader.buildHeader();
this.softwareModuleDetails = new SoftwareModuleDetails(i18n, eventBus, softwareModuleManagement, this.softwareModuleDetails = new SoftwareModuleDetails(uiDependencies, softwareModuleManagement,
softwareModuleTypeManagement, smMetaDataWindowBuilder); softwareModuleTypeManagement, getSmMetaDataWindowBuilder());
this.softwareModuleDetails.buildDetails(); this.softwareModuleDetails.buildDetails();
this.smFilterListener = new FilterChangedListener<>(eventBus, ProxySoftwareModule.class, addEventListener(new FilterChangedListener<>(uiDependencies.getEventBus(), ProxySoftwareModule.class,
new EventViewAware(EventView.UPLOAD), softwareModuleGrid.getFilterSupport()); new EventViewAware(getEventView()), softwareModuleGrid.getFilterSupport()));
this.masterSmChangedListener = new SelectionChangedListener<>(eventBus, addEventListener(new SelectionChangedListener<>(uiDependencies.getEventBus(),
new EventLayoutViewAware(EventLayout.SM_LIST, EventView.UPLOAD), getMasterSmAwareComponents()); new EventLayoutViewAware(EventLayout.SM_LIST, getEventView()), getMasterSmAwareComponents()));
this.selectSmListener = new SelectGridEntityListener<>(eventBus, addEventListener(new SelectGridEntityListener<>(uiDependencies.getEventBus(),
new EventLayoutViewAware(EventLayout.SM_LIST, EventView.UPLOAD), new EventLayoutViewAware(EventLayout.SM_LIST, getEventView()),
softwareModuleGrid.getSelectionSupport()); softwareModuleGrid.getSelectionSupport()));
this.smModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxySoftwareModule.class) addEventListener(new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxySoftwareModule.class)
.entityModifiedAwareSupports(getSmModifiedAwareSupports()).build(); .entityModifiedAwareSupports(getSmModifiedAwareSupports()).build());
this.fileUploadChangedListener = new GenericEventListener<>(eventBus, EventTopics.FILE_UPLOAD_CHANGED, addEventListener(new GenericEventListener<>(uiDependencies.getEventBus(), EventTopics.FILE_UPLOAD_CHANGED,
this::onUploadChanged); this::onUploadChanged));
buildLayout(softwareModuleGridHeader, softwareModuleGrid, softwareModuleDetailsHeader, softwareModuleDetails); buildLayout(softwareModuleGridHeader, softwareModuleGrid, softwareModuleDetailsHeader, softwareModuleDetails);
} }
@@ -134,58 +110,20 @@ public class SoftwareModuleGridLayout extends AbstractGridComponentLayout {
* Verifies when file upload is in progress * Verifies when file upload is in progress
* *
* @param fileUploadProgress * @param fileUploadProgress
* FileUploadProgress * FileUploadProgress
*/ */
public void onUploadChanged(final FileUploadProgress fileUploadProgress) { public void onUploadChanged(final FileUploadProgress fileUploadProgress) {
softwareModuleGrid.onUploadChanged(fileUploadProgress); softwareModuleGrid.onUploadChanged(fileUploadProgress);
} }
/** @Override
* Show software module grid header protected SoftwareModuleGridHeader getSoftwareModuleGridHeader() {
*/ return softwareModuleGridHeader;
public void showSmTypeHeaderIcon() {
softwareModuleGridHeader.showFilterIcon();
} }
/** @Override
* Hide software module grid header protected SoftwareModuleGrid getSoftwareModuleGrid() {
*/ return softwareModuleGrid;
public void hideSmTypeHeaderIcon() {
softwareModuleGridHeader.hideFilterIcon();
} }
/**
* Maximize the software module grid
*/
public void maximize() {
softwareModuleGrid.createMaximizedContent();
hideDetailsLayout();
}
/**
* Minimize the software module grid
*/
public void minimize() {
softwareModuleGrid.createMinimizedContent();
showDetailsLayout();
}
/**
* Is called when view is shown to the user
*/
public void restoreState() {
softwareModuleGridHeader.restoreState();
softwareModuleGrid.restoreState();
}
/**
* Unsubscribe all the events listeners
*/
public void unsubscribeListener() {
smFilterListener.unsubscribe();
masterSmChangedListener.unsubscribe();
selectSmListener.unsubscribe();
smModifiedListener.unsubscribe();
fileUploadChangedListener.unsubscribe();
}
} }

View File

@@ -8,75 +8,47 @@
*/ */
package org.eclipse.hawkbit.ui.artifacts.smtable; package org.eclipse.hawkbit.ui.artifacts.smtable;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SoftwareModuleManagement;
import org.eclipse.hawkbit.repository.builder.SoftwareModuleUpdate; import org.eclipse.hawkbit.repository.builder.SoftwareModuleUpdate;
import org.eclipse.hawkbit.repository.exception.EntityNotFoundException;
import org.eclipse.hawkbit.repository.exception.EntityReadOnlyException;
import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; import org.eclipse.hawkbit.ui.common.AbstractUpdateNamedEntityWindowController;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.EntityWindowLayout;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Controller for update software module window * Controller for update software module window
*/ */
public class UpdateSmWindowController extends AbstractEntityWindowController<ProxySoftwareModule, ProxySoftwareModule> { public class UpdateSmWindowController
private static final Logger LOG = LoggerFactory.getLogger(UpdateSmWindowController.class); extends AbstractUpdateNamedEntityWindowController<ProxySoftwareModule, ProxySoftwareModule, SoftwareModule> {
private final VaadinMessageSource i18n;
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final SoftwareModuleManagement smManagement; private final SoftwareModuleManagement smManagement;
private final SmWindowLayout layout; private final SmWindowLayout layout;
private final ProxySmValidator validator;
private String nameBeforeEdit;
private String versionBeforeEdit;
/** /**
* Constructor for UpdateSmWindowController * Constructor for UpdateSmWindowController
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param smManagement * @param smManagement
* SoftwareModuleManagement * SoftwareModuleManagement
* @param layout * @param layout
* SmWindowLayout * SmWindowLayout
*/ */
public UpdateSmWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, public UpdateSmWindowController(final CommonUiDependencies uiDependencies,
final UIEventBus eventBus, final UINotification uiNotification, final SoftwareModuleManagement smManagement, final SoftwareModuleManagement smManagement, final SmWindowLayout layout) {
final SmWindowLayout layout) { super(uiDependencies);
this.i18n = i18n;
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.smManagement = smManagement; this.smManagement = smManagement;
this.layout = layout; this.layout = layout;
} this.validator = new ProxySmValidator(uiDependencies);
/**
* @return Software module layout
*/
@Override
public AbstractEntityWindowLayout<ProxySoftwareModule> getLayout() {
return layout;
} }
@Override @Override
@@ -90,9 +62,17 @@ public class UpdateSmWindowController extends AbstractEntityWindowController<Pro
sm.setVendor(proxyEntity.getVendor()); sm.setVendor(proxyEntity.getVendor());
sm.setDescription(proxyEntity.getDescription()); sm.setDescription(proxyEntity.getDescription());
nameBeforeEdit = proxyEntity.getName();
versionBeforeEdit = proxyEntity.getVersion();
return sm; return sm;
} }
@Override
public EntityWindowLayout<ProxySoftwareModule> getLayout() {
return layout;
}
@Override @Override
protected void adaptLayout(final ProxySoftwareModule proxyEntity) { protected void adaptLayout(final ProxySoftwareModule proxyEntity) {
layout.disableSmTypeSelect(); layout.disableSmTypeSelect();
@@ -101,33 +81,37 @@ public class UpdateSmWindowController extends AbstractEntityWindowController<Pro
} }
@Override @Override
protected void persistEntity(final ProxySoftwareModule entity) { protected SoftwareModule persistEntityInRepository(final ProxySoftwareModule entity) {
final SoftwareModuleUpdate smUpdate = entityFactory.softwareModule().update(entity.getId()) final SoftwareModuleUpdate smUpdate = getEntityFactory().softwareModule().update(entity.getId())
.vendor(entity.getVendor()).description(entity.getDescription()); .vendor(entity.getVendor()).description(entity.getDescription());
return smManagement.update(smUpdate);
}
try { @Override
final SoftwareModule updatedSm = smManagement.update(smUpdate); protected String getDisplayableName(final SoftwareModule entity) {
return HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion());
}
uiNotification.displaySuccess( @Override
i18n.getMessage("message.update.success", updatedSm.getName() + ":" + updatedSm.getVersion())); protected String getDisplayableNameForFailedMessage(final ProxySoftwareModule entity) {
eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( return HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion());
EntityModifiedEventType.ENTITY_UPDATED, ProxySoftwareModule.class, updatedSm.getId())); }
} catch (final EntityNotFoundException | EntityReadOnlyException e) {
LOG.trace("Update of software module failed in UI: {}", e.getMessage()); @Override
final String entityType = i18n.getMessage("caption.software.module"); protected Class<? extends ProxyIdentifiableEntity> getEntityClass() {
uiNotification return ProxySoftwareModule.class;
.displayWarning(i18n.getMessage("message.deleted.or.notAllowed", entityType, entity.getName()));
}
} }
@Override @Override
protected boolean isEntityValid(final ProxySoftwareModule entity) { protected boolean isEntityValid(final ProxySoftwareModule entity) {
if (!StringUtils.hasText(entity.getName()) || !StringUtils.hasText(entity.getVersion()) final String trimmedName = StringUtils.trimWhitespace(entity.getName());
|| entity.getTypeInfo() == null) { final String trimmedVersion = StringUtils.trimWhitespace(entity.getVersion());
uiNotification.displayValidationError(i18n.getMessage("message.error.missing.nameorversionortype")); final Long typeId = entity.getTypeInfo().getId();
return false; return validator.isEntityValid(entity, () -> hasNameOrVersionChanged(trimmedName, trimmedVersion)
} && smManagement.getByNameAndVersionAndType(trimmedName, trimmedVersion, typeId).isPresent());
}
return true; private boolean hasNameOrVersionChanged(final String trimmedName, final String trimmedVersion) {
return !nameBeforeEdit.equals(trimmedName) || !versionBeforeEdit.equals(trimmedVersion);
} }
} }

View File

@@ -8,71 +8,49 @@
*/ */
package org.eclipse.hawkbit.ui.artifacts.smtype; package org.eclipse.hawkbit.ui.artifacts.smtype;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.repository.model.SoftwareModuleType; import org.eclipse.hawkbit.repository.model.SoftwareModuleType;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; import org.eclipse.hawkbit.ui.common.AbstractAddNamedEntityWindowController;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.EntityWindowLayout;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType.SmTypeAssign; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType.SmTypeAssign;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload; import org.eclipse.hawkbit.ui.common.type.ProxyTypeValidator;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Controller for Add software module type window * Controller for Add software module type window
*/ */
public class AddSmTypeWindowController extends AbstractEntityWindowController<ProxyType, ProxyType> { public class AddSmTypeWindowController
private final VaadinMessageSource i18n; extends AbstractAddNamedEntityWindowController<ProxyType, ProxyType, SoftwareModuleType> {
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final SoftwareModuleTypeManagement smTypeManagement; private final SoftwareModuleTypeManagement smTypeManagement;
private final SmTypeWindowLayout layout; private final SmTypeWindowLayout layout;
private final ProxyTypeValidator validator;
/** /**
* Constructor for AddSmTypeWindowController * Constructor for AddSmTypeWindowController
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param smTypeManagement * @param smTypeManagement
* SoftwareModuleTypeManagement * SoftwareModuleTypeManagement
* @param layout * @param layout
* SmTypeWindowLayout * SmTypeWindowLayout
*/ */
public AddSmTypeWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, public AddSmTypeWindowController(final CommonUiDependencies uiDependencies,
final UIEventBus eventBus, final UINotification uiNotification,
final SoftwareModuleTypeManagement smTypeManagement, final SmTypeWindowLayout layout) { final SoftwareModuleTypeManagement smTypeManagement, final SmTypeWindowLayout layout) {
this.i18n = i18n; super(uiDependencies);
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.smTypeManagement = smTypeManagement; this.smTypeManagement = smTypeManagement;
this.layout = layout; this.layout = layout;
this.validator = new ProxyTypeValidator(uiDependencies);
} }
/**
* Getter for Software module type Window Layout
*
* @return AbstractEntityWindowLayout
*/
@Override @Override
public AbstractEntityWindowLayout<ProxyType> getLayout() { public EntityWindowLayout<ProxyType> getLayout() {
return layout; return layout;
} }
@@ -84,38 +62,29 @@ public class AddSmTypeWindowController extends AbstractEntityWindowController<Pr
} }
@Override @Override
protected void persistEntity(final ProxyType entity) { protected SoftwareModuleType persistEntityInRepository(final ProxyType entity) {
final int assignNumber = entity.getSmTypeAssign() == SmTypeAssign.SINGLE ? 1 : Integer.MAX_VALUE; final int assignNumber = entity.getSmTypeAssign() == SmTypeAssign.SINGLE ? 1 : Integer.MAX_VALUE;
final SoftwareModuleType newSmType = smTypeManagement return smTypeManagement
.create(entityFactory.softwareModuleType().create().key(entity.getKey()).name(entity.getName()) .create(getEntityFactory().softwareModuleType().create().key(entity.getKey()).name(entity.getName())
.description(entity.getDescription()).colour(entity.getColour()).maxAssignments(assignNumber)); .description(entity.getDescription()).colour(entity.getColour()).maxAssignments(assignNumber));
}
uiNotification.displaySuccess(i18n.getMessage("message.save.success", newSmType.getName())); @Override
eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( protected Class<? extends ProxyIdentifiableEntity> getEntityClass() {
EntityModifiedEventType.ENTITY_ADDED, ProxySoftwareModule.class, ProxyType.class, newSmType.getId())); return ProxyType.class;
}
@Override
protected Class<? extends ProxyIdentifiableEntity> getParentEntityClass() {
return ProxySoftwareModule.class;
} }
@Override @Override
protected boolean isEntityValid(final ProxyType entity) { protected boolean isEntityValid(final ProxyType entity) {
if (!StringUtils.hasText(entity.getName()) || !StringUtils.hasText(entity.getKey())
|| entity.getSmTypeAssign() == null) {
uiNotification.displayValidationError(i18n.getMessage("message.error.missing.typenameorkeyorsmtype"));
return false;
}
final String trimmedName = StringUtils.trimWhitespace(entity.getName()); final String trimmedName = StringUtils.trimWhitespace(entity.getName());
final String trimmedKey = StringUtils.trimWhitespace(entity.getKey()); final String trimmedKey = StringUtils.trimWhitespace(entity.getKey());
if (smTypeManagement.getByName(trimmedName).isPresent()) { return validator.isSmTypeValid(entity, () -> smTypeManagement.getByKey(trimmedKey).isPresent(),
uiNotification.displayValidationError(i18n.getMessage("message.type.duplicate.check", trimmedName)); () -> smTypeManagement.getByName(trimmedName).isPresent());
return false;
}
if (smTypeManagement.getByKey(trimmedKey).isPresent()) {
uiNotification
.displayValidationError(i18n.getMessage("message.type.key.swmodule.duplicate.check", trimmedKey));
return false;
}
return true;
} }
} }

View File

@@ -8,14 +8,11 @@
*/ */
package org.eclipse.hawkbit.ui.artifacts.smtype; package org.eclipse.hawkbit.ui.artifacts.smtype;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder; import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -23,35 +20,19 @@ import com.vaadin.ui.Window;
* Builder for software module type window * Builder for software module type window
*/ */
public class SmTypeWindowBuilder extends AbstractEntityWindowBuilder<ProxyType> { public class SmTypeWindowBuilder extends AbstractEntityWindowBuilder<ProxyType> {
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final SoftwareModuleTypeManagement smTypeManagement; private final SoftwareModuleTypeManagement smTypeManagement;
/** /**
* Constructor for SmTypeWindowBuilder * Constructor for SmTypeWindowBuilder
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param smTypeManagement * @param smTypeManagement
* SoftwareModuleTypeManagement * SoftwareModuleTypeManagement
*/ */
public SmTypeWindowBuilder(final VaadinMessageSource i18n, final EntityFactory entityFactory, public SmTypeWindowBuilder(final CommonUiDependencies uiDependencies, final SoftwareModuleTypeManagement smTypeManagement) {
final UIEventBus eventBus, final UINotification uiNotification, super(uiDependencies);
final SoftwareModuleTypeManagement smTypeManagement) {
super(i18n);
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.smTypeManagement = smTypeManagement; this.smTypeManagement = smTypeManagement;
} }
@@ -67,8 +48,8 @@ public class SmTypeWindowBuilder extends AbstractEntityWindowBuilder<ProxyType>
*/ */
@Override @Override
public Window getWindowForAdd() { public Window getWindowForAdd() {
return getWindowForNewEntity(new AddSmTypeWindowController(i18n, entityFactory, eventBus, uiNotification, return getWindowForNewEntity(
smTypeManagement, new SmTypeWindowLayout(i18n, uiNotification))); new AddSmTypeWindowController(uiDependencies, smTypeManagement, new SmTypeWindowLayout(uiDependencies)));
} }
@@ -76,13 +57,13 @@ public class SmTypeWindowBuilder extends AbstractEntityWindowBuilder<ProxyType>
* Update window for software module type * Update window for software module type
* *
* @param proxyType * @param proxyType
* ProxyType * ProxyType
* *
* @return Window of Software module type * @return Window of Software module type
*/ */
@Override @Override
public Window getWindowForUpdate(final ProxyType proxyType) { public Window getWindowForUpdate(final ProxyType proxyType) {
return getWindowForEntity(proxyType, new UpdateSmTypeWindowController(i18n, entityFactory, eventBus, return getWindowForEntity(proxyType,
uiNotification, smTypeManagement, new SmTypeWindowLayout(i18n, uiNotification))); new UpdateSmTypeWindowController(uiDependencies, smTypeManagement, new SmTypeWindowLayout(uiDependencies)));
} }
} }

View File

@@ -8,12 +8,11 @@
*/ */
package org.eclipse.hawkbit.ui.artifacts.smtype; package org.eclipse.hawkbit.ui.artifacts.smtype;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.builder.FormComponentBuilder; import org.eclipse.hawkbit.ui.common.builder.FormComponentBuilder;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType.SmTypeAssign; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType.SmTypeAssign;
import org.eclipse.hawkbit.ui.management.tag.TagWindowLayout; import org.eclipse.hawkbit.ui.management.tag.TagWindowLayout;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import com.vaadin.ui.FormLayout; import com.vaadin.ui.FormLayout;
import com.vaadin.ui.RadioButtonGroup; import com.vaadin.ui.RadioButtonGroup;
@@ -31,13 +30,11 @@ public class SmTypeWindowLayout extends TagWindowLayout<ProxyType> {
/** /**
* Constructor for SmTypeWindowLayout * Constructor for SmTypeWindowLayout
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param uiNotification
* UINotification
*/ */
public SmTypeWindowLayout(final VaadinMessageSource i18n, final UINotification uiNotification) { public SmTypeWindowLayout(final CommonUiDependencies uiDependencies) {
super(i18n, uiNotification); super(uiDependencies);
this.smTypeComponentBuilder = new SmTypeWindowLayoutComponentBuilder(i18n); this.smTypeComponentBuilder = new SmTypeWindowLayoutComponentBuilder(i18n);

View File

@@ -8,41 +8,28 @@
*/ */
package org.eclipse.hawkbit.ui.artifacts.smtype; package org.eclipse.hawkbit.ui.artifacts.smtype;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.repository.builder.SoftwareModuleTypeUpdate; import org.eclipse.hawkbit.repository.builder.SoftwareModuleTypeUpdate;
import org.eclipse.hawkbit.repository.exception.EntityNotFoundException;
import org.eclipse.hawkbit.repository.exception.EntityReadOnlyException;
import org.eclipse.hawkbit.repository.model.SoftwareModuleType; import org.eclipse.hawkbit.repository.model.SoftwareModuleType;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; import org.eclipse.hawkbit.ui.common.AbstractUpdateNamedEntityWindowController;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.EntityWindowLayout;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType.SmTypeAssign; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType.SmTypeAssign;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload; import org.eclipse.hawkbit.ui.common.type.ProxyTypeValidator;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Controller for update software module type window * Controller for update software module type window
*/ */
public class UpdateSmTypeWindowController extends AbstractEntityWindowController<ProxyType, ProxyType> { public class UpdateSmTypeWindowController
private static final Logger LOG = LoggerFactory.getLogger(UpdateSmTypeWindowController.class); extends AbstractUpdateNamedEntityWindowController<ProxyType, ProxyType, SoftwareModuleType> {
private final VaadinMessageSource i18n;
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final SoftwareModuleTypeManagement smTypeManagement; private final SoftwareModuleTypeManagement smTypeManagement;
private final SmTypeWindowLayout layout; private final SmTypeWindowLayout layout;
private final ProxyTypeValidator validator;
private String nameBeforeEdit; private String nameBeforeEdit;
private String keyBeforeEdit; private String keyBeforeEdit;
@@ -50,40 +37,20 @@ public class UpdateSmTypeWindowController extends AbstractEntityWindowController
/** /**
* Constructor for UpdateSmTypeWindowController * Constructor for UpdateSmTypeWindowController
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param smTypeManagement * @param smTypeManagement
* SoftwareModuleTypeManagement * SoftwareModuleTypeManagement
* @param layout * @param layout
* SmTypeWindowLayout * SmTypeWindowLayout
*/ */
public UpdateSmTypeWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, public UpdateSmTypeWindowController(final CommonUiDependencies uiDependencies,
final UIEventBus eventBus, final UINotification uiNotification,
final SoftwareModuleTypeManagement smTypeManagement, final SmTypeWindowLayout layout) { final SoftwareModuleTypeManagement smTypeManagement, final SmTypeWindowLayout layout) {
this.i18n = i18n; super(uiDependencies);
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.smTypeManagement = smTypeManagement; this.smTypeManagement = smTypeManagement;
this.layout = layout; this.layout = layout;
} this.validator = new ProxyTypeValidator(uiDependencies);
/**
* Getter for Software module type Window Layout
*
* @return AbstractEntityWindowLayout
*/
@Override
public AbstractEntityWindowLayout<ProxyType> getLayout() {
return layout;
} }
@Override @Override
@@ -109,6 +76,11 @@ public class UpdateSmTypeWindowController extends AbstractEntityWindowController
.orElse(SmTypeAssign.SINGLE); .orElse(SmTypeAssign.SINGLE);
} }
@Override
public EntityWindowLayout<ProxyType> getLayout() {
return layout;
}
@Override @Override
protected void adaptLayout(final ProxyType proxyEntity) { protected void adaptLayout(final ProxyType proxyEntity) {
layout.disableTagName(); layout.disableTagName();
@@ -117,46 +89,36 @@ public class UpdateSmTypeWindowController extends AbstractEntityWindowController
} }
@Override @Override
protected void persistEntity(final ProxyType entity) { protected SoftwareModuleType persistEntityInRepository(final ProxyType entity) {
final SoftwareModuleTypeUpdate smTypeUpdate = entityFactory.softwareModuleType().update(entity.getId()) final SoftwareModuleTypeUpdate smTypeUpdate = getEntityFactory().softwareModuleType().update(entity.getId())
.description(entity.getDescription()).colour(entity.getColour()); .description(entity.getDescription()).colour(entity.getColour());
return smTypeManagement.update(smTypeUpdate);
}
try { @Override
final SoftwareModuleType updatedSmType = smTypeManagement.update(smTypeUpdate); protected Class<? extends ProxyIdentifiableEntity> getEntityClass() {
return ProxyType.class;
}
uiNotification.displaySuccess(i18n.getMessage("message.update.success", updatedSmType.getName())); @Override
eventBus.publish(EventTopics.ENTITY_MODIFIED, this, protected Class<? extends ProxyIdentifiableEntity> getParentEntityClass() {
new EntityModifiedEventPayload(EntityModifiedEventType.ENTITY_UPDATED, ProxySoftwareModule.class, return ProxySoftwareModule.class;
ProxyType.class, updatedSmType.getId()));
} catch (final EntityNotFoundException | EntityReadOnlyException e) {
LOG.trace("Update of software module type failed in UI: {}", e.getMessage());
final String entityType = i18n.getMessage("caption.entity.software.module.type");
uiNotification
.displayWarning(i18n.getMessage("message.deleted.or.notAllowed", entityType, entity.getName()));
}
} }
@Override @Override
protected boolean isEntityValid(final ProxyType entity) { protected boolean isEntityValid(final ProxyType entity) {
if (!StringUtils.hasText(entity.getName()) || !StringUtils.hasText(entity.getKey())
|| entity.getSmTypeAssign() == null) {
uiNotification.displayValidationError(i18n.getMessage("message.error.missing.typenameorkeyorsmtype"));
return false;
}
final String trimmedName = StringUtils.trimWhitespace(entity.getName()); final String trimmedName = StringUtils.trimWhitespace(entity.getName());
final String trimmedKey = StringUtils.trimWhitespace(entity.getKey()); final String trimmedKey = StringUtils.trimWhitespace(entity.getKey());
if (!nameBeforeEdit.equals(trimmedName) && smTypeManagement.getByName(trimmedName).isPresent()) { return validator.isSmTypeValid(entity,
uiNotification.displayValidationError(i18n.getMessage("message.type.duplicate.check", trimmedName)); () -> hasKeyChanged(trimmedKey) && smTypeManagement.getByKey(trimmedKey).isPresent(),
return false; () -> hasNameChanged(trimmedName) && smTypeManagement.getByName(trimmedName).isPresent());
} }
if (!keyBeforeEdit.equals(trimmedKey) && smTypeManagement.getByKey(trimmedKey).isPresent()) {
uiNotification
.displayValidationError(i18n.getMessage("message.type.key.swmodule.duplicate.check", trimmedKey));
return false;
}
return true; private boolean hasNameChanged(final String trimmedName) {
return !nameBeforeEdit.equals(trimmedName);
}
private boolean hasKeyChanged(final String trimmedKey) {
return !keyBeforeEdit.equals(trimmedKey);
} }
} }

View File

@@ -9,8 +9,8 @@
package org.eclipse.hawkbit.ui.artifacts.smtype.filter; package org.eclipse.hawkbit.ui.artifacts.smtype.filter;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.artifacts.smtype.SmTypeWindowBuilder; import org.eclipse.hawkbit.ui.artifacts.smtype.SmTypeWindowBuilder;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.mappers.TypeToProxyTypeMapper; import org.eclipse.hawkbit.ui.common.data.mappers.TypeToProxyTypeMapper;
import org.eclipse.hawkbit.ui.common.data.providers.SoftwareModuleTypeDataProvider; import org.eclipse.hawkbit.ui.common.data.providers.SoftwareModuleTypeDataProvider;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
@@ -20,9 +20,6 @@ import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.filterlayout.AbstractTypeFilterButtons; import org.eclipse.hawkbit.ui.common.filterlayout.AbstractTypeFilterButtons;
import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState; import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -41,16 +38,10 @@ public class SMTypeFilterButtons extends AbstractTypeFilterButtons {
/** /**
* Constructor * Constructor
* *
* @param eventBus * @param uiDependencies
* UIEventBus * {@link CommonUiDependencies}
* @param softwareModuleTypeManagement * @param softwareModuleTypeManagement
* SoftwareModuleTypeManagement * SoftwareModuleTypeManagement
* @param i18n
* VaadinMessageSource
* @param permChecker
* SpPermissionChecker
* @param uiNotification
* UINotification
* @param smTypeWindowBuilder * @param smTypeWindowBuilder
* SmTypeWindowBuilder * SmTypeWindowBuilder
* @param typeFilterLayoutUiState * @param typeFilterLayoutUiState
@@ -58,12 +49,11 @@ public class SMTypeFilterButtons extends AbstractTypeFilterButtons {
* @param view * @param view
* EventView * EventView
*/ */
public SMTypeFilterButtons(final UIEventBus eventBus, final VaadinMessageSource i18n, public SMTypeFilterButtons(final CommonUiDependencies uiDependencies,
final UINotification uiNotification, final SpPermissionChecker permChecker,
final SoftwareModuleTypeManagement softwareModuleTypeManagement, final SoftwareModuleTypeManagement softwareModuleTypeManagement,
final SmTypeWindowBuilder smTypeWindowBuilder, final TypeFilterLayoutUiState typeFilterLayoutUiState, final SmTypeWindowBuilder smTypeWindowBuilder, final TypeFilterLayoutUiState typeFilterLayoutUiState,
final EventView view) { final EventView view) {
super(eventBus, i18n, uiNotification, permChecker, typeFilterLayoutUiState); super(uiDependencies, typeFilterLayoutUiState);
this.softwareModuleTypeManagement = softwareModuleTypeManagement; this.softwareModuleTypeManagement = softwareModuleTypeManagement;
this.smTypeWindowBuilder = smTypeWindowBuilder; this.smTypeWindowBuilder = smTypeWindowBuilder;

View File

@@ -8,16 +8,14 @@
*/ */
package org.eclipse.hawkbit.ui.artifacts.smtype.filter; package org.eclipse.hawkbit.ui.artifacts.smtype.filter;
import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.artifacts.smtype.SmTypeWindowBuilder; import org.eclipse.hawkbit.ui.artifacts.smtype.SmTypeWindowBuilder;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.grid.header.AbstractFilterHeader; import org.eclipse.hawkbit.ui.common.grid.header.AbstractFilterHeader;
import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState; import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -36,23 +34,18 @@ public class SMTypeFilterHeader extends AbstractFilterHeader {
/** /**
* Constructor for SMTypeFilterHeader * Constructor for SMTypeFilterHeader
* *
* @param eventBus * @param uiDependencies
* UIEventBus * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param permChecker
* SpPermissionChecker
* @param smTypeWindowBuilder * @param smTypeWindowBuilder
* SmTypeWindowBuilder * SmTypeWindowBuilder
* @param smTypeFilterLayoutUiState * @param smTypeFilterLayoutUiState
* TypeFilterLayoutUiState * TypeFilterLayoutUiState
* @param view * @param view
* EventView * EventView
*/ */
public SMTypeFilterHeader(final UIEventBus eventBus, final VaadinMessageSource i18n, public SMTypeFilterHeader(final CommonUiDependencies uiDependencies, final SmTypeWindowBuilder smTypeWindowBuilder,
final SpPermissionChecker permChecker, final SmTypeWindowBuilder smTypeWindowBuilder,
final TypeFilterLayoutUiState smTypeFilterLayoutUiState, final EventView view) { final TypeFilterLayoutUiState smTypeFilterLayoutUiState, final EventView view) {
super(i18n, permChecker, eventBus); super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus());
this.smTypeFilterLayoutUiState = smTypeFilterLayoutUiState; this.smTypeFilterLayoutUiState = smTypeFilterLayoutUiState;
this.smTypeWindowBuilder = smTypeWindowBuilder; this.smTypeWindowBuilder = smTypeWindowBuilder;

View File

@@ -11,10 +11,9 @@ package org.eclipse.hawkbit.ui.artifacts.smtype.filter;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.artifacts.smtype.SmTypeWindowBuilder; import org.eclipse.hawkbit.ui.artifacts.smtype.SmTypeWindowBuilder;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
@@ -27,9 +26,6 @@ import org.eclipse.hawkbit.ui.common.layout.listener.GridActionsVisibilityListen
import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGenericSupport; import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGenericSupport;
import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGridRefreshAwareSupport; import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGridRefreshAwareSupport;
import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState; import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.ComponentContainer; import com.vaadin.ui.ComponentContainer;
@@ -37,6 +33,7 @@ import com.vaadin.ui.ComponentContainer;
* Software module type filter buttons layout. * Software module type filter buttons layout.
*/ */
public class SMTypeFilterLayout extends AbstractFilterLayout { public class SMTypeFilterLayout extends AbstractFilterLayout {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final SMTypeFilterHeader smTypeFilterHeader; private final SMTypeFilterHeader smTypeFilterHeader;
@@ -48,49 +45,45 @@ public class SMTypeFilterLayout extends AbstractFilterLayout {
/** /**
* Constructor * Constructor
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param permChecker
* SpPermissionChecker
* @param eventBus
* UIEventBus
* @param entityFactory
* EntityFactory
* @param uiNotification
* UINotification
* @param softwareModuleTypeManagement * @param softwareModuleTypeManagement
* SoftwareModuleTypeManagement * SoftwareModuleTypeManagement
* @param smTypeFilterLayoutUiState * @param smTypeFilterLayoutUiState
* SMTypeFilterLayoutUiState * SMTypeFilterLayoutUiState
* @param eventView
* {@link EventView}
*/ */
public SMTypeFilterLayout(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, public SMTypeFilterLayout(final CommonUiDependencies uiDependencies,
final UIEventBus eventBus, final EntityFactory entityFactory, final UINotification uiNotification,
final SoftwareModuleTypeManagement softwareModuleTypeManagement, final SoftwareModuleTypeManagement softwareModuleTypeManagement,
final TypeFilterLayoutUiState smTypeFilterLayoutUiState) { final TypeFilterLayoutUiState smTypeFilterLayoutUiState, final EventView eventView) {
final SmTypeWindowBuilder smTypeWindowBuilder = new SmTypeWindowBuilder(i18n, entityFactory, eventBus, final SmTypeWindowBuilder smTypeWindowBuilder = new SmTypeWindowBuilder(uiDependencies,
uiNotification, softwareModuleTypeManagement); softwareModuleTypeManagement);
this.smTypeFilterHeader = new SMTypeFilterHeader(eventBus, i18n, permChecker, smTypeWindowBuilder, this.smTypeFilterHeader = new SMTypeFilterHeader(uiDependencies, smTypeWindowBuilder, smTypeFilterLayoutUiState,
smTypeFilterLayoutUiState, EventView.UPLOAD); eventView);
this.smTypeFilterButtons = new SMTypeFilterButtons(eventBus, i18n, uiNotification, permChecker, this.smTypeFilterButtons = new SMTypeFilterButtons(uiDependencies, softwareModuleTypeManagement,
softwareModuleTypeManagement, smTypeWindowBuilder, smTypeFilterLayoutUiState, EventView.UPLOAD); smTypeWindowBuilder, smTypeFilterLayoutUiState, eventView);
this.gridActionsVisibilityListener = new GridActionsVisibilityListener(eventBus, this.gridActionsVisibilityListener = new GridActionsVisibilityListener(uiDependencies.getEventBus(),
new EventLayoutViewAware(EventLayout.SM_TYPE_FILTER, EventView.UPLOAD), new EventLayoutViewAware(EventLayout.SM_TYPE_FILTER, eventView), smTypeFilterButtons::hideActionColumns,
smTypeFilterButtons::hideActionColumns, smTypeFilterButtons::showEditColumn, smTypeFilterButtons::showEditColumn, smTypeFilterButtons::showDeleteColumn);
smTypeFilterButtons::showDeleteColumn); this.entityModifiedListener = new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(),
this.entityModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyType.class) ProxyType.class).entityModifiedAwareSupports(getEntityModifiedAwareSupports())
.entityModifiedAwareSupports(getEntityModifiedAwareSupports()) .parentEntityType(ProxySoftwareModule.class).build();
.parentEntityType(ProxySoftwareModule.class).build();
buildLayout(); buildLayout();
} }
private List<EntityModifiedAwareSupport> getEntityModifiedAwareSupports() { private List<EntityModifiedAwareSupport> getEntityModifiedAwareSupports() {
return Arrays.asList(EntityModifiedGridRefreshAwareSupport.of(smTypeFilterButtons::refreshAll), return Arrays.asList(EntityModifiedGridRefreshAwareSupport.of(this::refreshFilterButtons),
EntityModifiedGenericSupport.of(null, null, smTypeFilterButtons::resetFilterOnTypesDeleted)); EntityModifiedGenericSupport.of(null, null, smTypeFilterButtons::resetFilterOnTypesDeleted));
} }
protected void refreshFilterButtons() {
smTypeFilterButtons.refreshAll();
}
@Override @Override
protected SMTypeFilterHeader getFilterHeader() { protected SMTypeFilterHeader getFilterHeader() {
return smTypeFilterHeader; return smTypeFilterHeader;

View File

@@ -18,14 +18,13 @@ import org.eclipse.hawkbit.repository.ArtifactManagement;
import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SoftwareModuleManagement;
import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.ui.artifacts.ArtifactUploadState; import org.eclipse.hawkbit.ui.artifacts.ArtifactUploadState;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent; import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification; import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.icons.VaadinIcons; import com.vaadin.icons.VaadinIcons;
import com.vaadin.shared.ui.ContentMode; import com.vaadin.shared.ui.ContentMode;
@@ -60,12 +59,8 @@ public class UploadDropAreaLayout extends CustomComponent implements MasterEntit
/** /**
* Creates a new {@link UploadDropAreaLayout} instance. * Creates a new {@link UploadDropAreaLayout} instance.
* *
* @param i18n * @param uiDependencies
* the {@link VaadinMessageSource} * the {@link CommonUiDependencies}
* @param eventBus
* the {@link EventBus} used to send/retrieve events
* @param uiNotification
* {@link UINotification} for showing notifications
* @param artifactUploadState * @param artifactUploadState
* the {@link ArtifactUploadState} for state information * the {@link ArtifactUploadState} for state information
* @param multipartConfigElement * @param multipartConfigElement
@@ -77,18 +72,17 @@ public class UploadDropAreaLayout extends CustomComponent implements MasterEntit
* the {@link ArtifactManagement} for storing the uploaded * the {@link ArtifactManagement} for storing the uploaded
* artifacts * artifacts
*/ */
public UploadDropAreaLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, public UploadDropAreaLayout(final CommonUiDependencies uiDependencies, final ArtifactUploadState artifactUploadState,
final UINotification uiNotification, final ArtifactUploadState artifactUploadState,
final MultipartConfigElement multipartConfigElement, final SoftwareModuleManagement softwareManagement, final MultipartConfigElement multipartConfigElement, final SoftwareModuleManagement softwareManagement,
final ArtifactManagement artifactManagement) { final ArtifactManagement artifactManagement) {
this.i18n = i18n; this.i18n = uiDependencies.getI18n();
this.uiNotification = uiNotification; this.uiNotification = uiDependencies.getUiNotification();
this.artifactUploadState = artifactUploadState; this.artifactUploadState = artifactUploadState;
this.multipartConfigElement = multipartConfigElement; this.multipartConfigElement = multipartConfigElement;
this.softwareManagement = softwareManagement; this.softwareManagement = softwareManagement;
this.artifactManagement = artifactManagement; this.artifactManagement = artifactManagement;
this.uploadButtonLayout = new UploadProgressButtonLayout(i18n, eventBus, artifactUploadState, this.uploadButtonLayout = new UploadProgressButtonLayout(i18n, uiDependencies.getEventBus(), artifactUploadState,
multipartConfigElement, artifactManagement, softwareManagement, uploadLock); multipartConfigElement, artifactManagement, softwareManagement, uploadLock);
buildLayout(); buildLayout();
@@ -125,7 +119,7 @@ public class UploadDropAreaLayout extends CustomComponent implements MasterEntit
* Update the upload view on file drop * Update the upload view on file drop
* *
* @param masterEntity * @param masterEntity
* ProxySoftwareModule * ProxySoftwareModule
*/ */
@Override @Override
public void masterEntityChanged(final ProxySoftwareModule masterEntity) { public void masterEntityChanged(final ProxySoftwareModule masterEntity) {
@@ -139,7 +133,7 @@ public class UploadDropAreaLayout extends CustomComponent implements MasterEntit
* Checks progress on file upload * Checks progress on file upload
* *
* @param fileUploadProgress * @param fileUploadProgress
* FileUploadProgress * FileUploadProgress
*/ */
public void onUploadChanged(final FileUploadProgress fileUploadProgress) { public void onUploadChanged(final FileUploadProgress fileUploadProgress) {
uploadButtonLayout.onUploadChanged(fileUploadProgress); uploadButtonLayout.onUploadChanged(fileUploadProgress);
@@ -178,7 +172,7 @@ public class UploadDropAreaLayout extends CustomComponent implements MasterEntit
* Validates the file drop events and triggers the upload * Validates the file drop events and triggers the upload
* *
* @param event * @param event
* FileDropEvent * FileDropEvent
*/ */
@Override @Override
public void drop(final FileDropEvent<VerticalLayout> event) { public void drop(final FileDropEvent<VerticalLayout> event) {

View File

@@ -0,0 +1,51 @@
/**
* Copyright (c) 2020 Bosch.IO 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 org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
/**
* Window controller for entity creations.
*
* @param <T>
* Type of proxy entity
* @param <E>
* Second type of proxy entity
* @param <R>
* Type of repository entity
*/
public abstract class AbstractAddEntityWindowController<T, E, R> extends AbstractEntityWindowController<T, E, R> {
/**
* Constructor
*
* @param uiDependencies
* {@link CommonUiDependencies}
*/
public AbstractAddEntityWindowController(final CommonUiDependencies uiDependencies) {
super(uiDependencies);
}
@Override
protected String getPersistSuccessMessageKey() {
return "message.save.success";
}
@Override
protected String getPersistFailureMessageKey() {
return "message.save.fail";
}
@Override
protected EntityModifiedEventPayload createModifiedEventPayload(final R entity) {
return new EntityModifiedEventPayload(EntityModifiedEventType.ENTITY_ADDED, getParentEntityClass(),
getEntityClass(), getId(entity));
}
}

View File

@@ -0,0 +1,51 @@
/**
* Copyright (c) 2020 Bosch.IO 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 org.eclipse.hawkbit.repository.model.NamedEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyNamedEntity;
/**
* Window controller for named entity creations.
*
* @param <T>
* Type of proxy entity
* @param <E>
* Second type of proxy entity
* @param <R>
* Type of repository entity
*/
public abstract class AbstractAddNamedEntityWindowController<T, E extends ProxyNamedEntity, R extends NamedEntity>
extends AbstractAddEntityWindowController<T, E, R> {
/**
* Constructor
*
* @param uiDependencies
* {@link CommonUiDependencies}
*/
public AbstractAddNamedEntityWindowController(final CommonUiDependencies uiDependencies) {
super(uiDependencies);
}
@Override
protected String getDisplayableName(final R entity) {
return entity.getName();
}
@Override
protected String getDisplayableNameForFailedMessage(final E entity) {
return entity.getName();
}
@Override
protected Long getId(final R entity) {
return entity.getId();
}
}

View File

@@ -20,31 +20,31 @@ import com.vaadin.ui.Window;
* Builder for abstract entity window * Builder for abstract entity window
* *
* @param <T> * @param <T>
* Generic type entity * Generic type entity
*/ */
public abstract class AbstractEntityWindowBuilder<T> { public abstract class AbstractEntityWindowBuilder<T> {
protected final VaadinMessageSource i18n; protected final CommonUiDependencies uiDependencies;
protected AbstractEntityWindowBuilder(final VaadinMessageSource i18n) { protected AbstractEntityWindowBuilder(final CommonUiDependencies uiDependencies) {
this.i18n = i18n; this.uiDependencies = uiDependencies;
} }
protected CommonDialogWindow getWindowForNewEntity(final AbstractEntityWindowController<T, ?> controller) { protected CommonDialogWindow getWindowForNewEntity(final AbstractEntityWindowController<T, ?, ?> controller) {
return getWindowForEntity(null, controller); return getWindowForEntity(null, controller);
} }
protected CommonDialogWindow getWindowForNewEntity(final AbstractEntityWindowController<T, ?> controller, protected CommonDialogWindow getWindowForNewEntity(final AbstractEntityWindowController<T, ?, ?> controller,
final Component windowContent) { final Component windowContent) {
return getWindowForEntity(null, controller, windowContent); return getWindowForEntity(null, controller, windowContent);
} }
protected CommonDialogWindow getWindowForEntity(final T proxyEntity, protected CommonDialogWindow getWindowForEntity(final T proxyEntity,
final AbstractEntityWindowController<T, ?> controller) { final AbstractEntityWindowController<T, ?, ?> controller) {
return getWindowForEntity(proxyEntity, controller, controller.getLayout().getRootComponent()); return getWindowForEntity(proxyEntity, controller, controller.getLayout().getRootComponent());
} }
protected CommonDialogWindow getWindowForEntity(final T proxyEntity, protected CommonDialogWindow getWindowForEntity(final T proxyEntity,
final AbstractEntityWindowController<T, ?> controller, final Component windowContent) { final AbstractEntityWindowController<T, ?, ?> controller, final Component windowContent) {
controller.populateWithData(proxyEntity); controller.populateWithData(proxyEntity);
final CommonDialogWindow window = createWindow(windowContent, controller.getSaveDialogCloseListener()); final CommonDialogWindow window = createWindow(windowContent, controller.getSaveDialogCloseListener());
@@ -56,8 +56,9 @@ public abstract class AbstractEntityWindowBuilder<T> {
protected CommonDialogWindow createWindow(final Component content, protected CommonDialogWindow createWindow(final Component content,
final SaveDialogCloseListener saveDialogCloseListener) { final SaveDialogCloseListener saveDialogCloseListener) {
return new WindowBuilder(SPUIDefinitions.CREATE_UPDATE_WINDOW).id(getWindowId()).content(content).i18n(i18n) return new WindowBuilder(SPUIDefinitions.CREATE_UPDATE_WINDOW).id(getWindowId()).content(content)
.helpLink(getHelpLink()).saveDialogCloseListener(saveDialogCloseListener).buildCommonDialogWindow(); .i18n(uiDependencies.getI18n()).helpLink(getHelpLink()).saveDialogCloseListener(saveDialogCloseListener)
.buildCommonDialogWindow();
} }
protected abstract String getWindowId(); protected abstract String getWindowId();
@@ -73,7 +74,7 @@ public abstract class AbstractEntityWindowBuilder<T> {
* Gets the update window * Gets the update window
* *
* @param entity * @param entity
* Generic type entity * Generic type entity
* *
* @return window * @return window
*/ */
@@ -83,4 +84,8 @@ public abstract class AbstractEntityWindowBuilder<T> {
// can be overriden to provide help link to documentation // can be overriden to provide help link to documentation
return null; return null;
} }
protected VaadinMessageSource getI18n() {
return uiDependencies.getI18n();
}
} }

View File

@@ -8,23 +8,56 @@
*/ */
package org.eclipse.hawkbit.ui.common; package org.eclipse.hawkbit.ui.common;
import java.util.Objects;
import javax.validation.ConstraintViolationException;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.exception.EntityNotFoundException;
import org.eclipse.hawkbit.repository.exception.EntityReadOnlyException;
import org.eclipse.hawkbit.ui.common.CommonDialogWindow.SaveDialogCloseListener; import org.eclipse.hawkbit.ui.common.CommonDialogWindow.SaveDialogCloseListener;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.event.CommandTopics;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Controller for abstract entity window * Controller for abstract entity window
* *
* @param <T> * @param <T>
* Generic type entity * Type of proxy entity
* @param <E> * @param <E>
* Generic type entity * Second type of proxy entity
* @param <R>
* Type of repository entity
*/ */
public abstract class AbstractEntityWindowController<T, E> { public abstract class AbstractEntityWindowController<T, E, R> {
private static final Logger LOG = LoggerFactory.getLogger(AbstractEntityWindowController.class);
private final CommonUiDependencies uiDependencies;
/**
* Constructor.
*
* @param uiDependencies
* the {@link CommonUiDependencies}
*/
protected AbstractEntityWindowController(final CommonUiDependencies uiDependencies) {
this.uiDependencies = uiDependencies;
}
/** /**
* Populate entity with data * Populate entity with data
* *
* @param proxyEntity * @param proxyEntity
* Generic type entity * Generic type entity
*/ */
public void populateWithData(final T proxyEntity) { public void populateWithData(final T proxyEntity) {
getLayout().setEntity(buildEntityFromProxy(proxyEntity)); getLayout().setEntity(buildEntityFromProxy(proxyEntity));
@@ -66,11 +99,107 @@ public abstract class AbstractEntityWindowController<T, E> {
}; };
} }
protected abstract void persistEntity(final E entity); protected void persistEntity(final E entity) {
try {
final R createdEntity = persistEntityInRepository(entity);
handleEntityPersistedSuccessfully(createdEntity);
selectPersistedEntity(createdEntity);
} catch (final ConstraintViolationException | EntityNotFoundException | EntityReadOnlyException ex) {
handleEntityPersistFailed(entity, ex);
} finally {
postPersist();
}
}
protected abstract R persistEntityInRepository(E entity);
protected void handleEntityPersistedSuccessfully(final R persistedEntity) {
displaySuccess(getPersistSuccessMessageKey(), getDisplayableName(persistedEntity));
publishModifiedEvent(createModifiedEventPayload(persistedEntity));
}
protected void handleEntityPersistFailed(final E entity, final RuntimeException ex) {
final String name = getDisplayableNameForFailedMessage(entity);
final String id = Objects.toString(entity);
final String type = getEntityClass().getSimpleName();
LOG.warn("Persist of entity name:{}, id:{}, type:{} failed in UI with reason: {}", name, id, type,
ex.getMessage());
displayWarning(getPersistFailureMessageKey(), name);
}
protected abstract EntityModifiedEventPayload createModifiedEventPayload(final R entity);
protected abstract Long getId(R entity);
protected abstract String getDisplayableNameForFailedMessage(E entity);
protected abstract String getDisplayableName(R entity);
protected abstract String getPersistSuccessMessageKey();
protected abstract String getPersistFailureMessageKey();
protected abstract Class<? extends ProxyIdentifiableEntity> getEntityClass();
protected Class<? extends ProxyIdentifiableEntity> getParentEntityClass() {
return null;
}
protected void selectPersistedEntity(final R entity) {
// entity is not selected by default
}
protected void postPersist() {
// empty default implementation
}
protected abstract boolean isEntityValid(final E entity); protected abstract boolean isEntityValid(final E entity);
protected boolean closeWindowAfterSave() { protected boolean closeWindowAfterSave() {
return true; return true;
} }
protected VaadinMessageSource getI18n() {
return uiDependencies.getI18n();
}
protected EntityFactory getEntityFactory() {
return uiDependencies.getEntityFactory();
}
protected UIEventBus getEventBus() {
return uiDependencies.getEventBus();
}
protected UINotification getUiNotification() {
return uiDependencies.getUiNotification();
}
protected void displaySuccess(final String messageKey, final Object... args) {
getUiNotification().displaySuccess(getI18n().getMessage(messageKey, args));
}
protected void displayValidationError(final String messageKey, final Object... args) {
getUiNotification().displayValidationError(getI18n().getMessage(messageKey, args));
}
protected void displayWarning(final String messageKey, final Object... args) {
getUiNotification().displayWarning(getI18n().getMessage(messageKey, args));
}
protected void publishModifiedEvent(final EntityModifiedEventPayload eventPayload) {
getEventBus().publish(EventTopics.ENTITY_MODIFIED, this, eventPayload);
}
protected void publishSelectionEvent(final SelectionChangedEventPayload<E> eventPayload) {
getEventBus().publish(CommandTopics.SELECT_GRID_ENTITY, this, eventPayload);
}
} }

View File

@@ -0,0 +1,51 @@
/**
* Copyright (c) 2020 Bosch.IO 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 org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
/**
* Window controller for entity updates.
*
* @param <T>
* Type of proxy entity
* @param <E>
* Second type of proxy entity
* @param <R>
* Type of repository entity
*/
public abstract class AbstractUpdateEntityWindowController<T, E, R> extends AbstractEntityWindowController<T, E, R> {
/**
* Constructor
*
* @param uiDependencies
* {@link CommonUiDependencies}
*/
public AbstractUpdateEntityWindowController(final CommonUiDependencies uiDependencies) {
super(uiDependencies);
}
@Override
protected String getPersistSuccessMessageKey() {
return "message.update.success";
}
@Override
protected String getPersistFailureMessageKey() {
return "message.deleted.or.notAllowed";
}
@Override
protected EntityModifiedEventPayload createModifiedEventPayload(final R entity) {
return new EntityModifiedEventPayload(EntityModifiedEventType.ENTITY_UPDATED, getParentEntityClass(),
getEntityClass(), getId(entity));
}
}

View File

@@ -0,0 +1,51 @@
/**
* Copyright (c) 2020 Bosch.IO 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 org.eclipse.hawkbit.repository.model.NamedEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyNamedEntity;
/**
* Window controller for entity updates.
*
* @param <T>
* Type of proxy entity
* @param <E>
* Second type of proxy entity
* @param <R>
* Type of repository entity
*/
public abstract class AbstractUpdateNamedEntityWindowController<T, E extends ProxyNamedEntity, R extends NamedEntity>
extends AbstractUpdateEntityWindowController<T, E, R> {
/**
* Constructor
*
* @param uiDependencies
* {@link CommonUiDependencies}
*/
public AbstractUpdateNamedEntityWindowController(final CommonUiDependencies uiDependencies) {
super(uiDependencies);
}
@Override
protected String getDisplayableName(final R entity) {
return entity.getName();
}
@Override
protected String getDisplayableNameForFailedMessage(final E entity) {
return entity.getName();
}
@Override
protected Long getId(final R entity) {
return entity.getId();
}
}

View File

@@ -0,0 +1,97 @@
/**
* Copyright (c) 2020 Bosch.IO 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 org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/**
* Container for commonly used dependencies in the UI.
*/
public class CommonUiDependencies {
private final VaadinMessageSource i18n;
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final SpPermissionChecker permChecker;
/**
* Public constructor.
*
* @param i18n
* VaadinMessageSource
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param permChecker
* {@link SpPermissionChecker}
*/
public CommonUiDependencies(final VaadinMessageSource i18n, final EntityFactory entityFactory,
final UIEventBus eventBus, final UINotification uiNotification, final SpPermissionChecker permChecker) {
super();
this.i18n = i18n;
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.permChecker = permChecker;
}
/**
* Returns {@link VaadinMessageSource}
*
* @return the i18n
*/
public VaadinMessageSource getI18n() {
return i18n;
}
/**
* Returns {@link EntityFactory}
*
* @return the entityFactory
*/
public EntityFactory getEntityFactory() {
return entityFactory;
}
/**
* Returns {@link UIEventBus}
*
* @return the eventBus
*/
public UIEventBus getEventBus() {
return eventBus;
}
/**
* Returns {@link UINotification}
*
* @return the uiNotification
*/
public UINotification getUiNotification() {
return uiNotification;
}
/**
* Returns {@link SpPermissionChecker}
*
* @return the permChecker
*/
public SpPermissionChecker getPermChecker() {
return permChecker;
}
}

View File

@@ -0,0 +1,39 @@
/**
* Copyright (c) 2020 Bosch.IO 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 org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
/**
* Base function for a validator used in window controllers.
*/
public class EntityValidator {
private final CommonUiDependencies uiDependencies;
/**
* Constructor
*
* @param uiDependencies
* {@link CommonUiDependencies}
*/
protected EntityValidator(final CommonUiDependencies uiDependencies) {
this.uiDependencies = uiDependencies;
}
protected void displayValidationError(final String messageKey, final Object... args) {
uiDependencies.getUiNotification()
.displayValidationError(uiDependencies.getI18n().getMessage(messageKey, args));
}
protected VaadinMessageSource getI18n() {
return uiDependencies.getI18n();
}
}

View File

@@ -8,18 +8,14 @@
*/ */
package org.eclipse.hawkbit.ui.common.data.filters; package org.eclipse.hawkbit.ui.common.data.filters;
import java.io.Serializable;
import org.eclipse.hawkbit.ui.common.data.providers.DistributionSetDistributionsStateDataProvider; import org.eclipse.hawkbit.ui.common.data.providers.DistributionSetDistributionsStateDataProvider;
import org.springframework.util.StringUtils;
/** /**
* Filter params for {@link DistributionSetDistributionsStateDataProvider}. * Filter params for {@link DistributionSetDistributionsStateDataProvider}.
*/ */
public class DsDistributionsFilterParams implements Serializable { public class DsDistributionsFilterParams extends DsFilterParams {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private String searchText;
private Long dsTypeId; private Long dsTypeId;
/** /**
@@ -33,34 +29,15 @@ public class DsDistributionsFilterParams implements Serializable {
* Constructor. * Constructor.
* *
* @param searchText * @param searchText
* String * String
* @param dsTypeId * @param dsTypeId
* Long * Long
*/ */
public DsDistributionsFilterParams(final String searchText, final Long dsTypeId) { public DsDistributionsFilterParams(final String searchText, final Long dsTypeId) {
this.searchText = searchText; super(searchText);
this.dsTypeId = dsTypeId; this.dsTypeId = dsTypeId;
} }
/**
* Gets the searchText
*
* @return SearchText
*/
public String getSearchText() {
return searchText;
}
/**
* Sets the SearchText
*
* @param searchText
* String
*/
public void setSearchText(final String searchText) {
this.searchText = !StringUtils.isEmpty(searchText) ? String.format("%%%s%%", searchText) : null;
}
/** /**
* @return DsTypeId * @return DsTypeId
*/ */
@@ -72,7 +49,7 @@ public class DsDistributionsFilterParams implements Serializable {
* Setter for DsTypeId * Setter for DsTypeId
* *
* @param dsTypeId * @param dsTypeId
* Long * Long
*/ */
public void setDsTypeId(final Long dsTypeId) { public void setDsTypeId(final Long dsTypeId) {
this.dsTypeId = dsTypeId; this.dsTypeId = dsTypeId;

View File

@@ -0,0 +1,58 @@
/**
* Copyright (c) 2020 Bosch.IO 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.data.filters;
import java.io.Serializable;
import org.eclipse.hawkbit.ui.common.data.providers.DistributionSetManagementStateDataProvider;
import org.springframework.util.StringUtils;
/**
* Filter params for {@link DistributionSetManagementStateDataProvider}.
*/
public class DsFilterParams implements Serializable {
private static final long serialVersionUID = 1L;
private String searchText;
/**
* Constructor for DsManagementFilterParams
*/
public DsFilterParams() {
this("");
}
/**
* Constructor.
*
* @param searchText
* String as search text
*/
public DsFilterParams(final String searchText) {
this.searchText = searchText;
}
/**
* @return SearchText
*/
public String getSearchText() {
return searchText;
}
/**
* Setter for searchText
*
* @param searchText
* String
*/
public void setSearchText(final String searchText) {
this.searchText = !StringUtils.isEmpty(searchText) ? String.format("%%%s%%", searchText) : null;
}
}

View File

@@ -8,21 +8,18 @@
*/ */
package org.eclipse.hawkbit.ui.common.data.filters; package org.eclipse.hawkbit.ui.common.data.filters;
import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import org.eclipse.hawkbit.ui.common.data.providers.DistributionSetManagementStateDataProvider; import org.eclipse.hawkbit.ui.common.data.providers.DistributionSetManagementStateDataProvider;
import org.springframework.util.StringUtils;
/** /**
* Filter params for {@link DistributionSetManagementStateDataProvider}. * Filter params for {@link DistributionSetManagementStateDataProvider}.
*/ */
public class DsManagementFilterParams implements Serializable { public class DsManagementFilterParams extends DsFilterParams {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private String searchText;
private boolean noTagClicked; private boolean noTagClicked;
private Collection<String> distributionSetTags; private Collection<String> distributionSetTags;
private String pinnedTargetControllerId; private String pinnedTargetControllerId;
@@ -48,29 +45,12 @@ public class DsManagementFilterParams implements Serializable {
*/ */
public DsManagementFilterParams(final String searchText, final boolean noTagClicked, public DsManagementFilterParams(final String searchText, final boolean noTagClicked,
final List<String> distributionSetTags, final String pinnedTargetControllerId) { final List<String> distributionSetTags, final String pinnedTargetControllerId) {
this.searchText = searchText; super(searchText);
this.noTagClicked = noTagClicked; this.noTagClicked = noTagClicked;
this.distributionSetTags = distributionSetTags; this.distributionSetTags = distributionSetTags;
this.pinnedTargetControllerId = pinnedTargetControllerId; this.pinnedTargetControllerId = pinnedTargetControllerId;
} }
/**
* @return SearchText
*/
public String getSearchText() {
return searchText;
}
/**
* Setter for searchText
*
* @param searchText
* String
*/
public void setSearchText(final String searchText) {
this.searchText = !StringUtils.isEmpty(searchText) ? String.format("%%%s%%", searchText) : null;
}
/** /**
* @return DistributionSetTags * @return DistributionSetTags
*/ */

View File

@@ -10,9 +10,9 @@ package org.eclipse.hawkbit.ui.common.detailslayout;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder; import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder;
import org.eclipse.hawkbit.ui.common.CommonDialogWindow; import org.eclipse.hawkbit.ui.common.CommonDialogWindow;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import com.vaadin.server.Sizeable.Unit; import com.vaadin.server.Sizeable.Unit;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -21,18 +21,18 @@ import com.vaadin.ui.Window;
* Abstract builder for Meta data window * Abstract builder for Meta data window
* *
* @param <F> * @param <F>
* Generic type * Generic type
*/ */
public abstract class AbstractMetaDataWindowBuilder<F> extends AbstractEntityWindowBuilder<ProxyMetaData> { public abstract class AbstractMetaDataWindowBuilder<F> extends AbstractEntityWindowBuilder<ProxyMetaData> {
/** /**
* Constructor for AbstractMetaDataWindowBuilder * Constructor for AbstractMetaDataWindowBuilder
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
*/ */
public AbstractMetaDataWindowBuilder(final VaadinMessageSource i18n) { public AbstractMetaDataWindowBuilder(final CommonUiDependencies uiDependencies) {
super(i18n); super(uiDependencies);
} }
@Override @Override
@@ -44,7 +44,7 @@ public abstract class AbstractMetaDataWindowBuilder<F> extends AbstractEntityWin
final F selectedEntityFilter, final String selectedEntityName, final ProxyMetaData proxyMetaData) { final F selectedEntityFilter, final String selectedEntityName, final ProxyMetaData proxyMetaData) {
final CommonDialogWindow window = createWindow(metaDataWindowLayout, null); final CommonDialogWindow window = createWindow(metaDataWindowLayout, null);
window.setAssistivePrefix(i18n.getMessage("caption.metadata.popup") + " " + "<b>"); window.setAssistivePrefix(getI18n().getMessage("caption.metadata.popup") + " " + "<b>");
window.setCaptionAsHtml(false); window.setCaptionAsHtml(false);
window.setCaption(selectedEntityName); window.setCaption(selectedEntityName);
window.setAssistivePostfix("</b>"); window.setAssistivePostfix("</b>");

View File

@@ -12,9 +12,11 @@ import java.util.Collection;
import java.util.Optional; import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.model.MetaData; import org.eclipse.hawkbit.repository.model.MetaData;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.common.CommonDialogWindow.SaveDialogCloseListener; import org.eclipse.hawkbit.ui.common.CommonDialogWindow.SaveDialogCloseListener;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData;
import org.eclipse.hawkbit.ui.common.layout.AbstractGridComponentLayout; import org.eclipse.hawkbit.ui.common.layout.AbstractGridComponentLayout;
import org.eclipse.hawkbit.ui.utils.UINotification; import org.eclipse.hawkbit.ui.utils.UINotification;
@@ -36,9 +38,11 @@ public abstract class AbstractMetaDataWindowLayout<F> extends HorizontalLayout {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
protected final VaadinMessageSource i18n; protected final VaadinMessageSource i18n;
protected final transient UIEventBus eventBus;
protected final UINotification uiNotification; protected final UINotification uiNotification;
protected final SpPermissionChecker permChecker; protected final SpPermissionChecker permChecker;
protected final transient UIEventBus eventBus;
protected final transient EntityFactory entityFactory;
protected final transient CommonUiDependencies uiDependencies;
private final MetadataWindowGridHeader metadataWindowGridHeader; private final MetadataWindowGridHeader metadataWindowGridHeader;
@@ -49,24 +53,19 @@ public abstract class AbstractMetaDataWindowLayout<F> extends HorizontalLayout {
/** /**
* Constructor for AbstractTagWindowLayout * Constructor for AbstractTagWindowLayout
* *
* @param i18n * @param uiDependencies
* I18N * {@link CommonUiDependencies}
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param permChecker
* SpPermissionChecker
*/ */
public AbstractMetaDataWindowLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, public AbstractMetaDataWindowLayout(final CommonUiDependencies uiDependencies) {
final UINotification uiNotification, final SpPermissionChecker permChecker) { this.uiDependencies = uiDependencies;
this.i18n = i18n; this.i18n = uiDependencies.getI18n();
this.eventBus = eventBus; this.eventBus = uiDependencies.getEventBus();
this.uiNotification = uiNotification; this.uiNotification = uiDependencies.getUiNotification();
this.permChecker = permChecker; this.permChecker = uiDependencies.getPermChecker();
this.entityFactory = uiDependencies.getEntityFactory();
this.metadataWindowGridHeader = new MetadataWindowGridHeader(i18n, permChecker, eventBus, this.metadataWindowGridHeader = new MetadataWindowGridHeader(uiDependencies, this::hasMetadataChangePermission,
this::hasMetadataChangePermission, this::showAddMetaDataLayout); this::showAddMetaDataLayout);
} }
// can be overriden in child classes for entity-specific permission // can be overriden in child classes for entity-specific permission
@@ -74,14 +73,6 @@ public abstract class AbstractMetaDataWindowLayout<F> extends HorizontalLayout {
return permChecker.hasUpdateRepositoryPermission(); return permChecker.hasUpdateRepositoryPermission();
} }
private void showAddMetaDataLayout() {
getMetaDataWindowGrid().deselectAll();
getAddMetaDataWindowController().populateWithData(null);
saveCallback.accept(getAddMetaDataWindowController().getSaveDialogCloseListener());
resetSaveButton();
}
protected MetaData createMetaData(final ProxyMetaData entity) { protected MetaData createMetaData(final ProxyMetaData entity) {
final MetaData newMetaData = doCreateMetaData(entity); final MetaData newMetaData = doCreateMetaData(entity);
@@ -144,6 +135,14 @@ public abstract class AbstractMetaDataWindowLayout<F> extends HorizontalLayout {
protected abstract void doDeleteMetaDataByKey(final String metaDataKey); protected abstract void doDeleteMetaDataByKey(final String metaDataKey);
private void showAddMetaDataLayout() {
getMetaDataWindowGrid().deselectAll();
getAddMetaDataWindowController().populateWithData(null);
saveCallback.accept(getAddMetaDataWindowController().getSaveDialogCloseListener());
resetSaveButton();
}
/** /**
* @return add meta data window controller * @return add meta data window controller
*/ */

View File

@@ -12,31 +12,30 @@ import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import org.eclipse.hawkbit.repository.model.MetaData; import org.eclipse.hawkbit.repository.model.MetaData;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; import org.eclipse.hawkbit.ui.common.AbstractAddEntityWindowController;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.EntityWindowLayout;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData;
import org.eclipse.hawkbit.ui.utils.UINotification; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
/** /**
* Controller to add meta data window * Controller to add meta data window
*/ */
public class AddMetaDataWindowController extends AbstractEntityWindowController<ProxyMetaData, ProxyMetaData> { public class AddMetaDataWindowController
private final VaadinMessageSource i18n; extends AbstractAddEntityWindowController<ProxyMetaData, ProxyMetaData, MetaData> {
private final UINotification uiNotification;
private final MetaDataAddUpdateWindowLayout layout; private final MetaDataAddUpdateWindowLayout layout;
private final Function<ProxyMetaData, MetaData> createMetaDataCallback; private final Function<ProxyMetaData, MetaData> createMetaDataCallback;
private final Predicate<String> duplicateCheckCallback; private final Predicate<String> duplicateCheckCallback;
private final ProxyMetadataValidator validator;
/** /**
* Constructor for AddMetaDataWindowController * Constructor for AddMetaDataWindowController
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param uiNotification
* UINotification
* @param layout * @param layout
* MetaDataAddUpdateWindowLayout * MetaDataAddUpdateWindowLayout
* @param createMetaDataCallback * @param createMetaDataCallback
@@ -44,21 +43,15 @@ public class AddMetaDataWindowController extends AbstractEntityWindowController<
* @param duplicateCheckCallback * @param duplicateCheckCallback
* Duplicate check callback * Duplicate check callback
*/ */
public AddMetaDataWindowController(final VaadinMessageSource i18n, final UINotification uiNotification, public AddMetaDataWindowController(final CommonUiDependencies uiDependencies,
final MetaDataAddUpdateWindowLayout layout, final Function<ProxyMetaData, MetaData> createMetaDataCallback, final MetaDataAddUpdateWindowLayout layout, final Function<ProxyMetaData, MetaData> createMetaDataCallback,
final Predicate<String> duplicateCheckCallback) { final Predicate<String> duplicateCheckCallback) {
this.i18n = i18n; super(uiDependencies);
this.uiNotification = uiNotification;
this.layout = layout; this.layout = layout;
this.createMetaDataCallback = createMetaDataCallback; this.createMetaDataCallback = createMetaDataCallback;
this.duplicateCheckCallback = duplicateCheckCallback; this.duplicateCheckCallback = duplicateCheckCallback;
} this.validator = new ProxyMetadataValidator(uiDependencies);
@Override
public MetaDataAddUpdateWindowLayout getLayout() {
return layout;
} }
@Override @Override
@@ -68,36 +61,56 @@ public class AddMetaDataWindowController extends AbstractEntityWindowController<
return new ProxyMetaData(); return new ProxyMetaData();
} }
@Override
public EntityWindowLayout<ProxyMetaData> getLayout() {
return layout;
}
@Override @Override
protected void adaptLayout(final ProxyMetaData proxyEntity) { protected void adaptLayout(final ProxyMetaData proxyEntity) {
layout.enableMetadataKey(); layout.enableMetadataKey();
} }
@Override @Override
protected void persistEntity(final ProxyMetaData entity) { protected String getPersistSuccessMessageKey() {
final MetaData newMetaData = createMetaDataCallback.apply(entity); return "message.metadata.saved";
uiNotification.displaySuccess(i18n.getMessage("message.metadata.saved", newMetaData.getKey())); }
@Override
protected MetaData persistEntityInRepository(final ProxyMetaData entity) {
return createMetaDataCallback.apply(entity);
}
@Override
protected String getDisplayableName(final MetaData entity) {
return entity.getKey();
}
@Override
protected String getDisplayableNameForFailedMessage(final ProxyMetaData entity) {
return entity.getKey();
}
@Override
protected void publishModifiedEvent(final EntityModifiedEventPayload eventPayload) {
// do not publish entity created because it is already managed by the
// update callback that sends the event for parent entity of metadata
}
@Override
protected Long getId(final MetaData entity) {
return entity.getEntityId();
}
@Override
protected Class<? extends ProxyIdentifiableEntity> getEntityClass() {
return ProxyMetaData.class;
} }
@Override @Override
protected boolean isEntityValid(final ProxyMetaData entity) { protected boolean isEntityValid(final ProxyMetaData entity) {
if (!StringUtils.hasText(entity.getKey())) {
uiNotification.displayValidationError(i18n.getMessage("message.key.missing"));
return false;
}
if (!StringUtils.hasText(entity.getValue())) {
uiNotification.displayValidationError(i18n.getMessage("message.value.missing"));
return false;
}
final String trimmedKey = StringUtils.trimWhitespace(entity.getKey()); final String trimmedKey = StringUtils.trimWhitespace(entity.getKey());
if (duplicateCheckCallback.test(trimmedKey)) { return validator.isEntityValid(entity, () -> duplicateCheckCallback.test(trimmedKey));
uiNotification.displayValidationError(i18n.getMessage("message.metadata.duplicate.check", trimmedKey));
return false;
}
return true;
} }
@Override @Override

View File

@@ -12,7 +12,7 @@ import java.util.Collection;
import java.util.function.BooleanSupplier; import java.util.function.BooleanSupplier;
import java.util.function.Predicate; import java.util.function.Predicate;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder; import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder;
import org.eclipse.hawkbit.ui.common.data.providers.AbstractMetaDataDataProvider; import org.eclipse.hawkbit.ui.common.data.providers.AbstractMetaDataDataProvider;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData;
@@ -22,9 +22,6 @@ import org.eclipse.hawkbit.ui.common.grid.support.FilterSupport;
import org.eclipse.hawkbit.ui.common.grid.support.SelectionSupport; import org.eclipse.hawkbit.ui.common.grid.support.SelectionSupport;
import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent; import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Grid for MetaData pop up layout. * Grid for MetaData pop up layout.
@@ -45,14 +42,8 @@ public class MetaDataWindowGrid<F> extends AbstractGrid<ProxyMetaData, F> implem
/** /**
* Constructor for MetaDataWindowGrid * Constructor for MetaDataWindowGrid
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param eventBus
* UIEventBus
* @param permissionChecker
* SpPermissionChecker
* @param notification
* UINotification
* @param dataProvider * @param dataProvider
* provides entity-specific metadata entities * provides entity-specific metadata entities
* @param hasMetadataChangePermission * @param hasMetadataChangePermission
@@ -61,14 +52,12 @@ public class MetaDataWindowGrid<F> extends AbstractGrid<ProxyMetaData, F> implem
* callback method to delete metadata entities * callback method to delete metadata entities
* *
*/ */
public MetaDataWindowGrid(final VaadinMessageSource i18n, final UIEventBus eventBus, public MetaDataWindowGrid(final CommonUiDependencies uiDependencies, final AbstractMetaDataDataProvider<?, F> dataProvider,final BooleanSupplier hasMetadataChangePermission,
final SpPermissionChecker permissionChecker, final UINotification notification,
final AbstractMetaDataDataProvider<?, F> dataProvider, final BooleanSupplier hasMetadataChangePermission,
final Predicate<Collection<ProxyMetaData>> itemsDeletionCallback) { final Predicate<Collection<ProxyMetaData>> itemsDeletionCallback) {
super(i18n, eventBus, permissionChecker); super(uiDependencies.getI18n(), uiDependencies.getEventBus(), uiDependencies.getPermChecker());
this.hasMetadataChangePermission = hasMetadataChangePermission; this.hasMetadataChangePermission = hasMetadataChangePermission;
this.metaDataDeleteSupport = new DeleteSupport<>(this, i18n, notification, "caption.metadata", this.metaDataDeleteSupport = new DeleteSupport<>(this, i18n, uiDependencies.getUiNotification(), "caption.metadata",
"caption.metadata.plur", ProxyMetaData::getKey, itemsDeletionCallback, "caption.metadata.plur", ProxyMetaData::getKey, itemsDeletionCallback,
UIComponentIdProvider.METADATA_DELETE_CONFIRMATION_DIALOG); UIComponentIdProvider.METADATA_DELETE_CONFIRMATION_DIALOG);

View File

@@ -10,13 +10,11 @@ package org.eclipse.hawkbit.ui.common.detailslayout;
import java.util.function.BooleanSupplier; import java.util.function.BooleanSupplier;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.grid.header.AbstractGridHeader; import org.eclipse.hawkbit.ui.common.grid.header.AbstractGridHeader;
import org.eclipse.hawkbit.ui.common.grid.header.support.AddHeaderSupport; import org.eclipse.hawkbit.ui.common.grid.header.support.AddHeaderSupport;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Component; import com.vaadin.ui.Component;
@@ -31,21 +29,15 @@ public class MetadataWindowGridHeader extends AbstractGridHeader {
/** /**
* Constructor for MetadataWindowGridHeader * Constructor for MetadataWindowGridHeader
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param permChecker
* SpPermissionChecker
* @param eventBus
* UIEventBus
* @param hasMetadataChangePermission * @param hasMetadataChangePermission
* checks the permission allowing to change metadata entities * checks the permission allowing to change metadata entities
* @param addNewItemCallback * @param addNewItemCallback
* callback method to add new metadata entities * Runnable
*/ */
public MetadataWindowGridHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, public MetadataWindowGridHeader(final CommonUiDependencies uiDependencies,final BooleanSupplier hasMetadataChangePermission, final Runnable addNewItemCallback) {
final UIEventBus eventBus, final BooleanSupplier hasMetadataChangePermission, super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus());
final Runnable addNewItemCallback) {
super(i18n, permChecker, eventBus);
if (hasMetadataChangePermission.getAsBoolean()) { if (hasMetadataChangePermission.getAsBoolean()) {
this.addHeaderSupport = new AddHeaderSupport(i18n, UIComponentIdProvider.METADATA_ADD_ICON_ID, this.addHeaderSupport = new AddHeaderSupport(i18n, UIComponentIdProvider.METADATA_ADD_ICON_ID,

View File

@@ -0,0 +1,53 @@
/**
* Copyright (c) 2020 Bosch.IO 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 java.util.function.BooleanSupplier;
import org.eclipse.hawkbit.ui.common.EntityValidator;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData;
import org.springframework.util.StringUtils;
/**
* Validator used in Metadata window controllers to validate
* {@link ProxyMetaData}.
*/
public class ProxyMetadataValidator extends EntityValidator {
/**
* Constructor
*
* @param uiDependencies
* {@link CommonUiDependencies}
*/
public ProxyMetadataValidator(final CommonUiDependencies uiDependencies) {
super(uiDependencies);
}
boolean isEntityValid(final ProxyMetaData entity, final BooleanSupplier duplicateCheck) {
if (!StringUtils.hasText(entity.getValue())) {
displayValidationError("message.value.missing");
return false;
}
if (!StringUtils.hasText(entity.getKey())) {
displayValidationError("message.key.missing");
return false;
}
final String trimmedKey = StringUtils.trimWhitespace(entity.getKey());
if (duplicateCheck.getAsBoolean()) {
displayValidationError("message.metadata.duplicate.check", trimmedKey);
return false;
}
return true;
}
}

View File

@@ -18,13 +18,12 @@ import org.eclipse.hawkbit.repository.SoftwareModuleManagement;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.repository.model.SoftwareModuleType; import org.eclipse.hawkbit.repository.model.SoftwareModuleType;
import org.eclipse.hawkbit.ui.artifacts.smtable.SmMetaDataWindowBuilder; import org.eclipse.hawkbit.ui.artifacts.smtable.SmMetaDataWindowBuilder;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.providers.SmMetaDataDataProvider; import org.eclipse.hawkbit.ui.common.data.providers.SmMetaDataDataProvider;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyKeyValueDetails; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyKeyValueDetails;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.UI; import com.vaadin.ui.UI;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -46,10 +45,8 @@ public class SoftwareModuleDetails extends AbstractGridDetailsLayout<ProxySoftwa
/** /**
* Constructor for SoftwareModuleDetails * Constructor for SoftwareModuleDetails
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param eventBus
* UIEventBus
* @param softwareManagement * @param softwareManagement
* SoftwareModuleManagement * SoftwareModuleManagement
* @param softwareModuleTypeManagement * @param softwareModuleTypeManagement
@@ -57,17 +54,17 @@ public class SoftwareModuleDetails extends AbstractGridDetailsLayout<ProxySoftwa
* @param smMetaDataWindowBuilder * @param smMetaDataWindowBuilder
* SmMetaDataWindowBuilder * SmMetaDataWindowBuilder
*/ */
public SoftwareModuleDetails(final VaadinMessageSource i18n, final UIEventBus eventBus, public SoftwareModuleDetails(final CommonUiDependencies uiDependencies, final SoftwareModuleManagement softwareManagement,
final SoftwareModuleManagement softwareManagement,
final SoftwareModuleTypeManagement softwareModuleTypeManagement, final SoftwareModuleTypeManagement softwareModuleTypeManagement,
final SmMetaDataWindowBuilder smMetaDataWindowBuilder) { final SmMetaDataWindowBuilder smMetaDataWindowBuilder) {
super(i18n); super(uiDependencies.getI18n());
this.smMetaDataWindowBuilder = smMetaDataWindowBuilder; this.smMetaDataWindowBuilder = smMetaDataWindowBuilder;
this.softwareModuleTypeManagement = softwareModuleTypeManagement; this.softwareModuleTypeManagement = softwareModuleTypeManagement;
this.smMetadataGrid = new MetadataDetailsGrid<>(i18n, eventBus, UIComponentIdProvider.SW_TYPE_PREFIX, this.smMetadataGrid = new MetadataDetailsGrid<>(i18n, uiDependencies.getEventBus(),
this::showMetadataDetails, new SmMetaDataDataProvider(softwareManagement)); UIComponentIdProvider.SW_TYPE_PREFIX, this::showMetadataDetails,
new SmMetaDataDataProvider(softwareManagement));
addDetailsComponents(Arrays.asList(new SimpleEntry<>(i18n.getMessage("caption.tab.details"), entityDetails), addDetailsComponents(Arrays.asList(new SimpleEntry<>(i18n.getMessage("caption.tab.details"), entityDetails),
new SimpleEntry<>(i18n.getMessage("caption.tab.description"), entityDescription), new SimpleEntry<>(i18n.getMessage("caption.tab.description"), entityDescription),

View File

@@ -24,6 +24,7 @@ import org.eclipse.hawkbit.repository.model.DistributionSetType;
import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.repository.model.SoftwareModuleType; import org.eclipse.hawkbit.repository.model.SoftwareModuleType;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder; import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModuleDetails; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModuleDetails;
@@ -78,14 +79,8 @@ public class SoftwareModuleDetailsGrid extends Grid<ProxySoftwareModuleDetails>
/** /**
* Initialize software module table- to be displayed in details layout. * Initialize software module table- to be displayed in details layout.
* *
* @param i18n * @param uiDependencies
* I18N * {@link CommonUiDependencies}
* @param eventBus
* SessionEventBus
* @param uiNotification
* UINotification for displaying error and success notifications
* @param permissionChecker
* SpPermissionChecker
* @param distributionSetManagement * @param distributionSetManagement
* DistributionSetManagement * DistributionSetManagement
* @param smManagement * @param smManagement
@@ -93,14 +88,13 @@ public class SoftwareModuleDetailsGrid extends Grid<ProxySoftwareModuleDetails>
* @param dsTypeManagement * @param dsTypeManagement
* DistributionSetTypeManagement * DistributionSetTypeManagement
*/ */
public SoftwareModuleDetailsGrid(final VaadinMessageSource i18n, final UIEventBus eventBus, public SoftwareModuleDetailsGrid(final CommonUiDependencies uiDependencies,
final UINotification uiNotification, final SpPermissionChecker permissionChecker,
final DistributionSetManagement distributionSetManagement, final SoftwareModuleManagement smManagement, final DistributionSetManagement distributionSetManagement, final SoftwareModuleManagement smManagement,
final DistributionSetTypeManagement dsTypeManagement) { final DistributionSetTypeManagement dsTypeManagement) {
this.i18n = i18n; this.i18n = uiDependencies.getI18n();
this.uiNotification = uiNotification; this.uiNotification = uiDependencies.getUiNotification();
this.eventBus = eventBus; this.eventBus = uiDependencies.getEventBus();
this.permissionChecker = permissionChecker; this.permissionChecker = uiDependencies.getPermChecker();
this.distributionSetManagement = distributionSetManagement; this.distributionSetManagement = distributionSetManagement;
this.smManagement = smManagement; this.smManagement = smManagement;

View File

@@ -9,18 +9,15 @@
package org.eclipse.hawkbit.ui.common.detailslayout; package org.eclipse.hawkbit.ui.common.detailslayout;
import org.eclipse.hawkbit.repository.ArtifactManagement; import org.eclipse.hawkbit.repository.ArtifactManagement;
import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.artifacts.details.ArtifactDetailsGrid; import org.eclipse.hawkbit.ui.artifacts.details.ArtifactDetailsGrid;
import org.eclipse.hawkbit.ui.artifacts.smtable.SmMetaDataWindowBuilder; import org.eclipse.hawkbit.ui.artifacts.smtable.SmMetaDataWindowBuilder;
import org.eclipse.hawkbit.ui.artifacts.smtable.SmWindowBuilder; import org.eclipse.hawkbit.ui.artifacts.smtable.SmWindowBuilder;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.eclipse.hawkbit.ui.common.grid.header.AbstractDetailsHeader; import org.eclipse.hawkbit.ui.common.grid.header.AbstractDetailsHeader;
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.shared.ui.window.WindowMode; import com.vaadin.shared.ui.window.WindowMode;
import com.vaadin.ui.UI; import com.vaadin.ui.UI;
@@ -34,6 +31,7 @@ public class SoftwareModuleDetailsHeader extends AbstractDetailsHeader<ProxySoft
private final transient SmWindowBuilder smWindowBuilder; private final transient SmWindowBuilder smWindowBuilder;
private final transient SmMetaDataWindowBuilder smMetaDataWindowBuilder; private final transient SmMetaDataWindowBuilder smMetaDataWindowBuilder;
private final transient CommonUiDependencies uiDependencies;
private transient ArtifactDetailsHeaderSupport artifactDetailsHeaderSupport; private transient ArtifactDetailsHeaderSupport artifactDetailsHeaderSupport;
private transient ArtifactManagement artifactManagement; private transient ArtifactManagement artifactManagement;
@@ -42,23 +40,17 @@ public class SoftwareModuleDetailsHeader extends AbstractDetailsHeader<ProxySoft
/** /**
* Constructor for SoftwareModuleDetailsHeader * Constructor for SoftwareModuleDetailsHeader
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param permChecker
* SpPermissionChecker
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param smWindowBuilder * @param smWindowBuilder
* SmWindowBuilder * SmWindowBuilder
* @param smMetaDataWindowBuilder * @param smMetaDataWindowBuilder
* SmMetaDataWindowBuilder * SmMetaDataWindowBuilder
*/ */
public SoftwareModuleDetailsHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, public SoftwareModuleDetailsHeader(final CommonUiDependencies uiDependencies, final SmWindowBuilder smWindowBuilder,
final UIEventBus eventBus, final UINotification uiNotification, final SmWindowBuilder smWindowBuilder,
final SmMetaDataWindowBuilder smMetaDataWindowBuilder) { final SmMetaDataWindowBuilder smMetaDataWindowBuilder) {
super(i18n, permChecker, eventBus, uiNotification); super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus(), uiDependencies.getUiNotification());
this.uiDependencies = uiDependencies;
this.smWindowBuilder = smWindowBuilder; this.smWindowBuilder = smWindowBuilder;
this.smMetaDataWindowBuilder = smMetaDataWindowBuilder; this.smMetaDataWindowBuilder = smMetaDataWindowBuilder;
@@ -156,8 +148,7 @@ public class SoftwareModuleDetailsHeader extends AbstractDetailsHeader<ProxySoft
} }
if (artifactDetailsGrid == null) { if (artifactDetailsGrid == null) {
artifactDetailsGrid = new ArtifactDetailsGrid(eventBus, i18n, permChecker, uiNotification, artifactDetailsGrid = new ArtifactDetailsGrid(uiDependencies, artifactManagement);
artifactManagement);
} }
setInitialArtifactDetailsGridSize(artifactDetailsGrid); setInitialArtifactDetailsGridSize(artifactDetailsGrid);
artifactDetailsGrid.getMasterEntitySupport().masterEntityChanged(selectedEntity); artifactDetailsGrid.getMasterEntitySupport().masterEntityChanged(selectedEntity);

View File

@@ -9,58 +9,51 @@
package org.eclipse.hawkbit.ui.common.detailslayout; package org.eclipse.hawkbit.ui.common.detailslayout;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate;
import org.eclipse.hawkbit.repository.exception.EntityNotFoundException;
import org.eclipse.hawkbit.repository.exception.EntityReadOnlyException;
import org.eclipse.hawkbit.repository.model.MetaData; import org.eclipse.hawkbit.repository.model.MetaData;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; import org.eclipse.hawkbit.ui.common.AbstractUpdateEntityWindowController;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.EntityWindowLayout;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData;
import org.eclipse.hawkbit.ui.utils.UINotification; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
/** /**
* Controller for update meta data window * Controller for update meta data window
*/ */
public class UpdateMetaDataWindowController extends AbstractEntityWindowController<ProxyMetaData, ProxyMetaData> { public class UpdateMetaDataWindowController
private static final Logger LOG = LoggerFactory.getLogger(UpdateMetaDataWindowController.class); extends AbstractUpdateEntityWindowController<ProxyMetaData, ProxyMetaData, MetaData> {
private final VaadinMessageSource i18n;
private final UINotification uiNotification;
private final MetaDataAddUpdateWindowLayout layout; private final MetaDataAddUpdateWindowLayout layout;
private final Function<ProxyMetaData, MetaData> updateMetaDataCallback; private final Function<ProxyMetaData, MetaData> updateMetaDataCallback;
private final Predicate<String> duplicateCheckCallback;
private final ProxyMetadataValidator validator;
private String keyBeforeEdit;
/** /**
* Constructor for UpdateMetaDataWindowController * Constructor for UpdateMetaDataWindowController
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param uiNotification
* UINotification
* @param layout * @param layout
* MetaDataAddUpdateWindowLayout * MetaDataAddUpdateWindowLayout
* @param updateMetaDataCallback * @param updateMetaDataCallback
* Update meta data call back function for event listener * Update meta data call back function for event listener
* * @param duplicateCheckCallback
* call back to check if entity already exists in repository
*/ */
public UpdateMetaDataWindowController(final VaadinMessageSource i18n, final UINotification uiNotification, public UpdateMetaDataWindowController(final CommonUiDependencies uiDependencies,
final MetaDataAddUpdateWindowLayout layout, final MetaDataAddUpdateWindowLayout layout, final Function<ProxyMetaData, MetaData> updateMetaDataCallback,
final Function<ProxyMetaData, MetaData> updateMetaDataCallback) { final Predicate<String> duplicateCheckCallback) {
this.i18n = i18n; super(uiDependencies);
this.uiNotification = uiNotification;
this.layout = layout; this.layout = layout;
this.updateMetaDataCallback = updateMetaDataCallback; this.updateMetaDataCallback = updateMetaDataCallback;
} this.duplicateCheckCallback = duplicateCheckCallback;
this.validator = new ProxyMetadataValidator(uiDependencies);
@Override
public MetaDataAddUpdateWindowLayout getLayout() {
return layout;
} }
@Override @Override
@@ -72,44 +65,75 @@ public class UpdateMetaDataWindowController extends AbstractEntityWindowControll
metaData.setEntityId(proxyEntity.getEntityId()); metaData.setEntityId(proxyEntity.getEntityId());
metaData.setVisibleForTargets(proxyEntity.isVisibleForTargets()); metaData.setVisibleForTargets(proxyEntity.isVisibleForTargets());
keyBeforeEdit = proxyEntity.getKey();
return metaData; return metaData;
} }
@Override
public EntityWindowLayout<ProxyMetaData> getLayout() {
return layout;
}
@Override @Override
protected void adaptLayout(final ProxyMetaData proxyEntity) { protected void adaptLayout(final ProxyMetaData proxyEntity) {
layout.disableMetadataKey(); layout.disableMetadataKey();
} }
@Override @Override
protected void persistEntity(final ProxyMetaData entity) { protected boolean closeWindowAfterSave() {
try { return false;
final MetaData updatedMetaData = updateMetaDataCallback.apply(entity); }
uiNotification.displaySuccess(i18n.getMessage("message.metadata.updated", updatedMetaData.getKey()));
} catch (final EntityNotFoundException | EntityReadOnlyException e) { @Override
LOG.trace("Update of meta data failed in UI: {}", e.getMessage()); protected MetaData persistEntityInRepository(final ProxyMetaData entity) {
final String entityType = i18n.getMessage("caption.metadata"); return updateMetaDataCallback.apply(entity);
uiNotification }
.displayWarning(i18n.getMessage("message.key.deleted.or.notAllowed", entityType, entity.getKey()));
} @Override
protected String getPersistSuccessMessageKey() {
return "message.metadata.updated";
}
@Override
protected String getPersistFailureMessageKey() {
return "message.key.deleted.or.notAllowed";
}
@Override
protected String getDisplayableName(final MetaData entity) {
return entity.getKey();
}
@Override
protected String getDisplayableNameForFailedMessage(final ProxyMetaData entity) {
return entity.getKey();
}
@Override
protected Long getId(final MetaData entity) {
return entity.getEntityId();
}
@Override
protected void publishModifiedEvent(final EntityModifiedEventPayload eventPayload) {
// do not publish entity updated because it is already managed by the
// update callback that sends the event for parent entity of metadata
}
@Override
protected Class<? extends ProxyIdentifiableEntity> getEntityClass() {
return ProxyMetaData.class;
} }
@Override @Override
protected boolean isEntityValid(final ProxyMetaData entity) { protected boolean isEntityValid(final ProxyMetaData entity) {
if (!StringUtils.hasText(entity.getKey())) { final String trimmedKey = StringUtils.trimWhitespace(entity.getKey());
uiNotification.displayValidationError(i18n.getMessage("message.key.missing")); return validator.isEntityValid(entity,
return false; () -> hasKeyChanged(trimmedKey) && duplicateCheckCallback.test(trimmedKey));
}
if (!StringUtils.hasText(entity.getValue())) {
uiNotification.displayValidationError(i18n.getMessage("message.value.missing"));
return false;
}
return true;
} }
@Override private boolean hasKeyChanged(final String trimmedKey) {
protected boolean closeWindowAfterSave() { return !keyBeforeEdit.equals(trimmedKey);
return false;
} }
} }

View File

@@ -0,0 +1,156 @@
/**
* Copyright (c) 2020 Bosch.IO 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.distributionset;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.DistributionSetTypeManagement;
import org.eclipse.hawkbit.repository.SystemManagement;
import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.security.SystemSecurityContext;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.filters.DsFilterParams;
import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.layout.AbstractGridComponentLayout;
import org.eclipse.hawkbit.ui.common.layout.listener.TopicEventListener;
/**
* Abstract base class for distribution set grid layouts.
*/
public abstract class AbstractDistributionSetGridLayout extends AbstractGridComponentLayout {
private static final long serialVersionUID = 1L;
private final transient Set<TopicEventListener> listeners = new HashSet<>();
private final transient DsWindowBuilder dsWindowBuilder;
private final transient DsMetaDataWindowBuilder dsMetaDataWindowBuilder;
private final EventView eventView;
/**
* Constructor for AbstractDistributionSetGridLayout
*
* @param uiDependencies
* {@link CommonUiDependencies}
* @param systemManagement
* SystemManagement
* @param systemSecurityContext
* SystemSecurityContext
* @param configManagement
* TenantConfigurationManagement
* @param distributionSetManagement
* DistributionSetManagement
* @param distributionSetTypeManagement
* DistributionSetTypeManagement
* @param eventView
* EventView
*/
public AbstractDistributionSetGridLayout(final CommonUiDependencies uiDependencies,
final SystemManagement systemManagement, final SystemSecurityContext systemSecurityContext,
final TenantConfigurationManagement configManagement,
final DistributionSetManagement distributionSetManagement,
final DistributionSetTypeManagement distributionSetTypeManagement, final EventView eventView) {
this.eventView = eventView;
dsWindowBuilder = new DsWindowBuilder(uiDependencies, systemManagement, systemSecurityContext, configManagement,
distributionSetManagement, distributionSetTypeManagement, eventView);
dsMetaDataWindowBuilder = new DsMetaDataWindowBuilder(uiDependencies, distributionSetManagement);
}
/**
* Returns the {@link DsMetaDataWindowBuilder}.
*
* @return the dsMetaDataWindowBuilder
*/
public DsMetaDataWindowBuilder getDsMetaDataWindowBuilder() {
return dsMetaDataWindowBuilder;
}
/**
* Returns the {@link DsWindowBuilder}.
*
* @return the dsWindowBuilder
*/
public DsWindowBuilder getDsWindowBuilder() {
return dsWindowBuilder;
}
/**
* Returns the {@link EventView}
*
* @return the eventView
*/
public EventView getEventView() {
return eventView;
}
/**
* Returns the {@link AbstractDsGrid}
*
* @return the distributionGrid
*/
public abstract <T extends DsFilterParams> AbstractDsGrid<T> getDistributionGrid();
/**
* Returns the {@link DistributionSetGridHeader}
*
* @return the distributionGridHeader
*/
public abstract DistributionSetGridHeader getDistributionSetGridHeader();
/**
* Show distribution set filter header icon
*/
public void showDsFilterHeaderIcon() {
getDistributionSetGridHeader().showFilterIcon();
}
/**
* Hide distribution set filter header icon
*/
public void hideDsFilterHeaderIcon() {
getDistributionSetGridHeader().hideFilterIcon();
}
/**
* Maximize the distribution grid
*/
public void maximize() {
getDistributionGrid().createMaximizedContent();
hideDetailsLayout();
}
/**
* Minimize the distribution grid
*/
public void minimize() {
getDistributionGrid().createMinimizedContent();
showDetailsLayout();
}
/**
* Restore the distribution grid state
*/
public void restoreState() {
getDistributionSetGridHeader().restoreState();
getDistributionGrid().restoreState();
}
protected void addEventListener(final TopicEventListener listener) {
listeners.add(listener);
}
/**
* Unsubscribe the event listeners.
*/
public void unsubscribeListener() {
listeners.forEach(TopicEventListener::unsubscribe);
}
}

View File

@@ -6,14 +6,14 @@
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
*/ */
package org.eclipse.hawkbit.ui.common.grid; package org.eclipse.hawkbit.ui.common.distributionset;
import java.util.Collection; import java.util.Collection;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder; import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder;
import org.eclipse.hawkbit.ui.common.data.mappers.DistributionSetToProxyDistributionMapper; import org.eclipse.hawkbit.ui.common.data.mappers.DistributionSetToProxyDistributionMapper;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
@@ -23,13 +23,12 @@ import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModi
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
import org.eclipse.hawkbit.ui.common.event.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.grid.AbstractGrid;
import org.eclipse.hawkbit.ui.common.grid.support.DeleteSupport; import org.eclipse.hawkbit.ui.common.grid.support.DeleteSupport;
import org.eclipse.hawkbit.ui.common.grid.support.SelectionSupport; import org.eclipse.hawkbit.ui.common.grid.support.SelectionSupport;
import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState; import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification; import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Button; import com.vaadin.ui.Button;
@@ -50,15 +49,14 @@ public abstract class AbstractDsGrid<F> extends AbstractGrid<ProxyDistributionSe
protected final GridLayoutUiState distributionSetGridLayoutUiState; protected final GridLayoutUiState distributionSetGridLayoutUiState;
protected final transient DistributionSetManagement dsManagement; protected final transient DistributionSetManagement dsManagement;
protected final transient DistributionSetToProxyDistributionMapper dsToProxyDistributionMapper; protected final transient DistributionSetToProxyDistributionMapper dsToProxyDistributionMapper;
protected final transient DeleteSupport<ProxyDistributionSet> distributionDeleteSupport; protected final transient DeleteSupport<ProxyDistributionSet> distributionDeleteSupport;
protected final transient UINotification notification;
protected AbstractDsGrid(final VaadinMessageSource i18n, final UIEventBus eventBus, protected AbstractDsGrid(final CommonUiDependencies uiDependencies, final DistributionSetManagement dsManagement,
final SpPermissionChecker permissionChecker, final UINotification notification, final GridLayoutUiState distributionSetGridLayoutUiState, final EventView view) {
final DistributionSetManagement dsManagement, final GridLayoutUiState distributionSetGridLayoutUiState, super(uiDependencies.getI18n(), uiDependencies.getEventBus(), uiDependencies.getPermChecker());
final EventView view) {
super(i18n, eventBus, permissionChecker);
this.notification = uiDependencies.getUiNotification();
this.distributionSetGridLayoutUiState = distributionSetGridLayoutUiState; this.distributionSetGridLayoutUiState = distributionSetGridLayoutUiState;
this.dsManagement = dsManagement; this.dsManagement = dsManagement;
this.dsToProxyDistributionMapper = new DistributionSetToProxyDistributionMapper(); this.dsToProxyDistributionMapper = new DistributionSetToProxyDistributionMapper();

View File

@@ -6,7 +6,7 @@
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
*/ */
package org.eclipse.hawkbit.ui.common.detailslayout; package org.eclipse.hawkbit.ui.common.distributionset;
import java.util.AbstractMap.SimpleEntry; import java.util.AbstractMap.SimpleEntry;
import java.util.Arrays; import java.util.Arrays;
@@ -22,16 +22,17 @@ import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.security.SystemSecurityContext;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationProperties.TenantConfigurationKey; import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationProperties.TenantConfigurationKey;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.providers.DsMetaDataDataProvider; import org.eclipse.hawkbit.ui.common.data.providers.DsMetaDataDataProvider;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyKeyValueDetails; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyKeyValueDetails;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData;
import org.eclipse.hawkbit.ui.common.detailslayout.AbstractGridDetailsLayout;
import org.eclipse.hawkbit.ui.common.detailslayout.MetadataDetailsGrid;
import org.eclipse.hawkbit.ui.common.detailslayout.SoftwareModuleDetailsGrid;
import org.eclipse.hawkbit.ui.common.detailslayout.TargetFilterQueryDetailsGrid;
import org.eclipse.hawkbit.ui.common.tagdetails.DistributionTagToken; import org.eclipse.hawkbit.ui.common.tagdetails.DistributionTagToken;
import org.eclipse.hawkbit.ui.distributions.dstable.DsMetaDataWindowBuilder;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.UI; import com.vaadin.ui.UI;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -59,14 +60,8 @@ public class DistributionSetDetails extends AbstractGridDetailsLayout<ProxyDistr
/** /**
* Constructor for DistributionSetDetails * Constructor for DistributionSetDetails
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param eventBus
* UIEventBus
* @param permissionChecker
* SpPermissionChecker
* @param uiNotification
* UINotification
* @param dsManagement * @param dsManagement
* DistributionSetManagement * DistributionSetManagement
* @param smManagement * @param smManagement
@@ -82,27 +77,25 @@ public class DistributionSetDetails extends AbstractGridDetailsLayout<ProxyDistr
* @param dsMetaDataWindowBuilder * @param dsMetaDataWindowBuilder
* DsMetaDataWindowBuilder * DsMetaDataWindowBuilder
*/ */
public DistributionSetDetails(final VaadinMessageSource i18n, final UIEventBus eventBus, public DistributionSetDetails(final CommonUiDependencies uiDependencies, final DistributionSetManagement dsManagement,
final SpPermissionChecker permissionChecker, final UINotification uiNotification, final SoftwareModuleManagement smManagement, final DistributionSetTypeManagement dsTypeManagement,
final DistributionSetManagement dsManagement, final SoftwareModuleManagement smManagement, final DistributionSetTagManagement dsTagManagement,
final DistributionSetTypeManagement dsTypeManagement, final DistributionSetTagManagement dsTagManagement,
final TenantConfigurationManagement tenantConfigurationManagement, final TenantConfigurationManagement tenantConfigurationManagement,
final SystemSecurityContext systemSecurityContext, final DsMetaDataWindowBuilder dsMetaDataWindowBuilder) { final SystemSecurityContext systemSecurityContext, final DsMetaDataWindowBuilder dsMetaDataWindowBuilder) {
super(i18n); super(uiDependencies.getI18n());
this.tenantConfigurationManagement = tenantConfigurationManagement; this.tenantConfigurationManagement = tenantConfigurationManagement;
this.systemSecurityContext = systemSecurityContext; this.systemSecurityContext = systemSecurityContext;
this.permissionChecker = permissionChecker; this.permissionChecker = uiDependencies.getPermChecker();
this.dsMetaDataWindowBuilder = dsMetaDataWindowBuilder; this.dsMetaDataWindowBuilder = dsMetaDataWindowBuilder;
this.smDetailsGrid = new SoftwareModuleDetailsGrid(i18n, eventBus, uiNotification, permissionChecker, this.smDetailsGrid = new SoftwareModuleDetailsGrid(uiDependencies, dsManagement, smManagement, dsTypeManagement);
dsManagement, smManagement, dsTypeManagement);
this.distributionTagToken = new DistributionTagToken(permissionChecker, i18n, uiNotification, eventBus, this.distributionTagToken = new DistributionTagToken(uiDependencies, dsTagManagement, dsManagement);
dsTagManagement, dsManagement);
this.dsMetadataGrid = new MetadataDetailsGrid<>(i18n, eventBus, UIComponentIdProvider.DS_TYPE_PREFIX, this.dsMetadataGrid = new MetadataDetailsGrid<>(uiDependencies.getI18n(), uiDependencies.getEventBus(),
this::showMetadataDetails, new DsMetaDataDataProvider(dsManagement)); UIComponentIdProvider.DS_TYPE_PREFIX, this::showMetadataDetails,
new DsMetaDataDataProvider(dsManagement));
addDetailsComponents(Arrays.asList(new SimpleEntry<>(i18n.getMessage("caption.tab.details"), entityDetails), addDetailsComponents(Arrays.asList(new SimpleEntry<>(i18n.getMessage("caption.tab.details"), entityDetails),
new SimpleEntry<>(i18n.getMessage("caption.tab.description"), entityDescription), new SimpleEntry<>(i18n.getMessage("caption.tab.description"), entityDescription),

View File

@@ -6,17 +6,12 @@
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
*/ */
package org.eclipse.hawkbit.ui.common.detailslayout; package org.eclipse.hawkbit.ui.common.distributionset;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.grid.header.AbstractDetailsHeader; import org.eclipse.hawkbit.ui.common.grid.header.AbstractDetailsHeader;
import org.eclipse.hawkbit.ui.distributions.dstable.DsMetaDataWindowBuilder;
import org.eclipse.hawkbit.ui.distributions.dstable.DsWindowBuilder;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.UI; import com.vaadin.ui.UI;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -33,23 +28,17 @@ public class DistributionSetDetailsHeader extends AbstractDetailsHeader<ProxyDis
/** /**
* Constructor for DistributionSetDetailsHeader * Constructor for DistributionSetDetailsHeader
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param permChecker
* SpPermissionChecker
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param dsWindowBuilder * @param dsWindowBuilder
* DsWindowBuilder * DsWindowBuilder
* @param dsMetaDataWindowBuilder * @param dsMetaDataWindowBuilder
* DsMetaDataWindowBuilder * DsMetaDataWindowBuilder
*/ */
public DistributionSetDetailsHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, public DistributionSetDetailsHeader(final CommonUiDependencies uiDependencies,
final UIEventBus eventBus, final UINotification uiNotification, final DsWindowBuilder dsWindowBuilder, final DsWindowBuilder dsWindowBuilder, final DsMetaDataWindowBuilder dsMetaDataWindowBuilder) {
final DsMetaDataWindowBuilder dsMetaDataWindowBuilder) { super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus(),
super(i18n, permChecker, eventBus, uiNotification); uiDependencies.getUiNotification());
this.dsWindowBuilder = dsWindowBuilder; this.dsWindowBuilder = dsWindowBuilder;
this.dsMetaDataWindowBuilder = dsMetaDataWindowBuilder; this.dsMetaDataWindowBuilder = dsMetaDataWindowBuilder;

View File

@@ -6,9 +6,9 @@
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
*/ */
package org.eclipse.hawkbit.ui.distributions.dstable; package org.eclipse.hawkbit.ui.common.distributionset;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
@@ -17,8 +17,6 @@ import org.eclipse.hawkbit.ui.common.grid.header.AbstractEntityGridHeader;
import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState; import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState;
import org.eclipse.hawkbit.ui.common.state.HidableLayoutUiState; import org.eclipse.hawkbit.ui.common.state.HidableLayoutUiState;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Distribution table header. * Distribution table header.
@@ -32,27 +30,22 @@ public class DistributionSetGridHeader extends AbstractEntityGridHeader {
/** /**
* Constructor for DistributionSetGridHeader * Constructor for DistributionSetGridHeader
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param permChecker
* SpPermissionChecker
* @param eventBus
* UIEventBus
* @param dSTypeFilterLayoutUiState * @param dSTypeFilterLayoutUiState
* HidableLayoutUiState * HidableLayoutUiState
* @param distributionSetGridLayoutUiState * @param distributionSetGridLayoutUiState
* GridLayoutUiState * GridLayoutUiState
* @param filterLayout * @param filterLayout
* EventLayout * EventLayout
* @param view * @param view
* EventView * EventView
*/ */
public DistributionSetGridHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, public DistributionSetGridHeader(final CommonUiDependencies uiDependencies,
final UIEventBus eventBus, final HidableLayoutUiState dSTypeFilterLayoutUiState, final HidableLayoutUiState dSTypeFilterLayoutUiState,
final GridLayoutUiState distributionSetGridLayoutUiState, final EventLayout filterLayout, final GridLayoutUiState distributionSetGridLayoutUiState, final EventLayout filterLayout,
final EventView view) { final EventView view) {
super(i18n, permChecker, eventBus, dSTypeFilterLayoutUiState, distributionSetGridLayoutUiState, filterLayout, super(uiDependencies, dSTypeFilterLayoutUiState, distributionSetGridLayoutUiState, filterLayout, view);
view);
} }
@Override @Override

View File

@@ -6,16 +6,13 @@
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
*/ */
package org.eclipse.hawkbit.ui.distributions.dstable; package org.eclipse.hawkbit.ui.common.distributionset;
import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData;
import org.eclipse.hawkbit.ui.common.detailslayout.AbstractMetaDataWindowBuilder; import org.eclipse.hawkbit.ui.common.detailslayout.AbstractMetaDataWindowBuilder;
import org.eclipse.hawkbit.ui.utils.UINotification; import org.eclipse.hawkbit.ui.distributions.dstable.DsMetaDataWindowLayout;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -23,38 +20,19 @@ import com.vaadin.ui.Window;
* Builder for DistributionSet meta data window * Builder for DistributionSet meta data window
*/ */
public class DsMetaDataWindowBuilder extends AbstractMetaDataWindowBuilder<Long> { public class DsMetaDataWindowBuilder extends AbstractMetaDataWindowBuilder<Long> {
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final SpPermissionChecker permChecker;
private final DistributionSetManagement dsManagement; private final DistributionSetManagement dsManagement;
/** /**
* Constructor for DsMetaDataWindowBuilder * Constructor for DsMetaDataWindowBuilder
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param permChecker
* SpPermissionChecker
* @param dsManagement * @param dsManagement
* DistributionSetManagement * DistributionSetManagement
*/ */
public DsMetaDataWindowBuilder(final VaadinMessageSource i18n, final EntityFactory entityFactory, public DsMetaDataWindowBuilder(final CommonUiDependencies uiDependencies, final DistributionSetManagement dsManagement) {
final UIEventBus eventBus, final UINotification uiNotification, final SpPermissionChecker permChecker, super(uiDependencies);
final DistributionSetManagement dsManagement) {
super(i18n);
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.permChecker = permChecker;
this.dsManagement = dsManagement; this.dsManagement = dsManagement;
} }
@@ -86,8 +64,6 @@ public class DsMetaDataWindowBuilder extends AbstractMetaDataWindowBuilder<Long>
* @return Dialog window * @return Dialog window
*/ */
public Window getWindowForShowDsMetaData(final Long dsId, final String name, final ProxyMetaData proxyMetaData) { public Window getWindowForShowDsMetaData(final Long dsId, final String name, final ProxyMetaData proxyMetaData) {
return getWindowForShowMetaData( return getWindowForShowMetaData(new DsMetaDataWindowLayout(uiDependencies, dsManagement), dsId, name, proxyMetaData);
new DsMetaDataWindowLayout(i18n, eventBus, permChecker, uiNotification, entityFactory, dsManagement),
dsId, name, proxyMetaData);
} }
} }

View File

@@ -6,21 +6,21 @@
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
*/ */
package org.eclipse.hawkbit.ui.distributions.dstable; package org.eclipse.hawkbit.ui.common.distributionset;
import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.DistributionSetTypeManagement; import org.eclipse.hawkbit.repository.DistributionSetTypeManagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SystemManagement; import org.eclipse.hawkbit.repository.SystemManagement;
import org.eclipse.hawkbit.repository.TenantConfigurationManagement; import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.security.SystemSecurityContext;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder; import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.distributions.dstable.AddDsWindowController;
import org.eclipse.hawkbit.ui.distributions.dstable.DsWindowLayout;
import org.eclipse.hawkbit.ui.distributions.dstable.UpdateDsWindowController;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -28,9 +28,6 @@ import com.vaadin.ui.Window;
* Builder for distribution set window * Builder for distribution set window
*/ */
public class DsWindowBuilder extends AbstractEntityWindowBuilder<ProxyDistributionSet> { public class DsWindowBuilder extends AbstractEntityWindowBuilder<ProxyDistributionSet> {
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final SystemManagement systemManagement; private final SystemManagement systemManagement;
private final SystemSecurityContext systemSecurityContext; private final SystemSecurityContext systemSecurityContext;
private final TenantConfigurationManagement tenantConfigurationManagement; private final TenantConfigurationManagement tenantConfigurationManagement;
@@ -43,38 +40,28 @@ public class DsWindowBuilder extends AbstractEntityWindowBuilder<ProxyDistributi
/** /**
* Constructor for DsWindowBuilder * Constructor for DsWindowBuilder
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param systemManagement * @param systemManagement
* SystemManagement * SystemManagement
* @param systemSecurityContext * @param systemSecurityContext
* SystemSecurityContext * SystemSecurityContext
* @param tenantConfigurationManagement * @param tenantConfigurationManagement
* TenantConfigurationManagement * TenantConfigurationManagement
* @param dsManagement * @param dsManagement
* DistributionSetManagement * DistributionSetManagement
* @param dsTypeManagement * @param dsTypeManagement
* DistributionSetTypeManagement * DistributionSetTypeManagement
* @param view * @param view
* EventView * EventView
*/ */
public DsWindowBuilder(final VaadinMessageSource i18n, final EntityFactory entityFactory, final UIEventBus eventBus, public DsWindowBuilder(final CommonUiDependencies uiDependencies, final SystemManagement systemManagement,
final UINotification uiNotification, final SystemManagement systemManagement,
final SystemSecurityContext systemSecurityContext, final SystemSecurityContext systemSecurityContext,
final TenantConfigurationManagement tenantConfigurationManagement, final TenantConfigurationManagement tenantConfigurationManagement,
final DistributionSetManagement dsManagement, final DistributionSetTypeManagement dsTypeManagement, final DistributionSetManagement dsManagement, final DistributionSetTypeManagement dsTypeManagement,
final EventView view) { final EventView view) {
super(i18n); super(uiDependencies);
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.systemManagement = systemManagement; this.systemManagement = systemManagement;
this.systemSecurityContext = systemSecurityContext; this.systemSecurityContext = systemSecurityContext;
this.tenantConfigurationManagement = tenantConfigurationManagement; this.tenantConfigurationManagement = tenantConfigurationManagement;
@@ -92,17 +79,16 @@ public class DsWindowBuilder extends AbstractEntityWindowBuilder<ProxyDistributi
@Override @Override
public Window getWindowForAdd() { public Window getWindowForAdd() {
return getWindowForNewEntity(new AddDsWindowController(i18n, entityFactory, eventBus, uiNotification, return getWindowForNewEntity(new AddDsWindowController(uiDependencies, systemManagement, dsManagement,
systemManagement, dsManagement, new DsWindowLayout(uiDependencies.getI18n(), systemSecurityContext, tenantConfigurationManagement,
new DsWindowLayout(i18n, systemSecurityContext, tenantConfigurationManagement, dsTypeManagement), dsTypeManagement),
view)); view));
} }
@Override @Override
public Window getWindowForUpdate(final ProxyDistributionSet proxyDs) { public Window getWindowForUpdate(final ProxyDistributionSet proxyDs) {
return getWindowForEntity(proxyDs, new UpdateDsWindowController(i18n, entityFactory, eventBus, uiNotification, return getWindowForEntity(proxyDs, new UpdateDsWindowController(uiDependencies, dsManagement,
dsManagement, new DsWindowLayout(getI18n(), systemSecurityContext, tenantConfigurationManagement, dsTypeManagement)));
new DsWindowLayout(i18n, systemSecurityContext, tenantConfigurationManagement, dsTypeManagement)));
} }
} }

View File

@@ -13,7 +13,7 @@ import java.util.Collections;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
@@ -30,9 +30,7 @@ import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification; import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Button; import com.vaadin.ui.Button;
import com.vaadin.ui.UI; import com.vaadin.ui.UI;
@@ -46,31 +44,24 @@ public abstract class AbstractTagFilterButtons extends AbstractFilterButtons<Pro
private final TagFilterLayoutUiState tagFilterLayoutUiState; private final TagFilterLayoutUiState tagFilterLayoutUiState;
private final UINotification uiNotification; protected final UINotification uiNotification;
private final Button noTagButton; private final Button noTagButton;
private final transient TagFilterButtonClick tagFilterButtonClick; private final transient TagFilterButtonClick tagFilterButtonClick;
/** /**
* Constructor for AbstractTagFilterButtons * Constructor for AbstractTagFilterButtons
* *
* @param eventBus * @param uiDependencies
* UIEventBus * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param uiNotification
* UINotification
* @param permChecker
* SpPermissionChecker
* @param tagFilterLayoutUiState * @param tagFilterLayoutUiState
* TagFilterLayoutUiState * TagFilterLayoutUiState
*/ */
public AbstractTagFilterButtons(final UIEventBus eventBus, final VaadinMessageSource i18n, public AbstractTagFilterButtons(final CommonUiDependencies uiDependencies,
final UINotification uiNotification, final SpPermissionChecker permChecker,
final TagFilterLayoutUiState tagFilterLayoutUiState) { final TagFilterLayoutUiState tagFilterLayoutUiState) {
super(eventBus, i18n, uiNotification, permChecker); super(uiDependencies.getEventBus(), uiDependencies.getI18n(), uiDependencies.getUiNotification(), uiDependencies.getPermChecker());
this.uiNotification = uiDependencies.getUiNotification();
this.tagFilterLayoutUiState = tagFilterLayoutUiState; this.tagFilterLayoutUiState = tagFilterLayoutUiState;
this.uiNotification = uiNotification;
this.noTagButton = buildNoTagButton(); this.noTagButton = buildNoTagButton();
this.tagFilterButtonClick = new TagFilterButtonClick(this::onFilterChangedEvent, this::onNoTagChangedEvent); this.tagFilterButtonClick = new TagFilterButtonClick(this::onFilterChangedEvent, this::onNoTagChangedEvent);
} }

View File

@@ -10,7 +10,7 @@ package org.eclipse.hawkbit.ui.common.filterlayout;
import java.util.Collection; import java.util.Collection;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
@@ -22,8 +22,6 @@ import org.eclipse.hawkbit.ui.common.event.FilterType;
import org.eclipse.hawkbit.ui.common.filterlayout.AbstractFilterButtonClickBehaviour.ClickBehaviourType; import org.eclipse.hawkbit.ui.common.filterlayout.AbstractFilterButtonClickBehaviour.ClickBehaviourType;
import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState; import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState;
import org.eclipse.hawkbit.ui.utils.UINotification; import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.UI; import com.vaadin.ui.UI;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -42,23 +40,16 @@ public abstract class AbstractTypeFilterButtons extends AbstractFilterButtons<Pr
/** /**
* Constructor for AbstractTypeFilterButtons * Constructor for AbstractTypeFilterButtons
* *
* @param eventBus * @param uiDependencies
* UIEventBus * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param uiNotification
* UINotification
* @param permChecker
* SpPermissionChecker
* @param typeFilterLayoutUiState * @param typeFilterLayoutUiState
* TypeFilterLayoutUiState * TypeFilterLayoutUiState
*/ */
public AbstractTypeFilterButtons(final UIEventBus eventBus, final VaadinMessageSource i18n, public AbstractTypeFilterButtons(final CommonUiDependencies uiDependencies,
final UINotification uiNotification, final SpPermissionChecker permChecker,
final TypeFilterLayoutUiState typeFilterLayoutUiState) { final TypeFilterLayoutUiState typeFilterLayoutUiState) {
super(eventBus, i18n, uiNotification, permChecker); super(uiDependencies.getEventBus(), uiDependencies.getI18n(), uiDependencies.getUiNotification(), uiDependencies.getPermChecker());
this.uiNotification = uiNotification; this.uiNotification = uiDependencies.getUiNotification();
this.typeFilterLayoutUiState = typeFilterLayoutUiState; this.typeFilterLayoutUiState = typeFilterLayoutUiState;
this.typeFilterButtonClick = new TypeFilterButtonClick(this::onFilterChanged); this.typeFilterButtonClick = new TypeFilterButtonClick(this::onFilterChanged);
} }

View File

@@ -10,8 +10,8 @@ package org.eclipse.hawkbit.ui.common.grid.header;
import java.util.Arrays; import java.util.Arrays;
import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder; import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.event.CommandTopics; import org.eclipse.hawkbit.ui.common.event.CommandTopics;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
@@ -30,8 +30,6 @@ import org.eclipse.hawkbit.ui.common.grid.header.support.SearchHeaderSupport;
import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState; import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState;
import org.eclipse.hawkbit.ui.common.state.HidableLayoutUiState; import org.eclipse.hawkbit.ui.common.state.HidableLayoutUiState;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Component; import com.vaadin.ui.Component;
import com.vaadin.ui.UI; import com.vaadin.ui.UI;
@@ -59,12 +57,8 @@ public abstract class AbstractEntityGridHeader extends AbstractGridHeader {
/** /**
* Constructor for AbstractEntityGridHeader * Constructor for AbstractEntityGridHeader
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param permChecker
* SpPermissionChecker
* @param eventBus
* UIEventBus
* @param filterLayoutUiState * @param filterLayoutUiState
* HidableLayoutUiState * HidableLayoutUiState
* @param gridLayoutUiState * @param gridLayoutUiState
@@ -74,10 +68,9 @@ public abstract class AbstractEntityGridHeader extends AbstractGridHeader {
* @param view * @param view
* EventView * EventView
*/ */
public AbstractEntityGridHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, public AbstractEntityGridHeader(final CommonUiDependencies uiDependencies, final HidableLayoutUiState filterLayoutUiState,
final UIEventBus eventBus, final HidableLayoutUiState filterLayoutUiState,
final GridLayoutUiState gridLayoutUiState, final EventLayout filterLayout, final EventView view) { final GridLayoutUiState gridLayoutUiState, final EventLayout filterLayout, final EventView view) {
super(i18n, permChecker, eventBus); super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus());
this.filterLayoutUiState = filterLayoutUiState; this.filterLayoutUiState = filterLayoutUiState;
this.gridLayoutUiState = gridLayoutUiState; this.gridLayoutUiState = gridLayoutUiState;

View File

@@ -18,14 +18,13 @@ import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.model.AbstractAssignmentResult; import org.eclipse.hawkbit.repository.model.AbstractAssignmentResult;
import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus; import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
@@ -42,25 +41,18 @@ public class DistributionSetsToTagAssignmentSupport
/** /**
* Constructor for DistributionSetsToTagAssignmentSupport * Constructor for DistributionSetsToTagAssignmentSupport
* *
* @param notification * @param uiDependencies
* UINotification * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param distributionSetManagement * @param distributionSetManagement
* DistributionSetManagement * DistributionSetManagement
* @param eventBus
* UIEventBus
* @param permChecker
* SpPermissionChecker
*/ */
public DistributionSetsToTagAssignmentSupport(final UINotification notification, final VaadinMessageSource i18n, public DistributionSetsToTagAssignmentSupport(final CommonUiDependencies uiDependencies,
final DistributionSetManagement distributionSetManagement, final UIEventBus eventBus, final DistributionSetManagement distributionSetManagement) {
final SpPermissionChecker permChecker) { super(uiDependencies.getUiNotification(), uiDependencies.getI18n());
super(notification, i18n);
this.distributionSetManagement = distributionSetManagement; this.distributionSetManagement = distributionSetManagement;
this.eventBus = eventBus; this.eventBus = uiDependencies.getEventBus();
this.permChecker = permChecker; this.permChecker = uiDependencies.getPermChecker();
} }
@Override @Override

View File

@@ -17,13 +17,12 @@ import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.security.SystemSecurityContext;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationProperties.TenantConfigurationKey; import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationProperties.TenantConfigurationKey;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.ConfirmationDialog; import org.eclipse.hawkbit.ui.common.ConfirmationDialog;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget;
import org.eclipse.hawkbit.ui.management.miscs.DeploymentAssignmentWindowController; import org.eclipse.hawkbit.ui.management.miscs.DeploymentAssignmentWindowController;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
/** /**
* Support for assigning the distribution sets to target. * Support for assigning the distribution sets to target.
@@ -40,10 +39,8 @@ public class DistributionSetsToTargetAssignmentSupport
/** /**
* Constructor for DistributionSetsToTargetAssignmentSupport * Constructor for DistributionSetsToTargetAssignmentSupport
* *
* @param notification * @param uiDependencies
* UINotification * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param systemSecurityContext * @param systemSecurityContext
* SystemSecurityContext * SystemSecurityContext
* @param configManagement * @param configManagement
@@ -53,14 +50,14 @@ public class DistributionSetsToTargetAssignmentSupport
* @param assignmentController * @param assignmentController
* DeploymentAssignmentWindowController * DeploymentAssignmentWindowController
*/ */
public DistributionSetsToTargetAssignmentSupport(final UINotification notification, final VaadinMessageSource i18n, public DistributionSetsToTargetAssignmentSupport(final CommonUiDependencies uiDependencies,
final SystemSecurityContext systemSecurityContext, final TenantConfigurationManagement configManagement, final SystemSecurityContext systemSecurityContext, final TenantConfigurationManagement configManagement,
final SpPermissionChecker permChecker, final DeploymentAssignmentWindowController assignmentController) { final DeploymentAssignmentWindowController assignmentController) {
super(notification, i18n); super(uiDependencies.getUiNotification(), uiDependencies.getI18n());
this.systemSecurityContext = systemSecurityContext; this.systemSecurityContext = systemSecurityContext;
this.configManagement = configManagement; this.configManagement = configManagement;
this.permChecker = permChecker; this.permChecker = uiDependencies.getPermChecker();
this.assignmentController = assignmentController; this.assignmentController = assignmentController;
} }

View File

@@ -15,14 +15,11 @@ import org.eclipse.hawkbit.im.authentication.SpPermission;
import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.model.AbstractAssignmentResult; import org.eclipse.hawkbit.repository.model.AbstractAssignmentResult;
import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Support for assigning the distribution set tags to distribution set. * Support for assigning the distribution set tags to distribution set.
@@ -31,36 +28,27 @@ import org.vaadin.spring.events.EventBus.UIEventBus;
public class DsTagsToDistributionSetAssignmentSupport public class DsTagsToDistributionSetAssignmentSupport
extends TagsAssignmentSupport<ProxyDistributionSet, DistributionSet> { extends TagsAssignmentSupport<ProxyDistributionSet, DistributionSet> {
private final DistributionSetManagement distributionSetManagement; private final DistributionSetManagement distributionSetManagement;
private final UIEventBus eventBus; private final CommonUiDependencies uiDependencies;
private final SpPermissionChecker permChecker;
/** /**
* Constructor for DsTagsToDistributionSetAssignmentSupport * Constructor for DsTagsToDistributionSetAssignmentSupport
* *
* @param notification * @param uiDependencies
* UINotification * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param distributionSetManagement * @param distributionSetManagement
* DistributionSetManagement * DistributionSetManagement
* @param eventBus
* UIEventBus
* @param permChecker
* SpPermissionChecker
*/ */
public DsTagsToDistributionSetAssignmentSupport(final UINotification notification, final VaadinMessageSource i18n, public DsTagsToDistributionSetAssignmentSupport(final CommonUiDependencies uiDependencies,
final DistributionSetManagement distributionSetManagement, final UIEventBus eventBus, final DistributionSetManagement distributionSetManagement) {
final SpPermissionChecker permChecker) { super(uiDependencies);
super(notification, i18n); this.uiDependencies = uiDependencies;
this.distributionSetManagement = distributionSetManagement; this.distributionSetManagement = distributionSetManagement;
this.eventBus = eventBus;
this.permChecker = permChecker;
} }
@Override @Override
public List<String> getMissingPermissionsForDrop() { public List<String> getMissingPermissionsForDrop() {
return permChecker.hasUpdateRepositoryPermission() ? Collections.emptyList() return uiDependencies.getPermChecker().hasUpdateRepositoryPermission() ? Collections.emptyList()
: Collections.singletonList(SpPermission.UPDATE_REPOSITORY); : Collections.singletonList(SpPermission.UPDATE_REPOSITORY);
} }
@@ -77,7 +65,7 @@ public class DsTagsToDistributionSetAssignmentSupport
@Override @Override
protected void publishTagAssignmentEvent(final ProxyDistributionSet targetItem) { protected void publishTagAssignmentEvent(final ProxyDistributionSet targetItem) {
eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( uiDependencies.getEventBus().publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload(
EntityModifiedEventType.ENTITY_UPDATED, ProxyDistributionSet.class, targetItem.getId())); EntityModifiedEventType.ENTITY_UPDATED, ProxyDistributionSet.class, targetItem.getId()));
} }

View File

@@ -12,9 +12,8 @@ import java.util.List;
import org.eclipse.hawkbit.repository.model.AbstractAssignmentResult; import org.eclipse.hawkbit.repository.model.AbstractAssignmentResult;
import org.eclipse.hawkbit.repository.model.NamedEntity; import org.eclipse.hawkbit.repository.model.NamedEntity;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
/** /**
* Support for assigning the {@link ProxyTag} items to target item (target or * Support for assigning the {@link ProxyTag} items to target item (target or
@@ -27,8 +26,8 @@ import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
*/ */
public abstract class TagsAssignmentSupport<T, R extends NamedEntity> extends AssignmentSupport<ProxyTag, T> { public abstract class TagsAssignmentSupport<T, R extends NamedEntity> extends AssignmentSupport<ProxyTag, T> {
protected TagsAssignmentSupport(final UINotification notification, final VaadinMessageSource i18n) { protected TagsAssignmentSupport(final CommonUiDependencies uiDependencies) {
super(notification, i18n); super(uiDependencies.getUiNotification(), uiDependencies.getI18n());
} }
@Override @Override

View File

@@ -13,12 +13,11 @@ import java.util.stream.Collectors;
import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetManagement;
import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
/** /**
* Support for assigning target tags to distribution set. * Support for assigning target tags to distribution set.
@@ -31,19 +30,17 @@ public class TargetTagsToDistributionSetAssignmentSupport extends AssignmentSupp
/** /**
* Constructor for TargetTagsToDistributionSetAssignmentSupport * Constructor for TargetTagsToDistributionSetAssignmentSupport
* *
* @param notification * @param uiDependencies
* UINotification * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param targetManagement * @param targetManagement
* TargetManagement * TargetManagement
* @param targetsToDistributionSetAssignmentSupport * @param targetsToDistributionSetAssignmentSupport
* TargetsToDistributionSetAssignmentSupport * TargetsToDistributionSetAssignmentSupport
*/ */
public TargetTagsToDistributionSetAssignmentSupport(final UINotification notification, public TargetTagsToDistributionSetAssignmentSupport(final CommonUiDependencies uiDependencies,
final VaadinMessageSource i18n, final TargetManagement targetManagement, final TargetManagement targetManagement,
final TargetsToDistributionSetAssignmentSupport targetsToDistributionSetAssignmentSupport) { final TargetsToDistributionSetAssignmentSupport targetsToDistributionSetAssignmentSupport) {
super(notification, i18n); super(uiDependencies.getUiNotification(), uiDependencies.getI18n());
this.targetManagement = targetManagement; this.targetManagement = targetManagement;
this.targetsToDistributionSetAssignmentSupport = targetsToDistributionSetAssignmentSupport; this.targetsToDistributionSetAssignmentSupport = targetsToDistributionSetAssignmentSupport;

View File

@@ -15,14 +15,11 @@ import org.eclipse.hawkbit.im.authentication.SpPermission;
import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetManagement;
import org.eclipse.hawkbit.repository.model.AbstractAssignmentResult; import org.eclipse.hawkbit.repository.model.AbstractAssignmentResult;
import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Support for assigning target tags to target. * Support for assigning target tags to target.
@@ -30,35 +27,27 @@ import org.vaadin.spring.events.EventBus.UIEventBus;
*/ */
public class TargetTagsToTargetAssignmentSupport extends TagsAssignmentSupport<ProxyTarget, Target> { public class TargetTagsToTargetAssignmentSupport extends TagsAssignmentSupport<ProxyTarget, Target> {
private final TargetManagement targetManagement; private final TargetManagement targetManagement;
private final UIEventBus eventBus; private final CommonUiDependencies uiDependencies;
private final SpPermissionChecker permChecker;
/** /**
* Constructor for TargetTagsToTargetAssignmentSupport * Constructor for TargetTagsToTargetAssignmentSupport
* *
* @param notification * @param uiDependencies
* UINotification * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param targetManagement * @param targetManagement
* TargetManagement * TargetManagement
* @param eventBus
* UIEventBus
* @param permChecker
* SpPermissionChecker
*/ */
public TargetTagsToTargetAssignmentSupport(final UINotification notification, final VaadinMessageSource i18n, public TargetTagsToTargetAssignmentSupport(final CommonUiDependencies uiDependencies,
final TargetManagement targetManagement, final UIEventBus eventBus, final SpPermissionChecker permChecker) { final TargetManagement targetManagement) {
super(notification, i18n); super(uiDependencies);
this.uiDependencies = uiDependencies;
this.targetManagement = targetManagement; this.targetManagement = targetManagement;
this.eventBus = eventBus;
this.permChecker = permChecker;
} }
@Override @Override
public List<String> getMissingPermissionsForDrop() { public List<String> getMissingPermissionsForDrop() {
return permChecker.hasUpdateTargetPermission() ? Collections.emptyList() return uiDependencies.getPermChecker().hasUpdateTargetPermission() ? Collections.emptyList()
: Collections.singletonList(SpPermission.UPDATE_TARGET); : Collections.singletonList(SpPermission.UPDATE_TARGET);
} }
@@ -74,7 +63,7 @@ public class TargetTagsToTargetAssignmentSupport extends TagsAssignmentSupport<P
@Override @Override
protected void publishTagAssignmentEvent(final ProxyTarget targetItem) { protected void publishTagAssignmentEvent(final ProxyTarget targetItem) {
eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( uiDependencies.getEventBus().publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload(
EntityModifiedEventType.ENTITY_UPDATED, ProxyTarget.class, targetItem.getId())); EntityModifiedEventType.ENTITY_UPDATED, ProxyTarget.class, targetItem.getId()));
} }
} }

View File

@@ -15,12 +15,11 @@ import java.util.stream.Collectors;
import org.eclipse.hawkbit.im.authentication.SpPermission; import org.eclipse.hawkbit.im.authentication.SpPermission;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.common.ConfirmationDialog; import org.eclipse.hawkbit.ui.common.ConfirmationDialog;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget;
import org.eclipse.hawkbit.ui.management.miscs.DeploymentAssignmentWindowController; import org.eclipse.hawkbit.ui.management.miscs.DeploymentAssignmentWindowController;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
/** /**
* Support for assigning targets to distribution set. * Support for assigning targets to distribution set.
@@ -35,20 +34,16 @@ public class TargetsToDistributionSetAssignmentSupport
/** /**
* Constructor for TargetsToDistributionSetAssignmentSupport * Constructor for TargetsToDistributionSetAssignmentSupport
* *
* @param notification * @param uiDependencies
* UINotification * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param permChecker
* SpPermissionChecker
* @param assignmentController * @param assignmentController
* DeploymentAssignmentWindowController * DeploymentAssignmentWindowController
*/ */
public TargetsToDistributionSetAssignmentSupport(final UINotification notification, final VaadinMessageSource i18n, public TargetsToDistributionSetAssignmentSupport(final CommonUiDependencies uiDependencies,
final SpPermissionChecker permChecker, final DeploymentAssignmentWindowController assignmentController) { final DeploymentAssignmentWindowController assignmentController) {
super(notification, i18n); super(uiDependencies.getUiNotification(), uiDependencies.getI18n());
this.permChecker = permChecker; this.permChecker = uiDependencies.getPermChecker();
this.assignmentController = assignmentController; this.assignmentController = assignmentController;
} }

View File

@@ -18,14 +18,13 @@ import org.eclipse.hawkbit.repository.TargetManagement;
import org.eclipse.hawkbit.repository.model.AbstractAssignmentResult; import org.eclipse.hawkbit.repository.model.AbstractAssignmentResult;
import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus; import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
@@ -40,23 +39,16 @@ public class TargetsToTagAssignmentSupport extends ToTagAssignmentSupport<ProxyT
/** /**
* Constructor for TargetsToTagAssignmentSupport * Constructor for TargetsToTagAssignmentSupport
* *
* @param notification * @param uiDependencies
* UINotification * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param eventBus
* UIEventBus
* @param permChecker
* SpPermissionChecker
* @param targetManagement * @param targetManagement
* TargetManagement * TargetManagement
*/ */
public TargetsToTagAssignmentSupport(final UINotification notification, final VaadinMessageSource i18n, public TargetsToTagAssignmentSupport(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement) {
final UIEventBus eventBus, final SpPermissionChecker permChecker, final TargetManagement targetManagement) { super(uiDependencies.getUiNotification(), uiDependencies.getI18n());
super(notification, i18n);
this.eventBus = eventBus; this.eventBus = uiDependencies.getEventBus();
this.permChecker = permChecker; this.permChecker = uiDependencies.getPermChecker();
this.targetManagement = targetManagement; this.targetManagement = targetManagement;
} }

View File

@@ -0,0 +1,139 @@
/**
* Copyright (c) 2020 Bosch.IO 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.softwaremodule;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.hawkbit.repository.SoftwareModuleManagement;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.ui.artifacts.smtable.SmMetaDataWindowBuilder;
import org.eclipse.hawkbit.ui.artifacts.smtable.SmWindowBuilder;
import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleGrid;
import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleGridHeader;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.layout.AbstractGridComponentLayout;
import org.eclipse.hawkbit.ui.common.layout.listener.TopicEventListener;
/**
* Abstract base class for software modules in grid layouts.
*/
public abstract class AbstractSoftwareModuleGridLayout extends AbstractGridComponentLayout {
private static final long serialVersionUID = 1L;
private final transient Set<TopicEventListener> listeners = new HashSet<>();
private final transient SmWindowBuilder smWindowBuilder;
private final transient SmMetaDataWindowBuilder smMetaDataWindowBuilder;
private final EventView eventView;
/**
* Constructor for AbstractSoftwareModuleGridLayout.
*
* @param uiDependencies
* {@link CommonUiDependencies}
* @param softwareModuleManagement
* SoftwareModuleManagement
* @param softwareModuleTypeManagement
* SoftwareModuleTypeManagement
* @param eventView
* EventView
*/
public AbstractSoftwareModuleGridLayout(final CommonUiDependencies uiDependencies,
final SoftwareModuleManagement softwareModuleManagement,
final SoftwareModuleTypeManagement softwareModuleTypeManagement, final EventView eventView) {
this.eventView = eventView;
smWindowBuilder = new SmWindowBuilder(uiDependencies, softwareModuleManagement, softwareModuleTypeManagement,
eventView);
smMetaDataWindowBuilder = new SmMetaDataWindowBuilder(uiDependencies, softwareModuleManagement);
}
protected abstract SoftwareModuleGridHeader getSoftwareModuleGridHeader();
protected abstract SoftwareModuleGrid getSoftwareModuleGrid();
/**
* Return SmMetaDataWindowBuilder
*
* @return the smMetaDataWindowBuilder
*/
public SmMetaDataWindowBuilder getSmMetaDataWindowBuilder() {
return smMetaDataWindowBuilder;
}
/**
* Return SmWindowBuilder.
*
* @return the smWindowBuilder
*/
public SmWindowBuilder getSmWindowBuilder() {
return smWindowBuilder;
}
/**
* Return EventView.
*
* @return the eventView
*/
public EventView getEventView() {
return eventView;
}
/**
* Show software module grid header
*/
public void showSmTypeHeaderIcon() {
getSoftwareModuleGridHeader().showFilterIcon();
}
/**
* Hide software module grid header
*/
public void hideSmTypeHeaderIcon() {
getSoftwareModuleGridHeader().hideFilterIcon();
}
/**
* Maximize the software module grid
*/
public void maximize() {
getSoftwareModuleGrid().createMaximizedContent();
hideDetailsLayout();
}
/**
* Minimize the software module grid
*/
public void minimize() {
getSoftwareModuleGrid().createMinimizedContent();
showDetailsLayout();
}
/**
* Is called when view is shown to the user
*/
public void restoreState() {
getSoftwareModuleGridHeader().restoreState();
getSoftwareModuleGrid().restoreState();
}
protected void addEventListener(final TopicEventListener listener) {
listeners.add(listener);
}
/**
* Unsubscribe the event listeners.
*/
public void unsubscribeListener() {
listeners.forEach(TopicEventListener::unsubscribe);
}
}

View File

@@ -0,0 +1,57 @@
/**
* Copyright (c) 2020 Bosch.IO 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.tag;
import java.util.function.BooleanSupplier;
import org.eclipse.hawkbit.ui.common.EntityValidator;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag;
import org.springframework.util.StringUtils;
/**
* Validator used in *Tag window controllers to validate {@link ProxyTag}.
*/
public class ProxyTagValidator extends EntityValidator {
/**
* Constructor
*
* @param uiDependencies
* {@link CommonUiDependencies}
*/
public ProxyTagValidator(final CommonUiDependencies uiDependencies) {
super(uiDependencies);
}
/**
* Checks if the entity is valid
*
* @param entity
* {@link ProxyTag}
* @param duplicateCheck
* <code>true</code> if the entity already exists in the
* repository
* @return <code>true</code> if the entity is valid
*/
public boolean isEntityValid(final ProxyTag entity, final BooleanSupplier duplicateCheck) {
if (!StringUtils.hasText(entity.getName())) {
displayValidationError("message.error.missing.tagname");
return false;
}
if (duplicateCheck.getAsBoolean()) {
final String trimmedName = StringUtils.trimWhitespace(entity.getName());
displayValidationError("message.tag.duplicate.check", trimmedName);
return false;
}
return true;
}
}

View File

@@ -16,6 +16,7 @@ import java.util.stream.Collectors;
import org.eclipse.hawkbit.repository.Identifiable; import org.eclipse.hawkbit.repository.Identifiable;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyNamedEntity; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyNamedEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag;
import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent; import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent;
@@ -42,12 +43,11 @@ public abstract class AbstractTagToken<T extends ProxyNamedEntity>
private T masterEntity; private T masterEntity;
protected AbstractTagToken(final SpPermissionChecker checker, final VaadinMessageSource i18n, protected AbstractTagToken(final CommonUiDependencies uiDependencies) {
final UINotification uiNotification, final UIEventBus eventBus) { this.checker = uiDependencies.getPermChecker();
this.checker = checker; this.i18n = uiDependencies.getI18n();
this.i18n = i18n; this.uiNotification = uiDependencies.getUiNotification();
this.uiNotification = uiNotification; this.eventBus = uiDependencies.getEventBus();
this.eventBus = eventBus;
buildTagPanel(); buildTagPanel();
tagPanelLayout.setVisible(false); tagPanelLayout.setVisible(false);

View File

@@ -17,7 +17,7 @@ import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.DistributionSetTagManagement; import org.eclipse.hawkbit.repository.DistributionSetTagManagement;
import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.DistributionSetTag; import org.eclipse.hawkbit.repository.model.DistributionSetTag;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.mappers.TagToProxyTagMapper; import org.eclipse.hawkbit.ui.common.data.mappers.TagToProxyTagMapper;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag;
@@ -25,9 +25,6 @@ import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Implementation of target/ds tag token layout. * Implementation of target/ds tag token layout.
@@ -42,24 +39,17 @@ public class DistributionTagToken extends AbstractTagToken<ProxyDistributionSet>
/** /**
* Constructor for DistributionTagToken * Constructor for DistributionTagToken
* *
* @param checker * @param uiDependencies
* SpPermissionChecker * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param uinotification
* UINotification
* @param eventBus
* UIEventBus
* @param distributionSetTagManagement * @param distributionSetTagManagement
* DistributionSetTagManagement * DistributionSetTagManagement
* @param distributionSetManagement * @param distributionSetManagement
* DistributionSetManagement * DistributionSetManagement
*/ */
public DistributionTagToken(final SpPermissionChecker checker, final VaadinMessageSource i18n, public DistributionTagToken(final CommonUiDependencies uiDependencies,
final UINotification uinotification, final UIEventBus eventBus,
final DistributionSetTagManagement distributionSetTagManagement, final DistributionSetTagManagement distributionSetTagManagement,
final DistributionSetManagement distributionSetManagement) { final DistributionSetManagement distributionSetManagement) {
super(checker, i18n, uinotification, eventBus); super(uiDependencies);
this.distributionSetTagManagement = distributionSetTagManagement; this.distributionSetTagManagement = distributionSetTagManagement;
this.distributionSetManagement = distributionSetManagement; this.distributionSetManagement = distributionSetManagement;

View File

@@ -17,7 +17,7 @@ import org.eclipse.hawkbit.repository.TargetManagement;
import org.eclipse.hawkbit.repository.TargetTagManagement; import org.eclipse.hawkbit.repository.TargetTagManagement;
import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.repository.model.TargetTag; import org.eclipse.hawkbit.repository.model.TargetTag;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.mappers.TagToProxyTagMapper; import org.eclipse.hawkbit.ui.common.data.mappers.TagToProxyTagMapper;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget;
@@ -25,9 +25,6 @@ import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Implementation of Target tag token. * Implementation of Target tag token.
@@ -43,23 +40,16 @@ public class TargetTagToken extends AbstractTagToken<ProxyTarget> {
/** /**
* Constructor for TargetTagToken * Constructor for TargetTagToken
* *
* @param checker * @param uiDependencies
* SpPermissionChecker * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param uinotification
* UINotification
* @param eventBus
* UIEventBus
* @param targetTagManagement * @param targetTagManagement
* TargetTagManagement * TargetTagManagement
* @param targetManagement * @param targetManagement
* TargetManagement * TargetManagement
*/ */
public TargetTagToken(final SpPermissionChecker checker, final VaadinMessageSource i18n, public TargetTagToken(final CommonUiDependencies uiDependencies, final TargetTagManagement targetTagManagement,
final UINotification uinotification, final UIEventBus eventBus, final TargetManagement targetManagement) {
final TargetTagManagement targetTagManagement, final TargetManagement targetManagement) { super(uiDependencies);
super(checker, i18n, uinotification, eventBus);
this.targetTagManagement = targetTagManagement; this.targetTagManagement = targetTagManagement;
this.targetManagement = targetManagement; this.targetManagement = targetManagement;

View File

@@ -0,0 +1,112 @@
/**
* Copyright (c) 2020 Bosch.IO 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.type;
import java.util.function.BooleanSupplier;
import org.eclipse.hawkbit.ui.common.EntityValidator;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
/**
* Validator used in *Type window controllers to validate {@link ProxyType}.
*/
public class ProxyTypeValidator extends EntityValidator {
private static final String KEY_MISSING_NAME_OR_KEY = "message.error.missing.typenameorkeyorsmtype";
/**
* Constructor
*
* @param uiDependencies
* {@link CommonUiDependencies}
*/
public ProxyTypeValidator(final CommonUiDependencies uiDependencies) {
super(uiDependencies);
}
/**
* Checks if the entity is valid
*
* @param entity
* {@link ProxyTag}
* @param keyDuplicateCheck
* <code>true</code> if the entity key already exists in the
* repository
* @param nameDuplicateCheck
* <code>true</code> if the entity name already exists in the
* repository
* @return <code>true</code> if the entity is valid
*/
public boolean isDsTypeValid(final ProxyType entity, final BooleanSupplier keyDuplicateCheck,
final BooleanSupplier nameDuplicateCheck) {
return mandatoryDsAttributesPresent(entity) && nameDoesNotExistInRepo(entity, nameDuplicateCheck)
&& keyDoesNotExistInRepo(entity, keyDuplicateCheck, "message.type.key.ds.duplicate.check");
}
/**
* Checks if the entity is valid
*
* @param entity
* {@link ProxyTag}
* @param keyDuplicateCheck
* <code>true</code> if the entity key already exists in the
* repository
* @param nameDuplicateCheck
* <code>true</code> if the entity name already exists in the
* repository
* @return <code>true</code> if the entity is valid
*/
public boolean isSmTypeValid(final ProxyType entity, final BooleanSupplier keyDuplicateCheck,
final BooleanSupplier nameDuplicateCheck) {
return mandatorySmAttributesPresent(entity) && nameDoesNotExistInRepo(entity, nameDuplicateCheck)
&& keyDoesNotExistInRepo(entity, keyDuplicateCheck, "message.type.key.swmodule.duplicate.check");
}
private boolean mandatorySmAttributesPresent(final ProxyType entity) {
if (!StringUtils.hasText(entity.getName()) || !StringUtils.hasText(entity.getKey())
|| entity.getSmTypeAssign() == null) {
displayValidationError(KEY_MISSING_NAME_OR_KEY);
return false;
}
return true;
}
private boolean mandatoryDsAttributesPresent(final ProxyType entity) {
if (!StringUtils.hasText(entity.getName()) || !StringUtils.hasText(entity.getKey())
|| CollectionUtils.isEmpty(entity.getSelectedSmTypes())) {
displayValidationError(KEY_MISSING_NAME_OR_KEY);
return false;
}
return true;
}
private boolean keyDoesNotExistInRepo(final ProxyType entity, final BooleanSupplier keyExistsInRepository,
final String duplicateKeyMessageKey) {
if (keyExistsInRepository.getAsBoolean()) {
final String trimmedKey = StringUtils.trimWhitespace(entity.getKey());
displayValidationError(duplicateKeyMessageKey, trimmedKey);
return false;
}
return true;
}
private boolean nameDoesNotExistInRepo(final ProxyType entity, final BooleanSupplier nameExistsInRepository) {
if (nameExistsInRepository.getAsBoolean()) {
final String trimmedName = StringUtils.trimWhitespace(entity.getName());
displayValidationError("message.type.duplicate.check", trimmedName);
return false;
}
return true;
}
}

View File

@@ -28,6 +28,7 @@ import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.security.SystemSecurityContext;
import org.eclipse.hawkbit.ui.AbstractHawkbitUI; import org.eclipse.hawkbit.ui.AbstractHawkbitUI;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.event.EventViewAware; import org.eclipse.hawkbit.ui.common.event.EventViewAware;
@@ -93,21 +94,24 @@ public class DistributionsView extends VerticalLayout implements View, BrowserWi
this.permChecker = permChecker; this.permChecker = permChecker;
this.manageDistUIState = manageDistUIState; this.manageDistUIState = manageDistUIState;
final CommonUiDependencies uiDependencies = new CommonUiDependencies(i18n, entityFactory, eventBus, uiNotification,
permChecker);
if (permChecker.hasReadRepositoryPermission()) { if (permChecker.hasReadRepositoryPermission()) {
this.dsTypeFilterLayout = new DSTypeFilterLayout(i18n, permChecker, eventBus, entityFactory, uiNotification, this.dsTypeFilterLayout = new DSTypeFilterLayout(uiDependencies, softwareModuleTypeManagement,
softwareModuleTypeManagement, distributionSetTypeManagement, distributionSetManagement, distributionSetTypeManagement, distributionSetManagement, systemManagement,
systemManagement, manageDistUIState.getDsTypeFilterLayoutUiState()); manageDistUIState.getDsTypeFilterLayoutUiState());
this.distributionSetGridLayout = new DistributionSetGridLayout(i18n, eventBus, permChecker, uiNotification, this.distributionSetGridLayout = new DistributionSetGridLayout(uiDependencies, targetManagement,
entityFactory, targetManagement, targetFilterQueryManagement, distributionSetManagement, targetFilterQueryManagement, distributionSetManagement, softwareModuleManagement,
softwareModuleManagement, distributionSetTypeManagement, distributionSetTagManagement, distributionSetTypeManagement, distributionSetTagManagement, softwareModuleTypeManagement,
softwareModuleTypeManagement, systemManagement, configManagement, systemSecurityContext, systemManagement, configManagement, systemSecurityContext,
manageDistUIState.getDsTypeFilterLayoutUiState(), manageDistUIState.getDsTypeFilterLayoutUiState(),
manageDistUIState.getDistributionSetGridLayoutUiState()); manageDistUIState.getDistributionSetGridLayoutUiState());
this.swModuleGridLayout = new SwModuleGridLayout(i18n, uiNotification, eventBus, softwareModuleManagement, this.swModuleGridLayout = new SwModuleGridLayout(uiDependencies, softwareModuleManagement,
softwareModuleTypeManagement, entityFactory, permChecker, artifactManagement, softwareModuleTypeManagement, artifactManagement, manageDistUIState.getSmTypeFilterLayoutUiState(),
manageDistUIState.getSmTypeFilterLayoutUiState(), manageDistUIState.getSwModuleGridLayoutUiState()); manageDistUIState.getSwModuleGridLayoutUiState());
this.distSMTypeFilterLayout = new DistSMTypeFilterLayout(eventBus, i18n, permChecker, entityFactory, this.distSMTypeFilterLayout = new DistSMTypeFilterLayout(uiDependencies, softwareModuleTypeManagement,
uiNotification, softwareModuleTypeManagement, manageDistUIState.getSmTypeFilterLayoutUiState()); manageDistUIState.getSmTypeFilterLayoutUiState());
final Map<EventLayout, VisibilityHandler> layoutVisibilityHandlers = new EnumMap<>(EventLayout.class); final Map<EventLayout, VisibilityHandler> layoutVisibilityHandlers = new EnumMap<>(EventLayout.class);
layoutVisibilityHandlers.put(EventLayout.DS_TYPE_FILTER, layoutVisibilityHandlers.put(EventLayout.DS_TYPE_FILTER,
@@ -201,12 +205,12 @@ public class DistributionsView extends VerticalLayout implements View, BrowserWi
private void showDsTypeLayout() { private void showDsTypeLayout() {
dsTypeFilterLayout.setVisible(true); dsTypeFilterLayout.setVisible(true);
distributionSetGridLayout.hideDsTypeHeaderIcon(); distributionSetGridLayout.hideDsFilterHeaderIcon();
} }
private void hideDsTypeLayout() { private void hideDsTypeLayout() {
dsTypeFilterLayout.setVisible(false); dsTypeFilterLayout.setVisible(false);
distributionSetGridLayout.showDsTypeHeaderIcon(); distributionSetGridLayout.showDsFilterHeaderIcon();
} }
private void maximizeDsGridLayout() { private void maximizeDsGridLayout() {

View File

@@ -12,65 +12,47 @@ import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.eclipse.hawkbit.repository.DistributionSetTypeManagement; import org.eclipse.hawkbit.repository.DistributionSetTypeManagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.model.DistributionSetType; import org.eclipse.hawkbit.repository.model.DistributionSetType;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; import org.eclipse.hawkbit.ui.common.AbstractAddNamedEntityWindowController;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.EntityWindowLayout;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload; import org.eclipse.hawkbit.ui.common.type.ProxyTypeValidator;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Add distribution set type window controller * Add distribution set type window controller
*/ */
public class AddDsTypeWindowController extends AbstractEntityWindowController<ProxyType, ProxyType> { public class AddDsTypeWindowController
private final VaadinMessageSource i18n; extends AbstractAddNamedEntityWindowController<ProxyType, ProxyType, DistributionSetType> {
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final DistributionSetTypeManagement dsTypeManagement; private final DistributionSetTypeManagement dsTypeManagement;
private final DsTypeWindowLayout layout; private final DsTypeWindowLayout layout;
private final ProxyTypeValidator validator;
/** /**
* Constructor for AddDsTypeWindowController * Constructor for AddDsTypeWindowController
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param dsTypeManagement * @param dsTypeManagement
* DistributionSetTypeManagement * DistributionSetTypeManagement
* @param layout * @param layout
* DsTypeWindowLayout * DsTypeWindowLayout
*/ */
public AddDsTypeWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, public AddDsTypeWindowController(final CommonUiDependencies uiDependencies,
final UIEventBus eventBus, final UINotification uiNotification,
final DistributionSetTypeManagement dsTypeManagement, final DsTypeWindowLayout layout) { final DistributionSetTypeManagement dsTypeManagement, final DsTypeWindowLayout layout) {
this.i18n = i18n; super(uiDependencies);
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.dsTypeManagement = dsTypeManagement; this.dsTypeManagement = dsTypeManagement;
this.layout = layout; this.layout = layout;
this.validator = new ProxyTypeValidator(uiDependencies);
} }
@Override @Override
public AbstractEntityWindowLayout<ProxyType> getLayout() { public EntityWindowLayout<ProxyType> getLayout() {
return layout; return layout;
} }
@@ -82,7 +64,7 @@ public class AddDsTypeWindowController extends AbstractEntityWindowController<Pr
} }
@Override @Override
protected void persistEntity(final ProxyType entity) { protected DistributionSetType persistEntityInRepository(final ProxyType entity) {
final List<Long> mandatorySmTypeIds = entity.getSelectedSmTypes().stream().filter(ProxyType::isMandatory) final List<Long> mandatorySmTypeIds = entity.getSelectedSmTypes().stream().filter(ProxyType::isMandatory)
.map(ProxyType::getId).collect(Collectors.toList()); .map(ProxyType::getId).collect(Collectors.toList());
@@ -90,34 +72,26 @@ public class AddDsTypeWindowController extends AbstractEntityWindowController<Pr
.filter(selectedSmType -> !selectedSmType.isMandatory()).map(ProxyType::getId) .filter(selectedSmType -> !selectedSmType.isMandatory()).map(ProxyType::getId)
.collect(Collectors.toList()); .collect(Collectors.toList());
final DistributionSetType newDsType = dsTypeManagement.create(entityFactory.distributionSetType().create() return dsTypeManagement.create(getEntityFactory().distributionSetType().create().key(entity.getKey())
.key(entity.getKey()).name(entity.getName()).description(entity.getDescription()) .name(entity.getName()).description(entity.getDescription()).colour(entity.getColour())
.colour(entity.getColour()).mandatory(mandatorySmTypeIds).optional(optionalSmTypeIds)); .mandatory(mandatorySmTypeIds).optional(optionalSmTypeIds));
}
uiNotification.displaySuccess(i18n.getMessage("message.save.success", newDsType.getName())); @Override
eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( protected Class<? extends ProxyIdentifiableEntity> getEntityClass() {
EntityModifiedEventType.ENTITY_ADDED, ProxyDistributionSet.class, ProxyType.class, newDsType.getId())); return ProxyType.class;
}
@Override
protected Class<? extends ProxyIdentifiableEntity> getParentEntityClass() {
return ProxyDistributionSet.class;
} }
@Override @Override
protected boolean isEntityValid(final ProxyType entity) { protected boolean isEntityValid(final ProxyType entity) {
if (!StringUtils.hasText(entity.getName()) || !StringUtils.hasText(entity.getKey())
|| CollectionUtils.isEmpty(entity.getSelectedSmTypes())) {
uiNotification.displayValidationError(i18n.getMessage("message.error.missing.typenameorkeyorsmtype"));
return false;
}
final String trimmedName = StringUtils.trimWhitespace(entity.getName()); final String trimmedName = StringUtils.trimWhitespace(entity.getName());
final String trimmedKey = StringUtils.trimWhitespace(entity.getKey()); final String trimmedKey = StringUtils.trimWhitespace(entity.getKey());
if (dsTypeManagement.getByName(trimmedName).isPresent()) { return validator.isDsTypeValid(entity, () -> dsTypeManagement.getByKey(trimmedKey).isPresent(),
uiNotification.displayValidationError(i18n.getMessage("message.type.duplicate.check", trimmedName)); () -> dsTypeManagement.getByName(trimmedName).isPresent());
return false;
}
if (dsTypeManagement.getByKey(trimmedKey).isPresent()) {
uiNotification.displayValidationError(i18n.getMessage("message.type.key.ds.duplicate.check", trimmedKey));
return false;
}
return true;
} }
} }

View File

@@ -10,14 +10,11 @@ package org.eclipse.hawkbit.ui.distributions.disttype;
import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.DistributionSetTypeManagement; import org.eclipse.hawkbit.repository.DistributionSetTypeManagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder; import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -25,9 +22,6 @@ import com.vaadin.ui.Window;
* Builder for distribution set type window * Builder for distribution set type window
*/ */
public class DsTypeWindowBuilder extends AbstractEntityWindowBuilder<ProxyType> { public class DsTypeWindowBuilder extends AbstractEntityWindowBuilder<ProxyType> {
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final DistributionSetTypeManagement dsTypeManagement; private final DistributionSetTypeManagement dsTypeManagement;
private final DistributionSetManagement dsManagement; private final DistributionSetManagement dsManagement;
@@ -36,30 +30,18 @@ public class DsTypeWindowBuilder extends AbstractEntityWindowBuilder<ProxyType>
/** /**
* Constructor for DsTypeWindowBuilder * Constructor for DsTypeWindowBuilder
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param dsTypeManagement * @param dsTypeManagement
* DistributionSetTypeManagement * DistributionSetTypeManagement
* @param dsManagement * @param dsManagement
* DistributionSetManagement * DistributionSetManagement
* @param smTypeManagement * @param smTypeManagement
* SoftwareModuleTypeManagement * SoftwareModuleTypeManagement
*/ */
public DsTypeWindowBuilder(final VaadinMessageSource i18n, final EntityFactory entityFactory, public DsTypeWindowBuilder(final CommonUiDependencies uiDependencies, final DistributionSetTypeManagement dsTypeManagement,
final UIEventBus eventBus, final UINotification uiNotification, final DistributionSetManagement dsManagement, final SoftwareModuleTypeManagement smTypeManagement) {
final DistributionSetTypeManagement dsTypeManagement, final DistributionSetManagement dsManagement, super(uiDependencies);
final SoftwareModuleTypeManagement smTypeManagement) {
super(i18n);
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.dsTypeManagement = dsTypeManagement; this.dsTypeManagement = dsTypeManagement;
this.dsManagement = dsManagement; this.dsManagement = dsManagement;
@@ -73,15 +55,14 @@ public class DsTypeWindowBuilder extends AbstractEntityWindowBuilder<ProxyType>
@Override @Override
public Window getWindowForAdd() { public Window getWindowForAdd() {
return getWindowForNewEntity(new AddDsTypeWindowController(i18n, entityFactory, eventBus, uiNotification, return getWindowForNewEntity(new AddDsTypeWindowController(uiDependencies, dsTypeManagement,
dsTypeManagement, new DsTypeWindowLayout(i18n, uiNotification, smTypeManagement))); new DsTypeWindowLayout(uiDependencies, smTypeManagement)));
} }
@Override @Override
public Window getWindowForUpdate(final ProxyType proxyType) { public Window getWindowForUpdate(final ProxyType proxyType) {
return getWindowForEntity(proxyType, return getWindowForEntity(proxyType, new UpdateDsTypeWindowController(uiDependencies, dsTypeManagement, dsManagement,
new UpdateDsTypeWindowController(i18n, entityFactory, eventBus, uiNotification, dsTypeManagement, new DsTypeWindowLayout(uiDependencies, smTypeManagement)));
dsManagement, new DsTypeWindowLayout(i18n, uiNotification, smTypeManagement)));
} }
} }

View File

@@ -9,11 +9,10 @@
package org.eclipse.hawkbit.ui.distributions.disttype; package org.eclipse.hawkbit.ui.distributions.disttype;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.builder.FormComponentBuilder; import org.eclipse.hawkbit.ui.common.builder.FormComponentBuilder;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType;
import org.eclipse.hawkbit.ui.management.tag.TagWindowLayout; import org.eclipse.hawkbit.ui.management.tag.TagWindowLayout;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import com.vaadin.ui.ComponentContainer; import com.vaadin.ui.ComponentContainer;
import com.vaadin.ui.FormLayout; import com.vaadin.ui.FormLayout;
@@ -31,16 +30,14 @@ public class DsTypeWindowLayout extends TagWindowLayout<ProxyType> {
/** /**
* Constructor for DsTypeWindowLayout * Constructor for DsTypeWindowLayout
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param uiNotification
* UINotification
* @param softwareModuleTypeManagement * @param softwareModuleTypeManagement
* SoftwareModuleTypeManagement * SoftwareModuleTypeManagement
*/ */
public DsTypeWindowLayout(final VaadinMessageSource i18n, final UINotification uiNotification, public DsTypeWindowLayout(final CommonUiDependencies uiDependencies,
final SoftwareModuleTypeManagement softwareModuleTypeManagement) { final SoftwareModuleTypeManagement softwareModuleTypeManagement) {
super(i18n, uiNotification); super(uiDependencies);
this.dsTypeComponentBuilder = new DsTypeWindowLayoutComponentBuilder(i18n, softwareModuleTypeManagement); this.dsTypeComponentBuilder = new DsTypeWindowLayoutComponentBuilder(i18n, softwareModuleTypeManagement);

View File

@@ -15,44 +15,30 @@ import java.util.stream.Stream;
import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.DistributionSetTypeManagement; import org.eclipse.hawkbit.repository.DistributionSetTypeManagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.builder.DistributionSetTypeUpdate; import org.eclipse.hawkbit.repository.builder.DistributionSetTypeUpdate;
import org.eclipse.hawkbit.repository.exception.EntityNotFoundException;
import org.eclipse.hawkbit.repository.exception.EntityReadOnlyException;
import org.eclipse.hawkbit.repository.model.DistributionSetType; import org.eclipse.hawkbit.repository.model.DistributionSetType;
import org.eclipse.hawkbit.repository.model.SoftwareModuleType; import org.eclipse.hawkbit.repository.model.SoftwareModuleType;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout;
import org.eclipse.hawkbit.ui.common.AbstractUpdateNamedEntityWindowController;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.mappers.TypeToProxyTypeMapper; import org.eclipse.hawkbit.ui.common.data.mappers.TypeToProxyTypeMapper;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload; import org.eclipse.hawkbit.ui.common.type.ProxyTypeValidator;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Controller for update distribution set type window * Controller for update distribution set type window
*/ */
public class UpdateDsTypeWindowController extends AbstractEntityWindowController<ProxyType, ProxyType> { public class UpdateDsTypeWindowController
private static final Logger LOG = LoggerFactory.getLogger(UpdateDsTypeWindowController.class); extends AbstractUpdateNamedEntityWindowController<ProxyType, ProxyType, DistributionSetType> {
private final VaadinMessageSource i18n;
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final DistributionSetTypeManagement dsTypeManagement; private final DistributionSetTypeManagement dsTypeManagement;
private final DistributionSetManagement dsManagement; private final DistributionSetManagement dsManagement;
private final TypeToProxyTypeMapper<SoftwareModuleType> smTypeToProxyTypeMapper; private final TypeToProxyTypeMapper<SoftwareModuleType> smTypeToProxyTypeMapper;
private final DsTypeWindowLayout layout; private final DsTypeWindowLayout layout;
private final ProxyTypeValidator validator;
private String nameBeforeEdit; private String nameBeforeEdit;
private String keyBeforeEdit; private String keyBeforeEdit;
@@ -61,14 +47,8 @@ public class UpdateDsTypeWindowController extends AbstractEntityWindowController
/** /**
* Constructor for UpdateDsTypeWindowController * Constructor for UpdateDsTypeWindowController
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param dsTypeManagement * @param dsTypeManagement
* DistributionSetTypeManagement * DistributionSetTypeManagement
* @param dsManagement * @param dsManagement
@@ -76,21 +56,16 @@ public class UpdateDsTypeWindowController extends AbstractEntityWindowController
* @param layout * @param layout
* DsTypeWindowLayout * DsTypeWindowLayout
*/ */
public UpdateDsTypeWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, public UpdateDsTypeWindowController(final CommonUiDependencies uiDependencies,
final UIEventBus eventBus, final UINotification uiNotification,
final DistributionSetTypeManagement dsTypeManagement, final DistributionSetManagement dsManagement, final DistributionSetTypeManagement dsTypeManagement, final DistributionSetManagement dsManagement,
final DsTypeWindowLayout layout) { final DsTypeWindowLayout layout) {
this.i18n = i18n; super(uiDependencies);
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.dsTypeManagement = dsTypeManagement; this.dsTypeManagement = dsTypeManagement;
this.dsManagement = dsManagement; this.dsManagement = dsManagement;
this.smTypeToProxyTypeMapper = new TypeToProxyTypeMapper<>(); this.smTypeToProxyTypeMapper = new TypeToProxyTypeMapper<>();
this.layout = layout; this.layout = layout;
this.validator = new ProxyTypeValidator(uiDependencies);
} }
@Override @Override
@@ -144,15 +119,15 @@ public class UpdateDsTypeWindowController extends AbstractEntityWindowController
layout.disableTypeKey(); layout.disableTypeKey();
if (isDsTypeAssigned) { if (isDsTypeAssigned) {
uiNotification.displayValidationError( getUiNotification().displayValidationError(
nameBeforeEdit + " " + i18n.getMessage("message.error.dist.set.type.update")); nameBeforeEdit + " " + getI18n().getMessage("message.error.dist.set.type.update"));
layout.disableDsTypeSmSelectLayout(); layout.disableDsTypeSmSelectLayout();
} }
} }
@Override @Override
protected void persistEntity(final ProxyType entity) { protected DistributionSetType persistEntityInRepository(final ProxyType entity) {
final DistributionSetTypeUpdate dsTypeUpdate = entityFactory.distributionSetType().update(entity.getId()) final DistributionSetTypeUpdate dsTypeUpdate = getEntityFactory().distributionSetType().update(entity.getId())
.description(entity.getDescription()).colour(entity.getColour()); .description(entity.getDescription()).colour(entity.getColour());
final List<Long> mandatorySmTypeIds = entity.getSelectedSmTypes().stream().filter(ProxyType::isMandatory) final List<Long> mandatorySmTypeIds = entity.getSelectedSmTypes().stream().filter(ProxyType::isMandatory)
@@ -164,40 +139,33 @@ public class UpdateDsTypeWindowController extends AbstractEntityWindowController
dsTypeUpdate.mandatory(mandatorySmTypeIds).optional(optionalSmTypeIds); dsTypeUpdate.mandatory(mandatorySmTypeIds).optional(optionalSmTypeIds);
try { return dsTypeManagement.update(dsTypeUpdate);
final DistributionSetType updatedDsType = dsTypeManagement.update(dsTypeUpdate); }
uiNotification.displaySuccess(i18n.getMessage("message.update.success", updatedDsType.getName())); @Override
eventBus.publish(EventTopics.ENTITY_MODIFIED, this, protected Class<? extends ProxyIdentifiableEntity> getEntityClass() {
new EntityModifiedEventPayload(EntityModifiedEventType.ENTITY_UPDATED, ProxyDistributionSet.class, return ProxyType.class;
ProxyType.class, updatedDsType.getId())); }
} catch (final EntityNotFoundException | EntityReadOnlyException e) {
LOG.trace("Update of DS type failed in UI: {}", e.getMessage()); @Override
final String entityType = i18n.getMessage("caption.entity.distribution.type"); protected Class<? extends ProxyIdentifiableEntity> getParentEntityClass() {
uiNotification return ProxyDistributionSet.class;
.displayWarning(i18n.getMessage("message.deleted.or.notAllowed", entityType, entity.getName()));
}
} }
@Override @Override
protected boolean isEntityValid(final ProxyType entity) { protected boolean isEntityValid(final ProxyType entity) {
if (!StringUtils.hasText(entity.getName()) || !StringUtils.hasText(entity.getKey())
|| CollectionUtils.isEmpty(entity.getSelectedSmTypes())) {
uiNotification.displayValidationError(i18n.getMessage("message.error.missing.typenameorkeyorsmtype"));
return false;
}
final String trimmedName = StringUtils.trimWhitespace(entity.getName()); final String trimmedName = StringUtils.trimWhitespace(entity.getName());
final String trimmedKey = StringUtils.trimWhitespace(entity.getKey()); final String trimmedKey = StringUtils.trimWhitespace(entity.getKey());
if (!nameBeforeEdit.equals(trimmedName) && dsTypeManagement.getByName(trimmedName).isPresent()) { return validator.isDsTypeValid(entity,
uiNotification.displayValidationError(i18n.getMessage("message.type.duplicate.check", trimmedName)); () -> hasKeyChanged(trimmedKey) && dsTypeManagement.getByKey(trimmedKey).isPresent(),
return false; () -> hasNameChanged(trimmedName) && dsTypeManagement.getByName(trimmedName).isPresent());
} }
if (!keyBeforeEdit.equals(trimmedKey) && dsTypeManagement.getByKey(trimmedKey).isPresent()) {
uiNotification.displayValidationError(i18n.getMessage("message.type.key.ds.duplicate.check", trimmedKey));
return false;
}
return true; private boolean hasNameChanged(final String trimmedName) {
return !nameBeforeEdit.equals(trimmedName);
}
private boolean hasKeyChanged(final String trimmedKey) {
return !keyBeforeEdit.equals(trimmedKey);
} }
} }

View File

@@ -11,7 +11,7 @@ package org.eclipse.hawkbit.ui.distributions.disttype.filter;
import org.eclipse.hawkbit.repository.DistributionSetTypeManagement; import org.eclipse.hawkbit.repository.DistributionSetTypeManagement;
import org.eclipse.hawkbit.repository.SystemManagement; import org.eclipse.hawkbit.repository.SystemManagement;
import org.eclipse.hawkbit.repository.model.DistributionSetType; import org.eclipse.hawkbit.repository.model.DistributionSetType;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.mappers.TypeToProxyTypeMapper; import org.eclipse.hawkbit.ui.common.data.mappers.TypeToProxyTypeMapper;
import org.eclipse.hawkbit.ui.common.data.providers.DistributionSetTypeDataProvider; import org.eclipse.hawkbit.ui.common.data.providers.DistributionSetTypeDataProvider;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
@@ -22,9 +22,6 @@ import org.eclipse.hawkbit.ui.common.filterlayout.AbstractTypeFilterButtons;
import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState; import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState;
import org.eclipse.hawkbit.ui.distributions.disttype.DsTypeWindowBuilder; import org.eclipse.hawkbit.ui.distributions.disttype.DsTypeWindowBuilder;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -41,16 +38,10 @@ public class DSTypeFilterButtons extends AbstractTypeFilterButtons {
/** /**
* Constructor * Constructor
* *
* @param eventBus * @param uiDependencies
* UIEventBus * {@link CommonUiDependencies}
* @param distributionSetTypeManagement * @param distributionSetTypeManagement
* DistributionSetTypeManagement * DistributionSetTypeManagement
* @param i18n
* VaadinMessageSource
* @param permChecker
* SpPermissionChecker
* @param uiNotification
* UINotification
* @param systemManagement * @param systemManagement
* SystemManagement * SystemManagement
* @param dsTypeWindowBuilder * @param dsTypeWindowBuilder
@@ -58,11 +49,10 @@ public class DSTypeFilterButtons extends AbstractTypeFilterButtons {
* @param typeFilterLayoutUiState * @param typeFilterLayoutUiState
* TypeFilterLayoutUiState * TypeFilterLayoutUiState
*/ */
public DSTypeFilterButtons(final UIEventBus eventBus, final VaadinMessageSource i18n, public DSTypeFilterButtons(final CommonUiDependencies uiDependencies,
final UINotification uiNotification, final SpPermissionChecker permChecker,
final DistributionSetTypeManagement distributionSetTypeManagement, final SystemManagement systemManagement, final DistributionSetTypeManagement distributionSetTypeManagement, final SystemManagement systemManagement,
final DsTypeWindowBuilder dsTypeWindowBuilder, final TypeFilterLayoutUiState typeFilterLayoutUiState) { final DsTypeWindowBuilder dsTypeWindowBuilder, final TypeFilterLayoutUiState typeFilterLayoutUiState) {
super(eventBus, i18n, uiNotification, permChecker, typeFilterLayoutUiState); super(uiDependencies, typeFilterLayoutUiState);
this.distributionSetTypeManagement = distributionSetTypeManagement; this.distributionSetTypeManagement = distributionSetTypeManagement;
this.dsTypeWindowBuilder = dsTypeWindowBuilder; this.dsTypeWindowBuilder = dsTypeWindowBuilder;

View File

@@ -8,7 +8,7 @@
*/ */
package org.eclipse.hawkbit.ui.distributions.disttype.filter; package org.eclipse.hawkbit.ui.distributions.disttype.filter;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.grid.header.AbstractFilterHeader; import org.eclipse.hawkbit.ui.common.grid.header.AbstractFilterHeader;
@@ -16,8 +16,6 @@ import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState;
import org.eclipse.hawkbit.ui.distributions.disttype.DsTypeWindowBuilder; import org.eclipse.hawkbit.ui.distributions.disttype.DsTypeWindowBuilder;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -36,20 +34,16 @@ public class DSTypeFilterHeader extends AbstractFilterHeader {
/** /**
* Constructor * Constructor
* *
* @param eventBus * @param uiDependencies
* DsTypeWindowBuilder * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param permChecker
* SpPermissionChecker
* @param dsTypeWindowBuilder * @param dsTypeWindowBuilder
* DsTypeWindowBuilder * DsTypeWindowBuilder
* @param dSTypeFilterLayoutUiState * @param dSTypeFilterLayoutUiState
* TypeFilterLayoutUiState * TypeFilterLayoutUiState
*/ */
DSTypeFilterHeader(final UIEventBus eventBus, final VaadinMessageSource i18n, final SpPermissionChecker permChecker, DSTypeFilterHeader(final CommonUiDependencies uiDependencies, final DsTypeWindowBuilder dsTypeWindowBuilder,
final DsTypeWindowBuilder dsTypeWindowBuilder, final TypeFilterLayoutUiState dSTypeFilterLayoutUiState) { final TypeFilterLayoutUiState dSTypeFilterLayoutUiState) {
super(i18n, permChecker, eventBus); super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus());
this.dSTypeFilterLayoutUiState = dSTypeFilterLayoutUiState; this.dSTypeFilterLayoutUiState = dSTypeFilterLayoutUiState;
this.dsTypeWindowBuilder = dsTypeWindowBuilder; this.dsTypeWindowBuilder = dsTypeWindowBuilder;

View File

@@ -13,10 +13,9 @@ import java.util.List;
import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.DistributionSetTypeManagement; import org.eclipse.hawkbit.repository.DistributionSetTypeManagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.repository.SystemManagement; import org.eclipse.hawkbit.repository.SystemManagement;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
@@ -30,9 +29,6 @@ import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGener
import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGridRefreshAwareSupport; import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGridRefreshAwareSupport;
import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState; import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState;
import org.eclipse.hawkbit.ui.distributions.disttype.DsTypeWindowBuilder; import org.eclipse.hawkbit.ui.distributions.disttype.DsTypeWindowBuilder;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.ComponentContainer; import com.vaadin.ui.ComponentContainer;
@@ -51,16 +47,8 @@ public class DSTypeFilterLayout extends AbstractFilterLayout {
/** /**
* Constructor * Constructor
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param permChecker
* SpPermissionChecker
* @param eventBus
* UIEventBus
* @param entityFactory
* EntityFactory
* @param uiNotification
* UINotification
* @param softwareModuleTypeManagement * @param softwareModuleTypeManagement
* SoftwareModuleTypeManagement * SoftwareModuleTypeManagement
* @param distributionSetTypeManagement * @param distributionSetTypeManagement
@@ -72,25 +60,23 @@ public class DSTypeFilterLayout extends AbstractFilterLayout {
* @param dSTypeFilterLayoutUiState * @param dSTypeFilterLayoutUiState
* TypeFilterLayoutUiState * TypeFilterLayoutUiState
*/ */
public DSTypeFilterLayout(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, public DSTypeFilterLayout(final CommonUiDependencies uiDependencies,
final UIEventBus eventBus, final EntityFactory entityFactory, final UINotification uiNotification,
final SoftwareModuleTypeManagement softwareModuleTypeManagement, final SoftwareModuleTypeManagement softwareModuleTypeManagement,
final DistributionSetTypeManagement distributionSetTypeManagement, final DistributionSetTypeManagement distributionSetTypeManagement,
final DistributionSetManagement distributionSetManagement, final SystemManagement systemManagement, final DistributionSetManagement distributionSetManagement, final SystemManagement systemManagement,
final TypeFilterLayoutUiState dSTypeFilterLayoutUiState) { final TypeFilterLayoutUiState dSTypeFilterLayoutUiState) {
final DsTypeWindowBuilder dsTypeWindowBuilder = new DsTypeWindowBuilder(i18n, entityFactory, eventBus, final DsTypeWindowBuilder dsTypeWindowBuilder = new DsTypeWindowBuilder(uiDependencies, distributionSetTypeManagement,
uiNotification, distributionSetTypeManagement, distributionSetManagement, softwareModuleTypeManagement); distributionSetManagement, softwareModuleTypeManagement);
this.dsTypeFilterHeader = new DSTypeFilterHeader(eventBus, i18n, permChecker, dsTypeWindowBuilder, this.dsTypeFilterHeader = new DSTypeFilterHeader(uiDependencies, dsTypeWindowBuilder, dSTypeFilterLayoutUiState);
dSTypeFilterLayoutUiState); this.dSTypeFilterButtons = new DSTypeFilterButtons(uiDependencies, distributionSetTypeManagement, systemManagement,
this.dSTypeFilterButtons = new DSTypeFilterButtons(eventBus, i18n, uiNotification, permChecker, dsTypeWindowBuilder, dSTypeFilterLayoutUiState);
distributionSetTypeManagement, systemManagement, dsTypeWindowBuilder, dSTypeFilterLayoutUiState);
this.gridActionsVisibilityListener = new GridActionsVisibilityListener(eventBus, this.gridActionsVisibilityListener = new GridActionsVisibilityListener(uiDependencies.getEventBus(),
new EventLayoutViewAware(EventLayout.DS_TYPE_FILTER, EventView.DISTRIBUTIONS), new EventLayoutViewAware(EventLayout.DS_TYPE_FILTER, EventView.DISTRIBUTIONS),
dSTypeFilterButtons::hideActionColumns, dSTypeFilterButtons::showEditColumn, dSTypeFilterButtons::hideActionColumns, dSTypeFilterButtons::showEditColumn,
dSTypeFilterButtons::showDeleteColumn); dSTypeFilterButtons::showDeleteColumn);
this.entityModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyType.class) this.entityModifiedListener = new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxyType.class)
.entityModifiedAwareSupports(getEntityModifiedAwareSupports()) .entityModifiedAwareSupports(getEntityModifiedAwareSupports())
.parentEntityType(ProxyDistributionSet.class).build(); .parentEntityType(ProxyDistributionSet.class).build();

View File

@@ -9,54 +9,39 @@
package org.eclipse.hawkbit.ui.distributions.dstable; package org.eclipse.hawkbit.ui.distributions.dstable;
import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SystemManagement; import org.eclipse.hawkbit.repository.SystemManagement;
import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; import org.eclipse.hawkbit.ui.common.AbstractAddNamedEntityWindowController;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.EntityWindowLayout;
import org.eclipse.hawkbit.ui.common.data.mappers.DistributionSetToProxyDistributionMapper; import org.eclipse.hawkbit.ui.common.data.mappers.DistributionSetToProxyDistributionMapper;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTypeInfo; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTypeInfo;
import org.eclipse.hawkbit.ui.common.event.CommandTopics;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload; import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload;
import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload.SelectionChangedEventType; import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload.SelectionChangedEventType;
import org.eclipse.hawkbit.ui.utils.UINotification; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Controller for add distribution set window * Controller for add distribution set window
*/ */
public class AddDsWindowController extends AbstractEntityWindowController<ProxyDistributionSet, ProxyDistributionSet> { public class AddDsWindowController
private final VaadinMessageSource i18n; extends AbstractAddNamedEntityWindowController<ProxyDistributionSet, ProxyDistributionSet, DistributionSet> {
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final SystemManagement systemManagement; private final SystemManagement systemManagement;
private final DistributionSetManagement dsManagement; private final DistributionSetManagement dsManagement;
private final DsWindowLayout layout; private final DsWindowLayout layout;
private final EventView view; private final EventView view;
private final ProxyDsValidator validator;
/** /**
* Constructor for AddDsWindowController * Constructor for AddDsWindowController
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* VaadinMessageSource
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param systemManagement * @param systemManagement
* SystemManagement * SystemManagement
* @param dsManagement * @param dsManagement
@@ -66,24 +51,19 @@ public class AddDsWindowController extends AbstractEntityWindowController<ProxyD
* @param view * @param view
* EventView * EventView
*/ */
public AddDsWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, public AddDsWindowController(final CommonUiDependencies uiDependencies, final SystemManagement systemManagement,
final UIEventBus eventBus, final UINotification uiNotification, final SystemManagement systemManagement,
final DistributionSetManagement dsManagement, final DsWindowLayout layout, final EventView view) { final DistributionSetManagement dsManagement, final DsWindowLayout layout, final EventView view) {
this.i18n = i18n; super(uiDependencies);
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.systemManagement = systemManagement; this.systemManagement = systemManagement;
this.dsManagement = dsManagement; this.dsManagement = dsManagement;
this.layout = layout; this.layout = layout;
this.view = view; this.view = view;
this.validator = new ProxyDsValidator(uiDependencies);
} }
@Override @Override
public AbstractEntityWindowLayout<ProxyDistributionSet> getLayout() { public EntityWindowLayout<ProxyDistributionSet> getLayout() {
return layout; return layout;
} }
@@ -101,36 +81,39 @@ public class AddDsWindowController extends AbstractEntityWindowController<ProxyD
} }
@Override @Override
protected void persistEntity(final ProxyDistributionSet entity) { protected DistributionSet persistEntityInRepository(final ProxyDistributionSet entity) {
final DistributionSet newDs = dsManagement.create(entityFactory.distributionSet().create() return dsManagement.create(getEntityFactory().distributionSet().create().type(entity.getTypeInfo().getKey())
.type(entity.getTypeInfo().getKey()).name(entity.getName()).version(entity.getVersion()) .name(entity.getName()).version(entity.getVersion()).description(entity.getDescription())
.description(entity.getDescription()).requiredMigrationStep(entity.isRequiredMigrationStep())); .requiredMigrationStep(entity.isRequiredMigrationStep()));
}
uiNotification @Override
.displaySuccess(i18n.getMessage("message.save.success", newDs.getName() + ":" + newDs.getVersion())); protected String getDisplayableName(final DistributionSet entity) {
eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( return HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion());
EntityModifiedEventType.ENTITY_ADDED, ProxyDistributionSet.class, newDs.getId())); }
final ProxyDistributionSet addedItem = new DistributionSetToProxyDistributionMapper().map(newDs); @Override
eventBus.publish(CommandTopics.SELECT_GRID_ENTITY, this, new SelectionChangedEventPayload<>( protected String getDisplayableNameForFailedMessage(final ProxyDistributionSet entity) {
SelectionChangedEventType.ENTITY_SELECTED, addedItem, EventLayout.DS_LIST, view)); return HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion());
}
@Override
protected Class<? extends ProxyIdentifiableEntity> getEntityClass() {
return ProxyDistributionSet.class;
}
@Override
protected void selectPersistedEntity(final DistributionSet entity) {
final ProxyDistributionSet addedItem = new DistributionSetToProxyDistributionMapper().map(entity);
publishSelectionEvent(new SelectionChangedEventPayload<>(SelectionChangedEventType.ENTITY_SELECTED, addedItem,
EventLayout.DS_LIST, view));
} }
@Override @Override
protected boolean isEntityValid(final ProxyDistributionSet entity) { protected boolean isEntityValid(final ProxyDistributionSet entity) {
if (!StringUtils.hasText(entity.getName()) || !StringUtils.hasText(entity.getVersion())) {
uiNotification.displayValidationError(i18n.getMessage("message.error.missing.nameorversion"));
return false;
}
final String trimmedName = StringUtils.trimWhitespace(entity.getName()); final String trimmedName = StringUtils.trimWhitespace(entity.getName());
final String trimmedVersion = StringUtils.trimWhitespace(entity.getVersion()); final String trimmedVersion = StringUtils.trimWhitespace(entity.getVersion());
if (dsManagement.getByNameAndVersion(trimmedName, trimmedVersion).isPresent()) { return validator.isEntityValid(entity,
uiNotification () -> dsManagement.getByNameAndVersion(trimmedName, trimmedVersion).isPresent());
.displayValidationError(i18n.getMessage("message.duplicate.dist", trimmedName, trimmedVersion));
return false;
}
return true;
} }
} }

View File

@@ -16,13 +16,13 @@ import org.eclipse.hawkbit.repository.DistributionSetTypeManagement;
import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SoftwareModuleManagement;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetManagement;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.filters.DsDistributionsFilterParams; import org.eclipse.hawkbit.ui.common.data.filters.DsDistributionsFilterParams;
import org.eclipse.hawkbit.ui.common.data.providers.DistributionSetDistributionsStateDataProvider; import org.eclipse.hawkbit.ui.common.data.providers.DistributionSetDistributionsStateDataProvider;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.distributionset.AbstractDsGrid;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.event.FilterType; import org.eclipse.hawkbit.ui.common.event.FilterType;
import org.eclipse.hawkbit.ui.common.grid.AbstractDsGrid;
import org.eclipse.hawkbit.ui.common.grid.support.DragAndDropSupport; import org.eclipse.hawkbit.ui.common.grid.support.DragAndDropSupport;
import org.eclipse.hawkbit.ui.common.grid.support.FilterSupport; import org.eclipse.hawkbit.ui.common.grid.support.FilterSupport;
import org.eclipse.hawkbit.ui.common.grid.support.assignment.AssignmentSupport; import org.eclipse.hawkbit.ui.common.grid.support.assignment.AssignmentSupport;
@@ -31,9 +31,6 @@ import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState;
import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState; import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions; import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Distribution set grid which is shown on the Distributions View. * Distribution set grid which is shown on the Distributions View.
@@ -46,38 +43,29 @@ public class DistributionSetGrid extends AbstractDsGrid<DsDistributionsFilterPar
/** /**
* Constructor for DistributionSetGrid * Constructor for DistributionSetGrid
* *
* @param eventBus * @param uiDependencies
* UIEventBus * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param permissionChecker
* SpPermissionChecker
* @param notification
* UINotification
* @param targetManagement * @param targetManagement
* TargetManagement * TargetManagement
* @param dsManagement * @param dsManagement
* DistributionSetManagement * DistributionSetManagement
* @param smManagement * @param smManagement
* SoftwareModuleManagement * SoftwareModuleManagement
* @param dsTypeManagement * @param dsTypeManagement
* DistributionSetTypeManagement * DistributionSetTypeManagement
* @param smTypeManagement * @param smTypeManagement
* SoftwareModuleTypeManagement * SoftwareModuleTypeManagement
* @param dSTypeFilterLayoutUiState * @param dSTypeFilterLayoutUiState
* TypeFilterLayoutUiState * TypeFilterLayoutUiState
* @param distributionSetGridLayoutUiState * @param distributionSetGridLayoutUiState
* GridLayoutUiState * GridLayoutUiState
*/ */
public DistributionSetGrid(final UIEventBus eventBus, final VaadinMessageSource i18n, public DistributionSetGrid(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement,
final SpPermissionChecker permissionChecker, final UINotification notification, final DistributionSetManagement dsManagement, final SoftwareModuleManagement smManagement,
final TargetManagement targetManagement, final DistributionSetManagement dsManagement, final DistributionSetTypeManagement dsTypeManagement, final SoftwareModuleTypeManagement smTypeManagement,
final SoftwareModuleManagement smManagement, final DistributionSetTypeManagement dsTypeManagement,
final SoftwareModuleTypeManagement smTypeManagement,
final TypeFilterLayoutUiState dSTypeFilterLayoutUiState, final TypeFilterLayoutUiState dSTypeFilterLayoutUiState,
final GridLayoutUiState distributionSetGridLayoutUiState) { final GridLayoutUiState distributionSetGridLayoutUiState) {
super(i18n, eventBus, permissionChecker, notification, dsManagement, distributionSetGridLayoutUiState, super(uiDependencies, dsManagement, distributionSetGridLayoutUiState, EventView.DISTRIBUTIONS);
EventView.DISTRIBUTIONS);
this.dSTypeFilterLayoutUiState = dSTypeFilterLayoutUiState; this.dSTypeFilterLayoutUiState = dSTypeFilterLayoutUiState;

View File

@@ -15,7 +15,6 @@ import java.util.List;
import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.DistributionSetTagManagement; import org.eclipse.hawkbit.repository.DistributionSetTagManagement;
import org.eclipse.hawkbit.repository.DistributionSetTypeManagement; import org.eclipse.hawkbit.repository.DistributionSetTypeManagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SoftwareModuleManagement;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.repository.SystemManagement; import org.eclipse.hawkbit.repository.SystemManagement;
@@ -23,16 +22,17 @@ import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetManagement;
import org.eclipse.hawkbit.repository.TenantConfigurationManagement; import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.security.SystemSecurityContext;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag;
import org.eclipse.hawkbit.ui.common.detailslayout.DistributionSetDetails; import org.eclipse.hawkbit.ui.common.distributionset.AbstractDistributionSetGridLayout;
import org.eclipse.hawkbit.ui.common.detailslayout.DistributionSetDetailsHeader; import org.eclipse.hawkbit.ui.common.distributionset.DistributionSetDetails;
import org.eclipse.hawkbit.ui.common.distributionset.DistributionSetDetailsHeader;
import org.eclipse.hawkbit.ui.common.distributionset.DistributionSetGridHeader;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
import org.eclipse.hawkbit.ui.common.event.EventLayoutViewAware; import org.eclipse.hawkbit.ui.common.event.EventLayoutViewAware;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.event.EventViewAware; import org.eclipse.hawkbit.ui.common.event.EventViewAware;
import org.eclipse.hawkbit.ui.common.layout.AbstractGridComponentLayout;
import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent; import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent;
import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener; import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener;
import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener.EntityModifiedAwareSupport; import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener.EntityModifiedAwareSupport;
@@ -44,14 +44,11 @@ import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedSelec
import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedTagTokenAwareSupport; import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedTagTokenAwareSupport;
import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState; import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState;
import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState; import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* DistributionSet table layout. * DistributionSet table layout in distributions view.
*/ */
public class DistributionSetGridLayout extends AbstractGridComponentLayout { public class DistributionSetGridLayout extends AbstractDistributionSetGridLayout {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final DistributionSetGridHeader distributionSetGridHeader; private final DistributionSetGridHeader distributionSetGridHeader;
@@ -59,53 +56,37 @@ public class DistributionSetGridLayout extends AbstractGridComponentLayout {
private final DistributionSetDetailsHeader distributionSetDetailsHeader; private final DistributionSetDetailsHeader distributionSetDetailsHeader;
private final DistributionSetDetails distributionSetDetails; private final DistributionSetDetails distributionSetDetails;
private final transient FilterChangedListener<ProxyDistributionSet> dsFilterListener;
private final transient SelectionChangedListener<ProxyDistributionSet> masterDsChangedListener;
private final transient SelectGridEntityListener<ProxyDistributionSet> selectDsListener;
private final transient EntityModifiedListener<ProxyDistributionSet> dsModifiedListener;
private final transient EntityModifiedListener<ProxyTag> tagModifiedListener;
/** /**
* Constructor for DistributionSetGridLayout * Constructor for DistributionSetGridLayout
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param eventBus
* UIEventBus
* @param permissionChecker
* SpPermissionChecker
* @param uiNotification
* UINotification
* @param entityFactory
* EntityFactory
* @param targetManagement * @param targetManagement
* TargetManagement * TargetManagement
* @param targetFilterQueryManagement * @param targetFilterQueryManagement
* TargetFilterQueryManagement * TargetFilterQueryManagement
* @param distributionSetManagement * @param distributionSetManagement
* DistributionSetManagement * DistributionSetManagement
* @param smManagement * @param smManagement
* SoftwareModuleManagement * SoftwareModuleManagement
* @param distributionSetTypeManagement * @param distributionSetTypeManagement
* DistributionSetTypeManagement * DistributionSetTypeManagement
* @param distributionSetTagManagement * @param distributionSetTagManagement
* DistributionSetTagManagement * DistributionSetTagManagement
* @param smTypeManagement * @param smTypeManagement
* SoftwareModuleTypeManagement * SoftwareModuleTypeManagement
* @param systemManagement * @param systemManagement
* SystemManagement * SystemManagement
* @param configManagement * @param configManagement
* TenantConfigurationManagement * TenantConfigurationManagement
* @param systemSecurityContext * @param systemSecurityContext
* SystemSecurityContext * SystemSecurityContext
* @param dSTypeFilterLayoutUiState * @param dSTypeFilterLayoutUiState
* TypeFilterLayoutUiState * TypeFilterLayoutUiState
* @param distributionSetGridLayoutUiState * @param distributionSetGridLayoutUiState
* GridLayoutUiState * GridLayoutUiState
*/ */
public DistributionSetGridLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, public DistributionSetGridLayout(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement,
final SpPermissionChecker permissionChecker, final UINotification uiNotification,
final EntityFactory entityFactory, final TargetManagement targetManagement,
final TargetFilterQueryManagement targetFilterQueryManagement, final TargetFilterQueryManagement targetFilterQueryManagement,
final DistributionSetManagement distributionSetManagement, final SoftwareModuleManagement smManagement, final DistributionSetManagement distributionSetManagement, final SoftwareModuleManagement smManagement,
final DistributionSetTypeManagement distributionSetTypeManagement, final DistributionSetTypeManagement distributionSetTypeManagement,
@@ -114,42 +95,40 @@ public class DistributionSetGridLayout extends AbstractGridComponentLayout {
final TenantConfigurationManagement configManagement, final SystemSecurityContext systemSecurityContext, final TenantConfigurationManagement configManagement, final SystemSecurityContext systemSecurityContext,
final TypeFilterLayoutUiState dSTypeFilterLayoutUiState, final TypeFilterLayoutUiState dSTypeFilterLayoutUiState,
final GridLayoutUiState distributionSetGridLayoutUiState) { final GridLayoutUiState distributionSetGridLayoutUiState) {
final DsWindowBuilder dsWindowBuilder = new DsWindowBuilder(i18n, entityFactory, eventBus, uiNotification, super(uiDependencies, systemManagement, systemSecurityContext, configManagement, distributionSetManagement,
systemManagement, systemSecurityContext, configManagement, distributionSetManagement,
distributionSetTypeManagement, EventView.DISTRIBUTIONS); distributionSetTypeManagement, EventView.DISTRIBUTIONS);
final DsMetaDataWindowBuilder dsMetaDataWindowBuilder = new DsMetaDataWindowBuilder(i18n, entityFactory,
eventBus, uiNotification, permissionChecker, distributionSetManagement);
this.distributionSetGridHeader = new DistributionSetGridHeader(i18n, permissionChecker, eventBus, this.distributionSetGridHeader = new DistributionSetGridHeader(uiDependencies, dSTypeFilterLayoutUiState,
dSTypeFilterLayoutUiState, distributionSetGridLayoutUiState, EventLayout.DS_TYPE_FILTER, distributionSetGridLayoutUiState, EventLayout.DS_TYPE_FILTER, getEventView());
EventView.DISTRIBUTIONS); this.distributionSetGridHeader.addAddHeaderSupport(getDsWindowBuilder());
this.distributionSetGridHeader.addAddHeaderSupport(dsWindowBuilder);
this.distributionSetGridHeader.buildHeader(); this.distributionSetGridHeader.buildHeader();
this.distributionSetGrid = new DistributionSetGrid(eventBus, i18n, permissionChecker, uiNotification,
targetManagement, distributionSetManagement, smManagement, distributionSetTypeManagement,
smTypeManagement, dSTypeFilterLayoutUiState, distributionSetGridLayoutUiState);
this.distributionSetDetailsHeader = new DistributionSetDetailsHeader(i18n, permissionChecker, eventBus, this.distributionSetGrid = new DistributionSetGrid(uiDependencies, targetManagement, distributionSetManagement,
uiNotification, dsWindowBuilder, dsMetaDataWindowBuilder); smManagement, distributionSetTypeManagement, smTypeManagement, dSTypeFilterLayoutUiState,
this.distributionSetDetails = new DistributionSetDetails(i18n, eventBus, permissionChecker, uiNotification, distributionSetGridLayoutUiState);
distributionSetManagement, smManagement, distributionSetTypeManagement, distributionSetTagManagement,
configManagement, systemSecurityContext, dsMetaDataWindowBuilder); this.distributionSetDetailsHeader = new DistributionSetDetailsHeader(uiDependencies, getDsWindowBuilder(),
getDsMetaDataWindowBuilder());
this.distributionSetDetails = new DistributionSetDetails(uiDependencies, distributionSetManagement, smManagement,
distributionSetTypeManagement, distributionSetTagManagement, configManagement, systemSecurityContext,
getDsMetaDataWindowBuilder());
this.distributionSetDetails.setUnassignSmAllowed(true); this.distributionSetDetails.setUnassignSmAllowed(true);
this.distributionSetDetails.addTfqDetailsGrid(targetFilterQueryManagement); this.distributionSetDetails.addTfqDetailsGrid(targetFilterQueryManagement);
this.distributionSetDetails.buildDetails(); this.distributionSetDetails.buildDetails();
this.dsFilterListener = new FilterChangedListener<>(eventBus, ProxyDistributionSet.class, addEventListener(new FilterChangedListener<>(uiDependencies.getEventBus(), ProxyDistributionSet.class,
new EventViewAware(EventView.DISTRIBUTIONS), distributionSetGrid.getFilterSupport()); new EventViewAware(getEventView()), distributionSetGrid.getFilterSupport()));
this.masterDsChangedListener = new SelectionChangedListener<>(eventBus, addEventListener(new SelectionChangedListener<>(uiDependencies.getEventBus(),
new EventLayoutViewAware(EventLayout.DS_LIST, EventView.DISTRIBUTIONS), getDsEntityAwareComponents()); new EventLayoutViewAware(EventLayout.DS_LIST, getEventView()), getDsEntityAwareComponents()));
this.selectDsListener = new SelectGridEntityListener<>(eventBus, addEventListener(new SelectGridEntityListener<>(uiDependencies.getEventBus(),
new EventLayoutViewAware(EventLayout.DS_LIST, EventView.DISTRIBUTIONS), new EventLayoutViewAware(EventLayout.DS_LIST, getEventView()),
distributionSetGrid.getSelectionSupport()); distributionSetGrid.getSelectionSupport()));
this.dsModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyDistributionSet.class) addEventListener(new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxyDistributionSet.class)
.entityModifiedAwareSupports(getDsModifiedAwareSupports()).build(); .entityModifiedAwareSupports(getDsModifiedAwareSupports()).build());
this.tagModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyTag.class) addEventListener(new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxyTag.class)
.entityModifiedAwareSupports(getTagModifiedAwareSupports()).parentEntityType(ProxyDistributionSet.class) .entityModifiedAwareSupports(getTagModifiedAwareSupports()).parentEntityType(ProxyDistributionSet.class)
.build(); .build());
buildLayout(distributionSetGridHeader, distributionSetGrid, distributionSetDetailsHeader, buildLayout(distributionSetGridHeader, distributionSetGrid, distributionSetDetailsHeader,
distributionSetDetails); distributionSetDetails);
@@ -170,52 +149,13 @@ public class DistributionSetGridLayout extends AbstractGridComponentLayout {
.singletonList(EntityModifiedTagTokenAwareSupport.of(distributionSetDetails.getDistributionTagToken())); .singletonList(EntityModifiedTagTokenAwareSupport.of(distributionSetDetails.getDistributionTagToken()));
} }
/** @Override
* Show distribution set type header icon public DistributionSetGrid getDistributionGrid() {
*/ return distributionSetGrid;
public void showDsTypeHeaderIcon() {
distributionSetGridHeader.showFilterIcon();
} }
/** @Override
* Hide distribution set type header icon public DistributionSetGridHeader getDistributionSetGridHeader() {
*/ return distributionSetGridHeader;
public void hideDsTypeHeaderIcon() {
distributionSetGridHeader.hideFilterIcon();
}
/**
* Maximize the distribution set grid
*/
public void maximize() {
distributionSetGrid.createMaximizedContent();
hideDetailsLayout();
}
/**
* Minimize the distribution set grid
*/
public void minimize() {
distributionSetGrid.createMinimizedContent();
showDetailsLayout();
}
/**
* Restore the distribution set header and grid
*/
public void restoreState() {
distributionSetGridHeader.restoreState();
distributionSetGrid.restoreState();
}
/**
* Unsubscribe the eent listener
*/
public void unsubscribeListener() {
dsFilterListener.unsubscribe();
masterDsChangedListener.unsubscribe();
selectDsListener.unsubscribe();
dsModifiedListener.unsubscribe();
tagModifiedListener.unsubscribe();
} }
} }

View File

@@ -11,9 +11,8 @@ package org.eclipse.hawkbit.ui.distributions.dstable;
import java.util.Collections; import java.util.Collections;
import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.model.MetaData; import org.eclipse.hawkbit.repository.model.MetaData;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.providers.DsMetaDataDataProvider; import org.eclipse.hawkbit.ui.common.data.providers.DsMetaDataDataProvider;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData;
@@ -25,9 +24,6 @@ import org.eclipse.hawkbit.ui.common.detailslayout.UpdateMetaDataWindowControlle
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType; import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Class for metadata add/update window layout. * Class for metadata add/update window layout.
@@ -36,7 +32,6 @@ public class DsMetaDataWindowLayout extends AbstractMetaDataWindowLayout<Long> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final transient DistributionSetManagement dsManagement; private final transient DistributionSetManagement dsManagement;
private final transient EntityFactory entityFactory;
private final MetaDataWindowGrid<Long> dsMetaDataWindowGrid; private final MetaDataWindowGrid<Long> dsMetaDataWindowGrid;
@@ -47,35 +42,25 @@ public class DsMetaDataWindowLayout extends AbstractMetaDataWindowLayout<Long> {
/** /**
* Constructor for AbstractTagWindowLayout * Constructor for AbstractTagWindowLayout
* *
* @param i18n * @param uiDependencies
* I18N * {@link CommonUiDependencies}
* @param eventBus
* UIEventBus
* @param permChecker
* SpPermissionChecker
* @param uiNotification
* UINotification
* @param entityFactory
* EntityFactory
* @param dsManagement * @param dsManagement
* DistributionSetManagement * DistributionSetManagement
*/ */
public DsMetaDataWindowLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, public DsMetaDataWindowLayout(final CommonUiDependencies uiDependencies,
final SpPermissionChecker permChecker, final UINotification uiNotification, final DistributionSetManagement dsManagement) {
final EntityFactory entityFactory, final DistributionSetManagement dsManagement) { super(uiDependencies);
super(i18n, eventBus, uiNotification, permChecker);
this.dsManagement = dsManagement; this.dsManagement = dsManagement;
this.entityFactory = entityFactory;
this.dsMetaDataWindowGrid = new MetaDataWindowGrid<>(i18n, eventBus, permChecker, uiNotification, this.dsMetaDataWindowGrid = new MetaDataWindowGrid<>(uiDependencies, new DsMetaDataDataProvider(dsManagement),
new DsMetaDataDataProvider(dsManagement), this::hasMetadataChangePermission, this::deleteMetaData); this::hasMetadataChangePermission,this::deleteMetaData);
this.metaDataAddUpdateWindowLayout = new MetaDataAddUpdateWindowLayout(i18n, this::hasMetadataChangePermission); this.metaDataAddUpdateWindowLayout = new MetaDataAddUpdateWindowLayout(i18n,this::hasMetadataChangePermission);
this.addDsMetaDataWindowController = new AddMetaDataWindowController(i18n, uiNotification, this.addDsMetaDataWindowController = new AddMetaDataWindowController(uiDependencies,
metaDataAddUpdateWindowLayout, this::createMetaData, this::isDuplicate); metaDataAddUpdateWindowLayout, this::createMetaData, this::isDuplicate);
this.updateDsMetaDataWindowController = new UpdateMetaDataWindowController(i18n, uiNotification, this.updateDsMetaDataWindowController = new UpdateMetaDataWindowController(uiDependencies,
metaDataAddUpdateWindowLayout, this::updateMetaData); metaDataAddUpdateWindowLayout, this::updateMetaData, this::isDuplicate);
buildLayout(); buildLayout();
addGridSelectionListener(); addGridSelectionListener();

View File

@@ -0,0 +1,48 @@
/**
* Copyright (c) 2020 Bosch.IO 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.distributions.dstable;
import java.util.function.BooleanSupplier;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.EntityValidator;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.springframework.util.StringUtils;
/**
* Validator used in target window controllers to validate {@link ProxyDistributionSet}.
*/
public class ProxyDsValidator extends EntityValidator {
/**
* Constructor
*
* @param uiDependencies
* {@link CommonUiDependencies}
*/
public ProxyDsValidator(final CommonUiDependencies uiDependencies) {
super(uiDependencies);
}
boolean isEntityValid(final ProxyDistributionSet entity, final BooleanSupplier duplicateCheck) {
if (!StringUtils.hasText(entity.getName()) || !StringUtils.hasText(entity.getVersion())) {
displayValidationError("message.error.missing.nameorversion");
return false;
}
final String trimmedName = StringUtils.trimWhitespace(entity.getName());
final String trimmedVersion = StringUtils.trimWhitespace(entity.getVersion());
if (duplicateCheck.getAsBoolean()) {
displayValidationError("message.duplicate.dist", trimmedName, trimmedVersion);
return false;
}
return true;
}
}

View File

@@ -9,72 +9,46 @@
package org.eclipse.hawkbit.ui.distributions.dstable; package org.eclipse.hawkbit.ui.distributions.dstable;
import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.builder.DistributionSetUpdate; import org.eclipse.hawkbit.repository.builder.DistributionSetUpdate;
import org.eclipse.hawkbit.repository.exception.EntityNotFoundException;
import org.eclipse.hawkbit.repository.exception.EntityReadOnlyException;
import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; import org.eclipse.hawkbit.ui.common.AbstractUpdateNamedEntityWindowController;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.EntityWindowLayout;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil;
import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Controller for update distribution set window * Controller for update distribution set window
*/ */
public class UpdateDsWindowController public class UpdateDsWindowController
extends AbstractEntityWindowController<ProxyDistributionSet, ProxyDistributionSet> { extends AbstractUpdateNamedEntityWindowController<ProxyDistributionSet, ProxyDistributionSet, DistributionSet> {
private static final Logger LOG = LoggerFactory.getLogger(UpdateDsWindowController.class);
private final VaadinMessageSource i18n;
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final DistributionSetManagement dsManagement; private final DistributionSetManagement dsManagement;
private final DsWindowLayout layout; private final DsWindowLayout layout;
private final ProxyDsValidator validator;
private String nameBeforeEdit;
private String versionBeforeEdit;
/** /**
* Constructor for UpdateDsWindowController * Constructor for UpdateDsWindowController
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param dsManagement * @param dsManagement
* DistributionSetManagement * DistributionSetManagement
* @param layout * @param layout
* DsWindowLayout * DsWindowLayout
*/ */
public UpdateDsWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, public UpdateDsWindowController(final CommonUiDependencies uiDependencies,
final UIEventBus eventBus, final UINotification uiNotification,
final DistributionSetManagement dsManagement, final DsWindowLayout layout) { final DistributionSetManagement dsManagement, final DsWindowLayout layout) {
this.i18n = i18n; super(uiDependencies);
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.dsManagement = dsManagement; this.dsManagement = dsManagement;
this.layout = layout; this.layout = layout;
} this.validator = new ProxyDsValidator(uiDependencies);
@Override
public AbstractEntityWindowLayout<ProxyDistributionSet> getLayout() {
return layout;
} }
@Override @Override
@@ -88,50 +62,54 @@ public class UpdateDsWindowController
ds.setDescription(proxyEntity.getDescription()); ds.setDescription(proxyEntity.getDescription());
ds.setRequiredMigrationStep(proxyEntity.isRequiredMigrationStep()); ds.setRequiredMigrationStep(proxyEntity.isRequiredMigrationStep());
nameBeforeEdit = proxyEntity.getName();
versionBeforeEdit = proxyEntity.getVersion();
return ds; return ds;
} }
@Override
public EntityWindowLayout<ProxyDistributionSet> getLayout() {
return layout;
}
@Override @Override
protected void adaptLayout(final ProxyDistributionSet proxyEntity) { protected void adaptLayout(final ProxyDistributionSet proxyEntity) {
layout.disableDsTypeSelect(); layout.disableDsTypeSelect();
} }
@Override @Override
protected void persistEntity(final ProxyDistributionSet entity) { protected DistributionSet persistEntityInRepository(final ProxyDistributionSet entity) {
final DistributionSetUpdate dsUpdate = entityFactory.distributionSet().update(entity.getId()) final DistributionSetUpdate dsUpdate = getEntityFactory().distributionSet().update(entity.getId())
.name(entity.getName()).version(entity.getVersion()).description(entity.getDescription()) .name(entity.getName()).version(entity.getVersion()).description(entity.getDescription())
.requiredMigrationStep(entity.isRequiredMigrationStep()); .requiredMigrationStep(entity.isRequiredMigrationStep());
return dsManagement.update(dsUpdate);
}
try { @Override
final DistributionSet updatedDs = dsManagement.update(dsUpdate); protected String getDisplayableName(final DistributionSet entity) {
return HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion());
}
uiNotification.displaySuccess( @Override
i18n.getMessage("message.update.success", updatedDs.getName() + ":" + updatedDs.getVersion())); protected String getDisplayableNameForFailedMessage(final ProxyDistributionSet entity) {
eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( return HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion());
EntityModifiedEventType.ENTITY_UPDATED, ProxyDistributionSet.class, updatedDs.getId())); }
} catch (final EntityNotFoundException | EntityReadOnlyException e) {
LOG.trace("Update of distribution set failed in UI: {}", e.getMessage()); @Override
final String entityType = i18n.getMessage("caption.distribution"); protected Class<? extends ProxyIdentifiableEntity> getEntityClass() {
uiNotification return ProxyDistributionSet.class;
.displayWarning(i18n.getMessage("message.deleted.or.notAllowed", entityType, entity.getName()));
}
} }
@Override @Override
protected boolean isEntityValid(final ProxyDistributionSet entity) { protected boolean isEntityValid(final ProxyDistributionSet entity) {
if (!StringUtils.hasText(entity.getName()) || !StringUtils.hasText(entity.getVersion())) {
uiNotification.displayValidationError(i18n.getMessage("message.error.missing.nameorversion"));
return false;
}
final String trimmedName = StringUtils.trimWhitespace(entity.getName()); final String trimmedName = StringUtils.trimWhitespace(entity.getName());
final String trimmedVersion = StringUtils.trimWhitespace(entity.getVersion()); final String trimmedVersion = StringUtils.trimWhitespace(entity.getVersion());
if (dsManagement.getByNameAndVersion(trimmedName, trimmedVersion).isPresent()) { return validator.isEntityValid(entity, () -> hasNameOrVersionChanged(trimmedName, trimmedVersion)
uiNotification && dsManagement.getByNameAndVersion(trimmedName, trimmedVersion).isPresent());
.displayValidationError(i18n.getMessage("message.duplicate.dist", trimmedName, trimmedVersion)); }
return false;
}
return true; private boolean hasNameOrVersionChanged(final String trimmedName, final String trimmedVersion) {
return !nameBeforeEdit.equals(trimmedName) || !versionBeforeEdit.equals(trimmedVersion);
} }
} }

View File

@@ -13,14 +13,11 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import org.eclipse.hawkbit.repository.ArtifactManagement; import org.eclipse.hawkbit.repository.ArtifactManagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SoftwareModuleManagement;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.artifacts.smtable.SmMetaDataWindowBuilder;
import org.eclipse.hawkbit.ui.artifacts.smtable.SmWindowBuilder;
import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleGrid; import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleGrid;
import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleGridHeader; import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleGridHeader;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.eclipse.hawkbit.ui.common.detailslayout.SoftwareModuleDetails; import org.eclipse.hawkbit.ui.common.detailslayout.SoftwareModuleDetails;
@@ -29,7 +26,6 @@ import org.eclipse.hawkbit.ui.common.event.EventLayout;
import org.eclipse.hawkbit.ui.common.event.EventLayoutViewAware; import org.eclipse.hawkbit.ui.common.event.EventLayoutViewAware;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.event.EventViewAware; import org.eclipse.hawkbit.ui.common.event.EventViewAware;
import org.eclipse.hawkbit.ui.common.layout.AbstractGridComponentLayout;
import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent; import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent;
import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener; import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener;
import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener.EntityModifiedAwareSupport; import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener.EntityModifiedAwareSupport;
@@ -38,16 +34,14 @@ import org.eclipse.hawkbit.ui.common.layout.listener.SelectGridEntityListener;
import org.eclipse.hawkbit.ui.common.layout.listener.SelectionChangedListener; import org.eclipse.hawkbit.ui.common.layout.listener.SelectionChangedListener;
import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGridRefreshAwareSupport; import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGridRefreshAwareSupport;
import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedSelectionAwareSupport; import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedSelectionAwareSupport;
import org.eclipse.hawkbit.ui.common.softwaremodule.AbstractSoftwareModuleGridLayout;
import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState; import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState;
import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState; import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Implementation of software module Layout on the Distribution View * Implementation of software module Layout on the Distribution View
*/ */
public class SwModuleGridLayout extends AbstractGridComponentLayout { public class SwModuleGridLayout extends AbstractSoftwareModuleGridLayout {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final SoftwareModuleGridHeader swModuleGridHeader; private final SoftwareModuleGridHeader swModuleGridHeader;
@@ -55,29 +49,15 @@ public class SwModuleGridLayout extends AbstractGridComponentLayout {
private final SoftwareModuleDetailsHeader softwareModuleDetailsHeader; private final SoftwareModuleDetailsHeader softwareModuleDetailsHeader;
private final SoftwareModuleDetails swModuleDetails; private final SoftwareModuleDetails swModuleDetails;
private final transient FilterChangedListener<ProxySoftwareModule> smFilterListener;
private final transient SelectionChangedListener<ProxyDistributionSet> masterDsChangedListener;
private final transient SelectionChangedListener<ProxySoftwareModule> masterSmChangedListener;
private final transient SelectGridEntityListener<ProxySoftwareModule> selectSmListener;
private final transient EntityModifiedListener<ProxySoftwareModule> smModifiedListener;
/** /**
* Constructor for SwModuleGridLayout * Constructor for SwModuleGridLayout
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param uiNotification
* UINotification
* @param eventBus
* UIEventBus
* @param softwareModuleManagement * @param softwareModuleManagement
* SoftwareModuleManagement * SoftwareModuleManagement
* @param softwareModuleTypeManagement * @param softwareModuleTypeManagement
* SoftwareModuleTypeManagement * SoftwareModuleTypeManagement
* @param entityFactory
* EntityFactory
* @param permChecker
* SpPermissionChecker
* @param artifactManagement * @param artifactManagement
* ArtifactManagement * ArtifactManagement
* @param smTypeFilterLayoutUiState * @param smTypeFilterLayoutUiState
@@ -85,48 +65,39 @@ public class SwModuleGridLayout extends AbstractGridComponentLayout {
* @param swModuleGridLayoutUiState * @param swModuleGridLayoutUiState
* GridLayoutUiState * GridLayoutUiState
*/ */
public SwModuleGridLayout(final VaadinMessageSource i18n, final UINotification uiNotification, public SwModuleGridLayout(final CommonUiDependencies uiDependencies, final SoftwareModuleManagement softwareModuleManagement,
final UIEventBus eventBus, final SoftwareModuleManagement softwareModuleManagement, final SoftwareModuleTypeManagement softwareModuleTypeManagement,
final SoftwareModuleTypeManagement softwareModuleTypeManagement, final EntityFactory entityFactory, final ArtifactManagement artifactManagement, final TypeFilterLayoutUiState smTypeFilterLayoutUiState,
final SpPermissionChecker permChecker, final ArtifactManagement artifactManagement,
final TypeFilterLayoutUiState smTypeFilterLayoutUiState,
final GridLayoutUiState swModuleGridLayoutUiState) { final GridLayoutUiState swModuleGridLayoutUiState) {
super(); super(uiDependencies, softwareModuleManagement, softwareModuleTypeManagement, EventView.DISTRIBUTIONS);
final SmWindowBuilder smWindowBuilder = new SmWindowBuilder(i18n, entityFactory, eventBus, uiNotification, this.swModuleGridHeader = new SoftwareModuleGridHeader(uiDependencies, smTypeFilterLayoutUiState,
softwareModuleManagement, softwareModuleTypeManagement, EventView.DISTRIBUTIONS); swModuleGridLayoutUiState, getSmWindowBuilder(), getEventView());
final SmMetaDataWindowBuilder smMetaDataWindowBuilder = new SmMetaDataWindowBuilder(i18n, entityFactory,
eventBus, uiNotification, permChecker, softwareModuleManagement);
this.swModuleGridHeader = new SoftwareModuleGridHeader(i18n, permChecker, eventBus, smTypeFilterLayoutUiState,
swModuleGridLayoutUiState, smWindowBuilder, EventView.DISTRIBUTIONS);
this.swModuleGridHeader.buildHeader(); this.swModuleGridHeader.buildHeader();
this.swModuleGrid = new SoftwareModuleGrid(eventBus, i18n, permChecker, uiNotification, this.swModuleGrid = new SoftwareModuleGrid(uiDependencies, smTypeFilterLayoutUiState, swModuleGridLayoutUiState,
smTypeFilterLayoutUiState, swModuleGridLayoutUiState, softwareModuleManagement, softwareModuleManagement, getEventView());
EventView.DISTRIBUTIONS);
this.swModuleGrid.addDragAndDropSupport(); this.swModuleGrid.addDragAndDropSupport();
this.swModuleGrid.addMasterSupport(); this.swModuleGrid.addMasterSupport();
this.swModuleGrid.init(); this.swModuleGrid.init();
this.softwareModuleDetailsHeader = new SoftwareModuleDetailsHeader(i18n, permChecker, eventBus, uiNotification, this.softwareModuleDetailsHeader = new SoftwareModuleDetailsHeader(uiDependencies, getSmWindowBuilder(),
smWindowBuilder, smMetaDataWindowBuilder); getSmMetaDataWindowBuilder());
this.softwareModuleDetailsHeader.addArtifactDetailsHeaderSupport(artifactManagement); this.softwareModuleDetailsHeader.addArtifactDetailsHeaderSupport(artifactManagement);
this.softwareModuleDetailsHeader.buildHeader(); this.softwareModuleDetailsHeader.buildHeader();
this.swModuleDetails = new SoftwareModuleDetails(i18n, eventBus, softwareModuleManagement, this.swModuleDetails = new SoftwareModuleDetails(uiDependencies, softwareModuleManagement,
softwareModuleTypeManagement, smMetaDataWindowBuilder); softwareModuleTypeManagement, getSmMetaDataWindowBuilder());
this.swModuleDetails.buildDetails(); this.swModuleDetails.buildDetails();
this.smFilterListener = new FilterChangedListener<>(eventBus, ProxySoftwareModule.class, addEventListener(new FilterChangedListener<>(uiDependencies.getEventBus(), ProxySoftwareModule.class,
new EventViewAware(EventView.DISTRIBUTIONS), swModuleGrid.getFilterSupport()); new EventViewAware(getEventView()), swModuleGrid.getFilterSupport()));
this.masterDsChangedListener = new SelectionChangedListener<>(eventBus, addEventListener(new SelectionChangedListener<>(uiDependencies.getEventBus(),
new EventLayoutViewAware(EventLayout.DS_LIST, EventView.DISTRIBUTIONS), getMasterDsAwareComponents()); new EventLayoutViewAware(EventLayout.DS_LIST, getEventView()), getMasterDsAwareComponents()));
this.masterSmChangedListener = new SelectionChangedListener<>(eventBus, addEventListener(new SelectionChangedListener<>(uiDependencies.getEventBus(),
new EventLayoutViewAware(EventLayout.SM_LIST, EventView.DISTRIBUTIONS), getMasterSmAwareComponents()); new EventLayoutViewAware(EventLayout.SM_LIST, getEventView()), getMasterSmAwareComponents()));
this.selectSmListener = new SelectGridEntityListener<>(eventBus, addEventListener(new SelectGridEntityListener<>(uiDependencies.getEventBus(),
new EventLayoutViewAware(EventLayout.SM_LIST, EventView.DISTRIBUTIONS), new EventLayoutViewAware(EventLayout.SM_LIST, getEventView()), swModuleGrid.getSelectionSupport()));
swModuleGrid.getSelectionSupport()); addEventListener(new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxySoftwareModule.class)
this.smModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxySoftwareModule.class) .entityModifiedAwareSupports(getSmModifiedAwareSupports()).build());
.entityModifiedAwareSupports(getSmModifiedAwareSupports()).build();
buildLayout(swModuleGridHeader, swModuleGrid, softwareModuleDetailsHeader, swModuleDetails); buildLayout(swModuleGridHeader, swModuleGrid, softwareModuleDetailsHeader, swModuleDetails);
} }
@@ -145,52 +116,13 @@ public class SwModuleGridLayout extends AbstractGridComponentLayout {
swModuleGrid::mapIdToProxyEntity)); swModuleGrid::mapIdToProxyEntity));
} }
/** @Override
* Show software type module header icon protected SoftwareModuleGridHeader getSoftwareModuleGridHeader() {
*/ return swModuleGridHeader;
public void showSmTypeHeaderIcon() {
swModuleGridHeader.showFilterIcon();
} }
/** @Override
* Hide software type module header icon protected SoftwareModuleGrid getSoftwareModuleGrid() {
*/ return swModuleGrid;
public void hideSmTypeHeaderIcon() {
swModuleGridHeader.hideFilterIcon();
}
/**
* Maximize the software module grid
*/
public void maximize() {
swModuleGrid.createMaximizedContent();
hideDetailsLayout();
}
/**
* Minimize the software module grid
*/
public void minimize() {
swModuleGrid.createMinimizedContent();
showDetailsLayout();
}
/**
* Restore the software module grid and header
*/
public void restoreState() {
swModuleGridHeader.restoreState();
swModuleGrid.restoreState();
}
/**
* Unsubscribe the event listener
*/
public void unsubscribeListener() {
smFilterListener.unsubscribe();
masterDsChangedListener.unsubscribe();
masterSmChangedListener.unsubscribe();
selectSmListener.unsubscribe();
smModifiedListener.unsubscribe();
} }
} }

View File

@@ -8,123 +8,45 @@
*/ */
package org.eclipse.hawkbit.ui.distributions.smtype.filter; package org.eclipse.hawkbit.ui.distributions.smtype.filter;
import java.util.Arrays;
import java.util.List;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.artifacts.smtype.filter.SMTypeFilterLayout;
import org.eclipse.hawkbit.ui.artifacts.smtype.SmTypeWindowBuilder; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.artifacts.smtype.filter.SMTypeFilterButtons;
import org.eclipse.hawkbit.ui.artifacts.smtype.filter.SMTypeFilterHeader;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType;
import org.eclipse.hawkbit.ui.common.event.EventLayout;
import org.eclipse.hawkbit.ui.common.event.EventLayoutViewAware;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.filterlayout.AbstractFilterLayout;
import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener;
import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener.EntityModifiedAwareSupport;
import org.eclipse.hawkbit.ui.common.layout.listener.GridActionsVisibilityListener;
import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGenericSupport;
import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGridRefreshAwareSupport;
import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState; import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.ComponentContainer;
/** /**
* Software Module Type filter layout. * Software Module Type filter layout.
*/ */
public class DistSMTypeFilterLayout extends AbstractFilterLayout { public class DistSMTypeFilterLayout extends SMTypeFilterLayout {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final SMTypeFilterHeader smTypeFilterHeader;
private final SMTypeFilterButtons smTypeFilterButtons;
private final transient GridActionsVisibilityListener gridActionsVisibilityListener;
private final transient EntityModifiedListener<ProxyType> entityModifiedListener;
private final transient SmTypeCssStylesHandler smTypeCssStylesHandler; private final transient SmTypeCssStylesHandler smTypeCssStylesHandler;
/** /**
* Constructor * Constructor
* *
* @param eventBus * @param uiDependencies
* UIEventBus * {@link CommonUiDependencies}
* @param i18n
* VaadinMessageSource
* @param permChecker
* SpPermissionChecker
* @param entityFactory
* EntityFactory
* @param uiNotification
* UINotification
* @param softwareModuleTypeManagement * @param softwareModuleTypeManagement
* SoftwareModuleTypeManagement * SoftwareModuleTypeManagement
* @param smTypeFilterLayoutUiState * @param smTypeFilterLayoutUiState
* TypeFilterLayoutUiState * TypeFilterLayoutUiState
*/ */
public DistSMTypeFilterLayout(final UIEventBus eventBus, final VaadinMessageSource i18n, public DistSMTypeFilterLayout(final CommonUiDependencies uiDependencies,
final SpPermissionChecker permChecker, final EntityFactory entityFactory, final SoftwareModuleTypeManagement softwareModuleTypeManagement,
final UINotification uiNotification, final SoftwareModuleTypeManagement softwareModuleTypeManagement,
final TypeFilterLayoutUiState smTypeFilterLayoutUiState) { final TypeFilterLayoutUiState smTypeFilterLayoutUiState) {
final SmTypeWindowBuilder smTypeWindowBuilder = new SmTypeWindowBuilder(i18n, entityFactory, eventBus, super(uiDependencies, softwareModuleTypeManagement, smTypeFilterLayoutUiState, EventView.DISTRIBUTIONS);
uiNotification, softwareModuleTypeManagement);
this.smTypeFilterHeader = new SMTypeFilterHeader(eventBus, i18n, permChecker, smTypeWindowBuilder,
smTypeFilterLayoutUiState, EventView.DISTRIBUTIONS);
this.smTypeFilterButtons = new SMTypeFilterButtons(eventBus, i18n, uiNotification, permChecker,
softwareModuleTypeManagement, smTypeWindowBuilder, smTypeFilterLayoutUiState, EventView.DISTRIBUTIONS);
this.gridActionsVisibilityListener = new GridActionsVisibilityListener(eventBus,
new EventLayoutViewAware(EventLayout.SM_TYPE_FILTER, EventView.DISTRIBUTIONS),
smTypeFilterButtons::hideActionColumns, smTypeFilterButtons::showEditColumn,
smTypeFilterButtons::showDeleteColumn);
this.entityModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyType.class)
.entityModifiedAwareSupports(getEntityModifiedAwareSupports())
.parentEntityType(ProxySoftwareModule.class).build();
this.smTypeCssStylesHandler = new SmTypeCssStylesHandler(softwareModuleTypeManagement); this.smTypeCssStylesHandler = new SmTypeCssStylesHandler(softwareModuleTypeManagement);
this.smTypeCssStylesHandler.updateSmTypeStyles(); this.smTypeCssStylesHandler.updateSmTypeStyles();
buildLayout(); // buildLayout(); was already called in super(...)
}
private List<EntityModifiedAwareSupport> getEntityModifiedAwareSupports() {
return Arrays.asList(EntityModifiedGridRefreshAwareSupport.of(this::refreshFilterButtons),
EntityModifiedGenericSupport.of(null, null, smTypeFilterButtons::resetFilterOnTypesDeleted));
}
private void refreshFilterButtons() {
smTypeFilterButtons.refreshAll();
smTypeCssStylesHandler.updateSmTypeStyles();
} }
@Override @Override
protected SMTypeFilterHeader getFilterHeader() { protected void refreshFilterButtons() {
return smTypeFilterHeader; super.refreshFilterButtons();
}
@Override this.smTypeCssStylesHandler.updateSmTypeStyles();
protected ComponentContainer getFilterContent() {
return wrapFilterContent(smTypeFilterButtons);
}
/**
* Restore the software module type filter button
*/
public void restoreState() {
smTypeFilterButtons.restoreState();
}
/**
* Unsubscribe the event listener
*/
public void unsubscribeListener() {
gridActionsVisibilityListener.unsubscribe();
entityModifiedListener.unsubscribe();
} }
} }

View File

@@ -8,19 +8,14 @@
*/ */
package org.eclipse.hawkbit.ui.filtermanagement; package org.eclipse.hawkbit.ui.filtermanagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
import org.eclipse.hawkbit.repository.model.TargetFilterQuery; import org.eclipse.hawkbit.repository.model.TargetFilterQuery;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; import org.eclipse.hawkbit.ui.common.AbstractAddEntityWindowController;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.EntityWindowLayout;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Controller for add target filter * Controller for add target filter
@@ -29,54 +24,38 @@ import org.vaadin.spring.events.EventBus.UIEventBus;
* *
*/ */
public class AddTargetFilterController public class AddTargetFilterController
extends AbstractEntityWindowController<ProxyTargetFilterQuery, ProxyTargetFilterQuery> { extends AbstractAddEntityWindowController<ProxyTargetFilterQuery, ProxyTargetFilterQuery, TargetFilterQuery> {
private final VaadinMessageSource i18n;
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final TargetFilterQueryManagement targetFilterManagement; private final TargetFilterQueryManagement targetFilterManagement;
private final TargetFilterAddUpdateLayout layout; private final TargetFilterAddUpdateLayout layout;
private final Runnable closeFormCallback; private final Runnable closeFormCallback;
private final ProxyTargetFilterValidator validator;
/** /**
* Constructor for AddTargetFilterController * Constructor for AddTargetFilterController
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param targetFilterManagement * @param targetFilterManagement
* TargetFilterQueryManagement * TargetFilterQueryManagement
* @param layout * @param layout
* TargetFilterAddUpdateLayout * TargetFilterAddUpdateLayout
* @param closeFormCallback * @param closeFormCallback
* Runnable * Runnable
*/ */
public AddTargetFilterController(final VaadinMessageSource i18n, final EntityFactory entityFactory, public AddTargetFilterController(final CommonUiDependencies uiDependencies,
final UIEventBus eventBus, final UINotification uiNotification,
final TargetFilterQueryManagement targetFilterManagement, final TargetFilterAddUpdateLayout layout, final TargetFilterQueryManagement targetFilterManagement, final TargetFilterAddUpdateLayout layout,
final Runnable closeFormCallback) { final Runnable closeFormCallback) {
this.i18n = i18n; super(uiDependencies);
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.targetFilterManagement = targetFilterManagement; this.targetFilterManagement = targetFilterManagement;
this.layout = layout; this.layout = layout;
this.closeFormCallback = closeFormCallback; this.closeFormCallback = closeFormCallback;
this.validator = new ProxyTargetFilterValidator(uiDependencies);
} }
@Override @Override
public AbstractEntityWindowLayout<ProxyTargetFilterQuery> getLayout() { public EntityWindowLayout<ProxyTargetFilterQuery> getLayout() {
return layout; return layout;
} }
@@ -86,30 +65,39 @@ public class AddTargetFilterController
} }
@Override @Override
protected void persistEntity(final ProxyTargetFilterQuery entity) { protected TargetFilterQuery persistEntityInRepository(final ProxyTargetFilterQuery entity) {
final TargetFilterQuery newTargetFilter = targetFilterManagement return targetFilterManagement.create(
.create(entityFactory.targetFilterQuery().create().name(entity.getName()).query(entity.getQuery())); getEntityFactory().targetFilterQuery().create().name(entity.getName()).query(entity.getQuery()));
}
uiNotification.displaySuccess(i18n.getMessage("message.save.success", newTargetFilter.getName()));
eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload(
EntityModifiedEventType.ENTITY_ADDED, ProxyTargetFilterQuery.class, newTargetFilter.getId()));
@Override
protected void postPersist() {
closeFormCallback.run(); closeFormCallback.run();
} }
@Override
protected String getDisplayableName(final TargetFilterQuery entity) {
return entity.getName();
}
@Override
protected String getDisplayableNameForFailedMessage(final ProxyTargetFilterQuery entity) {
return entity.getName();
}
@Override
protected Long getId(final TargetFilterQuery entity) {
return entity.getId();
}
@Override
protected Class<? extends ProxyIdentifiableEntity> getEntityClass() {
return ProxyTargetFilterQuery.class;
}
@Override @Override
protected boolean isEntityValid(final ProxyTargetFilterQuery entity) { protected boolean isEntityValid(final ProxyTargetFilterQuery entity) {
if (!StringUtils.hasText(entity.getName())) {
uiNotification.displayValidationError(i18n.getMessage("message.error.missing.filtername"));
return false;
}
final String trimmedName = StringUtils.trimWhitespace(entity.getName()); final String trimmedName = StringUtils.trimWhitespace(entity.getName());
if (targetFilterManagement.getByName(trimmedName).isPresent()) { return validator.isEntityValid(entity, () -> targetFilterManagement.getByName(trimmedName).isPresent());
uiNotification.displayValidationError(i18n.getMessage("message.target.filter.duplicate", trimmedName));
return false;
}
return true;
} }
} }

View File

@@ -9,15 +9,12 @@
package org.eclipse.hawkbit.ui.filtermanagement; package org.eclipse.hawkbit.ui.filtermanagement;
import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetManagement;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder; import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
@@ -25,9 +22,6 @@ import com.vaadin.ui.Window;
* Builder for auto assignment window * Builder for auto assignment window
*/ */
public class AutoAssignmentWindowBuilder extends AbstractEntityWindowBuilder<ProxyTargetFilterQuery> { public class AutoAssignmentWindowBuilder extends AbstractEntityWindowBuilder<ProxyTargetFilterQuery> {
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final EntityFactory entityFactory;
private final TargetManagement targetManagement; private final TargetManagement targetManagement;
private final TargetFilterQueryManagement targetFilterQueryManagement; private final TargetFilterQueryManagement targetFilterQueryManagement;
@@ -36,30 +30,19 @@ public class AutoAssignmentWindowBuilder extends AbstractEntityWindowBuilder<Pro
/** /**
* Constructor for AutoAssignmentWindowBuilder * Constructor for AutoAssignmentWindowBuilder
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param targetManagement * @param targetManagement
* TargetManagement * TargetManagement
* @param targetFilterQueryManagement * @param targetFilterQueryManagement
* TargetFilterQueryManagement * TargetFilterQueryManagement
* @param dsManagement * @param dsManagement
* DistributionSetManagement * DistributionSetManagement
*/ */
public AutoAssignmentWindowBuilder(final VaadinMessageSource i18n, final UIEventBus eventBus, public AutoAssignmentWindowBuilder(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement,
final UINotification uiNotification, final EntityFactory entityFactory, final TargetFilterQueryManagement targetFilterQueryManagement,
final TargetManagement targetManagement, final TargetFilterQueryManagement targetFilterQueryManagement,
final DistributionSetManagement dsManagement) { final DistributionSetManagement dsManagement) {
super(i18n); super(uiDependencies);
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.entityFactory = entityFactory;
this.targetManagement = targetManagement; this.targetManagement = targetManagement;
this.targetFilterQueryManagement = targetFilterQueryManagement; this.targetFilterQueryManagement = targetFilterQueryManagement;
@@ -75,14 +58,13 @@ public class AutoAssignmentWindowBuilder extends AbstractEntityWindowBuilder<Pro
* Gets the auto assigment window * Gets the auto assigment window
* *
* @param proxyTargetFilter * @param proxyTargetFilter
* ProxyTargetFilterQuery * ProxyTargetFilterQuery
* *
* @return Common dialog window * @return Common dialog window
*/ */
public Window getWindowForAutoAssignment(final ProxyTargetFilterQuery proxyTargetFilter) { public Window getWindowForAutoAssignment(final ProxyTargetFilterQuery proxyTargetFilter) {
return getWindowForEntity(proxyTargetFilter, return getWindowForEntity(proxyTargetFilter, new AutoAssignmentWindowController(uiDependencies, targetManagement,
new AutoAssignmentWindowController(i18n, eventBus, uiNotification, entityFactory, targetManagement, targetFilterQueryManagement, new AutoAssignmentWindowLayout(getI18n(), dsManagement)));
targetFilterQueryManagement, new AutoAssignmentWindowLayout(i18n, dsManagement)));
} }
@Override @Override

View File

@@ -8,22 +8,18 @@
*/ */
package org.eclipse.hawkbit.ui.filtermanagement; package org.eclipse.hawkbit.ui.filtermanagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetManagement;
import org.eclipse.hawkbit.repository.model.Action.ActionType; import org.eclipse.hawkbit.repository.model.Action.ActionType;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; import org.eclipse.hawkbit.repository.model.TargetFilterQuery;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; import org.eclipse.hawkbit.ui.common.AbstractUpdateEntityWindowController;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.ConfirmationDialog; import org.eclipse.hawkbit.ui.common.ConfirmationDialog;
import org.eclipse.hawkbit.ui.common.EntityWindowLayout;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.server.Sizeable; import com.vaadin.server.Sizeable;
import com.vaadin.ui.UI; import com.vaadin.ui.UI;
@@ -31,29 +27,18 @@ import com.vaadin.ui.UI;
/** /**
* Controller for auto assignment window * Controller for auto assignment window
*/ */
public class AutoAssignmentWindowController public class AutoAssignmentWindowController extends
extends AbstractEntityWindowController<ProxyTargetFilterQuery, ProxyTargetFilterQuery> { AbstractUpdateEntityWindowController<ProxyTargetFilterQuery, ProxyTargetFilterQuery, TargetFilterQuery> {
private final VaadinMessageSource i18n;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final EntityFactory entityFactory;
private final TargetManagement targetManagement; private final TargetManagement targetManagement;
private final TargetFilterQueryManagement targetFilterQueryManagement; private final TargetFilterQueryManagement targetFilterQueryManagement;
private final AutoAssignmentWindowLayout layout; private final AutoAssignmentWindowLayout layout;
/** /**
* Constructor for AutoAssignmentWindowController * Constructor for AutoAssignmentWindowController
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param targetManagement * @param targetManagement
* TargetManagement * TargetManagement
* @param targetFilterQueryManagement * @param targetFilterQueryManagement
@@ -61,26 +46,16 @@ public class AutoAssignmentWindowController
* @param layout * @param layout
* AutoAssignmentWindowLayout * AutoAssignmentWindowLayout
*/ */
public AutoAssignmentWindowController(final VaadinMessageSource i18n, final UIEventBus eventBus, public AutoAssignmentWindowController(final CommonUiDependencies uiDependencies,
final UINotification uiNotification, final EntityFactory entityFactory,
final TargetManagement targetManagement, final TargetFilterQueryManagement targetFilterQueryManagement, final TargetManagement targetManagement, final TargetFilterQueryManagement targetFilterQueryManagement,
final AutoAssignmentWindowLayout layout) { final AutoAssignmentWindowLayout layout) {
this.i18n = i18n; super(uiDependencies);
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.entityFactory = entityFactory;
this.targetManagement = targetManagement; this.targetManagement = targetManagement;
this.targetFilterQueryManagement = targetFilterQueryManagement; this.targetFilterQueryManagement = targetFilterQueryManagement;
this.layout = layout; this.layout = layout;
} }
@Override
public AbstractEntityWindowLayout<ProxyTargetFilterQuery> getLayout() {
return layout;
}
@Override @Override
protected ProxyTargetFilterQuery buildEntityFromProxy(final ProxyTargetFilterQuery proxyEntity) { protected ProxyTargetFilterQuery buildEntityFromProxy(final ProxyTargetFilterQuery proxyEntity) {
final ProxyTargetFilterQuery autoAssignmentFilter = new ProxyTargetFilterQuery(); final ProxyTargetFilterQuery autoAssignmentFilter = new ProxyTargetFilterQuery();
@@ -101,6 +76,11 @@ public class AutoAssignmentWindowController
return autoAssignmentFilter; return autoAssignmentFilter;
} }
@Override
public EntityWindowLayout<ProxyTargetFilterQuery> getLayout() {
return layout;
}
@Override @Override
protected void adaptLayout(final ProxyTargetFilterQuery proxyEntity) { protected void adaptLayout(final ProxyTargetFilterQuery proxyEntity) {
layout.switchAutoAssignmentInputsVisibility(layout.getEntity().isAutoAssignmentEnabled()); layout.switchAutoAssignmentInputsVisibility(layout.getEntity().isAutoAssignmentEnabled());
@@ -108,36 +88,38 @@ public class AutoAssignmentWindowController
@Override @Override
protected void persistEntity(final ProxyTargetFilterQuery entity) { protected void persistEntity(final ProxyTargetFilterQuery entity) {
// super.persistEntity couldn't be used because of the two cases
// store/show dialog
if (entity.isAutoAssignmentEnabled() && entity.getDistributionSetInfo() != null) { if (entity.isAutoAssignmentEnabled() && entity.getDistributionSetInfo() != null) {
final Long autoAssignDsId = entity.getDistributionSetInfo().getId(); final Long autoAssignDsId = entity.getDistributionSetInfo().getId();
final Long targetsForAutoAssignmentCount = targetManagement.countByRsqlAndNonDS(autoAssignDsId, final Long targetsForAutoAssignmentCount = targetManagement.countByRsqlAndNonDS(autoAssignDsId,
entity.getQuery()); entity.getQuery());
final String confirmationCaption = i18n final String confirmationCaption = getI18n()
.getMessage(UIMessageIdProvider.CAPTION_CONFIRM_AUTO_ASSIGN_CONSEQUENCES); .getMessage(UIMessageIdProvider.CAPTION_CONFIRM_AUTO_ASSIGN_CONSEQUENCES);
final String confirmationQuestion = targetsForAutoAssignmentCount == 0 final String confirmationQuestion = targetsForAutoAssignmentCount == 0
? i18n.getMessage(UIMessageIdProvider.MESSAGE_CONFIRM_AUTO_ASSIGN_CONSEQUENCES_NONE) ? getI18n().getMessage(UIMessageIdProvider.MESSAGE_CONFIRM_AUTO_ASSIGN_CONSEQUENCES_NONE)
: i18n.getMessage(UIMessageIdProvider.MESSAGE_CONFIRM_AUTO_ASSIGN_CONSEQUENCES_TEXT, : getI18n().getMessage(UIMessageIdProvider.MESSAGE_CONFIRM_AUTO_ASSIGN_CONSEQUENCES_TEXT,
targetsForAutoAssignmentCount); targetsForAutoAssignmentCount);
showConsequencesDialog(confirmationCaption, confirmationQuestion, entity.getId(), autoAssignDsId, showConsequencesDialog(confirmationCaption, confirmationQuestion, entity.getId(), autoAssignDsId,
entity.getAutoAssignActionType(), entity); entity.getAutoAssignActionType());
} else { } else {
targetFilterQueryManagement final TargetFilterQuery targetFilterQuery = targetFilterQueryManagement.updateAutoAssignDS(
.updateAutoAssignDS(entityFactory.targetFilterQuery().updateAutoAssign(entity.getId()).ds(null)); getEntityFactory().targetFilterQuery().updateAutoAssign(entity.getId()).ds(null));
publishModifiedEvent(entity.getId()); publishModifiedEvent(createModifiedEventPayload(targetFilterQuery));
} }
} }
private void showConsequencesDialog(final String confirmationCaption, final String confirmationQuestion, private void showConsequencesDialog(final String confirmationCaption, final String confirmationQuestion,
final Long targetFilterId, final Long autoAssignDsId, final ActionType autoAssignActionType, final Long targetFilterId, final Long autoAssignDsId, final ActionType autoAssignActionType) {
final ProxyTargetFilterQuery entity) { final ConfirmationDialog confirmDialog = new ConfirmationDialog(getI18n(), confirmationCaption,
final ConfirmationDialog confirmDialog = new ConfirmationDialog(i18n, confirmationCaption, confirmationQuestion, confirmationQuestion, ok -> {
ok -> {
if (ok) { if (ok) {
targetFilterQueryManagement.updateAutoAssignDS(entityFactory.targetFilterQuery() final TargetFilterQuery targetFilterQuery = targetFilterQueryManagement.updateAutoAssignDS(
.updateAutoAssign(targetFilterId).ds(autoAssignDsId).actionType(autoAssignActionType)); getEntityFactory().targetFilterQuery().updateAutoAssign(targetFilterId)
publishModifiedEvent(entity.getId()); .ds(autoAssignDsId).actionType(autoAssignActionType));
publishModifiedEvent(createModifiedEventPayload(targetFilterQuery));
} }
}, UIComponentIdProvider.DIST_SET_SELECT_CONS_WINDOW_ID); }, UIComponentIdProvider.DIST_SET_SELECT_CONS_WINDOW_ID);
@@ -147,17 +129,52 @@ public class AutoAssignmentWindowController
confirmDialog.getWindow().bringToFront(); confirmDialog.getWindow().bringToFront();
} }
private void publishModifiedEvent(final Long entityId) { @Override
eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( protected TargetFilterQuery persistEntityInRepository(final ProxyTargetFilterQuery entity) {
EntityModifiedEventType.ENTITY_UPDATED, ProxyTargetFilterQuery.class, entityId)); // this subclass cares itself for persisting the entity because of
// special requirements (multiple confirmation dialogs).
return null;
}
@Override
protected String getDisplayableName(final TargetFilterQuery entity) {
return entity.getName();
}
@Override
protected String getDisplayableNameForFailedMessage(final ProxyTargetFilterQuery entity) {
return entity.getName();
}
@Override
protected Long getId(final TargetFilterQuery entity) {
return entity.getId();
}
@Override
protected String getPersistSuccessMessageKey() {
// this subclass cares itself for persisting the entity because of
// special requirements (multiple confirmation dialogs)
return null;
}
@Override
protected String getPersistFailureMessageKey() {
// this subclass cares itself for persisting the entity because of
// special requirements (multiple confirmation dialogs)
return null;
}
@Override
protected Class<? extends ProxyIdentifiableEntity> getEntityClass() {
return ProxyTargetFilterQuery.class;
} }
@Override @Override
protected boolean isEntityValid(final ProxyTargetFilterQuery entity) { protected boolean isEntityValid(final ProxyTargetFilterQuery entity) {
if (entity.isAutoAssignmentEnabled() if (entity.isAutoAssignmentEnabled()
&& (entity.getAutoAssignActionType() == null || entity.getDistributionSetInfo() == null)) { && (entity.getAutoAssignActionType() == null || entity.getDistributionSetInfo() == null)) {
uiNotification.displayValidationError( displayValidationError(UIMessageIdProvider.MESSAGE_AUTOASSIGN_CREATE_ERROR_MISSINGELEMENTS);
i18n.getMessage(UIMessageIdProvider.MESSAGE_AUTOASSIGN_CREATE_ERROR_MISSINGELEMENTS));
return false; return false;
} }

View File

@@ -22,6 +22,7 @@ import org.eclipse.hawkbit.repository.rsql.RsqlValidationOracle;
import org.eclipse.hawkbit.ui.AbstractHawkbitUI; import org.eclipse.hawkbit.ui.AbstractHawkbitUI;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.UiProperties; import org.eclipse.hawkbit.ui.UiProperties;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.event.EventViewAware; import org.eclipse.hawkbit.ui.common.event.EventViewAware;
@@ -65,13 +66,14 @@ public class FilterManagementView extends VerticalLayout implements View {
final TargetManagement targetManagement, final DistributionSetManagement distributionSetManagement) { final TargetManagement targetManagement, final DistributionSetManagement distributionSetManagement) {
this.filterManagementUIState = filterManagementUIState; this.filterManagementUIState = filterManagementUIState;
this.targetFilterGridLayout = new TargetFilterGridLayout(i18n, eventBus, permissionChecker, notification, final CommonUiDependencies uiDependencies = new CommonUiDependencies(i18n, entityFactory, eventBus, notification,
entityFactory, targetFilterQueryManagement, targetManagement, distributionSetManagement, permissionChecker);
filterManagementUIState);
this.targetFilterDetailsLayout = new TargetFilterDetailsLayout(i18n, permissionChecker, eventBus, notification, this.targetFilterGridLayout = new TargetFilterGridLayout(uiDependencies, targetFilterQueryManagement,
uiProperties, entityFactory, rsqlValidationOracle, targetManagement, targetFilterQueryManagement, targetManagement, distributionSetManagement, filterManagementUIState);
filterManagementUIState.getDetailsLayoutUiState());
this.targetFilterDetailsLayout = new TargetFilterDetailsLayout(uiDependencies, uiProperties, rsqlValidationOracle,
targetManagement, targetFilterQueryManagement, filterManagementUIState.getDetailsLayoutUiState());
final Map<EventLayout, VisibilityHandler> layoutVisibilityHandlers = new EnumMap<>(EventLayout.class); final Map<EventLayout, VisibilityHandler> layoutVisibilityHandlers = new EnumMap<>(EventLayout.class);
layoutVisibilityHandlers.put(EventLayout.TARGET_FILTER_QUERY_LIST, layoutVisibilityHandlers.put(EventLayout.TARGET_FILTER_QUERY_LIST,

View File

@@ -0,0 +1,48 @@
/**
* Copyright (c) 2020 Bosch.IO 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.filtermanagement;
import java.util.function.BooleanSupplier;
import org.eclipse.hawkbit.ui.common.EntityValidator;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery;
import org.springframework.util.StringUtils;
/**
* Validator used in targetfilter window controllers to validate
* {@link ProxyTargetFilterQuery}.
*/
public class ProxyTargetFilterValidator extends EntityValidator {
/**
* Constructor
*
* @param uiDependencies
* {@link CommonUiDependencies}
*/
public ProxyTargetFilterValidator(final CommonUiDependencies uiDependencies) {
super(uiDependencies);
}
boolean isEntityValid(final ProxyTargetFilterQuery entity, final BooleanSupplier duplicateCheck) {
if (!StringUtils.hasText(entity.getName())) {
displayValidationError("message.error.missing.filtername");
return false;
}
final String trimmedName = StringUtils.trimWhitespace(entity.getName());
if (duplicateCheck.getAsBoolean()) {
displayValidationError("message.target.filter.duplicate", trimmedName);
return false;
}
return true;
}
}

View File

@@ -8,12 +8,12 @@
*/ */
package org.eclipse.hawkbit.ui.filtermanagement; package org.eclipse.hawkbit.ui.filtermanagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
import org.eclipse.hawkbit.repository.model.TargetFilterQuery;
import org.eclipse.hawkbit.repository.rsql.RsqlValidationOracle; import org.eclipse.hawkbit.repository.rsql.RsqlValidationOracle;
import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.UiProperties; import org.eclipse.hawkbit.ui.UiProperties;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery;
import org.eclipse.hawkbit.ui.common.event.CommandTopics; import org.eclipse.hawkbit.ui.common.event.CommandTopics;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
@@ -26,9 +26,6 @@ import org.eclipse.hawkbit.ui.filtermanagement.state.TargetFilterDetailsLayoutUi
import org.eclipse.hawkbit.ui.filtermanagement.state.TargetFilterDetailsLayoutUiState.Mode; import org.eclipse.hawkbit.ui.filtermanagement.state.TargetFilterDetailsLayoutUiState.Mode;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Layout for Custom Filter view * Layout for Custom Filter view
@@ -47,16 +44,8 @@ public class TargetFilterDetailsGridHeader extends AbstractBreadcrumbGridHeader
/** /**
* Constructor for TargetFilterDetailsGridHeader * Constructor for TargetFilterDetailsGridHeader
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param permChecker
* SpPermissionChecker
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param entityFactory
* EntityFactory
* @param targetFilterManagement * @param targetFilterManagement
* TargetFilterQueryManagement * TargetFilterQueryManagement
* @param uiProperties * @param uiProperties
@@ -66,11 +55,10 @@ public class TargetFilterDetailsGridHeader extends AbstractBreadcrumbGridHeader
* @param uiState * @param uiState
* TargetFilterDetailsLayoutUiState * TargetFilterDetailsLayoutUiState
*/ */
public TargetFilterDetailsGridHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, public TargetFilterDetailsGridHeader(final CommonUiDependencies uiDependencies,
final UIEventBus eventBus, final UINotification uiNotification, final EntityFactory entityFactory,
final TargetFilterQueryManagement targetFilterManagement, final UiProperties uiProperties, final TargetFilterQueryManagement targetFilterManagement, final UiProperties uiProperties,
final RsqlValidationOracle rsqlValidationOracle, final TargetFilterDetailsLayoutUiState uiState) { final RsqlValidationOracle rsqlValidationOracle, final TargetFilterDetailsLayoutUiState uiState) {
super(i18n, permChecker, eventBus); super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus());
this.uiState = uiState; this.uiState = uiState;
@@ -84,10 +72,10 @@ public class TargetFilterDetailsGridHeader extends AbstractBreadcrumbGridHeader
this.targetFilterAddUpdateLayout = new TargetFilterAddUpdateLayout(i18n, permChecker, uiProperties, uiState, this.targetFilterAddUpdateLayout = new TargetFilterAddUpdateLayout(i18n, permChecker, uiProperties, uiState,
eventBus, rsqlValidationOracle); eventBus, rsqlValidationOracle);
this.addTargetFilterController = new AddTargetFilterController(i18n, entityFactory, eventBus, uiNotification, this.addTargetFilterController = new AddTargetFilterController(uiDependencies, targetFilterManagement,
targetFilterManagement, targetFilterAddUpdateLayout, this::closeDetails); targetFilterAddUpdateLayout, this::closeDetails);
this.updateTargetFilterController = new UpdateTargetFilterController(i18n, entityFactory, eventBus, this.updateTargetFilterController = new UpdateTargetFilterController(uiDependencies, targetFilterManagement,
uiNotification, targetFilterManagement, targetFilterAddUpdateLayout, this::closeDetails); targetFilterAddUpdateLayout, this::closeDetails);
buildHeader(); buildHeader();
} }
@@ -150,7 +138,7 @@ public class TargetFilterDetailsGridHeader extends AbstractBreadcrumbGridHeader
} }
private void showAddUpdateFilterLayout(final String captionMessage, private void showAddUpdateFilterLayout(final String captionMessage,
final AbstractEntityWindowController<ProxyTargetFilterQuery, ProxyTargetFilterQuery> controller, final AbstractEntityWindowController<ProxyTargetFilterQuery, ProxyTargetFilterQuery, TargetFilterQuery> controller,
final ProxyTargetFilterQuery proxyEntity) { final ProxyTargetFilterQuery proxyEntity) {
headerCaptionDetails.setValue(captionMessage); headerCaptionDetails.setValue(captionMessage);
controller.populateWithData(proxyEntity); controller.populateWithData(proxyEntity);

View File

@@ -8,12 +8,11 @@
*/ */
package org.eclipse.hawkbit.ui.filtermanagement; package org.eclipse.hawkbit.ui.filtermanagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetManagement;
import org.eclipse.hawkbit.repository.rsql.RsqlValidationOracle; import org.eclipse.hawkbit.repository.rsql.RsqlValidationOracle;
import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.UiProperties; import org.eclipse.hawkbit.ui.UiProperties;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
@@ -24,9 +23,6 @@ import org.eclipse.hawkbit.ui.common.layout.AbstractGridComponentLayout;
import org.eclipse.hawkbit.ui.common.layout.listener.FilterChangedListener; import org.eclipse.hawkbit.ui.common.layout.listener.FilterChangedListener;
import org.eclipse.hawkbit.ui.common.layout.listener.ShowEntityFormLayoutListener; import org.eclipse.hawkbit.ui.common.layout.listener.ShowEntityFormLayoutListener;
import org.eclipse.hawkbit.ui.filtermanagement.state.TargetFilterDetailsLayoutUiState; import org.eclipse.hawkbit.ui.filtermanagement.state.TargetFilterDetailsLayoutUiState;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* DistributionSet table layout. * DistributionSet table layout.
@@ -44,18 +40,10 @@ public class TargetFilterDetailsLayout extends AbstractGridComponentLayout {
/** /**
* TargetFilterDetailsLayout constructor * TargetFilterDetailsLayout constructor
* *
* @param i18n * @param uiDependencies
* MessageSource * {@link CommonUiDependencies}
* @param permChecker
* SpPermissionChecker
* @param eventBus
* Bus to publish UI events
* @param uiNotification
* helper to display messages
* @param uiProperties * @param uiProperties
* properties * properties
* @param entityFactory
* entity factory
* @param rsqlValidationOracle * @param rsqlValidationOracle
* to get RSQL validation and suggestions * to get RSQL validation and suggestions
* @param targetManagement * @param targetManagement
@@ -65,24 +53,23 @@ public class TargetFilterDetailsLayout extends AbstractGridComponentLayout {
* @param uiState * @param uiState
* to persist the user interaction * to persist the user interaction
*/ */
public TargetFilterDetailsLayout(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, public TargetFilterDetailsLayout(final CommonUiDependencies uiDependencies, final UiProperties uiProperties,
final UIEventBus eventBus, final UINotification uiNotification, final UiProperties uiProperties, final RsqlValidationOracle rsqlValidationOracle, final TargetManagement targetManagement,
final EntityFactory entityFactory, final RsqlValidationOracle rsqlValidationOracle, final TargetFilterQueryManagement targetFilterManagement, final TargetFilterDetailsLayoutUiState uiState) {
final TargetManagement targetManagement, final TargetFilterQueryManagement targetFilterManagement,
final TargetFilterDetailsLayoutUiState uiState) {
this.targetFilterDetailsGridHeader = new TargetFilterDetailsGridHeader(i18n, permChecker, eventBus, this.targetFilterDetailsGridHeader = new TargetFilterDetailsGridHeader(uiDependencies, targetFilterManagement,
uiNotification, entityFactory, targetFilterManagement, uiProperties, rsqlValidationOracle, uiState); uiProperties, rsqlValidationOracle, uiState);
this.targetFilterTargetGrid = new TargetFilterTargetGrid(i18n, eventBus, targetManagement, uiState); this.targetFilterTargetGrid = new TargetFilterTargetGrid(uiDependencies, targetManagement, uiState);
this.targetFilterCountMessageLabel = new TargetFilterCountMessageLabel(i18n); this.targetFilterCountMessageLabel = new TargetFilterCountMessageLabel(uiDependencies.getI18n());
initGridDataUpdatedListener(); initGridDataUpdatedListener();
this.showFilterQueryFormListener = new ShowEntityFormLayoutListener<>(eventBus, ProxyTargetFilterQuery.class, this.showFilterQueryFormListener = new ShowEntityFormLayoutListener<>(uiDependencies.getEventBus(),
ProxyTargetFilterQuery.class,
new EventLayoutViewAware(EventLayout.TARGET_FILTER_QUERY_FORM, EventView.TARGET_FILTER), new EventLayoutViewAware(EventLayout.TARGET_FILTER_QUERY_FORM, EventView.TARGET_FILTER),
targetFilterDetailsGridHeader::showAddFilterLayout, targetFilterDetailsGridHeader::showAddFilterLayout,
targetFilterDetailsGridHeader::showEditFilterLayout); targetFilterDetailsGridHeader::showEditFilterLayout);
this.targetFilterListener = new FilterChangedListener<>(eventBus, ProxyTarget.class, this.targetFilterListener = new FilterChangedListener<>(uiDependencies.getEventBus(), ProxyTarget.class,
new EventViewAware(EventView.TARGET_FILTER), targetFilterTargetGrid.getFilterSupport()); new EventViewAware(EventView.TARGET_FILTER), targetFilterTargetGrid.getFilterSupport());
buildLayout(targetFilterDetailsGridHeader, targetFilterTargetGrid, targetFilterCountMessageLabel); buildLayout(targetFilterDetailsGridHeader, targetFilterTargetGrid, targetFilterCountMessageLabel);

View File

@@ -13,7 +13,7 @@ import java.util.stream.Collectors;
import org.eclipse.hawkbit.im.authentication.SpPermission; import org.eclipse.hawkbit.im.authentication.SpPermission;
import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder; import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder;
import org.eclipse.hawkbit.ui.common.builder.StatusIconBuilder.ActionTypeIconSupplier; import org.eclipse.hawkbit.ui.common.builder.StatusIconBuilder.ActionTypeIconSupplier;
import org.eclipse.hawkbit.ui.common.data.mappers.TargetFilterQueryToProxyTargetFilterMapper; import org.eclipse.hawkbit.ui.common.data.mappers.TargetFilterQueryToProxyTargetFilterMapper;
@@ -35,9 +35,7 @@ import org.eclipse.hawkbit.ui.filtermanagement.state.TargetFilterGridLayoutUiSta
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification; import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.data.ValueProvider; import com.vaadin.data.ValueProvider;
import com.vaadin.server.Sizeable; import com.vaadin.server.Sizeable;
@@ -71,28 +69,21 @@ public class TargetFilterGrid extends AbstractGrid<ProxyTargetFilterQuery, Strin
/** /**
* Constructor for TargetFilterGrid * Constructor for TargetFilterGrid
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param notification
* UINotification
* @param eventBus
* UIEventBus
* @param uiState * @param uiState
* TargetFilterGridLayoutUiState * TargetFilterGridLayoutUiState
* @param targetFilterQueryManagement * @param targetFilterQueryManagement
* TargetFilterQueryManagement * TargetFilterQueryManagement
* @param permChecker
* SpPermissionChecker
* @param autoAssignmentWindowBuilder * @param autoAssignmentWindowBuilder
* AutoAssignmentWindowBuilder * AutoAssignmentWindowBuilder
*/ */
public TargetFilterGrid(final VaadinMessageSource i18n, final UINotification notification, public TargetFilterGrid(final CommonUiDependencies uiDependencies, final TargetFilterGridLayoutUiState uiState,
final UIEventBus eventBus, final TargetFilterGridLayoutUiState uiState, final TargetFilterQueryManagement targetFilterQueryManagement,
final TargetFilterQueryManagement targetFilterQueryManagement, final SpPermissionChecker permChecker,
final AutoAssignmentWindowBuilder autoAssignmentWindowBuilder) { final AutoAssignmentWindowBuilder autoAssignmentWindowBuilder) {
super(i18n, eventBus, permChecker); super(uiDependencies.getI18n(), uiDependencies.getEventBus(), uiDependencies.getPermChecker());
this.notification = notification; this.notification = uiDependencies.getUiNotification();
this.uiState = uiState; this.uiState = uiState;
this.targetFilterQueryManagement = targetFilterQueryManagement; this.targetFilterQueryManagement = targetFilterQueryManagement;
this.autoAssignmentWindowBuilder = autoAssignmentWindowBuilder; this.autoAssignmentWindowBuilder = autoAssignmentWindowBuilder;

View File

@@ -10,7 +10,7 @@ package org.eclipse.hawkbit.ui.filtermanagement;
import java.util.Arrays; import java.util.Arrays;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery;
import org.eclipse.hawkbit.ui.common.event.CommandTopics; import org.eclipse.hawkbit.ui.common.event.CommandTopics;
import org.eclipse.hawkbit.ui.common.event.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventTopics;
@@ -26,8 +26,6 @@ import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.filtermanagement.state.TargetFilterGridLayoutUiState; import org.eclipse.hawkbit.ui.filtermanagement.state.TargetFilterGridLayoutUiState;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.ui.Component; import com.vaadin.ui.Component;
@@ -45,18 +43,13 @@ public class TargetFilterGridHeader extends AbstractGridHeader {
/** /**
* Constructor for TargetFilterHeader * Constructor for TargetFilterHeader
* *
* @param eventBus * @param uiDependencies
* UIEventBus * {@link CommonUiDependencies}
* @param uiState * @param uiState
* TargetFilterGridLayoutUiState * TargetFilterGridLayoutUiState
* @param permissionChecker
* SpPermissionChecker
* @param i18n
* VaadinMessageSource
*/ */
public TargetFilterGridHeader(final UIEventBus eventBus, final TargetFilterGridLayoutUiState uiState, public TargetFilterGridHeader(final CommonUiDependencies uiDependencies, final TargetFilterGridLayoutUiState uiState) {
final SpPermissionChecker permissionChecker, final VaadinMessageSource i18n) { super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus());
super(i18n, permissionChecker, eventBus);
this.uiState = uiState; this.uiState = uiState;

View File

@@ -12,10 +12,9 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetManagement;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.event.EventViewAware; import org.eclipse.hawkbit.ui.common.event.EventViewAware;
@@ -25,9 +24,6 @@ import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener.Enti
import org.eclipse.hawkbit.ui.common.layout.listener.FilterChangedListener; import org.eclipse.hawkbit.ui.common.layout.listener.FilterChangedListener;
import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGridRefreshAwareSupport; import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGridRefreshAwareSupport;
import org.eclipse.hawkbit.ui.filtermanagement.state.FilterManagementUIState; import org.eclipse.hawkbit.ui.filtermanagement.state.FilterManagementUIState;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* TargetFilter table layout. * TargetFilter table layout.
@@ -44,16 +40,8 @@ public class TargetFilterGridLayout extends AbstractGridComponentLayout {
/** /**
* TargetFilterGridLayout constructor * TargetFilterGridLayout constructor
* *
* @param i18n * @param uiDependencies
* MessageSource * {@link CommonUiDependencies}
* @param eventBus
* Bus to publish UI events
* @param permissionChecker
* Checker for user permissions
* @param notification
* helper to display messages
* @param entityFactory
* entity factory
* @param targetFilterQueryManagement * @param targetFilterQueryManagement
* management to CRUD target filters * management to CRUD target filters
* @param targetManagement * @param targetManagement
@@ -63,25 +51,25 @@ public class TargetFilterGridLayout extends AbstractGridComponentLayout {
* @param filterManagementUIState * @param filterManagementUIState
* to persist the user interaction * to persist the user interaction
*/ */
public TargetFilterGridLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, public TargetFilterGridLayout(final CommonUiDependencies uiDependencies,
final SpPermissionChecker permissionChecker, final UINotification notification, final TargetFilterQueryManagement targetFilterQueryManagement, final TargetManagement targetManagement,
final EntityFactory entityFactory, final TargetFilterQueryManagement targetFilterQueryManagement, final DistributionSetManagement distributionSetManagement,
final TargetManagement targetManagement, final DistributionSetManagement distributionSetManagement,
final FilterManagementUIState filterManagementUIState) { final FilterManagementUIState filterManagementUIState) {
this.targetFilterGridHeader = new TargetFilterGridHeader(eventBus, this.targetFilterGridHeader = new TargetFilterGridHeader(uiDependencies,
filterManagementUIState.getGridLayoutUiState(), permissionChecker, i18n); filterManagementUIState.getGridLayoutUiState());
final AutoAssignmentWindowBuilder autoAssignmentWindowBuilder = new AutoAssignmentWindowBuilder(i18n, eventBus, final AutoAssignmentWindowBuilder autoAssignmentWindowBuilder = new AutoAssignmentWindowBuilder(uiDependencies,
notification, entityFactory, targetManagement, targetFilterQueryManagement, distributionSetManagement); targetManagement, targetFilterQueryManagement, distributionSetManagement);
this.targetFilterGrid = new TargetFilterGrid(i18n, notification, eventBus, this.targetFilterGrid = new TargetFilterGrid(uiDependencies, filterManagementUIState.getGridLayoutUiState(),
filterManagementUIState.getGridLayoutUiState(), targetFilterQueryManagement, permissionChecker, targetFilterQueryManagement, autoAssignmentWindowBuilder);
autoAssignmentWindowBuilder);
this.targetQueryFilterListener = new FilterChangedListener<>(eventBus, ProxyTargetFilterQuery.class, this.targetQueryFilterListener = new FilterChangedListener<>(uiDependencies.getEventBus(),
new EventViewAware(EventView.TARGET_FILTER), targetFilterGrid.getFilterSupport()); ProxyTargetFilterQuery.class, new EventViewAware(EventView.TARGET_FILTER),
this.filterQueryModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyTargetFilterQuery.class) targetFilterGrid.getFilterSupport());
.entityModifiedAwareSupports(getFilterQueryModifiedAwareSupports()).build(); this.filterQueryModifiedListener = new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(),
ProxyTargetFilterQuery.class).entityModifiedAwareSupports(getFilterQueryModifiedAwareSupports())
.build();
buildLayout(targetFilterGridHeader, targetFilterGrid); buildLayout(targetFilterGridHeader, targetFilterGrid);
} }

View File

@@ -9,6 +9,7 @@
package org.eclipse.hawkbit.ui.filtermanagement; package org.eclipse.hawkbit.ui.filtermanagement;
import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetManagement;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder; import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder;
import org.eclipse.hawkbit.ui.common.builder.StatusIconBuilder.TargetStatusIconSupplier; import org.eclipse.hawkbit.ui.common.builder.StatusIconBuilder.TargetStatusIconSupplier;
import org.eclipse.hawkbit.ui.common.data.mappers.TargetToProxyTargetMapper; import org.eclipse.hawkbit.ui.common.data.mappers.TargetToProxyTargetMapper;
@@ -19,8 +20,6 @@ import org.eclipse.hawkbit.ui.common.grid.AbstractGrid;
import org.eclipse.hawkbit.ui.common.grid.support.FilterSupport; import org.eclipse.hawkbit.ui.common.grid.support.FilterSupport;
import org.eclipse.hawkbit.ui.filtermanagement.state.TargetFilterDetailsLayoutUiState; import org.eclipse.hawkbit.ui.filtermanagement.state.TargetFilterDetailsLayoutUiState;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Shows the targets as a result of the executed filter query. * Shows the targets as a result of the executed filter query.
@@ -36,9 +35,9 @@ public class TargetFilterTargetGrid extends AbstractGrid<ProxyTarget, String> {
private final TargetFilterDetailsLayoutUiState uiState; private final TargetFilterDetailsLayoutUiState uiState;
TargetFilterTargetGrid(final VaadinMessageSource i18n, final UIEventBus eventBus, TargetFilterTargetGrid(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement,
final TargetManagement targetManagement, final TargetFilterDetailsLayoutUiState uiState) { final TargetFilterDetailsLayoutUiState uiState) {
super(i18n, eventBus); super(uiDependencies.getI18n(), uiDependencies.getEventBus());
this.uiState = uiState; this.uiState = uiState;

View File

@@ -8,82 +8,54 @@
*/ */
package org.eclipse.hawkbit.ui.filtermanagement; package org.eclipse.hawkbit.ui.filtermanagement;
import org.eclipse.hawkbit.repository.EntityFactory;
import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement;
import org.eclipse.hawkbit.repository.builder.TargetFilterQueryUpdate; import org.eclipse.hawkbit.repository.builder.TargetFilterQueryUpdate;
import org.eclipse.hawkbit.repository.exception.EntityNotFoundException;
import org.eclipse.hawkbit.repository.exception.EntityReadOnlyException;
import org.eclipse.hawkbit.repository.model.TargetFilterQuery; import org.eclipse.hawkbit.repository.model.TargetFilterQuery;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; import org.eclipse.hawkbit.ui.common.AbstractUpdateEntityWindowController;
import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.EntityWindowLayout;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTargetFilterQuery;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload;
import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload.EntityModifiedEventType;
import org.eclipse.hawkbit.ui.common.event.EventTopics;
import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Controller for update target filter * Controller for update target filter
*/ */
public class UpdateTargetFilterController public class UpdateTargetFilterController extends
extends AbstractEntityWindowController<ProxyTargetFilterQuery, ProxyTargetFilterQuery> { AbstractUpdateEntityWindowController<ProxyTargetFilterQuery, ProxyTargetFilterQuery, TargetFilterQuery> {
private static final Logger LOG = LoggerFactory.getLogger(UpdateTargetFilterController.class);
private final VaadinMessageSource i18n;
private final EntityFactory entityFactory;
private final UIEventBus eventBus;
private final UINotification uiNotification;
private final TargetFilterQueryManagement targetFilterManagement; private final TargetFilterQueryManagement targetFilterManagement;
private final TargetFilterAddUpdateLayout layout; private final TargetFilterAddUpdateLayout layout;
private final Runnable closeFormCallback; private final Runnable closeFormCallback;
private final ProxyTargetFilterValidator validator;
private String nameBeforeEdit; private String nameBeforeEdit;
/** /**
* Constructor for UpdateTargetFilterController * Constructor for UpdateTargetFilterController
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param entityFactory
* EntityFactory
* @param eventBus
* UIEventBus
* @param uiNotification
* UINotification
* @param targetFilterManagement * @param targetFilterManagement
* TargetFilterQueryManagement * TargetFilterQueryManagement
* @param layout * @param layout
* TargetFilterAddUpdateLayout * TargetFilterAddUpdateLayout
* @param closeFormCallback * @param closeFormCallback
* Runnable * Runnable
*/ */
public UpdateTargetFilterController(final VaadinMessageSource i18n, final EntityFactory entityFactory, public UpdateTargetFilterController(final CommonUiDependencies uiDependencies,
final UIEventBus eventBus, final UINotification uiNotification,
final TargetFilterQueryManagement targetFilterManagement, final TargetFilterAddUpdateLayout layout, final TargetFilterQueryManagement targetFilterManagement, final TargetFilterAddUpdateLayout layout,
final Runnable closeFormCallback) { final Runnable closeFormCallback) {
this.i18n = i18n; super(uiDependencies);
this.entityFactory = entityFactory;
this.eventBus = eventBus;
this.uiNotification = uiNotification;
this.targetFilterManagement = targetFilterManagement; this.targetFilterManagement = targetFilterManagement;
this.layout = layout; this.layout = layout;
this.closeFormCallback = closeFormCallback; this.closeFormCallback = closeFormCallback;
this.validator = new ProxyTargetFilterValidator(uiDependencies);
} }
@Override @Override
public AbstractEntityWindowLayout<ProxyTargetFilterQuery> getLayout() { public EntityWindowLayout<ProxyTargetFilterQuery> getLayout() {
return layout; return layout;
} }
@@ -101,39 +73,45 @@ public class UpdateTargetFilterController
} }
@Override @Override
protected void persistEntity(final ProxyTargetFilterQuery entity) { protected TargetFilterQuery persistEntityInRepository(final ProxyTargetFilterQuery entity) {
final TargetFilterQueryUpdate targetFilterUpdate = entityFactory.targetFilterQuery().update(entity.getId()) final TargetFilterQueryUpdate targetFilterUpdate = getEntityFactory().targetFilterQuery().update(entity.getId())
.name(entity.getName()).query(entity.getQuery()); .name(entity.getName()).query(entity.getQuery());
return targetFilterManagement.update(targetFilterUpdate);
}
try { @Override
final TargetFilterQuery updatedTargetFilter = targetFilterManagement.update(targetFilterUpdate); protected void postPersist() {
closeFormCallback.run();
}
uiNotification.displaySuccess(i18n.getMessage("message.update.success", updatedTargetFilter.getName())); @Override
eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( protected String getDisplayableName(final TargetFilterQuery entity) {
EntityModifiedEventType.ENTITY_UPDATED, ProxyTargetFilterQuery.class, updatedTargetFilter.getId())); return entity.getName();
} catch (final EntityNotFoundException | EntityReadOnlyException e) { }
LOG.trace("Update of target filter failed in UI: {}", e.getMessage());
final String entityType = i18n.getMessage("caption.target.filter"); @Override
uiNotification protected String getDisplayableNameForFailedMessage(final ProxyTargetFilterQuery entity) {
.displayWarning(i18n.getMessage("message.deleted.or.notAllowed", entityType, entity.getName())); return entity.getName();
} finally { }
closeFormCallback.run();
} @Override
protected Long getId(final TargetFilterQuery entity) {
return entity.getId();
}
@Override
protected Class<? extends ProxyIdentifiableEntity> getEntityClass() {
return ProxyTargetFilterQuery.class;
} }
@Override @Override
protected boolean isEntityValid(final ProxyTargetFilterQuery entity) { protected boolean isEntityValid(final ProxyTargetFilterQuery entity) {
if (!StringUtils.hasText(entity.getName())) {
uiNotification.displayValidationError(i18n.getMessage("message.error.missing.filtername"));
return false;
}
final String trimmedName = StringUtils.trimWhitespace(entity.getName()); final String trimmedName = StringUtils.trimWhitespace(entity.getName());
if (!nameBeforeEdit.equals(trimmedName) && targetFilterManagement.getByName(trimmedName).isPresent()) { return validator.isEntityValid(entity,
uiNotification.displayValidationError(i18n.getMessage("message.target.filter.duplicate", trimmedName)); () -> hasNamedChanged(trimmedName) && targetFilterManagement.getByName(trimmedName).isPresent());
return false; }
}
return true; private boolean hasNamedChanged(final String trimmedName) {
return !nameBeforeEdit.equals(trimmedName);
} }
} }

View File

@@ -30,6 +30,7 @@ import org.eclipse.hawkbit.security.SystemSecurityContext;
import org.eclipse.hawkbit.ui.AbstractHawkbitUI; import org.eclipse.hawkbit.ui.AbstractHawkbitUI;
import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.UiProperties; import org.eclipse.hawkbit.ui.UiProperties;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventView;
import org.eclipse.hawkbit.ui.common.event.EventViewAware; import org.eclipse.hawkbit.ui.common.event.EventViewAware;
@@ -99,21 +100,23 @@ public class DeploymentView extends VerticalLayout implements View, BrowserWindo
this.permChecker = permChecker; this.permChecker = permChecker;
this.managementUIState = managementUIState; this.managementUIState = managementUIState;
final CommonUiDependencies uiDependencies = new CommonUiDependencies(i18n, entityFactory, eventBus, uiNotification,
permChecker);
if (permChecker.hasTargetReadPermission()) { if (permChecker.hasTargetReadPermission()) {
this.targetTagFilterLayout = new TargetTagFilterLayout(i18n, managementUIState, permChecker, eventBus, this.targetTagFilterLayout = new TargetTagFilterLayout(uiDependencies, managementUIState,
uiNotification, entityFactory, targetFilterQueryManagement, targetTagManagement, targetManagement, targetFilterQueryManagement, targetTagManagement, targetManagement,
managementUIState.getTargetTagFilterLayoutUiState()); managementUIState.getTargetTagFilterLayoutUiState());
this.targetGridLayout = new TargetGridLayout(eventBus, targetManagement, entityFactory, i18n, this.targetGridLayout = new TargetGridLayout(uiDependencies, targetManagement, deploymentManagement, uiProperties,
uiNotification, deploymentManagement, uiProperties, permChecker, targetTagManagement, targetTagManagement, distributionSetManagement, uiExecutor, configManagement, systemSecurityContext,
distributionSetManagement, uiExecutor, configManagement, systemSecurityContext,
managementUIState.getTargetTagFilterLayoutUiState(), managementUIState.getTargetGridLayoutUiState(), managementUIState.getTargetTagFilterLayoutUiState(), managementUIState.getTargetGridLayoutUiState(),
managementUIState.getTargetBulkUploadUiState(), managementUIState.getTargetBulkUploadUiState(),
managementUIState.getDistributionGridLayoutUiState()); managementUIState.getDistributionGridLayoutUiState());
this.targetCountLayout = targetGridLayout.getCountMessageLabel().createFooterMessageComponent(); this.targetCountLayout = targetGridLayout.getCountMessageLabel().createFooterMessageComponent();
this.actionHistoryLayout = new ActionHistoryLayout(i18n, deploymentManagement, eventBus, uiNotification, this.actionHistoryLayout = new ActionHistoryLayout(uiDependencies, deploymentManagement,
permChecker, managementUIState.getActionHistoryGridLayoutUiState()); managementUIState.getActionHistoryGridLayoutUiState());
} else { } else {
this.targetTagFilterLayout = null; this.targetTagFilterLayout = null;
this.targetGridLayout = null; this.targetGridLayout = null;
@@ -122,14 +125,12 @@ public class DeploymentView extends VerticalLayout implements View, BrowserWindo
} }
if (permChecker.hasReadRepositoryPermission()) { if (permChecker.hasReadRepositoryPermission()) {
this.distributionTagLayout = new DistributionTagLayout(eventBus, i18n, permChecker, this.distributionTagLayout = new DistributionTagLayout(uiDependencies, distributionSetTagManagement,
distributionSetTagManagement, entityFactory, uiNotification, distributionSetManagement, distributionSetManagement, managementUIState.getDistributionTagLayoutUiState());
managementUIState.getDistributionTagLayoutUiState()); this.distributionGridLayout = new DistributionGridLayout(uiDependencies, targetManagement,
this.distributionGridLayout = new DistributionGridLayout(i18n, eventBus, permChecker, entityFactory, distributionSetManagement, smManagement, distributionSetTypeManagement,
uiNotification, targetManagement, distributionSetManagement, smManagement, distributionSetTagManagement, systemManagement, deploymentManagement, configManagement,
distributionSetTypeManagement, distributionSetTagManagement, systemManagement, deploymentManagement, systemSecurityContext, uiProperties, managementUIState.getDistributionGridLayoutUiState(),
configManagement, systemSecurityContext, uiProperties,
managementUIState.getDistributionGridLayoutUiState(),
managementUIState.getDistributionTagLayoutUiState(), managementUIState.getDistributionTagLayoutUiState(),
managementUIState.getTargetGridLayoutUiState()); managementUIState.getTargetGridLayoutUiState());
} else { } else {
@@ -379,12 +380,12 @@ public class DeploymentView extends VerticalLayout implements View, BrowserWindo
private void showDsTagLayout() { private void showDsTagLayout() {
distributionTagLayout.setVisible(true); distributionTagLayout.setVisible(true);
distributionGridLayout.hideDsTagHeaderIcon(); distributionGridLayout.hideDsFilterHeaderIcon();
} }
private void hideDsTagLayout() { private void hideDsTagLayout() {
distributionTagLayout.setVisible(false); distributionTagLayout.setVisible(false);
distributionGridLayout.showDsTagHeaderIcon(); distributionGridLayout.showDsFilterHeaderIcon();
} }
private void maximizeActionHistoryGridLayout() { private void maximizeActionHistoryGridLayout() {

View File

@@ -15,8 +15,8 @@ import java.util.Optional;
import org.eclipse.hawkbit.repository.DeploymentManagement; import org.eclipse.hawkbit.repository.DeploymentManagement;
import org.eclipse.hawkbit.repository.exception.CancelActionNotAllowedException; import org.eclipse.hawkbit.repository.exception.CancelActionNotAllowedException;
import org.eclipse.hawkbit.repository.exception.EntityNotFoundException; import org.eclipse.hawkbit.repository.exception.EntityNotFoundException;
import org.eclipse.hawkbit.ui.SpPermissionChecker;
import org.eclipse.hawkbit.ui.common.ConfirmationDialog; import org.eclipse.hawkbit.ui.common.ConfirmationDialog;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder; import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder;
import org.eclipse.hawkbit.ui.common.builder.StatusIconBuilder.ActionStatusIconSupplier; import org.eclipse.hawkbit.ui.common.builder.StatusIconBuilder.ActionStatusIconSupplier;
import org.eclipse.hawkbit.ui.common.builder.StatusIconBuilder.ActionTypeIconSupplier; import org.eclipse.hawkbit.ui.common.builder.StatusIconBuilder.ActionTypeIconSupplier;
@@ -42,10 +42,8 @@ import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
import org.eclipse.hawkbit.ui.utils.UINotification; import org.eclipse.hawkbit.ui.utils.UINotification;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.vaadin.spring.events.EventBus.UIEventBus;
import com.vaadin.data.ValueProvider; import com.vaadin.data.ValueProvider;
import com.vaadin.icons.VaadinIcons; import com.vaadin.icons.VaadinIcons;
@@ -86,12 +84,11 @@ public class ActionHistoryGrid extends AbstractGrid<ProxyAction, String> {
private final transient MasterEntitySupport<ProxyTarget> masterEntitySupport; private final transient MasterEntitySupport<ProxyTarget> masterEntitySupport;
ActionHistoryGrid(final VaadinMessageSource i18n, final DeploymentManagement deploymentManagement, ActionHistoryGrid(final CommonUiDependencies uiDependencies, final DeploymentManagement deploymentManagement,
final UIEventBus eventBus, final UINotification notification, final SpPermissionChecker permissionChecker,
final ActionHistoryGridLayoutUiState actionHistoryGridLayoutUiState) { final ActionHistoryGridLayoutUiState actionHistoryGridLayoutUiState) {
super(i18n, eventBus, permissionChecker); super(uiDependencies.getI18n(), uiDependencies.getEventBus(), uiDependencies.getPermChecker());
this.notification = notification; this.notification = uiDependencies.getUiNotification();
this.deploymentManagement = deploymentManagement; this.deploymentManagement = deploymentManagement;
this.actionToProxyActionMapper = new ActionToProxyActionMapper(); this.actionToProxyActionMapper = new ActionToProxyActionMapper();

View File

@@ -8,6 +8,7 @@
*/ */
package org.eclipse.hawkbit.ui.management.actionhistory; package org.eclipse.hawkbit.ui.management.actionhistory;
import org.eclipse.hawkbit.ui.common.CommonUiDependencies;
import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget;
import org.eclipse.hawkbit.ui.common.event.CommandTopics; import org.eclipse.hawkbit.ui.common.event.CommandTopics;
import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayout;
@@ -19,8 +20,6 @@ import org.eclipse.hawkbit.ui.common.grid.header.support.ResizeHeaderSupport;
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions; import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider;
import org.eclipse.hawkbit.ui.utils.VaadinMessageSource;
import org.vaadin.spring.events.EventBus.UIEventBus;
/** /**
* Header for ActionHistory with maximize-support. * Header for ActionHistory with maximize-support.
@@ -35,16 +34,14 @@ public class ActionHistoryGridHeader extends AbstractMasterAwareGridHeader<Proxy
/** /**
* Constructor for ActionHistoryGridHeader * Constructor for ActionHistoryGridHeader
* *
* @param i18n * @param uiDependencies
* VaadinMessageSource * {@link CommonUiDependencies}
* @param eventBus
* UIEventBus
* @param actionHistoryGridLayoutUiState * @param actionHistoryGridLayoutUiState
* ActionHistoryGridLayoutUiState * ActionHistoryGridLayoutUiState
*/ */
public ActionHistoryGridHeader(final VaadinMessageSource i18n, final UIEventBus eventBus, public ActionHistoryGridHeader(final CommonUiDependencies uiDependencies,
final ActionHistoryGridLayoutUiState actionHistoryGridLayoutUiState) { final ActionHistoryGridLayoutUiState actionHistoryGridLayoutUiState) {
super(i18n, null, eventBus); super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus());
this.actionHistoryGridLayoutUiState = actionHistoryGridLayoutUiState; this.actionHistoryGridLayoutUiState = actionHistoryGridLayoutUiState;

Some files were not shown because too many files have changed in this diff Show More