Javafree

Prevayler: Persistência totalmente OO.

Publicado por Tutoriais Admin em 16/08/2009 - 13.823 visualizações

Vitor Fernando Pamplona

Se você participa de alguma comunidade Java, certamente já ouviu falar no Prevayler (http://www.prevayler.org). Mas, você sabe o que é e como ele faz a persistência? Se você é um dos muitos que responderam não a esta pergunta, aqui está um artigo explicando como trabalhar com o Prevayler.

Todos nós estamos pra lá de acostumados com os tradicionais bancos de dados relacionais. Em java, trabalhar com esse tipo de armazenamento de dados não é tão fácil. Se você não pensar em uma boa arquitetura para a sua aplicação, o seu código fonte fica horrível, principalmente se você é um daqueles que adora digitar comandos SQL no meio do código Java.

Mas, vamos lá! Quais são as principais diferenças entre os bancos de dados relacionais e o Prevayler? Simples, o Prevayler não é um banco de dados, portanto, não tem as características de um, como: controle de acesso, compartilhamento de dados, integridade, interface via SQL, etc. O Prevayler é um simples gravador e recuperador de objetos. Você manda gravar e ele grava, é simples.

Muitas pessoas tem medo do Prevayler em aplicações grandes pela falta da SQL. Isso mesmo, se você vai usar o Prevayler, você não vai poder executar SQLs em seu sistema. Ao invés disso, quem faz a lógica da busca é o próprio programador, ou seja, o programador faz tudo.

Vamos a um breve exemplo. Digamos que você queira fazer um sistema que salve somente o nome das pessoas. Como você é um programador que gosta de um desenvolvimento caprichado, você irá criar uma classe Pessoa, contendo apenas o atributo nome. Como essa abaixo:

public class Pessoa {       
private String nome;
public Pessoa(String nome) {
this.nome = nome;
}

public
String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}
}

Além disso, irá precisar de uma classe para armazenar as pessoas que você já anotou.

import java.util.ArrayList;
public class ListaPessoas {
private ArrayList listaPessoas = new ArrayList();
public void add(Pessoa pes) {
listaPessoas.add(pes);
}
public Pessoa get(int i) {
return (Pessoa) listaPessoas.get(i);
}
public int size() {
return listaPessoas.size();
}
}
Pronto, mas e agora, como iremos armazenar isso? Já pensou em uma tabela de banco? Ok, pode ser feito também, mas você reparou no trabalho que isso vai lhe causar?? Comprar ou baixar um Banco de dados e instalá-lo (coisa que as vezes não é muito fácil) e criar a tabela. Será que é a melhor saída?

Se pensarmos no Prevayler, como seria? Resposta: Muito mais simples. Você só precisaria criar uma classe para o método add da sua lista de pessoas. Vejamos como fica?

Antes de mais nada baixe o jar prevayler-1.02.001.jar do prevayler no seguinte endereço http://www.ibiblio.org/maven/prevayler/jars/ e coloque-o em seu classpath.
Detalhe: O jar para fazer a persistência tem somente 12 KB.

Agora vamos para as implementações em nossas classes. Primeiramente estenda a sua ListaPessoas da classe AbstractPrevalentSystem do prevayler. Indicando que esta classe será o nosso controle de armazenamento.

Após, mude a classe Pessoa para implementar a interface Serializable. Ou seja, a classe pessoa, conterá os valores que iremos gravar. Portanto é serializável.

Logo após crie a classe abaixo:

import java.io.Serializable; 
import org.prevayler.Command;
import org.prevayler.PrevalentSystem;

public class
AdicionaPessoa implements Command {
private String nome;
public
AdicionaPessoa(String nome) {
this
.nome = nome;
}
public Serializable execute(PrevalentSystem system) throws Exception {
((ListaPessoas) system).add(new Pessoa(nome));
return null;
}
}

A interface Command indicará ao sistema do Prevayler que o método execute irá alterar a base de dados, que ele deverá tratar o command como uma transação e ele deverá persistir as mudanças.

Pronto! Nosso sistema que grava o nome das pessoas já está pronto. Para testar, crie uma classe Main como esta:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.prevayler.implementation.SnapshotPrevayler;

public class Main {
public static void main(String[] args) {
System.out.println("Iniciando Prevayler...");
SnapshotPrevayler prevayler = null;

try {
prevayler = new SnapshotPrevayler(new ListaPessoas());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

System.out.print("Digite nome da pessoa ou FIM para sair: ");
String nome = lerTeclado();
while (!nome.equals("FIM")) {
try {
prevayler.executeCommand(new AdicionaPessoa(nome));
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println("Pessoa armazenada.");
System.out.print("Digite o nome da pessoa ou FIM para sair: ");
nome = lerTeclado();
}

System.out.println("Imprimindo pessoas persistidas.");
ListaPessoas lista = ((ListaPessoas) prevayler.system());
for (int i = 0; i < lista.size(); i++) {
System.out.println(lista.get(i).getNome());
}
}
public static String lerTeclado() {
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
try {
return reader.readLine();
} catch (IOException e1) {
return "FIM";
}
}
}

A classe SnapshotPrevayler é um gerenciador dos teus objetos, ele cuidará para que seus objetos sejam persistidos em disco para evitar falhas de queda de energia por exemplo.

A linha "prevayler.executeCommand(new AdicionaPessoa(nome));" indica ao Prevayler que você está adicionando uma nova pessoa com o nome no parâmetro. Ele deverá persistir o dados para futuras consultas.

Repare que você pode fechar o programa a qualquer hora, em qualquer circunstância. Os dados ficarão armazenados corretamente. (Se você não acredita, de um reset no micro bem na hora de ele salvar os dados )

Este é um exemplo bem simples, lembre-se que se você for implementar algo profissionalmente com o prevayler, você deve conhecer alguns padrões de projeto. Eles serão necessários para que se faça uma boa programação e torne possível uma futura manutenção.

Links: www.prevayler.org. An introduction to object prevalence

Valeu pessoal, espero que vocês tenham gostado. Esse é o primeiro artigo de uma série sobre o Prevayler.

Vitor Fernando Pamplona

comentários: 0