Conheçam o FFPOJO – Flat File Pojo Parser

Olá pessoal… meus colegas de trabalho mais próximos já conhecem o projeto FFPOJO, mas eu ainda estava devendo um post dedicado a ele aqui no meu blog.

A idéia começou quando percebi quem em 60% dos projetos em que eu estava atuando, de uma forma ou outra, trabalhavam em algum momento com arquivos texto… importações de arquivos texto para o banco de dados, exportação de arquivos para integração com terceiros, para parametrizações… e ainda extrapolando a barreira dos arquivos texto, os layouts de troca de informação “posicional” ou utilizando um “delimitador” também são muito vistos em comunicações via sockets.

A princípio, os desenvolvedores utilizaram a abordagem convencional… leitura via streams de dados e parse com substrings (posicionais) e splits (delimitados). Porém, como já era de se esperar, o código ficava horroroso… totalmente estruturado e dificílimo de manter e evoluir. Foi neste momento que senti a necessidade de utilizar uma abordagem mais orientada a objetos, e fui no Google à procura de frameworks para parse de arquivos texto.

Minha busca foi muito decepcionante, encontrei poucos frameworks, e muito ruins… em alguns deles o código necessário para utilizá-los era tão grande que ficaria igual ou pior do que a abordagem tradicional, e eles abstraiam muito pouco o seu domínio principal.

Neste momento eu filosofei um pouco sobre o ORM (Object Relational Mapping), que é basicamente uma técnica para abstrair o banco de dados para uma abordagem orientada a objetos… neste momento senti que era justamente disso que eu precisava, e no momento me veio na cabeça a expressão OFM (Object Flat Mapping), que a meu ver seria perfeito, trabalhar com arquivos texto (flat files) orientado a objeto.

Foi quando decidi criar o FFPOJO, um framework open source para manipulação de arquivos texto baseados em layouts posicionais ou delimitados, no qual implementei algumas características interessantes:

  • Configuração do “OFM” (Object Flat Mapping) via XML, Annotations, ou ambos (onde o XML sobrescreve as Annotations)
  • Cache de metadados, o que permite um parsing mais performático
  • Flexibilidade para trabalhar em baixo nível (text to pojo e pojo to text)
  • Uso do conceito de Decorators para conversão customizada de campos (sim, roubei a idéia do DisplayTag)
  • Conceito de Flat File Reader, permitindo definição de headers e traillers
  • Para arquivos em disco, realiza leitura utilizando o NIO (Java New IO), onde constatei um ganho de 25% no acesso a disco para leitura de dados
  • Permite trabalhar em modo push através do conceito de Record Processor, que suporta processamento single-thread e multi-thread
  • Conceito de Flat File Writer para gravação de arquivos
  • Leve, sem dependências a outros frameworks

O FFPOJO foi criado utilizando modelagem orientada ao domínio (DDD) e abusando dos testes unitários.

Meus colegas, eu ficaria feliz se tentassem utilizá-lo quando precisarem trabalhar com arquivos texto, podem contar comigo se tiverem alguma dúvida de implementação… também ficaria feliz se contribuíssem e reportassem possíveis bugs, sugestões de melhorias também são muito bem vindas.

Para instruções técnicas criei um rápido manual utilizando o Trac do SourceForge, segue abaixo os links:

Abraços a todos !

Advertisements

4 thoughts on “Conheçam o FFPOJO – Flat File Pojo Parser

  1. Mário 08/13/2010 / 11:52 AM

    Olá.

    Tenho um projeto aqui que faz praticamente a mesma coisa, não vi seu código ainda mas voce tem mais funcionalidades, Eu não leio xml por exemplo, faço tudo com annotations. Acho que posso contribuir para evoluir, pois além de arquivos txt e posicionais, eu tbm leio arquivos xls, usando annotations para indicar em qual coluna cada campo vai ser gravado. Se for de seu interesse, me mande um email para conversar-mos melhor.

    Abraços, e boa sorte!

  2. William Miranda 08/26/2010 / 10:26 AM

    E ae Giba blz cara, estava usando o seu FFPojo e acabei utilizando uma coisa que achei interessante implementar.
    Cara posso até estar errado, mas como o nome ja diz FFPojo, vai trabalhar em cima de um pojo, porque não transformar o FFPojoHelper em uma classe genérica ?? Eu sei que ele é um Singleton e que metodo static não pode ter generic.
    As vezes pode ser falta de conhecimento meu, ja aproveitando para tirar duvida, o que vale mais poder utilizar métodos estáticos ou gerar uma classe genérica.
    Segue um exemplo do que eu fiz só que eu usei o teu FFPojoHelper para gerar um FFPojoGenericHelper.

    public class FFPojoGenericHelper {

    private Class tipoClasse;

    public T readPojoFromText(String linha) throws FFPojoException{
    FFPojoHelper ffpojo = FFPojoHelper.getInstance();
    T pojo = ffpojo.createFromText(tipoClasse , linha);
    return pojo;
    }

    public String writeTextFromPojo(T pojo )throws FFPojoException{
    FFPojoHelper ffpojo = FFPojoHelper.getInstance();
    String linha = ffpojo.parseToText(pojo);
    return linha;
    }

    }

  3. Wesley José de Oliveira 02/09/2011 / 11:35 AM

    E ae Gilberto, Beleza?

    Gostaria de saber se você tem idéia de continuar esse projeto, tenho várias idéias pra incrementá-lo e melhorá-lo.

    Na rotina de ler txt via XML está com um bug na linha 199 do arquivo org.ffpojo.reader.XmlMetadataReader.java

    Substituir:
    positionalFieldDescriptor.setFinalPosition(paddingCharacter.charAt(0));

    por
    positionalFieldDescriptor.setPaddingCharacter(paddingCharacter.charAt(0));

    Aguardo uma resposta

    Valeu!

    • gibaholms 02/09/2011 / 11:09 PM

      Olá Wesley

      Obrigado pelo interesse !! Realmente fiquei um pouco sem tempo pra manter o projeto sozinho, um novo membro seria bem vindo pra equipe.
      Tem interesse ? Mande-me um email: gibaholms@hotmail.com

      Obrigado!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s