diff --git a/hawkbit-repository/hawkbit-repository-jpa/pom.xml b/hawkbit-repository/hawkbit-repository-jpa/pom.xml index 86e543cee..cd7fec7bc 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/pom.xml +++ b/hawkbit-repository/hawkbit-repository-jpa/pom.xml @@ -20,10 +20,9 @@ hawkBit :: Repository :: JPA Implementation - 3.20.0-GA - 2.3.0 - 1.3.1 ${project.build.directory}/generated-sources/apt/ + 4.8.90 + 2.7.5.1 @@ -97,7 +96,7 @@ com.ethlo.persistence.tools eclipselink-maven-plugin - 2.7.1.1 + ${eclipselink.maven.plugin.version} modelgen @@ -118,25 +117,24 @@ - javax.xml.bind - jaxb-api - ${jaxb.api.version} - - + org.eclipse.persistence org.eclipse.persistence.jpa ${eclipselink.version} - org.javassist - javassist - ${javassist.version} - - - javax.annotation - javax.annotation-api - ${javax.annotation.version} - + + io.github.classgraph + classgraph + ${classgraph.version} + diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaTarget.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaTarget.java index c7121f9ff..92ecb7c40 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaTarget.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaTarget.java @@ -16,7 +16,6 @@ import java.time.ZoneId; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.List; 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) @CollectionTable(name = "sp_target_attributes", joinColumns = { @JoinColumn(name = "target_id", nullable = false, updatable = false) }, foreignKey = @ForeignKey(value = ConstraintMode.CONSTRAINT, name = "fk_targ_attrib_target")) - private final Map controllerAttributes = Collections.synchronizedMap(new HashMap()); + private Map controllerAttributes; // set default request controller attributes to true, because we want to // request them the first diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLUtility.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLUtility.java index 149209172..b92376a7f 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLUtility.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLUtility.java @@ -153,7 +153,6 @@ public final class RSQLUtility { try { LOGGER.debug("parsing rsql string {}", rsql); final Set operators = RSQLOperators.defaultOperators(); - operators.add(new ComparisonOperator("=li=", false)); return new RSQLParser(operators).parse(rsql); } catch (final IllegalArgumentException e) { throw new RSQLParameterSyntaxException("rsql filter must not be null", e); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/UploadArtifactView.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/UploadArtifactView.java index f3c722752..af2b8ca08 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/UploadArtifactView.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/UploadArtifactView.java @@ -24,6 +24,7 @@ import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.artifacts.details.ArtifactDetailsGridLayout; import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleGridLayout; 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.EventView; import org.eclipse.hawkbit.ui.common.event.EventViewAware; @@ -77,14 +78,17 @@ public class UploadArtifactView extends VerticalLayout implements View, BrowserW this.permChecker = permChecker; this.artifactUploadState = artifactUploadState; + final CommonUiDependencies uiDependencies = new CommonUiDependencies(i18n, entityFactory, eventBus, uiNotification, + permChecker); + if (permChecker.hasReadRepositoryPermission()) { - this.smTypeFilterLayout = new SMTypeFilterLayout(i18n, permChecker, eventBus, entityFactory, uiNotification, - softwareModuleTypeManagement, artifactUploadState.getSmTypeFilterLayoutUiState()); - this.smGridLayout = new SoftwareModuleGridLayout(i18n, permChecker, uiNotification, eventBus, - softwareModuleManagement, softwareModuleTypeManagement, entityFactory, - artifactUploadState.getSmTypeFilterLayoutUiState(), artifactUploadState.getSmGridLayoutUiState()); - this.artifactDetailsGridLayout = new ArtifactDetailsGridLayout(i18n, eventBus, permChecker, uiNotification, - artifactUploadState, artifactUploadState.getArtifactDetailsGridLayoutUiState(), artifactManagement, + this.smTypeFilterLayout = new SMTypeFilterLayout(uiDependencies, softwareModuleTypeManagement, + artifactUploadState.getSmTypeFilterLayoutUiState(), EventView.UPLOAD); + this.smGridLayout = new SoftwareModuleGridLayout(uiDependencies, softwareModuleManagement, + softwareModuleTypeManagement, artifactUploadState.getSmTypeFilterLayoutUiState(), + artifactUploadState.getSmGridLayoutUiState()); + this.artifactDetailsGridLayout = new ArtifactDetailsGridLayout(uiDependencies, artifactUploadState, + artifactUploadState.getArtifactDetailsGridLayoutUiState(), artifactManagement, softwareModuleManagement, multipartConfigElement); final Map layoutVisibilityHandlers = new EnumMap<>(EventLayout.class); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/details/ArtifactDetailsGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/details/ArtifactDetailsGrid.java index ee671684f..f94eee552 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/details/ArtifactDetailsGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/details/ArtifactDetailsGrid.java @@ -14,7 +14,7 @@ import java.util.stream.Collectors; import org.eclipse.hawkbit.artifact.repository.model.AbstractDbArtifact; 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.data.mappers.ArtifactToProxyArtifactMapper; 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.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.icons.VaadinIcons; import com.vaadin.server.FileDownloader; @@ -65,23 +63,15 @@ public class ArtifactDetailsGrid extends AbstractGrid { /** * Constructor * - * @param eventBus - * UIEventBus - * @param i18n - * VaadinMessageSource - * @param permissionChecker - * SpPermissionChecker - * @param notification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param artifactManagement * ArtifactManagement */ - public ArtifactDetailsGrid(final UIEventBus eventBus, final VaadinMessageSource i18n, - final SpPermissionChecker permissionChecker, final UINotification notification, - final ArtifactManagement artifactManagement) { - super(i18n, eventBus, permissionChecker); + public ArtifactDetailsGrid(final CommonUiDependencies uiDependencies, final ArtifactManagement artifactManagement) { + super(uiDependencies.getI18n(), uiDependencies.getEventBus(), uiDependencies.getPermChecker()); - this.notification = notification; + this.notification = uiDependencies.getUiNotification(); this.artifactManagement = artifactManagement; this.artifactDeleteSupport = new DeleteSupport<>(this, i18n, notification, "artifact.details.header", diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/details/ArtifactDetailsGridHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/details/ArtifactDetailsGridHeader.java index 588be81f3..55e54571b 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/details/ArtifactDetailsGridHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/details/ArtifactDetailsGridHeader.java @@ -8,6 +8,7 @@ */ 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.event.CommandTopics; 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.UIComponentIdProvider; 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. @@ -35,16 +34,14 @@ public class ArtifactDetailsGridHeader extends AbstractMasterAwareGridHeader(eventBus, masterLayoutView, + this.selectionChangedListener = new SelectionChangedListener<>(uiDependencies.getEventBus(), masterLayoutView, getMasterEntityAwareComponents()); - this.fileUploadChangedListener = new GenericEventListener<>(eventBus, EventTopics.FILE_UPLOAD_CHANGED, - this::onUploadChanged); + this.fileUploadChangedListener = new GenericEventListener<>(uiDependencies.getEventBus(), + EventTopics.FILE_UPLOAD_CHANGED, this::onUploadChanged); } private List> getMasterEntityAwareComponents() { @@ -103,7 +91,7 @@ public class ArtifactDetailsGridLayout extends AbstractGridComponentLayout { * Checks progress on file upload * * @param fileUploadProgress - * FileUploadProgress + * FileUploadProgress */ public void onUploadChanged(final FileUploadProgress fileUploadProgress) { if (uploadDropAreaLayout != null) { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/AddSmWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/AddSmWindowController.java index 0f6b5369c..0b49288f9 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/AddSmWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/AddSmWindowController.java @@ -8,59 +8,38 @@ */ 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.builder.SoftwareModuleCreate; import org.eclipse.hawkbit.repository.model.SoftwareModule; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; +import org.eclipse.hawkbit.ui.common.AbstractAddNamedEntityWindowController; +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.proxies.ProxyIdentifiableEntity; 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.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload; import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload.SelectionChangedEventType; -import org.eclipse.hawkbit.ui.utils.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.springframework.util.StringUtils; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Controller for populating and saving data in Add Software Module Window. */ -public class AddSmWindowController extends AbstractEntityWindowController { - private static final Logger LOG = LoggerFactory.getLogger(AddSmWindowController.class); - - private final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; +public class AddSmWindowController + extends AbstractAddNamedEntityWindowController { private final SoftwareModuleManagement smManagement; - private final SmWindowLayout layout; - private final EventView view; + private final ProxySmValidator validator; /** * Constructor * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param smManagement * SoftwareModuleManagement * @param layout @@ -68,26 +47,18 @@ public class AddSmWindowController extends AbstractEntityWindowController getLayout() { + public EntityWindowLayout getLayout() { return layout; } @@ -99,48 +70,42 @@ public class AddSmWindowController extends AbstractEntityWindowController( - SelectionChangedEventType.ENTITY_SELECTED, addedItem, EventLayout.SM_LIST, view)); + @Override + protected String getDisplayableNameForFailedMessage(final ProxySoftwareModule entity) { + return HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion()); + } + + @Override + protected Class 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 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 trimmedVersion = StringUtils.trimWhitespace(entity.getVersion()); final Long typeId = entity.getTypeInfo().getId(); - if (smManagement.getByNameAndVersionAndType(trimmedName, trimmedVersion, typeId).isPresent()) { - uiNotification.displayValidationError( - i18n.getMessage("message.duplicate.softwaremodule", trimmedName, trimmedVersion)); - return false; - } - - return true; + return validator.isEntityValid(entity, + () -> smManagement.getByNameAndVersionAndType(trimmedName, trimmedVersion, typeId).isPresent()); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/ProxySmValidator.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/ProxySmValidator.java new file mode 100644 index 000000000..ca6a0a39b --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/ProxySmValidator.java @@ -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; + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmMetaDataWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmMetaDataWindowBuilder.java index 25803455a..01606aed9 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmMetaDataWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmMetaDataWindowBuilder.java @@ -8,14 +8,10 @@ */ package org.eclipse.hawkbit.ui.artifacts.smtable; -import org.eclipse.hawkbit.repository.EntityFactory; 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.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; @@ -23,38 +19,19 @@ import com.vaadin.ui.Window; * Builder for Software module meta data windows */ public class SmMetaDataWindowBuilder extends AbstractMetaDataWindowBuilder { - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; - private final SpPermissionChecker permChecker; private final SoftwareModuleManagement smManagement; /** * Constructor for SmMetaDataWindowBuilder * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification - * @param permChecker - * SpPermissionChecker + * @param uiDependencies + * {@link CommonUiDependencies} * @param smManagement * SoftwareModuleManagement */ - public SmMetaDataWindowBuilder(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, final SpPermissionChecker permChecker, - final SoftwareModuleManagement smManagement) { - super(i18n); - - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; - this.permChecker = permChecker; + public SmMetaDataWindowBuilder(final CommonUiDependencies uiDependencies, final SoftwareModuleManagement smManagement) { + super(uiDependencies); this.smManagement = smManagement; } @@ -86,8 +63,6 @@ public class SmMetaDataWindowBuilder extends AbstractMetaDataWindowBuilder * @return software module window */ public Window getWindowForShowSmMetaData(final Long smId, final String name, final ProxyMetaData proxyMetaData) { - return getWindowForShowMetaData( - new SmMetaDataWindowLayout(i18n, eventBus, permChecker, uiNotification, entityFactory, smManagement), - smId, name, proxyMetaData); + return getWindowForShowMetaData(new SmMetaDataWindowLayout(uiDependencies, smManagement), smId, name, proxyMetaData); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmMetaDataWindowLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmMetaDataWindowLayout.java index e27939a84..507a2d1a1 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmMetaDataWindowLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmMetaDataWindowLayout.java @@ -8,10 +8,9 @@ */ package org.eclipse.hawkbit.ui.artifacts.smtable; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareModuleManagement; 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.proxies.ProxyMetaData; 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.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.vaadin.spring.events.EventBus.UIEventBus; /** * Class for metadata add/update window layout. @@ -34,7 +30,6 @@ public class SmMetaDataWindowLayout extends AbstractMetaDataWindowLayout { private static final long serialVersionUID = 1L; private final transient SoftwareModuleManagement smManagement; - private final transient EntityFactory entityFactory; private final MetaDataWindowGrid smMetaDataWindowGrid; @@ -44,37 +39,26 @@ public class SmMetaDataWindowLayout extends AbstractMetaDataWindowLayout { /** * Constructor for AbstractTagWindowLayout - * - * @param i18n - * VaadinMessageSource - * @param eventBus - * UIEventBus - * @param permChecker - * SpPermissionChecker - * @param uiNotification - * UINotification - * @param entityFactory - * EntityFactory + * + * @param uiDependencies + * {@link CommonUiDependencies} * @param smManagement * SoftwareModuleManagement */ - public SmMetaDataWindowLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, - final SpPermissionChecker permChecker, final UINotification uiNotification, - final EntityFactory entityFactory, final SoftwareModuleManagement smManagement) { - super(i18n, eventBus, uiNotification, permChecker); + public SmMetaDataWindowLayout(final CommonUiDependencies uiDependencies, + final SoftwareModuleManagement smManagement) { + super(uiDependencies); this.smManagement = smManagement; - this.entityFactory = entityFactory; - this.smMetaDataWindowGrid = new MetaDataWindowGrid<>(i18n, eventBus, permChecker, uiNotification, - new SmMetaDataDataProvider(smManagement), this::hasMetadataChangePermission, this::deleteMetaData); + this.smMetaDataWindowGrid = new MetaDataWindowGrid<>(uiDependencies, new SmMetaDataDataProvider(smManagement), + this::hasMetadataChangePermission, this::deleteMetaData); - this.smMetaDataAddUpdateWindowLayout = new SmMetaDataAddUpdateWindowLayout(i18n, - this::hasMetadataChangePermission); - this.addSmMetaDataWindowController = new AddMetaDataWindowController(i18n, uiNotification, + this.smMetaDataAddUpdateWindowLayout = new SmMetaDataAddUpdateWindowLayout(i18n,this::hasMetadataChangePermission); + this.addSmMetaDataWindowController = new AddMetaDataWindowController(uiDependencies, smMetaDataAddUpdateWindowLayout, this::createMetaData, this::isDuplicate); - this.updateSmMetaDataWindowController = new UpdateMetaDataWindowController(i18n, uiNotification, - smMetaDataAddUpdateWindowLayout, this::updateMetaData); + this.updateSmMetaDataWindowController = new UpdateMetaDataWindowController(uiDependencies, + smMetaDataAddUpdateWindowLayout, this::updateMetaData, this::isDuplicate); buildLayout(); addGridSelectionListener(); @@ -87,14 +71,15 @@ public class SmMetaDataWindowLayout extends AbstractMetaDataWindowLayout { @Override protected MetaData doCreateMetaData(final ProxyMetaData entity) { - return smManagement.createMetaData(entityFactory.softwareModuleMetadata().create(masterEntityFilter) - .key(entity.getKey()).value(entity.getValue()).targetVisible(entity.isVisibleForTargets())); + return smManagement + .createMetaData(uiDependencies.getEntityFactory().softwareModuleMetadata().create(masterEntityFilter) + .key(entity.getKey()).value(entity.getValue()).targetVisible(entity.isVisibleForTargets())); } @Override protected MetaData doUpdateMetaData(final ProxyMetaData entity) { - return smManagement - .updateMetaData(entityFactory.softwareModuleMetadata().update(masterEntityFilter, entity.getKey()) + return smManagement.updateMetaData( + uiDependencies.getEntityFactory().softwareModuleMetadata().update(masterEntityFilter, entity.getKey()) .value(entity.getValue()).targetVisible(entity.isVisibleForTargets())); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmWindowBuilder.java index 91aead49b..576b4f04c 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SmWindowBuilder.java @@ -8,16 +8,13 @@ */ package org.eclipse.hawkbit.ui.artifacts.smtable; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; 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.event.EventView; 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; @@ -25,9 +22,6 @@ import com.vaadin.ui.Window; * Builder for Software module windows */ public class SmWindowBuilder extends AbstractEntityWindowBuilder { - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; private final SoftwareModuleManagement smManagement; private final SoftwareModuleTypeManagement smTypeManagement; @@ -37,29 +31,18 @@ public class SmWindowBuilder extends AbstractEntityWindowBuilder smFilterListener; - private final transient SelectionChangedListener masterSmChangedListener; - private final transient SelectGridEntityListener selectSmListener; - private final transient EntityModifiedListener smModifiedListener; - private final transient GenericEventListener fileUploadChangedListener; - /** * Constructor for SoftwareModuleGridLayout * - * @param i18n - * VaadinMessageSource - * @param permChecker - * SpPermissionChecker - * @param uiNotification - * UINotification - * @param eventBus - * UIEventBus + * @param uiDependencies + * {@link CommonUiDependencies} * @param softwareModuleManagement * SoftwareModuleManagement * @param softwareModuleTypeManagement * SoftwareModuleTypeManagement - * @param entityFactory - * EntityFactory * @param smTypeFilterLayoutUiState * TypeFilterLayoutUiState * @param smGridLayoutUiState * GridLayoutUiState */ - public SoftwareModuleGridLayout(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, - final UINotification uiNotification, final UIEventBus eventBus, + public SoftwareModuleGridLayout(final CommonUiDependencies uiDependencies, final SoftwareModuleManagement softwareModuleManagement, - final SoftwareModuleTypeManagement softwareModuleTypeManagement, final EntityFactory entityFactory, + final SoftwareModuleTypeManagement softwareModuleTypeManagement, final TypeFilterLayoutUiState smTypeFilterLayoutUiState, final GridLayoutUiState smGridLayoutUiState) { - super(); + super(uiDependencies, softwareModuleManagement, softwareModuleTypeManagement, EventView.UPLOAD); - final SmWindowBuilder smWindowBuilder = new SmWindowBuilder(i18n, entityFactory, eventBus, uiNotification, - softwareModuleManagement, softwareModuleTypeManagement, EventView.UPLOAD); - 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 = new SoftwareModuleGridHeader(uiDependencies, smTypeFilterLayoutUiState, + smGridLayoutUiState, getSmWindowBuilder(), getEventView()); this.softwareModuleGridHeader.buildHeader(); - this.softwareModuleGrid = new SoftwareModuleGrid(eventBus, i18n, permChecker, uiNotification, - smTypeFilterLayoutUiState, smGridLayoutUiState, softwareModuleManagement, EventView.UPLOAD); + this.softwareModuleGrid = new SoftwareModuleGrid(uiDependencies, smTypeFilterLayoutUiState, smGridLayoutUiState, + softwareModuleManagement, getEventView()); this.softwareModuleGrid.init(); - this.softwareModuleDetailsHeader = new SoftwareModuleDetailsHeader(i18n, permChecker, eventBus, uiNotification, - smWindowBuilder, smMetaDataWindowBuilder); + this.softwareModuleDetailsHeader = new SoftwareModuleDetailsHeader(uiDependencies, getSmWindowBuilder(), + getSmMetaDataWindowBuilder()); this.softwareModuleDetailsHeader.buildHeader(); - this.softwareModuleDetails = new SoftwareModuleDetails(i18n, eventBus, softwareModuleManagement, - softwareModuleTypeManagement, smMetaDataWindowBuilder); + this.softwareModuleDetails = new SoftwareModuleDetails(uiDependencies, softwareModuleManagement, + softwareModuleTypeManagement, getSmMetaDataWindowBuilder()); this.softwareModuleDetails.buildDetails(); - this.smFilterListener = new FilterChangedListener<>(eventBus, ProxySoftwareModule.class, - new EventViewAware(EventView.UPLOAD), softwareModuleGrid.getFilterSupport()); - this.masterSmChangedListener = new SelectionChangedListener<>(eventBus, - new EventLayoutViewAware(EventLayout.SM_LIST, EventView.UPLOAD), getMasterSmAwareComponents()); - this.selectSmListener = new SelectGridEntityListener<>(eventBus, - new EventLayoutViewAware(EventLayout.SM_LIST, EventView.UPLOAD), - softwareModuleGrid.getSelectionSupport()); - this.smModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxySoftwareModule.class) - .entityModifiedAwareSupports(getSmModifiedAwareSupports()).build(); - this.fileUploadChangedListener = new GenericEventListener<>(eventBus, EventTopics.FILE_UPLOAD_CHANGED, - this::onUploadChanged); + addEventListener(new FilterChangedListener<>(uiDependencies.getEventBus(), ProxySoftwareModule.class, + new EventViewAware(getEventView()), softwareModuleGrid.getFilterSupport())); + addEventListener(new SelectionChangedListener<>(uiDependencies.getEventBus(), + new EventLayoutViewAware(EventLayout.SM_LIST, getEventView()), getMasterSmAwareComponents())); + addEventListener(new SelectGridEntityListener<>(uiDependencies.getEventBus(), + new EventLayoutViewAware(EventLayout.SM_LIST, getEventView()), + softwareModuleGrid.getSelectionSupport())); + addEventListener(new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxySoftwareModule.class) + .entityModifiedAwareSupports(getSmModifiedAwareSupports()).build()); + addEventListener(new GenericEventListener<>(uiDependencies.getEventBus(), EventTopics.FILE_UPLOAD_CHANGED, + this::onUploadChanged)); buildLayout(softwareModuleGridHeader, softwareModuleGrid, softwareModuleDetailsHeader, softwareModuleDetails); } @@ -134,58 +110,20 @@ public class SoftwareModuleGridLayout extends AbstractGridComponentLayout { * Verifies when file upload is in progress * * @param fileUploadProgress - * FileUploadProgress + * FileUploadProgress */ public void onUploadChanged(final FileUploadProgress fileUploadProgress) { softwareModuleGrid.onUploadChanged(fileUploadProgress); } - /** - * Show software module grid header - */ - public void showSmTypeHeaderIcon() { - softwareModuleGridHeader.showFilterIcon(); + @Override + protected SoftwareModuleGridHeader getSoftwareModuleGridHeader() { + return softwareModuleGridHeader; } - /** - * Hide software module grid header - */ - public void hideSmTypeHeaderIcon() { - softwareModuleGridHeader.hideFilterIcon(); + @Override + protected SoftwareModuleGrid getSoftwareModuleGrid() { + return softwareModuleGrid; } - /** - * 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(); - } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/UpdateSmWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/UpdateSmWindowController.java index 70bae8341..ac3ff67a9 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/UpdateSmWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/UpdateSmWindowController.java @@ -8,75 +8,47 @@ */ package org.eclipse.hawkbit.ui.artifacts.smtable; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareModuleManagement; 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.ui.common.AbstractEntityWindowController; -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.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.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.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.springframework.util.StringUtils; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Controller for update software module window */ -public class UpdateSmWindowController extends AbstractEntityWindowController { - private static final Logger LOG = LoggerFactory.getLogger(UpdateSmWindowController.class); - - private final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; +public class UpdateSmWindowController + extends AbstractUpdateNamedEntityWindowController { private final SoftwareModuleManagement smManagement; - private final SmWindowLayout layout; + private final ProxySmValidator validator; + + private String nameBeforeEdit; + private String versionBeforeEdit; /** * Constructor for UpdateSmWindowController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param smManagement * SoftwareModuleManagement * @param layout * SmWindowLayout */ - public UpdateSmWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, final SoftwareModuleManagement smManagement, - final SmWindowLayout layout) { - this.i18n = i18n; - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + public UpdateSmWindowController(final CommonUiDependencies uiDependencies, + final SoftwareModuleManagement smManagement, final SmWindowLayout layout) { + super(uiDependencies); this.smManagement = smManagement; - this.layout = layout; - } - - /** - * @return Software module layout - */ - @Override - public AbstractEntityWindowLayout getLayout() { - return layout; + this.validator = new ProxySmValidator(uiDependencies); } @Override @@ -90,9 +62,17 @@ public class UpdateSmWindowController extends AbstractEntityWindowController getLayout() { + return layout; + } + @Override protected void adaptLayout(final ProxySoftwareModule proxyEntity) { layout.disableSmTypeSelect(); @@ -101,33 +81,37 @@ public class UpdateSmWindowController extends AbstractEntityWindowController getEntityClass() { + return ProxySoftwareModule.class; } @Override 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 trimmedVersion = StringUtils.trimWhitespace(entity.getVersion()); + final Long typeId = entity.getTypeInfo().getId(); + 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); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/AddSmTypeWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/AddSmTypeWindowController.java index 5dccbc604..d5560a9e1 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/AddSmTypeWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/AddSmTypeWindowController.java @@ -8,71 +8,49 @@ */ package org.eclipse.hawkbit.ui.artifacts.smtype; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; 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.AbstractAddNamedEntityWindowController; +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.ProxyType; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType.SmTypeAssign; -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.eclipse.hawkbit.ui.common.type.ProxyTypeValidator; import org.springframework.util.StringUtils; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Controller for Add software module type window */ -public class AddSmTypeWindowController extends AbstractEntityWindowController { - private final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; +public class AddSmTypeWindowController + extends AbstractAddNamedEntityWindowController { private final SoftwareModuleTypeManagement smTypeManagement; - private final SmTypeWindowLayout layout; + private final ProxyTypeValidator validator; /** * Constructor for AddSmTypeWindowController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param smTypeManagement * SoftwareModuleTypeManagement * @param layout * SmTypeWindowLayout */ - public AddSmTypeWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, + public AddSmTypeWindowController(final CommonUiDependencies uiDependencies, final SoftwareModuleTypeManagement smTypeManagement, final SmTypeWindowLayout layout) { - this.i18n = i18n; - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + super(uiDependencies); this.smTypeManagement = smTypeManagement; - this.layout = layout; + this.validator = new ProxyTypeValidator(uiDependencies); } - /** - * Getter for Software module type Window Layout - * - * @return AbstractEntityWindowLayout - */ @Override - public AbstractEntityWindowLayout getLayout() { + public EntityWindowLayout getLayout() { return layout; } @@ -84,38 +62,29 @@ public class AddSmTypeWindowController extends AbstractEntityWindowController getEntityClass() { + return ProxyType.class; + } + + @Override + protected Class getParentEntityClass() { + return ProxySoftwareModule.class; } @Override 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 trimmedKey = StringUtils.trimWhitespace(entity.getKey()); - if (smTypeManagement.getByName(trimmedName).isPresent()) { - uiNotification.displayValidationError(i18n.getMessage("message.type.duplicate.check", trimmedName)); - return false; - } - if (smTypeManagement.getByKey(trimmedKey).isPresent()) { - uiNotification - .displayValidationError(i18n.getMessage("message.type.key.swmodule.duplicate.check", trimmedKey)); - return false; - } - - return true; + return validator.isSmTypeValid(entity, () -> smTypeManagement.getByKey(trimmedKey).isPresent(), + () -> smTypeManagement.getByName(trimmedName).isPresent()); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/SmTypeWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/SmTypeWindowBuilder.java index 94118f4df..422af5420 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/SmTypeWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/SmTypeWindowBuilder.java @@ -8,14 +8,11 @@ */ package org.eclipse.hawkbit.ui.artifacts.smtype; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; 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.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; @@ -23,35 +20,19 @@ import com.vaadin.ui.Window; * Builder for software module type window */ public class SmTypeWindowBuilder extends AbstractEntityWindowBuilder { - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; private final SoftwareModuleTypeManagement smTypeManagement; /** * Constructor for SmTypeWindowBuilder * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param smTypeManagement - * SoftwareModuleTypeManagement + * SoftwareModuleTypeManagement */ - public SmTypeWindowBuilder(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, - final SoftwareModuleTypeManagement smTypeManagement) { - super(i18n); - - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; - + public SmTypeWindowBuilder(final CommonUiDependencies uiDependencies, final SoftwareModuleTypeManagement smTypeManagement) { + super(uiDependencies); this.smTypeManagement = smTypeManagement; } @@ -67,8 +48,8 @@ public class SmTypeWindowBuilder extends AbstractEntityWindowBuilder */ @Override public Window getWindowForAdd() { - return getWindowForNewEntity(new AddSmTypeWindowController(i18n, entityFactory, eventBus, uiNotification, - smTypeManagement, new SmTypeWindowLayout(i18n, uiNotification))); + return getWindowForNewEntity( + new AddSmTypeWindowController(uiDependencies, smTypeManagement, new SmTypeWindowLayout(uiDependencies))); } @@ -76,13 +57,13 @@ public class SmTypeWindowBuilder extends AbstractEntityWindowBuilder * Update window for software module type * * @param proxyType - * ProxyType + * ProxyType * * @return Window of Software module type */ @Override public Window getWindowForUpdate(final ProxyType proxyType) { - return getWindowForEntity(proxyType, new UpdateSmTypeWindowController(i18n, entityFactory, eventBus, - uiNotification, smTypeManagement, new SmTypeWindowLayout(i18n, uiNotification))); + return getWindowForEntity(proxyType, + new UpdateSmTypeWindowController(uiDependencies, smTypeManagement, new SmTypeWindowLayout(uiDependencies))); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/SmTypeWindowLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/SmTypeWindowLayout.java index 211b165b1..fa23354a5 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/SmTypeWindowLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/SmTypeWindowLayout.java @@ -8,12 +8,11 @@ */ 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.data.proxies.ProxyType; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType.SmTypeAssign; 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.RadioButtonGroup; @@ -31,13 +30,11 @@ public class SmTypeWindowLayout extends TagWindowLayout { /** * Constructor for SmTypeWindowLayout * - * @param i18n - * VaadinMessageSource - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} */ - public SmTypeWindowLayout(final VaadinMessageSource i18n, final UINotification uiNotification) { - super(i18n, uiNotification); + public SmTypeWindowLayout(final CommonUiDependencies uiDependencies) { + super(uiDependencies); this.smTypeComponentBuilder = new SmTypeWindowLayoutComponentBuilder(i18n); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/UpdateSmTypeWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/UpdateSmTypeWindowController.java index cc7063b68..908a9031f 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/UpdateSmTypeWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/UpdateSmTypeWindowController.java @@ -8,41 +8,28 @@ */ package org.eclipse.hawkbit.ui.artifacts.smtype; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; 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.ui.common.AbstractEntityWindowController; -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.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.ProxyType; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyType.SmTypeAssign; -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.eclipse.hawkbit.ui.common.type.ProxyTypeValidator; import org.springframework.util.StringUtils; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Controller for update software module type window */ -public class UpdateSmTypeWindowController extends AbstractEntityWindowController { - private static final Logger LOG = LoggerFactory.getLogger(UpdateSmTypeWindowController.class); - - private final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; +public class UpdateSmTypeWindowController + extends AbstractUpdateNamedEntityWindowController { private final SoftwareModuleTypeManagement smTypeManagement; - private final SmTypeWindowLayout layout; + private final ProxyTypeValidator validator; private String nameBeforeEdit; private String keyBeforeEdit; @@ -50,40 +37,20 @@ public class UpdateSmTypeWindowController extends AbstractEntityWindowController /** * Constructor for UpdateSmTypeWindowController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param smTypeManagement * SoftwareModuleTypeManagement * @param layout * SmTypeWindowLayout */ - public UpdateSmTypeWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, + public UpdateSmTypeWindowController(final CommonUiDependencies uiDependencies, final SoftwareModuleTypeManagement smTypeManagement, final SmTypeWindowLayout layout) { - this.i18n = i18n; - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + super(uiDependencies); this.smTypeManagement = smTypeManagement; - this.layout = layout; - } - - /** - * Getter for Software module type Window Layout - * - * @return AbstractEntityWindowLayout - */ - @Override - public AbstractEntityWindowLayout getLayout() { - return layout; + this.validator = new ProxyTypeValidator(uiDependencies); } @Override @@ -109,6 +76,11 @@ public class UpdateSmTypeWindowController extends AbstractEntityWindowController .orElse(SmTypeAssign.SINGLE); } + @Override + public EntityWindowLayout getLayout() { + return layout; + } + @Override protected void adaptLayout(final ProxyType proxyEntity) { layout.disableTagName(); @@ -117,46 +89,36 @@ public class UpdateSmTypeWindowController extends AbstractEntityWindowController } @Override - protected void persistEntity(final ProxyType entity) { - final SoftwareModuleTypeUpdate smTypeUpdate = entityFactory.softwareModuleType().update(entity.getId()) + protected SoftwareModuleType persistEntityInRepository(final ProxyType entity) { + final SoftwareModuleTypeUpdate smTypeUpdate = getEntityFactory().softwareModuleType().update(entity.getId()) .description(entity.getDescription()).colour(entity.getColour()); + return smTypeManagement.update(smTypeUpdate); + } - try { - final SoftwareModuleType updatedSmType = smTypeManagement.update(smTypeUpdate); + @Override + protected Class getEntityClass() { + return ProxyType.class; + } - uiNotification.displaySuccess(i18n.getMessage("message.update.success", updatedSmType.getName())); - eventBus.publish(EventTopics.ENTITY_MODIFIED, this, - new EntityModifiedEventPayload(EntityModifiedEventType.ENTITY_UPDATED, 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 + protected Class getParentEntityClass() { + return ProxySoftwareModule.class; } @Override 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 trimmedKey = StringUtils.trimWhitespace(entity.getKey()); - if (!nameBeforeEdit.equals(trimmedName) && smTypeManagement.getByName(trimmedName).isPresent()) { - uiNotification.displayValidationError(i18n.getMessage("message.type.duplicate.check", trimmedName)); - return false; - } - if (!keyBeforeEdit.equals(trimmedKey) && smTypeManagement.getByKey(trimmedKey).isPresent()) { - uiNotification - .displayValidationError(i18n.getMessage("message.type.key.swmodule.duplicate.check", trimmedKey)); - return false; - } + return validator.isSmTypeValid(entity, + () -> hasKeyChanged(trimmedKey) && smTypeManagement.getByKey(trimmedKey).isPresent(), + () -> hasNameChanged(trimmedName) && smTypeManagement.getByName(trimmedName).isPresent()); + } - return true; + private boolean hasNameChanged(final String trimmedName) { + return !nameBeforeEdit.equals(trimmedName); + } + + private boolean hasKeyChanged(final String trimmedKey) { + return !keyBeforeEdit.equals(trimmedKey); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/filter/SMTypeFilterButtons.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/filter/SMTypeFilterButtons.java index b3323aeb1..830af7713 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/filter/SMTypeFilterButtons.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/filter/SMTypeFilterButtons.java @@ -9,8 +9,8 @@ package org.eclipse.hawkbit.ui.artifacts.smtype.filter; 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.common.CommonUiDependencies; 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.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.state.TypeFilterLayoutUiState; 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; @@ -40,17 +37,11 @@ public class SMTypeFilterButtons extends AbstractTypeFilterButtons { /** * Constructor - * - * @param eventBus - * UIEventBus + * + * @param uiDependencies + * {@link CommonUiDependencies} * @param softwareModuleTypeManagement * SoftwareModuleTypeManagement - * @param i18n - * VaadinMessageSource - * @param permChecker - * SpPermissionChecker - * @param uiNotification - * UINotification * @param smTypeWindowBuilder * SmTypeWindowBuilder * @param typeFilterLayoutUiState @@ -58,12 +49,11 @@ public class SMTypeFilterButtons extends AbstractTypeFilterButtons { * @param view * EventView */ - public SMTypeFilterButtons(final UIEventBus eventBus, final VaadinMessageSource i18n, - final UINotification uiNotification, final SpPermissionChecker permChecker, + public SMTypeFilterButtons(final CommonUiDependencies uiDependencies, final SoftwareModuleTypeManagement softwareModuleTypeManagement, final SmTypeWindowBuilder smTypeWindowBuilder, final TypeFilterLayoutUiState typeFilterLayoutUiState, final EventView view) { - super(eventBus, i18n, uiNotification, permChecker, typeFilterLayoutUiState); + super(uiDependencies, typeFilterLayoutUiState); this.softwareModuleTypeManagement = softwareModuleTypeManagement; this.smTypeWindowBuilder = smTypeWindowBuilder; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/filter/SMTypeFilterHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/filter/SMTypeFilterHeader.java index 0f5d6313c..cee6b5a67 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/filter/SMTypeFilterHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/filter/SMTypeFilterHeader.java @@ -8,16 +8,14 @@ */ 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.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.grid.header.AbstractFilterHeader; import org.eclipse.hawkbit.ui.common.state.TypeFilterLayoutUiState; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; 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; @@ -36,23 +34,18 @@ public class SMTypeFilterHeader extends AbstractFilterHeader { /** * Constructor for SMTypeFilterHeader * - * @param eventBus - * UIEventBus - * @param i18n - * VaadinMessageSource - * @param permChecker - * SpPermissionChecker + * @param uiDependencies + * {@link CommonUiDependencies} * @param smTypeWindowBuilder - * SmTypeWindowBuilder + * SmTypeWindowBuilder * @param smTypeFilterLayoutUiState - * TypeFilterLayoutUiState + * TypeFilterLayoutUiState * @param view - * EventView + * EventView */ - public SMTypeFilterHeader(final UIEventBus eventBus, final VaadinMessageSource i18n, - final SpPermissionChecker permChecker, final SmTypeWindowBuilder smTypeWindowBuilder, + public SMTypeFilterHeader(final CommonUiDependencies uiDependencies, final SmTypeWindowBuilder smTypeWindowBuilder, final TypeFilterLayoutUiState smTypeFilterLayoutUiState, final EventView view) { - super(i18n, permChecker, eventBus); + super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus()); this.smTypeFilterLayoutUiState = smTypeFilterLayoutUiState; this.smTypeWindowBuilder = smTypeWindowBuilder; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/filter/SMTypeFilterLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/filter/SMTypeFilterLayout.java index 62be0fbdb..9b21d29be 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/filter/SMTypeFilterLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/filter/SMTypeFilterLayout.java @@ -11,10 +11,9 @@ package org.eclipse.hawkbit.ui.artifacts.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.ui.SpPermissionChecker; 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.ProxyType; 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.EntityModifiedGridRefreshAwareSupport; 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; @@ -37,6 +33,7 @@ import com.vaadin.ui.ComponentContainer; * Software module type filter buttons layout. */ public class SMTypeFilterLayout extends AbstractFilterLayout { + private static final long serialVersionUID = 1L; private final SMTypeFilterHeader smTypeFilterHeader; @@ -47,50 +44,46 @@ public class SMTypeFilterLayout extends AbstractFilterLayout { /** * Constructor - * - * @param i18n - * VaadinMessageSource - * @param permChecker - * SpPermissionChecker - * @param eventBus - * UIEventBus - * @param entityFactory - * EntityFactory - * @param uiNotification - * UINotification + * + * @param uiDependencies + * {@link CommonUiDependencies} * @param softwareModuleTypeManagement * SoftwareModuleTypeManagement * @param smTypeFilterLayoutUiState * SMTypeFilterLayoutUiState + * @param eventView + * {@link EventView} */ - public SMTypeFilterLayout(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, - final UIEventBus eventBus, final EntityFactory entityFactory, final UINotification uiNotification, + public SMTypeFilterLayout(final CommonUiDependencies uiDependencies, final SoftwareModuleTypeManagement softwareModuleTypeManagement, - final TypeFilterLayoutUiState smTypeFilterLayoutUiState) { - final SmTypeWindowBuilder smTypeWindowBuilder = new SmTypeWindowBuilder(i18n, entityFactory, eventBus, - uiNotification, softwareModuleTypeManagement); + final TypeFilterLayoutUiState smTypeFilterLayoutUiState, final EventView eventView) { + final SmTypeWindowBuilder smTypeWindowBuilder = new SmTypeWindowBuilder(uiDependencies, + softwareModuleTypeManagement); - this.smTypeFilterHeader = new SMTypeFilterHeader(eventBus, i18n, permChecker, smTypeWindowBuilder, - smTypeFilterLayoutUiState, EventView.UPLOAD); - this.smTypeFilterButtons = new SMTypeFilterButtons(eventBus, i18n, uiNotification, permChecker, - softwareModuleTypeManagement, smTypeWindowBuilder, smTypeFilterLayoutUiState, EventView.UPLOAD); + this.smTypeFilterHeader = new SMTypeFilterHeader(uiDependencies, smTypeWindowBuilder, smTypeFilterLayoutUiState, + eventView); + this.smTypeFilterButtons = new SMTypeFilterButtons(uiDependencies, softwareModuleTypeManagement, + smTypeWindowBuilder, smTypeFilterLayoutUiState, eventView); - this.gridActionsVisibilityListener = new GridActionsVisibilityListener(eventBus, - new EventLayoutViewAware(EventLayout.SM_TYPE_FILTER, EventView.UPLOAD), - smTypeFilterButtons::hideActionColumns, smTypeFilterButtons::showEditColumn, - smTypeFilterButtons::showDeleteColumn); - this.entityModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyType.class) - .entityModifiedAwareSupports(getEntityModifiedAwareSupports()) - .parentEntityType(ProxySoftwareModule.class).build(); + this.gridActionsVisibilityListener = new GridActionsVisibilityListener(uiDependencies.getEventBus(), + new EventLayoutViewAware(EventLayout.SM_TYPE_FILTER, eventView), smTypeFilterButtons::hideActionColumns, + smTypeFilterButtons::showEditColumn, smTypeFilterButtons::showDeleteColumn); + this.entityModifiedListener = new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), + ProxyType.class).entityModifiedAwareSupports(getEntityModifiedAwareSupports()) + .parentEntityType(ProxySoftwareModule.class).build(); buildLayout(); } private List getEntityModifiedAwareSupports() { - return Arrays.asList(EntityModifiedGridRefreshAwareSupport.of(smTypeFilterButtons::refreshAll), + return Arrays.asList(EntityModifiedGridRefreshAwareSupport.of(this::refreshFilterButtons), EntityModifiedGenericSupport.of(null, null, smTypeFilterButtons::resetFilterOnTypesDeleted)); } + protected void refreshFilterButtons() { + smTypeFilterButtons.refreshAll(); + } + @Override protected SMTypeFilterHeader getFilterHeader() { return smTypeFilterHeader; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/upload/UploadDropAreaLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/upload/UploadDropAreaLayout.java index f6124d6f5..9a7e03b81 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/upload/UploadDropAreaLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/upload/UploadDropAreaLayout.java @@ -18,14 +18,13 @@ import org.eclipse.hawkbit.repository.ArtifactManagement; import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.model.SoftwareModule; 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.layout.MasterEntityAwareComponent; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; 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; -import org.vaadin.spring.events.EventBus.UIEventBus; import com.vaadin.icons.VaadinIcons; import com.vaadin.shared.ui.ContentMode; @@ -59,13 +58,9 @@ public class UploadDropAreaLayout extends CustomComponent implements MasterEntit /** * Creates a new {@link UploadDropAreaLayout} instance. - * - * @param i18n - * the {@link VaadinMessageSource} - * @param eventBus - * the {@link EventBus} used to send/retrieve events - * @param uiNotification - * {@link UINotification} for showing notifications + * + * @param uiDependencies + * the {@link CommonUiDependencies} * @param artifactUploadState * the {@link ArtifactUploadState} for state information * @param multipartConfigElement @@ -77,18 +72,17 @@ public class UploadDropAreaLayout extends CustomComponent implements MasterEntit * the {@link ArtifactManagement} for storing the uploaded * artifacts */ - public UploadDropAreaLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, - final UINotification uiNotification, final ArtifactUploadState artifactUploadState, + public UploadDropAreaLayout(final CommonUiDependencies uiDependencies, final ArtifactUploadState artifactUploadState, final MultipartConfigElement multipartConfigElement, final SoftwareModuleManagement softwareManagement, final ArtifactManagement artifactManagement) { - this.i18n = i18n; - this.uiNotification = uiNotification; + this.i18n = uiDependencies.getI18n(); + this.uiNotification = uiDependencies.getUiNotification(); this.artifactUploadState = artifactUploadState; this.multipartConfigElement = multipartConfigElement; this.softwareManagement = softwareManagement; this.artifactManagement = artifactManagement; - this.uploadButtonLayout = new UploadProgressButtonLayout(i18n, eventBus, artifactUploadState, + this.uploadButtonLayout = new UploadProgressButtonLayout(i18n, uiDependencies.getEventBus(), artifactUploadState, multipartConfigElement, artifactManagement, softwareManagement, uploadLock); buildLayout(); @@ -125,7 +119,7 @@ public class UploadDropAreaLayout extends CustomComponent implements MasterEntit * Update the upload view on file drop * * @param masterEntity - * ProxySoftwareModule + * ProxySoftwareModule */ @Override public void masterEntityChanged(final ProxySoftwareModule masterEntity) { @@ -139,7 +133,7 @@ public class UploadDropAreaLayout extends CustomComponent implements MasterEntit * Checks progress on file upload * * @param fileUploadProgress - * FileUploadProgress + * FileUploadProgress */ public void onUploadChanged(final FileUploadProgress fileUploadProgress) { uploadButtonLayout.onUploadChanged(fileUploadProgress); @@ -178,7 +172,7 @@ public class UploadDropAreaLayout extends CustomComponent implements MasterEntit * Validates the file drop events and triggers the upload * * @param event - * FileDropEvent + * FileDropEvent */ @Override public void drop(final FileDropEvent event) { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractAddEntityWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractAddEntityWindowController.java new file mode 100644 index 000000000..5507f8a0f --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractAddEntityWindowController.java @@ -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 + * Type of proxy entity + * @param + * Second type of proxy entity + * @param + * Type of repository entity + */ +public abstract class AbstractAddEntityWindowController extends AbstractEntityWindowController { + + /** + * 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)); + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractAddNamedEntityWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractAddNamedEntityWindowController.java new file mode 100644 index 000000000..8a21acc36 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractAddNamedEntityWindowController.java @@ -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 + * Type of proxy entity + * @param + * Second type of proxy entity + * @param + * Type of repository entity + */ +public abstract class AbstractAddNamedEntityWindowController + extends AbstractAddEntityWindowController { + + /** + * 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(); + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractEntityWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractEntityWindowBuilder.java index 90af792dc..d8f7d6dcb 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractEntityWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractEntityWindowBuilder.java @@ -20,31 +20,31 @@ import com.vaadin.ui.Window; * Builder for abstract entity window * * @param - * Generic type entity + * Generic type entity */ public abstract class AbstractEntityWindowBuilder { - protected final VaadinMessageSource i18n; + protected final CommonUiDependencies uiDependencies; - protected AbstractEntityWindowBuilder(final VaadinMessageSource i18n) { - this.i18n = i18n; + protected AbstractEntityWindowBuilder(final CommonUiDependencies uiDependencies) { + this.uiDependencies = uiDependencies; } - protected CommonDialogWindow getWindowForNewEntity(final AbstractEntityWindowController controller) { + protected CommonDialogWindow getWindowForNewEntity(final AbstractEntityWindowController controller) { return getWindowForEntity(null, controller); } - protected CommonDialogWindow getWindowForNewEntity(final AbstractEntityWindowController controller, + protected CommonDialogWindow getWindowForNewEntity(final AbstractEntityWindowController controller, final Component windowContent) { return getWindowForEntity(null, controller, windowContent); } protected CommonDialogWindow getWindowForEntity(final T proxyEntity, - final AbstractEntityWindowController controller) { + final AbstractEntityWindowController controller) { return getWindowForEntity(proxyEntity, controller, controller.getLayout().getRootComponent()); } protected CommonDialogWindow getWindowForEntity(final T proxyEntity, - final AbstractEntityWindowController controller, final Component windowContent) { + final AbstractEntityWindowController controller, final Component windowContent) { controller.populateWithData(proxyEntity); final CommonDialogWindow window = createWindow(windowContent, controller.getSaveDialogCloseListener()); @@ -56,8 +56,9 @@ public abstract class AbstractEntityWindowBuilder { protected CommonDialogWindow createWindow(final Component content, final SaveDialogCloseListener saveDialogCloseListener) { - return new WindowBuilder(SPUIDefinitions.CREATE_UPDATE_WINDOW).id(getWindowId()).content(content).i18n(i18n) - .helpLink(getHelpLink()).saveDialogCloseListener(saveDialogCloseListener).buildCommonDialogWindow(); + return new WindowBuilder(SPUIDefinitions.CREATE_UPDATE_WINDOW).id(getWindowId()).content(content) + .i18n(uiDependencies.getI18n()).helpLink(getHelpLink()).saveDialogCloseListener(saveDialogCloseListener) + .buildCommonDialogWindow(); } protected abstract String getWindowId(); @@ -73,7 +74,7 @@ public abstract class AbstractEntityWindowBuilder { * Gets the update window * * @param entity - * Generic type entity + * Generic type entity * * @return window */ @@ -83,4 +84,8 @@ public abstract class AbstractEntityWindowBuilder { // can be overriden to provide help link to documentation return null; } + + protected VaadinMessageSource getI18n() { + return uiDependencies.getI18n(); + } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractEntityWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractEntityWindowController.java index f6380f075..5e3821b52 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractEntityWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractEntityWindowController.java @@ -8,23 +8,56 @@ */ 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.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 * * @param - * Generic type entity + * Type of proxy entity * @param - * Generic type entity + * Second type of proxy entity + * @param + * Type of repository entity */ -public abstract class AbstractEntityWindowController { +public abstract class AbstractEntityWindowController { + + 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 * * @param proxyEntity - * Generic type entity + * Generic type entity */ public void populateWithData(final T proxyEntity) { getLayout().setEntity(buildEntityFromProxy(proxyEntity)); @@ -66,11 +99,107 @@ public abstract class AbstractEntityWindowController { }; } - 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 getEntityClass(); + + protected Class 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 boolean closeWindowAfterSave() { 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 eventPayload) { + getEventBus().publish(CommandTopics.SELECT_GRID_ENTITY, this, eventPayload); + } + } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractUpdateEntityWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractUpdateEntityWindowController.java new file mode 100644 index 000000000..c78596784 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractUpdateEntityWindowController.java @@ -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 + * Type of proxy entity + * @param + * Second type of proxy entity + * @param + * Type of repository entity + */ +public abstract class AbstractUpdateEntityWindowController extends AbstractEntityWindowController { + + /** + * 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)); + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractUpdateNamedEntityWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractUpdateNamedEntityWindowController.java new file mode 100644 index 000000000..d623dce07 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/AbstractUpdateNamedEntityWindowController.java @@ -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 + * Type of proxy entity + * @param + * Second type of proxy entity + * @param + * Type of repository entity + */ +public abstract class AbstractUpdateNamedEntityWindowController + extends AbstractUpdateEntityWindowController { + + /** + * 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(); + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonUiDependencies.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonUiDependencies.java new file mode 100644 index 000000000..dda6d6f88 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonUiDependencies.java @@ -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; + } + +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/EntityValidator.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/EntityValidator.java new file mode 100644 index 000000000..3080cac48 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/EntityValidator.java @@ -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(); + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/filters/DsDistributionsFilterParams.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/filters/DsDistributionsFilterParams.java index ec61a7bb9..80cd5c3a7 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/filters/DsDistributionsFilterParams.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/filters/DsDistributionsFilterParams.java @@ -8,18 +8,14 @@ */ package org.eclipse.hawkbit.ui.common.data.filters; -import java.io.Serializable; - import org.eclipse.hawkbit.ui.common.data.providers.DistributionSetDistributionsStateDataProvider; -import org.springframework.util.StringUtils; /** * Filter params for {@link DistributionSetDistributionsStateDataProvider}. */ -public class DsDistributionsFilterParams implements Serializable { +public class DsDistributionsFilterParams extends DsFilterParams { private static final long serialVersionUID = 1L; - private String searchText; private Long dsTypeId; /** @@ -31,36 +27,17 @@ public class DsDistributionsFilterParams implements Serializable { /** * Constructor. - * + * * @param searchText - * String + * String * @param dsTypeId - * Long + * Long */ public DsDistributionsFilterParams(final String searchText, final Long dsTypeId) { - this.searchText = searchText; + super(searchText); 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 */ @@ -72,7 +49,7 @@ public class DsDistributionsFilterParams implements Serializable { * Setter for DsTypeId * * @param dsTypeId - * Long + * Long */ public void setDsTypeId(final Long dsTypeId) { this.dsTypeId = dsTypeId; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/filters/DsFilterParams.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/filters/DsFilterParams.java new file mode 100644 index 000000000..08482365d --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/filters/DsFilterParams.java @@ -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; + } + +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/filters/DsManagementFilterParams.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/filters/DsManagementFilterParams.java index 603ec5ea5..56a317948 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/filters/DsManagementFilterParams.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/data/filters/DsManagementFilterParams.java @@ -8,21 +8,18 @@ */ package org.eclipse.hawkbit.ui.common.data.filters; -import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.hawkbit.ui.common.data.providers.DistributionSetManagementStateDataProvider; -import org.springframework.util.StringUtils; /** * Filter params for {@link DistributionSetManagementStateDataProvider}. */ -public class DsManagementFilterParams implements Serializable { +public class DsManagementFilterParams extends DsFilterParams { private static final long serialVersionUID = 1L; - private String searchText; private boolean noTagClicked; private Collection distributionSetTags; private String pinnedTargetControllerId; @@ -36,7 +33,7 @@ public class DsManagementFilterParams implements Serializable { /** * Constructor. - * + * * @param searchText * String as search text * @param noTagClicked @@ -48,29 +45,12 @@ public class DsManagementFilterParams implements Serializable { */ public DsManagementFilterParams(final String searchText, final boolean noTagClicked, final List distributionSetTags, final String pinnedTargetControllerId) { - this.searchText = searchText; + super(searchText); this.noTagClicked = noTagClicked; this.distributionSetTags = distributionSetTags; 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 */ diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractMetaDataWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractMetaDataWindowBuilder.java index 9c9b1d261..30fcbf09a 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractMetaDataWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractMetaDataWindowBuilder.java @@ -10,9 +10,9 @@ package org.eclipse.hawkbit.ui.common.detailslayout; import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder; 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.utils.UIComponentIdProvider; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import com.vaadin.server.Sizeable.Unit; import com.vaadin.ui.Window; @@ -21,18 +21,18 @@ import com.vaadin.ui.Window; * Abstract builder for Meta data window * * @param - * Generic type + * Generic type */ public abstract class AbstractMetaDataWindowBuilder extends AbstractEntityWindowBuilder { /** * Constructor for AbstractMetaDataWindowBuilder * - * @param i18n - * VaadinMessageSource + * @param uiDependencies + * {@link CommonUiDependencies} */ - public AbstractMetaDataWindowBuilder(final VaadinMessageSource i18n) { - super(i18n); + public AbstractMetaDataWindowBuilder(final CommonUiDependencies uiDependencies) { + super(uiDependencies); } @Override @@ -44,7 +44,7 @@ public abstract class AbstractMetaDataWindowBuilder extends AbstractEntityWin final F selectedEntityFilter, final String selectedEntityName, final ProxyMetaData proxyMetaData) { final CommonDialogWindow window = createWindow(metaDataWindowLayout, null); - window.setAssistivePrefix(i18n.getMessage("caption.metadata.popup") + " " + ""); + window.setAssistivePrefix(getI18n().getMessage("caption.metadata.popup") + " " + ""); window.setCaptionAsHtml(false); window.setCaption(selectedEntityName); window.setAssistivePostfix(""); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractMetaDataWindowLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractMetaDataWindowLayout.java index fe4d851bf..f20f35b8d 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractMetaDataWindowLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AbstractMetaDataWindowLayout.java @@ -12,9 +12,11 @@ import java.util.Collection; import java.util.Optional; import java.util.function.Consumer; +import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.model.MetaData; import org.eclipse.hawkbit.ui.SpPermissionChecker; 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.layout.AbstractGridComponentLayout; import org.eclipse.hawkbit.ui.utils.UINotification; @@ -36,9 +38,11 @@ public abstract class AbstractMetaDataWindowLayout extends HorizontalLayout { private static final long serialVersionUID = 1L; protected final VaadinMessageSource i18n; - protected final transient UIEventBus eventBus; protected final UINotification uiNotification; protected final SpPermissionChecker permChecker; + protected final transient UIEventBus eventBus; + protected final transient EntityFactory entityFactory; + protected final transient CommonUiDependencies uiDependencies; private final MetadataWindowGridHeader metadataWindowGridHeader; @@ -49,24 +53,19 @@ public abstract class AbstractMetaDataWindowLayout extends HorizontalLayout { /** * Constructor for AbstractTagWindowLayout * - * @param i18n - * I18N - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification - * @param permChecker - * SpPermissionChecker + * @param uiDependencies + * {@link CommonUiDependencies} */ - public AbstractMetaDataWindowLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, - final UINotification uiNotification, final SpPermissionChecker permChecker) { - this.i18n = i18n; - this.eventBus = eventBus; - this.uiNotification = uiNotification; - this.permChecker = permChecker; + public AbstractMetaDataWindowLayout(final CommonUiDependencies uiDependencies) { + this.uiDependencies = uiDependencies; + this.i18n = uiDependencies.getI18n(); + this.eventBus = uiDependencies.getEventBus(); + this.uiNotification = uiDependencies.getUiNotification(); + this.permChecker = uiDependencies.getPermChecker(); + this.entityFactory = uiDependencies.getEntityFactory(); - this.metadataWindowGridHeader = new MetadataWindowGridHeader(i18n, permChecker, eventBus, - this::hasMetadataChangePermission, this::showAddMetaDataLayout); + this.metadataWindowGridHeader = new MetadataWindowGridHeader(uiDependencies, this::hasMetadataChangePermission, + this::showAddMetaDataLayout); } // can be overriden in child classes for entity-specific permission @@ -74,14 +73,6 @@ public abstract class AbstractMetaDataWindowLayout extends HorizontalLayout { return permChecker.hasUpdateRepositoryPermission(); } - private void showAddMetaDataLayout() { - getMetaDataWindowGrid().deselectAll(); - getAddMetaDataWindowController().populateWithData(null); - saveCallback.accept(getAddMetaDataWindowController().getSaveDialogCloseListener()); - - resetSaveButton(); - } - protected MetaData createMetaData(final ProxyMetaData entity) { final MetaData newMetaData = doCreateMetaData(entity); @@ -144,6 +135,14 @@ public abstract class AbstractMetaDataWindowLayout extends HorizontalLayout { 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 */ diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AddMetaDataWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AddMetaDataWindowController.java index d4c75d1fe..3069fcb09 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AddMetaDataWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/AddMetaDataWindowController.java @@ -12,31 +12,30 @@ import java.util.function.Function; import java.util.function.Predicate; 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.utils.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; +import org.eclipse.hawkbit.ui.common.event.EntityModifiedEventPayload; import org.springframework.util.StringUtils; /** * Controller to add meta data window */ -public class AddMetaDataWindowController extends AbstractEntityWindowController { - private final VaadinMessageSource i18n; - private final UINotification uiNotification; - +public class AddMetaDataWindowController + extends AbstractAddEntityWindowController { private final MetaDataAddUpdateWindowLayout layout; private final Function createMetaDataCallback; private final Predicate duplicateCheckCallback; + private final ProxyMetadataValidator validator; /** * Constructor for AddMetaDataWindowController * - * @param i18n - * VaadinMessageSource - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param layout * MetaDataAddUpdateWindowLayout * @param createMetaDataCallback @@ -44,21 +43,15 @@ public class AddMetaDataWindowController extends AbstractEntityWindowController< * @param duplicateCheckCallback * Duplicate check callback */ - public AddMetaDataWindowController(final VaadinMessageSource i18n, final UINotification uiNotification, + public AddMetaDataWindowController(final CommonUiDependencies uiDependencies, final MetaDataAddUpdateWindowLayout layout, final Function createMetaDataCallback, final Predicate duplicateCheckCallback) { - this.i18n = i18n; - this.uiNotification = uiNotification; + super(uiDependencies); this.layout = layout; - this.createMetaDataCallback = createMetaDataCallback; this.duplicateCheckCallback = duplicateCheckCallback; - } - - @Override - public MetaDataAddUpdateWindowLayout getLayout() { - return layout; + this.validator = new ProxyMetadataValidator(uiDependencies); } @Override @@ -68,36 +61,56 @@ public class AddMetaDataWindowController extends AbstractEntityWindowController< return new ProxyMetaData(); } + @Override + public EntityWindowLayout getLayout() { + return layout; + } + @Override protected void adaptLayout(final ProxyMetaData proxyEntity) { layout.enableMetadataKey(); } @Override - protected void persistEntity(final ProxyMetaData entity) { - final MetaData newMetaData = createMetaDataCallback.apply(entity); - uiNotification.displaySuccess(i18n.getMessage("message.metadata.saved", newMetaData.getKey())); + protected String getPersistSuccessMessageKey() { + return "message.metadata.saved"; + } + + @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 getEntityClass() { + return ProxyMetaData.class; } @Override 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()); - if (duplicateCheckCallback.test(trimmedKey)) { - uiNotification.displayValidationError(i18n.getMessage("message.metadata.duplicate.check", trimmedKey)); - return false; - } - - return true; + return validator.isEntityValid(entity, () -> duplicateCheckCallback.test(trimmedKey)); } @Override diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/MetaDataWindowGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/MetaDataWindowGrid.java index a3df2094d..2c586db3d 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/MetaDataWindowGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/MetaDataWindowGrid.java @@ -12,7 +12,7 @@ import java.util.Collection; import java.util.function.BooleanSupplier; 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.data.providers.AbstractMetaDataDataProvider; 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.layout.MasterEntityAwareComponent; 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. @@ -45,14 +42,8 @@ public class MetaDataWindowGrid extends AbstractGrid implem /** * Constructor for MetaDataWindowGrid * - * @param i18n - * VaadinMessageSource - * @param eventBus - * UIEventBus - * @param permissionChecker - * SpPermissionChecker - * @param notification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param dataProvider * provides entity-specific metadata entities * @param hasMetadataChangePermission @@ -61,14 +52,12 @@ public class MetaDataWindowGrid extends AbstractGrid implem * callback method to delete metadata entities * */ - public MetaDataWindowGrid(final VaadinMessageSource i18n, final UIEventBus eventBus, - final SpPermissionChecker permissionChecker, final UINotification notification, - final AbstractMetaDataDataProvider dataProvider, final BooleanSupplier hasMetadataChangePermission, + public MetaDataWindowGrid(final CommonUiDependencies uiDependencies, final AbstractMetaDataDataProvider dataProvider,final BooleanSupplier hasMetadataChangePermission, final Predicate> itemsDeletionCallback) { - super(i18n, eventBus, permissionChecker); + super(uiDependencies.getI18n(), uiDependencies.getEventBus(), uiDependencies.getPermChecker()); 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, UIComponentIdProvider.METADATA_DELETE_CONFIRMATION_DIALOG); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/MetadataWindowGridHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/MetadataWindowGridHeader.java index 526a69724..bc1e894fc 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/MetadataWindowGridHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/MetadataWindowGridHeader.java @@ -10,13 +10,11 @@ package org.eclipse.hawkbit.ui.common.detailslayout; 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.support.AddHeaderSupport; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; 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; @@ -31,21 +29,15 @@ public class MetadataWindowGridHeader extends AbstractGridHeader { /** * Constructor for MetadataWindowGridHeader * - * @param i18n - * VaadinMessageSource - * @param permChecker - * SpPermissionChecker - * @param eventBus - * UIEventBus + * @param uiDependencies + * {@link CommonUiDependencies} * @param hasMetadataChangePermission * checks the permission allowing to change metadata entities * @param addNewItemCallback - * callback method to add new metadata entities + * Runnable */ - public MetadataWindowGridHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, - final UIEventBus eventBus, final BooleanSupplier hasMetadataChangePermission, - final Runnable addNewItemCallback) { - super(i18n, permChecker, eventBus); + public MetadataWindowGridHeader(final CommonUiDependencies uiDependencies,final BooleanSupplier hasMetadataChangePermission, final Runnable addNewItemCallback) { + super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus()); if (hasMetadataChangePermission.getAsBoolean()) { this.addHeaderSupport = new AddHeaderSupport(i18n, UIComponentIdProvider.METADATA_ADD_ICON_ID, diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/ProxyMetadataValidator.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/ProxyMetadataValidator.java new file mode 100644 index 000000000..8c0590242 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/ProxyMetadataValidator.java @@ -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; + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetails.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetails.java index 2e42b9d27..227bf6763 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetails.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetails.java @@ -18,13 +18,12 @@ import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; import org.eclipse.hawkbit.repository.model.SoftwareModuleType; 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.proxies.ProxyKeyValueDetails; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModule; 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.Window; @@ -46,10 +45,8 @@ public class SoftwareModuleDetails extends AbstractGridDetailsLayout(i18n, eventBus, UIComponentIdProvider.SW_TYPE_PREFIX, - this::showMetadataDetails, new SmMetaDataDataProvider(softwareManagement)); + this.smMetadataGrid = new MetadataDetailsGrid<>(i18n, uiDependencies.getEventBus(), + UIComponentIdProvider.SW_TYPE_PREFIX, this::showMetadataDetails, + new SmMetaDataDataProvider(softwareManagement)); addDetailsComponents(Arrays.asList(new SimpleEntry<>(i18n.getMessage("caption.tab.details"), entityDetails), new SimpleEntry<>(i18n.getMessage("caption.tab.description"), entityDescription), diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsGrid.java index 3c87ed637..eeec3583d 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsGrid.java @@ -24,6 +24,7 @@ import org.eclipse.hawkbit.repository.model.DistributionSetType; import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.repository.model.SoftwareModuleType; 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.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxySoftwareModuleDetails; @@ -51,7 +52,7 @@ import com.vaadin.ui.themes.ValoTheme; /** * Software module details table. - * + * */ public class SoftwareModuleDetailsGrid extends Grid implements MasterEntityAwareComponent { @@ -77,15 +78,9 @@ public class SoftwareModuleDetailsGrid extends Grid /** * Initialize software module table- to be displayed in details layout. - * - * @param i18n - * I18N - * @param eventBus - * SessionEventBus - * @param uiNotification - * UINotification for displaying error and success notifications - * @param permissionChecker - * SpPermissionChecker + * + * @param uiDependencies + * {@link CommonUiDependencies} * @param distributionSetManagement * DistributionSetManagement * @param smManagement @@ -93,14 +88,13 @@ public class SoftwareModuleDetailsGrid extends Grid * @param dsTypeManagement * DistributionSetTypeManagement */ - public SoftwareModuleDetailsGrid(final VaadinMessageSource i18n, final UIEventBus eventBus, - final UINotification uiNotification, final SpPermissionChecker permissionChecker, + public SoftwareModuleDetailsGrid(final CommonUiDependencies uiDependencies, final DistributionSetManagement distributionSetManagement, final SoftwareModuleManagement smManagement, final DistributionSetTypeManagement dsTypeManagement) { - this.i18n = i18n; - this.uiNotification = uiNotification; - this.eventBus = eventBus; - this.permissionChecker = permissionChecker; + this.i18n = uiDependencies.getI18n(); + this.uiNotification = uiDependencies.getUiNotification(); + this.eventBus = uiDependencies.getEventBus(); + this.permissionChecker = uiDependencies.getPermChecker(); this.distributionSetManagement = distributionSetManagement; this.smManagement = smManagement; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsHeader.java index ea19ff039..f3fef3bd2 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/SoftwareModuleDetailsHeader.java @@ -9,18 +9,15 @@ package org.eclipse.hawkbit.ui.common.detailslayout; 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.smtable.SmMetaDataWindowBuilder; 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.grid.header.AbstractDetailsHeader; import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; 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.ui.UI; @@ -34,6 +31,7 @@ public class SoftwareModuleDetailsHeader extends AbstractDetailsHeader { - private static final Logger LOG = LoggerFactory.getLogger(UpdateMetaDataWindowController.class); - - private final VaadinMessageSource i18n; - private final UINotification uiNotification; +public class UpdateMetaDataWindowController + extends AbstractUpdateEntityWindowController { private final MetaDataAddUpdateWindowLayout layout; - private final Function updateMetaDataCallback; + private final Predicate duplicateCheckCallback; + private final ProxyMetadataValidator validator; + + private String keyBeforeEdit; /** * Constructor for UpdateMetaDataWindowController * - * @param i18n - * VaadinMessageSource - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param layout * MetaDataAddUpdateWindowLayout * @param updateMetaDataCallback * 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, - final MetaDataAddUpdateWindowLayout layout, - final Function updateMetaDataCallback) { - this.i18n = i18n; - this.uiNotification = uiNotification; + public UpdateMetaDataWindowController(final CommonUiDependencies uiDependencies, + final MetaDataAddUpdateWindowLayout layout, final Function updateMetaDataCallback, + final Predicate duplicateCheckCallback) { + super(uiDependencies); this.layout = layout; - this.updateMetaDataCallback = updateMetaDataCallback; - } - - @Override - public MetaDataAddUpdateWindowLayout getLayout() { - return layout; + this.duplicateCheckCallback = duplicateCheckCallback; + this.validator = new ProxyMetadataValidator(uiDependencies); } @Override @@ -72,44 +65,75 @@ public class UpdateMetaDataWindowController extends AbstractEntityWindowControll metaData.setEntityId(proxyEntity.getEntityId()); metaData.setVisibleForTargets(proxyEntity.isVisibleForTargets()); + keyBeforeEdit = proxyEntity.getKey(); + return metaData; } + @Override + public EntityWindowLayout getLayout() { + return layout; + } + @Override protected void adaptLayout(final ProxyMetaData proxyEntity) { layout.disableMetadataKey(); } @Override - protected void persistEntity(final ProxyMetaData entity) { - try { - final MetaData updatedMetaData = updateMetaDataCallback.apply(entity); - uiNotification.displaySuccess(i18n.getMessage("message.metadata.updated", updatedMetaData.getKey())); - } catch (final EntityNotFoundException | EntityReadOnlyException e) { - LOG.trace("Update of meta data failed in UI: {}", e.getMessage()); - final String entityType = i18n.getMessage("caption.metadata"); - uiNotification - .displayWarning(i18n.getMessage("message.key.deleted.or.notAllowed", entityType, entity.getKey())); - } + protected boolean closeWindowAfterSave() { + return false; + } + + @Override + protected MetaData persistEntityInRepository(final ProxyMetaData entity) { + return updateMetaDataCallback.apply(entity); + } + + @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 getEntityClass() { + return ProxyMetaData.class; } @Override 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; - } - - return true; + final String trimmedKey = StringUtils.trimWhitespace(entity.getKey()); + return validator.isEntityValid(entity, + () -> hasKeyChanged(trimmedKey) && duplicateCheckCallback.test(trimmedKey)); } - @Override - protected boolean closeWindowAfterSave() { - return false; + private boolean hasKeyChanged(final String trimmedKey) { + return !keyBeforeEdit.equals(trimmedKey); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/distributionset/AbstractDistributionSetGridLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/distributionset/AbstractDistributionSetGridLayout.java new file mode 100644 index 000000000..2aea38ea9 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/distributionset/AbstractDistributionSetGridLayout.java @@ -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 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 AbstractDsGrid 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); + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/AbstractDsGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/distributionset/AbstractDsGrid.java similarity index 89% rename from hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/AbstractDsGrid.java rename to hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/distributionset/AbstractDsGrid.java index d7bc25e4e..37da9a5fc 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/AbstractDsGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/distributionset/AbstractDsGrid.java @@ -1,4 +1,4 @@ -/** +/** * Copyright (c) 2020 Bosch.IO GmbH and others. * * All rights reserved. This program and the accompanying materials @@ -6,14 +6,14 @@ * which accompanies this distribution, and is available at * 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.Optional; import java.util.stream.Collectors; 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.data.mappers.DistributionSetToProxyDistributionMapper; 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.EventTopics; 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.SelectionSupport; import org.eclipse.hawkbit.ui.common.state.GridLayoutUiState; 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.Button; @@ -50,15 +49,14 @@ public abstract class AbstractDsGrid extends AbstractGrid distributionDeleteSupport; + protected final transient UINotification notification; - protected AbstractDsGrid(final VaadinMessageSource i18n, final UIEventBus eventBus, - final SpPermissionChecker permissionChecker, final UINotification notification, - final DistributionSetManagement dsManagement, final GridLayoutUiState distributionSetGridLayoutUiState, - final EventView view) { - super(i18n, eventBus, permissionChecker); + protected AbstractDsGrid(final CommonUiDependencies uiDependencies, final DistributionSetManagement dsManagement, + final GridLayoutUiState distributionSetGridLayoutUiState, final EventView view) { + super(uiDependencies.getI18n(), uiDependencies.getEventBus(), uiDependencies.getPermChecker()); + this.notification = uiDependencies.getUiNotification(); this.distributionSetGridLayoutUiState = distributionSetGridLayoutUiState; this.dsManagement = dsManagement; this.dsToProxyDistributionMapper = new DistributionSetToProxyDistributionMapper(); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/DistributionSetDetails.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/distributionset/DistributionSetDetails.java similarity index 83% rename from hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/DistributionSetDetails.java rename to hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/distributionset/DistributionSetDetails.java index 2c1ab1f0d..9cb104530 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/DistributionSetDetails.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/distributionset/DistributionSetDetails.java @@ -6,7 +6,7 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ -package org.eclipse.hawkbit.ui.common.detailslayout; +package org.eclipse.hawkbit.ui.common.distributionset; import java.util.AbstractMap.SimpleEntry; import java.util.Arrays; @@ -22,16 +22,17 @@ import org.eclipse.hawkbit.repository.TenantConfigurationManagement; import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationProperties.TenantConfigurationKey; 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.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyKeyValueDetails; 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.distributions.dstable.DsMetaDataWindowBuilder; 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.Window; @@ -59,14 +60,8 @@ public class DistributionSetDetails extends AbstractGridDetailsLayout(i18n, eventBus, UIComponentIdProvider.DS_TYPE_PREFIX, - this::showMetadataDetails, new DsMetaDataDataProvider(dsManagement)); + this.dsMetadataGrid = new MetadataDetailsGrid<>(uiDependencies.getI18n(), uiDependencies.getEventBus(), + UIComponentIdProvider.DS_TYPE_PREFIX, this::showMetadataDetails, + new DsMetaDataDataProvider(dsManagement)); addDetailsComponents(Arrays.asList(new SimpleEntry<>(i18n.getMessage("caption.tab.details"), entityDetails), new SimpleEntry<>(i18n.getMessage("caption.tab.description"), entityDescription), diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/DistributionSetDetailsHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/distributionset/DistributionSetDetailsHeader.java similarity index 73% rename from hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/DistributionSetDetailsHeader.java rename to hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/distributionset/DistributionSetDetailsHeader.java index 69ab1ad50..1d4473972 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/detailslayout/DistributionSetDetailsHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/distributionset/DistributionSetDetailsHeader.java @@ -6,17 +6,12 @@ * which accompanies this distribution, and is available at * 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.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.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.vaadin.spring.events.EventBus.UIEventBus; import com.vaadin.ui.UI; import com.vaadin.ui.Window; @@ -33,23 +28,17 @@ public class DistributionSetDetailsHeader extends AbstractDetailsHeader { - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; - private final SpPermissionChecker permChecker; private final DistributionSetManagement dsManagement; /** * Constructor for DsMetaDataWindowBuilder * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification - * @param permChecker - * SpPermissionChecker + * @param uiDependencies + * {@link CommonUiDependencies} * @param dsManagement * DistributionSetManagement */ - public DsMetaDataWindowBuilder(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, final SpPermissionChecker permChecker, - final DistributionSetManagement dsManagement) { - super(i18n); - - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; - this.permChecker = permChecker; + public DsMetaDataWindowBuilder(final CommonUiDependencies uiDependencies, final DistributionSetManagement dsManagement) { + super(uiDependencies); this.dsManagement = dsManagement; } @@ -86,8 +64,6 @@ public class DsMetaDataWindowBuilder extends AbstractMetaDataWindowBuilder * @return Dialog window */ public Window getWindowForShowDsMetaData(final Long dsId, final String name, final ProxyMetaData proxyMetaData) { - return getWindowForShowMetaData( - new DsMetaDataWindowLayout(i18n, eventBus, permChecker, uiNotification, entityFactory, dsManagement), - dsId, name, proxyMetaData); + return getWindowForShowMetaData(new DsMetaDataWindowLayout(uiDependencies, dsManagement), dsId, name, proxyMetaData); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/distributionset/DsWindowBuilder.java similarity index 60% rename from hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsWindowBuilder.java rename to hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/distributionset/DsWindowBuilder.java index ac9395990..96d81491e 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/distributionset/DsWindowBuilder.java @@ -6,21 +6,21 @@ * which accompanies this distribution, and is available at * 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.DistributionSetTypeManagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SystemManagement; import org.eclipse.hawkbit.repository.TenantConfigurationManagement; import org.eclipse.hawkbit.security.SystemSecurityContext; 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.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.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.vaadin.spring.events.EventBus.UIEventBus; import com.vaadin.ui.Window; @@ -28,9 +28,6 @@ import com.vaadin.ui.Window; * Builder for distribution set window */ public class DsWindowBuilder extends AbstractEntityWindowBuilder { - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; private final SystemManagement systemManagement; private final SystemSecurityContext systemSecurityContext; private final TenantConfigurationManagement tenantConfigurationManagement; @@ -43,38 +40,28 @@ public class DsWindowBuilder extends AbstractEntityWindowBuilder { @@ -42,25 +41,18 @@ public class DistributionSetsToTagAssignmentSupport /** * Constructor for DistributionSetsToTagAssignmentSupport * - * @param notification - * UINotification - * @param i18n - * VaadinMessageSource + * @param uiDependencies + * {@link CommonUiDependencies} * @param distributionSetManagement * DistributionSetManagement - * @param eventBus - * UIEventBus - * @param permChecker - * SpPermissionChecker */ - public DistributionSetsToTagAssignmentSupport(final UINotification notification, final VaadinMessageSource i18n, - final DistributionSetManagement distributionSetManagement, final UIEventBus eventBus, - final SpPermissionChecker permChecker) { - super(notification, i18n); + public DistributionSetsToTagAssignmentSupport(final CommonUiDependencies uiDependencies, + final DistributionSetManagement distributionSetManagement) { + super(uiDependencies.getUiNotification(), uiDependencies.getI18n()); this.distributionSetManagement = distributionSetManagement; - this.eventBus = eventBus; - this.permChecker = permChecker; + this.eventBus = uiDependencies.getEventBus(); + this.permChecker = uiDependencies.getPermChecker(); } @Override diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/DistributionSetsToTargetAssignmentSupport.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/DistributionSetsToTargetAssignmentSupport.java index d719e5729..49276748b 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/DistributionSetsToTargetAssignmentSupport.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/DistributionSetsToTargetAssignmentSupport.java @@ -17,17 +17,16 @@ import org.eclipse.hawkbit.repository.TenantConfigurationManagement; import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationProperties.TenantConfigurationKey; 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.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; import org.eclipse.hawkbit.ui.management.miscs.DeploymentAssignmentWindowController; 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. - * + * */ public class DistributionSetsToTargetAssignmentSupport extends DeploymentAssignmentSupport { @@ -40,10 +39,8 @@ public class DistributionSetsToTargetAssignmentSupport /** * Constructor for DistributionSetsToTargetAssignmentSupport * - * @param notification - * UINotification - * @param i18n - * VaadinMessageSource + * @param uiDependencies + * {@link CommonUiDependencies} * @param systemSecurityContext * SystemSecurityContext * @param configManagement @@ -53,14 +50,14 @@ public class DistributionSetsToTargetAssignmentSupport * @param assignmentController * DeploymentAssignmentWindowController */ - public DistributionSetsToTargetAssignmentSupport(final UINotification notification, final VaadinMessageSource i18n, + public DistributionSetsToTargetAssignmentSupport(final CommonUiDependencies uiDependencies, final SystemSecurityContext systemSecurityContext, final TenantConfigurationManagement configManagement, - final SpPermissionChecker permChecker, final DeploymentAssignmentWindowController assignmentController) { - super(notification, i18n); + final DeploymentAssignmentWindowController assignmentController) { + super(uiDependencies.getUiNotification(), uiDependencies.getI18n()); this.systemSecurityContext = systemSecurityContext; this.configManagement = configManagement; - this.permChecker = permChecker; + this.permChecker = uiDependencies.getPermChecker(); this.assignmentController = assignmentController; } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/DsTagsToDistributionSetAssignmentSupport.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/DsTagsToDistributionSetAssignmentSupport.java index 6b9dfebe5..18c5d11ba 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/DsTagsToDistributionSetAssignmentSupport.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/DsTagsToDistributionSetAssignmentSupport.java @@ -15,52 +15,40 @@ import org.eclipse.hawkbit.im.authentication.SpPermission; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.model.AbstractAssignmentResult; 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.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.vaadin.spring.events.EventBus.UIEventBus; /** * Support for assigning the distribution set tags to distribution set. - * + * */ public class DsTagsToDistributionSetAssignmentSupport extends TagsAssignmentSupport { private final DistributionSetManagement distributionSetManagement; - private final UIEventBus eventBus; - private final SpPermissionChecker permChecker; + private final CommonUiDependencies uiDependencies; /** * Constructor for DsTagsToDistributionSetAssignmentSupport * - * @param notification - * UINotification - * @param i18n - * VaadinMessageSource + * @param uiDependencies + * {@link CommonUiDependencies} * @param distributionSetManagement * DistributionSetManagement - * @param eventBus - * UIEventBus - * @param permChecker - * SpPermissionChecker */ - public DsTagsToDistributionSetAssignmentSupport(final UINotification notification, final VaadinMessageSource i18n, - final DistributionSetManagement distributionSetManagement, final UIEventBus eventBus, - final SpPermissionChecker permChecker) { - super(notification, i18n); + public DsTagsToDistributionSetAssignmentSupport(final CommonUiDependencies uiDependencies, + final DistributionSetManagement distributionSetManagement) { + super(uiDependencies); + this.uiDependencies = uiDependencies; this.distributionSetManagement = distributionSetManagement; - this.eventBus = eventBus; - this.permChecker = permChecker; } @Override public List getMissingPermissionsForDrop() { - return permChecker.hasUpdateRepositoryPermission() ? Collections.emptyList() + return uiDependencies.getPermChecker().hasUpdateRepositoryPermission() ? Collections.emptyList() : Collections.singletonList(SpPermission.UPDATE_REPOSITORY); } @@ -77,7 +65,7 @@ public class DsTagsToDistributionSetAssignmentSupport @Override 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())); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TagsAssignmentSupport.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TagsAssignmentSupport.java index e06eb0b05..0c5e0ae7f 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TagsAssignmentSupport.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TagsAssignmentSupport.java @@ -12,14 +12,13 @@ import java.util.List; import org.eclipse.hawkbit.repository.model.AbstractAssignmentResult; 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.utils.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; /** * Support for assigning the {@link ProxyTag} items to target item (target or * distribution set). - * + * * @param * The item-type of target item * @param @@ -27,8 +26,8 @@ import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; */ public abstract class TagsAssignmentSupport extends AssignmentSupport { - protected TagsAssignmentSupport(final UINotification notification, final VaadinMessageSource i18n) { - super(notification, i18n); + protected TagsAssignmentSupport(final CommonUiDependencies uiDependencies) { + super(uiDependencies.getUiNotification(), uiDependencies.getI18n()); } @Override diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TargetTagsToDistributionSetAssignmentSupport.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TargetTagsToDistributionSetAssignmentSupport.java index 7fac49df4..0c9f6d549 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TargetTagsToDistributionSetAssignmentSupport.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TargetTagsToDistributionSetAssignmentSupport.java @@ -13,16 +13,15 @@ import java.util.stream.Collectors; import org.eclipse.hawkbit.repository.TargetManagement; 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.ProxyTag; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; 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. - * + * */ public class TargetTagsToDistributionSetAssignmentSupport extends AssignmentSupport { private final TargetsToDistributionSetAssignmentSupport targetsToDistributionSetAssignmentSupport; @@ -31,19 +30,17 @@ public class TargetTagsToDistributionSetAssignmentSupport extends AssignmentSupp /** * Constructor for TargetTagsToDistributionSetAssignmentSupport * - * @param notification - * UINotification - * @param i18n - * VaadinMessageSource + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetManagement * TargetManagement * @param targetsToDistributionSetAssignmentSupport * TargetsToDistributionSetAssignmentSupport */ - public TargetTagsToDistributionSetAssignmentSupport(final UINotification notification, - final VaadinMessageSource i18n, final TargetManagement targetManagement, + public TargetTagsToDistributionSetAssignmentSupport(final CommonUiDependencies uiDependencies, + final TargetManagement targetManagement, final TargetsToDistributionSetAssignmentSupport targetsToDistributionSetAssignmentSupport) { - super(notification, i18n); + super(uiDependencies.getUiNotification(), uiDependencies.getI18n()); this.targetManagement = targetManagement; this.targetsToDistributionSetAssignmentSupport = targetsToDistributionSetAssignmentSupport; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TargetTagsToTargetAssignmentSupport.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TargetTagsToTargetAssignmentSupport.java index 04ea71bc8..ec8e6e8ba 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TargetTagsToTargetAssignmentSupport.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TargetTagsToTargetAssignmentSupport.java @@ -15,50 +15,39 @@ import org.eclipse.hawkbit.im.authentication.SpPermission; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.model.AbstractAssignmentResult; 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.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.vaadin.spring.events.EventBus.UIEventBus; /** * Support for assigning target tags to target. - * + * */ public class TargetTagsToTargetAssignmentSupport extends TagsAssignmentSupport { private final TargetManagement targetManagement; - private final UIEventBus eventBus; - private final SpPermissionChecker permChecker; + private final CommonUiDependencies uiDependencies; /** * Constructor for TargetTagsToTargetAssignmentSupport * - * @param notification - * UINotification - * @param i18n - * VaadinMessageSource + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetManagement * TargetManagement - * @param eventBus - * UIEventBus - * @param permChecker - * SpPermissionChecker */ - public TargetTagsToTargetAssignmentSupport(final UINotification notification, final VaadinMessageSource i18n, - final TargetManagement targetManagement, final UIEventBus eventBus, final SpPermissionChecker permChecker) { - super(notification, i18n); + public TargetTagsToTargetAssignmentSupport(final CommonUiDependencies uiDependencies, + final TargetManagement targetManagement) { + super(uiDependencies); + this.uiDependencies = uiDependencies; this.targetManagement = targetManagement; - this.eventBus = eventBus; - this.permChecker = permChecker; } @Override public List getMissingPermissionsForDrop() { - return permChecker.hasUpdateTargetPermission() ? Collections.emptyList() + return uiDependencies.getPermChecker().hasUpdateTargetPermission() ? Collections.emptyList() : Collections.singletonList(SpPermission.UPDATE_TARGET); } @@ -74,7 +63,7 @@ public class TargetTagsToTargetAssignmentSupport extends TagsAssignmentSupport

