Posts

Showing posts from March, 2007

Spring,Spring,Spring

Spring framework, na minha opinião o melhor e mais completo framework que nos temos, pois revolucionou o modelo de desenvolvimento j2ee, ele inspirou o ejb3. Spring é um container, leve, muito leve, ele se integra como muitos outros frameworks, como jdo,hibernate,ibatis,jdbc,jms,etc... Ele não re-inventa a roda mas sim aperfeiçoá.

Nesse exemplo vou demostrar como fazer um acesso remoto a um Spring Bean como RMI, isso mesmo como se fosse um ejb. Vamos lá.

*Estou usando spring 2.0 E as libs que vem como o proprio spring + as dependencias como
log e por ai vai.




package org.diegopacheco.springrmitest.service;
public interface CromService {
public String rezar();
}



package org.diegopacheco.springrmitest.service;
public class CromServiceImpl implements CromService {
public String rezar() {
return "Você rezou de mais então Crom mandou uma maldição de sua montanha.";
}
}



package org.diegopacheco.springrmitest.util;

import org.springframework.beans.factory.BeanFactory;
import org.springfram…

Formatação dos Códigos java

Pessoal eu não me achei ainda como postar os código bem on-rails por isso a formatação tá ficando SUCKS, mas façam o seguinte: Copiem os códigos e colem no eclipse e aprtem: CTRL + SHIFT + F e o eclipse fará o milagre da formatação dos códigos.

Crom...

For-each java 5.0: Topicos Avançados

Uma das mais importantes novidades do java é o for-each, com ele podemos iterar Collections e Arrays de forma mais limpa e com menos código. Antigamente tinha que fazer algo assim:



List l = new ArrayList();
l.add(new Integer(1));
l.add(new Integer(2));
l.add(new Integer(3));

for(Iterator it=l.iterator;it.hasNext();){
System.out.println(((Integer)it.next()).intValue())
}




Já no java 5.0 podemos fazer:


List<Integer> l = new ArrayList<Integer>();
l.add(1);
l.add(2);
l.add(3);

for(Integer i: l){
System.out.println(i);
}


Mas com o novo for-each podemos percorrer qualquer coisa, basta que a classe implemente java.lang.Iterable ou um método retornar um Iterator. No exemplo a seguir mostro como iterar de maneira lazy um conjunto de pojos Pessoa que foram persistidas no disco através de Serialização.

Pessoa.java

package org.diegopacheco.javaforeach.model;

import java.io.Serializable;

