Manipular Definición de un Bean Spring

Por razones diversas he tenido que buscar una forma de modificar la definición de un Bean en Spring, de tal manera que una propiedad fuera modificada según un valor que fuera cargado desde el fichero de configuración, en este caso Config.groovy.
El código a continuación ilustra la forma de utilizar BeanFactoryPostProcessor para poder manipular la definición de un Bean durante la carga. Y MutablePropertyValues para poder manipular las propiedades de un Bean.

Código Groovy

[sourcecode language=»groovy»]
import org.springframework.beans.factory.config.BeanFactoryPostProcessor
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
import org.springframework.beans.factory.config.BeanDefinition
import org.springframework.beans.MutablePropertyValues
import org.springframework.beans.PropertyValue
import org.springframework.beans.BeansException
import org.codehaus.groovy.grails.commons.ConfigurationHolder

//Manejo de Cadenas
import org.apache.commons.lang.StringUtils

//Logger
import org.apache.commons.logging.Log
import org.apache.commons.logging.LogFactory

/**
* Clase que implementa un Post Configurador que nos permite navegar entre todos los
* Beans y en el caso de encontrar una propiedad "@grails.configuration.alfa" cambiará
* el valor de esa propiedad por el valor de la variable a partir de la @ y en el caso
* de no existir esa variable se utilizará como valor la cadena a partir de la @.
*
* @author ubaydm
*
*/
public class GrailsConfigConfigure implements BeanFactoryPostProcessor {
protected static final Log logger = LogFactory.getLog(GrailsConfigConfigure.class)

void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
logger.info (">> Reconfigurando Beans en la aplicación")
def beansPresentes = beanFactory.getBeanDefinitionNames()
//Ahora cargo por cada Bean por su nombre

beansPresentes.each {
def beanActual = it
logger.info (">>> Procesando el Bean $beanActual")
BeanDefinition beanCargado = (BeanDefinition)beanFactory.getBeanDefinition (beanActual)

MutablePropertyValues mutablePropertys = beanCargado.getPropertyValues()
//En caso de que el Bean no tenga propiedades no se procesa
if (mutablePropertys.size() > 0) {
//Obtención de la propiedades
PropertyValue[] propiedades = mutablePropertys.getPropertyValues()
propiedades.each { propiedad ->
def namePropiedad = propiedad.getName ()
logger.info (">>>> Procesando la propiedad $namePropiedad")
def valorActual = propiedad.getValue ()

if (valorActual.contains(‘@’)) {

def valorParaCambio = StringUtils.substringAfter (valorActual, "@")
def valorNuevo = valorConfiguracion (valorParaCambio)

logger.info (">>>>> Cambiando la propiedad $namePropiedad por $valorNuevo")
PropertyValue propiedad = mutablePropertys.getPropertyValue(namePropiedad)

PropertyValue nuevaPropiedad = new PropertyValue (address, valorNuevo)
mutablePropertys.setPropertyValueAt(nuevoAddress, 0)
}
}
}
}

}
}
[/sourcecode]

Definición de Bean

[sourcecode language=»xml»]
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cxf="http://cxf.apache.org/core"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">

<bean class="GrailsConfigConfigure"/>

<jaxws:endpoint id="beanAModificarId"
implementorClass="BeanModificado"
implementor="#beanModificado"
propiedad="@propiedad.en.config">
</jaxws:endpoint>

</beans>
[/sourcecode]

Enlaces de Referencia:

Publicado en Groovy | Deja un comentario

Detectar si un Nif es correcto en Groovy

En estos días he tenido que buscar una forma de detectar si un Nif español era o no válido para lo que me he ayudado de la Wikipedia. Y a continuación expongo lo que he hecho.

Función para detectar Nif correcto.

[sourcecode language=»groovy»]
def nifValido (nif) {
if (nif == "")
return false
def n = nif.toUpperCase()
String NIF_STRING_ASOCIATION = "TRWAGMYFPDXBNJZSQVHLCKET"
def dni = n[0..-2].toInteger()
if ((n ==~ /^[0-9]{8}[A-Za-z]$/) && (n.contains(NIF_STRING_ASOCIATION.charAt(dni % 23).toString()))){
log.info ("El nif $n es correcto")
return true
}
log.info ("El nif $n No es correcto")
return false
}
[/sourcecode]

Enlaces de Referencia

Publicado en Groovy | Etiquetado , , | 1 comentario

Date to XMLGregorianCalendar

Por diferentes razones he tenido que manipular el tipo XMLGregorianCalendar. Y a continuación pongo todo lo que he aprendido.

Date to XMLGregorianCalendar

[sourcecode language=»groovy»]
import javax.xml.datatype.DatatypeFactory
def calendar = new GregorianCalendar()
calendar.setTime ( new Date ())
def alfa  = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar)

println "Tipo Final ${alfa.class.name}"
[/sourcecode]

Salida

Tipo Final com.sun.org.apacha.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl

Publicado en Groovy | Etiquetado , , , , | Deja un comentario