{ @@ -35,20 +34,16 @@ public class TargetsToDistributionSetAssignmentSupport /** * Constructor for TargetsToDistributionSetAssignmentSupport * - * @param notification - * UINotification - * @param i18n - * VaadinMessageSource - * @param permChecker - * SpPermissionChecker + * @param uiDependencies + * {@link CommonUiDependencies} * @param assignmentController * DeploymentAssignmentWindowController */ - public TargetsToDistributionSetAssignmentSupport(final UINotification notification, final VaadinMessageSource i18n, - final SpPermissionChecker permChecker, final DeploymentAssignmentWindowController assignmentController) { - super(notification, i18n); + public TargetsToDistributionSetAssignmentSupport(final CommonUiDependencies uiDependencies, + final DeploymentAssignmentWindowController assignmentController) { + super(uiDependencies.getUiNotification(), uiDependencies.getI18n()); - this.permChecker = permChecker; + this.permChecker = uiDependencies.getPermChecker(); this.assignmentController = assignmentController; } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TargetsToTagAssignmentSupport.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TargetsToTagAssignmentSupport.java index a124f5ca2..382a303ed 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TargetsToTagAssignmentSupport.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/grid/support/assignment/TargetsToTagAssignmentSupport.java @@ -18,19 +18,18 @@ import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.model.AbstractAssignmentResult; 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.ProxyIdentifiableEntity; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; 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.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.vaadin.spring.events.EventBus.UIEventBus; /** * Support for assigning the {@link ProxyTarget} items to {@link ProxyTag}. - * + * */ public class TargetsToTagAssignmentSupport extends ToTagAssignmentSupport { private final TargetManagement targetManagement; @@ -40,23 +39,16 @@ public class TargetsToTagAssignmentSupport extends ToTagAssignmentSupport 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); + } + +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/tag/ProxyTagValidator.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/tag/ProxyTagValidator.java new file mode 100644 index 000000000..68dcaed04 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/tag/ProxyTagValidator.java @@ -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 + * true if the entity already exists in the + * repository + * @return true 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; + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/tagdetails/AbstractTagToken.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/tagdetails/AbstractTagToken.java index b67ea776e..989bd0e5c 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/tagdetails/AbstractTagToken.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/tagdetails/AbstractTagToken.java @@ -16,6 +16,7 @@ import java.util.stream.Collectors; import org.eclipse.hawkbit.repository.Identifiable; 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.ProxyTag; import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent; @@ -42,12 +43,11 @@ public abstract class AbstractTagToken private T masterEntity; - protected AbstractTagToken(final SpPermissionChecker checker, final VaadinMessageSource i18n, - final UINotification uiNotification, final UIEventBus eventBus) { - this.checker = checker; - this.i18n = i18n; - this.uiNotification = uiNotification; - this.eventBus = eventBus; + protected AbstractTagToken(final CommonUiDependencies uiDependencies) { + this.checker = uiDependencies.getPermChecker(); + this.i18n = uiDependencies.getI18n(); + this.uiNotification = uiDependencies.getUiNotification(); + this.eventBus = uiDependencies.getEventBus(); buildTagPanel(); tagPanelLayout.setVisible(false); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/tagdetails/DistributionTagToken.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/tagdetails/DistributionTagToken.java index 98849c183..baa36ceb0 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/tagdetails/DistributionTagToken.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/tagdetails/DistributionTagToken.java @@ -17,7 +17,7 @@ import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetTagManagement; import org.eclipse.hawkbit.repository.model.DistributionSet; 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.proxies.ProxyDistributionSet; 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.EventTopics; 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. @@ -42,24 +39,17 @@ public class DistributionTagToken extends AbstractTagToken /** * Constructor for DistributionTagToken * - * @param checker - * SpPermissionChecker - * @param i18n - * VaadinMessageSource - * @param uinotification - * UINotification - * @param eventBus - * UIEventBus + * @param uiDependencies + * {@link CommonUiDependencies} * @param distributionSetTagManagement * DistributionSetTagManagement * @param distributionSetManagement * DistributionSetManagement */ - public DistributionTagToken(final SpPermissionChecker checker, final VaadinMessageSource i18n, - final UINotification uinotification, final UIEventBus eventBus, + public DistributionTagToken(final CommonUiDependencies uiDependencies, final DistributionSetTagManagement distributionSetTagManagement, final DistributionSetManagement distributionSetManagement) { - super(checker, i18n, uinotification, eventBus); + super(uiDependencies); this.distributionSetTagManagement = distributionSetTagManagement; this.distributionSetManagement = distributionSetManagement; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/tagdetails/TargetTagToken.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/tagdetails/TargetTagToken.java index ab7d562af..d21b3d41a 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/tagdetails/TargetTagToken.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/tagdetails/TargetTagToken.java @@ -17,7 +17,7 @@ import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetTagManagement; import org.eclipse.hawkbit.repository.model.Target; 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.proxies.ProxyTag; 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.EventTopics; 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. @@ -43,23 +40,16 @@ public class TargetTagToken extends AbstractTagToken { /** * Constructor for TargetTagToken * - * @param checker - * SpPermissionChecker - * @param i18n - * VaadinMessageSource - * @param uinotification - * UINotification - * @param eventBus - * UIEventBus + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetTagManagement * TargetTagManagement * @param targetManagement * TargetManagement */ - public TargetTagToken(final SpPermissionChecker checker, final VaadinMessageSource i18n, - final UINotification uinotification, final UIEventBus eventBus, - final TargetTagManagement targetTagManagement, final TargetManagement targetManagement) { - super(checker, i18n, uinotification, eventBus); + public TargetTagToken(final CommonUiDependencies uiDependencies, final TargetTagManagement targetTagManagement, + final TargetManagement targetManagement) { + super(uiDependencies); this.targetTagManagement = targetTagManagement; this.targetManagement = targetManagement; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/type/ProxyTypeValidator.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/type/ProxyTypeValidator.java new file mode 100644 index 000000000..16c05285f --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/type/ProxyTypeValidator.java @@ -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 + * true if the entity key already exists in the + * repository + * @param nameDuplicateCheck + * true if the entity name already exists in the + * repository + * @return true 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 + * true if the entity key already exists in the + * repository + * @param nameDuplicateCheck + * true if the entity name already exists in the + * repository + * @return true 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; + } + +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/DistributionsView.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/DistributionsView.java index 8b16cd603..a808159e5 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/DistributionsView.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/DistributionsView.java @@ -28,6 +28,7 @@ import org.eclipse.hawkbit.repository.TenantConfigurationManagement; import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.ui.AbstractHawkbitUI; 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.EventView; import org.eclipse.hawkbit.ui.common.event.EventViewAware; @@ -93,21 +94,24 @@ public class DistributionsView extends VerticalLayout implements View, BrowserWi this.permChecker = permChecker; this.manageDistUIState = manageDistUIState; + final CommonUiDependencies uiDependencies = new CommonUiDependencies(i18n, entityFactory, eventBus, uiNotification, + permChecker); + if (permChecker.hasReadRepositoryPermission()) { - this.dsTypeFilterLayout = new DSTypeFilterLayout(i18n, permChecker, eventBus, entityFactory, uiNotification, - softwareModuleTypeManagement, distributionSetTypeManagement, distributionSetManagement, - systemManagement, manageDistUIState.getDsTypeFilterLayoutUiState()); - this.distributionSetGridLayout = new DistributionSetGridLayout(i18n, eventBus, permChecker, uiNotification, - entityFactory, targetManagement, targetFilterQueryManagement, distributionSetManagement, - softwareModuleManagement, distributionSetTypeManagement, distributionSetTagManagement, - softwareModuleTypeManagement, systemManagement, configManagement, systemSecurityContext, + this.dsTypeFilterLayout = new DSTypeFilterLayout(uiDependencies, softwareModuleTypeManagement, + distributionSetTypeManagement, distributionSetManagement, systemManagement, + manageDistUIState.getDsTypeFilterLayoutUiState()); + this.distributionSetGridLayout = new DistributionSetGridLayout(uiDependencies, targetManagement, + targetFilterQueryManagement, distributionSetManagement, softwareModuleManagement, + distributionSetTypeManagement, distributionSetTagManagement, softwareModuleTypeManagement, + systemManagement, configManagement, systemSecurityContext, manageDistUIState.getDsTypeFilterLayoutUiState(), manageDistUIState.getDistributionSetGridLayoutUiState()); - this.swModuleGridLayout = new SwModuleGridLayout(i18n, uiNotification, eventBus, softwareModuleManagement, - softwareModuleTypeManagement, entityFactory, permChecker, artifactManagement, - manageDistUIState.getSmTypeFilterLayoutUiState(), manageDistUIState.getSwModuleGridLayoutUiState()); - this.distSMTypeFilterLayout = new DistSMTypeFilterLayout(eventBus, i18n, permChecker, entityFactory, - uiNotification, softwareModuleTypeManagement, manageDistUIState.getSmTypeFilterLayoutUiState()); + this.swModuleGridLayout = new SwModuleGridLayout(uiDependencies, softwareModuleManagement, + softwareModuleTypeManagement, artifactManagement, manageDistUIState.getSmTypeFilterLayoutUiState(), + manageDistUIState.getSwModuleGridLayoutUiState()); + this.distSMTypeFilterLayout = new DistSMTypeFilterLayout(uiDependencies, softwareModuleTypeManagement, + manageDistUIState.getSmTypeFilterLayoutUiState()); final Map layoutVisibilityHandlers = new EnumMap<>(EventLayout.class); layoutVisibilityHandlers.put(EventLayout.DS_TYPE_FILTER, @@ -201,12 +205,12 @@ public class DistributionsView extends VerticalLayout implements View, BrowserWi private void showDsTypeLayout() { dsTypeFilterLayout.setVisible(true); - distributionSetGridLayout.hideDsTypeHeaderIcon(); + distributionSetGridLayout.hideDsFilterHeaderIcon(); } private void hideDsTypeLayout() { dsTypeFilterLayout.setVisible(false); - distributionSetGridLayout.showDsTypeHeaderIcon(); + distributionSetGridLayout.showDsFilterHeaderIcon(); } private void maximizeDsGridLayout() { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/AddDsTypeWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/AddDsTypeWindowController.java index 0910e1265..b4b62a86f 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/AddDsTypeWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/AddDsTypeWindowController.java @@ -12,65 +12,47 @@ import java.util.List; import java.util.stream.Collectors; import org.eclipse.hawkbit.repository.DistributionSetTypeManagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.model.DistributionSetType; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; +import org.eclipse.hawkbit.ui.common.AbstractAddNamedEntityWindowController; +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.ProxyIdentifiableEntity; 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.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.eclipse.hawkbit.ui.common.type.ProxyTypeValidator; import org.springframework.util.StringUtils; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Add distribution set type window controller */ -public class AddDsTypeWindowController extends AbstractEntityWindowController { - private final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; +public class AddDsTypeWindowController + extends AbstractAddNamedEntityWindowController { private final DistributionSetTypeManagement dsTypeManagement; - private final DsTypeWindowLayout layout; + private final ProxyTypeValidator validator; /** * Constructor for AddDsTypeWindowController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param dsTypeManagement * DistributionSetTypeManagement * @param layout * DsTypeWindowLayout */ - public AddDsTypeWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, + public AddDsTypeWindowController(final CommonUiDependencies uiDependencies, final DistributionSetTypeManagement dsTypeManagement, final DsTypeWindowLayout layout) { - this.i18n = i18n; - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + super(uiDependencies); this.dsTypeManagement = dsTypeManagement; - this.layout = layout; + this.validator = new ProxyTypeValidator(uiDependencies); } @Override - public AbstractEntityWindowLayout getLayout() { + public EntityWindowLayout getLayout() { return layout; } @@ -82,7 +64,7 @@ public class AddDsTypeWindowController extends AbstractEntityWindowController mandatorySmTypeIds = entity.getSelectedSmTypes().stream().filter(ProxyType::isMandatory) .map(ProxyType::getId).collect(Collectors.toList()); @@ -90,34 +72,26 @@ public class AddDsTypeWindowController extends AbstractEntityWindowController !selectedSmType.isMandatory()).map(ProxyType::getId) .collect(Collectors.toList()); - final DistributionSetType newDsType = dsTypeManagement.create(entityFactory.distributionSetType().create() - .key(entity.getKey()).name(entity.getName()).description(entity.getDescription()) - .colour(entity.getColour()).mandatory(mandatorySmTypeIds).optional(optionalSmTypeIds)); + return dsTypeManagement.create(getEntityFactory().distributionSetType().create().key(entity.getKey()) + .name(entity.getName()).description(entity.getDescription()).colour(entity.getColour()) + .mandatory(mandatorySmTypeIds).optional(optionalSmTypeIds)); + } - uiNotification.displaySuccess(i18n.getMessage("message.save.success", newDsType.getName())); - eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( - EntityModifiedEventType.ENTITY_ADDED, ProxyDistributionSet.class, ProxyType.class, newDsType.getId())); + @Override + protected Class getEntityClass() { + return ProxyType.class; + } + + @Override + protected Class getParentEntityClass() { + return ProxyDistributionSet.class; } @Override 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 trimmedKey = StringUtils.trimWhitespace(entity.getKey()); - if (dsTypeManagement.getByName(trimmedName).isPresent()) { - uiNotification.displayValidationError(i18n.getMessage("message.type.duplicate.check", trimmedName)); - return false; - } - if (dsTypeManagement.getByKey(trimmedKey).isPresent()) { - uiNotification.displayValidationError(i18n.getMessage("message.type.key.ds.duplicate.check", trimmedKey)); - return false; - } - - return true; + return validator.isDsTypeValid(entity, () -> dsTypeManagement.getByKey(trimmedKey).isPresent(), + () -> dsTypeManagement.getByName(trimmedName).isPresent()); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/DsTypeWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/DsTypeWindowBuilder.java index 03796a03d..fe605f84a 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/DsTypeWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/DsTypeWindowBuilder.java @@ -10,14 +10,11 @@ package org.eclipse.hawkbit.ui.distributions.disttype; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetTypeManagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; 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.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; @@ -25,9 +22,6 @@ import com.vaadin.ui.Window; * Builder for distribution set type window */ public class DsTypeWindowBuilder extends AbstractEntityWindowBuilder { - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; private final DistributionSetTypeManagement dsTypeManagement; private final DistributionSetManagement dsManagement; @@ -36,30 +30,18 @@ public class DsTypeWindowBuilder extends AbstractEntityWindowBuilder /** * Constructor for DsTypeWindowBuilder * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param dsTypeManagement - * DistributionSetTypeManagement + * DistributionSetTypeManagement * @param dsManagement - * DistributionSetManagement + * DistributionSetManagement * @param smTypeManagement - * SoftwareModuleTypeManagement + * SoftwareModuleTypeManagement */ - public DsTypeWindowBuilder(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, - final DistributionSetTypeManagement dsTypeManagement, final DistributionSetManagement dsManagement, - final SoftwareModuleTypeManagement smTypeManagement) { - super(i18n); - - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + public DsTypeWindowBuilder(final CommonUiDependencies uiDependencies, final DistributionSetTypeManagement dsTypeManagement, + final DistributionSetManagement dsManagement, final SoftwareModuleTypeManagement smTypeManagement) { + super(uiDependencies); this.dsTypeManagement = dsTypeManagement; this.dsManagement = dsManagement; @@ -73,15 +55,14 @@ public class DsTypeWindowBuilder extends AbstractEntityWindowBuilder @Override public Window getWindowForAdd() { - return getWindowForNewEntity(new AddDsTypeWindowController(i18n, entityFactory, eventBus, uiNotification, - dsTypeManagement, new DsTypeWindowLayout(i18n, uiNotification, smTypeManagement))); + return getWindowForNewEntity(new AddDsTypeWindowController(uiDependencies, dsTypeManagement, + new DsTypeWindowLayout(uiDependencies, smTypeManagement))); } @Override public Window getWindowForUpdate(final ProxyType proxyType) { - return getWindowForEntity(proxyType, - new UpdateDsTypeWindowController(i18n, entityFactory, eventBus, uiNotification, dsTypeManagement, - dsManagement, new DsTypeWindowLayout(i18n, uiNotification, smTypeManagement))); + return getWindowForEntity(proxyType, new UpdateDsTypeWindowController(uiDependencies, dsTypeManagement, dsManagement, + new DsTypeWindowLayout(uiDependencies, smTypeManagement))); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/DsTypeWindowLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/DsTypeWindowLayout.java index 833cd5401..19e0bed33 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/DsTypeWindowLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/DsTypeWindowLayout.java @@ -9,11 +9,10 @@ package org.eclipse.hawkbit.ui.distributions.disttype; 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.data.proxies.ProxyType; 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.FormLayout; @@ -31,16 +30,14 @@ public class DsTypeWindowLayout extends TagWindowLayout { /** * Constructor for DsTypeWindowLayout * - * @param i18n - * VaadinMessageSource - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param softwareModuleTypeManagement - * SoftwareModuleTypeManagement + * SoftwareModuleTypeManagement */ - public DsTypeWindowLayout(final VaadinMessageSource i18n, final UINotification uiNotification, + public DsTypeWindowLayout(final CommonUiDependencies uiDependencies, final SoftwareModuleTypeManagement softwareModuleTypeManagement) { - super(i18n, uiNotification); + super(uiDependencies); this.dsTypeComponentBuilder = new DsTypeWindowLayoutComponentBuilder(i18n, softwareModuleTypeManagement); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/UpdateDsTypeWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/UpdateDsTypeWindowController.java index 9f8d2ded8..7c78c0b85 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/UpdateDsTypeWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/UpdateDsTypeWindowController.java @@ -15,44 +15,30 @@ import java.util.stream.Stream; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetTypeManagement; -import org.eclipse.hawkbit.repository.EntityFactory; 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.SoftwareModuleType; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; 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.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.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.CollectionUtils; +import org.eclipse.hawkbit.ui.common.type.ProxyTypeValidator; import org.springframework.util.StringUtils; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Controller for update distribution set type window */ -public class UpdateDsTypeWindowController extends AbstractEntityWindowController { - private static final Logger LOG = LoggerFactory.getLogger(UpdateDsTypeWindowController.class); - - private final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; +public class UpdateDsTypeWindowController + extends AbstractUpdateNamedEntityWindowController { private final DistributionSetTypeManagement dsTypeManagement; private final DistributionSetManagement dsManagement; private final TypeToProxyTypeMapper smTypeToProxyTypeMapper; - private final DsTypeWindowLayout layout; + private final ProxyTypeValidator validator; private String nameBeforeEdit; private String keyBeforeEdit; @@ -61,14 +47,8 @@ public class UpdateDsTypeWindowController extends AbstractEntityWindowController /** * Constructor for UpdateDsTypeWindowController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param dsTypeManagement * DistributionSetTypeManagement * @param dsManagement @@ -76,21 +56,16 @@ public class UpdateDsTypeWindowController extends AbstractEntityWindowController * @param layout * DsTypeWindowLayout */ - public UpdateDsTypeWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, + public UpdateDsTypeWindowController(final CommonUiDependencies uiDependencies, final DistributionSetTypeManagement dsTypeManagement, final DistributionSetManagement dsManagement, final DsTypeWindowLayout layout) { - this.i18n = i18n; - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + super(uiDependencies); this.dsTypeManagement = dsTypeManagement; this.dsManagement = dsManagement; - this.smTypeToProxyTypeMapper = new TypeToProxyTypeMapper<>(); - this.layout = layout; + this.validator = new ProxyTypeValidator(uiDependencies); } @Override @@ -144,15 +119,15 @@ public class UpdateDsTypeWindowController extends AbstractEntityWindowController layout.disableTypeKey(); if (isDsTypeAssigned) { - uiNotification.displayValidationError( - nameBeforeEdit + " " + i18n.getMessage("message.error.dist.set.type.update")); + getUiNotification().displayValidationError( + nameBeforeEdit + " " + getI18n().getMessage("message.error.dist.set.type.update")); layout.disableDsTypeSmSelectLayout(); } } @Override - protected void persistEntity(final ProxyType entity) { - final DistributionSetTypeUpdate dsTypeUpdate = entityFactory.distributionSetType().update(entity.getId()) + protected DistributionSetType persistEntityInRepository(final ProxyType entity) { + final DistributionSetTypeUpdate dsTypeUpdate = getEntityFactory().distributionSetType().update(entity.getId()) .description(entity.getDescription()).colour(entity.getColour()); final List mandatorySmTypeIds = entity.getSelectedSmTypes().stream().filter(ProxyType::isMandatory) @@ -164,40 +139,33 @@ public class UpdateDsTypeWindowController extends AbstractEntityWindowController dsTypeUpdate.mandatory(mandatorySmTypeIds).optional(optionalSmTypeIds); - try { - final DistributionSetType updatedDsType = dsTypeManagement.update(dsTypeUpdate); + return dsTypeManagement.update(dsTypeUpdate); + } - uiNotification.displaySuccess(i18n.getMessage("message.update.success", updatedDsType.getName())); - eventBus.publish(EventTopics.ENTITY_MODIFIED, this, - new EntityModifiedEventPayload(EntityModifiedEventType.ENTITY_UPDATED, ProxyDistributionSet.class, - ProxyType.class, updatedDsType.getId())); - } catch (final EntityNotFoundException | EntityReadOnlyException e) { - LOG.trace("Update of DS type failed in UI: {}", e.getMessage()); - final String entityType = i18n.getMessage("caption.entity.distribution.type"); - uiNotification - .displayWarning(i18n.getMessage("message.deleted.or.notAllowed", entityType, entity.getName())); - } + @Override + protected Class getEntityClass() { + return ProxyType.class; + } + + @Override + protected Class getParentEntityClass() { + return ProxyDistributionSet.class; } @Override 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 trimmedKey = StringUtils.trimWhitespace(entity.getKey()); - if (!nameBeforeEdit.equals(trimmedName) && dsTypeManagement.getByName(trimmedName).isPresent()) { - uiNotification.displayValidationError(i18n.getMessage("message.type.duplicate.check", trimmedName)); - return false; - } - if (!keyBeforeEdit.equals(trimmedKey) && dsTypeManagement.getByKey(trimmedKey).isPresent()) { - uiNotification.displayValidationError(i18n.getMessage("message.type.key.ds.duplicate.check", trimmedKey)); - return false; - } + return validator.isDsTypeValid(entity, + () -> hasKeyChanged(trimmedKey) && dsTypeManagement.getByKey(trimmedKey).isPresent(), + () -> hasNameChanged(trimmedName) && dsTypeManagement.getByName(trimmedName).isPresent()); + } - return true; + private boolean hasNameChanged(final String trimmedName) { + return !nameBeforeEdit.equals(trimmedName); + } + + private boolean hasKeyChanged(final String trimmedKey) { + return !keyBeforeEdit.equals(trimmedKey); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/filter/DSTypeFilterButtons.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/filter/DSTypeFilterButtons.java index 0c74c0a01..c1f3d6a47 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/filter/DSTypeFilterButtons.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/filter/DSTypeFilterButtons.java @@ -11,7 +11,7 @@ package org.eclipse.hawkbit.ui.distributions.disttype.filter; import org.eclipse.hawkbit.repository.DistributionSetTypeManagement; import org.eclipse.hawkbit.repository.SystemManagement; 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.providers.DistributionSetTypeDataProvider; 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.distributions.disttype.DsTypeWindowBuilder; 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; @@ -40,17 +37,11 @@ public class DSTypeFilterButtons extends AbstractTypeFilterButtons { /** * Constructor - * - * @param eventBus - * UIEventBus + * + * @param uiDependencies + * {@link CommonUiDependencies} * @param distributionSetTypeManagement * DistributionSetTypeManagement - * @param i18n - * VaadinMessageSource - * @param permChecker - * SpPermissionChecker - * @param uiNotification - * UINotification * @param systemManagement * SystemManagement * @param dsTypeWindowBuilder @@ -58,11 +49,10 @@ public class DSTypeFilterButtons extends AbstractTypeFilterButtons { * @param typeFilterLayoutUiState * TypeFilterLayoutUiState */ - public DSTypeFilterButtons(final UIEventBus eventBus, final VaadinMessageSource i18n, - final UINotification uiNotification, final SpPermissionChecker permChecker, + public DSTypeFilterButtons(final CommonUiDependencies uiDependencies, final DistributionSetTypeManagement distributionSetTypeManagement, final SystemManagement systemManagement, final DsTypeWindowBuilder dsTypeWindowBuilder, final TypeFilterLayoutUiState typeFilterLayoutUiState) { - super(eventBus, i18n, uiNotification, permChecker, typeFilterLayoutUiState); + super(uiDependencies, typeFilterLayoutUiState); this.distributionSetTypeManagement = distributionSetTypeManagement; this.dsTypeWindowBuilder = dsTypeWindowBuilder; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/filter/DSTypeFilterHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/filter/DSTypeFilterHeader.java index 5c0edc5c4..4bd97eb48 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/filter/DSTypeFilterHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/filter/DSTypeFilterHeader.java @@ -8,7 +8,7 @@ */ 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.EventView; 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.utils.UIComponentIdProvider; 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; @@ -36,20 +34,16 @@ public class DSTypeFilterHeader extends AbstractFilterHeader { /** * Constructor * - * @param eventBus - * DsTypeWindowBuilder - * @param i18n - * VaadinMessageSource - * @param permChecker - * SpPermissionChecker + * @param uiDependencies + * {@link CommonUiDependencies} * @param dsTypeWindowBuilder - * DsTypeWindowBuilder + * DsTypeWindowBuilder * @param dSTypeFilterLayoutUiState - * TypeFilterLayoutUiState + * TypeFilterLayoutUiState */ - DSTypeFilterHeader(final UIEventBus eventBus, final VaadinMessageSource i18n, final SpPermissionChecker permChecker, - final DsTypeWindowBuilder dsTypeWindowBuilder, final TypeFilterLayoutUiState dSTypeFilterLayoutUiState) { - super(i18n, permChecker, eventBus); + DSTypeFilterHeader(final CommonUiDependencies uiDependencies, final DsTypeWindowBuilder dsTypeWindowBuilder, + final TypeFilterLayoutUiState dSTypeFilterLayoutUiState) { + super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus()); this.dSTypeFilterLayoutUiState = dSTypeFilterLayoutUiState; this.dsTypeWindowBuilder = dsTypeWindowBuilder; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/filter/DSTypeFilterLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/filter/DSTypeFilterLayout.java index 108d924bc..df0b92305 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/filter/DSTypeFilterLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/disttype/filter/DSTypeFilterLayout.java @@ -13,10 +13,9 @@ import java.util.List; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetTypeManagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; 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.ProxyType; 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.state.TypeFilterLayoutUiState; 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; @@ -50,17 +46,9 @@ public class DSTypeFilterLayout extends AbstractFilterLayout { /** * Constructor - * - * @param i18n - * VaadinMessageSource - * @param permChecker - * SpPermissionChecker - * @param eventBus - * UIEventBus - * @param entityFactory - * EntityFactory - * @param uiNotification - * UINotification + * + * @param uiDependencies + * {@link CommonUiDependencies} * @param softwareModuleTypeManagement * SoftwareModuleTypeManagement * @param distributionSetTypeManagement @@ -72,25 +60,23 @@ public class DSTypeFilterLayout extends AbstractFilterLayout { * @param dSTypeFilterLayoutUiState * TypeFilterLayoutUiState */ - public DSTypeFilterLayout(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, - final UIEventBus eventBus, final EntityFactory entityFactory, final UINotification uiNotification, + public DSTypeFilterLayout(final CommonUiDependencies uiDependencies, final SoftwareModuleTypeManagement softwareModuleTypeManagement, final DistributionSetTypeManagement distributionSetTypeManagement, final DistributionSetManagement distributionSetManagement, final SystemManagement systemManagement, final TypeFilterLayoutUiState dSTypeFilterLayoutUiState) { - final DsTypeWindowBuilder dsTypeWindowBuilder = new DsTypeWindowBuilder(i18n, entityFactory, eventBus, - uiNotification, distributionSetTypeManagement, distributionSetManagement, softwareModuleTypeManagement); + final DsTypeWindowBuilder dsTypeWindowBuilder = new DsTypeWindowBuilder(uiDependencies, distributionSetTypeManagement, + distributionSetManagement, softwareModuleTypeManagement); - this.dsTypeFilterHeader = new DSTypeFilterHeader(eventBus, i18n, permChecker, dsTypeWindowBuilder, - dSTypeFilterLayoutUiState); - this.dSTypeFilterButtons = new DSTypeFilterButtons(eventBus, i18n, uiNotification, permChecker, - distributionSetTypeManagement, systemManagement, dsTypeWindowBuilder, dSTypeFilterLayoutUiState); + this.dsTypeFilterHeader = new DSTypeFilterHeader(uiDependencies, dsTypeWindowBuilder, dSTypeFilterLayoutUiState); + this.dSTypeFilterButtons = new DSTypeFilterButtons(uiDependencies, distributionSetTypeManagement, systemManagement, + dsTypeWindowBuilder, dSTypeFilterLayoutUiState); - this.gridActionsVisibilityListener = new GridActionsVisibilityListener(eventBus, + this.gridActionsVisibilityListener = new GridActionsVisibilityListener(uiDependencies.getEventBus(), new EventLayoutViewAware(EventLayout.DS_TYPE_FILTER, EventView.DISTRIBUTIONS), dSTypeFilterButtons::hideActionColumns, dSTypeFilterButtons::showEditColumn, dSTypeFilterButtons::showDeleteColumn); - this.entityModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyType.class) + this.entityModifiedListener = new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxyType.class) .entityModifiedAwareSupports(getEntityModifiedAwareSupports()) .parentEntityType(ProxyDistributionSet.class).build(); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/AddDsWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/AddDsWindowController.java index 63f3a200b..36fca626b 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/AddDsWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/AddDsWindowController.java @@ -9,54 +9,39 @@ package org.eclipse.hawkbit.ui.distributions.dstable; import org.eclipse.hawkbit.repository.DistributionSetManagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SystemManagement; import org.eclipse.hawkbit.repository.model.DistributionSet; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; +import org.eclipse.hawkbit.ui.common.AbstractAddNamedEntityWindowController; +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.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.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.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload; import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload.SelectionChangedEventType; -import org.eclipse.hawkbit.ui.utils.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; +import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.springframework.util.StringUtils; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Controller for add distribution set window */ -public class AddDsWindowController extends AbstractEntityWindowController { - private final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; +public class AddDsWindowController + extends AbstractAddNamedEntityWindowController { + private final SystemManagement systemManagement; - private final DistributionSetManagement dsManagement; - private final DsWindowLayout layout; - private final EventView view; + private final ProxyDsValidator validator; /** * Constructor for AddDsWindowController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * VaadinMessageSource - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param systemManagement * SystemManagement * @param dsManagement @@ -66,24 +51,19 @@ public class AddDsWindowController extends AbstractEntityWindowController getLayout() { + public EntityWindowLayout getLayout() { return layout; } @@ -101,36 +81,39 @@ public class AddDsWindowController extends AbstractEntityWindowController( - SelectionChangedEventType.ENTITY_SELECTED, addedItem, EventLayout.DS_LIST, view)); + @Override + protected String getDisplayableNameForFailedMessage(final ProxyDistributionSet entity) { + return HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion()); + } + + @Override + protected Class 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 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 trimmedVersion = StringUtils.trimWhitespace(entity.getVersion()); - if (dsManagement.getByNameAndVersion(trimmedName, trimmedVersion).isPresent()) { - uiNotification - .displayValidationError(i18n.getMessage("message.duplicate.dist", trimmedName, trimmedVersion)); - return false; - } - - return true; + return validator.isEntityValid(entity, + () -> dsManagement.getByNameAndVersion(trimmedName, trimmedVersion).isPresent()); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetGrid.java index 514cdff29..8b83ad470 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetGrid.java @@ -16,13 +16,13 @@ import org.eclipse.hawkbit.repository.DistributionSetTypeManagement; import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SoftwareModuleTypeManagement; 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.providers.DistributionSetDistributionsStateDataProvider; 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.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.FilterSupport; 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.utils.SPUIDefinitions; 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. @@ -46,38 +43,29 @@ public class DistributionSetGrid extends AbstractDsGrid dsFilterListener; - private final transient SelectionChangedListener masterDsChangedListener; - private final transient SelectGridEntityListener selectDsListener; - private final transient EntityModifiedListener dsModifiedListener; - private final transient EntityModifiedListener tagModifiedListener; - /** * Constructor for DistributionSetGridLayout * - * @param i18n - * VaadinMessageSource - * @param eventBus - * UIEventBus - * @param permissionChecker - * SpPermissionChecker - * @param uiNotification - * UINotification - * @param entityFactory - * EntityFactory + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetManagement - * TargetManagement + * TargetManagement * @param targetFilterQueryManagement - * TargetFilterQueryManagement + * TargetFilterQueryManagement * @param distributionSetManagement - * DistributionSetManagement + * DistributionSetManagement * @param smManagement - * SoftwareModuleManagement + * SoftwareModuleManagement * @param distributionSetTypeManagement - * DistributionSetTypeManagement + * DistributionSetTypeManagement * @param distributionSetTagManagement - * DistributionSetTagManagement + * DistributionSetTagManagement * @param smTypeManagement - * SoftwareModuleTypeManagement + * SoftwareModuleTypeManagement * @param systemManagement - * SystemManagement + * SystemManagement * @param configManagement - * TenantConfigurationManagement + * TenantConfigurationManagement * @param systemSecurityContext - * SystemSecurityContext + * SystemSecurityContext * @param dSTypeFilterLayoutUiState - * TypeFilterLayoutUiState + * TypeFilterLayoutUiState * @param distributionSetGridLayoutUiState - * GridLayoutUiState + * GridLayoutUiState */ - public DistributionSetGridLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, - final SpPermissionChecker permissionChecker, final UINotification uiNotification, - final EntityFactory entityFactory, final TargetManagement targetManagement, + public DistributionSetGridLayout(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement, final TargetFilterQueryManagement targetFilterQueryManagement, final DistributionSetManagement distributionSetManagement, final SoftwareModuleManagement smManagement, final DistributionSetTypeManagement distributionSetTypeManagement, @@ -114,42 +95,40 @@ public class DistributionSetGridLayout extends AbstractGridComponentLayout { final TenantConfigurationManagement configManagement, final SystemSecurityContext systemSecurityContext, final TypeFilterLayoutUiState dSTypeFilterLayoutUiState, final GridLayoutUiState distributionSetGridLayoutUiState) { - final DsWindowBuilder dsWindowBuilder = new DsWindowBuilder(i18n, entityFactory, eventBus, uiNotification, - systemManagement, systemSecurityContext, configManagement, distributionSetManagement, + super(uiDependencies, systemManagement, systemSecurityContext, configManagement, distributionSetManagement, distributionSetTypeManagement, EventView.DISTRIBUTIONS); - final DsMetaDataWindowBuilder dsMetaDataWindowBuilder = new DsMetaDataWindowBuilder(i18n, entityFactory, - eventBus, uiNotification, permissionChecker, distributionSetManagement); - this.distributionSetGridHeader = new DistributionSetGridHeader(i18n, permissionChecker, eventBus, - dSTypeFilterLayoutUiState, distributionSetGridLayoutUiState, EventLayout.DS_TYPE_FILTER, - EventView.DISTRIBUTIONS); - this.distributionSetGridHeader.addAddHeaderSupport(dsWindowBuilder); + this.distributionSetGridHeader = new DistributionSetGridHeader(uiDependencies, dSTypeFilterLayoutUiState, + distributionSetGridLayoutUiState, EventLayout.DS_TYPE_FILTER, getEventView()); + this.distributionSetGridHeader.addAddHeaderSupport(getDsWindowBuilder()); 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, - uiNotification, dsWindowBuilder, dsMetaDataWindowBuilder); - this.distributionSetDetails = new DistributionSetDetails(i18n, eventBus, permissionChecker, uiNotification, - distributionSetManagement, smManagement, distributionSetTypeManagement, distributionSetTagManagement, - configManagement, systemSecurityContext, dsMetaDataWindowBuilder); + this.distributionSetGrid = new DistributionSetGrid(uiDependencies, targetManagement, distributionSetManagement, + smManagement, distributionSetTypeManagement, smTypeManagement, dSTypeFilterLayoutUiState, + distributionSetGridLayoutUiState); + + 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.addTfqDetailsGrid(targetFilterQueryManagement); this.distributionSetDetails.buildDetails(); - this.dsFilterListener = new FilterChangedListener<>(eventBus, ProxyDistributionSet.class, - new EventViewAware(EventView.DISTRIBUTIONS), distributionSetGrid.getFilterSupport()); - this.masterDsChangedListener = new SelectionChangedListener<>(eventBus, - new EventLayoutViewAware(EventLayout.DS_LIST, EventView.DISTRIBUTIONS), getDsEntityAwareComponents()); - this.selectDsListener = new SelectGridEntityListener<>(eventBus, - new EventLayoutViewAware(EventLayout.DS_LIST, EventView.DISTRIBUTIONS), - distributionSetGrid.getSelectionSupport()); - this.dsModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyDistributionSet.class) - .entityModifiedAwareSupports(getDsModifiedAwareSupports()).build(); - this.tagModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyTag.class) + addEventListener(new FilterChangedListener<>(uiDependencies.getEventBus(), ProxyDistributionSet.class, + new EventViewAware(getEventView()), distributionSetGrid.getFilterSupport())); + addEventListener(new SelectionChangedListener<>(uiDependencies.getEventBus(), + new EventLayoutViewAware(EventLayout.DS_LIST, getEventView()), getDsEntityAwareComponents())); + addEventListener(new SelectGridEntityListener<>(uiDependencies.getEventBus(), + new EventLayoutViewAware(EventLayout.DS_LIST, getEventView()), + distributionSetGrid.getSelectionSupport())); + addEventListener(new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxyDistributionSet.class) + .entityModifiedAwareSupports(getDsModifiedAwareSupports()).build()); + addEventListener(new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxyTag.class) .entityModifiedAwareSupports(getTagModifiedAwareSupports()).parentEntityType(ProxyDistributionSet.class) - .build(); + .build()); buildLayout(distributionSetGridHeader, distributionSetGrid, distributionSetDetailsHeader, distributionSetDetails); @@ -170,52 +149,13 @@ public class DistributionSetGridLayout extends AbstractGridComponentLayout { .singletonList(EntityModifiedTagTokenAwareSupport.of(distributionSetDetails.getDistributionTagToken())); } - /** - * Show distribution set type header icon - */ - public void showDsTypeHeaderIcon() { - distributionSetGridHeader.showFilterIcon(); + @Override + public DistributionSetGrid getDistributionGrid() { + return distributionSetGrid; } - /** - * Hide distribution set type header icon - */ - 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(); + @Override + public DistributionSetGridHeader getDistributionSetGridHeader() { + return distributionSetGridHeader; } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsMetaDataWindowLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsMetaDataWindowLayout.java index 3fb2868b3..b0ad9cde2 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsMetaDataWindowLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DsMetaDataWindowLayout.java @@ -11,9 +11,8 @@ package org.eclipse.hawkbit.ui.distributions.dstable; import java.util.Collections; import org.eclipse.hawkbit.repository.DistributionSetManagement; -import org.eclipse.hawkbit.repository.EntityFactory; 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.proxies.ProxyDistributionSet; 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.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.vaadin.spring.events.EventBus.UIEventBus; /** * Class for metadata add/update window layout. @@ -36,7 +32,6 @@ public class DsMetaDataWindowLayout extends AbstractMetaDataWindowLayout { private static final long serialVersionUID = 1L; private final transient DistributionSetManagement dsManagement; - private final transient EntityFactory entityFactory; private final MetaDataWindowGrid dsMetaDataWindowGrid; @@ -46,36 +41,26 @@ public class DsMetaDataWindowLayout extends AbstractMetaDataWindowLayout { /** * Constructor for AbstractTagWindowLayout - * - * @param i18n - * I18N - * @param eventBus - * UIEventBus - * @param permChecker - * SpPermissionChecker - * @param uiNotification - * UINotification - * @param entityFactory - * EntityFactory + * + * @param uiDependencies + * {@link CommonUiDependencies} * @param dsManagement * DistributionSetManagement */ - public DsMetaDataWindowLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, - final SpPermissionChecker permChecker, final UINotification uiNotification, - final EntityFactory entityFactory, final DistributionSetManagement dsManagement) { - super(i18n, eventBus, uiNotification, permChecker); + public DsMetaDataWindowLayout(final CommonUiDependencies uiDependencies, + final DistributionSetManagement dsManagement) { + super(uiDependencies); this.dsManagement = dsManagement; - this.entityFactory = entityFactory; - this.dsMetaDataWindowGrid = new MetaDataWindowGrid<>(i18n, eventBus, permChecker, uiNotification, - new DsMetaDataDataProvider(dsManagement), this::hasMetadataChangePermission, this::deleteMetaData); + this.dsMetaDataWindowGrid = new MetaDataWindowGrid<>(uiDependencies, new DsMetaDataDataProvider(dsManagement), + this::hasMetadataChangePermission,this::deleteMetaData); - this.metaDataAddUpdateWindowLayout = new MetaDataAddUpdateWindowLayout(i18n, this::hasMetadataChangePermission); - this.addDsMetaDataWindowController = new AddMetaDataWindowController(i18n, uiNotification, + this.metaDataAddUpdateWindowLayout = new MetaDataAddUpdateWindowLayout(i18n,this::hasMetadataChangePermission); + this.addDsMetaDataWindowController = new AddMetaDataWindowController(uiDependencies, metaDataAddUpdateWindowLayout, this::createMetaData, this::isDuplicate); - this.updateDsMetaDataWindowController = new UpdateMetaDataWindowController(i18n, uiNotification, - metaDataAddUpdateWindowLayout, this::updateMetaData); + this.updateDsMetaDataWindowController = new UpdateMetaDataWindowController(uiDependencies, + metaDataAddUpdateWindowLayout, this::updateMetaData, this::isDuplicate); buildLayout(); addGridSelectionListener(); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/ProxyDsValidator.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/ProxyDsValidator.java new file mode 100644 index 000000000..a40970cca --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/ProxyDsValidator.java @@ -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; + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/UpdateDsWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/UpdateDsWindowController.java index 27e5f1dc6..d44f24ea3 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/UpdateDsWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/UpdateDsWindowController.java @@ -9,72 +9,46 @@ package org.eclipse.hawkbit.ui.distributions.dstable; import org.eclipse.hawkbit.repository.DistributionSetManagement; -import org.eclipse.hawkbit.repository.EntityFactory; 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.ui.common.AbstractEntityWindowController; -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.EntityWindowLayout; 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.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.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity; +import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.springframework.util.StringUtils; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Controller for update distribution set window */ public class UpdateDsWindowController - extends AbstractEntityWindowController { - 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; + extends AbstractUpdateNamedEntityWindowController { private final DistributionSetManagement dsManagement; - private final DsWindowLayout layout; + private final ProxyDsValidator validator; + + private String nameBeforeEdit; + private String versionBeforeEdit; /** * Constructor for UpdateDsWindowController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param dsManagement * DistributionSetManagement * @param layout * DsWindowLayout */ - public UpdateDsWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, + public UpdateDsWindowController(final CommonUiDependencies uiDependencies, final DistributionSetManagement dsManagement, final DsWindowLayout layout) { - this.i18n = i18n; - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + super(uiDependencies); this.dsManagement = dsManagement; - this.layout = layout; - } - - @Override - public AbstractEntityWindowLayout getLayout() { - return layout; + this.validator = new ProxyDsValidator(uiDependencies); } @Override @@ -88,50 +62,54 @@ public class UpdateDsWindowController ds.setDescription(proxyEntity.getDescription()); ds.setRequiredMigrationStep(proxyEntity.isRequiredMigrationStep()); + nameBeforeEdit = proxyEntity.getName(); + versionBeforeEdit = proxyEntity.getVersion(); + return ds; } + @Override + public EntityWindowLayout getLayout() { + return layout; + } + @Override protected void adaptLayout(final ProxyDistributionSet proxyEntity) { layout.disableDsTypeSelect(); } @Override - protected void persistEntity(final ProxyDistributionSet entity) { - final DistributionSetUpdate dsUpdate = entityFactory.distributionSet().update(entity.getId()) + protected DistributionSet persistEntityInRepository(final ProxyDistributionSet entity) { + final DistributionSetUpdate dsUpdate = getEntityFactory().distributionSet().update(entity.getId()) .name(entity.getName()).version(entity.getVersion()).description(entity.getDescription()) .requiredMigrationStep(entity.isRequiredMigrationStep()); + return dsManagement.update(dsUpdate); + } - try { - final DistributionSet updatedDs = dsManagement.update(dsUpdate); + @Override + protected String getDisplayableName(final DistributionSet entity) { + return HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion()); + } - uiNotification.displaySuccess( - i18n.getMessage("message.update.success", updatedDs.getName() + ":" + updatedDs.getVersion())); - eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( - EntityModifiedEventType.ENTITY_UPDATED, ProxyDistributionSet.class, updatedDs.getId())); - } catch (final EntityNotFoundException | EntityReadOnlyException e) { - LOG.trace("Update of distribution set failed in UI: {}", e.getMessage()); - final String entityType = i18n.getMessage("caption.distribution"); - uiNotification - .displayWarning(i18n.getMessage("message.deleted.or.notAllowed", entityType, entity.getName())); - } + @Override + protected String getDisplayableNameForFailedMessage(final ProxyDistributionSet entity) { + return HawkbitCommonUtil.getFormattedNameVersion(entity.getName(), entity.getVersion()); + } + + @Override + protected Class getEntityClass() { + return ProxyDistributionSet.class; } @Override 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 trimmedVersion = StringUtils.trimWhitespace(entity.getVersion()); - if (dsManagement.getByNameAndVersion(trimmedName, trimmedVersion).isPresent()) { - uiNotification - .displayValidationError(i18n.getMessage("message.duplicate.dist", trimmedName, trimmedVersion)); - return false; - } + return validator.isEntityValid(entity, () -> hasNameOrVersionChanged(trimmedName, trimmedVersion) + && dsManagement.getByNameAndVersion(trimmedName, trimmedVersion).isPresent()); + } - return true; + private boolean hasNameOrVersionChanged(final String trimmedName, final String trimmedVersion) { + return !nameBeforeEdit.equals(trimmedName) || !versionBeforeEdit.equals(trimmedVersion); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleGridLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleGridLayout.java index ec4a46de3..0ea7ddf15 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleGridLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtable/SwModuleGridLayout.java @@ -13,14 +13,11 @@ import java.util.Collections; import java.util.List; import org.eclipse.hawkbit.repository.ArtifactManagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareModuleManagement; 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.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.ProxySoftwareModule; 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.EventView; 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.listener.EntityModifiedListener; 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.support.EntityModifiedGridRefreshAwareSupport; 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.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 */ -public class SwModuleGridLayout extends AbstractGridComponentLayout { +public class SwModuleGridLayout extends AbstractSoftwareModuleGridLayout { private static final long serialVersionUID = 1L; private final SoftwareModuleGridHeader swModuleGridHeader; @@ -55,29 +49,15 @@ public class SwModuleGridLayout extends AbstractGridComponentLayout { private final SoftwareModuleDetailsHeader softwareModuleDetailsHeader; private final SoftwareModuleDetails swModuleDetails; - private final transient FilterChangedListener smFilterListener; - private final transient SelectionChangedListener masterDsChangedListener; - private final transient SelectionChangedListener masterSmChangedListener; - private final transient SelectGridEntityListener selectSmListener; - private final transient EntityModifiedListener smModifiedListener; - /** * Constructor for SwModuleGridLayout * - * @param i18n - * VaadinMessageSource - * @param uiNotification - * UINotification - * @param eventBus - * UIEventBus + * @param uiDependencies + * {@link CommonUiDependencies} * @param softwareModuleManagement * SoftwareModuleManagement * @param softwareModuleTypeManagement * SoftwareModuleTypeManagement - * @param entityFactory - * EntityFactory - * @param permChecker - * SpPermissionChecker * @param artifactManagement * ArtifactManagement * @param smTypeFilterLayoutUiState @@ -85,48 +65,39 @@ public class SwModuleGridLayout extends AbstractGridComponentLayout { * @param swModuleGridLayoutUiState * GridLayoutUiState */ - public SwModuleGridLayout(final VaadinMessageSource i18n, final UINotification uiNotification, - final UIEventBus eventBus, final SoftwareModuleManagement softwareModuleManagement, - final SoftwareModuleTypeManagement softwareModuleTypeManagement, final EntityFactory entityFactory, - final SpPermissionChecker permChecker, final ArtifactManagement artifactManagement, - final TypeFilterLayoutUiState smTypeFilterLayoutUiState, + public SwModuleGridLayout(final CommonUiDependencies uiDependencies, final SoftwareModuleManagement softwareModuleManagement, + final SoftwareModuleTypeManagement softwareModuleTypeManagement, + final ArtifactManagement artifactManagement, final TypeFilterLayoutUiState smTypeFilterLayoutUiState, final GridLayoutUiState swModuleGridLayoutUiState) { - super(); + super(uiDependencies, softwareModuleManagement, softwareModuleTypeManagement, EventView.DISTRIBUTIONS); - final SmWindowBuilder smWindowBuilder = new SmWindowBuilder(i18n, entityFactory, eventBus, uiNotification, - softwareModuleManagement, softwareModuleTypeManagement, EventView.DISTRIBUTIONS); - 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 = new SoftwareModuleGridHeader(uiDependencies, smTypeFilterLayoutUiState, + swModuleGridLayoutUiState, getSmWindowBuilder(), getEventView()); this.swModuleGridHeader.buildHeader(); - this.swModuleGrid = new SoftwareModuleGrid(eventBus, i18n, permChecker, uiNotification, - smTypeFilterLayoutUiState, swModuleGridLayoutUiState, softwareModuleManagement, - EventView.DISTRIBUTIONS); + this.swModuleGrid = new SoftwareModuleGrid(uiDependencies, smTypeFilterLayoutUiState, swModuleGridLayoutUiState, + softwareModuleManagement, getEventView()); this.swModuleGrid.addDragAndDropSupport(); this.swModuleGrid.addMasterSupport(); this.swModuleGrid.init(); - this.softwareModuleDetailsHeader = new SoftwareModuleDetailsHeader(i18n, permChecker, eventBus, uiNotification, - smWindowBuilder, smMetaDataWindowBuilder); + this.softwareModuleDetailsHeader = new SoftwareModuleDetailsHeader(uiDependencies, getSmWindowBuilder(), + getSmMetaDataWindowBuilder()); this.softwareModuleDetailsHeader.addArtifactDetailsHeaderSupport(artifactManagement); this.softwareModuleDetailsHeader.buildHeader(); - this.swModuleDetails = new SoftwareModuleDetails(i18n, eventBus, softwareModuleManagement, - softwareModuleTypeManagement, smMetaDataWindowBuilder); + this.swModuleDetails = new SoftwareModuleDetails(uiDependencies, softwareModuleManagement, + softwareModuleTypeManagement, getSmMetaDataWindowBuilder()); this.swModuleDetails.buildDetails(); - this.smFilterListener = new FilterChangedListener<>(eventBus, ProxySoftwareModule.class, - new EventViewAware(EventView.DISTRIBUTIONS), swModuleGrid.getFilterSupport()); - this.masterDsChangedListener = new SelectionChangedListener<>(eventBus, - new EventLayoutViewAware(EventLayout.DS_LIST, EventView.DISTRIBUTIONS), getMasterDsAwareComponents()); - this.masterSmChangedListener = new SelectionChangedListener<>(eventBus, - new EventLayoutViewAware(EventLayout.SM_LIST, EventView.DISTRIBUTIONS), getMasterSmAwareComponents()); - this.selectSmListener = new SelectGridEntityListener<>(eventBus, - new EventLayoutViewAware(EventLayout.SM_LIST, EventView.DISTRIBUTIONS), - swModuleGrid.getSelectionSupport()); - this.smModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxySoftwareModule.class) - .entityModifiedAwareSupports(getSmModifiedAwareSupports()).build(); + addEventListener(new FilterChangedListener<>(uiDependencies.getEventBus(), ProxySoftwareModule.class, + new EventViewAware(getEventView()), swModuleGrid.getFilterSupport())); + addEventListener(new SelectionChangedListener<>(uiDependencies.getEventBus(), + new EventLayoutViewAware(EventLayout.DS_LIST, getEventView()), getMasterDsAwareComponents())); + addEventListener(new SelectionChangedListener<>(uiDependencies.getEventBus(), + new EventLayoutViewAware(EventLayout.SM_LIST, getEventView()), getMasterSmAwareComponents())); + addEventListener(new SelectGridEntityListener<>(uiDependencies.getEventBus(), + new EventLayoutViewAware(EventLayout.SM_LIST, getEventView()), swModuleGrid.getSelectionSupport())); + addEventListener(new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxySoftwareModule.class) + .entityModifiedAwareSupports(getSmModifiedAwareSupports()).build()); buildLayout(swModuleGridHeader, swModuleGrid, softwareModuleDetailsHeader, swModuleDetails); } @@ -145,52 +116,13 @@ public class SwModuleGridLayout extends AbstractGridComponentLayout { swModuleGrid::mapIdToProxyEntity)); } - /** - * Show software type module header icon - */ - public void showSmTypeHeaderIcon() { - swModuleGridHeader.showFilterIcon(); + @Override + protected SoftwareModuleGridHeader getSoftwareModuleGridHeader() { + return swModuleGridHeader; } - /** - * Hide software type module header icon - */ - 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(); + @Override + protected SoftwareModuleGrid getSoftwareModuleGrid() { + return swModuleGrid; } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtype/filter/DistSMTypeFilterLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtype/filter/DistSMTypeFilterLayout.java index aba00ee24..e366d5f8d 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtype/filter/DistSMTypeFilterLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/smtype/filter/DistSMTypeFilterLayout.java @@ -8,123 +8,45 @@ */ 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.ui.SpPermissionChecker; -import org.eclipse.hawkbit.ui.artifacts.smtype.SmTypeWindowBuilder; -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.artifacts.smtype.filter.SMTypeFilterLayout; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; 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.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. */ -public class DistSMTypeFilterLayout extends AbstractFilterLayout { +public class DistSMTypeFilterLayout extends SMTypeFilterLayout { private static final long serialVersionUID = 1L; - private final SMTypeFilterHeader smTypeFilterHeader; - private final SMTypeFilterButtons smTypeFilterButtons; - - private final transient GridActionsVisibilityListener gridActionsVisibilityListener; - private final transient EntityModifiedListener entityModifiedListener; - private final transient SmTypeCssStylesHandler smTypeCssStylesHandler; /** * Constructor - * - * @param eventBus - * UIEventBus - * @param i18n - * VaadinMessageSource - * @param permChecker - * SpPermissionChecker - * @param entityFactory - * EntityFactory - * @param uiNotification - * UINotification + * + * @param uiDependencies + * {@link CommonUiDependencies} * @param softwareModuleTypeManagement * SoftwareModuleTypeManagement * @param smTypeFilterLayoutUiState * TypeFilterLayoutUiState */ - public DistSMTypeFilterLayout(final UIEventBus eventBus, final VaadinMessageSource i18n, - final SpPermissionChecker permChecker, final EntityFactory entityFactory, - final UINotification uiNotification, final SoftwareModuleTypeManagement softwareModuleTypeManagement, + public DistSMTypeFilterLayout(final CommonUiDependencies uiDependencies, + final SoftwareModuleTypeManagement softwareModuleTypeManagement, final TypeFilterLayoutUiState smTypeFilterLayoutUiState) { - final SmTypeWindowBuilder smTypeWindowBuilder = new SmTypeWindowBuilder(i18n, entityFactory, eventBus, - 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(); + super(uiDependencies, softwareModuleTypeManagement, smTypeFilterLayoutUiState, EventView.DISTRIBUTIONS); this.smTypeCssStylesHandler = new SmTypeCssStylesHandler(softwareModuleTypeManagement); this.smTypeCssStylesHandler.updateSmTypeStyles(); - buildLayout(); - } - - private List getEntityModifiedAwareSupports() { - return Arrays.asList(EntityModifiedGridRefreshAwareSupport.of(this::refreshFilterButtons), - EntityModifiedGenericSupport.of(null, null, smTypeFilterButtons::resetFilterOnTypesDeleted)); - } - - private void refreshFilterButtons() { - smTypeFilterButtons.refreshAll(); - smTypeCssStylesHandler.updateSmTypeStyles(); + // buildLayout(); was already called in super(...) } @Override - protected SMTypeFilterHeader getFilterHeader() { - return smTypeFilterHeader; - } + protected void refreshFilterButtons() { + super.refreshFilterButtons(); - @Override - 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(); + this.smTypeCssStylesHandler.updateSmTypeStyles(); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/AddTargetFilterController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/AddTargetFilterController.java index b4008fdd3..b40a41ebe 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/AddTargetFilterController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/AddTargetFilterController.java @@ -8,19 +8,14 @@ */ package org.eclipse.hawkbit.ui.filtermanagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.model.TargetFilterQuery; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; +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.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.vaadin.spring.events.EventBus.UIEventBus; /** * Controller for add target filter @@ -29,54 +24,38 @@ import org.vaadin.spring.events.EventBus.UIEventBus; * */ public class AddTargetFilterController - extends AbstractEntityWindowController { - private final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; + extends AbstractAddEntityWindowController { private final TargetFilterQueryManagement targetFilterManagement; - private final TargetFilterAddUpdateLayout layout; - private final Runnable closeFormCallback; + private final ProxyTargetFilterValidator validator; /** * Constructor for AddTargetFilterController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetFilterManagement - * TargetFilterQueryManagement + * TargetFilterQueryManagement * @param layout - * TargetFilterAddUpdateLayout + * TargetFilterAddUpdateLayout * @param closeFormCallback - * Runnable + * Runnable */ - public AddTargetFilterController(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, + public AddTargetFilterController(final CommonUiDependencies uiDependencies, final TargetFilterQueryManagement targetFilterManagement, final TargetFilterAddUpdateLayout layout, final Runnable closeFormCallback) { - this.i18n = i18n; - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + super(uiDependencies); this.targetFilterManagement = targetFilterManagement; - this.layout = layout; - this.closeFormCallback = closeFormCallback; + this.validator = new ProxyTargetFilterValidator(uiDependencies); } @Override - public AbstractEntityWindowLayout getLayout() { + public EntityWindowLayout getLayout() { return layout; } @@ -86,30 +65,39 @@ public class AddTargetFilterController } @Override - protected void persistEntity(final ProxyTargetFilterQuery entity) { - final TargetFilterQuery newTargetFilter = targetFilterManagement - .create(entityFactory.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())); + protected TargetFilterQuery persistEntityInRepository(final ProxyTargetFilterQuery entity) { + return targetFilterManagement.create( + getEntityFactory().targetFilterQuery().create().name(entity.getName()).query(entity.getQuery())); + } + @Override + protected void postPersist() { 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 getEntityClass() { + return ProxyTargetFilterQuery.class; + } + @Override 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()); - if (targetFilterManagement.getByName(trimmedName).isPresent()) { - uiNotification.displayValidationError(i18n.getMessage("message.target.filter.duplicate", trimmedName)); - return false; - } - - return true; + return validator.isEntityValid(entity, () -> targetFilterManagement.getByName(trimmedName).isPresent()); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/AutoAssignmentWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/AutoAssignmentWindowBuilder.java index 8d8a69628..ab7e4ee63 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/AutoAssignmentWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/AutoAssignmentWindowBuilder.java @@ -9,15 +9,12 @@ package org.eclipse.hawkbit.ui.filtermanagement; import org.eclipse.hawkbit.repository.DistributionSetManagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.TargetManagement; 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.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; @@ -25,9 +22,6 @@ import com.vaadin.ui.Window; * Builder for auto assignment window */ public class AutoAssignmentWindowBuilder extends AbstractEntityWindowBuilder { - private final UIEventBus eventBus; - private final UINotification uiNotification; - private final EntityFactory entityFactory; private final TargetManagement targetManagement; private final TargetFilterQueryManagement targetFilterQueryManagement; @@ -36,30 +30,19 @@ public class AutoAssignmentWindowBuilder extends AbstractEntityWindowBuilder { - private final VaadinMessageSource i18n; - private final UIEventBus eventBus; - private final UINotification uiNotification; - private final EntityFactory entityFactory; +public class AutoAssignmentWindowController extends + AbstractUpdateEntityWindowController { private final TargetManagement targetManagement; private final TargetFilterQueryManagement targetFilterQueryManagement; - private final AutoAssignmentWindowLayout layout; /** * Constructor for AutoAssignmentWindowController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetManagement * TargetManagement * @param targetFilterQueryManagement @@ -61,26 +46,16 @@ public class AutoAssignmentWindowController * @param layout * AutoAssignmentWindowLayout */ - public AutoAssignmentWindowController(final VaadinMessageSource i18n, final UIEventBus eventBus, - final UINotification uiNotification, final EntityFactory entityFactory, + public AutoAssignmentWindowController(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement, final TargetFilterQueryManagement targetFilterQueryManagement, final AutoAssignmentWindowLayout layout) { - this.i18n = i18n; - this.eventBus = eventBus; - this.uiNotification = uiNotification; - this.entityFactory = entityFactory; + super(uiDependencies); this.targetManagement = targetManagement; this.targetFilterQueryManagement = targetFilterQueryManagement; - this.layout = layout; } - @Override - public AbstractEntityWindowLayout getLayout() { - return layout; - } - @Override protected ProxyTargetFilterQuery buildEntityFromProxy(final ProxyTargetFilterQuery proxyEntity) { final ProxyTargetFilterQuery autoAssignmentFilter = new ProxyTargetFilterQuery(); @@ -101,6 +76,11 @@ public class AutoAssignmentWindowController return autoAssignmentFilter; } + @Override + public EntityWindowLayout getLayout() { + return layout; + } + @Override protected void adaptLayout(final ProxyTargetFilterQuery proxyEntity) { layout.switchAutoAssignmentInputsVisibility(layout.getEntity().isAutoAssignmentEnabled()); @@ -108,36 +88,38 @@ public class AutoAssignmentWindowController @Override 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) { final Long autoAssignDsId = entity.getDistributionSetInfo().getId(); final Long targetsForAutoAssignmentCount = targetManagement.countByRsqlAndNonDS(autoAssignDsId, entity.getQuery()); - final String confirmationCaption = i18n + final String confirmationCaption = getI18n() .getMessage(UIMessageIdProvider.CAPTION_CONFIRM_AUTO_ASSIGN_CONSEQUENCES); final String confirmationQuestion = targetsForAutoAssignmentCount == 0 - ? i18n.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_NONE) + : getI18n().getMessage(UIMessageIdProvider.MESSAGE_CONFIRM_AUTO_ASSIGN_CONSEQUENCES_TEXT, targetsForAutoAssignmentCount); showConsequencesDialog(confirmationCaption, confirmationQuestion, entity.getId(), autoAssignDsId, - entity.getAutoAssignActionType(), entity); + entity.getAutoAssignActionType()); } else { - targetFilterQueryManagement - .updateAutoAssignDS(entityFactory.targetFilterQuery().updateAutoAssign(entity.getId()).ds(null)); - publishModifiedEvent(entity.getId()); + final TargetFilterQuery targetFilterQuery = targetFilterQueryManagement.updateAutoAssignDS( + getEntityFactory().targetFilterQuery().updateAutoAssign(entity.getId()).ds(null)); + publishModifiedEvent(createModifiedEventPayload(targetFilterQuery)); } } private void showConsequencesDialog(final String confirmationCaption, final String confirmationQuestion, - final Long targetFilterId, final Long autoAssignDsId, final ActionType autoAssignActionType, - final ProxyTargetFilterQuery entity) { - final ConfirmationDialog confirmDialog = new ConfirmationDialog(i18n, confirmationCaption, confirmationQuestion, - ok -> { + final Long targetFilterId, final Long autoAssignDsId, final ActionType autoAssignActionType) { + final ConfirmationDialog confirmDialog = new ConfirmationDialog(getI18n(), confirmationCaption, + confirmationQuestion, ok -> { if (ok) { - targetFilterQueryManagement.updateAutoAssignDS(entityFactory.targetFilterQuery() - .updateAutoAssign(targetFilterId).ds(autoAssignDsId).actionType(autoAssignActionType)); - publishModifiedEvent(entity.getId()); + final TargetFilterQuery targetFilterQuery = targetFilterQueryManagement.updateAutoAssignDS( + getEntityFactory().targetFilterQuery().updateAutoAssign(targetFilterId) + .ds(autoAssignDsId).actionType(autoAssignActionType)); + publishModifiedEvent(createModifiedEventPayload(targetFilterQuery)); } }, UIComponentIdProvider.DIST_SET_SELECT_CONS_WINDOW_ID); @@ -147,17 +129,52 @@ public class AutoAssignmentWindowController confirmDialog.getWindow().bringToFront(); } - private void publishModifiedEvent(final Long entityId) { - eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( - EntityModifiedEventType.ENTITY_UPDATED, ProxyTargetFilterQuery.class, entityId)); + @Override + protected TargetFilterQuery persistEntityInRepository(final ProxyTargetFilterQuery entity) { + // 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 getEntityClass() { + return ProxyTargetFilterQuery.class; } @Override protected boolean isEntityValid(final ProxyTargetFilterQuery entity) { if (entity.isAutoAssignmentEnabled() && (entity.getAutoAssignActionType() == null || entity.getDistributionSetInfo() == null)) { - uiNotification.displayValidationError( - i18n.getMessage(UIMessageIdProvider.MESSAGE_AUTOASSIGN_CREATE_ERROR_MISSINGELEMENTS)); + displayValidationError(UIMessageIdProvider.MESSAGE_AUTOASSIGN_CREATE_ERROR_MISSINGELEMENTS); return false; } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/FilterManagementView.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/FilterManagementView.java index 167b7740c..32cae63c6 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/FilterManagementView.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/FilterManagementView.java @@ -22,6 +22,7 @@ import org.eclipse.hawkbit.repository.rsql.RsqlValidationOracle; import org.eclipse.hawkbit.ui.AbstractHawkbitUI; import org.eclipse.hawkbit.ui.SpPermissionChecker; 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.EventView; 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) { this.filterManagementUIState = filterManagementUIState; - this.targetFilterGridLayout = new TargetFilterGridLayout(i18n, eventBus, permissionChecker, notification, - entityFactory, targetFilterQueryManagement, targetManagement, distributionSetManagement, - filterManagementUIState); + final CommonUiDependencies uiDependencies = new CommonUiDependencies(i18n, entityFactory, eventBus, notification, + permissionChecker); - this.targetFilterDetailsLayout = new TargetFilterDetailsLayout(i18n, permissionChecker, eventBus, notification, - uiProperties, entityFactory, rsqlValidationOracle, targetManagement, targetFilterQueryManagement, - filterManagementUIState.getDetailsLayoutUiState()); + this.targetFilterGridLayout = new TargetFilterGridLayout(uiDependencies, targetFilterQueryManagement, + targetManagement, distributionSetManagement, filterManagementUIState); + + this.targetFilterDetailsLayout = new TargetFilterDetailsLayout(uiDependencies, uiProperties, rsqlValidationOracle, + targetManagement, targetFilterQueryManagement, filterManagementUIState.getDetailsLayoutUiState()); final Map layoutVisibilityHandlers = new EnumMap<>(EventLayout.class); layoutVisibilityHandlers.put(EventLayout.TARGET_FILTER_QUERY_LIST, diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/ProxyTargetFilterValidator.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/ProxyTargetFilterValidator.java new file mode 100644 index 000000000..64bdbdbc9 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/ProxyTargetFilterValidator.java @@ -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; + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterDetailsGridHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterDetailsGridHeader.java index 3131eb477..6d7dbeea0 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterDetailsGridHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterDetailsGridHeader.java @@ -8,12 +8,12 @@ */ package org.eclipse.hawkbit.ui.filtermanagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; +import org.eclipse.hawkbit.repository.model.TargetFilterQuery; import org.eclipse.hawkbit.repository.rsql.RsqlValidationOracle; -import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.UiProperties; 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.event.CommandTopics; 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.utils.UIComponentIdProvider; 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 @@ -47,16 +44,8 @@ public class TargetFilterDetailsGridHeader extends AbstractBreadcrumbGridHeader /** * Constructor for TargetFilterDetailsGridHeader * - * @param i18n - * VaadinMessageSource - * @param permChecker - * SpPermissionChecker - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification - * @param entityFactory - * EntityFactory + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetFilterManagement * TargetFilterQueryManagement * @param uiProperties @@ -66,11 +55,10 @@ public class TargetFilterDetailsGridHeader extends AbstractBreadcrumbGridHeader * @param uiState * TargetFilterDetailsLayoutUiState */ - public TargetFilterDetailsGridHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, - final UIEventBus eventBus, final UINotification uiNotification, final EntityFactory entityFactory, + public TargetFilterDetailsGridHeader(final CommonUiDependencies uiDependencies, final TargetFilterQueryManagement targetFilterManagement, final UiProperties uiProperties, final RsqlValidationOracle rsqlValidationOracle, final TargetFilterDetailsLayoutUiState uiState) { - super(i18n, permChecker, eventBus); + super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus()); this.uiState = uiState; @@ -84,10 +72,10 @@ public class TargetFilterDetailsGridHeader extends AbstractBreadcrumbGridHeader this.targetFilterAddUpdateLayout = new TargetFilterAddUpdateLayout(i18n, permChecker, uiProperties, uiState, eventBus, rsqlValidationOracle); - this.addTargetFilterController = new AddTargetFilterController(i18n, entityFactory, eventBus, uiNotification, - targetFilterManagement, targetFilterAddUpdateLayout, this::closeDetails); - this.updateTargetFilterController = new UpdateTargetFilterController(i18n, entityFactory, eventBus, - uiNotification, targetFilterManagement, targetFilterAddUpdateLayout, this::closeDetails); + this.addTargetFilterController = new AddTargetFilterController(uiDependencies, targetFilterManagement, + targetFilterAddUpdateLayout, this::closeDetails); + this.updateTargetFilterController = new UpdateTargetFilterController(uiDependencies, targetFilterManagement, + targetFilterAddUpdateLayout, this::closeDetails); buildHeader(); } @@ -150,7 +138,7 @@ public class TargetFilterDetailsGridHeader extends AbstractBreadcrumbGridHeader } private void showAddUpdateFilterLayout(final String captionMessage, - final AbstractEntityWindowController controller, + final AbstractEntityWindowController controller, final ProxyTargetFilterQuery proxyEntity) { headerCaptionDetails.setValue(captionMessage); controller.populateWithData(proxyEntity); @@ -187,7 +175,7 @@ public class TargetFilterDetailsGridHeader extends AbstractBreadcrumbGridHeader /** * Check validity of target filter query. - * + * * @return {@code true}: if header form layout is active and the target * filter query is valid {@code false}: otherwise */ diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterDetailsLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterDetailsLayout.java index af5ede39b..1051ced93 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterDetailsLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterDetailsLayout.java @@ -8,12 +8,11 @@ */ package org.eclipse.hawkbit.ui.filtermanagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.rsql.RsqlValidationOracle; -import org.eclipse.hawkbit.ui.SpPermissionChecker; 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.ProxyTargetFilterQuery; 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.ShowEntityFormLayoutListener; 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. @@ -43,19 +39,11 @@ public class TargetFilterDetailsLayout extends AbstractGridComponentLayout { /** * TargetFilterDetailsLayout constructor - * - * @param i18n - * MessageSource - * @param permChecker - * SpPermissionChecker - * @param eventBus - * Bus to publish UI events - * @param uiNotification - * helper to display messages + * + * @param uiDependencies + * {@link CommonUiDependencies} * @param uiProperties * properties - * @param entityFactory - * entity factory * @param rsqlValidationOracle * to get RSQL validation and suggestions * @param targetManagement @@ -65,24 +53,23 @@ public class TargetFilterDetailsLayout extends AbstractGridComponentLayout { * @param uiState * to persist the user interaction */ - public TargetFilterDetailsLayout(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, - final UIEventBus eventBus, final UINotification uiNotification, final UiProperties uiProperties, - final EntityFactory entityFactory, final RsqlValidationOracle rsqlValidationOracle, - final TargetManagement targetManagement, final TargetFilterQueryManagement targetFilterManagement, - final TargetFilterDetailsLayoutUiState uiState) { + public TargetFilterDetailsLayout(final CommonUiDependencies uiDependencies, final UiProperties uiProperties, + final RsqlValidationOracle rsqlValidationOracle, final TargetManagement targetManagement, + final TargetFilterQueryManagement targetFilterManagement, final TargetFilterDetailsLayoutUiState uiState) { - this.targetFilterDetailsGridHeader = new TargetFilterDetailsGridHeader(i18n, permChecker, eventBus, - uiNotification, entityFactory, targetFilterManagement, uiProperties, rsqlValidationOracle, uiState); - this.targetFilterTargetGrid = new TargetFilterTargetGrid(i18n, eventBus, targetManagement, uiState); - this.targetFilterCountMessageLabel = new TargetFilterCountMessageLabel(i18n); + this.targetFilterDetailsGridHeader = new TargetFilterDetailsGridHeader(uiDependencies, targetFilterManagement, + uiProperties, rsqlValidationOracle, uiState); + this.targetFilterTargetGrid = new TargetFilterTargetGrid(uiDependencies, targetManagement, uiState); + this.targetFilterCountMessageLabel = new TargetFilterCountMessageLabel(uiDependencies.getI18n()); 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), targetFilterDetailsGridHeader::showAddFilterLayout, targetFilterDetailsGridHeader::showEditFilterLayout); - this.targetFilterListener = new FilterChangedListener<>(eventBus, ProxyTarget.class, + this.targetFilterListener = new FilterChangedListener<>(uiDependencies.getEventBus(), ProxyTarget.class, new EventViewAware(EventView.TARGET_FILTER), targetFilterTargetGrid.getFilterSupport()); buildLayout(targetFilterDetailsGridHeader, targetFilterTargetGrid, targetFilterCountMessageLabel); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterGrid.java index 1e2b41452..a4408c20a 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterGrid.java @@ -13,7 +13,7 @@ import java.util.stream.Collectors; import org.eclipse.hawkbit.im.authentication.SpPermission; 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.StatusIconBuilder.ActionTypeIconSupplier; 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.UIMessageIdProvider; import org.eclipse.hawkbit.ui.utils.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.springframework.util.StringUtils; -import org.vaadin.spring.events.EventBus.UIEventBus; import com.vaadin.data.ValueProvider; import com.vaadin.server.Sizeable; @@ -71,28 +69,21 @@ public class TargetFilterGrid extends AbstractGrid(eventBus, ProxyTargetFilterQuery.class, - new EventViewAware(EventView.TARGET_FILTER), targetFilterGrid.getFilterSupport()); - this.filterQueryModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyTargetFilterQuery.class) - .entityModifiedAwareSupports(getFilterQueryModifiedAwareSupports()).build(); + this.targetQueryFilterListener = new FilterChangedListener<>(uiDependencies.getEventBus(), + ProxyTargetFilterQuery.class, new EventViewAware(EventView.TARGET_FILTER), + targetFilterGrid.getFilterSupport()); + this.filterQueryModifiedListener = new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), + ProxyTargetFilterQuery.class).entityModifiedAwareSupports(getFilterQueryModifiedAwareSupports()) + .build(); buildLayout(targetFilterGridHeader, targetFilterGrid); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterTargetGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterTargetGrid.java index 619097650..031416268 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterTargetGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TargetFilterTargetGrid.java @@ -9,6 +9,7 @@ package org.eclipse.hawkbit.ui.filtermanagement; 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.StatusIconBuilder.TargetStatusIconSupplier; 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.filtermanagement.state.TargetFilterDetailsLayoutUiState; 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. @@ -36,9 +35,9 @@ public class TargetFilterTargetGrid extends AbstractGrid { private final TargetFilterDetailsLayoutUiState uiState; - TargetFilterTargetGrid(final VaadinMessageSource i18n, final UIEventBus eventBus, - final TargetManagement targetManagement, final TargetFilterDetailsLayoutUiState uiState) { - super(i18n, eventBus); + TargetFilterTargetGrid(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement, + final TargetFilterDetailsLayoutUiState uiState) { + super(uiDependencies.getI18n(), uiDependencies.getEventBus()); this.uiState = uiState; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/UpdateTargetFilterController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/UpdateTargetFilterController.java index f0da8dd84..f74f464a8 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/UpdateTargetFilterController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/UpdateTargetFilterController.java @@ -8,82 +8,54 @@ */ package org.eclipse.hawkbit.ui.filtermanagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; 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.ui.common.AbstractEntityWindowController; -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.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.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.vaadin.spring.events.EventBus.UIEventBus; /** * Controller for update target filter */ -public class UpdateTargetFilterController - extends AbstractEntityWindowController { - - 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; +public class UpdateTargetFilterController extends + AbstractUpdateEntityWindowController { private final TargetFilterQueryManagement targetFilterManagement; - private final TargetFilterAddUpdateLayout layout; - private final Runnable closeFormCallback; + private final ProxyTargetFilterValidator validator; private String nameBeforeEdit; /** * Constructor for UpdateTargetFilterController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetFilterManagement - * TargetFilterQueryManagement + * TargetFilterQueryManagement * @param layout - * TargetFilterAddUpdateLayout + * TargetFilterAddUpdateLayout * @param closeFormCallback - * Runnable + * Runnable */ - public UpdateTargetFilterController(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, + public UpdateTargetFilterController(final CommonUiDependencies uiDependencies, final TargetFilterQueryManagement targetFilterManagement, final TargetFilterAddUpdateLayout layout, final Runnable closeFormCallback) { - this.i18n = i18n; - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + super(uiDependencies); this.targetFilterManagement = targetFilterManagement; - this.layout = layout; - this.closeFormCallback = closeFormCallback; + this.validator = new ProxyTargetFilterValidator(uiDependencies); } @Override - public AbstractEntityWindowLayout getLayout() { + public EntityWindowLayout getLayout() { return layout; } @@ -101,39 +73,45 @@ public class UpdateTargetFilterController } @Override - protected void persistEntity(final ProxyTargetFilterQuery entity) { - final TargetFilterQueryUpdate targetFilterUpdate = entityFactory.targetFilterQuery().update(entity.getId()) + protected TargetFilterQuery persistEntityInRepository(final ProxyTargetFilterQuery entity) { + final TargetFilterQueryUpdate targetFilterUpdate = getEntityFactory().targetFilterQuery().update(entity.getId()) .name(entity.getName()).query(entity.getQuery()); + return targetFilterManagement.update(targetFilterUpdate); + } - try { - final TargetFilterQuery updatedTargetFilter = targetFilterManagement.update(targetFilterUpdate); + @Override + protected void postPersist() { + closeFormCallback.run(); + } - uiNotification.displaySuccess(i18n.getMessage("message.update.success", updatedTargetFilter.getName())); - eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( - EntityModifiedEventType.ENTITY_UPDATED, ProxyTargetFilterQuery.class, updatedTargetFilter.getId())); - } catch (final EntityNotFoundException | EntityReadOnlyException e) { - LOG.trace("Update of target filter failed in UI: {}", e.getMessage()); - final String entityType = i18n.getMessage("caption.target.filter"); - uiNotification - .displayWarning(i18n.getMessage("message.deleted.or.notAllowed", entityType, entity.getName())); - } finally { - 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 getEntityClass() { + return ProxyTargetFilterQuery.class; } @Override 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()); - if (!nameBeforeEdit.equals(trimmedName) && targetFilterManagement.getByName(trimmedName).isPresent()) { - uiNotification.displayValidationError(i18n.getMessage("message.target.filter.duplicate", trimmedName)); - return false; - } + return validator.isEntityValid(entity, + () -> hasNamedChanged(trimmedName) && targetFilterManagement.getByName(trimmedName).isPresent()); + } - return true; + private boolean hasNamedChanged(final String trimmedName) { + return !nameBeforeEdit.equals(trimmedName); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/DeploymentView.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/DeploymentView.java index 1fc71f8ef..394c31f88 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/DeploymentView.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/DeploymentView.java @@ -30,6 +30,7 @@ import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.ui.AbstractHawkbitUI; import org.eclipse.hawkbit.ui.SpPermissionChecker; 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.EventView; import org.eclipse.hawkbit.ui.common.event.EventViewAware; @@ -99,21 +100,23 @@ public class DeploymentView extends VerticalLayout implements View, BrowserWindo this.permChecker = permChecker; this.managementUIState = managementUIState; + final CommonUiDependencies uiDependencies = new CommonUiDependencies(i18n, entityFactory, eventBus, uiNotification, + permChecker); + if (permChecker.hasTargetReadPermission()) { - this.targetTagFilterLayout = new TargetTagFilterLayout(i18n, managementUIState, permChecker, eventBus, - uiNotification, entityFactory, targetFilterQueryManagement, targetTagManagement, targetManagement, + this.targetTagFilterLayout = new TargetTagFilterLayout(uiDependencies, managementUIState, + targetFilterQueryManagement, targetTagManagement, targetManagement, managementUIState.getTargetTagFilterLayoutUiState()); - this.targetGridLayout = new TargetGridLayout(eventBus, targetManagement, entityFactory, i18n, - uiNotification, deploymentManagement, uiProperties, permChecker, targetTagManagement, - distributionSetManagement, uiExecutor, configManagement, systemSecurityContext, + this.targetGridLayout = new TargetGridLayout(uiDependencies, targetManagement, deploymentManagement, uiProperties, + targetTagManagement, distributionSetManagement, uiExecutor, configManagement, systemSecurityContext, managementUIState.getTargetTagFilterLayoutUiState(), managementUIState.getTargetGridLayoutUiState(), managementUIState.getTargetBulkUploadUiState(), managementUIState.getDistributionGridLayoutUiState()); this.targetCountLayout = targetGridLayout.getCountMessageLabel().createFooterMessageComponent(); - this.actionHistoryLayout = new ActionHistoryLayout(i18n, deploymentManagement, eventBus, uiNotification, - permChecker, managementUIState.getActionHistoryGridLayoutUiState()); + this.actionHistoryLayout = new ActionHistoryLayout(uiDependencies, deploymentManagement, + managementUIState.getActionHistoryGridLayoutUiState()); } else { this.targetTagFilterLayout = null; this.targetGridLayout = null; @@ -122,14 +125,12 @@ public class DeploymentView extends VerticalLayout implements View, BrowserWindo } if (permChecker.hasReadRepositoryPermission()) { - this.distributionTagLayout = new DistributionTagLayout(eventBus, i18n, permChecker, - distributionSetTagManagement, entityFactory, uiNotification, distributionSetManagement, - managementUIState.getDistributionTagLayoutUiState()); - this.distributionGridLayout = new DistributionGridLayout(i18n, eventBus, permChecker, entityFactory, - uiNotification, targetManagement, distributionSetManagement, smManagement, - distributionSetTypeManagement, distributionSetTagManagement, systemManagement, deploymentManagement, - configManagement, systemSecurityContext, uiProperties, - managementUIState.getDistributionGridLayoutUiState(), + this.distributionTagLayout = new DistributionTagLayout(uiDependencies, distributionSetTagManagement, + distributionSetManagement, managementUIState.getDistributionTagLayoutUiState()); + this.distributionGridLayout = new DistributionGridLayout(uiDependencies, targetManagement, + distributionSetManagement, smManagement, distributionSetTypeManagement, + distributionSetTagManagement, systemManagement, deploymentManagement, configManagement, + systemSecurityContext, uiProperties, managementUIState.getDistributionGridLayoutUiState(), managementUIState.getDistributionTagLayoutUiState(), managementUIState.getTargetGridLayoutUiState()); } else { @@ -379,12 +380,12 @@ public class DeploymentView extends VerticalLayout implements View, BrowserWindo private void showDsTagLayout() { distributionTagLayout.setVisible(true); - distributionGridLayout.hideDsTagHeaderIcon(); + distributionGridLayout.hideDsFilterHeaderIcon(); } private void hideDsTagLayout() { distributionTagLayout.setVisible(false); - distributionGridLayout.showDsTagHeaderIcon(); + distributionGridLayout.showDsFilterHeaderIcon(); } private void maximizeActionHistoryGridLayout() { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryGrid.java index 7189c6250..7a56cb0e7 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryGrid.java @@ -15,8 +15,8 @@ import java.util.Optional; import org.eclipse.hawkbit.repository.DeploymentManagement; import org.eclipse.hawkbit.repository.exception.CancelActionNotAllowedException; 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.CommonUiDependencies; 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.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.UIMessageIdProvider; 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; import com.vaadin.data.ValueProvider; import com.vaadin.icons.VaadinIcons; @@ -86,12 +84,11 @@ public class ActionHistoryGrid extends AbstractGrid { private final transient MasterEntitySupport masterEntitySupport; - ActionHistoryGrid(final VaadinMessageSource i18n, final DeploymentManagement deploymentManagement, - final UIEventBus eventBus, final UINotification notification, final SpPermissionChecker permissionChecker, + ActionHistoryGrid(final CommonUiDependencies uiDependencies, final DeploymentManagement deploymentManagement, 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.actionToProxyActionMapper = new ActionToProxyActionMapper(); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryGridHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryGridHeader.java index af197a36e..69de4b0e3 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryGridHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryGridHeader.java @@ -8,6 +8,7 @@ */ 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.event.CommandTopics; 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.UIComponentIdProvider; 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. @@ -35,16 +34,14 @@ public class ActionHistoryGridHeader extends AbstractMasterAwareGridHeader(eventBus, masterLayoutView, + this.masterEntityChangedListener = new SelectionChangedListener<>(uiDependencies.getEventBus(), masterLayoutView, getMasterEntityAwareComponents()); - this.entityModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyAction.class) + this.entityModifiedListener = new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxyAction.class) .entityModifiedAwareSupports(getEntityModifiedAwareSupports()).parentEntityType(ProxyTarget.class) .parentEntityIdProvider(this::getMasterEntityId).build(); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryLayout.java index 08cac72f7..12daf1548 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionHistoryLayout.java @@ -9,10 +9,7 @@ package org.eclipse.hawkbit.ui.management.actionhistory; import org.eclipse.hawkbit.repository.DeploymentManagement; -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; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import com.vaadin.ui.HorizontalLayout; @@ -29,28 +26,21 @@ public class ActionHistoryLayout extends HorizontalLayout { /** * Constructor for ActionHistoryLayout * - * @param i18n - * VaadinMessageSource + * @param uiDependencies + * {@link CommonUiDependencies} * @param deploymentManagement - * DeploymentManagement - * @param eventBus - * UIEventBus - * @param notification - * UINotification - * @param permChecker - * SpPermissionChecker + * DeploymentManagement * @param actionHistoryGridLayoutUiState - * ActionHistoryGridLayoutUiState + * ActionHistoryGridLayoutUiState */ - public ActionHistoryLayout(final VaadinMessageSource i18n, final DeploymentManagement deploymentManagement, - final UIEventBus eventBus, final UINotification notification, final SpPermissionChecker permChecker, + public ActionHistoryLayout(final CommonUiDependencies uiDependencies, final DeploymentManagement deploymentManagement, final ActionHistoryGridLayoutUiState actionHistoryGridLayoutUiState) { - this.actionHistoryGridLayout = new ActionHistoryGridLayout(i18n, deploymentManagement, eventBus, notification, - permChecker, actionHistoryGridLayoutUiState); + this.actionHistoryGridLayout = new ActionHistoryGridLayout(uiDependencies, deploymentManagement, + actionHistoryGridLayoutUiState); - this.actionStatusLayout = new ActionStatusGridLayout(i18n, eventBus, deploymentManagement); - this.actionStatusMsgLayout = new ActionStatusMsgGridLayout(i18n, eventBus, deploymentManagement); + this.actionStatusLayout = new ActionStatusGridLayout(uiDependencies, deploymentManagement); + this.actionStatusMsgLayout = new ActionStatusMsgGridLayout(uiDependencies, deploymentManagement); init(); buildLayout(); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusGrid.java index c189eeac8..624eef028 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusGrid.java @@ -9,6 +9,7 @@ package org.eclipse.hawkbit.ui.management.actionhistory; import org.eclipse.hawkbit.repository.DeploymentManagement; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder; import org.eclipse.hawkbit.ui.common.builder.StatusIconBuilder.ActionStatusIconSupplier; import org.eclipse.hawkbit.ui.common.data.mappers.ActionStatusToProxyActionStatusMapper; @@ -25,8 +26,6 @@ import org.eclipse.hawkbit.ui.common.grid.support.SelectionSupport; import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil; import org.eclipse.hawkbit.ui.utils.SPUIDefinitions; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * This grid presents the action states for a selected action. @@ -44,16 +43,13 @@ public class ActionStatusGrid extends AbstractGrid { /** * Constructor. * - * @param i18n - * i18n - * @param eventBus - * eventBus + * @param uiDependencies + * {@link CommonUiDependencies} * @param deploymentManagement * deploymentManagement */ - protected ActionStatusGrid(final VaadinMessageSource i18n, final UIEventBus eventBus, - final DeploymentManagement deploymentManagement) { - super(i18n, eventBus, null); + protected ActionStatusGrid(final CommonUiDependencies uiDependencies, final DeploymentManagement deploymentManagement) { + super(uiDependencies.getI18n(), uiDependencies.getEventBus(), uiDependencies.getPermChecker()); setSelectionSupport(new SelectionSupport(this, eventBus, EventLayout.ACTION_HISTORY_STATUS_LIST, EventView.DEPLOYMENT, null, null, null)); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusGridLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusGridLayout.java index c669c403e..a7a229900 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusGridLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusGridLayout.java @@ -12,6 +12,7 @@ import java.util.Arrays; import java.util.List; import org.eclipse.hawkbit.repository.DeploymentManagement; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyAction; import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayoutViewAware; @@ -20,8 +21,6 @@ import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload.Selectio import org.eclipse.hawkbit.ui.common.layout.AbstractGridComponentLayout; import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent; import org.eclipse.hawkbit.ui.common.layout.listener.SelectionChangedListener; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Layout responsible for action-states-grid and the corresponding header. @@ -37,21 +36,18 @@ public class ActionStatusGridLayout extends AbstractGridComponentLayout { /** * Constructor for ActionStatusGridLayout * - * @param i18n - * VaadinMessageSource - * @param eventBus - * UIEventBus + * @param uiDependencies + * {@link CommonUiDependencies} * @param deploymentManagement - * DeploymentManagement + * DeploymentManagement */ - public ActionStatusGridLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, - final DeploymentManagement deploymentManagement) { - this.actionStatusGridHeader = new ActionStatusGridHeader(i18n); - this.actionStatusGrid = new ActionStatusGrid(i18n, eventBus, deploymentManagement); + public ActionStatusGridLayout(final CommonUiDependencies uiDependencies, final DeploymentManagement deploymentManagement) { + this.actionStatusGridHeader = new ActionStatusGridHeader(uiDependencies.getI18n()); + this.actionStatusGrid = new ActionStatusGrid(uiDependencies, deploymentManagement); final EventLayoutViewAware masterLayoutView = new EventLayoutViewAware(EventLayout.ACTION_HISTORY_LIST, EventView.DEPLOYMENT); - this.selectionChangedListener = new SelectionChangedListener<>(eventBus, masterLayoutView, + this.selectionChangedListener = new SelectionChangedListener<>(uiDependencies.getEventBus(), masterLayoutView, getMasterEntityAwareComponents()); buildLayout(actionStatusGridHeader, actionStatusGrid); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusMsgGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusMsgGrid.java index 4c52c885d..043814a83 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusMsgGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusMsgGrid.java @@ -11,6 +11,7 @@ package org.eclipse.hawkbit.ui.management.actionhistory; import javax.annotation.PreDestroy; import org.eclipse.hawkbit.repository.DeploymentManagement; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder; import org.eclipse.hawkbit.ui.common.data.providers.ActionStatusMsgDataProvider; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyActionStatus; @@ -23,8 +24,6 @@ import org.eclipse.hawkbit.ui.common.grid.support.SelectionSupport; import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.vaadin.spring.events.EventBus.UIEventBus; import com.vaadin.data.provider.Query; import com.vaadin.shared.Registration; @@ -45,17 +44,8 @@ public class ActionStatusMsgGrid extends AbstractGrid { private final Registration itemClickListenerRegistration; - /** - * Constructor. - * - * @param i18n - * i18n - * @param eventBus - * eventBus - */ - protected ActionStatusMsgGrid(final VaadinMessageSource i18n, final UIEventBus eventBus, - final DeploymentManagement deploymentManagement) { - super(i18n, eventBus, null); + protected ActionStatusMsgGrid(final CommonUiDependencies uiDependencies, final DeploymentManagement deploymentManagement) { + super(uiDependencies.getI18n(), uiDependencies.getEventBus(), uiDependencies.getPermChecker()); setSelectionSupport(new SelectionSupport(this)); getSelectionSupport().enableSingleSelection(); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusMsgGridLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusMsgGridLayout.java index 9f229954e..f4a30ec91 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusMsgGridLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/actionhistory/ActionStatusMsgGridLayout.java @@ -12,6 +12,7 @@ import java.util.Arrays; import java.util.List; import org.eclipse.hawkbit.repository.DeploymentManagement; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyActionStatus; import org.eclipse.hawkbit.ui.common.event.EventLayout; import org.eclipse.hawkbit.ui.common.event.EventLayoutViewAware; @@ -19,8 +20,6 @@ import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.layout.AbstractGridComponentLayout; import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent; import org.eclipse.hawkbit.ui.common.layout.listener.SelectionChangedListener; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Layout responsible for messages-grid and the corresponding header. @@ -36,21 +35,18 @@ public class ActionStatusMsgGridLayout extends AbstractGridComponentLayout { /** * Constructor for ActionStatusMsgGridLayout * - * @param i18n - * VaadinMessageSource - * @param eventBus - * UIEventBus + * @param uiDependencies + * {@link CommonUiDependencies} * @param deploymentManagement - * DeploymentManagement + * DeploymentManagement */ - public ActionStatusMsgGridLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, - final DeploymentManagement deploymentManagement) { - this.actionStatusMsgHeader = new ActionStatusMsgGridHeader(i18n); - this.actionStatusMsgGrid = new ActionStatusMsgGrid(i18n, eventBus, deploymentManagement); + public ActionStatusMsgGridLayout(final CommonUiDependencies uiDependencies, final DeploymentManagement deploymentManagement) { + this.actionStatusMsgHeader = new ActionStatusMsgGridHeader(uiDependencies.getI18n()); + this.actionStatusMsgGrid = new ActionStatusMsgGrid(uiDependencies, deploymentManagement); final EventLayoutViewAware masterLayoutView = new EventLayoutViewAware(EventLayout.ACTION_HISTORY_STATUS_LIST, EventView.DEPLOYMENT); - this.selectionChangedListener = new SelectionChangedListener<>(eventBus, masterLayoutView, + this.selectionChangedListener = new SelectionChangedListener<>(uiDependencies.getEventBus(), masterLayoutView, getMasterEntityAwareComponents()); buildLayout(actionStatusMsgHeader, actionStatusMsgGrid); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadHandler.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadHandler.java index 9baa656ac..5f8efa37a 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadHandler.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadHandler.java @@ -43,6 +43,7 @@ import org.eclipse.hawkbit.repository.exception.IncompleteDistributionSetExcepti import org.eclipse.hawkbit.repository.exception.MultiAssignmentIsNotEnabledException; import org.eclipse.hawkbit.repository.model.Action.ActionType; import org.eclipse.hawkbit.repository.model.DeploymentRequest; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyBulkUploadWindow; import org.eclipse.hawkbit.ui.common.event.BulkUploadEventPayload; import org.eclipse.hawkbit.ui.common.event.EventTopics; @@ -90,31 +91,18 @@ public class BulkUploadHandler implements SucceededListener, FailedListener, Rec private final transient Supplier bulkUploadInputsProvider; - /** - * Constructor - * - * @param i18n - * @param eventBus - * @param entityFactory - * @param uiExecutor - * @param targetManagement - * @param tagManagement - * @param distributionSetManagement - * @param deploymentManagement - * @param bulkUploadInputsProvider - */ - BulkUploadHandler(final VaadinMessageSource i18n, final UIEventBus eventBus, final EntityFactory entityFactory, - final Executor uiExecutor, final TargetManagement targetManagement, final TargetTagManagement tagManagement, + BulkUploadHandler(final CommonUiDependencies uiDependencies, final Executor uiExecutor, + final TargetManagement targetManagement, final TargetTagManagement tagManagement, final DistributionSetManagement distributionSetManagement, final DeploymentManagement deploymentManagement, final Supplier bulkUploadInputsProvider) { this.targetManagement = targetManagement; this.deploymentManagement = deploymentManagement; - this.i18n = i18n; + this.i18n = uiDependencies.getI18n(); this.uiExecutor = uiExecutor; - this.eventBus = eventBus; + this.eventBus = uiDependencies.getEventBus(); this.distributionSetManagement = distributionSetManagement; this.tagManagement = tagManagement; - this.entityFactory = entityFactory; + this.entityFactory = uiDependencies.getEntityFactory(); this.bulkUploadInputsProvider = bulkUploadInputsProvider; } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadWindowBuilder.java index 377ae7f63..00ed4c3e8 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/BulkUploadWindowBuilder.java @@ -13,17 +13,13 @@ import java.util.concurrent.Executor; import org.eclipse.hawkbit.repository.DeploymentManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetTagManagement; -import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.UiProperties; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.builder.WindowBuilder; import org.eclipse.hawkbit.ui.utils.SPUIDefinitions; 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; @@ -31,17 +27,13 @@ import com.vaadin.ui.Window; * Builder for bulk upload window */ public class BulkUploadWindowBuilder { - private final VaadinMessageSource i18n; - private final UIEventBus eventBus; - private final SpPermissionChecker checker; - private final UINotification uinotification; private final UiProperties uiproperties; private final Executor uiExecutor; private final TargetManagement targetManagement; private final DeploymentManagement deploymentManagement; private final TargetTagManagement tagManagement; private final DistributionSetManagement distributionSetManagement; - private final EntityFactory entityFactory; + private final CommonUiDependencies uiDependencies; private final TargetBulkUploadUiState targetBulkUploadUiState; @@ -50,48 +42,35 @@ public class BulkUploadWindowBuilder { /** * Constructor for BulkUploadWindowBuilder * - * @param i18n - * VaadinMessageSource - * @param eventBus - * UIEventBus - * @param checker - * SpPermissionChecker - * @param uinotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param uiproperties - * UiProperties + * UiProperties * @param uiExecutor - * Executor + * Executor * @param targetManagement - * TargetManagement + * TargetManagement * @param deploymentManagement - * DeploymentManagement + * DeploymentManagement * @param tagManagement - * TargetTagManagement + * TargetTagManagement * @param distributionSetManagement - * DistributionSetManagement - * @param entityFactory - * EntityFactory + * DistributionSetManagement * @param targetBulkUploadUiState - * TargetBulkUploadUiState + * TargetBulkUploadUiState */ - public BulkUploadWindowBuilder(final VaadinMessageSource i18n, final UIEventBus eventBus, - final SpPermissionChecker checker, final UINotification uinotification, final UiProperties uiproperties, + public BulkUploadWindowBuilder(final CommonUiDependencies uiDependencies, final UiProperties uiproperties, final Executor uiExecutor, final TargetManagement targetManagement, final DeploymentManagement deploymentManagement, final TargetTagManagement tagManagement, - final DistributionSetManagement distributionSetManagement, final EntityFactory entityFactory, + final DistributionSetManagement distributionSetManagement, final TargetBulkUploadUiState targetBulkUploadUiState) { - this.i18n = i18n; - this.eventBus = eventBus; - this.checker = checker; - this.uinotification = uinotification; + this.uiDependencies = uiDependencies; this.uiproperties = uiproperties; this.uiExecutor = uiExecutor; this.targetManagement = targetManagement; this.deploymentManagement = deploymentManagement; this.tagManagement = tagManagement; this.distributionSetManagement = distributionSetManagement; - this.entityFactory = entityFactory; this.targetBulkUploadUiState = targetBulkUploadUiState; } @@ -100,9 +79,9 @@ public class BulkUploadWindowBuilder { */ public Window getWindowForTargetBulkUpload() { if (!targetBulkUploadUiState.isInProgress() || targetBulkUpdateWindowLayout == null) { - targetBulkUpdateWindowLayout = new TargetBulkUpdateWindowLayout(i18n, eventBus, checker, uinotification, - targetManagement, deploymentManagement, tagManagement, distributionSetManagement, entityFactory, - uiproperties, uiExecutor, targetBulkUploadUiState); + targetBulkUpdateWindowLayout = new TargetBulkUpdateWindowLayout(uiDependencies, targetManagement, + deploymentManagement, tagManagement, distributionSetManagement, uiproperties, uiExecutor, + targetBulkUploadUiState); } final Window bulkUploadWindow = new WindowBuilder(SPUIDefinitions.CREATE_UPDATE_WINDOW) @@ -127,9 +106,9 @@ public class BulkUploadWindowBuilder { * Restore target bulk update window layout */ public void restoreState() { - targetBulkUpdateWindowLayout = new TargetBulkUpdateWindowLayout(i18n, eventBus, checker, uinotification, - targetManagement, deploymentManagement, tagManagement, distributionSetManagement, entityFactory, - uiproperties, uiExecutor, targetBulkUploadUiState); + targetBulkUpdateWindowLayout = new TargetBulkUpdateWindowLayout(uiDependencies, targetManagement, + deploymentManagement, tagManagement, distributionSetManagement, uiproperties, uiExecutor, + targetBulkUploadUiState); targetBulkUpdateWindowLayout.restoreComponentsValue(); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkTokenTags.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkTokenTags.java index 3da3b42ee..97dc2fe5f 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkTokenTags.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkTokenTags.java @@ -15,16 +15,13 @@ import java.util.stream.Collectors; import org.eclipse.hawkbit.repository.TargetTagManagement; 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.proxies.ProxyTag; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; import org.eclipse.hawkbit.ui.common.tagdetails.AbstractTagToken; import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; -import org.eclipse.hawkbit.ui.utils.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.springframework.util.CollectionUtils; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Target tag layout in bulk upload popup. @@ -35,9 +32,8 @@ public class TargetBulkTokenTags extends AbstractTagToken { private final TagToProxyTagMapper tagMapper; - TargetBulkTokenTags(final VaadinMessageSource i18n, final UIEventBus eventBus, final SpPermissionChecker checker, - final UINotification uinotification, final TargetTagManagement tagManagement) { - super(checker, i18n, uinotification, eventBus); + TargetBulkTokenTags(final CommonUiDependencies uiDependencies, final TargetTagManagement tagManagement) { + super(uiDependencies); this.tagManagement = tagManagement; this.tagMapper = new TagToProxyTagMapper<>(); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkUpdateWindowLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkUpdateWindowLayout.java index f5c32ecf0..7d6d8b081 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkUpdateWindowLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/bulkupload/TargetBulkUpdateWindowLayout.java @@ -14,11 +14,10 @@ import java.util.stream.Collectors; import org.eclipse.hawkbit.repository.DeploymentManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetTagManagement; -import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.UiProperties; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyBulkUploadWindow; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; @@ -29,7 +28,6 @@ import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; 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.data.Binder; import com.vaadin.icons.VaadinIcons; @@ -77,14 +75,8 @@ public class TargetBulkUpdateWindowLayout extends CustomComponent { /** * Constructor for TargetBulkUpdateWindowLayout * - * @param i18n - * VaadinMessageSource - * @param eventBus - * UIEventBus - * @param checker - * SpPermissionChecker - * @param uinotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetManagement * TargetManagement * @param deploymentManagement @@ -93,8 +85,6 @@ public class TargetBulkUpdateWindowLayout extends CustomComponent { * TargetTagManagement * @param distributionSetManagement * DistributionSetManagement - * @param entityFactory - * EntityFactory * @param uiproperties * UiProperties * @param uiExecutor @@ -102,14 +92,12 @@ public class TargetBulkUpdateWindowLayout extends CustomComponent { * @param targetBulkUploadUiState * TargetBulkUploadUiState */ - public TargetBulkUpdateWindowLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, - final SpPermissionChecker checker, final UINotification uinotification, - final TargetManagement targetManagement, final DeploymentManagement deploymentManagement, - final TargetTagManagement tagManagement, final DistributionSetManagement distributionSetManagement, - final EntityFactory entityFactory, final UiProperties uiproperties, final Executor uiExecutor, - final TargetBulkUploadUiState targetBulkUploadUiState) { - this.i18n = i18n; - this.uinotification = uinotification; + public TargetBulkUpdateWindowLayout(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement, + final DeploymentManagement deploymentManagement, final TargetTagManagement tagManagement, + final DistributionSetManagement distributionSetManagement, final UiProperties uiproperties, + final Executor uiExecutor, final TargetBulkUploadUiState targetBulkUploadUiState) { + this.i18n = uiDependencies.getI18n(); + this.uinotification = uiDependencies.getUiNotification(); this.targetBulkUploadUiState = targetBulkUploadUiState; this.binder = new Binder<>(); @@ -118,15 +106,14 @@ public class TargetBulkUpdateWindowLayout extends CustomComponent { this.dsCombo = componentBuilder.createDistributionSetCombo(binder); - this.tagsComponent = new TargetBulkTokenTags(i18n, eventBus, checker, uinotification, tagManagement); + this.tagsComponent = new TargetBulkTokenTags(uiDependencies, tagManagement); this.descTextArea = componentBuilder.createDescriptionField(binder); this.progressBar = createProgressBar(); this.targetsCountLabel = getStatusCountLabel(); - final BulkUploadHandler bulkUploadHandler = new BulkUploadHandler(i18n, eventBus, entityFactory, uiExecutor, - targetManagement, tagManagement, distributionSetManagement, deploymentManagement, - this::getBulkUploadInputsBean); + final BulkUploadHandler bulkUploadHandler = new BulkUploadHandler(uiDependencies, uiExecutor, targetManagement, + tagManagement, distributionSetManagement, deploymentManagement, this::getBulkUploadInputsBean); this.uploadButton = createUploadButton(bulkUploadHandler); this.linkToSystemConfigHelp = SPUIComponentProvider.getHelpLink(i18n, diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionGrid.java index df7221758..906d0dabf 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionGrid.java @@ -19,18 +19,18 @@ import org.eclipse.hawkbit.repository.DeploymentManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.model.DistributionSet; -import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.UiProperties; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder; import org.eclipse.hawkbit.ui.common.data.filters.DsManagementFilterParams; import org.eclipse.hawkbit.ui.common.data.providers.DistributionSetManagementStateDataProvider; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; +import org.eclipse.hawkbit.ui.common.distributionset.AbstractDsGrid; import org.eclipse.hawkbit.ui.common.event.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.FilterType; import org.eclipse.hawkbit.ui.common.event.PinningChangedEventPayload; import org.eclipse.hawkbit.ui.common.event.PinningChangedEventPayload.PinningChangedEventType; -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.FilterSupport; import org.eclipse.hawkbit.ui.common.grid.support.PinSupport; @@ -45,10 +45,7 @@ import org.eclipse.hawkbit.ui.management.targettable.TargetGridLayoutUiState; import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; -import org.eclipse.hawkbit.ui.utils.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.springframework.util.StringUtils; -import org.vaadin.spring.events.EventBus.UIEventBus; import com.vaadin.data.ValueProvider; import com.vaadin.icons.VaadinIcons; @@ -73,14 +70,8 @@ public class DistributionGrid extends AbstractDsGrid { /** * Constructor for DistributionGrid * - * @param eventBus - * UIEventBus - * @param i18n - * VaadinMessageSource - * @param permissionChecker - * SpPermissionChecker - * @param notification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetManagement * TargetManagement * @param distributionSetManagement @@ -96,15 +87,12 @@ public class DistributionGrid extends AbstractDsGrid { * @param distributionTagLayoutUiState * TagFilterLayoutUiState */ - public DistributionGrid(final UIEventBus eventBus, final VaadinMessageSource i18n, - final SpPermissionChecker permissionChecker, final UINotification notification, - final TargetManagement targetManagement, final DistributionSetManagement distributionSetManagement, - final DeploymentManagement deploymentManagement, final UiProperties uiProperties, - final DistributionGridLayoutUiState distributionGridLayoutUiState, + public DistributionGrid(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement, + final DistributionSetManagement distributionSetManagement, final DeploymentManagement deploymentManagement, + final UiProperties uiProperties, final DistributionGridLayoutUiState distributionGridLayoutUiState, final TargetGridLayoutUiState targetGridLayoutUiState, final TagFilterLayoutUiState distributionTagLayoutUiState) { - super(i18n, eventBus, permissionChecker, notification, distributionSetManagement, distributionGridLayoutUiState, - EventView.DEPLOYMENT); + super(uiDependencies, distributionSetManagement, distributionGridLayoutUiState, EventView.DEPLOYMENT); this.targetGridLayoutUiState = targetGridLayoutUiState; this.distributionGridLayoutUiState = distributionGridLayoutUiState; @@ -117,14 +105,14 @@ public class DistributionGrid extends AbstractDsGrid { final Map> sourceTargetAssignmentStrategies = new HashMap<>(); - final DeploymentAssignmentWindowController assignmentController = new DeploymentAssignmentWindowController(i18n, - uiProperties, eventBus, notification, deploymentManagement); + final DeploymentAssignmentWindowController assignmentController = new DeploymentAssignmentWindowController( + uiDependencies, uiProperties, deploymentManagement); final TargetsToDistributionSetAssignmentSupport targetsToDsAssignment = new TargetsToDistributionSetAssignmentSupport( - notification, i18n, permissionChecker, assignmentController); + uiDependencies, assignmentController); final TargetTagsToDistributionSetAssignmentSupport targetTagsToDsAssignment = new TargetTagsToDistributionSetAssignmentSupport( - notification, i18n, targetManagement, targetsToDsAssignment); + uiDependencies, targetManagement, targetsToDsAssignment); final DsTagsToDistributionSetAssignmentSupport dsTagsToDsAssignment = new DsTagsToDistributionSetAssignmentSupport( - notification, i18n, distributionSetManagement, eventBus, permissionChecker); + uiDependencies, distributionSetManagement); sourceTargetAssignmentStrategies.put(UIComponentIdProvider.TARGET_TABLE_ID, targetsToDsAssignment); sourceTargetAssignmentStrategies.put(UIComponentIdProvider.TARGET_TAG_TABLE_ID, targetTagsToDsAssignment); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionGridLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionGridLayout.java index 46967a6b7..c75ca96a1 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionGridLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionGridLayout.java @@ -16,24 +16,24 @@ import org.eclipse.hawkbit.repository.DeploymentManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetTagManagement; import org.eclipse.hawkbit.repository.DistributionSetTypeManagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.SoftwareModuleManagement; import org.eclipse.hawkbit.repository.SystemManagement; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TenantConfigurationManagement; import org.eclipse.hawkbit.security.SystemSecurityContext; -import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.UiProperties; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; 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.ProxyTarget; -import org.eclipse.hawkbit.ui.common.detailslayout.DistributionSetDetails; -import org.eclipse.hawkbit.ui.common.detailslayout.DistributionSetDetailsHeader; +import org.eclipse.hawkbit.ui.common.distributionset.AbstractDistributionSetGridLayout; +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.EventLayoutViewAware; import org.eclipse.hawkbit.ui.common.event.EventView; 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.listener.EntityModifiedListener; import org.eclipse.hawkbit.ui.common.layout.listener.EntityModifiedListener.EntityModifiedAwareSupport; @@ -45,18 +45,12 @@ import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedPinAw import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedSelectionAwareSupport; import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedTagTokenAwareSupport; import org.eclipse.hawkbit.ui.common.state.TagFilterLayoutUiState; -import org.eclipse.hawkbit.ui.distributions.dstable.DistributionSetGridHeader; -import org.eclipse.hawkbit.ui.distributions.dstable.DsMetaDataWindowBuilder; -import org.eclipse.hawkbit.ui.distributions.dstable.DsWindowBuilder; import org.eclipse.hawkbit.ui.management.targettable.TargetGridLayoutUiState; -import org.eclipse.hawkbit.ui.utils.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.vaadin.spring.events.EventBus.UIEventBus; /** - * Distribution Set table layout which is shown on the Distribution View + * Distribution Set table layout in deployment view. */ -public class DistributionGridLayout extends AbstractGridComponentLayout { +public class DistributionGridLayout extends AbstractDistributionSetGridLayout { private static final long serialVersionUID = 1L; private final DistributionSetGridHeader distributionGridHeader; @@ -64,25 +58,11 @@ public class DistributionGridLayout extends AbstractGridComponentLayout { private final DistributionSetDetailsHeader distributionSetDetailsHeader; private final DistributionSetDetails distributionDetails; - private final transient FilterChangedListener dsFilterListener; - private final transient PinningChangedListener pinningChangedListener; - private final transient SelectionChangedListener masterDsChangedListener; - private final transient EntityModifiedListener dsModifiedListener; - private final transient EntityModifiedListener tagModifiedListener; - /** * Constructor for DistributionGridLayout * - * @param eventBus - * UIEventBus - * @param i18n - * VaadinMessageSource - * @param permissionChecker - * SpPermissionChecker - * @param entityFactory - * EntityFactory - * @param notification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetManagement * TargetManagement * @param distributionSetManagement @@ -110,9 +90,7 @@ public class DistributionGridLayout extends AbstractGridComponentLayout { * @param targetGridLayoutUiState * TargetGridLayoutUiState */ - public DistributionGridLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, - final SpPermissionChecker permissionChecker, final EntityFactory entityFactory, - final UINotification notification, final TargetManagement targetManagement, + public DistributionGridLayout(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement, final DistributionSetManagement distributionSetManagement, final SoftwareModuleManagement smManagement, final DistributionSetTypeManagement distributionSetTypeManagement, final DistributionSetTagManagement distributionSetTagManagement, final SystemManagement systemManagement, @@ -121,40 +99,37 @@ public class DistributionGridLayout extends AbstractGridComponentLayout { final DistributionGridLayoutUiState distributionGridLayoutUiState, final TagFilterLayoutUiState distributionTagLayoutUiState, final TargetGridLayoutUiState targetGridLayoutUiState) { - - final DsWindowBuilder dsWindowBuilder = new DsWindowBuilder(i18n, entityFactory, eventBus, notification, - systemManagement, systemSecurityContext, configManagement, distributionSetManagement, + super(uiDependencies, systemManagement, systemSecurityContext, configManagement, distributionSetManagement, distributionSetTypeManagement, EventView.DEPLOYMENT); - final DsMetaDataWindowBuilder dsMetaDataWindowBuilder = new DsMetaDataWindowBuilder(i18n, entityFactory, - eventBus, notification, permissionChecker, distributionSetManagement); - this.distributionGridHeader = new DistributionSetGridHeader(i18n, permissionChecker, eventBus, - distributionTagLayoutUiState, distributionGridLayoutUiState, EventLayout.DS_TAG_FILTER, - EventView.DEPLOYMENT); + this.distributionGridHeader = new DistributionSetGridHeader(uiDependencies, distributionTagLayoutUiState, + distributionGridLayoutUiState, EventLayout.DS_TAG_FILTER, getEventView()); this.distributionGridHeader.buildHeader(); - this.distributionGrid = new DistributionGrid(eventBus, i18n, permissionChecker, notification, targetManagement, - distributionSetManagement, deploymentManagement, uiProperties, distributionGridLayoutUiState, - targetGridLayoutUiState, distributionTagLayoutUiState); - this.distributionSetDetailsHeader = new DistributionSetDetailsHeader(i18n, permissionChecker, eventBus, - notification, dsWindowBuilder, dsMetaDataWindowBuilder); - this.distributionDetails = new DistributionSetDetails(i18n, eventBus, permissionChecker, notification, - distributionSetManagement, smManagement, distributionSetTypeManagement, distributionSetTagManagement, - configManagement, systemSecurityContext, dsMetaDataWindowBuilder); + this.distributionGrid = new DistributionGrid(uiDependencies, targetManagement, distributionSetManagement, + deploymentManagement, uiProperties, distributionGridLayoutUiState, targetGridLayoutUiState, + distributionTagLayoutUiState); + + this.distributionSetDetailsHeader = new DistributionSetDetailsHeader(uiDependencies, getDsWindowBuilder(), + getDsMetaDataWindowBuilder()); + + this.distributionDetails = new DistributionSetDetails(uiDependencies, distributionSetManagement, smManagement, + distributionSetTypeManagement, distributionSetTagManagement, configManagement, systemSecurityContext, + getDsMetaDataWindowBuilder()); this.distributionDetails.setUnassignSmAllowed(false); this.distributionDetails.buildDetails(); - this.dsFilterListener = new FilterChangedListener<>(eventBus, ProxyDistributionSet.class, - new EventViewAware(EventView.DEPLOYMENT), distributionGrid.getFilterSupport()); - this.pinningChangedListener = new PinningChangedListener<>(eventBus, ProxyTarget.class, - distributionGrid.getPinSupport()); - this.masterDsChangedListener = new SelectionChangedListener<>(eventBus, - new EventLayoutViewAware(EventLayout.DS_LIST, EventView.DEPLOYMENT), getMasterDsAwareComponents()); - this.dsModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyDistributionSet.class) - .entityModifiedAwareSupports(getDsModifiedAwareSupports()).build(); - this.tagModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyTag.class) + addEventListener(new FilterChangedListener<>(uiDependencies.getEventBus(), ProxyDistributionSet.class, + new EventViewAware(getEventView()), distributionGrid.getFilterSupport())); + addEventListener(new PinningChangedListener<>(uiDependencies.getEventBus(), ProxyTarget.class, + distributionGrid.getPinSupport())); + addEventListener(new SelectionChangedListener<>(uiDependencies.getEventBus(), + new EventLayoutViewAware(EventLayout.DS_LIST, getEventView()), getMasterDsAwareComponents())); + addEventListener(new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxyDistributionSet.class) + .entityModifiedAwareSupports(getDsModifiedAwareSupports()).build()); + addEventListener(new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxyTag.class) .entityModifiedAwareSupports(getTagModifiedAwareSupports()).parentEntityType(ProxyDistributionSet.class) - .build(); + .build()); buildLayout(distributionGridHeader, distributionGrid, distributionSetDetailsHeader, distributionDetails); } @@ -180,52 +155,13 @@ public class DistributionGridLayout extends AbstractGridComponentLayout { .singletonList(EntityModifiedTagTokenAwareSupport.of(distributionDetails.getDistributionTagToken())); } - /** - * Show distribution set tag header icon - */ - public void showDsTagHeaderIcon() { - distributionGridHeader.showFilterIcon(); + @Override + public DistributionGrid getDistributionGrid() { + return distributionGrid; } - /** - * Hide distribution set tag header icon - */ - public void hideDsTagHeaderIcon() { - distributionGridHeader.hideFilterIcon(); - } - - /** - * Maximize the distribution grid - */ - public void maximize() { - distributionGrid.createMaximizedContent(); - hideDetailsLayout(); - } - - /** - * Minimize the distribution grid - */ - public void minimize() { - distributionGrid.createMinimizedContent(); - showDetailsLayout(); - } - - /** - * Restore the distribution grid state - */ - public void restoreState() { - distributionGridHeader.restoreState(); - distributionGrid.restoreState(); - } - - /** - * Unsubscribe the changed listener - */ - public void unsubscribeListener() { - dsFilterListener.unsubscribe(); - pinningChangedListener.unsubscribe(); - masterDsChangedListener.unsubscribe(); - dsModifiedListener.unsubscribe(); - tagModifiedListener.unsubscribe(); + @Override + public DistributionSetGridHeader getDistributionSetGridHeader() { + return distributionGridHeader; } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/AddDsTagWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/AddDsTagWindowController.java index 2d16db57e..0b481ec32 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/AddDsTagWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/AddDsTagWindowController.java @@ -9,61 +9,43 @@ package org.eclipse.hawkbit.ui.management.dstag; import org.eclipse.hawkbit.repository.DistributionSetTagManagement; -import org.eclipse.hawkbit.repository.EntityFactory; -import org.eclipse.hawkbit.repository.model.DistributionSetTag; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; +import org.eclipse.hawkbit.repository.model.Tag; +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.data.proxies.ProxyDistributionSet; +import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity; 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.EntityModifiedEventType; -import org.eclipse.hawkbit.ui.common.event.EventTopics; +import org.eclipse.hawkbit.ui.common.tag.ProxyTagValidator; import org.eclipse.hawkbit.ui.management.tag.TagWindowLayout; -import org.eclipse.hawkbit.ui.utils.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.springframework.util.StringUtils; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Controller for add distribution tag window */ -public class AddDsTagWindowController extends AbstractEntityWindowController { - private final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; +public class AddDsTagWindowController extends AbstractAddNamedEntityWindowController { private final DistributionSetTagManagement dsTagManagement; - private final TagWindowLayout layout; + private final ProxyTagValidator validator; /** * Constructor for AddDsTagWindowController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param dsTagManagement * DistributionSetTagManagement * @param layout * Tag window layout */ - public AddDsTagWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, + public AddDsTagWindowController(final CommonUiDependencies uiDependencies, final DistributionSetTagManagement dsTagManagement, final TagWindowLayout layout) { - this.i18n = i18n; - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + super(uiDependencies); this.dsTagManagement = dsTagManagement; - this.layout = layout; + this.validator = new ProxyTagValidator(uiDependencies); } @Override @@ -79,28 +61,24 @@ public class AddDsTagWindowController extends AbstractEntityWindowController getEntityClass() { + return ProxyTag.class; + } + + @Override + protected Class getParentEntityClass() { + return ProxyDistributionSet.class; } @Override protected boolean isEntityValid(final ProxyTag entity) { - if (!StringUtils.hasText(entity.getName())) { - uiNotification.displayValidationError(i18n.getMessage("message.error.missing.tagname")); - return false; - } - final String trimmedName = StringUtils.trimWhitespace(entity.getName()); - if (dsTagManagement.getByName(trimmedName).isPresent()) { - uiNotification.displayValidationError(i18n.getMessage("message.tag.duplicate.check", trimmedName)); - return false; - } - - return true; + return validator.isEntityValid(entity, () -> dsTagManagement.getByName(trimmedName).isPresent()); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/DsTagWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/DsTagWindowBuilder.java index ddc837737..a0daccf57 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/DsTagWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/DsTagWindowBuilder.java @@ -9,14 +9,11 @@ package org.eclipse.hawkbit.ui.management.dstag; import org.eclipse.hawkbit.repository.DistributionSetTagManagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; import org.eclipse.hawkbit.ui.management.tag.TagWindowLayout; 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; @@ -24,34 +21,19 @@ import com.vaadin.ui.Window; * Builder for distribution set tag window */ public class DsTagWindowBuilder extends AbstractEntityWindowBuilder { - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; private final DistributionSetTagManagement dsTagManagement; /** * Constructor for DsTagWindowBuilder * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param dsTagManagement - * DistributionSetTagManagement + * DistributionSetTagManagement */ - public DsTagWindowBuilder(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, - final DistributionSetTagManagement dsTagManagement) { - super(i18n); - - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + public DsTagWindowBuilder(final CommonUiDependencies uiDependencies, final DistributionSetTagManagement dsTagManagement) { + super(uiDependencies); this.dsTagManagement = dsTagManagement; } @@ -63,14 +45,14 @@ public class DsTagWindowBuilder extends AbstractEntityWindowBuilder { @Override public Window getWindowForAdd() { - return getWindowForNewEntity(new AddDsTagWindowController(i18n, entityFactory, eventBus, uiNotification, - dsTagManagement, new TagWindowLayout(i18n, uiNotification))); + return getWindowForNewEntity( + new AddDsTagWindowController(uiDependencies, dsTagManagement, new TagWindowLayout(uiDependencies))); } @Override public Window getWindowForUpdate(final ProxyTag proxyTag) { - return getWindowForEntity(proxyTag, new UpdateDsTagWindowController(i18n, entityFactory, eventBus, - uiNotification, dsTagManagement, new TagWindowLayout(i18n, uiNotification))); + return getWindowForEntity(proxyTag, + new UpdateDsTagWindowController(uiDependencies, dsTagManagement, new TagWindowLayout(uiDependencies))); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/UpdateDsTagWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/UpdateDsTagWindowController.java index fa012ac16..49bb0299c 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/UpdateDsTagWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/UpdateDsTagWindowController.java @@ -9,70 +9,46 @@ package org.eclipse.hawkbit.ui.management.dstag; import org.eclipse.hawkbit.repository.DistributionSetTagManagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.builder.TagUpdate; -import org.eclipse.hawkbit.repository.exception.EntityNotFoundException; -import org.eclipse.hawkbit.repository.exception.EntityReadOnlyException; -import org.eclipse.hawkbit.repository.model.DistributionSetTag; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; +import org.eclipse.hawkbit.repository.model.Tag; 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.proxies.ProxyDistributionSet; +import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity; 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.EntityModifiedEventType; -import org.eclipse.hawkbit.ui.common.event.EventTopics; +import org.eclipse.hawkbit.ui.common.tag.ProxyTagValidator; import org.eclipse.hawkbit.ui.management.tag.TagWindowLayout; -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.vaadin.spring.events.EventBus.UIEventBus; /** * Controller for update distribution set tag window */ -public class UpdateDsTagWindowController extends AbstractEntityWindowController { - private static final Logger LOG = LoggerFactory.getLogger(UpdateDsTagWindowController.class); - - private final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; +public class UpdateDsTagWindowController extends AbstractUpdateNamedEntityWindowController { private final DistributionSetTagManagement dsTagManagement; - private final TagWindowLayout layout; + private final ProxyTagValidator validator; private String nameBeforeEdit; /** * Constructor for UpdateDsTagWindowController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param dsTagManagement * DistributionSetTagManagement * @param layout * Tag window layout */ - public UpdateDsTagWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, + public UpdateDsTagWindowController(final CommonUiDependencies uiDependencies, final DistributionSetTagManagement dsTagManagement, final TagWindowLayout layout) { - this.i18n = i18n; - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + super(uiDependencies); this.dsTagManagement = dsTagManagement; - this.layout = layout; + this.validator = new ProxyTagValidator(uiDependencies); } @Override @@ -100,38 +76,30 @@ public class UpdateDsTagWindowController extends AbstractEntityWindowController< } @Override - protected void persistEntity(final ProxyTag entity) { - final TagUpdate tagUpdate = entityFactory.tag().update(entity.getId()).name(entity.getName()) + protected Tag persistEntityInRepository(final ProxyTag entity) { + final TagUpdate tagUpdate = getEntityFactory().tag().update(entity.getId()).name(entity.getName()) .description(entity.getDescription()).colour(entity.getColour()); + return dsTagManagement.update(tagUpdate); + } - try { - final DistributionSetTag updatedTag = dsTagManagement.update(tagUpdate); + @Override + protected Class getEntityClass() { + return ProxyTag.class; + } - uiNotification.displaySuccess(i18n.getMessage("message.update.success", updatedTag.getName())); - eventBus.publish(EventTopics.ENTITY_MODIFIED, this, - new EntityModifiedEventPayload(EntityModifiedEventType.ENTITY_UPDATED, ProxyDistributionSet.class, - ProxyTag.class, updatedTag.getId())); - } catch (final EntityNotFoundException | EntityReadOnlyException e) { - LOG.trace("Update of DS tag failed in UI: {}", e.getMessage()); - final String entityType = i18n.getMessage("caption.entity.distribution.tag"); - uiNotification - .displayWarning(i18n.getMessage("message.deleted.or.notAllowed", entityType, entity.getName())); - } + @Override + protected Class getParentEntityClass() { + return ProxyDistributionSet.class; } @Override protected boolean isEntityValid(final ProxyTag entity) { - if (!StringUtils.hasText(entity.getName())) { - uiNotification.displayValidationError(i18n.getMessage("message.error.missing.tagname")); - return false; - } - final String trimmedName = StringUtils.trimWhitespace(entity.getName()); - if (!nameBeforeEdit.equals(trimmedName) && dsTagManagement.getByName(trimmedName).isPresent()) { - uiNotification.displayValidationError(i18n.getMessage("message.tag.duplicate.check", trimmedName)); - return false; - } + return validator.isEntityValid(entity, + () -> hasNamedChanged(trimmedName) && dsTagManagement.getByName(trimmedName).isPresent()); + } - return true; + private boolean hasNamedChanged(final String trimmedName) { + return !nameBeforeEdit.equals(trimmedName); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/filter/DistributionTagButtons.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/filter/DistributionTagButtons.java index c38e6044d..8964d3624 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/filter/DistributionTagButtons.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/filter/DistributionTagButtons.java @@ -12,7 +12,7 @@ import java.util.Collections; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetTagManagement; -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.providers.DistributionSetTagDataProvider; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; @@ -26,9 +26,6 @@ import org.eclipse.hawkbit.ui.common.state.TagFilterLayoutUiState; import org.eclipse.hawkbit.ui.management.dstag.DsTagWindowBuilder; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; 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.ui.Window; @@ -45,14 +42,8 @@ public class DistributionTagButtons extends AbstractTagFilterButtons { /** * Constructor for DistributionTagButtons * - * @param eventBus - * UIEventBus - * @param i18n - * VaadinMessageSource - * @param uiNotification - * UINotification - * @param permChecker - * SpPermissionChecker + * @param uiDependencies + * {@link CommonUiDependencies} * @param distributionSetTagManagement * DistributionSetTagManagement * @param distributionSetManagement @@ -62,18 +53,17 @@ public class DistributionTagButtons extends AbstractTagFilterButtons { * @param distributionTagLayoutUiState * TagFilterLayoutUiState */ - public DistributionTagButtons(final UIEventBus eventBus, final VaadinMessageSource i18n, - final UINotification uiNotification, final SpPermissionChecker permChecker, + public DistributionTagButtons(final CommonUiDependencies uiDependencies, final DistributionSetTagManagement distributionSetTagManagement, final DistributionSetManagement distributionSetManagement, final DsTagWindowBuilder dsTagWindowBuilder, final TagFilterLayoutUiState distributionTagLayoutUiState) { - super(eventBus, i18n, uiNotification, permChecker, distributionTagLayoutUiState); + super(uiDependencies, distributionTagLayoutUiState); this.distributionSetTagManagement = distributionSetTagManagement; this.dsTagWindowBuilder = dsTagWindowBuilder; final DistributionSetsToTagAssignmentSupport distributionSetsToTagAssignment = new DistributionSetsToTagAssignmentSupport( - uiNotification, i18n, distributionSetManagement, eventBus, permChecker); + uiDependencies, distributionSetManagement); setDragAndDropSupportSupport(new DragAndDropSupport<>(this, i18n, uiNotification, Collections.singletonMap(UIComponentIdProvider.DIST_TABLE_ID, distributionSetsToTagAssignment), diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/filter/DistributionTagFilterHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/filter/DistributionTagFilterHeader.java index c33cbb2f9..75b705006 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/filter/DistributionTagFilterHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/filter/DistributionTagFilterHeader.java @@ -8,7 +8,7 @@ */ package org.eclipse.hawkbit.ui.management.dstag.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.EventView; import org.eclipse.hawkbit.ui.common.grid.header.AbstractFilterHeader; @@ -16,8 +16,6 @@ import org.eclipse.hawkbit.ui.common.state.TagFilterLayoutUiState; import org.eclipse.hawkbit.ui.management.dstag.DsTagWindowBuilder; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; 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; @@ -34,21 +32,16 @@ public class DistributionTagFilterHeader extends AbstractFilterHeader { /** * Constructor for UIEventBus * - * @param i18n - * VaadinMessageSource - * @param permChecker - * SpPermissionChecker - * @param eventBus - * UIEventBus + * @param uiDependencies + * {@link CommonUiDependencies} * @param dsTagWindowBuilder - * DsTagWindowBuilder + * DsTagWindowBuilder * @param distributionTagLayoutUiState - * TagFilterLayoutUiState + * TagFilterLayoutUiState */ - public DistributionTagFilterHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, - final UIEventBus eventBus, final DsTagWindowBuilder dsTagWindowBuilder, + public DistributionTagFilterHeader(final CommonUiDependencies uiDependencies, final DsTagWindowBuilder dsTagWindowBuilder, final TagFilterLayoutUiState distributionTagLayoutUiState) { - super(i18n, permChecker, eventBus); + super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus()); this.distributionTagLayoutUiState = distributionTagLayoutUiState; this.dsTagWindowBuilder = dsTagWindowBuilder; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/filter/DistributionTagLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/filter/DistributionTagLayout.java index e17bd69d8..7b9def460 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/filter/DistributionTagLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstag/filter/DistributionTagLayout.java @@ -13,8 +13,7 @@ import java.util.List; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetTagManagement; -import org.eclipse.hawkbit.repository.EntityFactory; -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.ProxyTag; import org.eclipse.hawkbit.ui.common.event.EventLayout; @@ -28,9 +27,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.state.TagFilterLayoutUiState; import org.eclipse.hawkbit.ui.management.dstag.DsTagWindowBuilder; -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.Alignment; import com.vaadin.ui.Button; @@ -52,43 +48,32 @@ public class DistributionTagLayout extends AbstractFilterLayout { /** * Constructor - * - * @param eventBus - * UIEventBus - * @param i18n - * VaadinMessageSource - * @param permChecker - * SpPermissionChecker + * + * @param uiDependencies + * {@link CommonUiDependencies} * @param distributionSetTagManagement * DistributionSetTagManagement - * @param entityFactory - * EntityFactory - * @param uiNotification - * UINotification * @param distributionSetManagement * DistributionSetManagement * @param distributionTagLayoutUiState * TagFilterLayoutUiState */ - public DistributionTagLayout(final UIEventBus eventBus, final VaadinMessageSource i18n, - final SpPermissionChecker permChecker, final DistributionSetTagManagement distributionSetTagManagement, - final EntityFactory entityFactory, final UINotification uiNotification, + public DistributionTagLayout(final CommonUiDependencies uiDependencies, + final DistributionSetTagManagement distributionSetTagManagement, final DistributionSetManagement distributionSetManagement, final TagFilterLayoutUiState distributionTagLayoutUiState) { - final DsTagWindowBuilder dsTagWindowBuilder = new DsTagWindowBuilder(i18n, entityFactory, eventBus, - uiNotification, distributionSetTagManagement); + final DsTagWindowBuilder dsTagWindowBuilder = new DsTagWindowBuilder(uiDependencies, distributionSetTagManagement); - this.distributionTagFilterHeader = new DistributionTagFilterHeader(i18n, permChecker, eventBus, - dsTagWindowBuilder, distributionTagLayoutUiState); - this.distributionTagButtons = new DistributionTagButtons(eventBus, i18n, uiNotification, permChecker, - distributionSetTagManagement, distributionSetManagement, dsTagWindowBuilder, + this.distributionTagFilterHeader = new DistributionTagFilterHeader(uiDependencies, dsTagWindowBuilder, distributionTagLayoutUiState); + this.distributionTagButtons = new DistributionTagButtons(uiDependencies, distributionSetTagManagement, + distributionSetManagement, dsTagWindowBuilder, distributionTagLayoutUiState); - this.gridActionsVisibilityListener = new GridActionsVisibilityListener(eventBus, + this.gridActionsVisibilityListener = new GridActionsVisibilityListener(uiDependencies.getEventBus(), new EventLayoutViewAware(EventLayout.DS_TAG_FILTER, EventView.DEPLOYMENT), distributionTagButtons::hideActionColumns, distributionTagButtons::showEditColumn, distributionTagButtons::showDeleteColumn); - this.entityModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyTag.class) + this.entityModifiedListener = new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxyTag.class) .entityModifiedAwareSupports(getEntityModifiedAwareSupports()) .parentEntityType(ProxyDistributionSet.class).build(); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/miscs/DeploymentAssignmentWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/miscs/DeploymentAssignmentWindowController.java index 47bb5739e..f14022d03 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/miscs/DeploymentAssignmentWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/miscs/DeploymentAssignmentWindowController.java @@ -23,6 +23,7 @@ import org.eclipse.hawkbit.repository.model.DeploymentRequestBuilder; import org.eclipse.hawkbit.repository.model.DistributionSetAssignmentResult; import org.eclipse.hawkbit.repository.model.RepositoryModelConstants; import org.eclipse.hawkbit.ui.UiProperties; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyAssignmentWindow; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyDistributionSet; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; @@ -56,23 +57,18 @@ public class DeploymentAssignmentWindowController { /** * Constructor for DeploymentAssignmentWindowController * - * @param i18n - * VaadinMessageSource + * @param uiDependencies + * {@link CommonUiDependencies} * @param uiProperties - * UiProperties - * @param eventBus - * UIEventBus - * @param notification - * UINotification + * UiProperties * @param deploymentManagement - * DeploymentManagement + * DeploymentManagement */ - public DeploymentAssignmentWindowController(final VaadinMessageSource i18n, final UiProperties uiProperties, - final UIEventBus eventBus, final UINotification notification, + public DeploymentAssignmentWindowController(final CommonUiDependencies uiDependencies, final UiProperties uiProperties, final DeploymentManagement deploymentManagement) { - this.i18n = i18n; - this.eventBus = eventBus; - this.notification = notification; + this.i18n = uiDependencies.getI18n(); + this.eventBus = uiDependencies.getEventBus(); + this.notification = uiDependencies.getUiNotification(); this.deploymentManagement = deploymentManagement; this.assignmentWindowLayout = new AssignmentWindowLayout(i18n, uiProperties); @@ -100,7 +96,7 @@ public class DeploymentAssignmentWindowController { /** * Save the given distribution sets to targets assignments - * + * * @param proxyTargets * to assign the given distribution sets to * @param proxyDistributionSets @@ -163,7 +159,7 @@ public class DeploymentAssignmentWindowController { /** * Check if the maintenance window is valid or not - * + * * @return boolean if maintenance window is valid or not */ public boolean isMaintenanceWindowValid() { @@ -183,7 +179,7 @@ public class DeploymentAssignmentWindowController { /** * Check if the time-forced date is valid - * + * * @return boolean if time-forced date is valid or not */ public boolean isForceTimeValid() { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/tag/TagWindowLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/tag/TagWindowLayout.java index 0fd3c1835..522225d85 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/tag/TagWindowLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/tag/TagWindowLayout.java @@ -9,9 +9,9 @@ package org.eclipse.hawkbit.ui.management.tag; import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyFilterButton; import org.eclipse.hawkbit.ui.components.ColorPickerComponent; -import org.eclipse.hawkbit.ui.utils.UINotification; import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import com.vaadin.ui.ComponentContainer; @@ -24,7 +24,7 @@ import com.vaadin.ui.TextField; * Abstract class for tag add/update window layout. * * @param - * Generic type of ProxyFilterButton + * Generic type of ProxyFilterButton */ public class TagWindowLayout extends AbstractEntityWindowLayout { protected final VaadinMessageSource i18n; @@ -37,18 +37,16 @@ public class TagWindowLayout extends AbstractEntity /** * Constructor for AbstractTagWindowLayout - * - * @param i18n - * VaadinMessageSource - * @param uiNotification - * UINotification + * + * @param uiDependencies + * {@link CommonUiDependencies} */ - public TagWindowLayout(final VaadinMessageSource i18n, final UINotification uiNotification) { + public TagWindowLayout(final CommonUiDependencies uiDependencies) { super(); - this.i18n = i18n; + this.i18n = uiDependencies.getI18n(); - this.tagComponentBuilder = new TagWindowLayoutComponentBuilder(i18n, uiNotification); + this.tagComponentBuilder = new TagWindowLayoutComponentBuilder(i18n, uiDependencies.getUiNotification()); this.tagName = tagComponentBuilder.createNameField(binder); this.tagDescription = tagComponentBuilder.createDescription(binder); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/AddTargetWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/AddTargetWindowController.java index 4a47590c2..e039ae2cf 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/AddTargetWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/AddTargetWindowController.java @@ -8,77 +8,50 @@ */ package org.eclipse.hawkbit.ui.management.targettable; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.model.Target; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowLayout; +import org.eclipse.hawkbit.ui.common.AbstractAddNamedEntityWindowController; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; +import org.eclipse.hawkbit.ui.common.EntityWindowLayout; import org.eclipse.hawkbit.ui.common.data.mappers.TargetToProxyTargetMapper; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; -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.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload; import org.eclipse.hawkbit.ui.common.event.SelectionChangedEventPayload.SelectionChangedEventType; -import org.eclipse.hawkbit.ui.utils.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.springframework.util.StringUtils; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Controller for add target window */ -public class AddTargetWindowController extends AbstractEntityWindowController { - private final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; +public class AddTargetWindowController + extends AbstractAddNamedEntityWindowController { private final TargetManagement targetManagement; - private final TargetWindowLayout layout; - private final EventView view; + private final ProxyTargetValidator proxyTargetValidator; /** * Constructor for AddTargetWindowController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetManagement - * TargetManagement + * TargetManagement * @param layout - * TargetWindowLayout + * TargetWindowLayout * @param view - * EventView + * EventView */ - public AddTargetWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, final TargetManagement targetManagement, + public AddTargetWindowController(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement, final TargetWindowLayout layout, final EventView view) { - this.i18n = i18n; - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + super(uiDependencies); this.targetManagement = targetManagement; - this.layout = layout; - this.view = view; - } - - @Override - public AbstractEntityWindowLayout getLayout() { - return layout; + this.proxyTargetValidator = new ProxyTargetValidator(uiDependencies); } @Override @@ -88,6 +61,11 @@ public class AddTargetWindowController extends AbstractEntityWindowController getLayout() { + return layout; + } + @Override protected void adaptLayout(final ProxyTarget proxyEntity) { layout.setControllerIdEnabled(true); @@ -95,33 +73,38 @@ public class AddTargetWindowController extends AbstractEntityWindowController( - SelectionChangedEventType.ENTITY_SELECTED, addedItem, EventLayout.TARGET_LIST, view)); + @Override + protected String getDisplayableNameForFailedMessage(final ProxyTarget entity) { + return entity.getName() == null ? entity.getControllerId() : entity.getName(); + } + + @Override + protected Class getEntityClass() { + return ProxyTarget.class; + } + + @Override + protected void selectPersistedEntity(final Target entity) { + final ProxyTarget addedItem = new TargetToProxyTargetMapper(getI18n()).map(entity); + publishSelectionEvent(new SelectionChangedEventPayload<>(SelectionChangedEventType.ENTITY_SELECTED, addedItem, + EventLayout.TARGET_LIST, view)); } @Override protected boolean isEntityValid(final ProxyTarget entity) { - if (!StringUtils.hasText(entity.getControllerId())) { - uiNotification.displayValidationError(i18n.getMessage("message.error.missing.controllerId")); - return false; - } - final String trimmedControllerId = StringUtils.trimWhitespace(entity.getControllerId()); - if (targetManagement.getByControllerID(trimmedControllerId).isPresent()) { - uiNotification - .displayValidationError(i18n.getMessage("message.target.duplicate.check", trimmedControllerId)); - return false; - } - - return true; + return proxyTargetValidator.isEntityValid(entity, + () -> targetManagement.getByControllerID(trimmedControllerId).isPresent()); } + } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/ProxyTargetValidator.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/ProxyTargetValidator.java new file mode 100644 index 000000000..acb7e3690 --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/ProxyTargetValidator.java @@ -0,0 +1,47 @@ +/** + * 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.management.targettable; + +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.ProxyTarget; +import org.springframework.util.StringUtils; + +/** + * Validator used in target window controllers to validate {@link ProxyTarget}. + */ +public class ProxyTargetValidator extends EntityValidator { + + /** + * Constructor + * + * @param uiDependencies + * {@link CommonUiDependencies} + */ + public ProxyTargetValidator(final CommonUiDependencies uiDependencies) { + super(uiDependencies); + } + + boolean isEntityValid(final ProxyTarget entity, final BooleanSupplier duplicateCheck) { + if (!StringUtils.hasText(entity.getControllerId())) { + displayValidationError("message.error.missing.controllerId"); + return false; + } + + if (duplicateCheck.getAsBoolean()) { + final String trimmedControllerId = StringUtils.trimWhitespace(entity.getControllerId()); + displayValidationError("message.target.duplicate.check", trimmedControllerId); + return false; + } + + return true; + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetails.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetails.java index 142147fbf..186e66640 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetails.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetails.java @@ -21,7 +21,7 @@ import org.eclipse.hawkbit.repository.DeploymentManagement; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetTagManagement; 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.providers.TargetMetaDataDataProvider; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyKeyValueDetails; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyMetaData; @@ -33,9 +33,6 @@ import org.eclipse.hawkbit.ui.common.detailslayout.MetadataDetailsGrid; import org.eclipse.hawkbit.ui.common.tagdetails.TargetTagToken; import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil; 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.Window; @@ -59,12 +56,10 @@ public class TargetDetails extends AbstractGridDetailsLayout { private final transient TargetMetaDataWindowBuilder targetMetaDataWindowBuilder; - TargetDetails(final VaadinMessageSource i18n, final UIEventBus eventBus, - final SpPermissionChecker permissionChecker, final UINotification uiNotification, - final TargetTagManagement tagManagement, final TargetManagement targetManagement, - final DeploymentManagement deploymentManagement, + TargetDetails(final CommonUiDependencies uiDependencies, final TargetTagManagement tagManagement, + final TargetManagement targetManagement, final DeploymentManagement deploymentManagement, final TargetMetaDataWindowBuilder targetMetaDataWindowBuilder) { - super(i18n); + super(uiDependencies.getI18n()); this.targetManagement = targetManagement; this.deploymentManagement = deploymentManagement; @@ -76,8 +71,7 @@ public class TargetDetails extends AbstractGridDetailsLayout { this.installedDsDetails = buildInstalledDsDetails(); - this.targetTagToken = new TargetTagToken(permissionChecker, i18n, uiNotification, eventBus, tagManagement, - targetManagement); + this.targetTagToken = new TargetTagToken(uiDependencies, tagManagement, targetManagement); addDetailsComponents(Arrays.asList(new SimpleEntry<>(i18n.getMessage("caption.tab.details"), entityDetails), new SimpleEntry<>(i18n.getMessage("caption.tab.description"), entityDescription), @@ -87,8 +81,8 @@ public class TargetDetails extends AbstractGridDetailsLayout { new SimpleEntry<>(i18n.getMessage("caption.tags.tab"), getTargetTagToken().getTagPanel()), new SimpleEntry<>(i18n.getMessage("caption.logs.tab"), logDetails))); - if (permissionChecker.hasReadRepositoryPermission()) { - this.targetMetadataGrid = new MetadataDetailsGrid<>(i18n, eventBus, + if (uiDependencies.getPermChecker().hasReadRepositoryPermission()) { + this.targetMetadataGrid = new MetadataDetailsGrid<>(i18n, uiDependencies.getEventBus(), UIComponentIdProvider.TARGET_TYPE_PREFIX, this::showMetadataDetails, new TargetMetaDataDataProvider(targetManagement)); addDetailsComponent(new SimpleEntry<>(i18n.getMessage("caption.metadata"), targetMetadataGrid)); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetailsHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetailsHeader.java index cff290dde..ac125a6d8 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetailsHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetDetailsHeader.java @@ -8,13 +8,10 @@ */ package org.eclipse.hawkbit.ui.management.targettable; -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.grid.header.AbstractDetailsHeader; 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.Window; @@ -31,24 +28,16 @@ public class TargetDetailsHeader extends AbstractDetailsHeader { /** * Constructor for TargetDetailsHeader * - * @param i18n - * VaadinMessageSource - * @param permChecker - * SpPermissionChecker - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetWindowBuilder - * TargetWindowBuilder + * TargetWindowBuilder * @param targetMetaDataWindowBuilder - * TargetMetaDataWindowBuilder + * TargetMetaDataWindowBuilder */ - public TargetDetailsHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, - final UIEventBus eventBus, final UINotification uiNotification, - final TargetWindowBuilder targetWindowBuilder, + public TargetDetailsHeader(final CommonUiDependencies uiDependencies, final TargetWindowBuilder targetWindowBuilder, final TargetMetaDataWindowBuilder targetMetaDataWindowBuilder) { - super(i18n, permChecker, eventBus, uiNotification); + super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus(), uiDependencies.getUiNotification()); this.targetWindowBuilder = targetWindowBuilder; this.targetMetaDataWindowBuilder = targetMetaDataWindowBuilder; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGrid.java index a07f8ade9..80b3adb79 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGrid.java @@ -22,8 +22,8 @@ import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TenantConfigurationManagement; import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.security.SystemSecurityContext; -import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.UiProperties; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder; import org.eclipse.hawkbit.ui.common.builder.StatusIconBuilder.TargetPollingStatusIconSupplier; import org.eclipse.hawkbit.ui.common.builder.StatusIconBuilder.TargetStatusIconSupplier; @@ -57,11 +57,8 @@ import org.eclipse.hawkbit.ui.utils.HawkbitCommonUtil; import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UIMessageIdProvider; -import org.eclipse.hawkbit.ui.utils.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.vaadin.spring.events.EventBus.UIEventBus; import com.vaadin.data.ValueProvider; import com.vaadin.icons.VaadinIcons; @@ -98,16 +95,10 @@ public class TargetGrid extends AbstractGrid(this, i18n, notification, "target.details.header", - "caption.targets", ProxyTarget::getName, this::deleteTargets, + this.targetDeleteSupport = new DeleteSupport<>(this, i18n, uiDependencies.getUiNotification(), + "target.details.header", "caption.targets", ProxyTarget::getName, this::deleteTargets, UIComponentIdProvider.TARGET_DELETE_CONFIRMATION_DIALOG); this.pinSupport = new PinSupport<>(this::refreshItem, this::publishPinningChangedEvent, @@ -157,18 +147,18 @@ public class TargetGrid extends AbstractGrid> sourceTargetAssignmentStrategies = new HashMap<>(); - final DeploymentAssignmentWindowController assignmentController = new DeploymentAssignmentWindowController(i18n, - uiProperties, eventBus, notification, deploymentManagement); + final DeploymentAssignmentWindowController assignmentController = new DeploymentAssignmentWindowController( + uiDependencies, uiProperties, deploymentManagement); final DistributionSetsToTargetAssignmentSupport distributionsToTargetAssignment = new DistributionSetsToTargetAssignmentSupport( - notification, i18n, systemSecurityContext, configManagement, permChecker, assignmentController); + uiDependencies, systemSecurityContext, configManagement, assignmentController); final TargetTagsToTargetAssignmentSupport targetTagsToTargetAssignment = new TargetTagsToTargetAssignmentSupport( - notification, i18n, targetManagement, eventBus, permChecker); + uiDependencies, targetManagement); sourceTargetAssignmentStrategies.put(UIComponentIdProvider.DIST_TABLE_ID, distributionsToTargetAssignment); sourceTargetAssignmentStrategies.put(UIComponentIdProvider.TARGET_TAG_TABLE_ID, targetTagsToTargetAssignment); - setDragAndDropSupportSupport( - new DragAndDropSupport<>(this, i18n, notification, sourceTargetAssignmentStrategies, eventBus)); + setDragAndDropSupportSupport(new DragAndDropSupport<>(this, i18n, uiDependencies.getUiNotification(), + sourceTargetAssignmentStrategies, eventBus)); if (!targetGridLayoutUiState.isMaximized()) { getDragAndDropSupportSupport().addDragAndDrop(); } @@ -385,4 +375,4 @@ public class TargetGrid extends AbstractGrid getPinSupport() { return pinSupport; } -} \ No newline at end of file +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGridHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGridHeader.java index 530304c49..c547e316a 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGridHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGridHeader.java @@ -8,7 +8,7 @@ */ package org.eclipse.hawkbit.ui.management.targettable; -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.ProxyTarget; import org.eclipse.hawkbit.ui.common.event.BulkUploadEventPayload; @@ -23,9 +23,6 @@ import org.eclipse.hawkbit.ui.management.bulkupload.TargetBulkUpdateWindowLayout import org.eclipse.hawkbit.ui.management.bulkupload.TargetBulkUploadUiState; import org.eclipse.hawkbit.ui.management.targettag.filter.TargetTagFilterLayoutUiState; 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.Alignment; import com.vaadin.ui.Component; @@ -50,14 +47,13 @@ public class TargetGridHeader extends AbstractEntityGridHeader { private final transient BulkUploadHeaderSupport bulkUploadHeaderSupport; private final transient DistributionSetFilterDropAreaSupport distributionSetFilterDropAreaSupport; - TargetGridHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, final UIEventBus eventBus, - final UINotification notification, final TargetWindowBuilder targetWindowBuilder, + TargetGridHeader(final CommonUiDependencies uiDependencies, final TargetWindowBuilder targetWindowBuilder, final BulkUploadWindowBuilder bulkUploadWindowBuilder, final TargetTagFilterLayoutUiState targetTagFilterLayoutUiState, final TargetGridLayoutUiState targetGridLayoutUiState, final TargetBulkUploadUiState targetBulkUploadUiState) { - super(i18n, permChecker, eventBus, targetTagFilterLayoutUiState, targetGridLayoutUiState, - EventLayout.TARGET_TAG_FILTER, EventView.DEPLOYMENT); + super(uiDependencies, targetTagFilterLayoutUiState, targetGridLayoutUiState, EventLayout.TARGET_TAG_FILTER, + EventView.DEPLOYMENT); this.targetTagFilterLayoutUiState = targetTagFilterLayoutUiState; this.targetGridLayoutUiState = targetGridLayoutUiState; @@ -77,7 +73,7 @@ public class TargetGridHeader extends AbstractEntityGridHeader { // DistributionSetFilterDropArea is only available in TargetTableHeader this.distributionSetFilterDropAreaSupport = new DistributionSetFilterDropAreaSupport(i18n, eventBus, - notification, targetGridLayoutUiState); + uiDependencies.getUiNotification(), targetGridLayoutUiState); } /** diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGridLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGridLayout.java index c88b58926..34e4e9cf0 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGridLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetGridLayout.java @@ -15,13 +15,12 @@ import java.util.concurrent.Executor; import org.eclipse.hawkbit.repository.DeploymentManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetTagManagement; import org.eclipse.hawkbit.repository.TenantConfigurationManagement; import org.eclipse.hawkbit.security.SystemSecurityContext; -import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.UiProperties; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; 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.ProxyTarget; @@ -50,9 +49,6 @@ import org.eclipse.hawkbit.ui.management.bulkupload.BulkUploadWindowBuilder; import org.eclipse.hawkbit.ui.management.bulkupload.TargetBulkUploadUiState; import org.eclipse.hawkbit.ui.management.dstable.DistributionGridLayoutUiState; import org.eclipse.hawkbit.ui.management.targettag.filter.TargetTagFilterLayoutUiState; -import org.eclipse.hawkbit.ui.utils.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Target table layout. @@ -78,22 +74,14 @@ public class TargetGridLayout extends AbstractGridComponentLayout { /** * Constructor for TargetGridLayout * - * @param eventBus - * UIEventBus + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetManagement * TargetManagement - * @param entityFactory - * EntityFactory - * @param i18n - * VaadinMessageSource - * @param uiNotification - * UINotification * @param deploymentManagement * DeploymentManagement * @param uiProperties * UiProperties - * @param permissionChecker - * SpPermissionChecker * @param targetTagManagement * TargetTagManagement * @param distributionSetManagement @@ -113,59 +101,57 @@ public class TargetGridLayout extends AbstractGridComponentLayout { * @param distributionGridLayoutUiState * DistributionGridLayoutUiState */ - public TargetGridLayout(final UIEventBus eventBus, final TargetManagement targetManagement, - final EntityFactory entityFactory, final VaadinMessageSource i18n, final UINotification uiNotification, + public TargetGridLayout(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement, final DeploymentManagement deploymentManagement, final UiProperties uiProperties, - final SpPermissionChecker permissionChecker, final TargetTagManagement targetTagManagement, - final DistributionSetManagement distributionSetManagement, final Executor uiExecutor, - final TenantConfigurationManagement configManagement, final SystemSecurityContext systemSecurityContext, + final TargetTagManagement targetTagManagement, final DistributionSetManagement distributionSetManagement, + final Executor uiExecutor, final TenantConfigurationManagement configManagement, + final SystemSecurityContext systemSecurityContext, final TargetTagFilterLayoutUiState targetTagFilterLayoutUiState, final TargetGridLayoutUiState targetGridLayoutUiState, final TargetBulkUploadUiState targetBulkUploadUiState, final DistributionGridLayoutUiState distributionGridLayoutUiState) { - final TargetWindowBuilder targetWindowBuilder = new TargetWindowBuilder(i18n, entityFactory, eventBus, - uiNotification, targetManagement, EventView.DEPLOYMENT); - final TargetMetaDataWindowBuilder targetMetaDataWindowBuilder = new TargetMetaDataWindowBuilder(i18n, - entityFactory, eventBus, uiNotification, permissionChecker, targetManagement); - final BulkUploadWindowBuilder bulkUploadWindowBuilder = new BulkUploadWindowBuilder(i18n, eventBus, - permissionChecker, uiNotification, uiProperties, uiExecutor, targetManagement, deploymentManagement, - targetTagManagement, distributionSetManagement, entityFactory, targetBulkUploadUiState); - - this.targetGridHeader = new TargetGridHeader(i18n, permissionChecker, eventBus, uiNotification, - targetWindowBuilder, bulkUploadWindowBuilder, targetTagFilterLayoutUiState, targetGridLayoutUiState, + final TargetWindowBuilder targetWindowBuilder = new TargetWindowBuilder(uiDependencies, targetManagement, + EventView.DEPLOYMENT); + final TargetMetaDataWindowBuilder targetMetaDataWindowBuilder = new TargetMetaDataWindowBuilder(uiDependencies, + targetManagement); + final BulkUploadWindowBuilder bulkUploadWindowBuilder = new BulkUploadWindowBuilder(uiDependencies, uiProperties, + uiExecutor, targetManagement, deploymentManagement, targetTagManagement, distributionSetManagement, targetBulkUploadUiState); + + this.targetGridHeader = new TargetGridHeader(uiDependencies, targetWindowBuilder, bulkUploadWindowBuilder, + targetTagFilterLayoutUiState, targetGridLayoutUiState, targetBulkUploadUiState); this.targetGridHeader.buildHeader(); this.targetGridHeader.addDsDroArea(); - this.targetGrid = new TargetGrid(eventBus, i18n, uiNotification, targetManagement, permissionChecker, - deploymentManagement, configManagement, systemSecurityContext, uiProperties, targetGridLayoutUiState, - distributionGridLayoutUiState, targetTagFilterLayoutUiState); + this.targetGrid = new TargetGrid(uiDependencies, targetManagement, deploymentManagement, configManagement, + systemSecurityContext, uiProperties, targetGridLayoutUiState, distributionGridLayoutUiState, + targetTagFilterLayoutUiState); - this.targetDetailsHeader = new TargetDetailsHeader(i18n, permissionChecker, eventBus, uiNotification, - targetWindowBuilder, targetMetaDataWindowBuilder); - this.targetDetails = new TargetDetails(i18n, eventBus, permissionChecker, uiNotification, targetTagManagement, - targetManagement, deploymentManagement, targetMetaDataWindowBuilder); + this.targetDetailsHeader = new TargetDetailsHeader(uiDependencies, targetWindowBuilder, targetMetaDataWindowBuilder); + this.targetDetails = new TargetDetails(uiDependencies, targetTagManagement, targetManagement, deploymentManagement, + targetMetaDataWindowBuilder); - this.countMessageLabel = new CountMessageLabel(targetManagement, i18n); + this.countMessageLabel = new CountMessageLabel(targetManagement, uiDependencies.getI18n()); initGridDataUpdatedListener(); - this.filterTabChangedListener = new GenericEventListener<>(eventBus, EventTopics.TARGET_FILTER_TAB_CHANGED, - this::onTargetFilterTabChanged); - this.targetFilterListener = new FilterChangedListener<>(eventBus, ProxyTarget.class, + this.filterTabChangedListener = new GenericEventListener<>(uiDependencies.getEventBus(), + EventTopics.TARGET_FILTER_TAB_CHANGED, this::onTargetFilterTabChanged); + this.targetFilterListener = new FilterChangedListener<>(uiDependencies.getEventBus(), ProxyTarget.class, new EventViewAware(EventView.DEPLOYMENT), targetGrid.getFilterSupport()); - this.pinningChangedListener = new PinningChangedListener<>(eventBus, ProxyDistributionSet.class, + this.pinningChangedListener = new PinningChangedListener<>(uiDependencies.getEventBus(), ProxyDistributionSet.class, targetGrid.getPinSupport()); - this.targetChangedListener = new SelectionChangedListener<>(eventBus, + this.targetChangedListener = new SelectionChangedListener<>(uiDependencies.getEventBus(), new EventLayoutViewAware(EventLayout.TARGET_LIST, EventView.DEPLOYMENT), getMasterTargetAwareComponents()); - this.selectTargetListener = new SelectGridEntityListener<>(eventBus, + this.selectTargetListener = new SelectGridEntityListener<>(uiDependencies.getEventBus(), new EventLayoutViewAware(EventLayout.TARGET_LIST, EventView.DEPLOYMENT), targetGrid.getSelectionSupport()); - this.targetModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyTarget.class) + this.targetModifiedListener = new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxyTarget.class) .entityModifiedAwareSupports(getTargetModifiedAwareSupports()).build(); - this.tagModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyTag.class) + this.tagModifiedListener = new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxyTag.class) .entityModifiedAwareSupports(getTagModifiedAwareSupports()).parentEntityType(ProxyTarget.class).build(); - this.bulkUploadListener = new BulkUploadChangedListener(eventBus, targetGridHeader::onBulkUploadChanged); + this.bulkUploadListener = new BulkUploadChangedListener(uiDependencies.getEventBus(), + targetGridHeader::onBulkUploadChanged); buildLayout(targetGridHeader, targetGrid, targetDetailsHeader, targetDetails); } @@ -207,7 +193,7 @@ public class TargetGridLayout extends AbstractGridComponentLayout { /** * Actions on target filter tab changed - * + * * @param eventPayload * event payload to identify which tab was selected */ diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetMetaDataWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetMetaDataWindowBuilder.java index a017a0ac8..fbd7e40f5 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetMetaDataWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetMetaDataWindowBuilder.java @@ -8,14 +8,10 @@ */ package org.eclipse.hawkbit.ui.management.targettable; -import org.eclipse.hawkbit.repository.EntityFactory; 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.ProxyMetaData; 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; @@ -23,38 +19,19 @@ import com.vaadin.ui.Window; * Builder for target meta data window */ public class TargetMetaDataWindowBuilder extends AbstractMetaDataWindowBuilder { - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; - private final SpPermissionChecker permChecker; private final TargetManagement targetManagement; /** * Constructor for TargetMetaDataWindowBuilder * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification - * @param permChecker - * SpPermissionChecker + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetManagement * TargetManagement */ - public TargetMetaDataWindowBuilder(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, final SpPermissionChecker permChecker, - final TargetManagement targetManagement) { - super(i18n); - - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; - this.permChecker = permChecker; + public TargetMetaDataWindowBuilder(final CommonUiDependencies uiDependencies, final TargetManagement targetManagement) { + super(uiDependencies); this.targetManagement = targetManagement; } @@ -87,7 +64,7 @@ public class TargetMetaDataWindowBuilder extends AbstractMetaDataWindowBuilder targetMetaDataWindowGrid; - private final transient MetaDataAddUpdateWindowLayout metaDataAddUpdateWindowLayout; private final transient AddMetaDataWindowController addTargetMetaDataWindowController; private final transient UpdateMetaDataWindowController updateTargetMetaDataWindowController; + private final MetaDataWindowGrid targetMetaDataWindowGrid; + /** * Constructor for TargetMetaDataWindowLayout * - * @param i18n - * VaadinMessageSource - * @param eventBus - * UIEventBus - * @param permChecker - * SpPermissionChecker - * @param uiNotification - * UINotification - * @param entityFactory - * EntityFactory + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetManagement * TargetManagement */ - public TargetMetaDataWindowLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, - final SpPermissionChecker permChecker, final UINotification uiNotification, - final EntityFactory entityFactory, final TargetManagement targetManagement) { - super(i18n, eventBus, uiNotification, permChecker); + public TargetMetaDataWindowLayout(final CommonUiDependencies uiDependencies, + final TargetManagement targetManagement) { + super(uiDependencies); this.targetManagement = targetManagement; - this.entityFactory = entityFactory; - this.targetMetaDataWindowGrid = new MetaDataWindowGrid<>(i18n, eventBus, permChecker, uiNotification, - new TargetMetaDataDataProvider(targetManagement), this::hasMetadataChangePermission, - this::deleteMetaData); + this.targetMetaDataWindowGrid = new MetaDataWindowGrid<>(uiDependencies, + new TargetMetaDataDataProvider(targetManagement), this::hasMetadataChangePermission,this::deleteMetaData); - this.metaDataAddUpdateWindowLayout = new MetaDataAddUpdateWindowLayout(i18n, this::hasMetadataChangePermission); - this.addTargetMetaDataWindowController = new AddMetaDataWindowController(i18n, uiNotification, + this.metaDataAddUpdateWindowLayout = new MetaDataAddUpdateWindowLayout(i18n,this::hasMetadataChangePermission); + this.addTargetMetaDataWindowController = new AddMetaDataWindowController(uiDependencies, metaDataAddUpdateWindowLayout, this::createMetaData, this::isDuplicate); - this.updateTargetMetaDataWindowController = new UpdateMetaDataWindowController(i18n, uiNotification, - metaDataAddUpdateWindowLayout, this::updateMetaData); + this.updateTargetMetaDataWindowController = new UpdateMetaDataWindowController(uiDependencies, + metaDataAddUpdateWindowLayout, this::updateMetaData, this::isDuplicate); buildLayout(); addGridSelectionListener(); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetWindowBuilder.java index 3c5445e5a..9c987794a 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetWindowBuilder.java @@ -8,15 +8,12 @@ */ package org.eclipse.hawkbit.ui.management.targettable; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTarget; import org.eclipse.hawkbit.ui.common.event.EventView; 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; @@ -24,9 +21,6 @@ import com.vaadin.ui.Window; * Builder for target window */ public class TargetWindowBuilder extends AbstractEntityWindowBuilder { - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; private final TargetManagement targetManagement; @@ -35,27 +29,16 @@ public class TargetWindowBuilder extends AbstractEntityWindowBuilder { - private static final Logger LOG = LoggerFactory.getLogger(UpdateTargetWindowController.class); - - private final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; +public class UpdateTargetWindowController + extends AbstractUpdateNamedEntityWindowController { private final TargetManagement targetManagement; - private final TargetWindowLayout layout; private String controllerIdBeforeEdit; + private final ProxyTargetValidator proxyTargetValidator; /** * Constructor for UpdateTargetWindowController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetManagement - * TargetManagement + * TargetManagement * @param layout - * TargetWindowLayout + * TargetWindowLayout */ - public UpdateTargetWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, final TargetManagement targetManagement, - final TargetWindowLayout layout) { - this.i18n = i18n; - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + public UpdateTargetWindowController(final CommonUiDependencies uiDependencies, + final TargetManagement targetManagement, final TargetWindowLayout layout) { + super(uiDependencies); this.targetManagement = targetManagement; - this.layout = layout; - } - - @Override - public AbstractEntityWindowLayout getLayout() { - return layout; + this.proxyTargetValidator = new ProxyTargetValidator(uiDependencies); } @Override @@ -92,6 +62,11 @@ public class UpdateTargetWindowController extends AbstractEntityWindowController return target; } + @Override + public EntityWindowLayout getLayout() { + return layout; + } + @Override protected void adaptLayout(final ProxyTarget proxyEntity) { layout.setControllerIdEnabled(false); @@ -99,39 +74,26 @@ public class UpdateTargetWindowController extends AbstractEntityWindowController } @Override - protected void persistEntity(final ProxyTarget entity) { - final TargetUpdate targetUpdate = entityFactory.target().update(entity.getControllerId()).name(entity.getName()) - .description(entity.getDescription()); + protected Target persistEntityInRepository(final ProxyTarget entity) { + final TargetUpdate targetUpdate = getEntityFactory().target().update(entity.getControllerId()) + .name(entity.getName()).description(entity.getDescription()); - try { - final Target updatedTarget = targetManagement.update(targetUpdate); + return targetManagement.update(targetUpdate); + } - uiNotification.displaySuccess(i18n.getMessage("message.update.success", updatedTarget.getName())); - eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( - EntityModifiedEventType.ENTITY_UPDATED, ProxyTarget.class, updatedTarget.getId())); - } catch (final EntityNotFoundException | EntityReadOnlyException e) { - LOG.trace("Update of target failed in UI: {}", e.getMessage()); - final String entityType = i18n.getMessage("caption.target"); - uiNotification - .displayWarning(i18n.getMessage("message.deleted.or.notAllowed", entityType, entity.getName())); - } + @Override + protected Class getEntityClass() { + return ProxyTarget.class; } @Override protected boolean isEntityValid(final ProxyTarget entity) { - if (!StringUtils.hasText(entity.getControllerId())) { - uiNotification.displayValidationError(i18n.getMessage("message.error.missing.controllerId")); - return false; - } - final String trimmedControllerId = StringUtils.trimWhitespace(entity.getControllerId()); - if (!controllerIdBeforeEdit.equals(trimmedControllerId) - && targetManagement.getByControllerID(trimmedControllerId).isPresent()) { - uiNotification - .displayValidationError(i18n.getMessage("message.target.duplicate.check", trimmedControllerId)); - return false; - } + return proxyTargetValidator.isEntityValid(entity, () -> hasControllerIdChanged(trimmedControllerId) + && targetManagement.getByControllerID(trimmedControllerId).isPresent()); + } - return true; + private boolean hasControllerIdChanged(final String trimmedControllerId) { + return !controllerIdBeforeEdit.equals(trimmedControllerId); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/AddTargetTagWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/AddTargetTagWindowController.java index da6fca46c..e80a7aa86 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/AddTargetTagWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/AddTargetTagWindowController.java @@ -8,62 +8,44 @@ */ package org.eclipse.hawkbit.ui.management.targettag; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TargetTagManagement; -import org.eclipse.hawkbit.repository.model.TargetTag; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; +import org.eclipse.hawkbit.repository.model.Tag; +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.data.proxies.ProxyIdentifiableEntity; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; 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.EntityModifiedEventType; -import org.eclipse.hawkbit.ui.common.event.EventTopics; +import org.eclipse.hawkbit.ui.common.tag.ProxyTagValidator; import org.eclipse.hawkbit.ui.management.tag.TagWindowLayout; -import org.eclipse.hawkbit.ui.utils.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.springframework.util.StringUtils; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Controller for add target tag window */ -public class AddTargetTagWindowController extends AbstractEntityWindowController { - private final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; +public class AddTargetTagWindowController extends AbstractAddNamedEntityWindowController { private final TargetTagManagement targetTagManagement; - private final TagWindowLayout layout; + private final ProxyTagValidator validator; /** * Constructor for AddTargetTagWindowController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetTagManagement - * TargetTagManagement + * TargetTagManagement * @param layout - * TagWindowLayout + * TagWindowLayout */ - public AddTargetTagWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, + public AddTargetTagWindowController(final CommonUiDependencies uiDependencies, final TargetTagManagement targetTagManagement, final TagWindowLayout layout) { - this.i18n = i18n; - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + super(uiDependencies); this.targetTagManagement = targetTagManagement; - this.layout = layout; + this.validator = new ProxyTagValidator(uiDependencies); } @Override @@ -79,28 +61,24 @@ public class AddTargetTagWindowController extends AbstractEntityWindowController } @Override - protected void persistEntity(final ProxyTag entity) { - final TargetTag newTargetTag = targetTagManagement.create(entityFactory.tag().create().name(entity.getName()) + protected Tag persistEntityInRepository(final ProxyTag entity) { + return targetTagManagement.create(getEntityFactory().tag().create().name(entity.getName()) .description(entity.getDescription()).colour(entity.getColour())); + } - uiNotification.displaySuccess(i18n.getMessage("message.save.success", newTargetTag.getName())); - eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( - EntityModifiedEventType.ENTITY_ADDED, ProxyTarget.class, ProxyTag.class, newTargetTag.getId())); + @Override + protected Class getEntityClass() { + return ProxyTag.class; + } + + @Override + protected Class getParentEntityClass() { + return ProxyTarget.class; } @Override protected boolean isEntityValid(final ProxyTag entity) { - if (!StringUtils.hasText(entity.getName())) { - uiNotification.displayValidationError(i18n.getMessage("message.error.missing.tagname")); - return false; - } - final String trimmedName = StringUtils.trimWhitespace(entity.getName()); - if (targetTagManagement.getByName(trimmedName).isPresent()) { - uiNotification.displayValidationError(i18n.getMessage("message.tag.duplicate.check", trimmedName)); - return false; - } - - return true; + return validator.isEntityValid(entity, () -> targetTagManagement.getByName(trimmedName).isPresent()); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/TargetTagWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/TargetTagWindowBuilder.java index 18c26d644..e025d3753 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/TargetTagWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/TargetTagWindowBuilder.java @@ -8,15 +8,12 @@ */ package org.eclipse.hawkbit.ui.management.targettag; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TargetTagManagement; import org.eclipse.hawkbit.ui.common.AbstractEntityWindowBuilder; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; import org.eclipse.hawkbit.ui.management.tag.TagWindowLayout; 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; @@ -24,34 +21,19 @@ import com.vaadin.ui.Window; * Builder for target tag window */ public class TargetTagWindowBuilder extends AbstractEntityWindowBuilder { - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; private final TargetTagManagement targetTagManagement; /** * Constructor for TargetTagWindowBuilder * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetTagManagement - * TargetTagManagement + * TargetTagManagement */ - public TargetTagWindowBuilder(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, - final TargetTagManagement targetTagManagement) { - super(i18n); - - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + public TargetTagWindowBuilder(final CommonUiDependencies uiDependencies, final TargetTagManagement targetTagManagement) { + super(uiDependencies); this.targetTagManagement = targetTagManagement; } @@ -63,14 +45,14 @@ public class TargetTagWindowBuilder extends AbstractEntityWindowBuilder(i18n, uiNotification))); + return getWindowForNewEntity(new AddTargetTagWindowController(uiDependencies, targetTagManagement, + new TagWindowLayout(uiDependencies))); } @Override public Window getWindowForUpdate(final ProxyTag proxyTag) { - return getWindowForEntity(proxyTag, new UpdateTargetTagWindowController(i18n, entityFactory, eventBus, - uiNotification, targetTagManagement, new TagWindowLayout(i18n, uiNotification))); + return getWindowForEntity(proxyTag, new UpdateTargetTagWindowController(uiDependencies, targetTagManagement, + new TagWindowLayout(uiDependencies))); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/UpdateTargetTagWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/UpdateTargetTagWindowController.java index 70c2c3373..205f6190e 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/UpdateTargetTagWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/UpdateTargetTagWindowController.java @@ -8,71 +8,48 @@ */ package org.eclipse.hawkbit.ui.management.targettag; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TargetTagManagement; import org.eclipse.hawkbit.repository.builder.TagUpdate; -import org.eclipse.hawkbit.repository.exception.EntityNotFoundException; -import org.eclipse.hawkbit.repository.exception.EntityReadOnlyException; -import org.eclipse.hawkbit.repository.model.TargetTag; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; +import org.eclipse.hawkbit.repository.model.Tag; 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.proxies.ProxyIdentifiableEntity; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyTag; 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.EntityModifiedEventType; -import org.eclipse.hawkbit.ui.common.event.EventTopics; +import org.eclipse.hawkbit.ui.common.tag.ProxyTagValidator; import org.eclipse.hawkbit.ui.management.tag.TagWindowLayout; -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.vaadin.spring.events.EventBus.UIEventBus; /** * Controller for Update target tag window */ -public class UpdateTargetTagWindowController extends AbstractEntityWindowController { - private static final Logger LOG = LoggerFactory.getLogger(UpdateTargetTagWindowController.class); - - private final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; +public class UpdateTargetTagWindowController + extends AbstractUpdateNamedEntityWindowController { private final TargetTagManagement targetTagManagement; - private final TagWindowLayout layout; + private final ProxyTagValidator validator; private String nameBeforeEdit; /** * Constructor for UpdateTargetTagWindowController * - * @param i18n - * VaadinMessageSource - * @param entityFactory - * EntityFactory - * @param eventBus - * UIEventBus - * @param uiNotification - * UINotification + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetTagManagement - * TargetTagManagement + * TargetTagManagement * @param layout - * TagWindowLayout + * TagWindowLayout */ - public UpdateTargetTagWindowController(final VaadinMessageSource i18n, final EntityFactory entityFactory, - final UIEventBus eventBus, final UINotification uiNotification, + public UpdateTargetTagWindowController(final CommonUiDependencies uiDependencies, final TargetTagManagement targetTagManagement, final TagWindowLayout layout) { - this.i18n = i18n; - this.entityFactory = entityFactory; - this.eventBus = eventBus; - this.uiNotification = uiNotification; + super(uiDependencies); this.targetTagManagement = targetTagManagement; - this.layout = layout; + this.validator = new ProxyTagValidator(uiDependencies); } @Override @@ -100,37 +77,30 @@ public class UpdateTargetTagWindowController extends AbstractEntityWindowControl } @Override - protected void persistEntity(final ProxyTag entity) { - final TagUpdate tagUpdate = entityFactory.tag().update(entity.getId()).name(entity.getName()) + protected Tag persistEntityInRepository(final ProxyTag entity) { + final TagUpdate tagUpdate = getEntityFactory().tag().update(entity.getId()).name(entity.getName()) .description(entity.getDescription()).colour(entity.getColour()); + return targetTagManagement.update(tagUpdate); + } - try { - final TargetTag updatedTag = targetTagManagement.update(tagUpdate); + @Override + protected Class getEntityClass() { + return ProxyTag.class; + } - uiNotification.displaySuccess(i18n.getMessage("message.update.success", updatedTag.getName())); - eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( - EntityModifiedEventType.ENTITY_UPDATED, ProxyTarget.class, ProxyTag.class, updatedTag.getId())); - } catch (final EntityNotFoundException | EntityReadOnlyException e) { - LOG.trace("Update of target tag failed in UI: {}", e.getMessage()); - final String entityType = i18n.getMessage("caption.entity.target.tag"); - uiNotification - .displayWarning(i18n.getMessage("message.deleted.or.notAllowed", entityType, entity.getName())); - } + @Override + protected Class getParentEntityClass() { + return ProxyTarget.class; } @Override protected boolean isEntityValid(final ProxyTag entity) { - if (!StringUtils.hasText(entity.getName())) { - uiNotification.displayValidationError(i18n.getMessage("message.error.missing.tagname")); - return false; - } - final String trimmedName = StringUtils.trimWhitespace(entity.getName()); - if (!nameBeforeEdit.equals(trimmedName) && targetTagManagement.getByName(trimmedName).isPresent()) { - uiNotification.displayValidationError(i18n.getMessage("message.tag.duplicate.check", trimmedName)); - return false; - } + return validator.isEntityValid(entity, + () -> hasNamedChanged(trimmedName) && targetTagManagement.getByName(trimmedName).isPresent()); + } - return true; + private boolean hasNamedChanged(final String trimmedName) { + return !nameBeforeEdit.equals(trimmedName); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/MultipleTargetFilter.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/MultipleTargetFilter.java index f3e4df525..618b44439 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/MultipleTargetFilter.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/MultipleTargetFilter.java @@ -14,7 +14,7 @@ import java.util.List; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetTagManagement; -import org.eclipse.hawkbit.ui.SpPermissionChecker; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; 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.ProxyTargetFilterQuery; @@ -31,7 +31,6 @@ import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedGridR import org.eclipse.hawkbit.ui.management.targettag.TargetTagWindowBuilder; import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; 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; @@ -60,18 +59,16 @@ public class MultipleTargetFilter extends Accordion { private final transient EntityModifiedListener entityTagModifiedListener; private final transient EntityModifiedListener entityFilterQueryModifiedListener; - MultipleTargetFilter(final SpPermissionChecker permChecker, final VaadinMessageSource i18n, - final UIEventBus eventBus, final UINotification notification, - final TargetFilterQueryManagement targetFilterQueryManagement, + MultipleTargetFilter(final CommonUiDependencies uiDependencies, final TargetFilterQueryManagement targetFilterQueryManagement, final TargetTagManagement targetTagManagement, final TargetManagement targetManagement, final TargetTagFilterLayoutUiState targetTagFilterLayoutUiState, final TargetTagWindowBuilder targetTagWindowBuilder) { - this.i18n = i18n; - this.eventBus = eventBus; + this.i18n = uiDependencies.getI18n(); + this.eventBus = uiDependencies.getEventBus(); this.targetTagFilterLayoutUiState = targetTagFilterLayoutUiState; - this.filterByButtons = new TargetTagFilterButtons(i18n, eventBus, notification, permChecker, - targetTagManagement, targetManagement, targetTagFilterLayoutUiState, targetTagWindowBuilder); + this.filterByButtons = new TargetTagFilterButtons(uiDependencies, targetTagManagement, targetManagement, + targetTagFilterLayoutUiState, targetTagWindowBuilder); this.filterByStatusFooter = new FilterByStatusLayout(i18n, eventBus, targetTagFilterLayoutUiState); this.simpleFilterTab = buildSimpleFilterTab(); this.customFilterTab = new TargetFilterQueryButtons(i18n, eventBus, targetFilterQueryManagement, diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/TargetTagFilterButtons.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/TargetTagFilterButtons.java index 0756fa198..6a18edbc3 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/TargetTagFilterButtons.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/TargetTagFilterButtons.java @@ -12,7 +12,7 @@ import java.util.Collections; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetTagManagement; -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.providers.TargetTagDataProvider; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity; @@ -25,9 +25,6 @@ import org.eclipse.hawkbit.ui.common.grid.support.assignment.TargetsToTagAssignm import org.eclipse.hawkbit.ui.management.targettag.TargetTagWindowBuilder; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; 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.ui.Window; @@ -40,19 +37,18 @@ public class TargetTagFilterButtons extends AbstractTagFilterButtons { private final transient TargetTagManagement targetTagManagement; private final transient TargetTagWindowBuilder targetTagWindowBuilder; - TargetTagFilterButtons(final VaadinMessageSource i18n, final UIEventBus eventBus, final UINotification notification, - final SpPermissionChecker permChecker, final TargetTagManagement targetTagManagement, + TargetTagFilterButtons(final CommonUiDependencies uiDependencies, final TargetTagManagement targetTagManagement, final TargetManagement targetManagement, final TargetTagFilterLayoutUiState targetTagFilterLayoutUiState, final TargetTagWindowBuilder targetTagWindowBuilder) { - super(eventBus, i18n, notification, permChecker, targetTagFilterLayoutUiState); + super(uiDependencies, targetTagFilterLayoutUiState); this.targetTagManagement = targetTagManagement; this.targetTagWindowBuilder = targetTagWindowBuilder; - final TargetsToTagAssignmentSupport targetsToTagAssignment = new TargetsToTagAssignmentSupport(notification, - i18n, eventBus, permChecker, targetManagement); + final TargetsToTagAssignmentSupport targetsToTagAssignment = new TargetsToTagAssignmentSupport(uiDependencies, + targetManagement); - setDragAndDropSupportSupport(new DragAndDropSupport<>(this, i18n, notification, + setDragAndDropSupportSupport(new DragAndDropSupport<>(this, i18n, uiNotification, Collections.singletonMap(UIComponentIdProvider.TARGET_TABLE_ID, targetsToTagAssignment), eventBus)); getDragAndDropSupportSupport().ignoreSelection(true); getDragAndDropSupportSupport().addDragAndDrop(); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/TargetTagFilterHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/TargetTagFilterHeader.java index f6014e584..4dc7f3c8e 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/TargetTagFilterHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/TargetTagFilterHeader.java @@ -8,15 +8,13 @@ */ package org.eclipse.hawkbit.ui.management.targettag.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.EventView; import org.eclipse.hawkbit.ui.common.grid.header.AbstractFilterHeader; import org.eclipse.hawkbit.ui.management.targettag.TargetTagWindowBuilder; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; 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; @@ -33,21 +31,17 @@ public class TargetTagFilterHeader extends AbstractFilterHeader { /** * Constructor for TargetTagFilterHeader * - * @param i18n - * VaadinMessageSource - * @param permChecker - * SpPermissionChecker - * @param eventBus - * UIEventBus + * @param uiDependencies + * {@link CommonUiDependencies} * @param targetTagFilterLayoutUiState - * TargetTagFilterLayoutUiState + * TargetTagFilterLayoutUiState * @param targetTagWindowBuilder - * TargetTagWindowBuilder + * TargetTagWindowBuilder */ - public TargetTagFilterHeader(final VaadinMessageSource i18n, final SpPermissionChecker permChecker, - final UIEventBus eventBus, final TargetTagFilterLayoutUiState targetTagFilterLayoutUiState, + public TargetTagFilterHeader(final CommonUiDependencies uiDependencies, + final TargetTagFilterLayoutUiState targetTagFilterLayoutUiState, final TargetTagWindowBuilder targetTagWindowBuilder) { - super(i18n, permChecker, eventBus); + super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus()); this.targetTagFilterLayoutUiState = targetTagFilterLayoutUiState; this.targetTagWindowBuilder = targetTagWindowBuilder; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/TargetTagFilterLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/TargetTagFilterLayout.java index c13b64507..cfa7839fb 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/TargetTagFilterLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/filter/TargetTagFilterLayout.java @@ -8,20 +8,16 @@ */ package org.eclipse.hawkbit.ui.management.targettag.filter; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TargetTagManagement; -import org.eclipse.hawkbit.ui.SpPermissionChecker; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.event.EventTopics; import org.eclipse.hawkbit.ui.common.event.TargetFilterTabChangedEventPayload; import org.eclipse.hawkbit.ui.common.filterlayout.AbstractFilterLayout; import org.eclipse.hawkbit.ui.common.layout.listener.GenericEventListener; import org.eclipse.hawkbit.ui.management.ManagementUIState; import org.eclipse.hawkbit.ui.management.targettag.TargetTagWindowBuilder; -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; @@ -38,44 +34,33 @@ public class TargetTagFilterLayout extends AbstractFilterLayout { /** * Constructor - * - * @param i18n - * VaadinMessageSource + * + * @param uiDependencies + * {@link CommonUiDependencies} * @param managementUIState * ManagementUIState - * @param permChecker - * SpPermissionChecker - * @param eventBus - * UIEventBus - * @param notification - * UINotification - * @param entityFactory - * EntityFactory * @param targetFilterQueryManagement * TargetFilterQueryManagement * @param targetTagManagement * TargetTagManagement * @param targetManagement - * TargetManagement + * TargetManagement * @param targetTagFilterLayoutUiState - * TargetTagFilterLayoutUiState + * TargetTagFilterLayoutUiState */ - public TargetTagFilterLayout(final VaadinMessageSource i18n, final ManagementUIState managementUIState, - final SpPermissionChecker permChecker, final UIEventBus eventBus, final UINotification notification, - final EntityFactory entityFactory, final TargetFilterQueryManagement targetFilterQueryManagement, + public TargetTagFilterLayout(final CommonUiDependencies uiDependencies, final ManagementUIState managementUIState, + final TargetFilterQueryManagement targetFilterQueryManagement, final TargetTagManagement targetTagManagement, final TargetManagement targetManagement, final TargetTagFilterLayoutUiState targetTagFilterLayoutUiState) { - final TargetTagWindowBuilder targetTagWindowBuilder = new TargetTagWindowBuilder(i18n, entityFactory, eventBus, - notification, targetTagManagement); + final TargetTagWindowBuilder targetTagWindowBuilder = new TargetTagWindowBuilder(uiDependencies, targetTagManagement); - this.targetTagFilterHeader = new TargetTagFilterHeader(i18n, permChecker, eventBus, - targetTagFilterLayoutUiState, targetTagWindowBuilder); - this.multipleTargetFilter = new MultipleTargetFilter(permChecker, i18n, eventBus, notification, - targetFilterQueryManagement, targetTagManagement, targetManagement, targetTagFilterLayoutUiState, + this.targetTagFilterHeader = new TargetTagFilterHeader(uiDependencies, targetTagFilterLayoutUiState, targetTagWindowBuilder); + this.multipleTargetFilter = new MultipleTargetFilter(uiDependencies, targetFilterQueryManagement, targetTagManagement, + targetManagement, targetTagFilterLayoutUiState, targetTagWindowBuilder); - this.filterTabChangedListener = new GenericEventListener<>(eventBus, EventTopics.TARGET_FILTER_TAB_CHANGED, - this::onTargetFilterTabChanged); + this.filterTabChangedListener = new GenericEventListener<>(uiDependencies.getEventBus(), + EventTopics.TARGET_FILTER_TAB_CHANGED, this::onTargetFilterTabChanged); buildLayout(); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/DistributionBarHelper.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/DistributionBarHelper.java index 0b8f8f6b3..43bae779a 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/DistributionBarHelper.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/DistributionBarHelper.java @@ -23,6 +23,7 @@ import org.vaadin.alump.distributionbar.gwt.client.GwtDistributionBar; * */ public final class DistributionBarHelper { + private static final String HTML_DIV_CLASS_START = "

statusCountMap, final VaadinMessageSource i18n) { @@ -130,13 +131,13 @@ public final class DistributionBarHelper { private static String getPart(final int partIndex, final Status status, final Long value, final Long totalValue, final int noOfParts) { - return "
" + value + "
"; } private static String getUnintialisedBar() { - return "
uninitialized
"; } @@ -149,7 +150,7 @@ public final class DistributionBarHelper { } private static String getParentDivStart() { - return "
"; } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutView.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutView.java index 5f2396438..8e01ae6b2 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutView.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/RolloutView.java @@ -26,6 +26,7 @@ import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.ui.AbstractHawkbitUI; import org.eclipse.hawkbit.ui.SpPermissionChecker; 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.EventView; import org.eclipse.hawkbit.ui.common.event.EventViewAware; @@ -73,13 +74,15 @@ public class RolloutView extends VerticalLayout implements View { final SystemSecurityContext systemSecurityContext) { this.rolloutManagementUIState = rolloutManagementUIState; - this.rolloutsLayout = new RolloutGridLayout(permissionChecker, rolloutManagementUIState, eventBus, - rolloutManagement, targetManagement, uiNotification, uiProperties, entityFactory, i18n, - targetFilterQueryManagement, rolloutGroupManagement, quotaManagement, tenantConfigManagement, - distributionSetManagement, systemSecurityContext); - this.rolloutGroupsLayout = new RolloutGroupGridLayout(i18n, eventBus, rolloutGroupManagement, - rolloutManagementUIState, permissionChecker); - this.rolloutGroupTargetsLayout = new RolloutGroupTargetGridLayout(eventBus, i18n, rolloutGroupManagement, + final CommonUiDependencies uiDependencies = new CommonUiDependencies(i18n, entityFactory, eventBus, uiNotification, + permissionChecker); + + this.rolloutsLayout = new RolloutGridLayout(uiDependencies, rolloutManagementUIState, rolloutManagement, + targetManagement, uiProperties, targetFilterQueryManagement, rolloutGroupManagement, quotaManagement, + tenantConfigManagement, distributionSetManagement, systemSecurityContext); + this.rolloutGroupsLayout = new RolloutGroupGridLayout(uiDependencies, rolloutGroupManagement, + rolloutManagementUIState); + this.rolloutGroupTargetsLayout = new RolloutGroupTargetGridLayout(uiDependencies, rolloutGroupManagement, rolloutManagementUIState); final Map layoutVisibilityHandlers = new EnumMap<>(EventLayout.class); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutGrid.java index f44f32925..fc487cc08 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutGrid.java @@ -24,7 +24,7 @@ import org.eclipse.hawkbit.repository.model.Rollout.RolloutStatus; import org.eclipse.hawkbit.repository.model.TotalTargetCountStatus.Status; import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationProperties.TenantConfigurationKey; -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.StatusIconBuilder.ActionTypeIconSupplier; import org.eclipse.hawkbit.ui.common.builder.StatusIconBuilder.RolloutStatusIconSupplier; @@ -53,8 +53,6 @@ import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; 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.cronutils.utils.StringUtils; import com.google.common.base.Predicates; @@ -107,19 +105,19 @@ public class RolloutGrid extends AbstractGrid { private final transient DeleteSupport rolloutDeleteSupport; - RolloutGrid(final VaadinMessageSource i18n, final UIEventBus eventBus, final RolloutManagement rolloutManagement, - final RolloutGroupManagement rolloutGroupManagement, final UINotification uiNotification, - final RolloutManagementUIState rolloutManagementUIState, final SpPermissionChecker permissionChecker, + RolloutGrid(final CommonUiDependencies uiDependencies, final RolloutManagement rolloutManagement, + final RolloutGroupManagement rolloutGroupManagement, + final RolloutManagementUIState rolloutManagementUIState, final TenantConfigurationManagement tenantConfigManagement, final RolloutWindowBuilder rolloutWindowBuilder, final SystemSecurityContext systemSecurityContext) { - super(i18n, eventBus, permissionChecker); + super(uiDependencies.getI18n(), uiDependencies.getEventBus(), uiDependencies.getPermChecker()); this.rolloutManagementUIState = rolloutManagementUIState; this.rolloutManagement = rolloutManagement; this.rolloutGroupManagement = rolloutGroupManagement; this.tenantConfigManagement = tenantConfigManagement; this.systemSecurityContext = systemSecurityContext; - this.uiNotification = uiNotification; + this.uiNotification = uiDependencies.getUiNotification(); this.rolloutWindowBuilder = rolloutWindowBuilder; this.rolloutMapper = new RolloutToProxyRolloutMapper(); @@ -422,7 +420,7 @@ public class RolloutGrid extends AbstractGrid { /** * Used to show the Rollouts List View in case the currently selected * Rollout was deleted. - * + * * @param deletedSelectedRolloutId * id of the deleted Rollout that is currently selected */ diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutGridHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutGridHeader.java index b2140e866..0862e6eb6 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutGridHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutGridHeader.java @@ -10,7 +10,7 @@ package org.eclipse.hawkbit.ui.rollout.rollout; 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.ProxyRollout; import org.eclipse.hawkbit.ui.common.event.EventTopics; import org.eclipse.hawkbit.ui.common.event.EventView; @@ -23,8 +23,6 @@ import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; import org.eclipse.hawkbit.ui.rollout.RolloutManagementUIState; import org.eclipse.hawkbit.ui.rollout.window.RolloutWindowBuilder; 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.UI; @@ -42,10 +40,9 @@ public class RolloutGridHeader extends AbstractGridHeader { private final transient SearchHeaderSupport searchHeaderSupport; private final transient AddHeaderSupport addHeaderSupport; - RolloutGridHeader(final SpPermissionChecker permissionChecker, - final RolloutManagementUIState rolloutManagementUIState, final UIEventBus eventBus, - final VaadinMessageSource i18n, final RolloutWindowBuilder windowBuilder) { - super(i18n, permissionChecker, eventBus); + RolloutGridHeader(final CommonUiDependencies uiDependencies, final RolloutManagementUIState rolloutManagementUIState, + final RolloutWindowBuilder windowBuilder) { + super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus()); this.rolloutManagementUIState = rolloutManagementUIState; this.rolloutWindowBuilder = windowBuilder; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutGridLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutGridLayout.java index a0dc26664..6386d146e 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutGridLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/RolloutGridLayout.java @@ -12,7 +12,6 @@ import java.util.Arrays; import java.util.List; import org.eclipse.hawkbit.repository.DistributionSetManagement; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.QuotaManagement; import org.eclipse.hawkbit.repository.RolloutGroupManagement; import org.eclipse.hawkbit.repository.RolloutManagement; @@ -20,8 +19,8 @@ import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.TenantConfigurationManagement; import org.eclipse.hawkbit.security.SystemSecurityContext; -import org.eclipse.hawkbit.ui.SpPermissionChecker; import org.eclipse.hawkbit.ui.UiProperties; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyRollout; import org.eclipse.hawkbit.ui.common.event.EventView; import org.eclipse.hawkbit.ui.common.event.EventViewAware; @@ -34,9 +33,6 @@ import org.eclipse.hawkbit.ui.common.layout.listener.support.EntityModifiedSelec import org.eclipse.hawkbit.ui.rollout.RolloutManagementUIState; import org.eclipse.hawkbit.ui.rollout.window.RolloutWindowBuilder; import org.eclipse.hawkbit.ui.rollout.window.RolloutWindowDependencies; -import org.eclipse.hawkbit.ui.utils.UINotification; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Rollout list view. @@ -53,61 +49,49 @@ public class RolloutGridLayout extends AbstractGridComponentLayout { /** * Constructor for RolloutGridLayout * - * @param permissionChecker - * SpPermissionChecker + * @param uiDependencies + * {@link CommonUiDependencies} * @param rolloutManagementUIState - * RolloutManagementUIState - * @param eventBus - * UIEventBus + * RolloutManagementUIState * @param rolloutManagement - * RolloutManagement + * RolloutManagement * @param targetManagement - * TargetManagement - * @param uiNotification - * UINotification + * TargetManagement * @param uiProperties - * UiProperties - * @param entityFactory - * EntityFactory - * @param i18n - * VaadinMessageSource + * UiProperties * @param targetFilterQueryManagement - * TargetFilterQueryManagement + * TargetFilterQueryManagement * @param rolloutGroupManagement - * RolloutGroupManagement + * RolloutGroupManagement * @param quotaManagement - * QuotaManagement + * QuotaManagement * @param tenantConfigManagement - * TenantConfigurationManagement + * TenantConfigurationManagement * @param distributionSetManagement - * DistributionSetManagement + * DistributionSetManagement * @param systemSecurityContext - * SystemSecurityContext + * SystemSecurityContext */ - public RolloutGridLayout(final SpPermissionChecker permissionChecker, - final RolloutManagementUIState rolloutManagementUIState, final UIEventBus eventBus, + public RolloutGridLayout(final CommonUiDependencies uiDependencies, final RolloutManagementUIState rolloutManagementUIState, final RolloutManagement rolloutManagement, final TargetManagement targetManagement, - final UINotification uiNotification, final UiProperties uiProperties, final EntityFactory entityFactory, - final VaadinMessageSource i18n, final TargetFilterQueryManagement targetFilterQueryManagement, + final UiProperties uiProperties, final TargetFilterQueryManagement targetFilterQueryManagement, final RolloutGroupManagement rolloutGroupManagement, final QuotaManagement quotaManagement, final TenantConfigurationManagement tenantConfigManagement, final DistributionSetManagement distributionSetManagement, final SystemSecurityContext systemSecurityContext) { - final RolloutWindowDependencies rolloutWindowDependecies = new RolloutWindowDependencies(rolloutManagement, - targetManagement, uiNotification, entityFactory, i18n, uiProperties, eventBus, - targetFilterQueryManagement, rolloutGroupManagement, quotaManagement, distributionSetManagement); + final RolloutWindowDependencies rolloutWindowDependecies = new RolloutWindowDependencies(uiDependencies, + rolloutManagement, targetManagement, uiProperties, targetFilterQueryManagement, rolloutGroupManagement, + quotaManagement, distributionSetManagement); final RolloutWindowBuilder rolloutWindowBuilder = new RolloutWindowBuilder(rolloutWindowDependecies); - this.rolloutListHeader = new RolloutGridHeader(permissionChecker, rolloutManagementUIState, eventBus, i18n, - rolloutWindowBuilder); - this.rolloutListGrid = new RolloutGrid(i18n, eventBus, rolloutManagement, rolloutGroupManagement, - uiNotification, rolloutManagementUIState, permissionChecker, tenantConfigManagement, - rolloutWindowBuilder, systemSecurityContext); + this.rolloutListHeader = new RolloutGridHeader(uiDependencies, rolloutManagementUIState, rolloutWindowBuilder); + this.rolloutListGrid = new RolloutGrid(uiDependencies, rolloutManagement, rolloutGroupManagement, + rolloutManagementUIState, tenantConfigManagement, rolloutWindowBuilder, systemSecurityContext); - this.rolloutFilterListener = new FilterChangedListener<>(eventBus, ProxyRollout.class, + this.rolloutFilterListener = new FilterChangedListener<>(uiDependencies.getEventBus(), ProxyRollout.class, new EventViewAware(EventView.ROLLOUT), rolloutListGrid.getFilterSupport()); - this.rolloutModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyRollout.class) + this.rolloutModifiedListener = new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), ProxyRollout.class) .entityModifiedAwareSupports(getRolloutModifiedAwareSupports()).build(); buildLayout(rolloutListHeader, rolloutListGrid); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupGrid.java index 71383ceb2..9f8b5de2a 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupGrid.java @@ -14,7 +14,7 @@ import java.util.Optional; import org.eclipse.hawkbit.repository.RolloutGroupManagement; import org.eclipse.hawkbit.repository.model.RolloutGroup; import org.eclipse.hawkbit.repository.model.RolloutGroup.RolloutGroupStatus; -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.StatusIconBuilder.RolloutGroupStatusIconSupplier; import org.eclipse.hawkbit.ui.common.data.mappers.RolloutGroupToProxyRolloutGroupMapper; @@ -36,8 +36,6 @@ import org.eclipse.hawkbit.ui.rollout.DistributionBarHelper; import org.eclipse.hawkbit.ui.rollout.RolloutManagementUIState; import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.vaadin.spring.events.EventBus.UIEventBus; import com.google.common.base.Predicates; import com.vaadin.shared.ui.ContentMode; @@ -60,24 +58,9 @@ public class RolloutGroupGrid extends AbstractGrid { private final transient MasterEntitySupport masterEntitySupport; - /** - * Constructor for RolloutGroupGrid - * - * @param i18n - * VaadinMessageSource - * @param eventBus - * UIEventBus - * @param permissionChecker - * SpPermissionChecker - * @param rolloutGroupManagement - * RolloutGroupManagement - * @param rolloutManagementUIState - * RolloutManagementUIState - */ - public RolloutGroupGrid(final VaadinMessageSource i18n, final UIEventBus eventBus, - final SpPermissionChecker permissionChecker, final RolloutGroupManagement rolloutGroupManagement, + RolloutGroupGrid(final CommonUiDependencies uiDependencies, final RolloutGroupManagement rolloutGroupManagement, final RolloutManagementUIState rolloutManagementUIState) { - super(i18n, eventBus, permissionChecker); + super(uiDependencies.getI18n(), uiDependencies.getEventBus(), uiDependencies.getPermChecker()); this.rolloutManagementUIState = rolloutManagementUIState; this.rolloutGroupManagement = rolloutGroupManagement; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupGridHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupGridHeader.java index 811f6beda..f32d5aa9b 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupGridHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupGridHeader.java @@ -8,6 +8,7 @@ */ package org.eclipse.hawkbit.ui.rollout.rolloutgroup; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyRollout; import org.eclipse.hawkbit.ui.common.event.CommandTopics; import org.eclipse.hawkbit.ui.common.event.EventLayout; @@ -19,8 +20,6 @@ import org.eclipse.hawkbit.ui.common.grid.header.support.CloseHeaderSupport; import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent; import org.eclipse.hawkbit.ui.rollout.RolloutManagementUIState; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Header Layout of Rollout Group list view. @@ -31,19 +30,8 @@ public class RolloutGroupGridHeader extends AbstractBreadcrumbGridHeader private final RolloutManagementUIState rolloutManagementUIState; - /** - * Constructor for RolloutGroupsListHeader - * - * @param eventBus - * UIEventBus - * @param rolloutManagementUIState - * UIState - * @param i18n - * I18N - */ - public RolloutGroupGridHeader(final UIEventBus eventBus, final RolloutManagementUIState rolloutManagementUIState, - final VaadinMessageSource i18n) { - super(i18n, null, eventBus); + RolloutGroupGridHeader(final CommonUiDependencies uiDependencies, final RolloutManagementUIState rolloutManagementUIState) { + super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus()); this.rolloutManagementUIState = rolloutManagementUIState; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupGridLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupGridLayout.java index dd6593889..ea3a6d3de 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupGridLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgroup/RolloutGroupGridLayout.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.Optional; import org.eclipse.hawkbit.repository.RolloutGroupManagement; -import org.eclipse.hawkbit.ui.SpPermissionChecker; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyRollout; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyRolloutGroup; import org.eclipse.hawkbit.ui.common.event.EventLayout; @@ -27,8 +27,6 @@ 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.EntityModifiedSelectionAwareSupport; import org.eclipse.hawkbit.ui.rollout.RolloutManagementUIState; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Groups List View. @@ -44,33 +42,27 @@ public class RolloutGroupGridLayout extends AbstractGridComponentLayout { /** * Constructor for RolloutGroupsListView - * - * @param i18n - * I18N - * @param eventBus - * UIEventBus + * + * @param uiDependencies + * {@link CommonUiDependencies} * @param rolloutGroupManagement * RolloutGroupManagement * @param rolloutManagementUIState * UIState - * @param permissionChecker - * SpPermissionChecker */ - public RolloutGroupGridLayout(final VaadinMessageSource i18n, final UIEventBus eventBus, - final RolloutGroupManagement rolloutGroupManagement, - final RolloutManagementUIState rolloutManagementUIState, final SpPermissionChecker permissionChecker) { - this.rolloutGroupsListHeader = new RolloutGroupGridHeader(eventBus, rolloutManagementUIState, i18n); - this.rolloutGroupListGrid = new RolloutGroupGrid(i18n, eventBus, permissionChecker, rolloutGroupManagement, - rolloutManagementUIState); + public RolloutGroupGridLayout(final CommonUiDependencies uiDependencies, final RolloutGroupManagement rolloutGroupManagement, + final RolloutManagementUIState rolloutManagementUIState) { + this.rolloutGroupsListHeader = new RolloutGroupGridHeader(uiDependencies, rolloutManagementUIState); + this.rolloutGroupListGrid = new RolloutGroupGrid(uiDependencies, rolloutGroupManagement, rolloutManagementUIState); final EventLayoutViewAware masterLayoutView = new EventLayoutViewAware(EventLayout.ROLLOUT_LIST, EventView.ROLLOUT); - this.masterEntityChangedListener = new SelectionChangedListener<>(eventBus, masterLayoutView, + this.masterEntityChangedListener = new SelectionChangedListener<>(uiDependencies.getEventBus(), masterLayoutView, getMasterEntityAwareComponents()); - this.entityModifiedListener = new EntityModifiedListener.Builder<>(eventBus, ProxyRolloutGroup.class) - .entityModifiedAwareSupports(getEntityModifiedAwareSupports()).parentEntityType(ProxyRollout.class) - .parentEntityIdProvider(this::getMasterEntityId).build(); + this.entityModifiedListener = new EntityModifiedListener.Builder<>(uiDependencies.getEventBus(), + ProxyRolloutGroup.class).entityModifiedAwareSupports(getEntityModifiedAwareSupports()) + .parentEntityType(ProxyRollout.class).parentEntityIdProvider(this::getMasterEntityId).build(); buildLayout(rolloutGroupsListHeader, rolloutGroupListGrid); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetGrid.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetGrid.java index c812e81d7..574b11c6b 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetGrid.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetGrid.java @@ -9,6 +9,7 @@ package org.eclipse.hawkbit.ui.rollout.rolloutgrouptargets; import org.eclipse.hawkbit.repository.RolloutGroupManagement; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.builder.GridComponentBuilder; import org.eclipse.hawkbit.ui.common.builder.StatusIconBuilder.RolloutActionStatusIconSupplier; import org.eclipse.hawkbit.ui.common.data.mappers.TargetWithActionStatusToProxyTargetMapper; @@ -22,8 +23,6 @@ import org.eclipse.hawkbit.ui.common.grid.support.MasterEntitySupport; import org.eclipse.hawkbit.ui.rollout.RolloutManagementUIState; import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Grid component with targets of rollout group. @@ -37,22 +36,9 @@ public class RolloutGroupTargetGrid extends AbstractGrid { private final transient MasterEntitySupport masterEntitySupport; - /** - * Constructor for RolloutGroupTargetsListGrid - * - * @param i18n - * I18N - * @param eventBus - * UIEventBus - * @param rolloutGroupManagement - * RolloutGroupManagement - * @param rolloutManagementUIState - * RolloutUIState - */ - public RolloutGroupTargetGrid(final VaadinMessageSource i18n, final UIEventBus eventBus, - final RolloutGroupManagement rolloutGroupManagement, + RolloutGroupTargetGrid(final CommonUiDependencies uiDependencies, final RolloutGroupManagement rolloutGroupManagement, final RolloutManagementUIState rolloutManagementUIState) { - super(i18n, eventBus, null); + super(uiDependencies.getI18n(), uiDependencies.getEventBus(), uiDependencies.getPermChecker()); this.rolloutManagementUIState = rolloutManagementUIState; setFilterSupport(new FilterSupport<>(new RolloutGroupTargetsDataProvider(rolloutGroupManagement, diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetGridHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetGridHeader.java index 05c9a6c05..01ed2d514 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetGridHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetGridHeader.java @@ -11,6 +11,7 @@ package org.eclipse.hawkbit.ui.rollout.rolloutgrouptargets; import java.util.Arrays; import java.util.function.Consumer; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyRollout; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyRolloutGroup; import org.eclipse.hawkbit.ui.common.event.CommandTopics; @@ -23,8 +24,6 @@ import org.eclipse.hawkbit.ui.common.grid.header.support.CloseHeaderSupport; import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent; import org.eclipse.hawkbit.ui.rollout.RolloutManagementUIState; import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Header Layout of Rollout Group Targets list view. @@ -37,19 +36,9 @@ public class RolloutGroupTargetGridHeader extends AbstractBreadcrumbGridHeader private final transient Consumer setRolloutNameCallback; - /** - * Constructor for RolloutGroupTargetGridHeader - * - * @param eventBus - * UIEventBus - * @param i18n - * VaadinMessageSource - * @param rolloutManagementUIState - * RolloutManagementUIState - */ - public RolloutGroupTargetGridHeader(final UIEventBus eventBus, final VaadinMessageSource i18n, + RolloutGroupTargetGridHeader(final CommonUiDependencies uiDependencies, final RolloutManagementUIState rolloutManagementUIState) { - super(i18n, null, eventBus); + super(uiDependencies.getI18n(), uiDependencies.getPermChecker(), uiDependencies.getEventBus()); this.rolloutManagementUIState = rolloutManagementUIState; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetGridLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetGridLayout.java index 7951b9e59..2ccaefd79 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetGridLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rolloutgrouptargets/RolloutGroupTargetGridLayout.java @@ -13,6 +13,7 @@ import java.util.Collections; import java.util.List; import org.eclipse.hawkbit.repository.RolloutGroupManagement; +import org.eclipse.hawkbit.ui.common.CommonUiDependencies; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyRollout; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyRolloutGroup; import org.eclipse.hawkbit.ui.common.event.EventLayout; @@ -23,8 +24,6 @@ import org.eclipse.hawkbit.ui.common.layout.MasterEntityAwareComponent; import org.eclipse.hawkbit.ui.common.layout.listener.SelectionChangedListener; import org.eclipse.hawkbit.ui.filtermanagement.TargetFilterCountMessageLabel; import org.eclipse.hawkbit.ui.rollout.RolloutManagementUIState; -import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; -import org.vaadin.spring.events.EventBus.UIEventBus; /** * Rollout Group Targets List View. @@ -42,22 +41,20 @@ public class RolloutGroupTargetGridLayout extends AbstractGridComponentLayout { /** * Constructor for RolloutGroupTargetGridLayout * - * @param eventBus - * UIEventBus - * @param i18n - * VaadinMessageSource + * @param uiDependencies + * {@link CommonUiDependencies} * @param rolloutGroupManagement - * RolloutGroupManagement + * RolloutGroupManagement * @param rolloutManagementUIState - * RolloutManagementUIState + * RolloutManagementUIState */ - public RolloutGroupTargetGridLayout(final UIEventBus eventBus, final VaadinMessageSource i18n, + public RolloutGroupTargetGridLayout(final CommonUiDependencies uiDependencies, final RolloutGroupManagement rolloutGroupManagement, final RolloutManagementUIState rolloutManagementUIState) { - this.rolloutGroupTargetsListHeader = new RolloutGroupTargetGridHeader(eventBus, i18n, rolloutManagementUIState); - this.rolloutGroupTargetsListGrid = new RolloutGroupTargetGrid(i18n, eventBus, rolloutGroupManagement, + this.rolloutGroupTargetsListHeader = new RolloutGroupTargetGridHeader(uiDependencies, rolloutManagementUIState); + this.rolloutGroupTargetsListGrid = new RolloutGroupTargetGrid(uiDependencies, rolloutGroupManagement, rolloutManagementUIState); - this.rolloutGroupTargetCountMessageLabel = new TargetFilterCountMessageLabel(i18n); + this.rolloutGroupTargetCountMessageLabel = new TargetFilterCountMessageLabel(uiDependencies.getI18n()); initGridDataUpdatedListener(); @@ -66,10 +63,10 @@ public class RolloutGroupTargetGridLayout extends AbstractGridComponentLayout { final EventLayoutViewAware rolloutGroupLayoutView = new EventLayoutViewAware(EventLayout.ROLLOUT_GROUP_LIST, EventView.ROLLOUT); - this.rolloutChangedListener = new SelectionChangedListener<>(eventBus, rolloutLayoutView, + this.rolloutChangedListener = new SelectionChangedListener<>(uiDependencies.getEventBus(), rolloutLayoutView, Collections.singletonList(rolloutGroupTargetsListHeader::rolloutChanged)); - this.rolloutGroupChangedListener = new SelectionChangedListener<>(eventBus, rolloutGroupLayoutView, - getMasterEntityAwareComponents()); + this.rolloutGroupChangedListener = new SelectionChangedListener<>(uiDependencies.getEventBus(), + rolloutGroupLayoutView, getMasterEntityAwareComponents()); buildLayout(rolloutGroupTargetsListHeader, rolloutGroupTargetsListGrid, rolloutGroupTargetCountMessageLabel); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/RolloutWindowBuilder.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/RolloutWindowBuilder.java index 316ee4e54..39c26d366 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/RolloutWindowBuilder.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/RolloutWindowBuilder.java @@ -32,10 +32,10 @@ public final class RolloutWindowBuilder extends AbstractEntityWindowBuilder { - protected final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - private final UIEventBus eventBus; - private final UINotification uiNotification; - +public class AddRolloutWindowController + extends AbstractAddEntityWindowController { private final RolloutManagement rolloutManagement; - protected final AddRolloutWindowLayout layout; + private final ProxyRolloutValidator validator; /** * Controller for AddRolloutWindowController @@ -66,19 +56,11 @@ public class AddRolloutWindowController extends AbstractEntityWindowController

getLayout() { - return layout; + this.validator = new ProxyRolloutValidator(dependencies.getuiDependencies()); } @Override @@ -105,20 +87,25 @@ public class AddRolloutWindowController extends AbstractEntityWindowController

getLayout() { + return layout; + } + @Override protected void adaptLayout(final ProxyRollout proxyEntity) { layout.addAdvancedGroupRowAndValidate(); } @Override - protected void persistEntity(final ProxyRolloutWindow entity) { + protected Rollout persistEntityInRepository(final ProxyRolloutWindow entity) { final RolloutGroupConditions conditions = new RolloutGroupConditionBuilder() .successAction(RolloutGroupSuccessAction.NEXTGROUP, null) .successCondition(RolloutGroupSuccessCondition.THRESHOLD, entity.getTriggerThresholdPercentage()) .errorCondition(RolloutGroupErrorCondition.THRESHOLD, entity.getErrorThresholdPercentage()) .errorAction(RolloutGroupErrorAction.PAUSE, null).build(); - final RolloutCreate rolloutCreate = entityFactory.rollout().create().name(entity.getName()) + final RolloutCreate rolloutCreate = getEntityFactory().rollout().create().name(entity.getName()) .description(entity.getDescription()).set(entity.getDistributionSetId()) .targetFilterQuery(entity.getTargetFilterQuery()).actionType(entity.getActionType()) .forcedTime(entity.getActionType() == ActionType.TIMEFORCED ? entity.getForcedTime() @@ -133,38 +120,40 @@ public class AddRolloutWindowController extends AbstractEntityWindowController

getEntityClass() { + return ProxyRollout.class; } private List getRolloutGroupsCreateFromDefinitions( final List advancedRolloutGroupDefinitions) { final AdvancedRolloutGroupDefinitionToCreateMapper mapper = new AdvancedRolloutGroupDefinitionToCreateMapper( - entityFactory); + getEntityFactory()); return advancedRolloutGroupDefinitions.stream().map(mapper::map).collect(Collectors.toList()); } @Override protected boolean isEntityValid(final ProxyRolloutWindow entity) { - if (entity == null) { - uiNotification - .displayValidationError(i18n.getMessage("message.save.fail", i18n.getMessage("caption.rollout"))); - return false; - } - - if (!StringUtils.hasText(entity.getName())) { - uiNotification.displayValidationError(i18n.getMessage("message.rollout.name.empty")); - return false; - } - final String trimmedName = StringUtils.trimWhitespace(entity.getName()); - if (rolloutManagement.getByName(trimmedName).isPresent()) { - uiNotification.displayValidationError(i18n.getMessage("message.rollout.duplicate.check", trimmedName)); - return false; - } - - return true; + return validator.isEntityValid(entity, () -> rolloutManagement.getByName(trimmedName).isPresent()); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/controllers/ApproveRolloutWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/controllers/ApproveRolloutWindowController.java index f953c5b76..a5a84ca62 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/controllers/ApproveRolloutWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/controllers/ApproveRolloutWindowController.java @@ -48,15 +48,15 @@ public class ApproveRolloutWindowController extends UpdateRolloutWindowControlle protected void persistEntity(final ProxyRolloutWindow entity) { rolloutManagement.approveOrDeny(entity.getId(), entity.getApprovalDecision(), entity.getApprovalRemark()); - uiNotification.displaySuccess(i18n.getMessage("message.update.success", entity.getName())); - eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( + getUiNotification().displaySuccess(getI18n().getMessage("message.update.success", entity.getName())); + getEventBus().publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( EntityModifiedEventType.ENTITY_UPDATED, ProxyRollout.class, entity.getId())); } @Override protected boolean isEntityValid(final ProxyRolloutWindow entity) { if (entity.getApprovalDecision() == null) { - uiNotification.displayValidationError(i18n.getMessage("message.rollout.approval.required")); + getUiNotification().displayValidationError(getI18n().getMessage("message.rollout.approval.required")); return false; } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/controllers/CopyRolloutWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/controllers/CopyRolloutWindowController.java index b99b8a944..ba44eda60 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/controllers/CopyRolloutWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/controllers/CopyRolloutWindowController.java @@ -59,7 +59,7 @@ public class CopyRolloutWindowController extends AddRolloutWindowController { protected ProxyRolloutWindow buildEntityFromProxy(final ProxyRollout proxyEntity) { final ProxyRolloutWindow proxyRolloutWindow = new ProxyRolloutWindow(proxyEntity); - proxyRolloutWindow.setName(i18n.getMessage("textfield.rollout.copied.name", proxyRolloutWindow.getName())); + proxyRolloutWindow.setName(getI18n().getMessage("textfield.rollout.copied.name", proxyRolloutWindow.getName())); setTargetFilterId(proxyRolloutWindow); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/controllers/ProxyRolloutValidator.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/controllers/ProxyRolloutValidator.java new file mode 100644 index 000000000..75eeadd8f --- /dev/null +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/controllers/ProxyRolloutValidator.java @@ -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.rollout.window.controllers; + +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.ProxyRolloutWindow; +import org.springframework.util.StringUtils; + +/** + * Validator used in rollout window controllers to validate + * {@link ProxyRolloutWindow}. + */ +public class ProxyRolloutValidator extends EntityValidator { + + /** + * Constructor + * + * @param uiDependencies + * {@link CommonUiDependencies} + */ + public ProxyRolloutValidator(final CommonUiDependencies uiDependencies) { + super(uiDependencies); + } + + boolean isEntityValid(final ProxyRolloutWindow entity, final BooleanSupplier duplicateCheck) { + if (entity == null) { + displayValidationError("message.save.fail", getI18n().getMessage("caption.rollout")); + return false; + } + + if (!StringUtils.hasText(entity.getName())) { + displayValidationError("message.rollout.name.empty"); + return false; + } + + final String trimmedName = StringUtils.trimWhitespace(entity.getName()); + if (duplicateCheck.getAsBoolean()) { + displayValidationError("message.rollout.duplicate.check", trimmedName); + return false; + } + + return true; + } +} diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/controllers/UpdateRolloutWindowController.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/controllers/UpdateRolloutWindowController.java index a10f75820..dc32dd15f 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/controllers/UpdateRolloutWindowController.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/window/controllers/UpdateRolloutWindowController.java @@ -10,56 +10,41 @@ package org.eclipse.hawkbit.ui.rollout.window.controllers; import java.util.List; -import org.eclipse.hawkbit.repository.EntityFactory; import org.eclipse.hawkbit.repository.QuotaManagement; import org.eclipse.hawkbit.repository.RolloutGroupManagement; import org.eclipse.hawkbit.repository.RolloutManagement; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement; import org.eclipse.hawkbit.repository.builder.RolloutUpdate; -import org.eclipse.hawkbit.repository.exception.EntityNotFoundException; -import org.eclipse.hawkbit.repository.exception.EntityReadOnlyException; import org.eclipse.hawkbit.repository.model.Action.ActionType; import org.eclipse.hawkbit.repository.model.RepositoryModelConstants; import org.eclipse.hawkbit.repository.model.Rollout; -import org.eclipse.hawkbit.ui.common.AbstractEntityWindowController; +import org.eclipse.hawkbit.ui.common.AbstractUpdateEntityWindowController; import org.eclipse.hawkbit.ui.common.EntityWindowLayout; import org.eclipse.hawkbit.ui.common.data.mappers.RolloutGroupToAdvancedDefinitionMapper; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyAdvancedRolloutGroup; +import org.eclipse.hawkbit.ui.common.data.proxies.ProxyIdentifiableEntity; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyRollout; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyRolloutWindow; import org.eclipse.hawkbit.ui.common.data.proxies.ProxyRolloutWindow.GroupDefinitionMode; -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.rollout.event.RolloutEvent; import org.eclipse.hawkbit.ui.rollout.window.RolloutWindowDependencies; import org.eclipse.hawkbit.ui.rollout.window.components.AutoStartOptionGroupLayout.AutoStartOption; import org.eclipse.hawkbit.ui.rollout.window.layouts.UpdateRolloutWindowLayout; import org.eclipse.hawkbit.ui.utils.SPDateTimeUtil; -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.vaadin.spring.events.EventBus.UIEventBus; /** * Controller for populating and editing/saving data in Update Rollout Window. */ -public class UpdateRolloutWindowController extends AbstractEntityWindowController { - private static final Logger LOG = LoggerFactory.getLogger(UpdateRolloutWindowController.class); - - protected final VaadinMessageSource i18n; - private final EntityFactory entityFactory; - protected final UIEventBus eventBus; - protected final UINotification uiNotification; +public class UpdateRolloutWindowController + extends AbstractUpdateEntityWindowController { private final TargetFilterQueryManagement targetFilterQueryManagement; protected final RolloutManagement rolloutManagement; private final RolloutGroupManagement rolloutGroupManagement; private final QuotaManagement quotaManagement; - private final UpdateRolloutWindowLayout layout; + private final ProxyRolloutValidator validator; private String nameBeforeEdit; @@ -67,23 +52,20 @@ public class UpdateRolloutWindowController extends AbstractEntityWindowControlle * Constructor for UpdateRolloutWindowController * * @param dependencies - * RolloutWindowDependencies + * RolloutWindowDependencies * @param layout - * UpdateRolloutWindowLayout + * UpdateRolloutWindowLayout */ public UpdateRolloutWindowController(final RolloutWindowDependencies dependencies, final UpdateRolloutWindowLayout layout) { - this.i18n = dependencies.getI18n(); - this.entityFactory = dependencies.getEntityFactory(); - this.eventBus = dependencies.getEventBus(); - this.uiNotification = dependencies.getUiNotification(); + super(dependencies.getuiDependencies()); this.targetFilterQueryManagement = dependencies.getTargetFilterQueryManagement(); this.rolloutManagement = dependencies.getRolloutManagement(); this.rolloutGroupManagement = dependencies.getRolloutGroupManagement(); this.quotaManagement = dependencies.getQuotaManagement(); - this.layout = layout; + this.validator = new ProxyRolloutValidator(dependencies.getuiDependencies()); } @Override @@ -135,49 +117,51 @@ public class UpdateRolloutWindowController extends AbstractEntityWindowControlle } @Override - protected void persistEntity(final ProxyRolloutWindow entity) { - final RolloutUpdate rolloutUpdate = entityFactory.rollout().update(entity.getId()).name(entity.getName()) + protected Rollout persistEntityInRepository(final ProxyRolloutWindow entity) { + final RolloutUpdate rolloutUpdate = getEntityFactory().rollout().update(entity.getId()).name(entity.getName()) .description(entity.getDescription()).set(entity.getDistributionSetId()) .actionType(entity.getActionType()) .forcedTime(entity.getActionType() == ActionType.TIMEFORCED ? entity.getForcedTime() : RepositoryModelConstants.NO_FORCE_TIME) .startAt(entity.getStartAtByOption()); + return rolloutManagement.update(rolloutUpdate); + } - try { - final Rollout updatedRollout = rolloutManagement.update(rolloutUpdate); + @Override + protected void handleEntityPersistFailed(final ProxyRolloutWindow entity, final RuntimeException ex) { + super.handleEntityPersistFailed(entity, ex); - uiNotification.displaySuccess(i18n.getMessage("message.update.success", updatedRollout.getName())); - eventBus.publish(EventTopics.ENTITY_MODIFIED, this, new EntityModifiedEventPayload( - EntityModifiedEventType.ENTITY_UPDATED, ProxyRollout.class, updatedRollout.getId())); - } catch (final EntityNotFoundException | EntityReadOnlyException e) { - LOG.trace("Update of rollout failed in UI: {}", e.getMessage()); - final String entityType = i18n.getMessage("caption.rollout"); - uiNotification - .displayWarning(i18n.getMessage("message.deleted.or.notAllowed", entityType, entity.getName())); + getEventBus().publish(this, RolloutEvent.SHOW_ROLLOUTS); + } - eventBus.publish(this, RolloutEvent.SHOW_ROLLOUTS); - } + @Override + protected String getDisplayableName(final Rollout entity) { + return entity.getName(); + } + + @Override + protected String getDisplayableNameForFailedMessage(final ProxyRolloutWindow entity) { + return entity.getName(); + } + + @Override + protected Long getId(final Rollout entity) { + return entity.getId(); + } + + @Override + protected Class getEntityClass() { + return ProxyRollout.class; } @Override protected boolean isEntityValid(final ProxyRolloutWindow entity) { - if (entity == null) { - uiNotification - .displayValidationError(i18n.getMessage("message.save.fail", i18n.getMessage("caption.rollout"))); - return false; - } - - if (!StringUtils.hasText(entity.getName())) { - uiNotification.displayValidationError(i18n.getMessage("message.rollout.name.empty")); - return false; - } - final String trimmedName = StringUtils.trimWhitespace(entity.getName()); - if (!nameBeforeEdit.equals(trimmedName) && rolloutManagement.getByName(trimmedName).isPresent()) { - uiNotification.displayValidationError(i18n.getMessage("message.rollout.duplicate.check", trimmedName)); - return false; - } + return validator.isEntityValid(entity, + () -> hasNamedChanged(trimmedName) && rolloutManagement.getByName(trimmedName).isPresent()); + } - return true; + private boolean hasNamedChanged(final String trimmedName) { + return !nameBeforeEdit.equals(trimmedName); } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UIComponentIdProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UIComponentIdProvider.java index f473c9dec..1cbaa1487 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UIComponentIdProvider.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/UIComponentIdProvider.java @@ -1504,4 +1504,4 @@ public final class UIComponentIdProvider { private UIComponentIdProvider() { } -} \ No newline at end of file +} diff --git a/pom.xml b/pom.xml index a00383c04..a72eaf4da 100644 --- a/pom.xml +++ b/pom.xml @@ -127,7 +127,11 @@ + 1.8 + + + 2.3.4.RELEASE Hoxton.SR7 2.0.0.RELEASE @@ -162,8 +166,8 @@ 5.0.5 1.11.2 - 2.13.5 - 2.7.6 + 2.13.6 + 2.7.7 1.1.8 25.0-jre 2.2.4 @@ -198,6 +202,7 @@ ${project.basedir}/../hawkbit-test-report/target/jacoco-aggregate/jacoco.xml, ${project.basedir}/../../hawkbit-test-report/target/jacoco-aggregate/jacoco.xml + @@ -372,7 +377,7 @@ - + @@ -407,7 +412,9 @@ false true ${surefire.forkcount} - ${jacoco.agent.ut.arg} + + ${jacoco.agent.ut.arg} + listener @@ -552,7 +559,7 @@ com.vaadin vaadin-server - + org.vaadin.spring.addons @@ -573,7 +580,7 @@ com.vaadin vaadin-spring - + @@ -587,6 +594,7 @@ + com.rabbitmq @@ -642,9 +650,9 @@ javax.validation validation-api - + - + org.springframework.cloud