lunes, mayo 09, 2011

Creacion De Archivos III (Archivos para Batch, con el Framework flatworm)

Esta es la tercera y ultima forma que posteare para poder crear archivos con informacion masiva

esta ocacion utilizaremos un framework llamafo "FLATWORM" el cual tiene la caracteristica de mapear en un archivo xml una o mas clases (de aqui en adelante Beans), en este archivo xml definiremos:

1.- Longitudes de campos
2.- Tipo de dato del campo
3.- Posicion del campo sobre el archivo
4.- Caracteres de relleno
5.- Formato a convertir un dato (conversion de fechas, alineacion de la informacion)


Iniciemos la construccion de archivos con flatworm


1. Crearemos un proyecto java, y le agregaremos 4 jars

     commons-beanutils.jar 
     commons-collections.jar (para mi caso utilizare la version 3.0) 
     commons-logging.jar
     flatworm.jar (para mi caso utiliare la version 2.0.1)  

*siendo los primeros 3 de apache 

2. procedamos a crear 4 paquetes

     com.archivos.bean
     com.archivos.configurador
     com.archivos.escritura
     com.archivos.main

3.- en el paquete com.archivos.bean crearemos un bean llamado Productos con las siguientes variables

     enExistencia           int
     nombre                   String
     codigo                    String
     fechaInventario        String
     vendidas                 int

con sus metodos get y set

4.- sobre escribiremos el metodo toString del bean quedando lo siguiente

