/* * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.evolveum.midpoint.web.page.admin.server; import com.evolveum.midpoint.gui.api.GuiStyleConstants; import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.util.WfContextUtil; import com.evolveum.midpoint.task.api.TaskExecutionStatus; import com.evolveum.midpoint.web.component.DateLabelComponent; import com.evolveum.midpoint.web.component.ObjectSummaryPanel; import com.evolveum.midpoint.web.component.refresh.AutoRefreshDto; import com.evolveum.midpoint.web.component.refresh.AutoRefreshPanel; import com.evolveum.midpoint.web.component.util.SummaryTagSimple; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.model.ContainerableFromPrismObjectModel; import com.evolveum.midpoint.web.page.admin.server.dto.ApprovalOutcomeIcon; import com.evolveum.midpoint.web.page.admin.server.dto.OperationResultStatusPresentationProperties; import com.evolveum.midpoint.web.page.admin.server.dto.TaskDto; import com.evolveum.midpoint.web.page.admin.server.dto.TaskDtoExecutionStatus; import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; import org.apache.commons.lang3.time.DurationFormatUtils; import org.apache.wicket.datetime.PatternDateConverter; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import java.util.Date; /** * @author mederly * */ public class TaskSummaryPanel extends ObjectSummaryPanel<TaskType> { private static final long serialVersionUID = -5077637168906420769L; private static final String ID_TAG_EXECUTION_STATUS = "summaryTagExecutionStatus"; private static final String ID_TAG_RESULT = "summaryTagResult"; private static final String ID_TAG_WF_OUTCOME = "wfOutcomeTag"; private static final String ID_TAG_EMPTY = "emptyTag"; private static final String ID_TAG_REFRESH = "refreshTag"; private PageTaskEdit parentPage; public TaskSummaryPanel(String id, IModel<PrismObject<TaskType>> model, IModel<AutoRefreshDto> refreshModel, final PageTaskEdit parentPage) { super(id, model); this.parentPage = parentPage; IModel<TaskType> containerModel = new ContainerableFromPrismObjectModel<>(model); SummaryTagSimple<TaskType> tagExecutionStatus = new SummaryTagSimple<TaskType>(ID_TAG_EXECUTION_STATUS, containerModel) { @Override protected void initialize(TaskType taskType) { TaskDtoExecutionStatus status = TaskDtoExecutionStatus.fromTaskExecutionStatus(taskType.getExecutionStatus(), taskType.getNodeAsObserved() != null); String icon = getIconForExecutionStatus(status); setIconCssClass(icon); if (status != null) { setLabel(PageBase.createStringResourceStatic(TaskSummaryPanel.this, status).getString()); } // TODO setColor } }; addTag(tagExecutionStatus); SummaryTagSimple<TaskType> tagResult = new SummaryTagSimple<TaskType>(ID_TAG_RESULT, containerModel) { @Override protected void initialize(TaskType taskType) { OperationResultStatusType resultStatus = taskType.getResultStatus(); String icon = OperationResultStatusPresentationProperties.parseOperationalResultStatus(resultStatus).getIcon(); setIconCssClass(icon); if (resultStatus != null) { setLabel(PageBase.createStringResourceStatic(TaskSummaryPanel.this, resultStatus).getString()); } // TODO setColor } }; addTag(tagResult); SummaryTagSimple<TaskType> tagOutcome = new SummaryTagSimple<TaskType>(ID_TAG_WF_OUTCOME, containerModel) { @Override protected void initialize(TaskType taskType) { String icon, name; if (parentPage.getTaskDto().getWorkflowOutcome() == null) { // shouldn't occur! return; } if (parentPage.getTaskDto().getWorkflowOutcome()) { icon = ApprovalOutcomeIcon.APPROVED.getIcon(); name = "approved"; } else { icon = ApprovalOutcomeIcon.REJECTED.getIcon(); name = "rejected"; } setIconCssClass(icon); setLabel(PageBase.createStringResourceStatic(TaskSummaryPanel.this, "TaskSummaryPanel." + name).getString()); } }; tagOutcome.add(new VisibleEnableBehaviour() { @Override public boolean isVisible() { return parentPage.getTaskDto().getWorkflowOutcome() != null; } }); addTag(tagOutcome); final AutoRefreshPanel refreshTag = new AutoRefreshPanel(ID_TAG_REFRESH, refreshModel, parentPage, true); refreshTag.setOutputMarkupId(true); refreshTag.add(new VisibleEnableBehaviour() { @Override public boolean isVisible() { return parentPage.getTaskDto().getWorkflowOutcome() == null; // because otherwise there are too many tags to fit into window } } ); addTag(refreshTag); } private String getIconForExecutionStatus(TaskDtoExecutionStatus status) { if (status == null) { return "fa fa-fw fa-question-circle text-warning"; } switch (status) { case RUNNING: return "fa fa-fw fa-spinner"; case RUNNABLE: return "fa fa-fw fa-hand-o-up"; case SUSPENDED: return "fa fa-fw fa-bed"; case SUSPENDING: return "fa fa-fw fa-bed"; case WAITING: return "fa fa-fw fa-clock-o"; case CLOSED: return "fa fa-fw fa-power-off"; default: return ""; } } @Override protected String getIconCssClass() { return GuiStyleConstants.CLASS_OBJECT_TASK_ICON; } @Override protected String getIconBoxAdditionalCssClass() { // TODO return "summary-panel-task"; } @Override protected String getBoxAdditionalCssClass() { // TODO return "summary-panel-task"; } @Override protected boolean isIdentifierVisible() { return false; } @Override protected String getTagBoxCssClass() { return "summary-tag-box-wide"; } private String getStageInfo() { return WfContextUtil.getStageInfo(parentPage.getTaskDto().getWorkflowContext()); } public String getRequestedOn() { return WebComponentUtil.getLocalizedDate(parentPage.getTaskDto().getRequestedOn(), DateLabelComponent.MEDIUM_MEDIUM_STYLE); } @Override protected IModel<String> getTitleModel() { return new AbstractReadOnlyModel<String>() { @Override public String getObject() { TaskDto taskDto = parentPage.getTaskDto(); if (taskDto.isWorkflow()) { return getString("TaskSummaryPanel.requestedBy", parentPage.getTaskDto().getRequestedBy()); // return getString("TaskSummaryPanel.requestedByAndOn", // parentPage.getTaskDto().getRequestedBy(), getRequestedOn()); } else { TaskType taskType = getModelObject(); String rv; if (taskType.getExpectedTotal() != null) { rv = createStringResource("TaskSummaryPanel.progressWithTotalKnown", taskType.getProgress(), taskType.getExpectedTotal()) .getString(); } else { rv = createStringResource("TaskSummaryPanel.progressWithTotalUnknown", taskType.getProgress()).getString(); } if (taskDto.isSuspended()) { rv += " " + getString("TaskSummaryPanel.progressIfSuspended"); } else if (taskDto.isClosed()) { rv += " " + getString("TaskSummaryPanel.progressIfClosed"); } else if (taskDto.isWaiting()) { rv += " " + getString("TaskSummaryPanel.progressIfWaiting"); } else if (taskDto.getStalledSince() != null) { rv += " " + getString("TaskSummaryPanel.progressIfStalled", WebComponentUtil.formatDate(new Date(parentPage.getTaskDto().getStalledSince()))); } return rv; } } }; } @Override protected IModel<String> getTitle2Model() { return new AbstractReadOnlyModel<String>() { @Override public String getObject() { if (parentPage.getTaskDto().isWorkflow()) { return getString("TaskSummaryPanel.requestedOn", getRequestedOn()); } else { TaskType taskType = getModelObject(); if (taskType.getOperationStats() != null && taskType.getOperationStats().getIterativeTaskInformation() != null && taskType.getOperationStats().getIterativeTaskInformation().getLastSuccessObjectName() != null) { return createStringResource("TaskSummaryPanel.lastProcessed", taskType.getOperationStats().getIterativeTaskInformation().getLastSuccessObjectName()).getString(); } else { return ""; } } } }; } @Override protected IModel<String> getTitle3Model() { return new AbstractReadOnlyModel<String>() { @Override public String getObject() { if (parentPage.getTaskDto().isWorkflow()) { String stageInfo = getStageInfo(); if (stageInfo != null) { return getString("TaskSummaryPanel.stage", stageInfo); } else { return null; } } TaskType taskType = getModel().getObject(); if (taskType == null) { return null; } long started = XmlTypeConverter.toMillis(taskType.getLastRunStartTimestamp()); long finished = XmlTypeConverter.toMillis(taskType.getLastRunFinishTimestamp()); if (started == 0) { return null; } if ((TaskExecutionStatus.RUNNABLE.equals(taskType.getExecutionStatus()) && taskType.getNodeAsObserved() != null) || finished == 0 || finished < started) { PatternDateConverter pdc = new PatternDateConverter (WebComponentUtil.getLocalizedDatePattern(DateLabelComponent.SHORT_MEDIUM_STYLE), true ); String date = pdc.convertToString(new Date(started), WebComponentUtil.getCurrentLocale()); return getString("TaskStatePanel.message.executionTime.notFinished", date, DurationFormatUtils.formatDurationHMS(System.currentTimeMillis() - started)); } else { PatternDateConverter pdc = new PatternDateConverter (WebComponentUtil.getLocalizedDatePattern(DateLabelComponent.SHORT_MEDIUM_STYLE), true ); String startedDate = pdc.convertToString(new Date(started), WebComponentUtil.getCurrentLocale()); String finishedDate = pdc.convertToString(new Date(finished), WebComponentUtil.getCurrentLocale()); return getString("TaskStatePanel.message.executionTime.finished", startedDate, finishedDate, DurationFormatUtils.formatDurationHMS(finished - started)); } } }; } public AutoRefreshPanel getRefreshPanel() { return (AutoRefreshPanel) getTag(ID_TAG_REFRESH); } }