Java

 Agenda de Contatos (Google App Engine)

Trabalho da Disciplina: Tecnologia WebServices e RESTful
Prof. Carlos L. L. Rischioto

MBA em Desenvolvimento de Aplicações Java - SOA / FIAP
08/01/2012

Adriana Del Nero Romano
Robson de Sousa Martins


Download do código-fonte:

Agenda de Contatos (GAE) (ZIP ~8,9MB)


Tecnologias empregadas:

  • Restlet (GAE Edition);
  • GAE SDK;
  • XML;
  • JAXB;
  • JPA;
  • UI em modo console (consumer).

Enunciado:

Desenvolva a Aplicação de Controle de Contatos (a mesma do trabalho de WebServices) na Plataforma do Google App Engine (http://cloud.google.com/appengine).


URL da Aplicação:

Essa é a URL da aplicação Agenda de Contatos (GAE):

http://agenda-contatos-fiap.appspot.com/agenda


Arquivos do Pacote ZIP:

  • AgendaGAE.zip: Projeto Java para o Eclipse, contendo o Servlet REST (for GAE) para a Agenda de Contatos.
  • AgendaGAEClient.zip: Projeto Java para o Eclipse, contendo um Cliente em Modo Console (CUI) para a Agenda de Contatos.

Detalhes sobre a Implementação:

Este trabalho foi implementado usando o framework Restlet - edição para GAE (GAE Edition), facilitando a adaptação do exercício anterior (Agenda de Contatos em REST).

Basicamente, ao usar o Restlet GAE Edition junto com a aplicação Web do Google App Engine, pôde-se reaproveitar do exercício anterior (REST), as classes Resource (AgendaResource e ContatoResource), a classe Application (AgendaApplication), as classes DAO (GenericDAO e ContatoDAO), além dos Beans (POJO): Agenda e Contato.

Assim como na implementação da Agenda em REST, a serialização dos objetos é realizada por meio de um JaxbRepresentation (Uma extensão do Restlet que permite o uso do JAXB para transformar objetos em XML e vice-versa).

As principais alterações neste exercício (em relação ao anterior – Agenda de Contatos em REST):

  • Classe Contato: o GAE necessita de uma Chave Primária (id) formada por um atributo do tipo Key (com.google.appengine.api.datastore.Key), e não um atributo numérico inteiro.
    O atributo id foi mantido na geração do XML (para o formato ficar compatível com o exercício anterior), enquanto que o atributo key foi "anotado" para ser ignorado no XML.
  • Persistência: A persistência de dados ainda é feita através de JPA, porém o GAE possui um mecanismo próprio de datastore (não usa banco de dados externo, como MySQL, Oracle, SQLite, ou outro). Para isso, foi necessário configurar corretamente o arquivo persistence.xml.


URL's do Serviço REST no GAE:

As URL's definidas no Servidor da Agenda são as seguintes:

http://agenda-contatos-fiap.appspot.com/agenda/contatos

Através do GET a essa URL, é obtida a lista de contatos em XML (método listar()).
Através do POST de um XML a essa URL, é inserido um contato (método inserir()).

http://agenda-contatos-fiap.appspot.com/agenda/contatos/{idContato}

Através do GET a essa URL, é obtido o contato em XML (método consultar()).
Através do DELETE a essa URL, é excluído um contato (método excluir()).

http://agenda-contatos-fiap.appspot.com/agenda

Idêntico ao http://agenda-contatos-fiap.appspot.com/agenda/contatos


Exemplos de XML
:

XML da Agenda (lista de Contatos):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contatos>
    <contato id="1">
        <nome>Adriana Del Nero</nome>
        <email>adriana@adriana.com.br</email>
        <endereco>Av. dos Sonhos, 6433 - Apto. 603</endereco>
        <cidade>São Paulo</cidade>
        <estado>SP</estado>
        <pais>Brasil</pais>
        <telefone>8989-8484</telefone>
    </contato>
    <contato id="2">
        <nome>Robson Martins</nome>
        <email>robson@robson.com.br</email>
        <endereco>Rua das Flores, 632</endereco>
        <cidade>Salvador</cidade>
        <estado>BA</estado>
        <pais>Brasil</pais>
        <telefone>7070-7060</telefone>
    </contato>
</contatos>

XML de um Contato:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contato id="1"> <!—- se contato vai ser inserido, id pode ser omitido --!>
    <nome>Adriana Del Nero</nome>
    <email>adriana@adriana.com.br</email>
    <endereco>Av. dos Sonhos, 6433 - Apto. 603</endereco>
    <cidade>São Paulo</cidade>
    <estado>SP</estado>
    <pais>Brasil</pais>
    <telefone>8989-8484</telefone>
</contato>


Consumidor (Cliente) da Agenda:

A aplicação consumidora da Agenda é semelhante a do exercício anterior (REST), implementada usando uma UI em modo console (CUI).

As classes que implementam a aplicação consumidora estão no pacote br.com.fiap.cliente, sendo que a principal é a AgendaClient, onde está o método main().

A diferença entre esse Cliente e o do exercício anterior (REST), é a inclusão de um workaround para um bug do Restlet GAE Edition (ver AgendaRestClient.java:114) e a versão da biblioteca do Restlet (neste caso, 2.1 RC1).


Instruções para funcionamento das aplicações:

As instruções a seguir pressupõem que o projeto será executado a partir do Eclipse:

Cliente da Agenda de Contatos:

  1. Importar o projeto no arquivo AgendaGAEClient.zip para um Workspace do Eclipse (Cliente da Agenda);
  2. Executar a aplicação cliente, através da classe AgendaClient do pacote br.com.fiap.cliente;
  3. Especificar a URL base do serviço no Google (default: http://agenda-contatos-fiap.appspot.com/agenda) – para aceitar o default, pressionar ENTER duas vezes;
    Um menu em modo console é exibido, e poderá ser utilizado para invocar as operações previstas para essa aplicação.

Versões das ferramentas e bibliotecas utilizadas:

  • Eclipse 3.6
  • Java JDK 1.6
  • Google Eclipse Plugin 2.4.2 (incluindo o GAE SDK)
  • Restlet 2.1 RC1
  • NetTool 4.7.2