public String toString(){
    return enExistencia + nombre + codigo + fechaInventario + vendidas;


5.- crearemos en el paquete com.archivos.configurador una clase llamada DatosIniciales que contendra las siguientes variables
     nombreArchivo
     rutaSubidaArchivo
     archivoWarm
     beanWarm
     recordWarm

6.- en el paquete com.archivos.escritura crearemos una clase llamada EscrituraArchivo quedando de la siguiente forma

    private FileCreator archivo; //clase encargada de crear y escribir sobre el archivo
    private DatosIniciales datos; 
 
     
     // Metodo que crea el archivo, el constructor de FileCreator recibe como primer parametro
     //la ruta y nombre del archivo xml y como segundo parametro el nombre y ruta del archivo
     //que se creara
     public void abrirArchivo(){
        try {
            archivo = new FileCreator(getDatos().getArchivoWarm(), getDatos().getRutaSubidaArchivo() + getDatos().getNombreArchivo());
            archivo.open();           
        } catch (FlatwormCreatorException e) {
            System.out.println("Error al crear el archivo");
        } catch (UnsupportedEncodingException e) {
            System.out.println("Codificacion del archivo no aceptada");
        }
    }
    

     //clase que se encargara de cerrar el archivo creado
    public void cerrarArchivo(){       
        try {
            if(archivo != null){
            archivo.close();
            }
        } catch (IOException e) {
            System.out.println("Error al cerrar el archivo");
        }
    }
    

     //clase encargada de escribir sobre el archivo, recibe como parametros el bean
     //el metodo setBean recibe como parametros el nombre de nuestro bean, pero como esta
     //mapeado en nuestro arhivo xml, como segundo parametro nuestro bean
     //le agregamos un recordSeparator para que haga saltos de linea(esto es por que bloc de      //notas no reconocera los saltos de linea, cualquier otro editor si)
     //el metodo write se encarga de escribir y recibe como parametros el recordWarm que
     //hemos mapeado en nuestro xml
    public void escribir(Productos bean){       
        try {
            archivo.setBean(getDatos().getBeanWarm(), bean);
            archivo.setRecordSeperator("\r\n");       
            archivo.write(getDatos().getRecordWarm());
        } catch (FlatwormCreatorException e) {
            System.out.println("Error en el FlatWormCreator");
        } catch (IOException e) {
            System.out.println("Error de IO");
        }
    } 



7.- en el paquete com.archivos.main crearemos un metodo ArmarArchivos
que quedara de la siguiente forma


    EscrituraArchivo escritura;
    DatosIniciales datos;
   
    public ArmarArchivos(){
        escritura = new EscrituraArchivo();
        datos = new DatosIniciales();
    }



    //este metodo hara las veces de una consulta a una bd, solo para el ejemplo :)
    public List<Productos> consultar(){
        List<Productos> productos = new ArrayList<Productos>();
        Productos producto1 = new Productos();
        Productos producto2 = new Productos();
        Productos producto3 = new Productos();
       
        producto1.setCodigo("aaxd");
        producto1.setEnExistencia(10);
        producto1.setFechaInventario("09/05/2011");
        producto1.setNombre("aspirina");
        producto1.setVendidas(5);
       
        producto2.setCodigo("zzsd");
        producto2.setEnExistencia(20);
        producto2.setFechaInventario("05/05/2011");
        producto2.setNombre("melox");
        producto2.setVendidas(1);
       
        producto3.setCodigo("xxxxxxxxxx");
        producto3.setEnExistencia(50);
        producto3.setFechaInventario("09/04/2011");
        producto3.setNombre("desodorante");
        producto3.setVendidas(10);
       
        productos.add(producto1);
        productos.add(producto2);
        productos.add(producto3);
       
        return productos;
    }



    public static void main(String[] args) {
        ArmarArchivos armar = new ArmarArchivos();       
        

        // asignacion de informacion a la clase datos
        System.out.println("Asignando Datos ...");       
        armar.datos.setArchivoWarm("D:\\ejemplosJavaLimos\\ProductosXML.xml");
        armar.datos.setBeanWarm("productosBean");//esta en el xml
        armar.datos.setNombreArchivo("EjemploFlatWorm.txt");
        armar.datos.setRecordWarm("productosBeanW");//esta en el xml
        armar.datos.setRutaSubidaArchivo("D:\\
ejemplosJavaLimos\\");
        armar.escritura.setDatos(armar.datos);
       
        List<Productos> resultados = armar.consultar();
 

        System.out.println("Armando Archivos ...");        
        armar.escritura.abrirArchivo();
        for(Productos producto : resultados){
            armar.escritura.escribir(producto);
        }
        armar.escritura.cerrarArchivo();

    }
     
 8.- hemos hablado de un bendito archivo xml, pues ahora lo presento, se llamara ProductosXML.xml 

< ?xml version="1.0" encoding="ISO-8859-1"? >
< file-format >
   
 < converter name="char" class="com.blackbear.flatworm.converters.CoreConverters" method="convertChar" return-type="java.lang.String"/ >
      < converter name="int" class="com.blackbear.flatworm.converters.CoreConverters" method="convertInteger" return-type="java.lang.Integer"/ >
     < record name="productosBeanW" >
         < record-ident >
            < length-ident minlength="45" maxlength="45" / >
        < /record-ident >
        < record-definition >
            < bean name="productosBean" class="com.archivos.bean.Productos"/ >
            < line >
                < record-element length="5" beanref="productosBean.enExistencia" type="int" >
                    < conversion-option name="justify" value="left"/ > 
                    < conversion-option name="pad-character" value=" " / > 
                < /record-element >
                < record-element length="20" beanref="productosBean.nombre" type="char" >
                    < conversion-option name="justify" value="right"/> 
                    < conversion-option name="pad-character" value="-" / >
                < /record-element >
                < record-element length="5" beanref="productosBean.codigo" type="char" >
                    < conversion-option name="justify" value="right"/ > 
                    < conversion-option name="pad-character" value="@" / >
                < /record-element>
                < record-element length="10" beanref="productosBean.fechaInventario" type="char" >
                    < conversion-option name="justify" value="right"/ > 
                    < conversion-option name="pad-character" value=" " / > 
                < /record-element >
                < record-element length="5" beanref="productosBean.vendidas" type="int" >
                    < conversion-option name="justify" value="right"/ > 
                    < conversion-option name="pad-character" value=" "  />
                < /record-element >               
            < /line >
        < /record-definition >

    < /record >
< /file-format > 


**DONDE: 

*Las Etiquetas converter, definiran el tipo de variable, en este caso recibire int y String, por lo tanto declarare una del tipo in y una del tipo char(no String)  

*Nuestro record se llamara productosBeanW, dentro de el podemos tener multiples beans, por eso la diferencia

*Dentro del bloque record-ident definimos la longitud maxima y minima de cada linea a escribir, esto mas que nada sirve a la hora de lectura, para diferenciar por ejemplo entre lineas de encabezado, pie de pagina, etc...

*Definimos nuestro bean, dandole nombre y la ruta dentro de nuestro proyecto

*Dentro del bloque linea, definimos nuestros elementos (variables del bean), dandole una longitud y un tipo de dato

*Entre el bloque record-element definimos las caracteristicas que tendra el campo como, el alineado, por ejemplo tenemos alineaciones a la derecha y a la izquierda, tambien podemos definir caracteres de relleno, es decir si el valor de un campo es menor a la longitud establecida, el resto se rellenara con los caracteres, tenemos 3 casos para el ejemplo, un espacion, un guion medio y un @

*Podemos definir valores por default formatear fechas entre otras opciones por medio de la etiqueta conversion-option



*Esto nos ayudara a no recompilar nuestro codigo, si las longitudes cambian, u otra cosa que no afecte al tipo de variable que se esta utilizando


*Al definir una longitud para cada campo, en caso de que sea rebasado por alguna variable, el valor de la variable sera cortado para adecuarse a la longitud


9.- Al final la salida de nuestro archivo queda:


10   ------------aspirina@aaxd09/05/2011    5
20   ---------------melox@zzsd05/05/2011    1
50   ---------desodorantexxxxx09/04/2011   10


si observas bien, el codigo del tercer producto fue cortado, la variable enExistencia se alineo a la izquierda y la variable vendidas se alineo a la derecha, la variable nombres se relleno con guines medios y la variable codigo con @

Perdon si describi poco, solo q estoy en el trabajo, pero cualquier cosa dejen sus comentarios y con gusto haremos algo al respecto


4 comentarios:

  1. Buenos dias, interesante articulo lo estoy leyendo y me ha ayudado mucho a entender un poco mas y mejor flatworm, disculpa no podrias subir el codigo fuente.

    Gracias.

    ResponderEliminar
  2. ok. en un rato subire las fuentes
    saludos! ! !

    ResponderEliminar
  3. Ya no pondrás mas articulos relacionados a flatworm? Donde puedo descargar el codigo fuente?

    Gracias.

    ResponderEliminar
  4. que tal, ya hay una entrada sobre la lectura de archivos con flatworm, y los fuentes aun no los he subido... este fin lo hare ya q por ahora estoy algo ocupadon en el trabajo.. pero si deceas algo en especifico sobre el framework comentalo y con gusto hare algo al respecto

    ResponderEliminar