package fr.itldev.koya.webscript.workflow;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.web.scripts.workflow.AbstractWorkflowWebscript;
import org.alfresco.repo.web.scripts.workflow.WorkflowModelBuilder;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.AccessStatus;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.workflow.WorkflowInstance;
import org.apache.log4j.Logger;
import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException;
import org.springframework.extensions.webscripts.WebScriptRequest;
import fr.itldev.koya.model.exceptions.KoyaErrorCodes;
public class WorkflowInstanceGet extends AbstractWorkflowWebscript {
public static final String PARAM_INCLUDE_TASKS = "includeTasks";
private Logger logger = Logger.getLogger(this.getClass());
private PermissionService permissionService;
public void setPermissionService(PermissionService permissionService) {
this.permissionService = permissionService;
}
@Override
protected Map<String, Object> buildModel(final WorkflowModelBuilder modelBuilder, WebScriptRequest req,
Status status, Cache cache) {
Map<String, String> params = req.getServiceMatch().getTemplateVars();
String currentUser = authenticationService.getCurrentUserName();
// getting workflow instance id from request parameters
String workflowInstanceId = params.get("workflow_instance_id");
final boolean includeTasks = getIncludeTasks(req);
final WorkflowInstance workflowInstance = workflowService.getWorkflowById(workflowInstanceId);
// task was not found -> return 404
if (workflowInstance == null) {
throw new WebScriptException(HttpServletResponse.SC_NOT_FOUND,
"Unable to find workflow instance with id: " + workflowInstanceId);
}
/**
* check current user permissions on workflow related item if current
* user has read permissions on reference node then override permissions
* by extracting workflow details as system user
*/
List<ChildAssociationRef> childRefs = nodeService.getChildAssocs(workflowInstance.getWorkflowPackage());
if (childRefs.size() != 1) {
throw new WebScriptException("KoyaError : " + KoyaErrorCodes.WF_NO_OR_TOO_MANY_REFERENCE_ITEM);
}
try {
NodeRef referenceNode = childRefs.get(0).getChildRef();
if (!permissionService.hasPermission(referenceNode, PermissionService.READ).equals(AccessStatus.ALLOWED)) {
throw new WebScriptException("KoyaError : " + KoyaErrorCodes.WF_NO_READ_PERMISSION_ON_REFERENCE_ITEM);
}
} catch (Exception ex) {
throw new WebScriptException("KoyaError : " + KoyaErrorCodes.WF_NO_READ_PERMISSION_ON_REFERENCE_ITEM);
}
Map<String, Object> model = new HashMap<String, Object>();
Map<String, Object> wfModel = AuthenticationUtil
.runAsSystem(new AuthenticationUtil.RunAsWork<Map<String, Object>>() {
@Override
public Map<String, Object> doWork() throws Exception {
return modelBuilder.buildDetailed(workflowInstance, includeTasks);
}
});
// build the model for ftl
model.put("workflowInstance", wfModel);
return model;
}
private boolean getIncludeTasks(WebScriptRequest req) {
String includeTasks = req.getParameter(PARAM_INCLUDE_TASKS);
if (includeTasks != null) {
try {
return Boolean.valueOf(includeTasks);
} catch (Exception e) {
// do nothing, false will be returned
}
}
// Defaults to false.
return false;
}
}