Creating your own Automation Action
You can create your own Automation Action.
Conditions:
- The new Automation Action class must implement the “Action” interface.
- The new Automation Action class must be declared under the package “com.openkm.automation.action”.
- The new Automation Action class must be annotated with “@PluginImplementation”.
Validation interface:
package com.openkm.automation;
import java.util.Map;
import net.xeoh.plugins.base.Plugin;
public interface Action extends Plugin { public static final String METHOD_PRE = "executePre"; public static final String METHOD_POST = "executePost";
public void executePre(Map<String, Object> env, Object... params); public void executePost(Map<String, Object> env, Object... params); public boolean hasPost(); public boolean hasPre(); public String getName(); public String getParamType00(); public String getParamSrc00(); public String getParamDesc00(); public String getParamType01(); public String getParamSrc01(); public String getParamDesc01(); public String getParamType02(); public String getParamSrc02(); public String getParamDesc02();}Methods description
Section titled “Methods description”| Method | Type | Description |
|---|---|---|
| executePre(Map<String, Object> env, Object… params) | void | The method executed by the Automation event when the validation conditions succeed, on “pre” stage. |
| executePost(Map<String, Object> env, Object… params) | void | The method executed by the Automation event when the validation conditions succeed, on “post” stage. |
| hasPost() | boolean | When return true, indicates the executePost(…) method can be used in the Automation post stage. More information about automation stages at Automation. |
| hasPre() | boolean | When returns true, indicates the executePre(…) method can be used in the Automation pre stage. More information about automation stages can be found at Automation. |
| getName() | String | Sets the name that will be shown in the administrator user interface selector list. |
| getParamType00 getParamType01 getParamType02 |
String | Sets the parameter type. Available values: - Automation.PARAM_TYPE_EMPTY - Automation.PARAM_TYPE_TEXT - Automation.PARAM_TYPE_INTEGER - Automation.PARAM_TYPE_BOOLEAN - Automation.PARAM_TYPE_TEXTAREA - Automation.PARAM_TYPE_CODE - Automation.PARAM_TYPE_USER - Automation.PARAM_TYPE_ROLE - Automation.PARAM_TYPE_OMR When value is set to Automation.PARAM_TYPE_EMPTY The parameters work as a logical group. [ getParamType00 + getParamSrc00 + getParamDesc00 ] |
| getParamSrc00 getParamSrc01 getParamSrc02 |
String | Sets the source type. Available values: - Automation.PARAM_SOURCE_EMPTY - Automation.PARAM_SOURCE_FOLDER - Automation.PARAM_SOURCE_OMR |
| getParamDesc00 getParamDesc01 getParamDesc02 |
String | The parameter description. |
Understanding env variable
Section titled “Understanding env variable”The env variable is present on isValid method, it is a Map of values injected by automation. These map values provide information about the node involved on the event and other related information.
For example to retrieve the uuid of the node that caused the event.
String uuid = AutomationUtils.getUuid(env);Understanding params variable
Section titled “Understanding params variable”The env variable is present on isValid method, it is an array of Objects. This array is filled by Automation event based on the number of parameters set on Action class ( which will not be Automation.PARAM_TYPE_EMPTY value).
The array can have serveral Objects with a distinct type, it is necessary retrieve the parameters to the correct object type.
For example to retrieve the first parameters as String object.
String param00 = AutomationUtils.getString(0, params);Description of available ParamType values:
Section titled “Description of available ParamType values:”| Property | Description |
|---|---|
| Automation.PARAM_TYPE_EMPTY | Indicates an empty value. |
| Automation.PARAM_TYPE_TEXT | Indicates a text value will be required. |
| Automation.PARAM_TYPE_INTEGER | Indicates an integer value will be required. |
| Automation.PARAM_TYPE_BOOLEAN | Indicates a boolean value will be required. |
| Automation.PARAM_TYPE_TEXTAREA | Indicates a text area value will be required. |
| Automation.PARAM_TYPE_CODE | Indicates that code will be required. |
| Automation.PARAM_TYPE_USER | Indicates that a valid application user will be required. |
| Automation.PARAM_TYPE_ROLE | Indicates that a valid application role will be required. |
| Automation.PARAM_TYPE_OMR | Indicates that a valid OMR id - object mark recognition - will be required. |
Description of available Src values:
Section titled “Description of available Src values:”| Property | Description |
|---|---|
| PARAM_SOURCE_EMPTY | Indicates an empty source. |
| PARAM_SOURCE_FOLDER | Indicates that the source must be a folder. |
| PARAM_SOURCE_OMR | Indicates that the source must be a valid OMR - object mark recognition -. |
Detecting recursion
Section titled “Detecting recursion”When you create your automation actions, should consider recursion case. For example if your action goes linked with “CREATE_DOCUMENT” event and into the action you create a new document you can go into an infinite loop. For it when you create a new Action should take special care of this cases.
Code to detect recursive calls caused by automation action classes:
if (StackTraceUtils.isCallingMe(this.getClass().getName())) { log.info("Recursion detected"); return;}Example
Section titled “Example”AddKeyword class:
package com.openkm.automation.action;
import java.util.Map;
import com.openkm.automation.Action;import com.openkm.automation.AutomationUtils;import com.openkm.core.Config;import com.openkm.dao.NodeBaseDAO;import com.openkm.dao.bean.Automation;
import net.xeoh.plugins.base.annotations.PluginImplementation;
/** * AddKeyword */@PluginImplementationpublic class AddKeyword implements Action {
@Override public void executePre(Map<String, Object> env, Object... params) throws Exception { }
@Override public void executePost(Map<String, Object> env, Object... params) throws Exception { String keyword = AutomationUtils.getString(0, params); String uuid = AutomationUtils.getUuid(env);
if (uuid != null && keyword != null && !keyword.isEmpty()) { if (Config.SYSTEM_KEYWORD_LOWERCASE) { keyword = keyword.toLowerCase(); }
NodeBaseDAO.getInstance().addKeyword(uuid, keyword); } }
@Override public boolean hasPost() { return true; }
@Override public boolean hasPre() { return false; }
@Override public String getName() { return "AddKeyword"; }
@Override public String getParamType00() { return Automation.PARAM_TYPE_TEXT; }
@Override public String getParamSrc00() { return Automation.PARAM_SOURCE_EMPTY; }
@Override public String getParamDesc00() { return "Keyword"; }
@Override public String getParamType01() { return Automation.PARAM_TYPE_EMPTY; }
@Override public String getParamSrc01() { return Automation.PARAM_SOURCE_EMPTY; }
@Override public String getParamDesc01() { return ""; }
@Override public String getParamType02() { return Automation.PARAM_TYPE_EMPTY; }
@Override public String getParamSrc02() { return Automation.PARAM_SOURCE_EMPTY; }
@Override public String getParamDesc02() { return ""; }}