Trace:
Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | |||
workflow:custom_function [2022/03/31 07:19] admin removed |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ~~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. Here's an example: | ||
- | |||
- | <file xml> | ||
- | <application> | ||
- | ... | ||
- | <mail> | ||
- | <smtp> | ||
- | <host>smtp.yourserver.com</host> | ||
- | <port>587</port> | ||
- | <username>username</username> | ||
- | <password>password</password> | ||
- | <tlsenabled>true</tlsenabled> | ||
- | <defaultsender>Noreply <noreply@yourserver.com></defaultsender> | ||
- | </smtp> | ||
- | </mail> | ||
- | </application> | ||
- | </file> | ||
- | |||
- | 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. |