/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2014, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gses.activiti.forms;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.form.StartFormHandler;
import org.activiti.engine.impl.form.TaskFormHandler;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import ru.codeinside.gses.activiti.forms.api.definitions.FormDefinitionProvider;
import ru.codeinside.gses.webui.form.TaskGoneException;
final class GetFormDefinitionCommand implements Command<FormDefinition> {
final FormID id;
final String login;
public GetFormDefinitionCommand(FormID id, String login) {
this.id = id;
this.login = login;
}
@Override
public FormDefinition execute(CommandContext commandContext) {
ProcessEngineConfigurationImpl configuration = Context.getProcessEngineConfiguration();
configuration.getIdentityService().setAuthenticatedUserId(login);
FormDefinition def = new FormDefinition();
if (id.processDefinitionId != null) {
def.processDefinition = configuration.getRepositoryService().createProcessDefinitionQuery()
.processDefinitionId(id.processDefinitionId)
//.startableByUser(login) не используем identityLink в Activiti
.active()
.singleResult();
// есть права и описатель активен
if (def.processDefinition != null) {
StartFormHandler startFormHandler = configuration.getDeploymentCache()
.findDeployedProcessDefinitionById(id.processDefinitionId).getStartFormHandler();
def.propertyTree = ((FormDefinitionProvider) startFormHandler).getPropertyTree();
} else {
throw new ActivitiException("No process definition found for id '" + id.processDefinitionId + "'");
}
} else {
def.task = configuration.getTaskService().createTaskQuery().taskAssignee(login).taskId(id.taskId).singleResult();
// не исполнена и есть права
if (def.task != null) {
def.processDefinition = configuration.getRepositoryService().createProcessDefinitionQuery()
.processDefinitionId(def.task.getProcessDefinitionId())
.singleResult();
TaskEntity taskEntity = commandContext.getTaskManager().findTaskById(id.taskId);
def.execution = taskEntity.getExecution();
TaskFormHandler taskFormHandler = taskEntity.getTaskDefinition().getTaskFormHandler();
def.propertyTree = ((FormDefinitionProvider) taskFormHandler).getPropertyTree();
} else {
TaskEntity taskEntity = commandContext.getTaskManager().findTaskById(id.taskId);
if (taskEntity == null) {
throw new TaskGoneException(false);
}
throw new TaskGoneException(true);
}
}
return def;
}
}