package com.norteksoft.wf.engine.web;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.orm.Page;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.PageUtils;
import com.norteksoft.product.util.ZipUtils;
import com.norteksoft.product.web.struts2.CrudActionSupport;
import com.norteksoft.wf.engine.entity.WorkflowDefinitionTemplate;
import com.norteksoft.wf.engine.entity.WorkflowDefinitionTemplateFile;
import com.norteksoft.wf.engine.entity.WorkflowType;
import com.norteksoft.wf.engine.service.WorkflowDefinitionTemplateManager;
import com.norteksoft.wf.engine.service.WorkflowTypeManager;
@Namespace("/engine")
@ParentPackage("default")
@Results( { @Result(name = CrudActionSupport.RELOAD, location = "forkflow-definition-template", type = "redirectAction") })
public class WorkflowDefinitionTemplateAction extends CrudActionSupport<WorkflowDefinitionTemplate>{
private static final long serialVersionUID = 1L;
private Long id;
private WorkflowDefinitionTemplate workflowDefinitionTemplate;
private Page<WorkflowDefinitionTemplate> page=new Page<WorkflowDefinitionTemplate>(0,true);
private Long typeId = 0l;
private List<WorkflowType> typeList ;
private String ids ;
@Autowired
private WorkflowDefinitionTemplateManager workflowDefinitionTemplateManager;
@Autowired
private WorkflowTypeManager workflowTypeManager;
@Override
@Action("workflow-definition-template-delete")
public String delete() throws Exception {
workflowDefinitionTemplateManager.delete(ids);
ApiFactory.getBussinessLogService().log("流程定义模板",
"删除流程定义模板",
ContextUtils.getSystemId("wf"));
this.renderText("ok");
return null;
}
@Override
@Action("workflow-definition-template-input")
public String input() throws Exception {
typeList = workflowTypeManager.getAllWorkflowType();
typeId = workflowDefinitionTemplate.getTypeId();
ApiFactory.getBussinessLogService().log("流程定义模板",
"流程定义模板表单页面",
ContextUtils.getSystemId("wf"));
return "workflow-definition-template-input";
}
@Override
@Action("workflow-definition-template-list")
public String list() throws Exception {
if(page.getPageSize()>1){
if(typeId==null||typeId==0){
workflowDefinitionTemplateManager.getTemplate(page);
}else{
workflowDefinitionTemplateManager.getTemplate(page,typeId);
}
ApiFactory.getBussinessLogService().log("流程定义模板",
"流程定义模板列表",
ContextUtils.getSystemId("wf"));
this.renderText(PageUtils.pageToJson(page));
return null;
}
return "workflow-definition-template-list";
}
@Override
public void prepareModel() throws Exception {
if(id==null){
workflowDefinitionTemplate=new WorkflowDefinitionTemplate();
}else{
workflowDefinitionTemplate=workflowDefinitionTemplateManager.getWorkflowDefinitionTemplate(id);
}
}
@Override
@Action("workflow-definition-template-save")
public String save() throws Exception {
workflowDefinitionTemplateManager.save(workflowDefinitionTemplate);
ApiFactory.getBussinessLogService().log("流程定义模板",
"保存流程定义模板",
ContextUtils.getSystemId("wf"));
this.renderText(workflowDefinitionTemplate.getId().toString());
return null;
}
/**
* 上传模板xml
* @return
* @throws Exception
*/
@Action("upload-xml")
public String uploadXml() throws Exception {
//从request中获取参数并封装实体
HttpServletRequest request = ServletActionContext.getRequest();
MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) request;
File file = wrapper.getFiles("Filedata")[0];
String fileName = request.getParameter("Filename");
workflowDefinitionTemplate = workflowDefinitionTemplateManager.getWorkflowDefinitionTemplate(id);
workflowDefinitionTemplate.setName(fileName);
workflowDefinitionTemplate.setTemplateType(StringUtils.substring(fileName, fileName.lastIndexOf('.')));
InputStreamReader inr=new InputStreamReader(new FileInputStream(file),ZipUtils.prexEncoding(file.getPath()));
BufferedReader br=new BufferedReader(inr);
StringBuilder content=new StringBuilder();
while(true){
String rl=br.readLine();
if(rl==null)break;
content.append(rl);
}
WorkflowDefinitionTemplateFile workflowDefinitionTemplateFile=workflowDefinitionTemplateManager.getWorkflowDefinitionTemplateFileByTemplateId(id);
if(workflowDefinitionTemplateFile==null){
workflowDefinitionTemplateFile=new WorkflowDefinitionTemplateFile();
}
workflowDefinitionTemplateFile.setXml(content.toString());
workflowDefinitionTemplateFile.setTemplateId(id);
workflowDefinitionTemplateManager.save(workflowDefinitionTemplate,workflowDefinitionTemplateFile);
ApiFactory.getBussinessLogService().log("流程定义模板",
"上传流程定义模板",
ContextUtils.getSystemId("wf"));
return null;
}
/**
* 上传模板图片
* @return
* @throws Exception
*/
@Action("upload-picture")
public String uploadPicture() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) request;
String fileName = wrapper.getParameter("Filename");
workflowDefinitionTemplate = workflowDefinitionTemplateManager.getWorkflowDefinitionTemplate(id);
workflowDefinitionTemplate.setPreviewImageName(fileName);
Long time=System.currentTimeMillis();
workflowDefinitionTemplate.setPreviewImage("images/"+time+fileName);
File file = wrapper.getFiles("Filedata")[0];
//进行文件的输出
//1.先创建指定文件
File imgFile = new File(workflowDefinitionTemplateManager.getLocalPath()+time+fileName);
if(!imgFile.exists()){
try{
imgFile.getParentFile().mkdir();
imgFile.createNewFile();
}catch(Exception e) {
throw new Exception("创建指定文件时失败...");
}
}
//2.输出
byte[] copyImg = getContent(file);
FileOutputStream fot = new FileOutputStream(imgFile);
fot.write(copyImg);
fot.flush();
fot.close();
workflowDefinitionTemplateManager.save(workflowDefinitionTemplate);
ApiFactory.getBussinessLogService().log("流程定义模板",
"上传流程定义模板图片",
ContextUtils.getSystemId("wf"));
return null;
}
/**
* 把文件转成byte[]
* @param file
* @return
*/
private byte[] getContent(File file) {
BufferedInputStream in = null;
byte[] img = null;
try {
FileInputStream fin = new FileInputStream(file);
in = new BufferedInputStream(fin);
img = new byte[fin.available()];
int readLength = 0; // 每次读取长度
int allLength = 0; // 已经读取的长度
byte[] bs = new byte[2048];
while( ( readLength = in.read(bs) ) != -1 ){
System.arraycopy(bs, 0, img, allLength, readLength);
allLength += readLength;
}
} catch (FileNotFoundException e) {
throw new RuntimeException(" [" + file.getName() + "] not found ");
} catch (IOException e) {
throw new RuntimeException(e);
}finally{
if(in != null){
try {
in.close();
} catch (IOException e) {
}
}
}
return img;
}
public WorkflowDefinitionTemplate getModel() {
return workflowDefinitionTemplate;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Page<WorkflowDefinitionTemplate> getPage() {
return page;
}
public void setPage(Page<WorkflowDefinitionTemplate> page) {
this.page = page;
}
public Long getTypeId() {
return typeId;
}
public void setTypeId(Long typeId) {
this.typeId = typeId;
}
public List<WorkflowType> getTypeList() {
return typeList;
}
public void setIds(String ids) {
this.ids = ids;
}
}