/** * Copyright 2007-2010 非也 * All rights reserved. * * This library is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License v3 as published by the Free Software * Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along * with this library; if not, see http://www.gnu.org/licenses/lgpl.html. * */ package org.fireflow.service.email.send; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; 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.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.service.AbsTestContext; 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; /** * * @author 非也 nychen2000@163.com * Fire Workflow 官方网站:www.firesoa.com 或者 www.fireflow.org * */ @ContextConfiguration(locations = { "classpath:/applicationContext.xml"}) public class MailSenderInvokerTest extends AbsTestContext { WorkflowSession session = null; ProcessInstance procInst = null; ActivityInstance actInst = null; /** * Test method for {@link org.fireflow.engine.invocation.impl.AbsServiceInvoker#invoke(org.fireflow.client.WorkflowSession, org.fireflow.engine.entity.runtime.ActivityInstance, org.fireflow.model.binding.ServiceBinding, org.fireflow.model.binding.ResourceBinding, Object)}. */ @Test public void testInvoke() throws Exception{ final MailSendServiceDef service = (MailSendServiceDef)this.buildService1(); //检验interface解析是否正确 InterfaceDef _interface = service.getInterface(); final List<OperationDef> operations = _interface.getOperations(); Assert.assertNotNull(operations); Assert.assertEquals(1, operations.size()); Assert.assertEquals("sendEMail",operations.get(0).getOperationName()); List<Input> inputs = operations.get(0).getInputs(); Assert.assertNotNull(inputs); Assert.assertEquals(5, inputs.size()); List<Output> outputs = operations.get(0).getOutputs(); Assert.assertNotNull(outputs); Assert.assertEquals(0, outputs.size()); //插入测试数据 TransactionTemplate transactionTemplate1 = (TransactionTemplate)this.applicationContext.getBean("transactionTemplate"); transactionTemplate1.execute(new TransactionCallback(){ public Object doInTransaction(TransactionStatus arg0) { try{ RuntimeContext runtimeContext = (RuntimeContext)applicationContext.getBean("runtimeContext"); session = WorkflowSessionFactory.createWorkflowSession(runtimeContext, FireWorkflowSystem.getInstance()); //构造processInstance procInst = createProcessInstance(session, runtimeContext); ((WorkflowSessionLocalImpl)session).setCurrentProcessInstance(procInst); //构造流程变量 procInst.setVariableValue(session, "process_id", "processId-123456"); procInst.setVariableValue(session, "fromAddress", "firesoatest@163.com"); String mailToList = "firesoatest@yeah.net;firesoatest@sohu.com"; procInst.setVariableValue(session, "mailToList", mailToList); String ccList = "firesoatest@126.com"; procInst.setVariableValue(session, "ccList", ccList); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); procInst.setVariableValue(session, "subject", "测试邮件"+df.format(new Date())); procInst.setVariableValue(session, "emailBody", "这是一封普通的Text邮件体测试邮件"); procInst.setVariableValue(session, "isHtml", Boolean.FALSE); //构造activityInstance actInst = createActivityInstance(runtimeContext, procInst); ((WorkflowSessionLocalImpl)session).setCurrentActivityInstance(actInst); //构造局部流程变量 actInst.setVariableValue(session, "state", "0"); }catch(Exception e){ e.printStackTrace(); Assert.fail(e.getMessage()); } return null; } }); 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(); //构造service binding OperationDef operationDef = operations.get(0); ServiceBindingImpl serviceBinding = new ServiceBindingImpl(); // serviceBinding.setService(service); serviceBinding.setServiceId(service.getId()); serviceBinding.setOperationName("sendEMail"); // serviceBinding.setOperation(operationDef); //构造输入映射 List<Assignment> inputAssignments = new ArrayList<Assignment>(); //arg1 = mailToList AssignmentImpl inputAssignment = new AssignmentImpl(); String expressionBody = "/processVars/mailToList"; ExpressionImpl exp = new ExpressionImpl(); exp.setBody(expressionBody); exp.setLanguage("xpath"); inputAssignment.setFrom(exp);// ExpressionImpl toExpression = new ExpressionImpl(); toExpression.setLanguage("xpath"); toExpression.setBody("/inputs/mailToList"); toExpression.setDataType(operationDef.getInputs().get(0).getDataType()); inputAssignment.setTo(toExpression); inputAssignments.add(inputAssignment); //arg2 = ccToList inputAssignment = new AssignmentImpl(); expressionBody = new String("/processVars/ccList"); exp = new ExpressionImpl(); exp.setBody(expressionBody); exp.setLanguage("xpath"); inputAssignment.setFrom(exp);// toExpression = new ExpressionImpl(); toExpression.setLanguage("xpath"); toExpression.setBody("/inputs/carbonCopyList"); toExpression.setDataType(operationDef.getInputs().get(1).getDataType()); inputAssignment.setTo(toExpression); inputAssignments.add(inputAssignment); //arg3 = subject inputAssignment = new AssignmentImpl(); expressionBody = new String("/processVars/subject"); exp = new ExpressionImpl(); exp.setBody(expressionBody); exp.setLanguage("xpath"); inputAssignment.setFrom(exp);// toExpression = new ExpressionImpl(); toExpression.setLanguage("xpath"); toExpression.setBody("/inputs/subject"); toExpression.setDataType(operationDef.getInputs().get(2).getDataType()); inputAssignment.setTo(toExpression); inputAssignments.add(inputAssignment); //arg4 = body inputAssignment = new AssignmentImpl(); expressionBody = new String("/processVars/emailBody"); exp = new ExpressionImpl(); exp.setBody(expressionBody); exp.setLanguage("xpath"); inputAssignment.setFrom(exp);// toExpression = new ExpressionImpl(); toExpression.setLanguage("xpath"); toExpression.setBody("/inputs/body"); toExpression.setDataType(operationDef.getInputs().get(3).getDataType()); inputAssignment.setTo(toExpression); inputAssignments.add(inputAssignment); //arg5 = isHtml inputAssignment = new AssignmentImpl(); expressionBody = new String("/processVars/isHtml"); exp = new ExpressionImpl(); exp.setBody(expressionBody); exp.setLanguage("xpath"); inputAssignment.setFrom(exp);// toExpression = new ExpressionImpl(); toExpression.setLanguage("xpath"); toExpression.setBody("/inputs/bodyIsHtml"); toExpression.setDataType(operationDef.getInputs().get(4).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(); Assert.fail(e.getMessage()); } catch(Exception e){ e.printStackTrace(); Assert.fail(e.getMessage()); } return null; } }); } @Test public void testInvoke2() throws Exception{ final MailSendServiceDef service = (MailSendServiceDef)this.buildService2(); //检验interface解析是否正确 InterfaceDef _interface = service.getInterface(); final List<OperationDef> operations = _interface.getOperations(); Assert.assertNotNull(operations); Assert.assertEquals(1, operations.size()); Assert.assertEquals("sendEMail",operations.get(0).getOperationName()); List<Input> inputs = operations.get(0).getInputs(); Assert.assertNotNull(inputs); Assert.assertEquals(5, inputs.size()); List<Output> outputs = operations.get(0).getOutputs(); Assert.assertNotNull(outputs); Assert.assertEquals(0, outputs.size()); //插入测试数据 TransactionTemplate transactionTemplate1 = (TransactionTemplate)this.applicationContext.getBean("transactionTemplate"); transactionTemplate1.execute(new TransactionCallback(){ public Object doInTransaction(TransactionStatus arg0) { try{ RuntimeContext runtimeContext = (RuntimeContext)applicationContext.getBean("runtimeContext"); session = WorkflowSessionFactory.createWorkflowSession(runtimeContext, FireWorkflowSystem.getInstance()); //构造processInstance procInst = createProcessInstance(session, runtimeContext); ((WorkflowSessionLocalImpl)session).setCurrentProcessInstance(procInst); //构造流程变量 procInst.setVariableValue(session, "process_id", "processId-123456"); procInst.setVariableValue(session, "fromAddress", "firesoatest@163.com"); String mailToList = "firesoatest@yeah.net;firesoatest@sohu.com"; procInst.setVariableValue(session, "mailToList", mailToList); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); procInst.setVariableValue(session, "subject", "测试邮件"+df.format(new Date())); procInst.setVariableValue(session, "emailBody", "<html><body style=\"color:red\">这是一封Html格式的测试邮件,通过SSL协议发送</body></html>"); procInst.setVariableValue(session, "isHtml", Boolean.TRUE); //构造activityInstance actInst = createActivityInstance(runtimeContext, procInst); ((WorkflowSessionLocalImpl)session).setCurrentActivityInstance(actInst); //构造局部流程变量 actInst.setVariableValue(session, "state", "0"); }catch(Exception e){ e.printStackTrace(); Assert.fail(e.getMessage()); } return null; } }); 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(); //构造service binding OperationDef operationDef = operations.get(0); ServiceBindingImpl serviceBinding = new ServiceBindingImpl(); // serviceBinding.setService(service); serviceBinding.setServiceId(service.getId()); serviceBinding.setOperationName("sendEMail"); // serviceBinding.setOperation(operationDef); //构造输入映射 List<Assignment> inputAssignments = new ArrayList<Assignment>(); //arg1 = mailToList AssignmentImpl inputAssignment = new AssignmentImpl(); String expressionBody = "/processVars/mailToList"; ExpressionImpl exp = new ExpressionImpl(); exp.setBody(expressionBody); exp.setLanguage("xpath"); inputAssignment.setFrom(exp);// ExpressionImpl toExpression = new ExpressionImpl(); toExpression.setLanguage("xpath"); toExpression.setBody("/inputs/mailToList"); toExpression.setDataType(operationDef.getInputs().get(0).getDataType()); inputAssignment.setTo(toExpression); inputAssignments.add(inputAssignment); //arg3 = subject inputAssignment = new AssignmentImpl(); expressionBody = new String("/processVars/subject"); exp = new ExpressionImpl(); exp.setBody(expressionBody); exp.setLanguage("xpath"); inputAssignment.setFrom(exp);// toExpression = new ExpressionImpl(); toExpression.setLanguage("xpath"); toExpression.setBody("/inputs/subject"); toExpression.setDataType(operationDef.getInputs().get(2).getDataType()); inputAssignment.setTo(toExpression); inputAssignments.add(inputAssignment); //arg4 = body inputAssignment = new AssignmentImpl(); expressionBody = new String("/processVars/emailBody"); exp = new ExpressionImpl(); exp.setBody(expressionBody); exp.setLanguage("xpath"); inputAssignment.setFrom(exp);// toExpression = new ExpressionImpl(); toExpression.setLanguage("xpath"); toExpression.setBody("/inputs/body"); toExpression.setDataType(operationDef.getInputs().get(3).getDataType()); inputAssignment.setTo(toExpression); inputAssignments.add(inputAssignment); //arg5 = isHtml inputAssignment = new AssignmentImpl(); expressionBody = new String("/processVars/isHtml"); exp = new ExpressionImpl(); exp.setBody(expressionBody); exp.setLanguage("xpath"); inputAssignment.setFrom(exp);// toExpression = new ExpressionImpl(); toExpression.setLanguage("xpath"); toExpression.setBody("/inputs/bodyIsHtml"); toExpression.setDataType(operationDef.getInputs().get(4).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(); Assert.fail(e.getMessage()); } catch(Exception e){ e.printStackTrace(); Assert.fail(e.getMessage()); } return null; } }); } public MailSendServiceDef buildService1() throws Exception{ MailSendServiceDef svcDef = new MailSendServiceDef(); svcDef.setName("EmailService163"); svcDef.setDisplayName("163邮件发送服务"); svcDef.setSmtpServer("smtp.163.com"); svcDef.setUserName("firesoatest@163.com"); svcDef.setPassword("firesoa123"); svcDef.afterPropertiesSet(); return svcDef; } public MailSendServiceDef buildService2() throws Exception{ MailSendServiceDef svcDef = new MailSendServiceDef(); svcDef.setName("EmailService163"); svcDef.setDisplayName("163邮件发送服务"); svcDef.setUseSSL(true); svcDef.setSmtpPort(465); svcDef.setSmtpServer("smtp.163.com"); svcDef.setUserName("firesoatest@163.com"); svcDef.setPassword("firesoa123"); svcDef.afterPropertiesSet(); return svcDef; } }