package org.fireflow.service.file.writer; import static org.junit.Assert.*; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.namespace.QName; import junit.framework.Assert; import org.fireflow.client.WorkflowSession; import org.fireflow.client.WorkflowSessionFactory; import org.fireflow.client.impl.WorkflowSessionLocalImpl; import org.fireflow.engine.context.RuntimeContext; import org.fireflow.engine.entity.runtime.ActivityInstance; import org.fireflow.engine.entity.runtime.ProcessInstance; import org.fireflow.engine.exception.ServiceInvocationException; import org.fireflow.engine.invocation.ServiceInvoker; import org.fireflow.engine.modules.ousystem.impl.FireWorkflowSystem; import org.fireflow.model.binding.Assignment; import org.fireflow.model.binding.impl.AssignmentImpl; import org.fireflow.model.binding.impl.OutputAssignmentImpl; import org.fireflow.model.binding.impl.ServiceBindingImpl; import org.fireflow.model.data.Input; import org.fireflow.model.data.Output; import org.fireflow.model.data.impl.ExpressionImpl; import org.fireflow.model.servicedef.InterfaceDef; import org.fireflow.model.servicedef.OperationDef; import org.fireflow.model.servicedef.ServiceDef; import org.fireflow.service.AbsTestContext; import org.fireflow.service.file.reader.FileReadServiceDef; import org.firesoa.common.schema.NameSpaces; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.test.context.ContextConfiguration; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; @SuppressWarnings("unused") //hibernate @ContextConfiguration(locations = { "classpath:/applicationContext.xml", "classpath:/org/fireflow/service/file/writer/FileWriteServiceInvokerTest-context.xml" }) public class FileWriteServiceInvokerTest extends AbsTestContext { private static final String originalFilesDir = System.getProperty("user.dir")+File.separator+"original_files"; private static final String targetFilesDir = System.getProperty("user.dir")+File.separator+"target_files"; private static final String bakupDir = System.getProperty("user.dir")+File.separator+"bakup_files"; private static final String textFileName_1 = "text_file_1.txt"; private static final String textFileName_2 = "text_file_2.txt"; private static final String textFileName_3 = "text_file_3.proerties"; private static final String textFileName_4 = "text_file_4.proerties"; WorkflowSession session = null; ProcessInstance procInst = null; ActivityInstance actInst = null; private static void deleteFile(File f){ if (f.isFile()) f.delete(); else if (f.isDirectory()){ File[] files = f.listFiles(); if (files==null || files.length==0){ f.delete(); }else{ for (File ftmp : files){ deleteFile(ftmp); } f.delete(); } } } /** * 准备初始化数据,方便测试 */ @BeforeClass public static void beforeClass(){ File f = new File(originalFilesDir); if (f.exists()){ deleteFile(f); } f.mkdir(); f = new File(targetFilesDir); if (f.exists()){ deleteFile(f); } f.mkdir(); f = new File(bakupDir); if (f.exists()){ deleteFile(f); } f.mkdir(); try{ f = new File(originalFilesDir+File.separator+textFileName_1); FileOutputStream fOut = new FileOutputStream(f); fOut.write("This is Text file 1; 这是文件1".getBytes("UTF-8")); fOut.flush(); fOut.close(); }catch(IOException e){ e.printStackTrace(); } try { Thread.currentThread().sleep(3*1000); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try{ f = new File(originalFilesDir+File.separator+textFileName_2); FileOutputStream fOut = new FileOutputStream(f); fOut.write("This is Text file 2; 这是文件2".getBytes("UTF-8")); fOut.flush(); fOut.close(); }catch(IOException e){ e.printStackTrace(); } try { Thread.currentThread().sleep(3*1000); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try{ f = new File(originalFilesDir+File.separator+textFileName_3); FileOutputStream fOut = new FileOutputStream(f); fOut.write("#注释\n username=a \n pwd=123".getBytes("UTF-8")); fOut.flush(); fOut.close(); }catch(IOException e){ e.printStackTrace(); } try { Thread.currentThread().sleep(3*1000); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try{ f = new File(originalFilesDir+File.separator+textFileName_4); FileOutputStream fOut = new FileOutputStream(f); fOut.write("#注释\n filename=文件2.properties".getBytes("UTF-8")); fOut.flush(); fOut.close(); }catch(IOException e){ e.printStackTrace(); } } /** * 删除测试数据 */ // @AfterClass // public static void afterClass(){ // File f = new File(originalFilesDir); // if (f.exists()){ // deleteFile(f); // } // // f = new File(targetFilesDir); // if (f.exists()){ // deleteFile(f); // } // // f = new File(bakupDir); // if (f.exists()){ // deleteFile(f); // } // } @Test public void testInvoke() { final ServiceDef service = this.buildService1(); //检验interface解析是否正确 InterfaceDef _interface = service.getInterface(); final List<OperationDef> operations = _interface.getOperations(); Assert.assertNotNull(operations); Assert.assertEquals(2, operations.size()); OperationDef operation = _interface.getOperation("writeStringToFile"); List<Input> inputs = operation.getInputs(); Assert.assertNotNull(inputs); Assert.assertEquals(2, inputs.size()); Assert.assertEquals(new QName(NameSpaces.JAVA.getUri(),"java.lang.String"),inputs.get(0).getDataType()); List<Output> outputs = operations.get(0).getOutputs(); Assert.assertNotNull(outputs); Assert.assertEquals(0, outputs.size()); // TransactionTemplate transactionTemplate = (TransactionTemplate)this.applicationContext.getBean("transactionTemplate"); transactionTemplate.execute(new TransactionCallback(){ public Object doInTransaction(TransactionStatus arg0) { //测试invoker String invokerClassName = service.getInvokerClassName(); Class clz; try { clz = Class.forName(invokerClassName); ServiceInvoker invoker = (ServiceInvoker)clz.newInstance(); RuntimeContext runtimeContext = (RuntimeContext)applicationContext.getBean("runtimeContext"); session = WorkflowSessionFactory.createWorkflowSession(runtimeContext, FireWorkflowSystem.getInstance()); //构造processInstance procInst = createProcessInstance(session, runtimeContext); ((WorkflowSessionLocalImpl)session).setCurrentProcessInstance(procInst); //构造activityInstance actInst = createActivityInstance(runtimeContext, procInst); ((WorkflowSessionLocalImpl)session).setCurrentActivityInstance(actInst); //构造service binding ServiceBindingImpl serviceBinding = new ServiceBindingImpl(); // serviceBinding.setService(service); serviceBinding.setServiceId(service.getId()); serviceBinding.setOperationName("writeStringToFile"); // serviceBinding.setOperation(operations.get(0)); //构造输入映射 List<Assignment> inputAssignments = new ArrayList<Assignment>(); //arg0 AssignmentImpl inputAssignment = new AssignmentImpl(); //貌似org.apache.commons.beanutils.MethodUtils.invokeMethod不能用null,做参数 //String jsBody = "null"; String jsBody = "'TestFile.txt'"; ExpressionImpl exp = new ExpressionImpl(); exp.setBody(jsBody); exp.setLanguage("JavaScript"); inputAssignment.setFrom(exp);// ExpressionImpl toExpression = new ExpressionImpl(); toExpression.setLanguage("xpath"); toExpression.setBody("/inputs/arg0"); toExpression.setDataType(operations.get(0).getInputs().get(0).getDataType()); inputAssignment.setTo(toExpression); inputAssignments.add(inputAssignment); //arg1 inputAssignment = new AssignmentImpl(); jsBody = "'测试字符串写入文件,Test write string to file。'"; exp = new ExpressionImpl(); exp.setBody(jsBody); exp.setLanguage("JavaScript"); inputAssignment.setFrom(exp);// toExpression = new ExpressionImpl(); toExpression.setLanguage("xpath"); toExpression.setBody("/inputs/arg1"); toExpression.setDataType(operations.get(0).getInputs().get(0).getDataType()); inputAssignment.setTo(toExpression); inputAssignments.add(inputAssignment); serviceBinding.setInputAssignments(inputAssignments); //执行java 调用 boolean b = invoker.invoke(session, actInst, serviceBinding, null, null); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); Assert.fail(e.getMessage()); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); Assert.fail(e.getMessage()); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); Assert.fail(e.getMessage()); } catch (ServiceInvocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }); } @Test public void testInvoke2(){ final FileReadServiceDef readService = (FileReadServiceDef)this.buildFileReadService(); final FileWriteServiceDef writeService = (FileWriteServiceDef)this.buildService1(); TransactionTemplate transactionTemplate = (TransactionTemplate)this.applicationContext.getBean("transactionTemplate"); transactionTemplate.execute(new TransactionCallback(){ public Object doInTransaction(TransactionStatus arg0) { //测试invoker String invokerClassName = readService.getInvokerClassName(); OperationDef readFileOperation = readService.getInterface().getOperations().get(0); Class clz; try { clz = Class.forName(invokerClassName); ServiceInvoker invoker = (ServiceInvoker)clz.newInstance(); RuntimeContext runtimeContext = (RuntimeContext)applicationContext.getBean("runtimeContext"); session = WorkflowSessionFactory.createWorkflowSession(runtimeContext, FireWorkflowSystem.getInstance()); //构造processInstance procInst = createProcessInstance(session, runtimeContext); ((WorkflowSessionLocalImpl)session).setCurrentProcessInstance(procInst); //构造activityInstance actInst = createActivityInstance(runtimeContext, procInst); ((WorkflowSessionLocalImpl)session).setCurrentActivityInstance(actInst); //构造service binding ServiceBindingImpl serviceBinding = new ServiceBindingImpl(); // serviceBinding.setService(readService); serviceBinding.setServiceId(readService.getId()); serviceBinding.setOperationName("readFile"); // serviceBinding.setOperation(readFileOperation); //构造输入映射 List<Assignment> inputAssignments = new ArrayList<Assignment>(); //arg0 AssignmentImpl inputAssignment = new AssignmentImpl(); //貌似org.apache.commons.beanutils.MethodUtils.invokeMethod不能用null,做参数 //String jsBody = "null"; String jsBody = Long.toString(0); ExpressionImpl exp = new ExpressionImpl(); exp.setBody(jsBody); exp.setLanguage("JavaScript"); inputAssignment.setFrom(exp);// ExpressionImpl toExpression = new ExpressionImpl(); toExpression.setLanguage("xpath"); toExpression.setBody("/inputs/arg0"); toExpression.setDataType(readFileOperation.getInputs().get(0).getDataType()); inputAssignment.setTo(toExpression); inputAssignments.add(inputAssignment); serviceBinding.setInputAssignments(inputAssignments); //构造输出映射 List<Assignment> outputAssignments = new ArrayList<Assignment>(); // 1、 输出到实例级别的流程变量 OutputAssignmentImpl outputAssignment = new OutputAssignmentImpl(); ExpressionImpl expression = new ExpressionImpl(); expression.setLanguage("xpath"); expression.setBody("outputs/"+readFileOperation.getOutputs().get(0).getName()); outputAssignment.setFrom(expression); toExpression = new ExpressionImpl(); toExpression.setLanguage("xpath"); toExpression.setBody("/processVars/result"); toExpression.setDataType(new QName(NameSpaces.JAVA.getUri(),"org.fireflow.engine.invocation.Message",NameSpaces.JAVA.getPrefix())); outputAssignment.setTo(toExpression); outputAssignments.add(outputAssignment); serviceBinding.setOutputAssignments(outputAssignments); //执行java 调用 boolean b = invoker.invoke(session, actInst, serviceBinding, null, null); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); Assert.fail(e.getMessage()); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); Assert.fail(e.getMessage()); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); Assert.fail(e.getMessage()); } catch (ServiceInvocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }); transactionTemplate.execute(new TransactionCallback(){ public Object doInTransaction(TransactionStatus arg0) { //测试invoker String invokerClassName = writeService.getInvokerClassName(); OperationDef operation = writeService.getInterface().getOperation("writeBytesToFile"); Class clz; try { clz = Class.forName(invokerClassName); ServiceInvoker invoker = (ServiceInvoker)clz.newInstance(); RuntimeContext runtimeContext = (RuntimeContext)applicationContext.getBean("runtimeContext"); session = WorkflowSessionFactory.createWorkflowSession(runtimeContext, FireWorkflowSystem.getInstance()); //构造processInstance ((WorkflowSessionLocalImpl)session).setCurrentProcessInstance(procInst); //构造activityInstance ((WorkflowSessionLocalImpl)session).setCurrentActivityInstance(actInst); //构造service binding ServiceBindingImpl serviceBinding = new ServiceBindingImpl(); // serviceBinding.setService(writeService); serviceBinding.setServiceId(writeService.getId()); serviceBinding.setOperationName("writeBytesToFile"); // serviceBinding.setOperation(operation); //构造输入映射 List<Assignment> inputAssignments = new ArrayList<Assignment>(); //arg0 AssignmentImpl inputAssignment = new AssignmentImpl(); //貌似org.apache.commons.beanutils.MethodUtils.invokeMethod不能用null,做参数 //String jsBody = "null"; String jsBody = "processVars.get('result').get(0).getFileName();"; ExpressionImpl exp = new ExpressionImpl(); exp.setBody(jsBody); exp.setLanguage("JavaScript"); inputAssignment.setFrom(exp);// ExpressionImpl toExpression = new ExpressionImpl(); toExpression.setLanguage("xpath"); toExpression.setBody("/inputs/arg0"); toExpression.setDataType(operation.getInputs().get(0).getDataType()); inputAssignment.setTo(toExpression); inputAssignments.add(inputAssignment); //arg1 inputAssignment = new AssignmentImpl(); jsBody = "processVars.get('result').get(0).getContent();"; exp = new ExpressionImpl(); exp.setBody(jsBody); exp.setLanguage("JavaScript"); inputAssignment.setFrom(exp);// toExpression = new ExpressionImpl(); toExpression.setLanguage("xpath"); toExpression.setBody("/inputs/arg1"); toExpression.setDataType(operation.getInputs().get(1).getDataType()); inputAssignment.setTo(toExpression); inputAssignments.add(inputAssignment); serviceBinding.setInputAssignments(inputAssignments); //执行java 调用 boolean b = invoker.invoke(session, actInst, serviceBinding, null, null); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); Assert.fail(e.getMessage()); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); Assert.fail(e.getMessage()); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); Assert.fail(e.getMessage()); } catch (ServiceInvocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }); } public ServiceDef buildService1(){ FileWriteServiceDef svc = new FileWriteServiceDef(); svc.setName("FileWriteService_1"); svc.setDisplayName("测试写文件服务"); svc.setDescription("This is a file write service"); svc.setBizCategory("test\\modules\\filewriteservice"); svc.setDirectory(targetFilesDir); svc.getExtendedAttributes().put("key1", "value1"); svc.getExtendedAttributes().put("key2", "value2"); return svc; } public ServiceDef buildFileReadService(){ FileReadServiceDef svc = new FileReadServiceDef(); svc.setName("FileReadService_1"); svc.setDisplayName("测试读文件服务"); svc.setDescription("This is a file read service"); svc.setBizCategory("test\\modules\\filereadservice"); svc.setDirectory(originalFilesDir); svc.setBakupDirectory(bakupDir); svc.setFileNameSuffix(".txt"); svc.setStrategyAfterReading(FileReadServiceDef.RENAME_AFTER_READING); svc.getExtendedAttributes().put("key1", "value1"); svc.getExtendedAttributes().put("key2", "value2"); return svc; } }