Tag: ‘Java’
ToStringUtil() com Annotations versão 1.0.2
Dando continuidade a customização do toString(), certamente existirá aquele atributo que você não irá querer exibir no toString(), então seguindo a dica do @pauloprestes, resolvido com annotations:
Aqui está a interface para a anotação, o melhor seria utilizar o Target como FIELD, porém, como falei vamos exibir os atributos com base nos métodos públicos Getters.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface NoToString{}
Na classe ToStringUtil foi apenas acrescentado uma regra para não exibir os métodos marcados com a anotação @NoToString, sendo:
// Nao exibir os métodos que estejam com a Annotação NoToString boolean isNotAnnotation = m.isAnnotationPresent(NoToString.class);
Realizei alguns testes com tipos complexos e funcionou, talvez você tenha alguma sugestão para melhorar este tipo de tratamento.
Baixe aqui a versão 1.0.2.
Namastê!
Automatizando o toString() versão 1.0.1
É comum sobrescrever o método toString() da classe Object, facilita em situações como quando é necessário saber o conteúdo de um Bean, por exemplo. Sobretudo, reescrever este método poderá ser trabalhoso se você tem muitos atributos e cansativo, se você o fizer para todos os seu beans.
Pensando nisso resolvi criar uma classe útil que mostre todos os atributos Privates da sua classe juntamente com seus respectivos valores. Veja o código abaixo, em um bean eu reescrevi o método toString() fazendo um looping em todos os atributos:
public class Equipamento implements Serializable {
private String modelo;
private String marca;
private String descricao;
private Date fabricacao;
/*** getters/setters ocultados **/
public String toString(){
StringBuffer b = new StringBuffer();
// Obtem todos os atributos da classe
Field[] fields = this.getClass().getDeclaredFields();
b.append( this.getClass().getName() );
b.append( " { \n" );
for (int i = 0; i < fields.length; i++) {
try {
Field field = fields[i];
b.append( field.getName() );
b.append( " = " );
b.append( field.get(this) );
b.append("\n");
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
b.append( " } " );
return b.toString();
}
}
A reescrita do método acima resolve parcialmente o nosso problema, além de não atender aos tipos de dados complexos, você terá que fazer o famoso copy-paste para todas as classes que forem implementa-lo.
Voltamos então para nossa idéia inicial, então criaremos uma classe útil para que a automatização do toString(), sendo assim, qualquer classe poderá utiliza-la. Saiba que não iremos ter acesso aos atributos assinados com o modificador Private da classe que deseja utilizar o toString customizado, para resolver tal problema utilizaremos os Métodos públicos, ignorando os métodos da classe Object e aproveitando apenas os métodos acessores.
public final class ToStringUtil{
/*** ocultado ***/
public static String getText(Object object){
StringBuffer buffer = new StringBuffer("");
Method[] methods = object.getClass().getMethods();
for( Method method : methods ){
//
// verifica se o método é um Getter de attributo da classe
//
if( isGetterFieldMethod(method, object.getClass()) ){
buffer.append( getResumeNameMethod( method.getName() ) );
buffer.append(" = ");
buffer.append( getMethodReturnValue(object, method) );
buffer.append( NEW_LINE );
}
}// for each end
return buffer.toString();
}
/*** ocultado ***/
}
Esta versão ainda continua com o problema de tipos complexos, assim que eu for melhorando vou disponibilizar por aqui.
Download
Versão completa ToStringUtil 1.0.1.
Referência
Reflection
Lendo seus e-mails com Java
Lembro de um camarada me dizendo: “Fiz um browser em Java com menos de 20 linhas de código” – Acredite, era verdade! Okay! Okay! Sem recurso nenhum básicamente, apenas a barra de endereços, mas e daí? Assim como esse meu amigo, provavelmente você já tem aquela classe para envio de e-mails guardada na manga, muito útil naqueles dias em que seu chefe pressiona: “É pra ontem!”
Mas… você já tentou montar seu cliente de email? “Pra quê, cara? Eu uso o Gmail” – você irônicamente me responderia, e na tréplica eu diria: Ué! Pra quê o Gmail, se você pode fazer melhor meu rapaz! (sarcástico, não?) Mãos a obra!
O pacote javax.mail.* fornece uma série de recursos para protocolos de internet, utilizando-o como uma receita de bolo o sucesso é garantido. Basicamente vamos criar um programa que monitore a caixa de entrada de um determinado endereço POP3.
Coloque os dados de acesso ao mail em um arquivo config.properties, assim:
pop.hst=pop.lucianosilva.com.br pop.usr=boss@lucianosilva.com.br pop.pwd=ABC123#XYZ
A classe abaixo se encarregará de obter estes dados de conexão:
public class PropertiesMail extends Properties{
private static final String ARQUIVO_CONFIGURACAO = "C:\\config.properties";
public PropertiesMail(){
try{
FileInputStream file = new FileInputStream( ARQUIVO_CONFIGURACAO);
this.load( file );
}catch(IOException e){
e.printStackTrace();
}
}
public String getHost(){
return this.getProperty("pop.hst");
}
public String getAccountUser(){
return this.getProperty("pop.usr");
}
public String getAccountPassword(){
return this.getProperty("pop.pwd");
}
}
Agora, a caixa de correios. Veja que o processo abaixo básicamente segue um roteiro, mas é óbvio que isto é feito apenas para a leitura.
public class Inbox{
public Inbox(){
try {
init();
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void init() throws MessagingException, IOException{
// Instância das Propriedades de Conexão
PropertiesMail ppm = new PropertiesMail();
// Seta o endereço do host
Properties pp = System.getProperties();
pp.put("mail.pop3.host", ppm.getHost());
// Se o servidor exigir autenticação segura
Authenticator auth = new PopAuthentication();
Session session = Session.getDefaultInstance(pp, auth);
Store store = session.getStore("pop3");
// Dados básicos de conexão
store.connect(ppm.getHost(), ppm.getAccountUser(), ppm.getAccountPassword());
// Obtem o diretório (INBOX)
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
// ler as mensagens do diretório
Message message[] = folder.getMessages();
processMessage(message);
// Close connection
folder.close(false);
store.close();
}
private void processMessage( Message[] message ) throws MessagingException, IOException{
if( message == null || message.length==0 ){
System.out.println("Nenhuma mensagem encontrada");
}else{
for (int i=0, n=message.length; i
System.out.println(i + ": " + message[i].getFrom()[0] + "\t" + message[i].getSubject());
String content = message[i].getContent().toString();
System.out.print(content);
}// for end
}
}
public static void main(String[] args){
Inbox inbox = new Inbox();
}
}
Muito fácil não? Mas este é um exemplo simples mesmo, saiba que é possível fazer todo o controle de um cliente de e-mail não só Ler, como Escrever, Apagar, Mover, etc.
Downloads
Projeto utilizado para este post.
JavaMail API
Veja mais sobre JavaMail
JavaMail API
jGuru: Fundamentals of the JavaMail API
WebMail in Java: Reading E-mail
Have a fun!
Sun Certified Java Programmer – Requisitos
O exame CX-310-055 da Sun é para a Certificação Java versão 1.5 da linguagem, uma das metas mais cobiçadas entre os programadores da plataforma e também uma das mais temidas.
Básicamente são testados conhecimentos primordiais da linguagem como declarações, controle de escopo, condições, APIs específicas até conceitos de orientação a objetos.
Atualmente a versão da SCJP é a 6, porém ainda é possível fazer a 5, existem cursos específico preparatórios para a certificação, mas eu ainda prefiro seguir o bom e velho livro da Kathy Sierra, e os mocks que são diversas opções pela internet.
Abaixo vou listar alguns links úteis para auxiliar nos estudos.
Mocks
http://www.javabeat.net/javabeat/scjp5/index.php
http://www.wickedlysmart.com/SCJPStudyGuide/Java_5_SCJPquestions.html
http://www.javabeat.net/javabeat/scjp5/mocks/index.php
Perguntas Frequêntes no JavaRanch
http://faq.javaranch.com/java/ScjpFaq
Guia de Estudos e Dicas
http://java.boot.by/scjp-tiger/
http://camilolopes.wordpress.com/2008/03/31/falando-um-pouco-sobre-o-exame-310-055-scjp/
Livro da Kathy Sierra
Submarino
Amazon
Twitter da Kathy
http://twitter.com/KathySierra
Detalhes da Certificação
http://www.sun.com/training/catalog/courses/CX-310-055.xml
Boa Sorte!
Web Services com Apache Axis e Tipos Complexos – Part III
Criar WebServices já foi um trabalho árduo, mas há alguns anos isto deixou de ser um problema com a ajuda das IDEs. Então vou mostrar como utilizar os recursos do Eclipse que facilitam o desenvolvimento de serviços.
Você já sabe o que é um WebServices e também como é simples publicá-lo utilizando Axis, mas nem todos seus serviços irão trabalhar apenas com tipos de dados primitivos, provavelmente será necessário retornar uma lista de Pessoas, Enderecos, ou qualquer outro tipo de dado complexo.
Nosso cenário é um projeto cujo o objetivo é fornecer consultas de Países e seus respectivos Estados, acessados através de serviços, a definição de Beans, DAOs e qualquer outras classes serão ocultadas, porém, no final deste post você poderá baixar a versão completa do projeto.

Bem como já foi demonstrado aqui precisamos de uma classe para que seja a base do serviço, neste caso será a harpia.region.services.Region, veja:
package harpia.region.services;
/* imports ocultados */
public class Region {
private RegionDAO rdao = new RegionDAO();
/**
*
* @param Nome do Pais
* @return Todos os países encontrados
*/
public Pais[] find(String nmPais){
ArrayList<pais> list = rdao.getAllPais( nmPais );
Pais[] paises = new Pais[list.size()];
list.toArray(paises);
return paises;
}
}
Criando o WSDL
Crie um novo objeto chamado Web Service (File > New > Others > Web Service). Após selecionar Web Service clique em Next.
Clique em Browse e selecione a classe responsável por implementar o serviço, ou seja, harpia.region.services.Region. Veja que o tipo deve ser Bottom up Java Web Service.
Na sequência serão exibidos os métodos disponibilizados pelo serviço, caso você não queira publicar basta desmarcar.

E por fim a caixa de dialogo informa que o servidor Apache está down é que será necessário fazer o startup para concluir a criação e publicação do WSDL, utilize esta mesma tela para iniciar o servidor e concluir o passo-a-passo.
Veja que um novo arquivo foi criado em projeto, agora existe o wsdl/Region.wsdl.
O WSDL (Web Service Description Language) nada mais é do que um Schema XML cujo está descrito o serviço de internet. Você poderá acessar este serviço em http://localhost/Harpia/wsdl/Region.wsdl ou também http://localhost/Harpia/services/Region?wsdl.
Criando o Client
Nosso serviço foi criado em Java 1.5, porem, neste momento poderiamos fazer uma solicitação a partir de qualquer linguagem que saiba interpretar o WSDL. Vamos continuar no Java por enquanto e fazer a chamada do nosso Web Service.
Já que a intensão é mostrar como a IDE facilita a criação de Web Services, aqui vai mais um wizard de como fazer o Web Service Client no eclipse.
Hey Client! Chamaí o serviço pow!
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import harpia.region.bean.Pais;
import harpia.region.services.RegionServiceLocator;
public class HarpiaClient {
public static void main(String[] args) throws RemoteException, ServiceException {
// obter o nome do pais para pesquisa
String nome = JOptionPane.showInputDialog(null, "Qual é o pais?", "Unido");
RegionServiceLocator locator = new RegionServiceLocator(); // localizando ...
Pais[] paises = locator.getRegion().find(nome); // procurando ...
for (int i = 0; i < paises.length; i++) { // exibindo
Pais pais = paises[i];
System.out.println("["+i+"] " + pais.getNome() + " | ID: " + pais.getId_pais());
}
// Simples assim
}
}
E para aqueles que ainda dizem por aí que tudo isso aqui é conversa fiada, se é que existe algum maluco pra dizer isto, tomaí! PHP consumindo o Web Service feito em Java.
<?
$client = new SoapClient(null, array('location' => 'http://localhost/Harpia/services/Region?wsdl',
'uri' => 'http://localhost/Harpia/services/Region?wsdl',
'trace' => '1'));
$result = $client->find('ale');
if( is_soap_fault($result) ){
echo "Ocorreu algum erro.<br/>";
}else{
print_r($result);
}
unset($client);
?>
Faça download dos fontes aqui.
That’s all.






