Crear su propio plugin de Form Validator
Validación de un único campo
Sección titulada «Validación de un único campo»Los form validators se usan para implementar lógica compleja que debe evaluarse en el lado del servidor y que no cubre el Metadata Validator element por defecto.
Puede crear su propio Form Validator.
Condiciones:
- La nueva clase Form Validator debe implementar la interfaz “FieldValidator”.
- La nueva clase Form Validator debe declararse bajo el paquete “com.openkm.plugin.form.validator”.
- La nueva clase Form Validator debe anotarse con “@PluginImplementation”.
- La nueva clase Form Validator debe extender “BasePlugin”.
Interfaz Form Validator:
package com.openkm.plugin.form.validator;
import net.xeoh.plugins.base.Plugin;
import java.util.List;
/** * FieldValidator */public interface FieldValidator extends Plugin {
String getName();
String validate(String value, List<String> uuids);}La nueva clase debe cargarse en el paquete com.openkm.plugin.form.validator 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»| Método | Tipo | Descripción |
|---|---|---|
| getName() | String | El método devuelve el nombre del plugin usado en el selector de la lista de formularios. |
| validate(String value, List |
String | Cuando el texto devuelto es igual a “”, la aplicación considera que todo es correcto; en caso contrario, el texto devuelto es el error. La variable value contiene el valor del campo de metadatos, y uuids es la lista de UUIDs de los nodos afectados (documentos, carpetas, correos, expedientes). Si solo se va a actualizar un nodo (el caso habitual), la lista contendrá solo un uuid. Si se seleccionan varios nodos, contendrá la lista de todos los nodos seleccionados a los que deben aplicarse los cambios de metadatos. |
Ejemplo de implementación de un Form validator
Sección titulada «Ejemplo de implementación de un Form validator»Definición de metadatos:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE property-groups PUBLIC "-//OpenKM//DTD Property Groups 3.10//EN" "http://www.openkm.com/dtd/property-groups-3.10.dtd"><property-groups> <property-group label="Technology" name="okg:technology"> <input label="Title" type="text" name="okp:technology.title"/> <input label="Date" type="date" name="okp:technology.date" /> <textarea label="Description" name="okp:technology.description"/> <select label="Type" name="okp:technology.type" type="multiple"> <option label="New Product" value="t1"/> <option label="New Feature" value="t2" /> <option label="Customatization" value="t3" /> <option label="Integration" value="t4" /> <option label="Quality" value="t5" /> <option label="Other" value="t6" /> </select> <select label="Priority" name="okp:technology.priority" type="simple"> <option label="low" value="low"/> <option label="Medium" value="Medium"/> <option label="High" value="High" /> </select> <textarea label="Comment" name="okp:technology.comment"> <validator type="plugin" parameter="com.openkm.plugin.form.validator.DuplicateDocumentNumberValidator"/> </textarea> <input label="Link" type="link" name="okp:technology.link"/> </property-group></property-groups>En este ejemplo, no se permitirán dos comentarios idénticos en el campo de metadatos llamado okp:technology.comment.
package com.openkm.plugin.form.validator;
import java.util.ArrayList;import java.util.List;
import com.openkm.module.db.stuff.DbSessionManager;import com.openkm.plugin.form.validator.FieldValidator;import org.springframework.beans.factory.annotation.Autowired;
import com.openkm.api.OKMRelation;import com.openkm.bean.Relation;import com.openkm.db.service.LegacySrv;import com.openkm.plugin.BasePlugin;
import net.xeoh.plugins.base.annotations.PluginImplementation;
@PluginImplementationpublic class DuplicateDocumentNumberValidator extends BasePlugin implements FieldValidator {
@Autowired private LegacySrv legacySrv;
@Autowired private OKMRelation okmRelation;
@Override public String getName() { return "Duplicated document number"; }
@Override public String validate(String value, List<String> uuids) { String validate = ""; String token = DbSessionManager.getInstance().getSystemToken(); String sql = "SELECT RGT_UUID FROM OKM_PGRP_CUR_TECHNOLOGY WHERE RGT_PRO_COMMENT='" + value + "'";
try { List<List<String>> result = legacySrv.executeSQL(sql); if (result.size() > 0) { if (uuids.isEmpty()) { validate = "Duplicated document number"; } else { List<String> allowedUuids = new ArrayList<>(); for (String uuid : uuids) { allowedUuids.add(uuid); List<Relation> relations = okmRelation.getRelations(token, uuid); for (Relation relation : relations) { allowedUuids.add(relation.getNode()); } }
for (List<String> resultList : result) { if (!allowedUuids.contains(resultList.get(0))) { validate = "Duplicated document number"; } } } } } catch (Exception e) { validate = e.getMessage(); }
return validate; }}Validación completa del formulario
Sección titulada «Validación completa del formulario»Los form validators se usan para implementar lógica compleja que debe evaluarse en el lado del servidor y que no cubre el Metadata Validator element por defecto.
Puede crear su propio Form Validator.
Condiciones:
- La nueva clase Form Validator debe implementar la interfaz “FormValidator”.
- La nueva clase Form Validator debe declararse bajo el paquete “com.openkm.plugin.form.validator”.
- La nueva clase Form Validator debe anotarse con “@PluginImplementation”.
- La nueva clase Form Validator debe extender “BasePlugin”.
Interfaz Form Validator:
package com.openkm.plugin.form.validator;
import com.openkm.core.ValidationFormException;import com.openkm.db.bean.NodeBase;import net.xeoh.plugins.base.Plugin;
import java.util.Map;
/** * FormValidator * */public interface FormValidator extends Plugin { void validate(NodeBase node, String grpName, Map<String, String> properties, boolean fullValidation) throws ValidationFormException;
String getName();}La nueva clase debe cargarse en el paquete com.openkm.plugin.form.validator 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»| Método | Tipo | Descripción |
|---|---|---|
| getName() | String | El método devuelve el nombre del plugin usado en el selector de la lista de formularios. |
| validate(NodeBase node, String grpName, Map<String, String> properties, boolean fullValidation) | Void | Cuando se encuentra un error, debe lanzarse una excepción de tipo ValidationFormException. La variable node es el nodo de OpenKM donde el usuario añadió o actualizó los metadatos. grpName es el nombre del grupo de metadatos. La variable properties contiene un map con todos los valores de metadatos establecidos por el usuario. La variable fullValidation se establece en true al comprobar si un nodo puede promocionarse a expediente. |
Ejemplo de implementación de un Form validator
Sección titulada «Ejemplo de implementación de un Form validator»Definición de metadatos:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE property-groups PUBLIC "-//OpenKM//DTD Property Groups 3.10//EN" "http://www.openkm.com/dtd/property-groups-3.10.dtd"><property-groups> <property-group label="Full validation" name="okg:full" validatorClassName="com.openkm.plugin.form.validator.FullMetadataValidationSample"> <input label="Field 1" name="okp:full.number1"></input> <input label="Field 2" name="okp:full.number2"></input> <input label="Field 3" name="okp:full.number3"></input> </property-group></property-groups>En este ejemplo, los campos deben tener valores numéricos y field1 < field2 < field3:
import com.company.MetadataConstants;import com.openkm.bean.form.ValidationError;import com.openkm.core.ValidationFormException;import com.openkm.db.bean.NodeBase;import com.openkm.plugin.BasePlugin;import net.xeoh.plugins.base.annotations.PluginImplementation;
import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;
@PluginImplementationpublic class FullMetadataValidationSample extends BasePlugin implements FormValidator {
@Override public void validate(NodeBase nodeBase, String grpName, Map<String, String> properties, boolean fullValidation) throws ValidationFormException { Map<String, List<ValidationError>> errors = new HashMap<>(); List<ValidationError> validationErrors = new ArrayList<>(); String field1 = properties.get(MetadataConstants.LOCATION_PROPERTY_NUMBER1_NAME); String field2 = properties.get(MetadataConstants.LOCATION_PROPERTY_NUMBER2_NAME); String field3 = properties.get(MetadataConstants.LOCATION_PROPERTY_NUMBER3_NAME); int field1Values = 0; int field2Values = 0; int field3Values = 0;
// Parse integer try { field1Values = Integer.parseInt(field1); } catch (Exception e) { ValidationError validationError = new ValidationError(); validationError.setErrorMessage("Field 1 seems does not contain an integer"); validationError.setPropertyName(MetadataConstants.LOCATION_PROPERTY_NUMBER1_NAME); validationError.setErrorCode("ERROR-003345"); validationError.setPropertyLabel("First number"); validationError.setUuid(nodeBase.getUuid()); validationErrors.add(validationError); }
try { field2Values = Integer.parseInt(field2); } catch (Exception e) { ValidationError validationError = new ValidationError(); validationError.setErrorMessage("Field 2 seems does not contain an integer"); validationError.setPropertyName(MetadataConstants.LOCATION_PROPERTY_NUMBER2_NAME); validationError.setErrorCode("ERROR-003345"); validationError.setPropertyLabel("First number"); validationError.setUuid(nodeBase.getUuid()); validationErrors.add(validationError); }
try { field3Values = Integer.parseInt(field3); } catch (Exception e) { ValidationError validationError = new ValidationError(); validationError.setErrorMessage("Field 3 seems does not contain an integer"); validationError.setPropertyName(MetadataConstants.LOCATION_PROPERTY_NUMBER2_NAME); validationError.setErrorCode("ERROR-003345"); validationError.setPropertyLabel("First number"); validationError.setUuid(nodeBase.getUuid()); validationErrors.add(validationError); }
// Field2 value greather than field1 if (field2Values < field1Values) { ValidationError validationError = new ValidationError(); validationError.setErrorMessage("Field 1 is greater than field2"); validationError.setPropertyName(MetadataConstants.LOCATION_PROPERTY_NUMBER2_NAME); validationError.setErrorCode("ERROR-003345"); validationError.setPropertyLabel("Second number"); validationError.setUuid(nodeBase.getUuid()); validationErrors.add(validationError); }
// Field2 value greather than field1 if (field3Values < field2Values) { ValidationError validationError = new ValidationError(); validationError.setErrorMessage("Field 2 is greater than field3"); validationError.setPropertyName(MetadataConstants.LOCATION_PROPERTY_NUMBER3_NAME); validationError.setErrorCode("ERROR-003345"); validationError.setPropertyLabel("Second number"); validationError.setUuid(nodeBase.getUuid()); validationErrors.add(validationError); }
if (validationErrors.size() > 0) { errors.put("Validation was not successfully", validationErrors); throw new ValidationFormException(errors); } }
@Override public String getName() { return "Full metadata validation sample"; }}