Activiti VelocityFormEngine实现

来源:互联网 发布:审批软件 编辑:程序博客网 时间:2024/06/06 03:02
package com.jiangda.org.activiti.engine.form;import java.io.StringWriter;import java.util.HashMap;import java.util.Map;import org.activiti.engine.ActivitiException;import org.activiti.engine.form.FormData;import org.activiti.engine.form.StartFormData;import org.activiti.engine.form.TaskFormData;import org.activiti.engine.impl.context.Context;import org.activiti.engine.impl.form.FormEngine;import org.activiti.engine.impl.persistence.entity.ResourceEntity;import org.activiti.engine.impl.persistence.entity.TaskEntity;import org.apache.velocity.VelocityContext;import org.apache.velocity.app.Velocity;public class VelocityFormEngine implements FormEngine {@Overridepublic String getName() {return "velocity";}@Overridepublic Object renderStartForm(StartFormData startForm) {if (startForm.getFormKey() == null) {return null;}String tpl = getFormTemplateString(startForm, startForm.getFormKey());Map<String, Object> valueMap = new HashMap<String, Object>();valueMap.put("f", startForm.getFormProperties());valueMap.put("pd", startForm.getProcessDefinition());return eval(tpl, startForm.getDeploymentId(), valueMap);}protected String getFormTemplateString(FormData formInstance, String formKey) {String deploymentId = formInstance.getDeploymentId();ResourceEntity resourceStream = Context.getCommandContext().getResourceManager().findResourceByDeploymentIdAndResourceName(deploymentId,formKey);if (resourceStream == null) {throw new ActivitiException("Form with formKey '" + formKey+ "' does not exist");}byte[] resourceBytes = resourceStream.getBytes();String formTemplateString = new String(resourceBytes);return formTemplateString;}@Overridepublic Object renderTaskForm(TaskFormData taskForm) {String tpl = getFormTemplateString(taskForm, taskForm.getFormKey());Map<String, Object> valueMap = new HashMap<String, Object>();valueMap.put("f", taskForm);TaskEntity task = (TaskEntity) taskForm.getTask();valueMap.put("task", task);valueMap.put("execution", task.getExecution());return eval(tpl, taskForm.getDeploymentId(), valueMap);}private String eval(String tpl, String tplName, Map<String, Object> valueMap) {StringWriter writer = new StringWriter();VelocityContext context = new VelocityContext();for (String key : valueMap.keySet()) {context.put(key, valueMap.get(key));}Velocity.evaluate(context, writer, tplName, tpl);return writer.getBuffer().toString();}}