Arquivo

Arquivo do autor

Objectify, uma ótima pedida para o Google App Engine

19, janeiro, 2011

Boa tarde Queridos Leitores.
Eu sei que faz tempo, mas estou aqui postando depois de tantos meses.
Estou vivo, obrigado pela preocupação (tudo bem… ninguém perguntou nada, mas eu gosto de me sentir lembrado as vezes).

Como ninguém sabe, corrigindo, alguns sabem… A programação agora passou a ser apenas um Hobby.
Não estou mais trabalhando com programação, tenho saudades do meu tempo de analista, snif snif.

Mas vamos ao assunto, afinal essa budega não foi feita para falar da minha vida pessoal e ela tão pouco interessa a você, eu sei :)

A tecnologia que venho apresentar e sugerir seu uso é o Objectify. Também vou deixar uma dica de um código que me facilitou bastante as coisas.

Mas para que serve? Da onde veio? Porque usar isso?

Então, vamos a mais história pessoal (hoje to me sentindo um blogueiro.. haha).
A um tempo venho projetando um sistema para uns controles pessoais, queria que fosse na web e ai surgiu um problema chato, CUSTOS R$$$ (falando nisso, já deu uma olhada nos anúncios? Grato)!
Foi querendo driblar esses CUSTOS que eu decidi utilizar o Google App Engine/J (GAE), que me disponibilizou um ambiente free.
Só que, o GAE não utiliza base de dados com a arquitetura SGBD a qual a maioria de nós estamos acostumados a trabalhar, ele utiliza uma arquitetura chamada BigTable, fazendo com que os frameworks de persistência sejam um pouco diferentes.

Ai você vai falar: Ah, mas você pode utilizar JPA com o GAE.
E eu respondo: Pelo meu uso, pelas minhas pesquisas, eu digo que o JPA no GAE é uma dor de cabeça do cão. As coisas tendem a não funcionar como o esperado.

E nessas pesquisas eu encontrei o Objectify, um framework de persistência de muito fácil instalação e bem simples de ser utilizado.

Como Instalar? Como utilizar?
Você pode encontrar todas essas informações no site oficial do projeto:
http://code.google.com/p/objectify-appengine/

E caso surgir alguma dúvida, pergunte aqui pra podermos trocar algumas experiências.

Então, quando você começar a utilizar o Objectify você vai ver que as relações entre as tabelas aqui não podem ser mapeadas assim:

 
public class Motor {
...
}
 
public class Carro {
...
private Motor motor;
...
}

Você precisa utilizar uma Key, no exemplo deveríamos utilizar Key motor.
A classe Carro agora ficaria assim:

public class Carro {
...
private Key<Motor> motor;
...
}

Com essa key você consegue recuperar a real instancia de Motor utilizando o método get(class, id).
Mas fica um tanto chato ter que fazer isso a toda hora. Então eu pensei e comecei a fazer isso nas minhas classes:

public class Carro {
...
private Key<Motor> motorId;
@Transiant private Motor motor;
 
public Motor getMotor() {
	if (this.motor == null && motorId != null) {
		Motor motor = new Motor();
		motor.setId(motorId.getId());
		this.motor = MotorDAO.get(motor.getClass(), motor.getId());
	}
	return this.motor;
}
 
public void setMotor(Motor motor) {
	this.motor = motor;
	if (motor != null && motor.getId() != null) {
		this.motorId = new Key<Motor>(Motor.class,
				motor.getId());
	}
}
...
}

E até agora tudo ta funcionando belezinha! Posso fazer referencia diretamente nas EL do JSF e zaz.

Então essa seria minha dica de hoje.

PS: Como minha aplicação ainda não esta em produção, tão pouco ta fazendo coisas complexas, pode ser que esse código passe a não funcionar, mas nada que um jeitinho brasileiro não resolva ;)

É isso pessoal, espero que seja útil a você.
Abraço,
Vanio Meurer (vaninhO).

Vanio Meurer Java EE , , ,

Como acessar sites (URL) com java

14, março, 2010

Boa tarde, estou aqui num raro momento de ócio e resolvi postar algo simples, que é acessar algum site com o Java e ler seu código HTML.

Para tal utilizaremos as classes URL e HTTPUrlConnection do pacote java.net.