/**
* Pojo que representa uma pessoa.
* @author Diego Pacheco
*
*/
public class Pessoa implements Serializable{

p…

Hybridizing Java -> outra visão

Ao ler o artigo do Bruce Eckel no artima(link do artigo) refleti sobre alguns coisas que gostaria de comentar.

Nesse artigo ele expõe diversas partes falhas do java e das soluções feitas em java, algumas até concordo com ele que são falhas mesmo. Na verdade lê está vendendo o seu peixe o Adobe Flex, que é baseado em flash. O que Bruce alega é que o flash é a verdade máxima em cross-browser e cross-so. Existem outros pontos muito importantes no java que ele não pesou no seu ponto de vista, eu gostaria de pesa los, são eles:

- JCP: ter toda uma gama de empresas pensando em uma especificação universal.
Comunidade: Existe uma comunidade muito grande que: cria,mantém,aprimora muitas e muitas soluções em java.


Na minha opinião esses são os maiores pontos do java. Existem soluções JSF que resolvem esse problema dos browsers isso parece que ele não levou em consideração.
Quanto a JS e CSS não vou nem mencionar por que acho que ele está coberto de razão.
Tem que ser um mega expecialista para desen…

Spring 2.0 @AspectJ support

Não é de hoje que o Spring framework já está consagrado no mercado, mas não poderia ser diferente o framework é muito completo e flexível. Com o Spring Framework 2.0 podemos usar AOP(no spring 2.0 é aspectJ) com apenas uso de annotations.



Vejam o exemplo:


package org.diegopacheco.springaop.aop;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class SystemAop {

private final Log log = LogFactory.getLog(getClass());

@Before("execution(* org.diegopacheco.springaop.model.service.IPessoaService.*(..))")
public void initService(){
log.info("Iniciando a execução do Service ");
}

@Before("execution(* org.diegopacheco.springaop.model.dao.IPessoaDao.*(..))")
public void initDao(){
log.info("Iniciando a execução do Dao ");
}

@After("execution(* org.diegopacheco.springaop.model.…

DB4O

Ao ler o artigo db4o(Developers works) resolvi fazer um teste parecido com o do artigo. Percebi que é muito fácil usar o db4o e acredito que ele seja mais fácil que MySQL e até mesmo Hsqldb ou H2. Com o Db4o não precisamos de mapeamento, para uma coisa pequena ou para algum teste que precisa de persistência acho que ele é muito util. Segue o exemplo:



Pessoa.java
/** * Java Bean(Pojo) de Pessoa * @author Diego Pacheco * */ public class Pessoa { private String nome; private String end; private Integer idade; public Pessoa() {} public Pessoa(String nome, String end, Integer idade) { super(); this.nome = nome; this.end = end; this.idade = idade; } public String getEnd() { return end; } public void setEnd(String end) { this.end = end; } public Integer getIdade() { return idade; } public void setIdade(Integer idade) { this.idade = idade; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } @Override public int hashCode() { final int PRIME =…

Exceptions

Eu li o artigo: Effective Java Exceptions(link) no Dev2Dev. Leiam pois o artigo é muito bom.

Nesse artigo ele fala sobre dois tipos de execptions as falhas e as contingências.
As falhas são coisas irecuperaveis, como acabou a memória ou o banco de dados está fora do ar, para esses casos se utiliza uma uncked exception, ou sejá, uma Runtime exception. Contingências são exceptions que nos podemos tratar e continuar um fluxo de execução por isso o correto de uma contingência é ele ser checked, ou seja, herdar de Exception ou alguma outra exceção checada.

Mas se você pega uma exeção checada(contingencia) e simplismente ecapsula ela em uma runtime exception ou usa throws para ir levantando até a ponto, isso está errado pois se ela é uma contingecia deve ser tratada, agora se é uma falha deveria ser runtime exceptio.



Um ati-pattern que podemos ver muito por ai é retornar null ou -1 para sinalizar um erro, a arquitetura de exceptions do java existe justamente por conta disso, fazer isso é errad…

The Power of Generics

Com o surgimento do java 5.0 vai a funcionalidade chamada generics. Na minha opinião junto com as annotations essa foi uma das melhores coisas que a sun fez no java 5.0. Certamente os Generics adicionaram bem mais complexidade ao código java, mas o ganho de código é imenso. Praticamente toda API do java foi reescrita para suportar generics.
Antes tinhamos um código assim:




...

List l = new ArrayList();
l.add("diego");
l.add("teste");
l.add("haha");

Iterator it = l.iterator();
while(it.hasNext()){
System.out.println((String)it.next());
}


com generics podemos fazer assim(vou usar foreach também):

...

List <String> l = new ArrayList <String>l.add("diego");
l.add("teste");
l.add("haha");
//l.add(new Object); // erro pois object não é String.

Iterator it = l.iterator();
while(it.hasNext()){
System.out.println(it.next()); // pois não precisamos de cast.
}


Isso foi bom pois diminuiu o número de linhas de códigos. Mas os generics para ma…

MaintainJ for eclipse 3.x.x

Image
Achei esses dias na Web esse plugin par o eclipse. Ele gera diagramas UML(Diagrama de classes e diagrama de sequencia) apartir de um aplicação SWING ou J2EE. Eu fiz um teste com uma aplicação swing, achei muito bom. O plugin do MantainJ não antera nehum fonte do seu projeto o que ele faz é criar um projeto novo que via aspectos(AspectJ com AJDT) introspeciona os fontes, pessoal achei isso bem legal. Você inicia a execução de sua aplicação e clicka em 'strat' e ele começa a gravar(fazer trace) e você mexe ma aplicação nesse tempo, após você ter executado toda a operação necessária clique em 'stop' e ele gera o diagrama. Você pode abrir o diagrama no eclipse depois e pode exportar os diagramas como imagens.



Quando e por que você usaria isso:

-Em sistemas feitos em java que não tem documentação
-Em sistemas em java que você a documentação(UML) de apenas um trecho de determinada transação.

Vantagens do Plugin:

-Não altera os fontes.
-Não altera o projeto(pois cria porjeto novo…

Collections.synchronizedMap VS ConcurrentHashMap

Antigamente até a verão 1.4.* do java quando precisávamos de uma Map sincronizado, normalmente faríamos isso:


Map map = Collections.synchronizedMap(new HashMap());


Qual o problema de se fazer isso?

Neste caso todos os métodos do Map serão Syncronized, mas sem nehuma ligação entre si. Então nesse caso é melhor fazer blocos sincronizados e você mesmo controlar a sincronização. Atualmente temos o Java 6.0, já mas a partir do java 5.0 entrou a class:




java.util.concurrent.ConcurrentHashMap


Que nada mais é que um Map com suporte a acesso concorrente. Esse package novo java.util.concurrent é só para acesso concorrente.

Vejá o Benchmark

GlobalTimes.java

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class GlobalTimes {

List tempo;

@SuppressWarnings("unchecked")
public GlobalTimes() {
tempo = new ArrayList();
}

public List getTempo() {
return tempo;
}
public void setTempo(List tempo) {
this.tempo = tempo;
}

public long total(){
long tot = 0;
for(Iterator it = temp…

Criando e Rodando Classes em tempo de runtime

Isso é umas das ferramentas mais poderosas na minha opinião, pois é muito mais rápido do que reflection e uma vez compilada a class está na memória e vai ser muito mais rápido na segunda vez.
Não pensem que eu condeno o uso de reflection, não é isso, acho bom e que é uma ferramenta poderosa, mas essa é muito poderosa também.
Vou mostrar como fazer isso com o framework javassist do Jboss, mas existem outros tantos por ai no mercado como por exemplo o ASM do ObjectWeb e o BCEL da Apache, mas o ponto importante do javassist é que ele é bem alto nível e fácil de programar.



Segue um pequeno exemplo:


public interface ToStringAble {
public int toStrInt();
}



import java.io.IOException;
import java.security.SecureClassLoader;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtMethod;
import javassist.NotFoundException;

public class UseJavassistTest {

/** Simple-minded loader for constructed classes. */
protecte…

Como debugar uma task personalizada do ant

Pessoal isso aqui é muito util. Para funcionar devemos ter as bibliotecas do ant e as outras dependências que sua solução precisar no classpath. Depois é só usar essa classe:




import org.apache.tools.ant.launch.Launcher;

public class JavaAntDebuger {

public static void main(String[] args) {
try{

String build = "build.xml"; // nome do arquivo de build(script ant)
String task = "deploy";

if (args!=null)
{
if (args.length==2){
if (!args[0].equals("")) build = args[0];
if (!args[1].equals("")) task = args[1];
}else{
if (args.length==1){
if (!args[0].equals("")) task = args[0];
}
}
}

build = "C:\\DADOS\APP_PROJECT_DIR\\build.xml"; // caminho completo até o script ant.

String[] cmd = new String[]{"-b…

String Benchmark

Ao ler o post do Chris Nokleberg's sobre Switching on Strings resolvi fazer um bechmark de compraração de String entre equals e swith.



Eis os códigos:

package org.diegopacheco.stringbenchmark.datasource; public class StringFactory{ private static String base = "ac"; public static String build(){ String ret = ""; if ((Math.random()*100)<=50.0){ ret = base + "x"; }else{ ret = base + "y"; } return ret; } } package org.diegopacheco.stringbenchmark.interfaces; public interface Compare { public void compare(String str); } package org.diegopacheco.stringbenchmark.strequals; import org.diegopacheco.stringbenchmark.interfaces.Compare; public class StringEqualsCompare implements Compare { public void compare(String str){ String x = ""; if ("acx".equals(str)){ x = "acx"; }else if ("acy".equals(str)){ x = "acy"; }else{ x = "noth"; } x = 10 + ""; //System.out.println(x)…

Boas Vindas - Primeiro Post

Esse blog traz pensamentos, testes, comparações, novidades e meus pareceres sobre a tecnologia Java. Por default a linguagem adotada aqui será a Hiboriana (10.000 BC) então vão se acostumando seus cães do inferno.