martes, 28 de agosto de 2007

Validación usando validation.xml, validator-rules.xml y un validador propio

Problema: Hacer un validador externo para ser usado desde el validation.xml.

Solución:
1.- Hago una clase que tenga mi método de validación

public class MiValidation implements Serializable{

/**
* Valida un dce con el formato de dos dígitos seguidos de una barra y luego 4 dígitos. Ej.: 33/12345
* @return false si no hubo error, true si hubo algún error
*/
public static boolean validateDCE(java.lang.Object bean,
org.apache.commons.validator.ValidatorAction va,
org.apache.commons.validator.Field field, ActionMessages errors,
Validator validator, javax.servlet.http.HttpServletRequest request) {
// reflejamos el metodo en el logger
if (ValidationCortas.logger.isDebugEnabled()) {
ValidationCortas.logger
.debug("ValidationCortas: Método validateDCE");
}

// miramos si el objeto es un string
String value = null;
if (MiValidation.isString(bean)) {
// metemos el string en la variable value
value = ((String) bean);
} else {
// obetenemos el valor del bean
value = ValidatorUtils.getValueAsString(bean, field.getProperty());
}

// comprobamos que tenga algo
if (!GenericValidator.isBlankOrNull(value)) { //esa función es propia es para que no sea null o cadena vacía
String expReg = "^(\\d{2})(/\\d{4})$"; //ej.: 33/12345
boolean mach=value.matches(expReg);
if (value.matches(expReg) ){
return (false);
}else{
errors.add(field.getKey(), Resources.getActionMessage(request, va,
field));
return (true);

}
}
return (false);
}

/**
* Método que determina si el objeto es o no de tipo String
*
* @param Object o, el objeto a analizar
* @return boolean true si es String, false en caso contrario o si es null
*/
private static boolean isString(Object o) {
// si es null, es string
if (o == null) {
return (true);
}
return (String.class.isInstance(o));
}

} //fin de la clase


2.-En el validator-rules hago un validador. El msg lo extraerá del ApplicationResources respectivo. Nota: Quitar los espacios luego del '<'

< validator name="validateDCE"
classname="es.mipaquete.web.validator.MiValidation"
method="validateDCE"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.invalid.dce" >
< /validator>


3.-En el validation.xml, indico que campo del formulario está sometido a la validación. En el ejemplo muestro como colocar para el form. El key que coloco lo
extraerá del ApplicationResources respectivo. Nota: Quitar los espacios luego del '<'


< formset>
< form name="miFormBase">
< field property="maderistaForm.calificacionEmpresarial" depends="validateDCE">
< arg0 key="error.maderista.calificacionEmpresarial" name="validateDCE"/>
< /field>
< /form>
< /formset>


4.-En el ApplicationResources meto las variables necesarias:

errors.invalid.dce=\"{0}\" debe ser un DCE válido, ejemplo: 33/9999.
error.maderista.calificacionEmpresarial = Documento de Calificación Empresarial


5.-Queda colocar en struts que el validate=true y el input en el action correspondiente.

miércoles, 22 de agosto de 2007

Ordenando una lista Collections

Para ordenar una lista en Java, basta con implementar un comparador y hacer una llamada a la clase Collections. Incluso puede hacerse con una clase anónima como es el ejemplo que les muestro:


LinkedList solicitudes = new LinkedList();
/*imaginemos que miDelegate.getSolicitudes() me devuelve una lista LinkedList donde cada elemento es un objeto de tipo MiObjeto, que lo que tiene es un atributo long llamado id*/
solicitudes = miDelegate.getSolicitudes();

Collections.sort(solicitudes,
new Comparator()
{
/**
* Metodo encargado de realizar la comparacion.
* Ordena descendentemente por el identificador.
*/
public int compare(Object a, Object b)
{
long idA = Long.parseLong(((MiObjeto)a).getId());
long idB = Long.parseLong(((MiObjeto)b).getId());

if (idA>idB){
return -1;
}else if (idA<idB){
return 1;
}else{//son iguales
return 0;
}
}
}
);