Archive for September, 2006

Elegi o Plone como uma das ferrramentas que tentarei usar como base de conhecimento (knowledge-base), para que dentro da empresa possamos ter mais controle do que estamos fazendo, nossos eventos, assim como a parte de humor no portal que sempre é super interessante.

Uma grande ajuda para quem não via o Plone há 4 anos foi esse site aqui: http://docs.neuroinf.de/PloneBook , espero que ele possa ser útil para quem precisar de algo.

Uma coisa legal do Plone, além de ser escrito em Python, é que construir entrada de dados, estilo “Lotus Notes”, é uma tarefa simples, além de ter um mecanismo de pesquisa muito bom, o Plone tem uma das instalações mais plug-and-play que já vi, até no MacOS, tudo rodou bem, sem gerar conflitos com as outras versões de Python que tinha antes.

Alguns amigos não curtiram muito a idéia do Plone ser em Python, mas recentemente no TheServerSide, ele divulgaram a notícia que eles devem usar na plataformaZope o JEE, de tudo a única coisa que eu mais gostei foi do uso do JBoss SEAM.

Habilitando e Desabilitando Controles

Imagine que você quer habilitar ou desabilitar controles ou botões de acordo com algumas situações da sua interface gráfica. Em nosso exemplo, queremos habilitar o botão salvar, apenas quando a pessoa preencher ao menos o nome do Filme. Para isso então vamos adicionar um método chamado “reset”, que fará a limpeza e atribuição inicial de nossos atributos do form. Veja o código deste método no FilmeForm.java:

