From ac8fc0603685d6c9b86efb0b06383645329b5811 Mon Sep 17 00:00:00 2001 From: SirWayne Date: Fri, 19 Aug 2016 13:44:49 +0200 Subject: [PATCH] Validate all drag and drop events Signed-off-by: SirWayne --- .../smtable/SoftwareModuleTable.java | 40 +++--- .../table/AbstractNamedVersionTable.java | 28 ++++ .../ui/common/table/AbstractTable.java | 112 +++++++++++++++- .../dstable/DistributionSetTable.java | 96 ++++++-------- .../distributions/smtable/SwModuleTable.java | 36 ++---- .../management/dstable/DistributionTable.java | 69 +++------- .../management/targettable/TargetTable.java | 120 +++++------------- .../targettag/TargetTagFilterButtons.java | 34 +++-- 8 files changed, 273 insertions(+), 262 deletions(-) diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTable.java index 1cfd28718..8233f47ff 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtable/SoftwareModuleTable.java @@ -40,7 +40,6 @@ import org.vaadin.spring.events.annotation.EventBusListenerMethod; import com.vaadin.data.Container; import com.vaadin.data.Item; import com.vaadin.event.dd.DragAndDropEvent; -import com.vaadin.event.dd.DropHandler; import com.vaadin.event.dd.acceptcriteria.AcceptCriterion; import com.vaadin.server.FontAwesome; import com.vaadin.spring.annotation.SpringComponent; @@ -66,7 +65,7 @@ public class SoftwareModuleTable extends AbstractNamedVersionTable getTableVisibleColumns() { final List columnList = super.getTableVisibleColumns(); @@ -215,21 +214,13 @@ public class SoftwareModuleTable extends AbstractNamedVersionTable extends Table { private static final long serialVersionUID = 4856562746502217630L; + protected static final String ACTION_NOT_ALLOWED_MSG = "message.action.not.allowed"; + @Autowired protected transient EventBus.SessionEventBus eventBus; @Autowired protected I18N i18n; + @Autowired + protected UINotification notification; + /** * Initialize the components. */ @@ -359,12 +371,100 @@ public abstract class AbstractTable extends Table { return DEFAULT_COLUMN_NAME_MIN_SIZE; } - /** - * Get drop handler for the table. - * - * @return reference of {@link DropHandler} - */ - protected abstract DropHandler getTableDropHandler(); + private DropHandler getTableDropHandler() { + return new DropHandler() { + private static final long serialVersionUID = 1L; + + @Override + public AcceptCriterion getAcceptCriterion() { + return getDropAcceptCriterion(); + } + + @Override + public void drop(final DragAndDropEvent event) { + if (!isDropValid(event)) { + return; + } + if (event.getTransferable().getSourceComponent() instanceof Table) { + onDropEventFromTable(event); + } else if (event.getTransferable().getSourceComponent() instanceof DragAndDropWrapper) { + onDropEventFromWrapper(event); + } + } + }; + } + + protected Set getDraggedTargetList(final DragAndDropEvent event) { + final com.vaadin.event.dd.TargetDetails taregtDet = event.getTargetDetails(); + final Table targetTable = (Table) taregtDet.getTarget(); + final Set targetSelected = getTableValue(targetTable); + + final AbstractSelectTargetDetails dropData = (AbstractSelectTargetDetails) event.getTargetDetails(); + final Object targetItemId = dropData.getItemIdOver(); + + if (!targetSelected.contains(targetItemId)) { + return Sets.newHashSet((I) targetItemId); + } + + return targetSelected; + } + + private Set getDraggedTargetList(final TableTransferable transferable, final Table source) { + @SuppressWarnings("unchecked") + final AbstractTable table = (AbstractTable) source; + return table.getDeletedEntityByTransferable(transferable); + } + + private boolean validateDropList(final Set droplist) { + if (droplist.isEmpty()) { + final String actionDidNotWork = i18n.get("message.action.did.not.work", new Object[] {}); + notification.displayValidationError(actionDidNotWork); + return false; + } + return true; + } + + protected boolean isDropValid(final DragAndDropEvent dragEvent) { + final Transferable transferable = dragEvent.getTransferable(); + final Component compsource = transferable.getSourceComponent(); + + if (!hasDropPermission()) { + notification.displayValidationError(i18n.get("message.permission.insufficient")); + return false; + } + + if (compsource instanceof Table) { + return validateTable((Table) compsource) + && validateDropList(getDraggedTargetList((TableTransferable) transferable, (Table) compsource)); + } + + if (compsource instanceof DragAndDropWrapper) { + return validateDragAndDropWrapper((DragAndDropWrapper) compsource) + && validateDropList(getDraggedTargetList(dragEvent)); + } + notification.displayValidationError(i18n.get(ACTION_NOT_ALLOWED_MSG)); + return false; + } + + private boolean validateTable(final Table compsource) { + if (!compsource.getId().equals(getDropTableId())) { + notification.displayValidationError(ACTION_NOT_ALLOWED_MSG); + return false; + } + return true; + } + + protected abstract boolean hasDropPermission(); + + protected abstract boolean validateDragAndDropWrapper(final DragAndDropWrapper wrapperSource); + + protected abstract void onDropEventFromWrapper(DragAndDropEvent event); + + protected abstract void onDropEventFromTable(DragAndDropEvent event); + + protected abstract String getDropTableId(); + + protected abstract AcceptCriterion getDropAcceptCriterion(); protected abstract void setDataAvailable(boolean available); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTable.java index fc415f4de..49e2b4e0f 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/distributions/dstable/DistributionSetTable.java @@ -45,7 +45,6 @@ import org.eclipse.hawkbit.ui.utils.SPUIDefinitions; import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions; import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; import org.eclipse.hawkbit.ui.utils.TableColumn; -import org.eclipse.hawkbit.ui.utils.UINotification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -58,7 +57,6 @@ import org.vaadin.spring.events.annotation.EventBusListenerMethod; import com.vaadin.data.Container; import com.vaadin.data.Item; import com.vaadin.event.dd.DragAndDropEvent; -import com.vaadin.event.dd.DropHandler; import com.vaadin.event.dd.acceptcriteria.AcceptCriterion; import com.vaadin.server.FontAwesome; import com.vaadin.spring.annotation.SpringComponent; @@ -97,15 +95,12 @@ public class DistributionSetTable extends AbstractNamedVersionTable source = (AbstractTable) transferable.getSourceComponent(); @@ -232,6 +214,22 @@ public class DistributionSetTable extends AbstractNamedVersionTable softwareModulesIdList, final Item item) { @@ -334,7 +332,8 @@ public class DistributionSetTable extends AbstractNamedVersionTable showMetadataDetails(((DistributionSetIdName) itemId).getId())); + manageMetaDataBtn + .addClickListener(event -> showMetadataDetails(((DistributionSetIdName) itemId).getId())); return manageMetaDataBtn; } }); } - @Override protected List getTableVisibleColumns() { @@ -515,7 +497,7 @@ public class DistributionSetTable extends AbstractNamedVersionTable { private static final long serialVersionUID = -2300392868806614568L; private static final int PROPERTY_DEPT = 3; - private static final String ACTION_NOT_ALLOWED_MSG = "message.action.not.allowed"; @Autowired private transient TargetManagement targetManagement; @@ -110,9 +107,6 @@ public class TargetTable extends AbstractTable { @Autowired private SpPermissionChecker permChecker; - @Autowired - private UINotification notification; - @Autowired private ManagementViewAcceptCriteria managementViewAcceptCriteria; @@ -307,22 +301,8 @@ public class TargetTable extends AbstractTable { } @Override - protected DropHandler getTableDropHandler() { - return new DropHandler() { - private static final long serialVersionUID = 1L; - - @Override - public AcceptCriterion getAcceptCriterion() { - return managementViewAcceptCriteria; - } - - @Override - public void drop(final DragAndDropEvent event) { - if (doValidations(event)) { - doAssignments(event); - } - } - }; + public AcceptCriterion getDropAcceptCriterion() { + return managementViewAcceptCriteria; } private void onTargetDeletedEvent(final List events) { @@ -522,14 +502,16 @@ public class TargetTable extends AbstractTable { setCellStyleGenerator((source, itemId, propertyId) -> null); } - private void doAssignments(final DragAndDropEvent event) { - if (event.getTransferable().getSourceComponent() instanceof Table) { - dsToTargetAssignment(event); - } else if (event.getTransferable().getSourceComponent() instanceof DragAndDropWrapper - && isNoTagAssigned(event)) { + @Override + protected void onDropEventFromTable(final DragAndDropEvent event) { + dsToTargetAssignment(event); + } + + @Override + protected void onDropEventFromWrapper(final DragAndDropEvent event) { + if (isNoTagAssigned(event)) { tagAssignment(event); } - } private Boolean isNoTagAssigned(final DragAndDropEvent event) { @@ -544,17 +526,9 @@ public class TargetTable extends AbstractTable { } private void tagAssignment(final DragAndDropEvent event) { - final com.vaadin.event.dd.TargetDetails taregtDet = event.getTargetDetails(); - final Table targetTable = (Table) taregtDet.getTarget(); - final Set targetSelected = getTableValue(targetTable); - final Set targetList = new HashSet<>(); - final AbstractSelectTargetDetails dropData = (AbstractSelectTargetDetails) event.getTargetDetails(); - final Object targetItemId = dropData.getItemIdOver(); - if (!targetSelected.contains(targetItemId)) { - targetList.add(((TargetIdName) targetItemId).getControllerId()); - } else { - targetList.addAll(targetSelected.stream().map(t -> t.getControllerId()).collect(Collectors.toList())); - } + final List targetList = getDraggedTargetList(event).stream() + .map(targetIdName -> targetIdName.getControllerId()).collect(Collectors.toList()); + final String targTagName = HawkbitCommonUtil.removePrefix(event.getTransferable().getSourceComponent().getId(), SPUIDefinitions.TARGET_TAG_ID_PREFIXS); if (targetList.isEmpty()) { @@ -572,52 +546,9 @@ public class TargetTable extends AbstractTable { } } - /** - * Check Validation on Drop. - * - * @param dragEvent - * as drop event - * @return Boolean as flag - */ - private Boolean doValidations(final DragAndDropEvent dragEvent) { - final Component compsource = dragEvent.getTransferable().getSourceComponent(); - if (compsource instanceof Table) { - return validateTable(compsource, (TableTransferable) dragEvent.getTransferable()); - } else if (compsource instanceof DragAndDropWrapper) { - validateDragAndDropWrapper(compsource); - } else { - notification.displayValidationError(i18n.get(ACTION_NOT_ALLOWED_MSG)); - return false; - } - return true; - } - - private Boolean validateTable(final Component compsource, final TableTransferable transferable) { - final Table source = (Table) compsource; - if (!(source.getId().equals(SPUIComponentIdProvider.DIST_TABLE_ID) - || source.getId().startsWith(SPUIDefinitions.TARGET_TAG_ID_PREFIXS))) { - notification.displayValidationError(i18n.get(ACTION_NOT_ALLOWED_MSG)); - return false; - } else if (!permChecker.hasUpdateTargetPermission()) { - notification.displayValidationError(i18n.get("message.permission.insufficient")); - return false; - } else if (getDraggedDistributionSet(transferable, source).size() > 1) { - notification.displayValidationError(i18n.get("message.onlyone.distribution.assigned")); - return false; - } - return true; - } - - private static Set getDraggedDistributionSet(final TableTransferable transferable, - final Table source) { - @SuppressWarnings("unchecked") - final AbstractTable distTable = (AbstractTable) source; - return distTable.getDeletedEntityByTransferable(transferable); - } - - private Boolean validateDragAndDropWrapper(final Component compsource) { - final DragAndDropWrapper wrapperSource = (DragAndDropWrapper) compsource; - final String tagName = HawkbitCommonUtil.removePrefix(compsource.getId(), + @Override + protected boolean validateDragAndDropWrapper(final DragAndDropWrapper wrapperSource) { + final String tagName = HawkbitCommonUtil.removePrefix(wrapperSource.getId(), SPUIDefinitions.TARGET_TAG_ID_PREFIXS); if (wrapperSource.getId().startsWith(SPUIDefinitions.TARGET_TAG_ID_PREFIXS)) { if ("NO TAG".equals(tagName)) { @@ -628,19 +559,32 @@ public class TargetTable extends AbstractTable { notification.displayValidationError(i18n.get(ACTION_NOT_ALLOWED_MSG)); return false; } + return true; } + @Override + protected String getDropTableId() { + return SPUIComponentIdProvider.DIST_TABLE_ID; + } + + @Override + protected boolean hasDropPermission() { + return permChecker.hasUpdateTargetPermission(); + } + private void dsToTargetAssignment(final DragAndDropEvent event) { final TableTransferable transferable = (TableTransferable) event.getTransferable(); - final Table source = transferable.getSourceComponent(); + final AbstractTable source = (AbstractTable) transferable + .getSourceComponent(); final AbstractSelectTargetDetails dropData = (AbstractSelectTargetDetails) event.getTargetDetails(); final Object targetItemId = dropData.getItemIdOver(); LOG.debug("Adding a log to check if targetItemId is null : {} ", targetItemId); if (targetItemId != null) { final TargetIdName targetId = (TargetIdName) targetItemId; String message = null; - for (final DistributionSetIdName distributionNameId : getDraggedDistributionSet(transferable, source)) { + + for (final DistributionSetIdName distributionNameId : source.getDeletedEntityByTransferable(transferable)) { if (null != distributionNameId) { if (managementUIState.getAssignedList().keySet().contains(targetId) && managementUIState.getAssignedList().get(targetId).equals(distributionNameId)) { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/TargetTagFilterButtons.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/TargetTagFilterButtons.java index 7ecea2f9c..5c004da85 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/TargetTagFilterButtons.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettag/TargetTagFilterButtons.java @@ -41,6 +41,7 @@ import org.vaadin.spring.events.EventScope; import org.vaadin.spring.events.annotation.EventBusListenerMethod; import com.vaadin.data.Item; +import com.vaadin.event.Transferable; import com.vaadin.event.dd.DragAndDropEvent; import com.vaadin.event.dd.DropHandler; import com.vaadin.event.dd.acceptcriteria.AcceptCriterion; @@ -183,18 +184,28 @@ public class TargetTagFilterButtons extends AbstractFilterButtons { * @return Boolean */ private Boolean validate(final DragAndDropEvent event) { - final Component compsource = event.getTransferable().getSourceComponent(); - if (!(compsource instanceof Table)) { - + final Transferable transferable = event.getTransferable(); + final Component compsource = transferable.getSourceComponent(); + if (!(compsource instanceof AbstractTable)) { notification.displayValidationError(i18n.get(SPUILabelDefinitions.ACTION_NOT_ALLOWED)); return false; - } else { - final Table source = ((TableTransferable) event.getTransferable()).getSourceComponent(); - - if (!validateIfSourceisTargetTable(source) && !checkForTargetUpdatePermission()) { - return false; - } } + + final TableTransferable tabletransferable = (TableTransferable) transferable; + + final AbstractTable source = (AbstractTable) tabletransferable.getSourceComponent(); + + if (!validateIfSourceisTargetTable(source) && !checkForTargetUpdatePermission()) { + return false; + } + + final Set deletedEntityByTransferable = source.getDeletedEntityByTransferable(tabletransferable); + if (deletedEntityByTransferable.isEmpty()) { + final String actionDidNotWork = i18n.get("message.action.did.not.work", new Object[] {}); + notification.displayValidationError(actionDidNotWork); + return false; + } + return true; } @@ -222,11 +233,6 @@ public class TargetTagFilterButtons extends AbstractFilterButtons { .getSourceComponent(); final Set targetSelected = targetTable.getDeletedEntityByTransferable(transferable); - if (targetSelected.isEmpty()) { - final String actionDidNotWork = i18n.get("message.action.did.not.work", new Object[] {}); - notification.displayValidationError(actionDidNotWork); - return; - } final Set targetList = targetSelected.stream().map(t -> t.getControllerId()) .collect(Collectors.toSet());