Creación de su propio plugin Form Validator
Validación de un solo campo
Sección titulada «Validación de un solo campo»Los validadores de formularios se utilizan para implementar lógica compleja que debe evaluarse mediante lógica del lado del servidor y que no está cubierta por el elemento Metadata Validator predeterminado.
Usted puede crear su propio Form Validator.
Condiciones:
- La nueva clase Form Validator debe implementar la interfaz “FieldValidator”.
- La nueva clase Form Validator debe declararse dentro del paquete “com.openkm.plugin.form.validator”.
- La nueva clase Form Validator debe estar anotada con “@PluginImplementation”.
- La nueva clase Form Validator 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 allí.
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 el selector de la lista de formularios. |
| validate(String value, List |
String | Si 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 los UUID son la lista de UUID de los nodos afectados (documentos, carpetas, correos, expedientes). 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 se deben aplicar los cambios de metadatos. |
Ejemplo de implementación del Form validator
Sección titulada «Ejemplo de implementación del 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 denominado 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 formularios se utilizan para implementar lógica compleja que debe evaluarse mediante lógica del lado del servidor y que no está cubierta por el elemento Metadata Validator predeterminado.
Usted puede crear su propio Form Validator.
Condiciones:
- La nueva clase Form Validator debe implementar la interfaz “FormValidator”.
- La nueva clase Form Validator debe declararse dentro del paquete “com.openkm.plugin.form.validator”.
- La nueva clase Form Validator debe estar anotada con “@PluginImplementation”.
- La nueva clase Form Validator 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 allí.
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 el selector de la lista de formularios. |
| validate(NodeBase node, String grpName, Map<String, String> properties, boolean fullValidation) | Void | Cuando se encuentra un error, el método debe lanzar una excepción de tipo ValidationFormException. La variable node es el nodo de OpenKM en el que 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 cuando se comprueba si un nodo puede promoverse a expediente. |
Ejemplo de implementación del Form validator
Sección titulada «Ejemplo de implementación del 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="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"; }}