public void reset() {
setNome(”");
setSinopse(”");
setComentarios(”");
}

Vamos agora adicionar um método chamado isValidFields() , que retornar um boolean, e podemos escrever alguma regra para informar quando é válido ou não.

public boolean isValidFields() {
return (getNome().length()>0) ;
}


Agora veja a anotação abaixo da de @Action que vamos fazer em nosso método salvar da classe FilmeForm.java:

@EnabledWhen(”form.validFields”)

Usamos as regras de Introspecção do próprio Java. Assim como métodos gets e sets são usados para descobrir que há um atributo com o nome do método tirando o texto get ou set, o is serve também para descobrirmos atributos booleanos. No caso chamamos o método de validação de forma validFields entre as aspas do script da anotação EnableWhen, e internamente o método isValidFields será chamado. Veja exemplo completo:

@Action
@EnabledWhen(”form.validFields”)
public void salvar() {
System.out.println(”Binder pra o objeto filme ” +
this.toString() + “\n Realizado com sucesso!”);
}

Edgar

Breve Histórico

Quando EntityBeans não existiam (EJB 1.0), todos sabiam usar o famoso pattern DAO, mas isso ainda não era produtivo.

Quando surgiram os Entities BMP(Bean-Managed Persistence) no EJB 1.1 e o CMP(Container Managed Persistence) ainda era uma promessa, pois poucas implementações eram de fato funcionais, os sistemas ainda apresentavam um bom uso, ainda que houvessem alguns erros de design nos frameworks, o caos ainda não estava totalmente presente.
Na spec 2.0, o CMP, o grande vilão da spec 1.1, foi super melhorado, e se você não abusasse de Utopia nos relacionamentos e herança de EntityBeans, você teria um sistema estável. Eu digo isto, pois de fato sempre ouvi muitas reclamações destes modelo, mas além de um XML(descriptor) super complexo para representar os relacionamentos, algumas coisas simplesmente não eram pra ser feitas da forma mais bela e romantica, como relacionamentos n-n , ou 1-n com n-1 em 1-n numa cascata, o resultado dessas práticas quase sempre eram operações lentas, o que acabava fazendo com que o modelo CMP fosse abandonado.

Durante a fase do EJB 2.0 e 2.1 usei bastante CMP 2.x, principalmente no JBoss, que a partir de uma versão que não me recordo agora, usava Hibernate por debaixo dos panos como implementação de CMP.

Consequências de Problemas com EJB

Surgiram vários frameworks para resolver o problema do EJB, assim como várias confusões do mercado; uma das maiores foi e ainda é para algumas pessoas: Quem usa Spring não precisa usar EJB ou vice-versa.

Spring têm conceitos fantásticos, como IoC, Aspectos, Templates para DAOs e etc, mas quando falamos em sistemas de grandes número de transações, alta disponibilidade, clusterização, alguns componentes com essas necessidades é aconselhável que sejam ainda EJBs, note que não me referi a persistência. E o spring entra como uma simples “capa” para acesso a estes componentes mais robustos de uma forma abstrata e fácil.

Outro elemento que ganou notoriedade foi o Hibernate, resolvendo de forma mais simples vários cenários que o CMP deixava a desejar. Logo chegávamos a conclusão que poderiamos ter camadas de serviços transacionais (Spring ou EJB), acessando o Hibernate como mecanismo de persistência.

Ainda restava um “problema”, muitos XML’s, e muitas camadas, sendo assim o EJB 3.0, com o advento das Annotations, tentará resolver de forma simples nossos problemas, oferecendo facilidade e transparência no desenvolvimento.

JPA: Novos EntityBeans

Java Persistence API, é de fato uma forma simples e objetiva de desenvolver aplicações com acesso a banco de Dados. Imagine quanto tempo você perdia para migrar uma aplicação de Hibernate 2.0 para 3.x, ou pior de Hibernate para TopLink? Mudar XML’s, mudar queries e varias outras coisas…. Bom, JPA resolve isso de forma realmente simples.

Sem XML, mas com Anotações (e nem tantas)

De alguma forma você precisa informar o que e como vai ser persistido alguma informação, sendo assim para um bean que represente um Treinamento teriamos:

@Entity(name=”treinamentos”)
public class Treinamento implements java.io.Serializable {

@Id
private String codigoTreinamento;

private String nome;

private String cargaHoraria;

private String conteudo;

private Double valor;

private String textoVendas;

Note, que há apenas 2 anotações, uma para descrever que esse Bean é um Entity, e outra para identificar a Chave-Primária. Ai você pergunta: Cadê o XML? De fato você não precisa especificar 1 XML para cada POJO que você queira persistir. Mas há sim, um XML que chama-se persistence.xml

Sobre o Persistence.XML

Esse é um dos XMLs que ainda resistem em exisitir, o PersistenceProvider, que é o fornecedor da implementação , sendo assim você pode usar TopLink ou Hibernate, trocando apenas JARs e um pequeno detalhe dentro do XML.

persitence.jpg

Observe que você também pode usar DataSources também, e na seção class do provider, é onde vão suas classes com as anotações e sem mais se preocupar com XML’s

O arquivo persistence.xml deve ficar na pasta META-INF do seu jar ou um jar visível da aplicação, automaticamente ele será carregado e ai você vai poder usar isto tanto numa aplicação Web quanto Desktop.

Salvando os Dados

Para salvar os dados você vai precisar de uma Factory e um EntityManager, isto é construído a partir do Provedor da implementação com a ajuda do arquivo persistence.xml. Em tese isto é tão simples quanto obter a SessionFactory do Hibernate, mas no meu ponto de vista é bem mais fácil:

/**
* @author edgarsilva
*/
public class TreinamentoPersistence extends AbstractPersistenceBroker {
public TreinamentoPersistence(){
super();
}
public void store(Object obj) throws FrameworkException {
dataStore = factory.createEntityManager();
try{
dataStore.getTransaction().begin();
dataStore.persist(obj);
dataStore.getTransaction().commit();

} catch(Exception e) {
e.printStackTrace();
dataStore.getTransaction().rollback();
throw new FrameworkException(e.getMessage());

}
finally {
dataStore.close();
}
}

A classe AbstractPersistenceBroker não tem relação com OJB(ObjectRelationalBridge), e sim é parte de um projeto de framework novo que estou desenvolvendo(ela têm irmãs: AbstractRemotePersistenceBroker(EJB)). O código desta classe seria:

/**
* @author edgarsilva
*/
public abstract class AbstractPersistenceBroker {
protected static final String PERSISTENCE_UNIT = “btu”;
protected static final String LAYER = “PERSISTENCIA”;
protected static Logger log;

public static EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);
protected EntityManager dataStore;
/** Creates a new instance of AbstractPersistenceBroker */
public AbstractPersistenceBroker() {
log = Logger.getLogger(this.getClass().getName());
}
public abstract void store(Object obj) throws FrameworkException;
public abstract void update(Object obj) throws FrameworkException;
public abstract void remove(Object id) throws FrameworkException;
public abstract Object load(Object id) throws FrameworkException;
public abstract Collection findAll(Object obj) throws FrameworkException;

EJB 3.0: fácil & simples

EJB 3, principalmente nos EntityBeans, ficou super simples, além dos SessionBeans, BMP e etc, claro que em paralelo o Spring 2.0 está trazendo grandes novidades, ainda mais com o poder do Spring-Annotations, que pode tornar fácil também seus projetos com este framework.

Independente do uso do Framework, é sempre bom pensar em criar mecanismos que facilitem o desenvolvimento, hoje em dia vivemos um momento de “porpurina” em vários frameworks, que os EGOS exarcebados promovem uma porção de complexidade desnecessária, ou seja, nomes e classes super bonitas, que ao invés de facilitar, acambam criando o desenvolvimento mais confuso.

E não esqueça, usar os padrões J2EE, facilitam portabilidade, ainda que seja mais chato o desenvolvimento, ao menos você não terá tanto trabalho em mudanças de ApplicationServers, Bancos e etc…

Bons códigos

O Grasshopper 2.0 está disponível para preview, esta ferramenta permite que aplicações escritas na plataforma .Net com Visual Studio ou Borland Delphi 2005, possam ser executadas em Containers J2EE Java. Ou seja, todo o código IL (Intermediate Language) é Convertido para bytecodes Java.  Acredito que isto seja simples para aplicações Asp.Net .

Confira o texto do InfoQ aqui

 

Leia neste artigo , como criar validadores para sua aplicação Java Server Faces.