From e0a27c21d05895ffb6e0096560710466c2dc1881 Mon Sep 17 00:00:00 2001 From: Katarina Valalikova Date: Fri, 17 Apr 2020 19:51:47 +0200 Subject: [PATCH] fixing MID-6209 + cleanup for task list page --- .../web/page/admin/server/PageTasks.java | 48 +++--- .../web/page/admin/server/TaskTablePanel.java | 145 ++++++++++-------- 2 files changed, 104 insertions(+), 89 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTasks.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTasks.java index 3923803431b..c2e1f0ab21f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTasks.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTasks.java @@ -7,9 +7,26 @@ package com.evolveum.midpoint.web.page.admin.server; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import javax.xml.datatype.XMLGregorianCalendar; +import javax.xml.namespace.QName; + +import org.apache.commons.lang.time.DurationFormatUtils; +import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; +import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.export.AbstractExportableColumn; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.request.mapper.parameter.PageParameters; + import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; -import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -27,25 +44,10 @@ import com.evolveum.midpoint.web.page.admin.PageAdmin; import com.evolveum.midpoint.web.page.admin.server.dto.TaskDtoExecutionStatus; import com.evolveum.midpoint.web.session.UserProfileStorage; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import org.apache.commons.lang.time.DurationFormatUtils; -import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; -import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; -import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; -import org.apache.wicket.extensions.markup.html.repeater.data.table.export.AbstractExportableColumn; -import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.repeater.Item; -import org.apache.wicket.model.IModel; -import org.apache.wicket.model.Model; -import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.util.string.StringValue; - -import javax.xml.datatype.XMLGregorianCalendar; -import javax.xml.namespace.QName; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.List; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskBindingType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskRecurrenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; @PageDescriptor( urls = { @@ -110,7 +112,7 @@ protected List, String>> createColumns() { add(tablePanel); } - private Collection, String>> addCustomColumns(List, String>> columns) { + private void addCustomColumns(List, String>> columns) { columns.add(2, new ObjectReferenceColumn>(createStringResource("pageTasks.task.objectRef"), SelectableBeanImpl.F_VALUE+"."+TaskType.F_OBJECT_REF.getLocalPart()){ private static final long serialVersionUID = 1L; @Override @@ -178,7 +180,6 @@ public IModel getDataModel(IModel> rowModel) { return Model.of(createScheduledToRunAgain(rowModel)); } }); - return columns; } private Collection> createOperationOptions() { @@ -190,10 +191,9 @@ private Collection> createOperationOptions( GetOperationOptionsBuilder getOperationOptionsBuilder = getSchemaHelper().getOperationOptionsBuilder(); getOperationOptionsBuilder = getOperationOptionsBuilder.resolveNames(); - Collection> searchOptions = getOperationOptionsBuilder + return getOperationOptionsBuilder .items(propertiesToGet.toArray(new Object[0])).retrieve() .build(); - return searchOptions; } private Date getCurrentRuntime(IModel> taskModel) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskTablePanel.java index dc24c6bc99c..02e86ac3635 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskTablePanel.java @@ -7,9 +7,29 @@ package com.evolveum.midpoint.web.page.admin.server; +import java.util.*; +import java.util.stream.Collectors; +import javax.xml.datatype.XMLGregorianCalendar; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.behavior.AttributeAppender; +import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; +import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.export.AbstractExportableColumn; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.gui.api.GuiStyleConstants; import com.evolveum.midpoint.gui.api.component.MainObjectListPanel; -import com.evolveum.midpoint.gui.api.model.ReadOnlyModel; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.model.api.ModelPublicConstants; import com.evolveum.midpoint.model.api.TaskService; @@ -31,7 +51,10 @@ import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.application.Url; import com.evolveum.midpoint.web.component.AjaxIconButton; -import com.evolveum.midpoint.web.component.data.column.*; +import com.evolveum.midpoint.web.component.data.column.ColumnMenuAction; +import com.evolveum.midpoint.web.component.data.column.EnumPropertyColumn; +import com.evolveum.midpoint.web.component.data.column.IconColumn; +import com.evolveum.midpoint.web.component.data.column.LinkPanel; import com.evolveum.midpoint.web.component.menu.cog.ButtonInlineMenuItem; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction; @@ -42,27 +65,6 @@ import com.evolveum.midpoint.web.util.OnePageParameterEncoder; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import org.apache.wicket.Component; -import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.behavior.AttributeAppender; -import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; -import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; -import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; -import org.apache.wicket.extensions.markup.html.repeater.data.table.export.AbstractExportableColumn; -import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.markup.html.WebPage; -import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.repeater.Item; -import org.apache.wicket.model.IModel; -import org.apache.wicket.model.Model; -import org.apache.wicket.model.PropertyModel; -import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.jetbrains.annotations.NotNull; - -import javax.xml.datatype.XMLGregorianCalendar; -import java.util.*; -import java.util.stream.Collectors; - @PageDescriptor( urls = { @Url(mountUrl = "/admin/tasks2", matchUrlForSecurity = "/admin/tasks2") @@ -100,7 +102,7 @@ public TaskTablePanel(String id, UserProfileStorage.TableId tableId, Collection< @Override protected void objectDetailsPerformed(AjaxRequestTarget target, TaskType object) { - taskDetailsPerformed(target, object.getOid()); + taskDetailsPerformed(object.getOid()); } @Override @@ -159,10 +161,6 @@ private WebMarkupContainer getFeedbackPanel() { return getPageBase().getFeedbackPanel(); } - private void navigateToNext(Class page, PageParameters parameters) { - getPageBase().navigateToNext(page, parameters); - } - private void synchronizeTasksPerformed(AjaxRequestTarget target) { Task opTask = createSimpleTask(OPERATION_SYNCHRONIZE_TASKS); OperationResult result = opTask.getResult(); @@ -186,10 +184,10 @@ private void synchronizeTasksPerformed(AjaxRequestTarget target) { target.add(getTable()); } - private void taskDetailsPerformed(AjaxRequestTarget target, String oid) { + private void taskDetailsPerformed(String oid) { PageParameters parameters = new PageParameters(); parameters.add(OnePageParameterEncoder.PARAMETER, oid); - navigateToNext(PageTask.class, parameters); + getPageBase().navigateToNext(PageTask.class, parameters); } private List, String>> initTaskColumns() { @@ -227,30 +225,28 @@ protected List, String>> initCustomTaskColumns( columns.add(createTaskExecutionStatusColumn()); - columns.add(createProgressColumn("pageTasks.task.progress")); - columns.add(createErrorsColumn("pageTasks.task.errors")); + columns.add(createProgressColumn()); + columns.add(createErrorsColumn()); columns.add(new IconColumn>(createStringResource("pageTasks.task.status"), TaskType.F_RESULT_STATUS.getLocalPart()) { @Override protected DisplayType getIconDisplayType(final IModel> rowModel) { - String icon = ""; - if (rowModel != null && rowModel.getObject() != null && rowModel.getObject().getValue().getResultStatus() != null) { + String icon; + String title; + + TaskType task = getTask(rowModel, false); + + if (task != null && task.getResultStatus() != null) { icon = OperationResultStatusPresentationProperties - .parseOperationalResultStatus(rowModel.getObject().getValue().getResultStatus()).getIcon() + .parseOperationalResultStatus(task.getResultStatus()).getIcon() + " fa-lg"; + title = createStringResource(task.getResultStatus()).getString(); } else { icon = OperationResultStatusPresentationProperties.UNKNOWN.getIcon() + " fa-lg"; - } - - String title = ""; - TaskType dto = rowModel.getObject().getValue(); - - if (dto != null && dto.getResultStatus() != null) { - title = createStringResource(dto.getResultStatus()).getString(); - } else { title = createStringResource(OperationResultStatusType.UNKNOWN).getString(); } + return WebComponentUtil.createDisplayType(icon, "", title); } }); @@ -269,8 +265,8 @@ protected String translate(Enum en) { }; } - private AbstractExportableColumn, String> createProgressColumn(String titleKey) { - return new AbstractExportableColumn, String>(createStringResource(titleKey)) { + private AbstractExportableColumn, String> createProgressColumn() { + return new AbstractExportableColumn, String>(createStringResource("pageTasks.task.progress")) { @Override public void populateItem(Item>> cellItem, String componentId, final IModel> rowModel) { @@ -284,7 +280,7 @@ public void populateItem(Item>> cellItem public void onClick(AjaxRequestTarget target) { PageParameters pageParams = new PageParameters(); pageParams.add(OnePageParameterEncoder.PARAMETER, rowModel.getObject().getValue().getOid()); - navigateToNext(PageTask.class, pageParams); + getPageBase().navigateToNext(PageTask.class, pageParams); } }); } @@ -298,8 +294,8 @@ public IModel getDataModel(IModel> rowModel) { }; } - private AbstractColumn, String> createErrorsColumn(String titleKey) { - return new AbstractColumn, String>(createStringResource(titleKey)) { + private AbstractColumn, String> createErrorsColumn() { + return new AbstractColumn, String>(createStringResource("pageTasks.task.errors")) { @Override public void populateItem(Item>> cellItem, String componentId, IModel> rowModel) { TaskType task = rowModel.getObject().getValue(); @@ -701,7 +697,7 @@ private void suspendTasksPerformed(AjaxRequestTarget target, IModel plainTasks = selectedTasks.stream().filter(dto -> !isManageableTreeRoot(dto)).collect(Collectors.toList()); - List trees = selectedTasks.stream().filter(dto -> isManageableTreeRoot(dto)).collect(Collectors.toList()); + List trees = selectedTasks.stream().filter(TaskTablePanel::isManageableTreeRoot).collect(Collectors.toList()); boolean suspendedPlain = suspendPlainTasks(plainTasks, result, opTask); boolean suspendedTrees = suspendTrees(trees, result, opTask); result.computeStatus(); @@ -730,7 +726,7 @@ private void resumeTasksPerformed(AjaxRequestTarget target, IModel plainTasks = selectedTasks.stream().filter(dto -> !isManageableTreeRoot(dto)).collect(Collectors.toList()); - List trees = selectedTasks.stream().filter(dto -> isManageableTreeRoot(dto)).collect(Collectors.toList()); + List trees = selectedTasks.stream().filter(TaskTablePanel::isManageableTreeRoot).collect(Collectors.toList()); getTaskService().resumeTasks(getOids(plainTasks), opTask, result); for (TaskType tree : trees) { getTaskService().resumeTaskTree(tree.getOid(), opTask, result); @@ -780,7 +776,6 @@ private List getSelectedTasks(AjaxRequestTarget target, IModel getTaskConfirmationMessageModel(ColumnMenuAction action, String actionName) { - if (action.getRowModel() == null) { - return createStringResource("pageTasks.message.confirmationMessageForMultipleTaskObject", actionName, getSelectedObjects().size()); -// WebComponentUtil.getSelectedData(()).size()); - } else { - String objectName = ((SelectableBean) (action.getRowModel().getObject())).getValue().getName().getOrig(); + private IModel getTaskConfirmationMessageModel(ColumnMenuAction> action, String actionName) { + if (action.getRowModel() != null) { + String objectName = WebComponentUtil.getName(getTask(action.getRowModel(), false)); return createStringResource("pageTasks.message.confirmationMessageForSingleTaskObject", actionName, objectName); } + if (CollectionUtils.isEmpty(getSelectedObjects())) { + getSession().warn(getString("pageTasks.message.confirmationMessageForNoTaskObject", actionName)); + return null; //confirmation popup should not be shown + } + + return createStringResource("pageTasks.message.confirmationMessageForMultipleTaskObject", actionName, getSelectedObjects().size()); } // must be static, otherwise JVM crashes (probably because of some wicket serialization issues) + @SuppressWarnings("unchecked") private static boolean isCoordinator(IModel rowModel, boolean isHeader) { - SelectableBean dto = getDto(rowModel, isHeader); - return dto != null && TaskTypeUtil.isCoordinator(dto.getValue()); + if (isNotTaskModel(rowModel)) { + return false; + } + TaskType task = getTask((IModel>) rowModel, isHeader); + return task != null && TaskTypeUtil.isCoordinator(task); } // must be static, otherwise JVM crashes (probably because of some wicket serialization issues) + @SuppressWarnings("unchecked") private static boolean isManageableTreeRoot(IModel rowModel, boolean isHeader) { - SelectableBean dto = getDto(rowModel, isHeader); - return dto != null && isManageableTreeRoot(dto.getValue()); + if (isNotTaskModel(rowModel)) { + return false; + } + TaskType task = getTask((IModel>) rowModel, isHeader); + return task != null && isManageableTreeRoot(task); + } + + private static boolean isNotTaskModel(IModel rowModel) { + if (rowModel == null) { + return false; + } + return rowModel.getObject() instanceof SelectableBean; } private static boolean isManageableTreeRoot(TaskType taskType) { return TaskTypeUtil.isCoordinator(taskType) || TaskTypeUtil.isPartitionedMaster(taskType); } - private static SelectableBean getDto(IModel rowModel, boolean isHeader) { + private static TaskType getTask(IModel> rowModel, boolean isHeader) { if (rowModel != null && !isHeader) { - Object object = rowModel.getObject(); - if (object instanceof SelectableBean) { - return (SelectableBean) object; + SelectableBean object = rowModel.getObject(); + if (object == null) { + return null; } + + return object.getValue(); } return null; }