/*
* Copyright (c) 2010-2014 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.wf.impl.processes.itemApproval;
import com.evolveum.midpoint.model.common.expression.ExpressionVariables;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.wf.impl.processes.common.*;
import com.evolveum.midpoint.wf.impl.util.MiscDataUtil;
import com.evolveum.midpoint.wf.impl.util.SingleItemSerializationSafeContainerImpl;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import static com.evolveum.midpoint.wf.impl.processes.common.ActivitiUtil.getRequiredVariable;
import static com.evolveum.midpoint.wf.impl.processes.common.SpringApplicationContextHolder.getPrismContext;
import static com.evolveum.midpoint.wf.impl.processes.common.SpringApplicationContextHolder.getTaskManager;
public class PrepareForTaskCreation implements JavaDelegate {
private static final Trace LOGGER = TraceManager.getTrace(PrepareForTaskCreation.class);
public void execute(DelegateExecution execution) {
PrismContext prismContext = getPrismContext();
OperationResult result = new OperationResult(PrepareForTaskCreation.class.getName() + ".execute");
Task wfTask = ActivitiUtil.getTask(execution, result);
Task opTask = getTaskManager().createTaskInstance();
ApprovalStageDefinitionType stageDef = ActivitiUtil.getAndVerifyCurrentStage(execution, wfTask, true, prismContext);
LightweightObjectRef approverRef = getRequiredVariable(execution, ProcessVariableNames.APPROVER_REF, LightweightObjectRef.class,
prismContext);
String assignee = null;
String candidateGroups = null;
if (approverRef.getType() == null || QNameUtil.match(UserType.COMPLEX_TYPE, approverRef.getType())) {
assignee = MiscDataUtil.refToString(new ObjectReferenceType().oid(approverRef.getOid()).type(UserType.COMPLEX_TYPE));
} else if (QNameUtil.match(RoleType.COMPLEX_TYPE, approverRef.getType()) ||
QNameUtil.match(OrgType.COMPLEX_TYPE, approverRef.getType()) ||
QNameUtil.match(ServiceType.COMPLEX_TYPE, approverRef.getType())) {
candidateGroups = MiscDataUtil.refToString(approverRef.toObjectReferenceType());
} else {
throw new IllegalStateException("Unsupported type of the approver: " + approverRef.getType());
}
// TODO optimize by using setVariablesLocal
execution.setVariableLocal(ProcessVariableNames.ASSIGNEE, assignee);
execution.setVariableLocal(ProcessVariableNames.CANDIDATE_GROUPS, candidateGroups);
List<?> additionalInformation;
if (stageDef.getAdditionalInformation() != null) {
try {
WfExpressionEvaluationHelper evaluator = SpringApplicationContextHolder.getExpressionEvaluationHelper();
ExpressionVariables variables = evaluator.getDefaultVariables(execution, wfTask, result);
additionalInformation = evaluator.evaluateExpression(stageDef.getAdditionalInformation(), variables,
"additional information expression", Object.class, DOMUtil.XSD_STRING, null, opTask, result);
} catch (Throwable t) {
throw new SystemException("Couldn't evaluate additional information expression in " + execution, t);
}
} else {
additionalInformation = new AdditionalInformationGenerator().getDefaultAdditionalInformation(wfTask, stageDef.getNumber());
}
if (additionalInformation != null && !additionalInformation.isEmpty()) {
execution.setVariableLocal(CommonProcessVariableNames.ADDITIONAL_INFORMATION,
new SingleItemSerializationSafeContainerImpl<>(
wrapAdditionalInformationIfNeeded(additionalInformation), prismContext));
}
LOGGER.debug("Creating work item for assignee={}, candidateGroups={}, additionalInformation='{}'",
assignee, candidateGroups, additionalInformation);
}
@SuppressWarnings("unchecked")
private List<InformationType> wrapAdditionalInformationIfNeeded(List<?> data) { // data is not empty
if (data.stream().allMatch(o -> o instanceof String)) {
InformationType info = new InformationType();
for (Object o : data) {
InformationPartType part = new InformationPartType();
part.setText((String) o);
info.getPart().add(part);
}
return Collections.singletonList(info);
} else if (data.stream().allMatch(o -> o instanceof InformationType)) {
return (List<InformationType>) data;
} else {
throw new SystemException("Couldn't create 'additional information' structure from list of "
+ data.stream().map(o -> o != null ? o.getClass().getSimpleName() : null).collect(Collectors.joining(", ", "[", "]")));
}
}
}