Joget DX 8 Stable Released
The stable release for Joget DX 8 is now available, with a focus on UX and Governance.
Hi All,
I have designed a process for the leave request application. In the end of the process, an e-mail is to be sent to the applier. Now, there is a catch here: I have a running SMTP server Postfix with saslauth service and Cyrus-imapd server configured on the same server. Here is my process design:
I have configured e-mail plugin to send e-mail to the SMTP server. I have checked the authentication required checkbox and entered correct userid and password.
Now, the "To(specific email address)" has say abc@somedomain.com value, "To(participant ID)" has say xyz@somedomain.com value, and "CC" has root@somedomain.com value. But when I send the e-mail, it does not deliver to abc@somedomain.com or xyz@somedomain.com. But it is sent successfully to root@somedomain.com which is "CC" value. I am not understanding the problem.
Here is the detailed log:
INFO 31 May 2011 15:56:20 org.joget.workflow.shark.WorkflowToolActivityHandler - Executing tool [pluginName=org.joget.plugin.email.EmailPlugin, processId=email_check#1#e_mail_process, version= 1, activityId=e_mail_sending_tool]
ERROR 31 May 2011 15:56:20 org.joget.workflow.util.WorkflowUtil - java.lang.NullPointerException
java.lang.NullPointerException
at org.joget.workflow.util.WorkflowUtil.getAssignmentUsers(WorkflowUtil.java:79)
at org.joget.plugin.email.EmailPlugin.execute(EmailPlugin.java:115)
at org.joget.workflow.shark.WorkflowToolActivityHandler.executeActivity(WorkflowToolActivityHandler.java:88)
at org.enhydra.shark.WfActivityImpl.runTool(WfActivityImpl.java:1487)
at org.enhydra.shark.WfActivityImpl.startActivity(WfActivityImpl.java:1419)
at org.enhydra.shark.WfActivityImpl.activate(WfActivityImpl.java:261)
at org.enhydra.shark.WfProcessImpl.startActivity(WfProcessImpl.java:918)
at org.enhydra.shark.WfProcessImpl.queueNext(WfProcessImpl.java:1134)
at org.enhydra.shark.WfProcessImpl.run(WfProcessImpl.java:750)
at org.enhydra.shark.WfProcessImpl.activity_complete(WfProcessImpl.java:969)
at org.enhydra.shark.WfActivityImpl.finish(WfActivityImpl.java:441)
at org.enhydra.shark.WfActivityImpl.complete(WfActivityImpl.java:366)
at org.enhydra.shark.WfActivityWrapper.complete(WfActivityWrapper.java:230)
at org.joget.workflow.model.service.WorkflowManagerImpl.assignmentComplete(WorkflowManagerImpl.java:4574)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.joget.workflow.util.AuditTrailInterceptor.invoke(AuditTrailInterceptor.java:21)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.joget.workflow.util.AuditTrailInterceptor.invoke(AuditTrailInterceptor.java:21)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy9.assignmentComplete(Unknown Source)
at org.joget.workflow.model.WorkflowFacade.assignmentComplete(WorkflowFacade.java:465)
at org.joget.workflow.controller.WorkflowJsonController.assignmentComplete(WorkflowJsonController.java:1237)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:413)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:134)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:310)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:297)
at org.joget.commons.spring.web.ParameterizedAnnotationMethodHandlerAdapter.handle(ParameterizedAnnotationMethodHandlerAdapter.java:30)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:359)
at org.springframework.security.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
at org.springframework.security.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at org.springframework.security.ui.SessionFixationProtectionFilter.doFilterHttp(SessionFixationProtectionFilter.java:67)
at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at org.joget.workflow.security.WorkflowNtlmProcessingFilter.doFilterHttp(WorkflowNtlmProcessingFilter.java:52)
at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at org.springframework.security.ui.ExceptionTranslationFilter.doFilterHttp(ExceptionTranslationFilter.java:101)
at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at org.springframework.security.providers.anonymous.AnonymousProcessingFilter.doFilterHttp(AnonymousProcessingFilter.java:105)
at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:271)
at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:271)
at org.joget.workflow.security.WorkflowHttpAuthProcessingFilter.doFilterHttp(WorkflowHttpAuthProcessingFilter.java:39)
at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at org.springframework.security.ui.logout.LogoutFilter.doFilterHttp(LogoutFilter.java:89)
at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(HttpSessionContextIntegrationFilter.java:235)
at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:371)
at org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:174)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:662)
INFO 31 May 2011 15:56:20 org.joget.plugin.email.EmailPlugin$1 - EmailPlugin: Sending email from=postmaster@somedomain.com, to=cc=root@somedomain.com, subject=Testing
INFO 31 May 2011 15:56:20 org.joget.workflow.controller.WorkflowJsonController - Assignment 109_104_email_check_e_mail_process_send_e_mail completed
INFO 31 May 2011 15:56:20 org.joget.plugin.email.EmailPlugin$1 - EmailPlugin: Sending email completed for subject=Testing
7 Comments
Tiensoon
Hi Chait,
The "To (participant ID)" field is to be filled up with participant ID, not email address. Could you try filling up the "To (specific email address)" field with abc@somedomain.com (for example), and leave the "To (participant ID)" field empty?
chait
Hi Tiensoon,
Thanks for replying. I kept "To (participant ID)" field empty and it worked. Where can I get
the participant ID? Should I use the hash symbol for that?
Regards.
Tiensoon
Mouse-over on a participant in the Participant Mapping tab, and you will be able to see the associated ID. Besides, it is also the ID specified for the participant in Workflow Designer.
chait
Hi Tiensoon,
I got the participant ID and I kept that into the "To (participant ID)" text box. Here
it is 'applicant'. Error is not being displayed in the logs but the mail is not being
delivered to participant ID "applicant". When I use #applicant in "To (participant ID)"
I am getting a NullPointException error.
What should be the value of "To (participant ID)" so that the mail is delivered to
whoever applies for the leave?
Thanks.
Tiensoon
The value in "To (participant ID)" should be the participant's ID shown in Participant Mapping, and Workflow Designer. If the "To (participant ID)" feature is used, the participant (in your case "Applicant"), must be mapped in the Participant Mapping, and this mapped participant must have an email address configured for him/her in Setup Users.
For your case, if you don't have a participant mapped for Applicant (which means, open to everyone), you can use the #performer.activityDefId.email# Hash Variable in the "To (specific email address)" field. You can read my replies in this topic for further understanding about how this Hash Variable can help your case.
chait
Thanks Tiensoon, it worked like a charm!!
Tiensoon
No problem. If you find Joget Workflow to suit your needs, hope you can blog about it and help spread the words :)