Crear su propio plugin de validador de formularios
Validación de un solo campo
Sección titulada «Validación de un solo campo»Los validadores de formulario se utilizan para implementar lógica compleja que debe evaluarse desde el lado del servidor y que no queda cubierta por el elemento Metadata Validator 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 de validación OCR debe estar anotada con “@PluginImplementation”.
- La nueva clase Automation Validation debe extender “BasePlugin”.
Interfaz Form Validator:
package com.openkm.plugin.form;
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 utilizado en la lista de selección del formulario. |
| validate(String value, List |
String | Cuando la cadena devuelta 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 UUID de los nodos afectados (documentos, carpetas, correos, registros). Si solo se va a actualizar un nodo (el caso habitual), la lista contendrá un único 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 validador de formularios
Sección titulada «Ejemplo de implementación de un validador de formularios»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.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 validadores de formulario se utilizan para implementar lógica compleja que debe evaluarse desde el lado del servidor y que no queda cubierta por el elemento Metadata Validator por defecto.
Puede crear su propio Form Validator.
Condiciones:
- La nueva clase de Automation Validation debe implementar la interfaz “Validation”.
- La nueva clase Form Validator debe declararse bajo el paquete “com.openkm.plugin.form.validator”.
- La nueva clase de validación OCR debe estar anotada con “@PluginImplementation”.
- La nueva clase Automation Validation debe extender “BasePlugin”.
Interfaz Form Validator:
package com.openkm.plugin.form;
import net.xeoh.plugins.base.Plugin;
import java.util.List;
/** * 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 utilizado en la lista de selección del formulario. |
| validate(NodeBase node, String grpName, Map<String, String> properties, boolean fullValidation) | Void | Cuando se encuentra un error, debe lanzar 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 mapa con todos los valores de metadatos establecidos por el usuario. La variable fullValidation se establece en true al comprobar si un nodo puede promoverse a registro. |
Ejemplo de implementación de un validador de formularios
Sección titulada «Ejemplo de implementación de un validador de formularios»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="First number" name="okp:full.number1"></input> <input label="Second number" name="okp:full.number2"></input> <input label="Third number" 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"; }}