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 1ff15955a20..ab16a4fd84e 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 @@ -186,6 +186,7 @@ private Collection> createOperationOptions( propertiesToGet.add(TaskType.F_NODE_AS_OBSERVED); propertiesToGet.add(TaskType.F_NEXT_RUN_START_TIMESTAMP); propertiesToGet.add(TaskType.F_NEXT_RETRY_TIMESTAMP); + propertiesToGet.add(TaskType.F_SUBTASK); GetOperationOptionsBuilder getOperationOptionsBuilder = getSchemaHelper().getOperationOptionsBuilder(); getOperationOptionsBuilder = getOperationOptionsBuilder.resolveNames(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskOperationStatisticsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskOperationStatisticsPanel.java index f9998829cf0..974cfaa0044 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskOperationStatisticsPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/TaskOperationStatisticsPanel.java @@ -37,6 +37,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.stream.Stream; public class TaskOperationStatisticsPanel extends BasePanel> implements TaskTabPanel { @@ -69,29 +70,39 @@ private LoadableModel createOperationStatsModel() { protected OperationStatsType load() { PrismObject task = getModelObject().getObject(); - IterativeTaskInformationType iterativeTaskInformation = new IterativeTaskInformationType(); - SynchronizationInformationType synchronizationInformation = new SynchronizationInformationType(); - ActionsExecutedInformationType actionsExecutedInformation = new ActionsExecutedInformationType(); - - if (TaskTypeUtil.isPartitionedMaster(task.asObjectable())) { - List subTasks = resolveSubTasks(); - for (TaskType taskDto : subTasks) { - OperationStatsType operationStats = taskDto.getOperationStats(); - if (operationStats != null) { - IterativeTaskInformation.addTo(iterativeTaskInformation, operationStats.getIterativeTaskInformation(), true); - SynchronizationInformation.addTo(synchronizationInformation, operationStats.getSynchronizationInformation()); - ActionsExecutedInformation.addTo(actionsExecutedInformation, operationStats.getActionsExecutedInformation()); - } - } - - return new OperationStatsType(getPrismContext()) - .iterativeTaskInformation(iterativeTaskInformation) - .synchronizationInformation(synchronizationInformation) - .actionsExecutedInformation(actionsExecutedInformation); - - } - - return task.asObjectable().getOperationStats(); + return TaskTypeUtil.getAggregatedOperationStats(task.asObjectable(), getPrismContext()); +// IterativeTaskInformationType iterativeTaskInformation = new IterativeTaskInformationType(); +// SynchronizationInformationType synchronizationInformation = new SynchronizationInformationType(); +// ActionsExecutedInformationType actionsExecutedInformation = new ActionsExecutedInformationType(); +// +// if (TaskTypeUtil.isPartitionedMaster(task.asObjectable())) { +//// List subTasks = resolveSubTasks(); +// Stream subTasks = TaskTypeUtil.getAllTasksStream(task.asObjectable()); +// subTasks.forEach(subTask -> { +// OperationStatsType operationStatsType = subTask.getOperationStats(); +// if (operationStatsType != null) { +// IterativeTaskInformation.addTo(iterativeTaskInformation, operationStatsType.getIterativeTaskInformation(), true); +// SynchronizationInformation.addTo(synchronizationInformation, operationStatsType.getSynchronizationInformation()); +// ActionsExecutedInformation.addTo(actionsExecutedInformation, operationStatsType.getActionsExecutedInformation()); +// } +// }); +//// for (TaskType taskDto : subTasks) { +//// OperationStatsType operationStats = taskDto.getOperationStats(); +//// if (operationStats != null) { +//// IterativeTaskInformation.addTo(iterativeTaskInformation, operationStats.getIterativeTaskInformation(), true); +//// SynchronizationInformation.addTo(synchronizationInformation, operationStats.getSynchronizationInformation()); +//// ActionsExecutedInformation.addTo(actionsExecutedInformation, operationStats.getActionsExecutedInformation()); +//// } +//// } +// +// return new OperationStatsType(getPrismContext()) +// .iterativeTaskInformation(iterativeTaskInformation) +// .synchronizationInformation(synchronizationInformation) +// .actionsExecutedInformation(actionsExecutedInformation); +// +// } +// +// return task.asObjectable().getOperationStats(); } }; 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 1c61d996ac4..067327d2ec2 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 @@ -46,6 +46,7 @@ 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; @@ -227,6 +228,7 @@ protected List, String>> initCustomTaskColumns( columns.add(createTaskExecutionStatusColumn()); columns.add(createProgressColumn("pageTasks.task.progress")); + columns.add(createErrorsColumn("pageTasks.task.errors")); columns.add(new IconColumn>(createStringResource("pageTasks.task.status"), TaskType.F_RESULT_STATUS.getLocalPart()) { @@ -296,6 +298,17 @@ public IModel getDataModel(IModel> rowModel) { }; } + private AbstractColumn, String> createErrorsColumn(String titleKey) { + return new AbstractColumn, String>(createStringResource(titleKey)) { + @Override + public void populateItem(Item>> cellItem, String componentId, IModel> rowModel) { + TaskType task = rowModel.getObject().getValue(); + cellItem.add(new Label(componentId, new Model<>(TaskTypeUtil.getObjectsProcessedFailures(task, getPrismContext())))); + + } + }; + } + private String getProgressDescription(SelectableBean task) { Long stalledSince = getStalledSince(task.getValue()); if (stalledSince != null) { @@ -415,7 +428,7 @@ public IModel getVisible() { if (rowModel == null){ return Model.of(Boolean.TRUE); } - SelectableBean rowModelObj = (SelectableBean)rowModel.getObject(); + SelectableBean rowModelObj = rowModel.getObject(); boolean visible = WebComponentUtil.canSuspendTask(rowModelObj.getValue(), TaskTablePanel.this.getPageBase()); return Model.of(visible); } @@ -452,7 +465,7 @@ public IModel getVisible() { if (rowModel == null){ return Model.of(Boolean.TRUE); } - SelectableBean rowModelObj = (SelectableBean)rowModel.getObject(); + SelectableBean rowModelObj = rowModel.getObject(); boolean visible = WebComponentUtil.canResumeTask(rowModelObj.getValue(), TaskTablePanel.this.getPageBase()); return Model.of(visible); } @@ -490,7 +503,7 @@ public IModel getVisible() { if (rowModel == null){ return Model.of(Boolean.TRUE); } - SelectableBean rowModelObj = (SelectableBean)rowModel.getObject(); + SelectableBean rowModelObj = rowModel.getObject(); return Model.of(WebComponentUtil.canRunNowTask(rowModelObj.getValue(), TaskTablePanel.this.getPageBase())); } @@ -664,7 +677,7 @@ public IModel getVisible() { if (rowModel == null){ return Model.of(Boolean.TRUE); } - SelectableBean rowModelObj = (SelectableBean)rowModel.getObject(); + SelectableBean rowModelObj = rowModel.getObject(); return Model.of(WebComponentUtil.canSuspendTask(rowModelObj.getValue(), TaskTablePanel.this.getPageBase())); } @@ -843,12 +856,8 @@ private void deleteTaskConfirmedPerformed(AjaxRequestTarget target, IModel> task) { diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/TaskTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/TaskTypeUtil.java index 9f475446d73..43c5ab206ae 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/TaskTypeUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/TaskTypeUtil.java @@ -1,80 +1,120 @@ -/* - * Copyright (c) 2010-2018 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ - -package com.evolveum.midpoint.schema.util; - -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - -import org.jetbrains.annotations.NotNull; - -import java.util.*; -import java.util.stream.Stream; - -/** - * @author mederly - */ -public class TaskTypeUtil { - - /** - * Returns a stream of the task and all of its subtasks. - */ - @NotNull - public static Stream getAllTasksStream(TaskType root) { - return Stream.concat(Stream.of(root), - getResolvedSubtasks(root).stream().flatMap(TaskTypeUtil::getAllTasksStream)); - } - - public static List getResolvedSubtasks(TaskType parent) { - List rv = new ArrayList<>(); - for (ObjectReferenceType childRef : parent.getSubtaskRef()) { - //noinspection unchecked - PrismObject child = childRef.getObject(); - if (child != null) { - rv.add(child.asObjectable()); - } else { - throw new IllegalStateException("Unresolved subtaskRef in " + parent + ": " + childRef); - } - } - return rv; - } - - public static void addSubtask(TaskType parent, TaskType child, PrismContext prismContext) { - parent.getSubtaskRef().add(ObjectTypeUtil.createObjectRefWithFullObject(child, prismContext)); - } - - //moved from GUI - public static boolean isCoordinator(TaskType task) { - return getKind(task) == TaskKindType.COORDINATOR; - } - - public static boolean isPartitionedMaster(TaskType task) { - return getKind(task) == TaskKindType.PARTITIONED_MASTER; - } - - @NotNull - public static TaskKindType getKind(TaskType task) { - if (task.getWorkManagement() != null && task.getWorkManagement().getTaskKind() != null) { - return task.getWorkManagement().getTaskKind(); - } else { - return TaskKindType.STANDALONE; - } - } - - public static int getObjectsProcessed(TaskType task) { - OperationStatsType stats = task.getOperationStats(); - if (stats == null) { - return 0; - } - IterativeTaskInformationType iterativeStats = stats.getIterativeTaskInformation(); - if (iterativeStats == null) { - return 0; - } - return iterativeStats.getTotalSuccessCount() + iterativeStats.getTotalFailureCount(); - } -} +/* + * Copyright (c) 2010-2018 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ + +package com.evolveum.midpoint.schema.util; + +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.schema.statistics.ActionsExecutedInformation; +import com.evolveum.midpoint.schema.statistics.IterativeTaskInformation; +import com.evolveum.midpoint.schema.statistics.SynchronizationInformation; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; + +import org.jetbrains.annotations.NotNull; + +import java.util.*; +import java.util.stream.Stream; + +/** + * @author mederly + */ +public class TaskTypeUtil { + + /** + * Returns a stream of the task and all of its subtasks. + */ + @NotNull + public static Stream getAllTasksStream(TaskType root) { + return Stream.concat(Stream.of(root), + getResolvedSubtasks(root).stream().flatMap(TaskTypeUtil::getAllTasksStream)); + } + + public static List getResolvedSubtasks(TaskType parent) { + List rv = new ArrayList<>(); + for (ObjectReferenceType childRef : parent.getSubtaskRef()) { + //noinspection unchecked + PrismObject child = childRef.getObject(); + if (child != null) { + rv.add(child.asObjectable()); + } else { + throw new IllegalStateException("Unresolved subtaskRef in " + parent + ": " + childRef); + } + } + return rv; + } + + public static void addSubtask(TaskType parent, TaskType child, PrismContext prismContext) { + parent.getSubtaskRef().add(ObjectTypeUtil.createObjectRefWithFullObject(child, prismContext)); + } + + //moved from GUI + public static boolean isCoordinator(TaskType task) { + return getKind(task) == TaskKindType.COORDINATOR; + } + + public static boolean isPartitionedMaster(TaskType task) { + return getKind(task) == TaskKindType.PARTITIONED_MASTER; + } + + @NotNull + public static TaskKindType getKind(TaskType task) { + if (task.getWorkManagement() != null && task.getWorkManagement().getTaskKind() != null) { + return task.getWorkManagement().getTaskKind(); + } else { + return TaskKindType.STANDALONE; + } + } + + public static int getObjectsProcessed(TaskType task) { + OperationStatsType stats = task.getOperationStats(); + if (stats == null) { + return 0; + } + IterativeTaskInformationType iterativeStats = stats.getIterativeTaskInformation(); + if (iterativeStats == null) { + return 0; + } + return iterativeStats.getTotalSuccessCount() + iterativeStats.getTotalFailureCount(); + } + + public static int getObjectsProcessedFailures(TaskType task, PrismContext prismContext) { + OperationStatsType stats = getAggregatedOperationStats(task, prismContext); + if (stats == null) { + return 0; + } + IterativeTaskInformationType iterativeStats = stats.getIterativeTaskInformation(); + if (iterativeStats == null) { + return 0; + } + return iterativeStats.getTotalFailureCount(); + } + + public static OperationStatsType getAggregatedOperationStats(TaskType task, PrismContext prismContext) { + if (!isPartitionedMaster(task)) { + return task.getOperationStats(); + } + + IterativeTaskInformationType iterativeTaskInformation = new IterativeTaskInformationType(); + SynchronizationInformationType synchronizationInformation = new SynchronizationInformationType(); + ActionsExecutedInformationType actionsExecutedInformation = new ActionsExecutedInformationType(); + + Stream subTasks = TaskTypeUtil.getAllTasksStream(task); + subTasks.forEach(subTask -> { + OperationStatsType operationStatsType = subTask.getOperationStats(); + if (operationStatsType != null) { + IterativeTaskInformation.addTo(iterativeTaskInformation, operationStatsType.getIterativeTaskInformation(), true); + SynchronizationInformation.addTo(synchronizationInformation, operationStatsType.getSynchronizationInformation()); + ActionsExecutedInformation.addTo(actionsExecutedInformation, operationStatsType.getActionsExecutedInformation()); + } + }); + + return new OperationStatsType(prismContext) + .iterativeTaskInformation(iterativeTaskInformation) + .synchronizationInformation(synchronizationInformation) + .actionsExecutedInformation(actionsExecutedInformation); + } +}