/*
* Copyright (c) 2010-2013 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.common;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.pvm.runtime.ExecutionImpl;
import org.activiti.engine.runtime.Execution;
import org.apache.commons.collections4.CollectionUtils;
import java.util.*;
/**
* @author mederly
*/
public class DumpVariables implements JavaDelegate {
private static final Trace LOGGER = TraceManager.getTrace(DumpVariables.class);
public void execute(DelegateExecution execution) {
if (LOGGER.isTraceEnabled()) {
RuntimeService runtimeService = execution.getEngineServices().getRuntimeService();
Set<String> variablesSeen = new HashSet<>();
LOGGER.trace("--------------------------------- DumpVariables: " + execution.getCurrentActivityId());
// LOGGER.trace("All variables for execution id={}, parent id={}", execution.getId(), execution.getParentId());
// execution.getVariableInstances().forEach((n, v) -> LOGGER.trace(" - {} = {} (in {})", n, v.getValue(), v.getExecutionId()));
LOGGER.trace("Execution hierarchy for id={}", execution.getId());
LOGGER.trace("------------------------------------");
dumpExecutionVariables(execution.getId(), execution, null, variablesSeen, runtimeService);
Collection<String> disjunction = CollectionUtils.disjunction(variablesSeen, execution.getVariableNames());
if (!disjunction.isEmpty()) {
LOGGER.trace("*** Variables not found in execution tree or 'execution.getVariableNames()': {}", disjunction);
}
LOGGER.trace("--------------------------------- DumpVariables: " + execution.getCurrentActivityId() + " END ------------");
}
}
private void dumpExecutionVariables(String executionId, DelegateExecution delegateExecution, Execution execution, Set<String> variablesSeen, RuntimeService runtimeService) {
Map<String, Object> variablesLocal = runtimeService.getVariablesLocal(executionId);
LOGGER.trace("Execution id={} ({} variables); class={}/{}", executionId, variablesLocal.size(),
delegateExecution != null ? delegateExecution.getClass().getName() : null,
execution != null ? execution.getClass().getName() : null);
TreeSet<String> names = new TreeSet<>(variablesLocal.keySet());
names.forEach(n -> LOGGER.trace(" - {} = {} {}", n, variablesLocal.get(n), variablesSeen.contains(n) ? "(dup)":""));
variablesSeen.addAll(variablesLocal.keySet());
if (delegateExecution instanceof ExecutionEntity) {
ExecutionEntity executionEntity = (ExecutionEntity) delegateExecution;
if (executionEntity.getParent() != null) {
dumpExecutionVariables(executionEntity.getParentId(), executionEntity.getParent(), null, variablesSeen,
runtimeService);
}
} else if (delegateExecution instanceof ExecutionImpl) {
ExecutionImpl executionImpl = (ExecutionImpl) delegateExecution;
if (executionImpl.getParent() != null) {
dumpExecutionVariables(executionImpl.getParentId(), executionImpl.getParent(), null, variablesSeen,
runtimeService);
}
} else {
Execution execution1 = runtimeService.createExecutionQuery().executionId(executionId).singleResult();
if (execution1 == null) {
LOGGER.trace("Execution with id {} was not found.", executionId);
} else if (execution1.getParentId() != null) {
Execution execution2 = runtimeService.createExecutionQuery().executionId(execution1.getParentId()).singleResult();
dumpExecutionVariables(execution.getParentId(), null, execution2, variablesSeen, runtimeService);
}
}
}
}