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.

Você acha desenvolver aplicações Swing uma tarefa chata, complicada, difícil, de fato esta tarefa se torna extremamente simples usando a porção cliente do Genesis Framework, no caso o Genesis Binder.

O binder é o mecanismo que torna o processo de visualização e controle dos dados em duas vias (two-way), ou seja, o que você altera, opera na interface visual, estará automaticamente se comunicando com o objeto que você de fato quer operar.

Em palavras mais simples seus usuários dos seus sistemas, verão as interfaces Swing como DE FATO apenas uma interface de acesso a informações, fazendo com que haja a real e total separação de lógica de negócios e visualização.

Vamos a um exemplo simples, vamos criar uma interface gráfica para gerenciar nossos DVDs, ou quem sabe até o controle de nossa locadora pessoal.

Conceitos do Genesis

O Genesis é um framework que visa tornar o desenvolvimento de soluções algo simples, escondendo toda a complexidade muitas vezes necessárias nas aplicações Java. O intuito do Genesis é fazer com que programadores Java tenham a mesma preocupação que em outras plataformas como .Net, Delphi, ou seja: Quase nenhuma, com o grande diferencial de oferecer soluções testadas e aprovadas por vários clientes do mercado.

POJO

Plain Old Java Objects, ou beans (como eu aprendi), representam nossas mais puras abstrações dos simples objetos do mundo real.

Genesis Form

Esse Objeto pode ser encarado por dois pontos de vista:

Programadores Struts - É como se fosse um Form do Struts, lembre-se que no Struts nem sempre a representação deste form representava o Bean, na essencia de seus atributos, em todo o caso as informações seriam depositadas e persistidas nos Beans de alguma forma. Além de informações para irem pro Bean, os métodos(ações) são representadas como métodos acessíveis para a interface Gráfica(DispathAction).

Programadores Java Server Faces - Para estes programadores podem observar o Genesis Form como o BackingBean, que geralmente pode extender o POJO, adicionando métodos de atividade(ações) que poderão ser acessíveis nas interfaces via tags JSF.

Como Java Server Faces é um framework recente e que várias pessoas estão aprendendo vou usar a visão JSF por enquanto.

Criando o POJO: Filmes

Veja a código fonte da classe Filmes.java :
[java]
package br.com.summatech.filmes.pojo;
import br.com.summatech.atores.Ator;
import java.util.List;
public class Filme {
private Integer codigo;
private String nome;
private String sinopse;
private String comentarios;
private List atores; // gere seus Gets e Sets por favor
[/java]
Observe que partimos do velho e simples POJO. Agora vamos criar o form, baseado na estratégia BackingBean:

[java]

package br.com.summatech.filmes.form;

import br.com.summatech.filmes.pojo.Filme;
import net.java.dev.genesis.annotation.Action;
import net.java.dev.genesis.annotation.EnabledWhen;
import net.java.dev.genesis.annotation.Form;
@Form

public class FilmeForm extends Filme{
@Action
public void salvar() {
System.out.println
(”Binder pra o objeto filme ” + this.toString() + “n Realizado com sucesso!”);

} } [/java]

Observe que esta classe apenas extendeu o pojo Filme, temos duas anotações:

-Form: diz que essa classe será tratada como um Form para o Genesis
-Action : diz que esse método é uma ação do Form

Criando a UI

Você pode usar várias alternativas, entre elas:

- JGoodies
- NetBeans Matisse

O JGoodies é definitivamente interessante, mas o Netbeans matisse de fato nos dá a produtividade em Java a mesma de ambientes como do Visual Studio ou Delphi.
Se você usar NetBeans crie um novo JFrame, e adicione:

-3 Labels (Nome, Sinopse e Comentárrios como rótulos respectvos)
-3 JTextFields (com a propriedade nome (setName(”xxx”) respectivamente: nome, sinopse, comentarios).
-1 JButton (label: Salvar nome “salvar”)

Promovendo a Ligação da UI e Form via o Genesis BinderObserve apenas a anotação ViewHandler , e no construtor do JFrame nós instanciamos o Binder e o Form respectivo, e após a chamada que o NetBeans gera o método initComponents(), que inicializa todos os componentes, nós ligamos o objeto form a intancia do JFrame via o SwingBinder. No final inicializamos o binder.Pronto, apenas isso, seja 3 campos, ou 200, você terá ligado seus componentes visuais aos componentes de Regras(Forms), e estes por suas vez podem se ligar a qualquer modelo de persistencia: JPA, Hibernate, JDBC ou qualquer outro.

Bibliotecas Requeridas pro Exemplo

No Geneis use a priori todos os .jars na pasta dist, além dos jars da pasta /lib/scripts , todos os commons /lib/commons e o jackpot145.jar

O Binder do Genesis

Se você usa SWT ou Thinlet, você também pode usar todas essa funcionalidades.

Download da ultima versão estável do Genesis

Vá até o site http://genesis.dev.java.net

Leia Aqui