arrow_back history picture_as_pdf This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ~~NOTRANS~~ ~~Title: Custom Function~~ A function is the code block behind a task. It's very simple to create a new function because a function is defined as simple Java interface: <file java IFunction.java> public interface IFunction { /** * Gets the current workflow step. * * @return the current workflow step. */ public IWorkflowStep getWorkflowStep(); /** * Initializes the function. * * @param pStep the current workflow step */ public void init(IWorkflowStep pStep); /** * Runs the function. * If the function returns <code>true</code>, the function is fully done, and the workflow jumps to the next step. * In case there are more than one next step, the finish function of IWorkflowStep has to be called. * Otherwise, an exception will be thrown. * If finish is already called, it does not matter whether <code>true</code> or <code>false</code> is returned. * * @return <code>true</code>, if the function is done. * @throws Throwable if function fails. */ public boolean run() throws Throwable; /** * Notifies that the workflow is cancelled. * * @throws Throwable if canceling fails. */ public void cancel() throws Throwable; } </file> The interface already has an abstract implementation, so it's really simple to create a new function. Our example will send an email, so it's the EmailFunction: <file java EmailFunction.java> public class EmailFunction extends AbstractFunction { @Override public boolean run() throws Throwable { XmlNode smtp = getApplicationZone().getConfig().getNode("/application/mail/smtp"); if (smtp == null) { throw new IllegalArgumentException("SMTP config not found (path /application/mail/smtp)!"); } String host = smtp.getNodeValue("host"); String port = smtp.getNodeValue("port"); String username = smtp.getNodeValue("username"); String password = smtp.getNodeValue("password"); boolean tlsEnabled = Boolean.parseBoolean(smtp.getNodeValue("tlsenabled")); String defaultsender = smtp.getNodeValue("defaultsender"); String from = getNotNullEvaluatedParameter("From"); String to = getNotNullEvaluatedParameter("To"); String cC = getEvaluatedParameter("CC"); String bCC = getEvaluatedParameter("BCC"); String subject = getNotNullEvaluatedParameter("Subject"); String body = getEvaluatedParameter("Body"); log("Mailserver: " + host + ":" + port + "/" + username); Mail mail = new Mail(host, port, username, password); mail.setTLSEnabled(tlsEnabled); mail.send(CommonUtil.nvl(from, defaultsender), to, cC, bCC, subject, body, null, null); log("From: " + CommonUtil.nvl(from, defaultsender)); log("To: " + to); log("Subject: " + subject); return true; } } </file> The implementation is straightforward. It extends the AbstractFunction and implements run method. The email settings will be read from the [[jvx:common:setup:zones|application configuration]], and the email settings will be read from the input parameters. Finally, the email will be sent. But there's still one open question: how do we define the input parameters? Simply use the functions screen and enter all required information: {{:workflow:wf_emailfunction.png?nolink|}} That's it! Start using your new function.