/*
* Copyright (c) 2010-2015 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.certification.dto;
import com.evolveum.midpoint.certification.api.OutcomeUtils;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.CertCampaignTypeUtil;
import com.evolveum.midpoint.schema.util.WorkItemTypeUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
/**
* DTO for displaying cases as part of certification campaign information.
* Aggregates more decisions.
*
* TODO cleanup a bit
*
* @author mederly
*/
public class CertCaseDto extends CertCaseOrWorkItemDto {
public static final String F_REMEDIED_AT = "remediedAt";
public static final String F_CURRENT_REVIEWERS = "currentReviewers";
public static final String F_REVIEWED_AT = "reviewedAt";
public static final String F_REVIEWED_BY = "reviewedBy";
public static final String F_COMMENTS = "comments";
public static final String F_CURRENT_RESPONSE_STAGE_NUMBER = "currentResponseStageNumber";
private final List<String> currentReviewers = new ArrayList<>();
private final List<String> reviewedBy = new ArrayList<>();
private final List<String> comments = new ArrayList<>();
private final String noReviewersLabel;
CertCaseDto(AccessCertificationCaseType _case, PageBase page, Task task, OperationResult result) {
super(_case, page);
Map<String, String> names = new HashMap<>();
for (AccessCertificationWorkItemType workItem : _case.getWorkItem()) {
if (StringUtils.isNotEmpty(WorkItemTypeUtil.getComment(workItem))) {
comments.add(WorkItemTypeUtil.getComment(workItem));
}
if (hasResponse(workItem) && workItem.getPerformerRef() != null) {
reviewedBy.add(getName(workItem.getPerformerRef(), page, names, task, result));
}
for (ObjectReferenceType assigneeRef : workItem.getAssigneeRef()) {
if (workItem.getCloseTimestamp() == null
&& java.util.Objects.equals(workItem.getStageNumber(), _case.getStageNumber())) {
currentReviewers.add(getName(assigneeRef, page, names, task, result));
}
}
}
noReviewersLabel = page.getString("PageCertCampaign.noReviewers");
}
private String getName(ObjectReferenceType ref, PageBase page,
Map<String, String> names, Task task, OperationResult result) {
if (ref == null || ref.getOid() == null) {
return null; // shouldn't occur
}
return names.computeIfAbsent(ref.getOid(), oid -> {
PrismObject<UserType> reviewerObject = WebModelServiceUtils.resolveReferenceRaw(ref, page, task, result);
return reviewerObject != null ? WebComponentUtil.getName(reviewerObject) : ref.getOid();
});
}
private boolean hasResponse(AccessCertificationWorkItemType workItem) {
return workItem.getOutput() != null && (workItem.getOutput().getOutcome() != null || !StringUtils.isEmpty(workItem.getOutput().getComment()));
}
@SuppressWarnings("unused")
public String getCurrentReviewers() {
if (currentReviewers.isEmpty()) {
return noReviewersLabel;
} else {
return StringUtils.join(currentReviewers, ", ");
}
}
public String getReviewedBy() {
return StringUtils.join(reviewedBy, ", ");
}
public String getComments() {
return StringUtils.join(comments, "; ");
}
public String getRemediedAt() {
return WebComponentUtil.formatDate(getCertCase().getRemediedTimestamp());
}
public String getReviewedAt() {
return WebComponentUtil.formatDate(getReviewedTimestamp(getCertCase()));
}
private Date getReviewedTimestamp(AccessCertificationCaseType certCase) {
return CertCampaignTypeUtil.getReviewedTimestamp(certCase.getWorkItem());
}
public AccessCertificationResponseType getOverallOutcome() {
return OutcomeUtils.fromUri(getCertCase().getOutcome());
}
@SuppressWarnings("unused")
public Integer getCurrentResponseStageNumber() {
return getCertCase().getStageNumber();
}
}