Ir al contenido
Otras versiones

Cargando…

Creación de su propio plugin Form Validator

Los validadores de formulario se usan para implementar lógica compleja que debe evaluarse en el lado del servidor y que no está 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 Form Validator debe anotarse 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 ahí.

Method Type Description
getName() String El método devuelve el nombre del plugin usado en el selector de lista del formulario.
validate(String value, List uuids) 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 UUIDs 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 deben aplicarse 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 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;
@PluginImplementation
public 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;
}
}

Los validadores de formulario se usan para implementar lógica compleja que debe evaluarse en el lado del servidor y que no está cubierta por el elemento Metadata Validator 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;
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í.

Method Type Description
getName() String El método devuelve el nombre del plugin usado en el selector de lista del formulario.
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 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 promocionarse 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="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;
@PluginImplementation
public 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";
}
}