Groovy

Por varias razones he tenido que procesar un fichero en CSV sencillo y para ello me aproveche de ciertas facilidades de Groovy. A continuación pongo el código utilizado.

Código de la clase de dominio que almacena:

class Pais {

 def descripcion

}

Código del procesado:

def pathTemporal =  System.getProperty("java.io.tmpdir")

def pathFichero = pathTemporal + '/pais.csv'

def fich = new File (pathFichero)

def array = fich.readBytes()

def cadena = new String (array)

def lista = cadena.replace('\n','#').tokenize('#')

def patron = []

def primera = true

lista.each {linea->

    def lineaProcesada = linea.tokenize(';')

    if (primera == true) {

        patron = lineaProcesada

        primera = false

    } else {

        def mapa = [:]

        def valores = lineaProcesada

        def i = 0

        patron.each{clave->

            if ((clave?.trim()?.size() > 0) || (valores[i]?.trim()?.size() > 0)) {

                mapa."$clave" = valores[i]

                i++

            } 

        }

        def temp = new Pais (mapa)

    }

}
Groovy

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

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)
              }
           }
    }
}

}
}

Definición de Bean

<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>

Enlaces de Referencia:

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.

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
}

Enlaces de Referencia

Groovy

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

Date to XMLGregorianCalendar

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}"

Salida

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

Groovy

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

XMLGregorianCalendar to Date

import javax.xml.datatype.DatatypeFactory
def calendar = new GregorianCalendar()
calendar.setTime ( new Date ())
def alfa  = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar)

println "Tipo final ${alfa.toGregorianCalendar().getTime().class.name}"

Salida

tipo final java.util.Date

Entradas siguientes »