Creación de su propia acción de automatización
Puede crear su propia acción de automatización (Automation Action).
Condiciones:
- La nueva clase de acción de automatización debe implementar la interfaz “Action”.
- La nueva clase de acción de automatización debe declararse en el paquete “com.openkm.plugin.automation.action”.
- La nueva clase de acción de automatización debe estar anotada con “@PluginImplementation”.
- La nueva clase de acción de automatización debe extender “BasePlugin”.
Interfaz de acción de automatización:
package com.openkm.plugin.automation;
import com.openkm.db.bean.AutomationRule.EnumEvents;import net.xeoh.plugins.base.Plugin;
import java.util.List;import java.util.Map;
public interface Action extends Plugin {
void executePre(Map<String, Object> env, Object... params) throws AutomationException;
void executePost(Map<String, Object> env, Object... params) throws AutomationException;
String getName();
String getParamType00();
String getParamSrc00();
String getParamDesc00();
String getParamType01();
String getParamSrc01();
String getParamDesc01();
String getParamType02();
String getParamSrc02();
String getParamDesc02();
List<EnumEvents> getValidEventsAtPre();
List<EnumEvents> getValidEventsAtPost();}La nueva clase debe cargarse en el paquete com.openkm.plugin.automation.action porque el sistema de plugins de la aplicación intentará cargarla desde ahí.
Descripción de los métodos
Sección titulada «Descripción de los métodos»| Method | Type | Description |
|---|---|---|
| executePre(Map<String, Object> env, Object… params) | void | El método ejecutado por el evento de automatización cuando las condiciones de validación se cumplen, en la fase “pre”. |
| executePost(Map<String, Object> env, Object… params) | void | El método ejecutado por el evento de automatización cuando las condiciones de validación se cumplen, en la fase “post”. |
| getName() | String | Establece el nombre que se mostrará en el selector de la interfaz de administración. |
| getParamType00 getParamType01 getParamType02 |
String | Establece el tipo de parámetro. Valores disponibles: - 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 Cuando el valor se establece a Automation.PARAM_TYPE_EMPTY. Los parámetros funcionan como un grupo lógico. [ getParamType00 + getParamSrc00 + getParamDesc00 ] |
| getParamSrc00 getParamSrc01 getParamSrc02 |
String | Establece el tipo de origen. Valores disponibles: - Automation.PARAM_SOURCE_EMPTY - Automation.PARAM_SOURCE_FOLDER - Automation.PARAM_SOURCE_OMR |
| getParamDesc00 getParamDesc01 getParamDesc02 |
String | La descripción del parámetro. |
| getValidEventsAtPre() | List |
Devuelve una lista de eventos. El método devuelve una lista de eventos válidos para la acción en la fase pre. |
| getValidEventsAtPost() | List |
Devuelve una lista de eventos. El método devuelve una lista de eventos válidos para la acción en la fase post. |
Entendiendo la variable env
Sección titulada «Entendiendo la variable env»La variable env está presente en el método isValid; es un Map de valores inyectados por la automatización. Estos valores del map proporcionan información sobre el nodo implicado en el evento y otra información relacionada.
Por ejemplo, para obtener el nodo que causó el evento.
NodeBase node = automationUtils.getNodeToEvaluate(env);Entendiendo la variable params
Sección titulada «Entendiendo la variable params»La variable params está presente en el método isValid; es un array de Objects. Este array se rellena mediante el evento de automatización según el número de parámetros establecidos en la clase de acción (que no serán Automation.PARAM_TYPE_EMPTY).
El array puede tener varios Objects de distintos tipos; es necesario obtener los parámetros según el tipo de objeto correcto.
Por ejemplo, para obtener el primer parámetro como un objeto String.
String param00 = AutomationUtils.getString(0, params);Descripción de los valores disponibles de ParamType:
Sección titulada «Descripción de los valores disponibles de ParamType:»| Property | Description |
|---|---|
| Automation.PARAM_TYPE_EMPTY | Indica un valor vacío. |
| Automation.PARAM_TYPE_TEXT | Indica que se requerirá un valor de texto. |
| Automation.PARAM_TYPE_INTEGER | Indica que se requerirá un valor entero. |
| Automation.PARAM_TYPE_BOOLEAN | Indica que se requerirá un valor booleano. |
| Automation.PARAM_TYPE_TEXTAREA | Indica que se requerirá un valor de área de texto. |
| Automation.PARAM_TYPE_CODE | Indica que se requerirá código. |
| Automation.PARAM_TYPE_USER | Indica que se requerirá un usuario válido de la aplicación. |
| Automation.PARAM_TYPE_ROLE | Indica que se requerirá un rol válido de la aplicación. |
| Automation.PARAM_TYPE_OMR | Indica que se requerirá un id OMR (optical mark recognition) válido. |
Descripción de los valores disponibles de Src:
Sección titulada «Descripción de los valores disponibles de Src:»| Property | Description |
|---|---|
| PARAM_SOURCE_EMPTY | Indica un origen vacío. |
| PARAM_SOURCE_FOLDER | Indica que el origen debe ser una carpeta. |
| PARAM_SOURCE_OMR | Indica que el origen debe ser un OMR válido (optical mark recognition). |
Detección de recursión
Sección titulada «Detección de recursión»Cuando cree sus acciones de automatización, debe tener en cuenta los casos de recursión. Por ejemplo, si su acción está vinculada al evento “CREATE_DOCUMENT” y la acción crea un nuevo documento, puede entrar en un bucle infinito. Por este motivo, cuando cree una nueva acción debe tener especial cuidado con estos casos.
Código para detectar llamadas recursivas causadas por clases de acción de automatización:
if (StackTraceUtils.isCallingMe(this.getClass().getName())) { log.info("Recursion detected"); return;}Ejemplo
Sección titulada «Ejemplo»Clase AddKeyword:
package com.openkm.plugin.automation.action;
import com.openkm.core.Config;import com.openkm.db.bean.Automation;import com.openkm.db.bean.AutomationRule.EnumEvents;import com.openkm.db.service.NodeBaseSrv;import com.openkm.plugin.BasePlugin;import com.openkm.plugin.automation.Action;import com.openkm.plugin.automation.AutomationException;import com.openkm.plugin.automation.AutomationUtils;import net.xeoh.plugins.base.annotations.PluginImplementation;import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.stream.Collectors;import java.util.stream.Stream;
/** * AddKeyword */@PluginImplementationpublic class AddKeyword extends BasePlugin implements Action {
private static ArrayList<EnumEvents> EVENTS_AT_PRE = new ArrayList<>();
private static ArrayList<EnumEvents> EVENTS_AT_POST = Stream.of(EnumEvents.EVENT_DOCUMENT_CREATE, EnumEvents.EVENT_DOCUMENT_UPDATE, EnumEvents.EVENT_DOCUMENT_DELETE, EnumEvents.EVENT_DOCUMENT_RENAME, EnumEvents.EVENT_DOCUMENT_MOVE, EnumEvents.EVENT_DOCUMENT_RESTORE_VERSION, EnumEvents.EVENT_DOCUMENT_DOWNLOAD_FROM_UI, EnumEvents.EVENT_DOCUMENT_DOWNLOAD_FROM_UI_FOR_PREVIEW, EnumEvents.EVENT_DOCUMENT_PRINT, EnumEvents.EVENT_DOCUMENT_STAMP, EnumEvents.EVENT_RECORD_CREATE, EnumEvents.EVENT_RECORD_DELETE, EnumEvents.EVENT_FOLDER_CREATE, EnumEvents.EVENT_FOLDER_DELETE, EnumEvents.EVENT_MAIL_CREATE, EnumEvents.EVENT_MAIL_DOWNLOAD_FROM_UI, EnumEvents.EVENT_LINK_CREATE, EnumEvents.EVENT_TEXT_EXTRACTOR, EnumEvents.EVENT_PROPERTY_GROUP_ADD, EnumEvents.EVENT_PROPERTY_GROUP_SET, EnumEvents.EVENT_PROPERTY_GROUP_REMOVE, EnumEvents.EVENT_MAIL_IMPORT_ATTACHMENTS ).collect(Collectors.toCollection(ArrayList::new));
@Autowired private NodeBaseSrv nodeBaseSrv;
@Autowired private AutomationUtils automationUtils;
@Override public void executePre(Map<String, Object> env, Object... params) throws AutomationException { }
@Override public void executePost(Map<String, Object> env, Object... params) throws AutomationException { try { String keyword = automationUtils.getString(0, params); String uuid = automationUtils.getNodeToEvaluate(env).getUuid();
if (uuid != null && keyword != null && !keyword.isEmpty()) { if (Config.SYSTEM_KEYWORD_LOWERCASE) { keyword = keyword.toLowerCase(); }
nodeBaseSrv.addKeyword(uuid, keyword); } } catch (Exception e) { throw new AutomationException("AddKeyword exception", e); } }
@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 ""; }
@Override public List<EnumEvents> getValidEventsAtPre() { return EVENTS_AT_PRE; }
@Override public List<EnumEvents> getValidEventsAtPost() { return EVENTS_AT_POST; }}