The email treatment connector allows the designer to configure, through the diagram editor, various email entry-points inside the diagram.
The purpose of this example is to give you an overview of the various mechanisms the Connectors Framework brings to you.
Developing a connector is quite straightforward. You just need to create the following elements:
This file should be available from the relative path "WEB-INF\storage<custom><connectors>\education-mail.xml".
<?xml version="1.0" encoding="UTF-8"?> <connectors> <connector name="sample" label="sample-connector.label" description="sample-connector.description" version="1.0" company="Visiativ Software" ref-connection="sample.connection"> <treatments> <treatment name="fooTreatment" label="sample.treatment.foo.label"> <class qualifiedName="com.axemble.education.connectors.sample.DummyTreatmentConnector" /> <configuration> <class qualifiedName="com.axemble.education.connectors.sample.DummyTreatmentConnectorEditor" /> <section name="main" label="LG_MAIN"> <fields> <field name="fldBody" label="treatment.sample.foo.body.label" description="treatment.sample.foo.body.description" ctrl="selector" screen="Property" method="select" mandatory="true" type="string" quick-create="Field.quickCreate" quick-create-type="string" /> </fields> </section> <custom /> </configuration> <entry-points> <workflow-library categoryName="education" /> </entry-points> </treatment> </treatments> </connector> </connectors>
package com.axemble.education.connectors.smtp; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.Date; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import org.w3c.dom.Element; import com.axemble.education.connectors.smtp.SampleSMTPConnection.InnerConnection; import com.axemble.vdoc.sdk.connectors.BaseTreatmentConnector; import com.axemble.vdoc.sdk.document.fields.LocalizedTextField; import com.axemble.vdoc.sdk.exceptions.SDKException; import com.axemble.vdoc.sdk.interfaces.IContext; import com.axemble.vdoc.sdk.interfaces.ITaskInstance; import com.axemble.vdoc.sdk.interfaces.IUser; import com.axemble.vdoc.sdk.interfaces.IWorkflowInstance; public class SampleSendMailTreatmentConnector extends BaseTreatmentConnector
@Override public int execute( IContext context, IWorkflowInstance workflowInstance, ITaskInstance taskInstance, Element customElement ) { if ( context == null ) context = getWorkflowModule().getContextByLogin( "sysadmin" ); // Use another connection InnerConnection innerConnection = null; try { innerConnection = (InnerConnection)getConnection(); // create the MimeMessage MimeMessage message = new MimeMessage( innerConnection.getSession() ); // set the sender from the context InternetAddress senderAddress = new InternetAddress( context.getUser().getEmail(), context.getUser().getFullName() ); message.setFrom( senderAddress ); // set the recipients ArrayList<InternetAddress> toAddresses = new ArrayList<InternetAddress>(); IUser user = getDirectoryModule().getUserByLogin( "sboirol" ); toAddresses.add( new InternetAddress( user.getEmail(), user.getFullName() ) ); InternetAddress[] toInternetAddresses = new InternetAddress[toAddresses.size()]; toAddresses.toArray( toInternetAddresses ); message.setRecipients( Message.RecipientType.TO, toInternetAddresses ); // set the subject String subjectValue = (String)getTreatmentDefinition().getValue( SampleSendMailTreatmentConnectorEditor.FIELD_SUBJECT ); if ( subjectValue.startsWith( "false;" ) ) { subjectValue = LocalizedTextField.getValue( subjectValue ); subjectValue = evaluateExpressions( context, workflowInstance, subjectValue ); } else subjectValue = getStaticString( LocalizedTextField.getValue( subjectValue ) ); message.setSubject( subjectValue ); // set the body Object bodyContentValue = getTreatmentDefinition().getValue( SampleSendMailTreatmentConnectorEditor.FIELD_BODY ); if ( bodyContentValue == null ) throw new SDKException( getStaticString( "treatment.mail.sendMail.errors.emptyMessageContent" ) ); String textBodyContentValue = new String( (byte[])bodyContentValue ).toString(); textBodyContentValue = evaluateExpressions( context, workflowInstance, textBodyContentValue ); message.setContent( textBodyContentValue, "text/html; charset=utf-8" ); message.setSentDate( new Date() ); // serialize the message for asynchronous treatment (see asyncExecute) serializeMessage( message ); return IExecuteStatus.CONTINUE; } catch( Exception e ) { return IExecuteStatus.STOP; } finally { safeClose( innerConnection ); } }
@Override public void asyncExecute( Element customElement ) { try { // Use another connection InnerConnection innerConnection = null; try { innerConnection = (InnerConnection)getConnection(); // load the MimeMessage MimeMessage message = deserializeMessage( innerConnection.getSession(), this.messageBytes ); // send mail using java mail API innerConnection.getTransport().sendMessage( message, message.getAllRecipients() ); } finally { safeClose( innerConnection ); } } catch( Exception e ) { throw new SDKException( e ); } }
@Override public void beforeCompletion( IContext context, Element customElement ) { super.beforeCompletion( context, customElement ); } @Override public void afterCompletion( IContext context, Element customElement, boolean committed ) { super.afterCompletion( context, customElement, committed ); }
private void serializeMessage( MimeMessage message ) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); message.writeTo( baos ); this.messageBytes = baos.toByteArray(); } catch( Exception e ) { throw new SDKException( e ); } } private MimeMessage deserializeMessage( Session session, byte[] bytes ) { try { return new MimeMessage( session, new ByteArrayInputStream( bytes ) ); } catch( Exception e ) { throw new SDKException( e ); } }
Examples | Description |
${iUser} | current context user |
${iWorkflowInstance} | current workflow instance |
Examples | Description |
${iUser.FullName} | Full name of the current context user |
${iUser.Organization.Name} | Organization of the current context user (sysadmin does not have an organization!) |
${iWorkflowInstance.Catalog.Project.Name} | Name of the project of the document |
Examples | Description |
${iWorkflowInstance-document.sys_Creator.FullName} | Full name of the creator of the document. |
${iWorkflowInstance-document.period.startDate} | Start date of a period field. |
${iWorkflowInstance-document.period.endDate} | End date of a period field. |
${iConnectionDefinition-configuration.fieldname}
Examples | Description |
${iConnectionDefinitionConfiguration.fldMailBaseUrl } | Base mail URL. |
${iConnectionDefinitionConfiguration.fldSmtpServer} | The SMTP server host name. |
${iConnectionDefinitionConfiguration.fldSmtpPort} | The SMTP server port number. |
${iConnectionDefinitionConfiguration.fldMailAdministrator} | The administrator email. |
${iConnectionDefinitionConfiguration.fldMailSender} | The default sender email. |
Examples | Description |
${iServerConfiguration.MAIL_BASE_URL} | Base mail URL set on the server configuration. |
${iServerConfiguration.mail.server} | The SMTP server host name set on the server configuration. |
${iServerConfiguration.mail.smtp.port} | The SMTP server port number set on the server configuration. |
${iServerConfiguration.mail.administrator} | The administrator email set on the server configuration. |