Começamos criando uma instancia de URL, passando ao seu construtor uma String. Como visto no exemplo abaixo essa String é a própria URL que desejamos acessar.

java.net.URL url = new java.net.URL("http://www.vaniomeurer.com.br");

Detalhe que esse construtor pode lançar uma exception chamada MalformedURLException e essa mesma é uma exception verificada, então precisamos tratá-la no código, ficando assim nosso código:

try {
   java.net.URL url = new java.net.URL("http://www.vaniomeurer.com.br");
}catch (java.net.MalformedURLException e){
   System.out.println("Erro ao criar URL. Formato inválido.");
}

Existem alguns outros construtores para a classe java.net.URL, porem esse é o mais comum.

Depois que já temos a nossa URL, precisamos acessá-la. O Java já traz uma classe que nos abstrai muitos detalhes de baixo nível do protocolo HTTP. A classe é a java.net.HTTPURLConnection e usamos como a seguir:

java.net.HTTPURLConnection urlConnection = (java.net.HTTPURLConnection) url.openConnection();

Como o método retorna uma URLConnection abstrata, precisamos fazer o cast para nossa HTTPURLConnection, pois estamos tratando de uma transação HTTP.

Novamente precisamos tratar uma exception, nesse caso o método openConnection da URL pode retornar uma IOException, então modificando e juntando os códigos temos:

try {
   java.net.URL url = new java.net.URL("http://www.vaniomeurer.com.br");
   java.net.HTTPURLConnection urlConnection = (java.net.HTTPURLConnection) url.openConnection();
} catch (java.net.MalformedURLException e){
   System.out.println("Erro ao criar URL. Formato inválido.");
} catch (java.io.IOExcetpion e2) {
   System.out.println("Erro ao acessar URL.");
}

Sabendo que a classe MalformedURLException herda IOException poderíamos ter tratado somente a exception IOExceptin, mas deixei assim para que o erro fique mais especifico.

Tendo aberta a conexão precisamos pegar as informações, para isso abrimos a stream de input assim:

java.io.BufferedReader in = new java.io.BufferedReader(new java.ioInputStream(urlConnection.getInputStream()));

Também temos disponível o stream de Output, que pode ser conseguido através do método getOutputStream.
Com o stream de entrada (input), basta percorrermos o stream para mostrarmos a página HTML.

String line = null;
 
while( (line = in.readLine()) != null ){
   System.out.println(line);
}

Conforme fizemos, vamos ler linha por linha a página HTML e exibir na tela. Poderíamos ter usado qualquer outro leitor de streams.
Pronto, lemos uma página HTML utilizando Java. :)
Precisamos agora fechar a conexão e os streams abertos.

in.close();
urlConnection.disconnect();

IMPORTANTE: precisamos sempre fechar os streams antes da conexão, caso contrario lançaríamos uma exception!

O código completo ficaria assim:

package br.com.vaniomeurer.exemplos
 
import java.net.URL;
import java.net.HTTPURLConnection;
import java.net.MalformedURLException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class AcessarURL {
 
   public static void main(String args[]) {
 
      if (args.length == 0) {
         System.out.println("Não foi especificado nenhuma URL.");
         // Fechando aplicação.
         System.exit(1);
      }
 
      // Pegando a url passada como parametro.
      String urlName = args[0];
 
      try {
 
         URL url = new URL(urlName);
         HTTPURLConnection urlConnection = (HTTPURLConnection) url.openConnection();
         BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
 
         String line = null;
 
         while( (line = in.readLine()) != null ){
            System.out.println(line);
         }
 
         in.close();
         urlConnection.disconnect();
 
      } catch (MalformedURLException e){
         System.out.println("Erro ao criar URL. Formato inválido.");
         System.exit(1);
      } catch (IOException e2) {
         System.out.println("Erro ao acessar URL.");
         System.exit(1);
      }
 
   }
 
}

Compilando e executando o comando “java br.com.vaniomeurer.exemplos.AcessarURL http://www.vaniomeurer.com.br” teríamos impresso o código HTML desse site. :)

Espero que esse mini tutorial seja útil a alguém, como estou em uma máquina que não tem o JDK não pude compilar para testar, mas logo o faço e edito caso algo esteja errado.

Até, Vânio Meurer (vaninhO)

Vanio Meurer Java SE , ,