Saturday 30 August 2008

Portlets

Ola voce que esta lendo este post. Gostaria de falar aqui sobre os Portlets, uma tecnologia bem interessante, disseminada e ao mesmo tempo com coisas controversas. Ainda nao li sobre s jsr-286, portanto vou somente falar do que estou vendo em projetos e a minha impressao, que e baseada no jsr168.
Nao sei se muitos de voces aqui ja tiveram que trabalhar com os JSP's cheios de scriptlets, codigo java, que a muito nao via, mas de uns 4 meses para ca estou pegando alguns projetos que usam e abusam de Portlets, mas sem divisao alguma de camadas... a sensacao que tive e de uma volta ao tempo em que o JSP foi lancado, codigo que somente quem o fez sabe realmente o que esta acontecendo. Vejo portlets com regras de negocio, pesquisas e persistencia tudo dentro de uma classe so!!!!! Talvez eu esteja errado em discutir isso, mas para que serve entao os Patterns, arquitetura MVC e os frameworks como o saudoso e muito vivo ainda Struts, JSF e todos action baseds ???? A ideia de Portlets e interessante mas ao meu ver e uma faca de dois gumes, do mesmo jeito que ela encapsula todas as regras em uma area de tela, o que poderia ser feito com servlets e jsp e com muito mais facilidade de manutencao do que com o que ando vendo. Ao meu ver para se criar ficou como era nos anos 80/90... uma bagunca, tudo junto onde voce tinha um programa que fazia tudo!!!! Acho que pelo menos poderiamos fazer como com JSP & Servlets (com padronizacao e separacao em camadas), tentarmos fazer separacoes, aplicacao de Patterns, sei la facilitar a manutencao, pois como voces estao carecas de saber a manutencao e 90% da vida de um sistema...
Para finalizar deixo aqui meu repudio a esses programadores que so porque conseguiram "entender" a grosso modo como funciona um framework, ja saem produzindo codigos sem qualidade, sem pesquisar muito... e olha que em 20 anos de TI sei do que esotu falando... ta cheio de gente assim por ai...
Bom gente vamos por a mao na consciencia e pensar que nao vamos viver para sempre e que muito provavelmente nao estaremos nos 90% restantes junto ao sistema
Desculpe se alguem se sentiu ofendido, mas isso e um blog e esta e a minha opniao. Sinta-se livre para comentar.

Tuesday 5 August 2008

Usando ClassLoaders... extendendo... hot-deploy

Ae pessoal, se voces um dia precisarem fazer um hot-deploy, aqui vai umas dicas e um programa de hot-deploy bem simpes, sem seguranca.
Primeiro vamos criar a classe que ira ser carregada, ira se chamar Hello para nao perdermos o vicio. rsss
Hello.java
public class Hello {
public Hello() {
System.out.println("Hello versão 3 Turbinada!!!!!!");
}
}

Para voce conseguir fazer este funcionar, e necessario que voce exporte a classe como um .jar, que no meu exemplo se chama Hello.jar. Se preferir coloque em outro projeto a classe que ira extender a ClassLoader, para que voce possa ficar alterando a Hello.java e regerando o Hello.jar, fazendo isso voce ira conseguir ver a classe sendo carregada. O que fiz foi ficar mudando a string do println() para ficar vendo quando era carregado a nova classe.
Basicamente a voce ira precisar sobre-escrever o metodo findClass, que devera "ler" o arquivo como binario o aquivo, e dar um super.defineClass... para dizer a JVM que ira carregar aquele arquivo binario que vc leu e esta armazenado no Class.
Mas para voce "ler" o arquivo binario e necessario escrever um metodo que ira suprir o metodo findClass com o arquivo em modo binario.
Aqui esta o exemplo que fiz:
ClassLoaderTest.java
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ClassLoaderTest {
public static void main(String args[]) {
try {
URL url = new URL("file:///C://dev//projects//TestClassLoader//bin//test//Hello.jar");
while(true) {
Thread.sleep(10000);
ClassLoader cl = URLClassLoader.newInstance(new URL[] {url});
Object obj = cl.loadClass("test.Hello").newInstance();
System.out.println(obj.toString());
}
}
catch(Exception ex) {
ex.printStackTrace();
}
}

So isto ja serviria para carregar a classe, agora o correto seria voce extender a classe, ClassLoader ou URLClassLoader e sobreescrever o metodo findClass, para que ele carregue a(s) sua(s) classe(s). Mas lembre-se que para se fazer isso e necessario que voce "leia" o arquivo como binario, aqui vai um exemplo desses dois metodos

@Override
public Class findClass(String nameClass) throws ClassNotFoundException {
// lança ClassNotFoundException se o download falhar:
byte[] bytes;
Class c = null;
try {
bytes = readBinaryClass(nameClass);
c = super.defineClass(nameClass, bytes, 0, bytes.length);
} catch (FileNotFoundException ex) {
ex.printStackTrace();
Logger.getLogger(ClassLoaderTest.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
ex.printStackTrace();
Logger.getLogger(ClassLoaderTest.class.getName()).log(Level.SEVERE, null, ex);
}
return c;
}

public byte[] readBinaryClass(String nameClass) throws FileNotFoundException, IOException {
int n = 0;
Byte singleByte = 0;
byte[] readedBytes = null;
Integer byteBin = 0;
List fileBin = new ArrayList();
File classBin = new File(nameClass);
BufferedInputStream in = new BufferedInputStream(new FileInputStream(classBin));
while ((byteBin = in.read()) != -1) {
readedBytes[n] = Byte.parseByte(byteBin.toString());
if (in.read() != -1) {
n++;
}
}
return readedBytes;
}
}

Desculpem mas aqui nao foi possivel fazer a identacao.
Mas seguindo, voces poderao notar que leio o arquivo, que podera ser um .jar ou um .class como binario e retorno para o Class c = ... a classe e que por sua vez o ira carregar a nova classe no heap da JVM, descartando a antiga.
E um procedimento simples, mas que encontrei muita dificuldade em encontra-lo na web, algo simples assim. Achei alguns tutoriais um no GUJ muito bom, mas falta um exemplo pronto para que possamos testar e irmos adaptando ao que queremos.
Espero ter ajudado, e aceito comentarios... bons e ruins.