Anda di halaman 1dari 271

Erich Silvestre, Pablo Valrio Polnia

Uma Aplicao da Arquitetura Orientada a Recursos

02 de dezembro de 2008

Erich Silvestre, Pablo Valrio Polnia

Uma Aplicao da Arquitetura Orientada a Recursos

Orientador:

Luiz Fernando Bier Melgarejo

02 de dezembro de 2008

Uma Aplicao da Arquitetura Orientada a Recursos

Trabalho de concluso de curso apresentado como parte dos requisitos para obteno do grau de Bacharel em Cincia da Computao.

Prof. M. Sc. Luiz Fernando Bier Melgarejo Orientador

Banca Examinadora

Prof. Dr. Jos Mazzucco Jr.

Prof. Dr. Rosvelter Coelho da Costa

Resumo
Muito esforo tem-se empregado em pesquisas sobre servios web, e grande parte destas pesquisas ignora completamente o estilo de arquitetura proposta originalmente para a web. Buscou-se com este trabalho resgatar um estilo arquitetural desenvolvido para sistema distribudos de hipermdia, REST, que foi introduzido por um dos idealizadores da web, Roy Fielding, e estudar uma arquitetura que segue esse estilo, a Arquitetura Orientada a Recursos (ROA), proposta por Leonard Richardson e Sam Ruby em 2007 a partir de observaes pragmticas sobre o emprego de REST na web. Tendo como objetivo, o emprego destas teorias no desenvolvimento de uma aplicao de apoio a seminrios, utilizando-se de tcnicas agis tais como Programao Orientada por Comportamento como metodologia. Como resultado, criou-se um sistema web orientado a recursos, o sistema Disseminrio de apoio a seminrios. Palavras-chave: REST, Arquitetura Orientada a Recursos, Desenvolvimento Guiado por Comportamento, Desenvolvimento Guiado por Testes, Seminrios.

Abstract
A big effort has been done on web services research and most of these researches completely ignore the originally proposed web architecture. In this work we tried to bring back an architectural style built for distributed hypermedia systems, REST, introduced by one of the web idealizers, Roy Fielding, and study an architecture that follows this style, the ResourceOriented Architecture (ROA), proposed by Leonard Richardson and Sam Ruby on 2007 based on pragmatic observations of REST on the web. Our goal is to apply these theories to develop a seminars management system, using agile techniques as Behaviour-Driven Development as our development methodology. As result, a resource-oriented seminar system has been built, the Disseminrio seminars management system. Keywords: REST, Resource-Oriented Architecture, Behaviour-driven Development, TestDriven Development, Seminars.

Sumrio

Lista de Figuras Lista de Tabelas Lista de abreviaturas e siglas 1 Introduo 1.1 1.2 2 Objetivo Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objetivos Especcos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 18 p. 18 p. 18 p. 20 p. 20 p. 21 p. 21 p. 22 p. 23 p. 23 p. 25 p. 25 p. 25 p. 27 p. 28 p. 29

REST 2.1 Derivao de REST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.2 Cliente/Servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sem-Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Interface uniforme . . . . . . . . . . . . . . . . . . . . . . . . . . . Camadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cdigo sob demanda . . . . . . . . . . . . . . . . . . . . . . . . . .

Elementos Arquiteturais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.1 2.2.2 2.2.3 Elementos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . Componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Arquitetura Orientada a Recursos

3.1

Conceitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1 3.1.2 3.1.3 Recursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Identicadores de Recursos . . . . . . . . . . . . . . . . . . . . . . Representaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

p. 29 p. 29 p. 29 p. 30 p. 31 p. 31 p. 31 p. 33 p. 34 p. 36 p. 36 p. 37 p. 38 p. 39 p. 41 p. 43 p. 43 p. 44 p. 44 p. 46 p. 46 p. 47 p. 48 p. 51 p. 51

3.2

Propriedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 3.2.2 3.2.3 3.2.4 Endereabilidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sem-estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conectividade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Interface Uniforme . . . . . . . . . . . . . . . . . . . . . . . . . . .

Metodologia 4.1 Resumo do Procedimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 4.1.9 4.2 Identicao dos dados do domnio . . . . . . . . . . . . . . . . . . Denio dos recursos . . . . . . . . . . . . . . . . . . . . . . . . . Denio dos nomes dos recursos . . . . . . . . . . . . . . . . . . . Denio das operaes sobre os recursos . . . . . . . . . . . . . . . Representaes aceitas pelo servidor . . . . . . . . . . . . . . . . . . Denio das representaes oferecidas pelo servidor . . . . . . . . . Interligao dos recursos . . . . . . . . . . . . . . . . . . . . . . . . Denio das respostas bem sucedidas . . . . . . . . . . . . . . . . . Denio das respostas mal sucedidas . . . . . . . . . . . . . . . . .

Desenvolvimento Guiado por Comportamento . . . . . . . . . . . . . . . . . 4.2.1 4.2.2 Histrias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BDD no Disseminrio . . . . . . . . . . . . . . . . . . . . . . . . .

Disseminrio 5.1 Descrio das funcionalidades . . . . . . . . . . . . . . . . . . . . . . . . .

5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.2

Criao de conta . . . . . . . . . . . . . . . . . . . . . . . . . . . . Autenticao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Criao de Proposta de Seminrio . . . . . . . . . . . . . . . . . . . Aprovao de Proposta de Seminrio . . . . . . . . . . . . . . . . . Participao em Seminrio . . . . . . . . . . . . . . . . . . . . . . . Publicao de Apresentao . . . . . . . . . . . . . . . . . . . . . .

p. 51 p. 54 p. 57 p. 57 p. 59 p. 59 p. 65 p. 65 p. 66 p. 66 p. 66 p. 67 p. 67 p. 67 p. 67 p. 69 p. 70 p. 71 p. 72 p. 73 p. 73 p. 74 p. 76 p. 148

Papis de Usurios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.1 5.2.2 5.2.3 5.2.4 Visitante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Usurio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Coordenador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Administrador . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Implementao 6.1 Disseminrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.1 6.1.2 6.1.3 6.1.4 6.2 Arquitetura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Camada de servios . . . . . . . . . . . . . . . . . . . . . . . . . . . Modelo de negcios . . . . . . . . . . . . . . . . . . . . . . . . . . Camada de Persistncia . . . . . . . . . . . . . . . . . . . . . . . . .

Vericao das especicaes . . . . . . . . . . . . . . . . . . . . . . . . .

Concluses 7.1 7.2 Resultados Alcanados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trabalhos Futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Referncias Bibliogrcas Anexo A -- Cdigo-fonte das Especicaes Anexo B -- Cdigo-fonte dos Recursos

Anexo C -- Tipos de Representaes

p. 249

C.1 Codicao de Formulrio . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 249 C.2 JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 249 C.3 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 249 C.4 XHTML com Marcaes Descritivas . . . . . . . . . . . . . . . . . . . . . . p. 250 Anexo D -- Artigo: Uma Aplicao da Arquitetura Orientada a Recursos p. 251

Lista de Figuras
2.1 2.2 2.3 2.4 2.5 2.6 3.1 3.2 3.3 3.4 4.1 4.2 4.3 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 O estilo cliente servidor [1] . . . . . . . . . . . . . . . . . . . . . . . . . . . O estilo Sem-Estado [1] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O estilo Cache [1] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Interface Uniforme [1] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sistema em Camadas [1] . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cdigo sob demanda [1] . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aplicao Sem-Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aplicao Com-Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pesquisa sobre Buracos Negros . . . . . . . . . . . . . . . . . . . . . . . . . Uma aplicao conexa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagrama entidade relacionamento do Disseminrio . . . . . . . . . . . . . . Diagrama da Interligao de Recursos . . . . . . . . . . . . . . . . . . . . . O ciclo TDD [2] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Primeira etapa do cadastramento . . . . . . . . . . . . . . . . . . . . . . . . Mensagem de conrmao de cadastramento . . . . . . . . . . . . . . . . . Segunda etapa do cadastramento . . . . . . . . . . . . . . . . . . . . . . . . Mensagem de conta criada . . . . . . . . . . . . . . . . . . . . . . . . . . . Pgina de um usurio do Disseminrio . . . . . . . . . . . . . . . . . . . . . Lista de usurios do Disseminrio . . . . . . . . . . . . . . . . . . . . . . . Enlace de autenticao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Janela de autenticao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Usurio navegando autenticado . . . . . . . . . . . . . . . . . . . . . . . . . p. 21 p. 22 p. 23 p. 24 p. 24 p. 25 p. 32 p. 32 p. 33 p. 34 p. 37 p. 45 p. 47 p. 52 p. 52 p. 53 p. 54 p. 54 p. 55 p. 55 p. 56 p. 56

5.10 Enlace de proposta de seminrio . . . . . . . . . . . . . . . . . . . . . . . . 5.11 Pgina de criao de proposta de seminrio . . . . . . . . . . . . . . . . . . 5.12 Pgina de uma proposta de seminrio . . . . . . . . . . . . . . . . . . . . . 5.13 Pgina de um seminrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.14 Pgina principal do Disseminrio . . . . . . . . . . . . . . . . . . . . . . . . 5.15 Opo para participar de um seminrio . . . . . . . . . . . . . . . . . . . . . 5.16 Pgina de um participante de um seminrio . . . . . . . . . . . . . . . . . . 5.17 Lista de participantes de um seminrio . . . . . . . . . . . . . . . . . . . . . 5.18 Enlace para publicao de apresentao . . . . . . . . . . . . . . . . . . . . 5.19 Pgina de publicao de apresentao . . . . . . . . . . . . . . . . . . . . . 5.20 Lista de apresentaes de um seminrio . . . . . . . . . . . . . . . . . . . . 5.21 Uma apresentao publicada em um seminrio . . . . . . . . . . . . . . . . . 5.22 Hierarquia de papis de usurios . . . . . . . . . . . . . . . . . . . . . . . . 6.1 6.2 6.3 Arquitetura do Disseminrio . . . . . . . . . . . . . . . . . . . . . . . . . . Comunicao entre um cliente e o Disseminrio . . . . . . . . . . . . . . . . Diagrama das classes dos recursos . . . . . . . . . . . . . . . . . . . . . . .

p. 57 p. 58 p. 59 p. 60 p. 61 p. 61 p. 62 p. 62 p. 63 p. 63 p. 64 p. 64 p. 65 p. 68 p. 68 p. 70

Lista de Tabelas
2.1 2.2 3.1 4.1 4.2 Componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Segurana e Idempotncia . . . . . . . . . . . . . . . . . . . . . . . . . . . URIs de Recursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mtodos implementados nos Recursos . . . . . . . . . . . . . . . . . . . . . p. 28 p. 28 p. 35 p. 41 p. 42

Lista de Listagens
4.1 4.2 Representao XHTML com Marcaes Descritivas . . . . . . . . . . . . . . Histria: Usurio Participando de Seminrio . . . . . . . . . . . . . . . . . . p. 43 p. 49 p. 76 p. 76 p. 78 p. 79 p. 80 p. 83 p. 83 p. 87 p. 89 p. 95 p. 97 p. 99

A.1 Arquivo: Teste.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.2 Arquivo: PublicadorDaHistoriaDaPsicologiaLatinoAmericana.java . . . . . . A.3 Arquivo: TesteRepresentacaoXHTML.java . . . . . . . . . . . . . . . . . . A.4 Arquivo: RepresentacaoNula.java . . . . . . . . . . . . . . . . . . . . . . . A.5 Arquivo: RepresentacaoXHTML.java . . . . . . . . . . . . . . . . . . . . . A.6 Arquivo: Enlace.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.7 Arquivo: Microformato.java . . . . . . . . . . . . . . . . . . . . . . . . . . A.8 Arquivo: TesteMicroformato.java . . . . . . . . . . . . . . . . . . . . . . . A.9 Arquivo: TesteHistoriaDePsicologiaLatinoAmericana.java . . . . . . . . . . A.10 Arquivo: TesteRecursoSeminario.java . . . . . . . . . . . . . . . . . . . . . A.11 Arquivo: TesteDeRecurso.java . . . . . . . . . . . . . . . . . . . . . . . . . A.12 Arquivo: TesteRecursoSeminarios.java . . . . . . . . . . . . . . . . . . . . .

A.13 Arquivo: ClienteHTTPComAutenticacao.java . . . . . . . . . . . . . . . . . p. 101 A.14 Arquivo: ClienteHTTPAdministrador.java . . . . . . . . . . . . . . . . . . . p. 102 A.15 Arquivo: QuandoFoiFeitaUmaPropostaDeSeminario.java . . . . . . . . . . . p. 104 A.16 Arquivo: QuandoApresentacaoENova.java . . . . . . . . . . . . . . . . . . . p. 114 A.17 Arquivo: QuandoUsuarioEVisitante.java . . . . . . . . . . . . . . . . . . . . p. 121 A.18 Arquivo: QuandoOSeminarioENovo.java . . . . . . . . . . . . . . . . . . . p. 123 A.19 Arquivo: QuandoExisteOSeminario.java . . . . . . . . . . . . . . . . . . . . p. 131 A.20 Arquivo: QuandoExisteOCadastramento.java . . . . . . . . . . . . . . . . . p. 135

A.21 Arquivo: InfraEstruturaDeEspecicacao.java . . . . . . . . . . . . . . . . . p. 138 A.22 Arquivo: ClienteHTTPNaoBloqueante.java . . . . . . . . . . . . . . . . . . p. 143 A.23 Arquivo: QuandoCadastramentoENovo.java . . . . . . . . . . . . . . . . . . p. 144 B.1 Arquivo: Data.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 148 B.2 Arquivo: BasePropostaDeSeminario.php . . . . . . . . . . . . . . . . . . . . p. 149 B.3 Arquivo: BaseParticipante.php . . . . . . . . . . . . . . . . . . . . . . . . . p. 150 B.4 Arquivo: BaseApresentacao.php . . . . . . . . . . . . . . . . . . . . . . . . p. 151 B.5 Arquivo: BaseCadastramento.php . . . . . . . . . . . . . . . . . . . . . . . p. 152 B.6 Arquivo: BaseCadastrosTemporariosDeUsuarios.php . . . . . . . . . . . . . p. 153 B.7 Arquivo: BaseSeminario.php . . . . . . . . . . . . . . . . . . . . . . . . . . p. 153 B.8 Arquivo: BaseUsuario.php . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 155 B.9 Arquivo: Apresentacoes.inc.php . . . . . . . . . . . . . . . . . . . . . . . . p. 156 B.10 Arquivo: Seminarios.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . . p. 157 B.11 Arquivo: Usuarios.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 158 B.12 Arquivo: Apresentacao.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . p. 160 B.13 Arquivo: PropostaDeSeminario.inc.php . . . . . . . . . . . . . . . . . . . . p. 161 B.14 Arquivo: Cadastramento.inc.php . . . . . . . . . . . . . . . . . . . . . . . . p. 161 B.15 Arquivo: Usuario.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 161 B.16 Arquivo: Participante.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . . p. 163 B.17 Arquivo: Cadastramentos.inc.php . . . . . . . . . . . . . . . . . . . . . . . p. 163 B.18 Arquivo: Seminario.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 164 B.19 Arquivo: Participantes.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . p. 165 B.20 Arquivo: PropostasDeSeminarios.inc.php . . . . . . . . . . . . . . . . . . . p. 165 B.21 Arquivo: MensagemDeConrmacaoDeCadastramento.inc.php . . . . . . . . p. 166 B.22 Arquivo: MensagemHTML.inc.php . . . . . . . . . . . . . . . . . . . . . . p. 167 B.23 Arquivo: MensagemDeCorreioEletronicoAbstrata.inc.php . . . . . . . . . . p. 168

B.24 Arquivo: MensagemDeSeminarioCriado.inc.php . . . . . . . . . . . . . . . p. 169 B.25 Arquivo: MensagemDeCorreioEletronico.inc.php . . . . . . . . . . . . . . . p. 169 B.26 Arquivo: MensagemDePropostaCriada.inc.php . . . . . . . . . . . . . . . . p. 170 B.27 Arquivo: MensagemDeContaCriada.inc.php . . . . . . . . . . . . . . . . . . p. 171 B.28 Arquivo: MimeTypes.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . . p. 171 B.29 Arquivo: Disseminario.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . p. 172 B.30 Arquivo: RecursoUmaPropostaDeSeminario.inc.php . . . . . . . . . . . . . p. 173 B.31 Arquivo: RecursoPropostasDeSeminario.inc.php . . . . . . . . . . . . . . . p. 177 B.32 Arquivo: RecursoAdministradores.inc.php . . . . . . . . . . . . . . . . . . . p. 179 B.33 Arquivo: RecursoUmaApresentacao.inc.php . . . . . . . . . . . . . . . . . . p. 179 B.34 Arquivo: RecursoAdministrador.inc.php . . . . . . . . . . . . . . . . . . . . p. 186 B.35 Arquivo: RecursoPropostaDeSeminario.inc.php . . . . . . . . . . . . . . . . p. 188 B.36 Arquivo: RecursoUsuario.inc.php . . . . . . . . . . . . . . . . . . . . . . . p. 189 B.37 Arquivo: RecursoCoordenador.inc.php . . . . . . . . . . . . . . . . . . . . . p. 191 B.38 Arquivo: RecursoCadastroDeUsuario.inc.php . . . . . . . . . . . . . . . . . p. 191 B.39 Arquivo: RecursoApresentacao.inc.php . . . . . . . . . . . . . . . . . . . . p. 192 B.40 Arquivo: RecursoCoordenadores.inc.php . . . . . . . . . . . . . . . . . . . . p. 193 B.41 Arquivo: RecursoParticipantes.inc.php . . . . . . . . . . . . . . . . . . . . . p. 193 B.42 Arquivo: RecursoApresentacoes.inc.php . . . . . . . . . . . . . . . . . . . . p. 194 B.43 Arquivo: RecursoCadastramento.inc.php . . . . . . . . . . . . . . . . . . . . p. 196 B.44 Arquivo: RecursoSeminarios.inc.php . . . . . . . . . . . . . . . . . . . . . . p. 200 B.45 Arquivo: RecursoUmArquivoDeApresentacao.inc.php . . . . . . . . . . . . p. 201 B.46 Arquivo: Recurso.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 202 B.47 Arquivo: RecursoUsuarios.inc.php . . . . . . . . . . . . . . . . . . . . . . . p. 206 B.48 Arquivo: RecursoUmParticipante.inc.php . . . . . . . . . . . . . . . . . . . p. 207 B.49 Arquivo: RecursoSeminario.inc.php . . . . . . . . . . . . . . . . . . . . . . p. 209

B.50 Arquivo: RecursoConrmacaoDeCadastroDeUsuario.inc.php . . . . . . . . . p. 212 B.51 Arquivo: MensagemNaoPodeSerEnviada.inc.php . . . . . . . . . . . . . . . p. 213 B.52 Arquivo: Mensageiro.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . . p. 213 B.53 Arquivo: Requisicao.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . . p. 214 B.54 Arquivo: ArquivoDeConteudo.inc.php . . . . . . . . . . . . . . . . . . . . . p. 218 B.55 Arquivo: Arquivo.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 218 B.56 Arquivo: AutenticacaoBasica.inc.php . . . . . . . . . . . . . . . . . . . . . p. 219 B.57 Arquivo: AutenticacaoCondicional.inc.php . . . . . . . . . . . . . . . . . . p. 219 B.58 Arquivo: Roteador.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 220 B.59 Arquivo: Rota.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 221 B.60 Arquivo: index.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 222 B.61 Arquivo: PropostaDeSeminarioComFormulario.tpl.php . . . . . . . . . . . . p. 224 B.62 Arquivo: Enlace.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 225 B.63 Arquivo: FormularioEnvioDeApresentacao.tpl.php . . . . . . . . . . . . . . p. 225 B.64 Arquivo: Participante.tpl.php . . . . . . . . . . . . . . . . . . . . . . . . . . p. 229 B.65 Arquivo: Cadastramento.tpl.php . . . . . . . . . . . . . . . . . . . . . . . . p. 229 B.66 Arquivo: FormularioDeConrmacaoDeCadastro.tpl.php . . . . . . . . . . . p. 229 B.67 Arquivo: FormularioPropostaDeSeminario.tpl.php . . . . . . . . . . . . . . . p. 232 B.68 Arquivo: Usuario.tpl.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 236 B.69 Arquivo: UmaApresentacao.tpl.php . . . . . . . . . . . . . . . . . . . . . . p. 236 B.70 Arquivo: TemplateXHTML.inc.php . . . . . . . . . . . . . . . . . . . . . . p. 237 B.71 Arquivo: Mensagem.tpl.php . . . . . . . . . . . . . . . . . . . . . . . . . . p. 238 B.72 Arquivo: Seminario.tpl.php . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 238 B.73 Arquivo: Rodape.tpl.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 240 B.74 Arquivo: Colecao.tpl.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 241 B.75 Arquivo: Cabecalho.tpl.php . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 242

B.76 Arquivo: FormularioDeCadastroDeUsuario.tpl.php . . . . . . . . . . . . . . p. 243 B.77 Arquivo: PropostaDeSeminario.tpl.php . . . . . . . . . . . . . . . . . . . . p. 244 B.78 Arquivo: conguracao.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . p. 245

Lista de abreviaturas e siglas


SOA REST BDD TDD DDD Service-Oriented Architecture, Representational State Transfer, Behaviour Driven Development, Test-Driven Development, Domain Driven Development, p. 18 p. 20 p. 46 p. 46 p. 48

18

Introduo

Atualmente grande parte dos sistemas web so projetados baseados em uma arquitetura orientada a servios (), muitas vezes inapropriada dada sua complexidade, que apresenta recursos avanados proveitosos apenas em contextos especcos. Como alternativa tem-se o estilo arquitetural no qual a web foi projetada, REST, e uma srie de boas prticas para o desenvolvimento de um sistema web que sigam as restries REST, a arquitetura orientada a recursos. Estas teorias foram aplicadas no desenvolvimento de um sistema web de apoio a seminrios, o Disseminrio, utilizando-se tambm de tcnicas geis, como o desenvolvimento guiado por comportamento como metodologia. Esta monograa dividida em seis captulos, no primeiro trata-se de REST, os estilos do qual se derivou e seus elementos arquiteturais. No segundo captulo tratado sobre Arquitetura orientada a recursos, seus conceitos, propriedades. O terceiro captulo descreve a metodologia utilizada no projeto de sistemas orientados a recursos.No quarto abordado o sistema Disseminrio de apoio a seminrios. No quinto so expostos aspectos da implementao e no captulo nal, so apresentadas concluses, resultados e propostas de trabalhos futuros.

1.1

Objetivo Geral

Compreender o estilo arquitetural REST e a Arquitetura Orientada a Recursos e aplicar estes conceitos no desenvolvimento de um sistema de apoio a seminrios.

1.2

Objetivos Especcos

Compreender o estilo arquitetural REST Compreender a arquitetura orientada a recursos

19

Desenvolver um sistema de apoio a seminrios Aplicar tcnicas de desenvolvimento gil

20

REST

Rest um estilo arquitetural hbrido, derivado de vrios estilos arquiteturais de software em rede. Ele foi proposto por Roy Fielding em 2000, na sua dissertao de doutorado[1], que buscou uma combinao de estilos arquiteturais de forma a compor um estilo que reunisse as melhores caractersticas1 para um sistema distribudo de hipermdia. Um estilo arquitetural um conjunto coordenado de restries arquiteturais, que recebe nome por facilidade de uso, sendo composto por restries arquiteturais e elementos arquiteturais, estes, divididos em elementos de dados, conectores e componentes. Estilos arquiteturais podem ser criados, sem o reuso de estilos pr-existentes, ou criados a partir de composio de estilos j existentes, REST se encaixa na ltima. A cada adio de uma restrio a um estilo arquitetural, pode ocasionar a derivao de um novo estilo. O espao de todos estilos arquiteturais pode ser visto com uma rvore, em que a raiz o estilo nulo ou sem restries, e a cada adio de uma restrio criado um novo estilo, que por sua vez, pode dar origem a outro, caso seja adicionada a ele uma nova restrio.

2.1

Derivao de REST

REST foi derivado dos seguintes estilos: Cliente/servidor Sem estado Cache Interface Uniforme
em rede, performance percebida pelo usurio, ecincia, escalonabilidade, simplicidade, evolutividade, extensibilidade, personabilidade, congurabilidade, reusabilidade, visibilidade, portabilidade e conabilidade.
1 Performance

21

Sistema em Camadas Cdigo sob-demanda

2.1.1

Cliente/Servidor

A primeiro estilo arquitetural utilizado na derivao de REST foi o Cliente/Servidor. Nele so denidos dois papis: o do servidor, que disponibiliza um conjunto de servios, e do cliente, que faz uso destes servios. O servidor aguarda por requisies de clientes para uso de servios, e ao receb-las, toma a deciso de aceit-las ou no. Fielding considera a separao de preocupaes como sendo o princpio por trs desta arquitetura. Um exemplo o servio de correio eletrnico. De um lado tm-se o leitor de correio eletrnico, que assume o papel de cliente, e do outro o servidor de correio eletrnico. O leitor tem a preocupao de facilitar o gerenciamento e leitura de mensagens, atravs de uma interface grca operada pelo usurio. O servidor tem preocupaes diferentes, como o armazenamento eciente das mensagens e a rapidez no acesso as mesmas. Fazendo-se tal separao, resta entre os dois uma interface comum, facilitando a portabilidade do cliente e a simplicao do servidor, aumentando a escalonabilidade. A gura 2.1 ilustra o estilo arquitetural aps a primeira restrio aplicada.

Figura 2.1: O estilo cliente servidor [1]

2.1.2

Sem-Estado

Na restrio Sem Estado o servidor no armazena qualquer informao de contexto, qualquer informao necessria para atender a uma requisio deve estar contida nela mesma. Isto torna o servidor mais simples, pois ele no precisa levar em considerao o contexto atual para tomar decises, toda informao necessria ser enviada a ele a cada requisio.

22

. Pode-se citar a autenticao via cabealho HTTP como um exemplo da aplicao da restrio sem estado. Numa primeira requisio enviada pelo cliente, o servidor responde com um cabealho exigindo autenticao, esse deve enviar as credenciais e aguardar pelo resultado, caso forem aceitas o servidor atender a requisio. O processo no se altera nas requisies seguintes, porm, o cliente poder optar por armazenar as credenciais, para evitar que o usurio tenha de digit-las novamente a cada requisio. Pode-se dizer que com a incluso desta restrio a escabilidade aumenta, pois o servidor no precisa armazenar dados de contexto entre requisies, podendo assim, liberar recursos. Como cada requisio porta todos os dados necessrios para reconhec-la, a visibilidade aumentada. A gura 2.2 evidencia o estilo arquitetural cliente/servidor sem estado.

Figura 2.2: O estilo Sem-Estado [1] Algumas desvantagens do estilo Sem-Estado so a redundncia dos dados, que precisam ser enviados novamente a cada requisio e a reduo do controle por parte do servidor do funcionamento correto da aplicao, pois o cliente que efetua o controle do estado da aplicao.

2.1.3

Cache

A restrio arquitetural cache evita que dados j tenham sido enviados anteriormente ao cliente, sejam re-enviados. Para tanto, deve haver uma indicao implcita ou explcita em cada requisio, informando se deve ser utilizado cache ou no. Segundo [1], a vantagem de se utilizar cache a eliminao parcial ou total de algumas interaes entre cliente/servidor. Melhorando a ecincia (menos dados trafegando com a mesma funcionalidade), escalabilidade (menos processamento e E/S) e a performance percebida pelo usurio (servidor menos carregado, menor tempo de resposta). Contudo, a conabilidade

23

Figura 2.3: O estilo Cache [1] reduzida, pois pode acontecer de dados obtidos diretamente do servidor (sem uso de cache), serem substancialmente diferentes dos dados obtidos anteriormente com cache, isso depende da poltica adotada pelo cliente, que pode expirar uma requisio depois de n tempo ou trabalhar com requisies se modicado depois de. O resultado da aplicao da restrio cache ao estilo Cliente/Servidor, Sem-Estado, pode ser visualizado na gura 2.3

2.1.4

Interface uniforme

A principal distino entre REST e outros estilos arquiteturais para web a enfse no uso de uma interface uniforme entre seus componentes [1]. Com o uso de uma interface uniforme, a visibilidade de cada interao aumentada pois o conjunto de mtodos para cada elemento do sistema conhecido, sendo assim, a cada execuo de um mtodo sua semntica sempre conhecida. O sistema se torna mais simples, pois cada componente implementa os mesmos mtodos. Aplicando-se a restrio interface uniforme ao REST, vericamos o seguinte estilo 2.4

2.1.5

Camadas

Na restrio camadas, o sistema dividido em camadas e a cada camada conhece apenas a fachada da camada seguinte, criando-se vrios subsistemas. Essa restrio diminui a acoplamento, pois cada camada tem acesso apenas a interface da camada seguinte, sem saber os detalhes de implementao desta. Pode-se utilizar, por exemplo, a persistncia em uma subcamada, permitindo acesso apenas

24

Figura 2.4: Interface Uniforme [1]

Figura 2.5: Sistema em Camadas [1]

25

sua API, isso permite sua substituio, caso torne-se necessrio.

2.1.6

Cdigo sob demanda

O cdigo sob demanda a utilizao de lgica armazenada no servidor, a ser executada pelo cliente. Desta forma, partes do cliente cam pr-implementadas no servidor. Applets e cdigo JavaScript armazenados no servidor, so exemplos de cdigo sob demanda. O cdigo sob demanda a nica restrio arquitetural opcional de REST.

Figura 2.6: Cdigo sob demanda [1]

2.2
2.2.1

Elementos Arquiteturais
Elementos de Dados

Os elementos de dados de um estilo arquitetural so os elementos de informao que so trocados entre componentes, via conectores. Rest possue trs elementos de dados: Recursos, Identicadores de Recursos e Representaes. Recursos Um recurso qualquer informao que possa ser nomeada: um documento, uma imagem, um servio metereolgico, uma coleo de outros recursos, um recurso no virtual (por exemplo

26

uma pessoa) e assim por diante. Em outras palavras, qualquer conceito que possa ser sujeito a uma referncia hipertextual se encaixa na denio de recurso [1]. Formalmente um recurso R uma funo de pertinncia, que tem como domnio o tempo e como imagem um conjunto de entidades ou valores que so equivalentes, os valores neste conjunto podem ser representaes de recurso e/ou identicadores de recurso. Um recurso pode mapear para o conjunto vazio, o que permite que referncias sejam feitas antes de que qualquer implementao do conceito exista [1]. Um recurso considerado dinmico caso o conjunto de entidades ao qual mapeia varie com o tempo, ou esttico caso contrrio. O recurso se refere ao mapeamento em si, e no ao conjunto de entidades ao qual ele mapeia. Por exemplo um recurso que corresponde a ltima verso de um software qualquer e outro que corresponde a verso 1.0 deste mesmo software, em um determinado instante de tempo podemos ter a verso 1.0 coincidindo com ltima verso, ambos os recursos estaro mapeando para a mesma entidade, mas estes recursos so diferentes pois suas semnticas so diferentes, podendo ser identicados e referenciados de forma independente. Recursos generalizam vrias fontes de informao, sem distinguir por tipo ou implementao e permitem uma ligao tardia entre recurso e representao, permitindo que o contedo da resposta seja denido atravs de caractersticas da requisio e permitindo que o autor de uma referencia aponte para um conceito, e no uma representao nica do mesmo, desta forma quando a representao for alterada no ser necessrio alterar as referncias ao seu recurso (assumindo que o autor utilizou o identicador correto). [1] Identicadores de recursos A funo do identicador de recurso a identicao de um recurso envolvido em uma determinao interao. Todo recurso referenciado por meio de um identicador de recurso, o responsvel pelo identicador tambm responsvel por manter a validade semntica do mapeamento, garantindo que o identicador estar referenciando o recurso correto. O identicador de recurso utilizado na Web a URI. Representaes Componentes REST manipulam recursos usando uma representao para descrever o estado atual ou desejado do recurso e transferindo esta representao entre os componentes. Uma representao uma sequncia de bytes e meta-dados(informao sobre informao) para descrever estes bytes [1]

27

Meta-dados so enviados como pares de nome-valor e podem descrever dados sobre o recurso, uma de suas representaes ou mesmo sobre outros meta-dados (esta referencia cclica geralmente utilizada para vericar a integridade de mensagens). Dados de controle denem o propsito de uma mensagem entre os componentes como a ao requisitada ou o signicado de uma resposta, estes dados tambem so utilizados para parametrizar uma requisio e alterar o comportamento padro dos elementos conectados. Por exemplo o comportamento da cache pode ser modicado por dados de controle embutidos em uma requisio.[1] O tipo de dados de uma representao conhecido como tipo de mdia, uma representao pode ser entregue atravs de uma mensagem e processada pelo destinatrio de acordo com os dados de controle e o tipo de mdia, tipos de mdia compostos podem envolver vrias representaes em uma nica mensagem.[1] Podemos realizar a negociao de contedo baseada nos tipo de mdias disponveis de uma representao, por exemplo um recurso ata de reunio pode ser representada por um documento, uma imagem da ata manuscrita ou mesmo uma gravao em um arquivo de udio, a representao pode conter meta-dados como: o nmero de pginas no caso do documento, tamanho em pixeis na imagem ou durao em segundos na gravao.

2.2.2

Componentes

Um componente uma unidade abstrata de software, e um estado interno, que executa transformaes em dados atravs de sua interface [1]. Pode-se denir tambm, como o elemento de um sistema que efetua computaes [3]. Os componentes so os extremos nas interaes, fazendo interface com o usurio. Exemplos de componentes esto expostos na tabela 2.1. O componente agente de usurio utiliza um conector cliente para fazer requisies a um servidor de origem e receber respostas. Ele pode tambm, conectar-se a um proxy e fazer requisies a este, a m encapsular a API de outros servios, traduzir dados, melhorar a performance ou melhorar a aspectos de segurana [1]. Um gateway um proxy inverso, imposto pelo agente servidor de origem, utilizado pelos mesmos motivos que levam o agente de usurio a utilizar um proxy.

28

Componente Exemplo WEB Atual servidor de origem apache Firefox agente do usurio gateway Squid Squid proxy Tabela 2.1: Componentes Conector Exemplo WEB Atual cliente libwww servidor libwww cache cache do navegador resolvedor libDNS SOCKS tnel Tabela 2.2: Conectores

2.2.3

Conectores

Os conectores so mecanismos abstratos de software que mediam comunicao, coordenao ou cooperao entre componentes[1]. REST possui uma srie deles, como pode ser visto na tabela 2.2, com a nalidade de encapsular o acesso a recursos e a transferncia de representaes entre componentes. Por causa da interface uniforme de REST, os conectores podem ser facilmente substitudos, uma vez que compartilham da mesma interface, abstraindo-se os detalhes de implementao.

29

Arquitetura Orientada a Recursos

A arquitetura orientada a recursos uma arquitetura que segue o estilo arquitetural REST, herdando dele, todas as restries e elementos arquiteturais. Foi desenvolvida atravs de diversas observaes empricas por Sam Ruby e Leonard Richardson em [4]. ROA uma arquitetura voltada para servios web, sendo implementada a partir de tecnologias da web como o protocolo HTTP[5] e a linguagem de marcao XML[6]. ROA tambm dene algumas propriedades que uma aplicao que segue esta arquitetura deve possuir: Endereabilidade, Sem-estado, Conectividade e Interface Uniforme.

3.1

Conceitos

Os conceitos de ROA so mais especicos que suas denies em REST, pois so utilizadas tecnologias web especicas nas denies.

3.1.1

Recursos

Em ROA a interface uniforme de cada recurso denida pelo conjunto de mtodos utilizados no protocolo HTTP.

3.1.2

Identicadores de Recursos

Os identicadores de recursos devem ser URIs(Uniform Resource Identiers)[7], que o formato de identicadores utilizado na web. Alm disso, as URIs devem ser descritivas e seguir uma certa estrutura. A justicativa para a descritividade das URIs que elas so intuitivas para o usurio, que deve poder l-las e saber facilmente que se referem.

30

URIs devem ter uma estrutura, variar de maneira previsivel, para facilitar seu uso por clientes sejam eles humanos ou mquinas. Por exemplo, considere as seguintes URIs: Exemplo: /animal/Gato /bicho/Tainha Na listagem acima, h dois endereos para recursos com a mesma semntica informal: /bicho e /animal. Um usurio que acessar /animal/Gato pode querer acessar /animal/Tainha, caso o recurso endereado por /animal/Tainha no esteja acessvel teremos um problema, pois impedimos o usurio de acessar um recurso que semnticamente vlido mas no est acessvel, pois no foi seguida uma estrutura previsvel ao enderear os recursos.

3.1.3

Representaes

Representaes so trocadas entre cliente e servidor atravs dos mtodos HTTP. Negociao de contedo pode ser efetuada atravs de meta-dados enviados nos cabealhos das requisies, por exemplo o cabealho Accept pode ser usado em uma requisio para restringir o tipo de mdia (MIME Type) obtido na resposta. Uma alternativa a utilizao de meta-dados nos cabealhos das requisies enderear cada representao do recurso atravs de uma URI, por exemplo: Um usurio acessando: /animal/Gato, utilizando o cabealho Accept na requisio um cliente pode decidir se deseja receber uma imagem ou informaes textuais sobre gatos, como alternativa a isto podemos ter duas URIs /animal/Gato.txt designando informaes textuais sobre gatos e /animal/Gato.svg como uma imagem. A vantagem de utilizar diferentes URIs para diferentes representaes de um mesmo recurso que a informao est explicita na URI, este endereo pode ser copiado e passado adiante por um usurio. A desvantagem que os recursos endereados por /animal/Gato.svg e /animal/Gato.txt parecem recursos diferentes, mas ambos descrevem o mesmo conceito, apenas com um formato diferente, uma soluo para este problema criar um URI cannica em /animal/Gato, nesta URI existiria uma representao que teria enlaces para todas as representaes possveis do recurso em questo.

31

3.2
3.2.1

Propriedades
Endereabilidade

Uma aplicao endereavel quando um usurio pode acessar os dados, os recursos da aplicao, atravs de URIs. Esta propriedade garante aspectos interessantes, por exemplo um usurio que queira procurar sobre buracos negros acessa a URI: http://www.google.com.br/search?q=buraco+negro Sua busca est endereada, a URI pode ser copiada e passada adiante para que outros interessados possam realizar a mesma busca. Com endereabilidade tambm possvel fazer cache de requisies, em uma rede local podemos ter uma mquina recebendo todas as requisies(um proxy HTTP), quando uma requisio repetida podemos enviar um resultado salvo ao invs de consumir banda realizando a mesma requisio duas vezes, sem endereabilidade no possvel saber quais requisies j foram efetuadas.

3.2.2

Sem-estado

Sem-estado signica que cada requisio HTTP ocorre em completo isolamento. Quando o cliente envia uma requisio HTTP, ele inclue toda a informao necessria para que o servidor satisfaa a requisio. O servidor nunca se vale de informaes de requisies anteriores.[4]. Por exemplo, um usurio que esteja na pgina dois da sua pesquisa sobre buracos negros, caso ele queira que outro usurios acesse a mesma busca, com os mesmos resultados ele pode copiar a URI:

http://www.google.com.br/search?q=buraco+negro&start=2
Neste caso a prpria URI contm o estado da aplicao, e no o servidor, o que evidenciado pela gura 3.1 que representa um diagrama de estados. Caso esta informao estivesse no servidor este teria de gerenciar a informao do nmero da pgina de cada cliente da aplicao, e um novo cliente teria de efetuar transies realizando

32

Figura 3.1: Aplicao Sem-Estado

Figura 3.2: Aplicao Com-Estado

33

operaes no servidor at chegar ao estado desejado, conforme pode ser vericado na gura 3.1.

3.2.3

Conectividade

Conectividade a propriedade que permite que um cliente navegue por entre os recursos da aplicao atravs de enlaces hipermdia embutidos nas representaes. Quando um usurio acessa: http://www.google.com.br/search?q=buraco+negro ele recebe uma srie de enlaces pelos quais pode navegar, podendo acessar um dos resultados da pesquisa, mudar de pgina, entre outras funcionalidades, conforme a gura 3.3. Quando o servidor envia uma representao com enlaces, ele est enviando para o cliente uma srie de URIs com estados possveis da aplicao, possvel mostrar esta propriedade atravs de um grafo, onde os nodos so os recursos e as arestas enlaces ligando-os, conforme a gura3.4.

Figura 3.3: Pesquisa sobre Buracos Negros

34

Figura 3.4: Uma aplicao conexa

3.2.4

Interface Uniforme

A interface uniforme dene o conjunto de operaes possveis para cada recurso. Estas operaes so restritas aos mtodos do protocolo HTTP, e so listadas abaixo, com a semntica associada: GET: Obtm a representao de um recurso, assim como os meta-dados associados. DELETE: Remove um recurso. PUT: Cria ou atualiza um recurso na URI especicada. POST: Cria um recurso subordinado ou anexa informaes a um recurso, respondendo com a URI do novo recurso. OPTIONS: Lista quais os mtodos que podem ser executados no recurso. HEAD: Idntico ao GET, mas omitindo a representao. Idempotncia e Segurana dos mtodos da Interface Uniforme Os mtodos da interface uniforme de ROA, podem ser classicados quanto a sua idempotncia e segurana. Um mtodo seguro, se e somente se, ao ser executado no altera o estado do recurso.

35

Mtodo Seguro Idempotente X X GET X PUT POST DELETE X HEAD X X X X OPTIONS Tabela 3.1: Segurana e Idempotncia Um mtodo idempotente quando a execuo dele mais de uma vez consecutiva tem o mesmo efeito da execuo do mesmo uma nica vez, todo mtodo seguro tambm idempotente. Os mtodos GET, HEAD e OPTIONS so seguros e idempotentes, pois no alteram o estado do recurso. PUT e DELETE no so seguros mas so idempotentes, uma sequncia de requisies PUT idnticas iro manter o estado do recurso, assim como a requisio DELETE, que remove o recurso na primeira requisio e este continua no existindo se outras requisies DELETE forem efetuadas. O mtodo POST o nico mtodo no-seguro e no-idempotente. Estas informaes podem ser vericadas na tabela 3.1.

36

Metodologia

A metodologia de projeto foi baseada no procedimento descrito em [4] que descreve detalhadamente como desenvolver uma aplicao orientada a recursos. Tambm foi utilizada a tcnica gil conhecida como Behavior Driven Development[8] na elaborao especicaes executveis que garantem o funcionamento do sistema e tambm podem ser usadas como documentao, pois descrevem todas as regras do negcio em uma linguagem prxima da natural.

4.1

Resumo do Procedimento

O procedimento proposto em [4] dividido em nove passos: 1. Identicao dos dados do domnio 2. Denio dos recursos 3. Denio dos nomes dos recursos 4. Denio das operaes sobre os recursos 5. Denio das representaes aceitas pelo servidor 6. Denio das representaes oferecidas pelo servidor 7. Interligao dos recursos 8. Denio das respostas bem sucedidas 9. Denio das respostas mal sucedidas

37

4.1.1

Identicao dos dados do domnio

Nesta etapa so identicadas quais as informaes que sero fornecidas aos clientes do servio, baseando-se no domnio da aplicao. No Disseminrio, temos diversos dados nos quais um cliente pode estar interessado, tais como: Usurios Seminrios Coordenadores de seminrio Participantes de um seminrio Apresentaes Podemos visualizar a relao entre os dados de domnio atravs de um diagrama entidaderelacionamento 4.1

Figura 4.1: Diagrama entidade relacionamento do Disseminrio

38

4.1.2

Denio dos recursos

Com o conjunto de dados denido o prximo passo denir como sero expostos como recursos HTTP, um recurso qualquer coisa importante o suciente para ser alvo de um hyperlink[4]. Nesta etapa so detalhados os dados do domnio para escolher como exp-los para o cliente. Cada entidade de domnio possu informaes, seus atributos, por exemplo um seminrio possu um ttulo e um tema, um usurio possu um endereo de correio eletrnico, estas so informaes que podem ser de interesse de um cliente, recursos acessveis por ele. Foi estabelecida uma relao direta entre as entidades e recursos, um recurso para cada entidade do domnio: Usurio Seminrio Apresentao Entidades derivadas de relaes tambm podem ser referenciadas, tornando-as recursos. Um coordenador pode ser referenciado, assim como um participante, tornando-os endereveis. Quando uma proposta de seminrio feita ela deve ter um endereo, para que o administrador possa acessa-l e decidir se ir aprovar ou no. Coordenador Participante de um seminrio Proposta de seminrio Um cliente pode estar interessado na lista de seminrios, para publicar em seu blog, ou na lista de usurios, para entrar em contato com eles atravs de mensagens de correio eletrnico. A lista de seminrios e a lista de usurios so recursos de coleo, foram criados recursos de coleo para cada recurso de entidade: Usurios Seminrios

39

Coordenadores Participantes de um seminrio Apresentaes de um seminrio Propostas de seminrios Como os usurios interagem com o servio atravs do navegador preciso prover formulrios que possam ser renderizados pelo navegador, tais como 5.11, para que possam ser preenchidos pelo usurio em enviados novamente ao servidor, tais formulrios tambm so recursos. Formulrio de cadastramento 5.1 Formulrio de conrmao de cadastramento 5.3 Formulrio de criao de proposta de seminrio 5.11 Formulrio de envio de apresentao 5.19 Outro recurso criado foi o de cadastramento, que representa uma operao de criao de conta que ainda no foi concluda. O que motivou a criao deste recurso foi o fato da criao de conta ser feita em duas etapas, sendo criado o recurso na primeira etapa e tendo que persistir e ser enderevel para a conrmao na segunda, este recurso foi criado baseado na idia de transao, exposta em [4].

4.1.3

Denio dos nomes dos recursos

Todo recurso deve ter um nome, estabelecido atravs de uma URI[4], alm disso cada URI deve ser descritiva, de fcil entendimento para humanos, e seguir uma certa estrutura que varie o mnimo possvel, evitando ambiguidades. Na URI raiz do Disseminrio so listados todos os seminrios abertos ao pblico, os demais recursos de coleo so denotados pelo nome da coleo. Abaixo podemos visualizar algumas URIs e as semnticas dos recursos identicados por cada uma delas, as URIs foram abreviadas para carem relativas ao endereo completo do Disseminrio. / : Coleo de todos os seminrios pblicos

40

/propostasDeSeminario : Coleo de propostas de seminrio /usuarios : Coleo de todos os usurios /administradores : Coleo de usurios que so administradores /coordenadores : Coleo de usurios que so coordenadores Foram criadas recursos relativos a outros recursos, todos os recursos esto vinculados ao recurso raiz mas podemos aprofundar estas relaes, como por exemplo a coleo de participantes ou as apresentaes de um seminrio, a barra neste caso fornece a idia de escopo onde o recurso do lado direito da barra est vinculado ao recurso do lado esquerdo, como pode ser visto abaixo: /ArteBarroca : Seminrio de arte barroca /ArteBarroca/participantes : Coleo de participantes do seminrio de arte barroca /ArteBarroca/apresentacoes : Coleo de apresentaes do seminrio de arte barroca Um recurso que merece destaque o arquivo da apresentao (que pode ser do formato odp,ppt ou pdf), usurios poderiam enviar sua apresentao em vrios formatos para evitar problemas relacionados a diferentes verses do software de visualizao de apresentaes, existem duas opes para representar tipos de mdia especcos, para possibilitar esta funcionalidade.[4]. Uma opo a incluso da informao do tipo de mdia no cabealho HTTP da resposta atravs da propriedade Content-Type, desta forma uma mesma URI pode servir representaes de tipos diferentes de mdia, um cliente acessaria /ArteBarroca/Aleijadinho/apresentacao podendo escolher qual tipo de mdia quer receber na resposta, informando no cabealho de sua requisio a propriedade Accept. A outra opo estabelecer URIs diferentes para cada tipo de mdia, tais como: /ArteBarroca/Aleijadinho/apresentacao.pdf /ArteBarroca/Aleijadinho/apresentacao.odp Nesta opo o tipo de mdia ca explcito na URI, tornando mais claro para o usurio o que est sendo requisitado. Esta foi a opo escolhida no Disseminrio. Todos os exemplos de URIs podem ser visualizados na tabela abaixo:

41

/ /propostasDeSeminario /usuarios /coordenadores /ArteBarroca /ArteBarroca/participantes /ArteBarroca/apresentacoes /ArteBarroca/participante/fulano@edugraf.ufsc.br /ArteBarroca/Aleijadinho/apresentacao.pdf /ArteBarroca/Aleijadinho/apresentacao.odp /ArteBarroca/apresentacao /ArteBarroca/apresentacao/Aleijadinho /usuario/fulano@edugraf.ufsc.br /administrador/fulano@edugraf.ufsc.br /coordenador/fulano@edugraf.ufsc.br /cadastramento /cadastramento/fulano@edugraf.ufsc.br /propostaDeSeminario /propostaDeSeminario/2

Todos os seminrios pblicos Propostas de seminrio Todos os usurios Usurios que so coordenadores Seminrio de arte barroca Participantes do seminrio de arte barroca Apresentaes do seminrio de arte barroca Participante do seminrio de arte barroca Arquivo pdf da apresentao de ttulo Aleijadinho Arquivo odp da apresentao de ttulo Aleijadinho Formulrio de envio de apresentao Apresentao de ttulo Aleijadinho Usurio Usurio administrador Usurio coordenador de Formulrio de cadastramento Processo de cadastramento do usurio Formulrio de proposta de seminrio Proposta de seminrio de cdigo dois

Tabela 4.1: URIs de Recursos

4.1.4

Denio das operaes sobre os recursos

Neste ponto, necessrio decidir quais os mtodos da interface uniforme sero permitidos em cada recurso. Esta escolha uma deciso de projeto e guiada pelo poder que se deseja conferir aos clientes. Como descrito na seo 3.2.4, a interface uniforme de ROA composta pelos mtodos HTTP. A deciso de implementar ou no um mtodo pode ser tomada a partir de perguntas, relativas as aes que os clientes podero efetuar em um determinado recurso: Os clientes podero ler o recurso? Se sim, implementar GET Os clientes podero criar novos recursos deste tipo? Caso armativo. Quem est encarregado de saber onde caro os novos recursos criados? Se o cliente, implementar PUT, caso seja o servidor, implementar POST. Os clientes iro atualizar dados do recurso? Em caso armativo, implementar PUT Os cliente iro remover recursos deste tipo? Se sim, implementar DELETE Os outros dois mtodos da interface uniforme, HEAD e OPTIONS, provm dos mtodos j denidos. O mtodo HEAD, por diferenciar-se do mtodo GET apenas por no enviar o corpo

42

Recurso Administradores Apresentaes Arquivo de apresentao Coordenadores Participantes Raiz ou Seminrios Usurios Administrador Apresentao Cadastramento Coordenador Participante Proposta de Seminrio Propostas de Seminrios Usurio

URI GET /administradores X /{seminrio}/apresentacoes X /{seminrio}/{apresentao}/{arquivo} X /coordenadores X /{seminrio}/participantes X / X /usuarios X /administrador/{correioEletronico} X /{seminrio}/{apresentao} X /cadastramento/{correioEletronico} X /coordenador/{correioEletronico} X /participante/{seminrio}/{correioEl..} X /propostaDeSeminario/{codigo} X /propostasDeSeminario X /usuario/{correioEletronico} X

POST

PUT

DELET E

X X X X X X

X X X X X X X

Tabela 4.2: Mtodos implementados nos Recursos da representao, ser implementado somente caso o mtodo GET o seja. O mtodo OPTIONS tem a funo de informar quais mtodos so permitidos no recurso, sendo implementado em todos eles. A tabela 4.1.4 evidncia as decises tomadas para cada recurso. Recursos que somente implementam GET so somente leitura. Para este tipo de recurso, tomou-se a deciso de no dar o poder ao cliente de apagar ou atualizar colees inteiras. Um recurso de somente leitura particularmente interessante o Arquivo de Apresentao, criado a partir do momento em que um recurso Apresentao criado, sendo seu ciclo de vida vinculado a um recurso de Apresentao. A vrios recursos que implementam um mesmo conjunto de operaes que o recurso de Administrador, estes so atualizveis e delveis, sendo escolhido o cliente como o responsvel por saber onde um novo recurso do tipo ca ao ser criado, razo do PUT para criao. No recurso Propostas de Seminrios, decidiu-se que o servidor seria o encarregado de saber onde cariam os novos recursos, j que podem haver vrias propostas criadas por usurios, inclusive com mesmo nome, justicando-se a implementao de POST. O recurso Usurio no possu mtodo PUT/POST, portanto no possvel para um cliente criar um usurio com uma operao, o que se deve ao fato da criao de usurios dar-se em duas etapas, efetuadas atravs de um transao de cadastramento.

43

4.1.5

Representaes aceitas pelo servidor

O principal critrio na escolha de representaes o tipo de representao que os clientes desejam consumir. A metodologia ROA prope que sejam utilizadas representaes comuns a web, como codicao de formulrio, XML, JSON e XHTML. Como nossos clientes so o navegador web e um cliente automatizado, necessrio utilizar representaes de entrada que possam ser facilmente geradas por eles. Por isso, decidiu-se optar pela codicao de formulrio, que uma representao nativa nos navegadores e com suporte no cliente vericador de especicaes.

4.1.6

Denio das representaes oferecidas pelo servidor

Como j dito na seo 4.1.5, a escolha de representaes depende dos clientes. Buscou-se uma representao de sada que pudesse ser renderizada por um navegador e apresentasse fcilidade para um cliente automatizado extrair as informaes de que precisa. Foi escolhido o formato XHTML[9], por ser XML[6], o que garante boa formao e facilidade extrao de informaes atravs de um parser e tambm renderizvel em um navegador. Alm disto uma representao hipermdia, permitindo a ligao entre recursos. Por tais vantagem, o formato XHTML foi adotado como representao de sada de todos os recursos, exceto o Arquivo de Apresentao. Neste recurso, a representao o prprio arquivo de uma apresentao enviada por um participante de seminrio. A listagem 4.1 um exemplo de representao XHTML. Listagem 4.1: Representao XHTML com Marcaes Descritivas < u l c l a s s =" s e m i n a r i o s " > <li > <a h r e f =" h t t p : / / d i s s e m i n a r i o . e d u g r a f . u f s c . b r / Surrealismo " c l a s s =" s e m i n a r i o " > S u r r e a l i s m o < / a > </ l i > <li > <a h r e f =" h t t p : / / d i s s e m i n a r i o . e d u g r a f . u f s c . b r / Realismo " c l a s s =" s e m i n a r i o " > R e a l i s m o < / a >

44

</ l i > </ u l >

4.1.7

Interligao dos recursos

Um dos aspectos mais importantes no projeto ROA a propriedade de conectividade, que obtida durante esta fase do projeto. Busca-se interligar os recursos de maneira que se tenha uma navegabilidade tima no sistema, com o critrio de que as ligaes entre recursos faam sentido. No se busca um grafo totalmente conexo como o resultado das interligaes entre os recursos, mas sim, o mximo de ligaes coesas. Observando-se o grafo da modelagem das interligaes de recursos no Disseminrio, na gura 4.2, verica-se uma boa conectiviade no sistema. Pois, a partir de qualquer recurso, consegue-se chegar a outro recurso que tenha alguma relao com esse. Como exemplo de boa modelagem, pode-se citar a ligao entre o seminrio Histria de Arte e Participantes, Apresentaes e Coordenador. Todas estas informaes so realmente pertinentes ao seminrio em questo, e, alm de conseguir chegar at elas a partir do recurso do seminrio, possvel voltar ao seminrio posteriormente, caso se queira.

4.1.8

Denio das respostas bem sucedidas

Nesta etapa denida a interao entre cliente e servidor nos casos normais, aqueles em que nenhum erro ocorreu. Deve ser respeitado o protocolo HTTP, que dene cdigos de resposta de acordo com a requisio que foi feita, alm de estabelecidas quais sero as representaes enviadas em cada resposta. Requisies GET e DELETE, quando efetuadas com sucesso, devem receber no cabealho da representao da resposta o cdigo 200 ("OK"), e no seu corpo as informaes desejadas, por exemplo no Disseminrio um GET em Usurios obtm uma lista de usurios, uma operao DELETE nas propostas de seminrio retorna uma pgina informando que a proposta foi removida com sucesso. Requisies PUT e POST, quando efetuadas com sucesso, devem receber no cabealho da representao da resposta o cdigo 201 ("Criado"), no caso de uma requisio POST includo

45

Figura 4.2: Diagrama da Interligao de Recursos

46

um paramatro Location contendo a URI de onde o recurso foi criado, por exemplo, o endereo de uma proposta de seminrio quando efetuado um POST no recurso Propostas de Seminrios. Neste ponto tambm so consideradas questes de cache, um cliente pode ignorar representaes de recursos que no tenham sido atualizadas depois de um determinado periodo para economizar tempo e largura de banda, mas cabe ao servidor vericar se o recurso foi atualizado, repondendo com a representao toda caso tenha sido, ou ento respondendo com o cdigo 304("No Modicado") e omitindo o corpo da representao. Todavia no foi implementado mecnismo de cache no Disseminrio.

4.1.9

Denio das respostas mal sucedidas

Quando algo ocorre de errado na interao entre as partes comunicantes o servidor deve responder com cdigos HTTP nas faixas: 3xx, 4xx, ou 5xx. Cdigos de erros so importantes pois explicitam o motivo do erro, por exemplo, caso um cliente envie uma representao com erros em uma requisio PUT, o servidor deve responder com o cdigo 400("Requisio Incorreta") de forma que o cliente identique a causa pela qual sua requisio no teve o efeito desejado. Alm dos cdigos de erro no Disseminrio so enviadas pginas XHTML que descrevem o motivo do erro e possuem ligaes hipermdia, para que o usurio possa contornar esta situao. Uma documentao completa descrevendo os cdigos de resposta do protocolo HTTP 1.1 pode ser encontrada em ??.

4.2

Desenvolvimento Guiado por Comportamento

O Desenvolvimento Guiado por Comportamento (Behaviour Driven Development) uma tcnica de desenvolvimento gil que tem nfase na descrio do comportamento da aplicao. Ela foi criada por Dan North [8], que enfrentava problemas ao ensinar Programao Guiada por Testes para seus alunos: o que testar, como dar nome aos testes e como entender porque um teste falhou [8]. O foi criado a partir do , que uma tcnica de desenvolvimento gil na qual todo o cdigo originado a partir de testes, uma inverso do paradigma tradicional de codicao. A cada ciclo de TDD o programador assume diversos papis, o de testador quando cria testes, o de analista quando busca formas de resolver o problema utilizando testes, o de projetista

47

Figura 4.3: O ciclo TDD [2] quando fatora o cdigo para melhorar o projeto e de programador quando faz o cdigo para passar nos testes. O ciclo TDD pode ser observado na gura 4.3. No Desenvolvimento Guiado por Testes normalmente se tem para cada classe do modelo uma classe de testes [10], que possui uma srie de mtodos. No Desenvolvimento Guiado por Comportamento a palavra teste abolida. Ela substituida por Histrias, Cenrios e Expectativas. O que torna mais fcil saber onde e o que testar, pois as histrias e cenrios so as prprias especicaes do sistema, que vm diretamente do cliente do software e denem o ponto de partida. Desta maneira, no dependendo da criatividade do programador, como acontece em TDD. O uso de uma linguagem prxima da natural facilita a criao da especicao, pois, podese usar uma linguagem muito parecida com a do cliente, que em seguida, se tornar cdigo executvel.

4.2.1

Histrias

As histrias so descries de funcionalidades, os cenrios so contextos para a ocorrncia das histrias e as expectativas so o que se espera que acontea em determinados cenrios de uma histria. Sendo assim, as histrias so compostas de cenrios, estes, compostos por prcondies e expectativas.

48

Assim como o [11], o BDD prope que se faa uso de linguagem ubqua[8]. Escolheuse o seguinte modelo para a escrita de histrias, oque culminou no estabelecimento de uma linguagem comum: Histria: {Ttulo da histria} Eu como {um papel} Quero {ao} Para {resultado esperado} Cenrio: {Ttulo do cenrio} Dado que {pr-condio} Caso {ao} Ento {expectativas} A partir do momento que se tem a histria escrita, ela pode ser transformada em cdigo executvel.

4.2.2

BDD no Disseminrio

No Disseminrio, todas as histrias foram escritas em linguagem natural e depois passadas para cdigo executvel. Em termos de cdigo foi utilizada a linguagem Java e o arcabouo JUnit, alm de adotada a seguinte estrutura para representar as especicaes: pacote: nome corresponde ao nome da histria classes do pacote: nomes correspondentes aos cenrios da histria mtodos das classes: pr-condies e expectativas dos cenrios Abaixo, segue um exemplo de histria Usurio Participando de Seminrio que foi implementada no Disseminrio: Histria: Usurio Participando de Seminrio Eu como um usurio Quero participar de um seminrio Para poder publicar uma apresentao

49

Cenrio: Quando existe o Seminrio Dado que existe o usurio usuarioDoDisseminario@edugraf.ufsc.br e que existe o seminrio de nome Um Seminrio Caso o usurio usuarioDoDisseminario@edugraf.ufsc.br envie uma solicitao de participao para o seminrio Um Seminrio Ento Deve ser criado um participante em /UmSeminario/participante/usuarioDoDisseminario@edugraf.ufsc.br de nome Fulano de endereo de correio eletrnico usuarioDoDisseminario@edugraf.ufsc.br Deve existir um enlace em /UmSeminario/participantes/ apontando para /UmSeminario/participante/usuarioDoDisseminario@edugraf.ufsc.br. A histria acima foi transformada em cdigo Java1 , como pode ser observado na listagem 4.2. Listagem 4.2: Histria: Usurio Participando de Seminrio
package u s u a r i o P a r t i c i p a n d o D e S e m i n a r i o ; public c l a s s QuandoExisteOSeminario extends I n f r a E s t r u t u r a D e E s p e c i f i c a c a o { public s t a t i c void considerandoQue ( ) { existeOUsuario_usuarioDoDisseminario_arroba_edugraf_ ufsc_br_de_nome_Fulano ( ) ; existeUmSeminario_de_nome_UmSeminario ( ) ; } public s t a t i c void caso ( ) { oUsuario_usuarioDoDisseminario_arroba_edugraf_ufsc_br _envieUmaSolicitacaoDeParticipacaoParaOSeminario _UmSeminario ( ) ; } public void entao ( ) {

deveSerCriadoUmParticipanteEm_seminario_UmSeminario_participan
1 Todas

as histrias esto no anexo A

50 DoDisseminario_arroba_edugraf_ufsc_br ( ) ; deNome_Fulano ( ) ; deEnderecoDeCorreioEletronico_usuarioDoDisseminario_arroba_ edugraf_ufsc_br ( ) ; deveExistirUmEnlaceEm_seminario_UmSeminario_participantes_ deTexto_Fulano ( ) ; apontandoPara_seminario_UmSeminario_participante_usuarioDo Disseminario_arroba_edugraf_ufsc_br ( ) ; }

Uma vez que a histria transformada em cdigo, no h mais necessidade de manter a histria em texto, pois possvel obter o texto a partir da histria em cdigo. E essa uma das grandes vantagens de se ter especicaes executveis: a sincronia que mantida entre elas e o cdigo. Qualquer alterao que se faa na especicaes registrada diretamente no cdigo, j que a especicao cdigo, mantendo as especicaes sempre atualizadas.

51

Disseminrio

O Disseminrio uma aplicao de apoio a seminrios, que permite aos seus usurios se cadastrarem, criarem e participarem de seminrios e publicarem apresentaes. Como cliente e interface com o usurio, foi utilizado o navegador web, cabendo ao servidor fornecer representaes que pudessem ser renderizadas e manipuladas pelo navegador. Tambm foi desenvolvido um cliente para realizar testes automatizados que vericam se o sistema est de acordo com as especicaes, como descrito na seo 4.2.

5.1

Descrio das funcionalidades

Nesta seo iremos detalhar as funcionalidades do Disseminrio, descrevendo-as e mostrando algumas imagens de telas do sistema.

5.1.1

Criao de conta

Para participar de um seminrio ou publicar uma apresentao necessrio que o usurio possua uma conta no sistema. Cada conta de usurio identicada por um endereo de correio eletrnico, para garantir a autenticidade de uma conta o cadastro se d em duas etapas. Na primeira etapa o usurio informa seu endereo de correio eletrnico e uma mensagem enviada para o endereo informado, como pode ser observado nas guras 5.1 e 5.2 respectivamente. Na segunda etapa, o usurio acessa a URI que recebeu na mensagem de correio eletrnico, esta URI contm um cdigo criado atravs da aplicao de uma funo hash a um dado pseudo-aleatrio, desta forma somente um usurio que tenha recebido a mensagem de correio eletrnico poder continuar com o processo de cadastramento, garantindo sua responsabilidade pelo endereo de correio eletrnico informado.

52

Figura 5.1: Primeira etapa do cadastramento

Figura 5.2: Mensagem de conrmao de cadastramento

53

Ao acessar esta URI, requisitado ao usurio o preenchimento de seu nome e senha, conforme observado na gura 5.3.

Figura 5.3: Segunda etapa do cadastramento Ao nalizar seu cadastramento, o usurio recebe uma mensagem de correio eletrnico informando que sua conta foi criada e contendo sua senha, para acesso posterior, oque pode ser visto na gura 5.4. O cadastramento agora foi nalizado, e o usurio pode se autenticar no sistema utilizando sua conta. Tambm includo um enlace para sua pgina de usurio 5.5 na lista de usurios do Disseminrio5.6.

54

Figura 5.4: Mensagem de conta criada

Figura 5.5: Pgina de um usurio do Disseminrio

5.1.2

Autenticao

Muitas funcionalidades s esto disponveis para usurios autenticados, tais como a publicao de apresentaes em um seminrio. Para se autenticar, o usurio necessita acessar o enlace de autenticao, que est presente nas pginas do sistema 5.7.

55

Figura 5.6: Lista de usurios do Disseminrio

Figura 5.7: Enlace de autenticao Aps acessar uma URI de autenticao o usurio necessita de informar seu endereo de correio eletrnico e sua senha para efetuar a autenticao5.8. Depois de autenticado, o usurio poder navegar pelo sistema acessando funcionalidades at ento indisponveis, podendo desautenticar quando desejar para voltar a navegar como um visitante, conforme a gura 5.9.

56

Figura 5.8: Janela de autenticao

Figura 5.9: Usurio navegando autenticado

57

5.1.3

Criao de Proposta de Seminrio

Para criar uma proposta de seminrio, o usurio deve se autenticar e clicar no enlace que ir aparecer, como na gura 5.10, preencher um formulrio com dados sobre o seminrio que deseja criar conforme a gura 5.11, quando enviar este formulrio, ser criada uma proposta em uma URI baseada no nome do seminrio, e enviada uma mensagem de correio eletrnico para o administrador do Disseminrio.

Figura 5.10: Enlace de proposta de seminrio

5.1.4

Aprovao de Proposta de Seminrio

Depois que uma proposta de seminrio feita, o administrador do Disseminrio recebe uma mensagem de correio eletrnico, nesta mensagem esta o endereo para que ele acesse a proposta que foi criada. Ao acessar o endereo da proposta, o administrador ter de se autenticar, podendo ento visualizar as informaes da proposta, como na gura 5.12, tendo a opo de aprovar a proposta ou deixa-l pendente. Quando o administrador aprova uma proposta, um seminrio criado e seu proponente avisado atravs de uma mensagem de correio eletrnico. O seminrio criado, gura 5.13, passa a ser listado na pgina principal do Disseminrio, a exemplo da gura 5.14.

58

Figura 5.11: Pgina de criao de proposta de seminrio

59

Figura 5.12: Pgina de uma proposta de seminrio

5.1.5

Participao em Seminrio

Um usurio pode participar de um seminrio se estiver autenticado e acessar o seminrio, onde estar disponvel a opo de participar do mesmo, como pode ser visto na gura 5.15. Aps participar de um seminrio o usurio includo um enlace para sua pgina de participante, como na gura 5.16 e na lista de participantes do seminrio a exemplo da gura 5.17.

5.1.6

Publicao de Apresentao

Para publicar uma apresentao em um seminrio, o usurio deve estar autenticado e ser um dos participantes do seminrio. Ao acessar o enlace de publicao de apresentao como o observado na gura 5.18, o usurio levado a pgina de publicao como observada na gura 5.19, onde deve fornecer um ttulo e enviar um arquivo da apresentao, ao enviar o formulrio ser publicada a apresentao. Aps publicada, a apresentao car disponvel na lista de apresentaes do seminrio, como pode ser visto na gura 5.20, onde poder ser acessada por outros usurios 5.21.

60

Figura 5.13: Pgina de um seminrio

61

Figura 5.14: Pgina principal do Disseminrio

Figura 5.15: Opo para participar de um seminrio

62

Figura 5.16: Pgina de um participante de um seminrio

Figura 5.17: Lista de participantes de um seminrio

63

Figura 5.18: Enlace para publicao de apresentao

Figura 5.19: Pgina de publicao de apresentao

64

Figura 5.20: Lista de apresentaes de um seminrio

Figura 5.21: Uma apresentao publicada em um seminrio

65

5.2

Papis de Usurios

As funcionalidades disponveis a um usurio so determinadas pelo seu papel no sistema. Existem quatro papis diferentes: Visitante Usurio Coordenador Administrador A relao entre um papel e suas permisses pode ser descrita atravs de uma hierarquia, onde as permisses de um papel so herdadas pelo papel acima na relao hierrquica, representada na gura 5.22, onde a seta representa a relao de herana de permisses, por exemplo o administrador herda todas as permisses do coordenador, alm de possuir permisses as quais o coordenador no possu.

Figura 5.22: Hierarquia de papis de usurios

5.2.1

Visitante

Um usurio no autenticado um visitante, um visitante pode acessar as seguintes funcionalidades:

66

Criao de conta de usurio Acesso a pgina principal, listando todos os seminrios Acesso a lista de usurios Acesso a pgina de um usurio Acesso aos participantes de um seminrio Acesso as apresentaes de um seminrio Acesso a uma apresentao de um seminrio

5.2.2

Usurio

Um usurio que tenha uma conta e esteja autenticado tem as seguintes permisses: Propor um seminrio Participar de um seminrio Publicar uma apresentao em um seminrio do qual participe

5.2.3

Coordenador

Quando um usurio tem sua proposta de criao de seminrio aprovada ele se torna coordenador de seminrios, podendo criar seminrios sem precisar de aprovao do administrador.

5.2.4

Administrador

Quando uma proposta de criao de seminrio feita o administrador a recebe, ele responsvel por julgar se a proposta vlida aprovando-a ou deixando-a pendente.

67

Implementao

Este captulo descreve a implementao do Disseminrio, explicitando a organizao de seus mdulos e as tecnologias utilizadas na implementao.

6.1

Disseminrio

A implementao do Disseminrio foi realizado utilizando-se a linguagem de programao PHP, uma linguagem interpretada e fracamente tipada, criada em 1995 para a criao de pginas web dinmicas, podendo ser embutida em pginas HTML[12]. Foi utilizada a verso 5 da linguagem, que possu um suporte mais completo a orientao a objetos que sua predecessora.

6.1.1

Arquitetura

O disseminrio um sistema em camadas, conforme pode ser visto na gura 6.1 cada camada um subsistema que oferece servios somente para a camada imediatamente superior. As requisies HTTP so tratadas pela camada de servios, ocasionando chamadas as camadas subsequentes e por m uma resposta contendo uma representao enviada para o cliente que originou a requisio, desta forma a camada de servios a nica interface do sistema para com o cliente, reduzindo-se o acoplamento com o mesmo. Esta interao entre cliente e servidor pode ser visualizada na gura 6.2.

6.1.2

Camada de servios

A camada de servios foi implementada de forma a receber todas as requisies HTTP feitas para o servidor, direcionando-as para uma fachada. Na fachada a requisio analisada e identicado qual o tratador responsvel por ela na

68

Figura 6.1: Arquitetura do Disseminrio

Figura 6.2: Comunicao entre um cliente e o Disseminrio

69

camada de negcios, a estes tratadores dado o nome de Recurso. Na modelagem foi utilizada uma metfora de roteamento, onde uma Rota a ligao entre uma fmilia de URIs e o Recurso responsvel pelo seu tratamento, sendo a responsabilidade de identicar a qual rota corresponde uma requisio delegada a classe Roteador. Outro aspecto importante da camada de servios foi a autenticao, alguns recursos no podem ser acessados por usurios no autenticados, outros tem seus mtodos restringidos dependendo do papel do usurio que o esta acessando. Como forma de autenticao foi utilizada a autenticao HTTP do tipo Basic, de maior facilidade de implementao. Algumas diculdades foram encontradas ao utilizar autenticao HTTP pura, sem Cookies e sem uso sesso. Certos recursos tem representaes diferentes quando um usurio esta autenticado, por exemplo ao acessar um seminrio sem autenticao um usurio s poder visualizar as informaes do seminrio, mas se estiver autenticado ele ter possibilidade de participar do mesmo, mudando a representao que agora ter um boto, o problema que no possvel determinar se um usurio est autenticado a no ser que o servidor pea autenticao a ele, negando o acesso caso o usurio no possua conta no sistema mesmo que o recurso acessado seja pblico para leitura. Este problema foi resolvido utilizando um parmetro adicional nas URIs, ao se autenticar um usurio passa a navegar com um parmetro ?autenticar=verdadeiro no suxo de todas as URIs que visitar. O outro problema foi relativo a desautenticao no sistema, infelizmente os navegadores no possuem uma forma padro de desautenticar(via JavaScript por exemplo), alguns acabam guardando em cache as credenciais do usurio, fazendo que o nico modo de desautenticar seja fechando o navegador ou limpando manualmente o cache, a soluo encontrada[13] foi utilizar requisies AJAX(Asynchronous Javascript And XML) para enviar uma requisio com credenciais falsas para um recurso protegido, o que tem como efeito colateral a remoo das credenciais gravadas no cache do navegador.

6.1.3

Modelo de negcios

No cerne do modelo de negcios esto os Recursos, cada recurso denido em 4.1.2 corresponde a uma classe de Recurso, que implementa os mtodos da interface uniforme denidos para ele em 4.1.4, conforme pode ser visto no diagrama de classes parcial em 6.3 que mostra a

70

classe Recurso e duas sub-classes, RecursoUsuario e RecursoSeminario.

Figura 6.3: Diagrama das classes dos recursos Os mtodos dos recursos so invocados pela camada de servios quando uma requisio efetuada, podendo o recurso comunicar-se com a camada de persistncia para obter ou alterar informaes na base de dados. Nesta camada tambm so geradas as representaes, pginas XHTML4.1.6 geradas dinamicamente que sero enviadas na resposta ao cliente. Para montar as representaes utilizado o motor de modelos Savant[14], desta forma a apresentao separada do modelo lgico.

6.1.4

Camada de Persistncia

Foi utilizado o arcabouo Doctrine[15], responsvel pelo mapeamento objeto-relacional, realizando a interface entre o modelo de negcios e a camada de persistncia. Como SGBD foi utilizado MySQL No Doctrine o esquema da base de dados descrito em YAML[16], uma linguagem de descrio de dados de fcil leitura para humanos e mquinas, a partir deste esquema so geradas as classes responsveis pelo mapeamento objeto-relacional, base de dados e tabelas associadas. O Doctrine utiliza uma linguagem prpria para as consultas, a DQL(Doctrine Query Language), inspirada em SQL e que capaz de retornar objetos como resultado de uma consulta. Alm de automatizar tarefas que teriam de ser feitas manualmente o Doctrine tambm pos-

71

su a vantagem de no ser acoplado a um SGBD especco, bastando que algumas conguraes sejam feitas para que outro SGBD seja utilizado, sem que nenhum cdigo precise ser alterado, j que tanto o esquema como a linguagem de consulta so independentes de uma plataforma especca.

6.2

Vericao das especicaes

As especicaes foram implementadas em Java, utilizando o arcabouo JUnit, conforme explicado em 4.2.2. Como cliente HTTP foi utilizado o conector Restlet, baseado no cliente Apache Commons[17]. Para realizao das extrao das informaes das representaes XHTML foi utilizado o parser Apache Xerxes[18], que possu suporte a consultas XPath, utilizadas para obter as informaes desejadas.

72

Concluses

Um sistema web de apoio de Seminrios foi desenvolvido, baseado na arquitetura orientada a recursos. Isto lhe conferiu caractersticas distintas quando comparado a maioria dos sistemas web projetados, tanto pro usurio comum, quanto pro desenvolvedor. Para um usurio comum os principais resultados a se destacar so as prprias propriedades da ROA. A endereabilidade, permite ao usurio enviar qualquer enlace para outro usurio e este conseguir acess-lo. O estado da aplicao sendo mantido pelo cliente, garante que os enlaces no deixaro de funcionar em acessos posteriores, pois o servidor no guarda o estado da aplicao. A conectividade facilita a navegao entre as diversas partes do sistema e a interface uniforme, protege as aes do usurio, no fazendo alteraes em dados simplesmente ao acessar uma URI. Do ponto de vista do desenvolvedor, a possibilidade de criao de diferentes clientes para acessar o sistema mostrou-se muito interessante. Alguns aspectos foram forados com base na teoria descrita em [4], e houve diculdade no desenvolvimento de autenticao HTTP sem o uso de cookies, no encontrou-se uma soluo satisfatria para este problema. Uma das peculiaridades do desenvolvimento deste trabalho foi o emprego de programao orientada por comportamento. Por tratar-se de uma tcnica de desenvolvimento pouco pesquisada e utilizada em meio acadmico, poucos so os artigos cientcos publicados sobre ela. Esta tcnica foi empregada de uma forma diferente da usual, sem o uso de mocks, pois o sistema testado estava isolado, alm de ter sido combinada a ROA, exemplo de experincia que no encontramos na literatura atual. O trabalho como um todo foi muito proveitoso, pois abrangeu o estudo de conceitos avanados e atuais em sinergia com a aplicao dos mesmos em um trabalho prtico.

73

7.1

Resultados Alcanados

Como resultados alcanados, podemos citar: Aprofundamento nas teorias estudadas Aplicao das teorias em um caso prtico Criao de representaes acessveis para cliente via navegador e consumveis por cliente automatizado Implementao de cliente vericador de especicaes

7.2

Trabalhos Futuros

Algumas partes do sistema, que faziam parte do ncleo bsico, ainda no foram implementas e esto listadas abaixo: Versionamento de apresentaes: permitir que participantes enviem novas verses de apresentaes e o histrico delas se mantenha. Tipos de mdia diferentes para cada apresentao . Convite de Participantes: os coordenadores devem poder convidar pessoas via correio eletrnico para participarem de seminrios. Criao de Grupos: participantes devem ter o poder de criar grupos. Algumas outras idias interessante de serem implementadas: Criao de outros clientes (Desktop, JavaScript) Implementao de sindicncia via Atom ou RSS Documentao detalhada dos recursos e representaes de forma a facilitar a implementao de novos clientes

74

Referncias Bibliogrcas
[1] FIELDING, R. Architectural Styles and the Design of Network-based Software Architectures. Tese (Doutorado) UNIVERSITY OF CALIFORNIA, IRVINE, 2000. [2] BECK, K. Test Driven Development: By Example. [S.l.]: Addison-Wesley Professional, 2002. [3] GARLAN, M. S. D. Advances in Software Engineering and Knowledge Engineering. [S.l.]: World Scientic Pub Co., 1993. [4] RICHARDSON, S. R. L. RESTful Web Services. [S.l.]: OReilly Media, 2007. [5] HYPERTEXT Transfer Protocol - HTTP/1.1 (RFC 2616 Fielding, et al). Disponvel em: http://www.w3.org/Protocols/rfc2616/rfc2616.html. Acesso em: 20 out. 2008. [6] EXTENSIBLE Markup Language (XML). Disponvel em: http://www.w3.org/XML/. Acesso em: 20 out. 2008. [7] UNIFORM Resource Identier (URI): Generic Syntax. Disponvel http://labs.apache.org/webarch/uri/rfc/rfc3986.html. Acesso em: 20 out. 2008. em:

[8] NORTH, D. Introducing bdd. Better Software Magazine, 2006. Disponvel em: http://dannorth.net/introducing-bdd. Acesso em: 13 out. 2008. [9] XHTML 1.0: The Extensible HyperText Markup Language. Disponvel em: http://www.w3.org/TR/xhtml1/. Acesso em: 20 out. 2008. [10] ADAMS, T. Better testing through behaviour. Open Source Developers Conference, 2007. [11] WIRFS-BROCK, R. J. Driven to ... discovering your design values. IEEE Software, v. 24, n. 1, p. 911, 2007. ISSN: 0740-7459. [12] PHP: Hypertext Preprocessor. Disponvel em: http://www.php.net/. Acesso em: 20 out. 2008. [13] TRUE logout mechanism for Basic/Digest Authentication. Disponvel em: https://trachacks.org/wiki/TrueHttpLogoutPatch. Acesso em: 20 out. 2008. [14] SAVANT - PHP Template Engine. Disponvel em: http://phpsavant.com/. Acesso em: 20 out. 2008. [15] DOCTRINE - Free Open Source PHP ORM. Disponvel em: http://www.doctrineproject.org/. Acesso em: 20 out. 2008. [16] YAML: YAML Aint Markup Language. Disponvel em: http://www.yaml.org/. Acesso em: 20 out. 2008.

75

[17] RESTLET 1.0 Connectors. Disponvel em: http://www.restlet.org/documentation/1.0/connectorshttpcl Acesso em: 20 out. 2008. [18] XERCES Java Parser. Disponvel em: http://xerces.apache.org/xerces-j/. Acesso em: 20 out. 2008. [19] INTRODUCING JSON. Disponvel em: http://www.json.org. Acesso em: 20 out. 2008. [20] ECMA INTERNATIONAL. ECMAScript Language Specication. [S.l.].

76

ANEXO A -- Cdigo-fonte das Especicaes

Listagem A.1: Arquivo: Teste.java


import i n f r a E s t r u t u r a . I n f r a E s t r u t u r a D e E s p e c i f i c a o ;

public class Teste { / @param a r g s / p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new I n f r a E s t r u t u r a D e E s p e c i f i c a o ( ) ; } }

Listagem A.2: Arquivo: PublicadorDaHistoriaDaPsicologiaLatinoAmericana.java


package b r . u f s c . e d u g r a f . d i s s e m i n a r i o . p u b l i c a d o r ; import j a v a . i o . F i l e ; import j a v a . i o . F i l e I n p u t S t r e a m ; import j a v a . i o . F i l e N o t F o u n d E x c e p t i o n ; import j a v a . i o . I O E x c e p t i o n ; import j a v a . u t i l . P r o p e r t i e s ; import o r g . r e s t l e t . d a t a . MediaType ; import o r g . r e s t l e t . d a t a . R e s p o n s e ; import o r g . r e s t l e t . r e s o u r c e . F i l e R e p r e s e n t a t i o n ; import o r g . r e s t l e t . r e s o u r c e . R e p r e s e n t a t i o n ;

77 import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . c l i e n t e . C l i e n t e H T T P A d m i n i s t r a d o r ; public class PublicadorDaHistoriaDaPsicologiaLatinoAmericana { private ClienteHTTPAdministrador clienteHTTPAutenticado ; p r i v a t e S t r i n g URLBase ; private String endereoDeSeminrios ; private Representation histriaDaPsicologiaLA ; public PublicadorDaHistoriaDaPsicologiaLatinoAmericana ( ) { c l i e n t e H T T P A u t e n t i c a d o = new C l i e n t e H T T P A d m i n i s t r a d o r () ; try { URLBase = carregarConfiguraes () . getProperty ( " enderecoBaseDaAplicacao " ) ; } catch ( Exception e ) { e . printStackTrace () ; } e n d e r e o D e S e m i n r i o s = URLBase + " / s e m i n a r i o s " ; h i s t r i a D a P s i c o l o g i a L A = new F i l e R e p r e s e n t a t i o n ( new File ( " representacoes / HistoriaDaPsicologiaLatinoAmericana . js " ) , MediaType . APPLICATION_JSON , 1 ) ; } p r o t e c t e d P r o p e r t i e s c a r r e g a r C o n f i g u r a e s ( ) throws IOException , FileNotFoundException { P r o p e r t i e s p = new P r o p e r t i e s ( ) ; p . l o a d ( new F i l e I n p u t S t r e a m ( new F i l e ( " c o n f i g u r a c o e s / configuracoes . properties " ) ) ) ; return p ; } private void p u b l i c a r ( ) { Response r = clienteHTTPAutenticado . p o s t ( endereoDeSeminrios , histriaDaPsicologiaLA ) ; try { r . getEntity () . getText () ;

78 } catch ( IOException e ) { e . printStackTrace () ; } System . o u t . p r i n t l n ( " P u b l i c a n d o s e m i n r i o H i s t r i a da P s i c o l o g i a L a t i n o Americana " ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { PublicadorDaHistoriaDaPsicologiaLatinoAmericana p u b l i c a d o r = new PublicadorDaHistoriaDaPsicologiaLatinoAmericana () ; publicador . publicar () ; } }

Listagem A.3: Arquivo: TesteRepresentacaoXHTML.java


package b r . u f s c . e d u g r a f . d i s s e m i n a r i o . r e p r e s e n t a c o e s ; import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t E q u a l s ; import j a v a . i o . F i l e ; import j a v a . i o . F i l e N o t F o u n d E x c e p t i o n ; import j a v a . i o . F i l e R e a d e r ; import j a v a . i o . I O E x c e p t i o n ; import j a v a x . xml . p a r s e r s . P a r s e r C o n f i g u r a t i o n E x c e p t i o n ; import o r g . custommonkey . x m l u n i t . e x c e p t i o n s . C o n f i g u r a t i o n E x c e p t i o n ; import o r g . j u n i t . B e f o r e ; import o r g . j u n i t . T e s t ; import o r g . xml . s a x . SAXException ;

p u b l i c c l a s s TesteRepresentaoXHTML { p r i v a t e RepresentacaoXHTML r e p r e s e n t a o ; @Before

79 p u b l i c v o i d i n i c i a l i z a r ( ) throws C o n f i g u r a t i o n E x c e p t i o n , F i l e N o t F o u n d E x c e p t i o n , SAXException , I O E x c e p t i o n , ParserConfigurationException { r e p r e s e n t a o = new RepresentacaoXHTML ( new F i l e R e a d e r ( new F i l e ( " r e p r e s e n t a c o e s / h c a r d . h t m l " ) ) ) ; } @Test p u b l i c v o i d obterValorDoMetaDadoDeNome ( ) { a s s e r t E q u a l s ( " xpto " , r e p r e s e n t a o . obterValorDoMetaDadoDeNome ( " t e s t e " ) ) ; } }

Listagem A.4: Arquivo: RepresentacaoNula.java


package b r . u f s c . e d u g r a f . d i s s e m i n a r i o . r e p r e s e n t a c o e s ; import j a v a . i o . F i l e I n p u t S t r e a m ; import j a v a . i o . I O E x c e p t i o n ; import j a v a . i o . I n p u t S t r e a m ; import j a v a . i o . O u t p u t S t r e a m ; import j a v a . n i o . B y t e B u f f e r ; import j a v a . n i o . c h a n n e l s . R e a d a b l e B y t e C h a n n e l ; import j a v a . n i o . c h a n n e l s . W r i t a b l e B y t e C h a n n e l ; import o r g . r e s t l e t . r e s o u r c e . R e p r e s e n t a t i o n ; public c l a s s RepresentacaoNula extends R e p r e s e n t a t i o n { @Override p u b l i c R e a d a b l e B y t e C h a n n e l g e t C h a n n e l ( ) throws I O E x c e p t i o n { / / TODO Autog e n e r a t e d method s t u b r e t u r n new R e a d a b l e B y t e C h a n n e l ( ) { @Override p u b l i c i n t r e a d ( B y t e B u f f e r d s t ) throws IOException { return 0;

80 } @Override p u b l i c v o i d c l o s e ( ) throws I O E x c e p t i o n { } @Override public boolean isOpen ( ) { return f a l s e ; } }; } @Override p u b l i c I n p u t S t r e a m g e t S t r e a m ( ) throws I O E x c e p t i o n { r e t u r n new F i l e I n p u t S t r e a m ( " / dev / n u l l " ) ; } @Override p u b l i c v o i d w r i t e ( O u t p u t S t r e a m a r g 0 ) throws I O E x c e p t i o n { } @Override p u b l i c v o i d w r i t e ( W r i t a b l e B y t e C h a n n e l a r g 0 ) throws IOException { } }

Listagem A.5: Arquivo: RepresentacaoXHTML.java


package b r . u f s c . e d u g r a f . d i s s e m i n a r i o . r e p r e s e n t a c o e s ; import j a v a . i o . F i l e R e a d e r ; import j a v a . i o . I O E x c e p t i o n ;

81

import j a v a x . xml . p a r s e r s . P a r s e r C o n f i g u r a t i o n E x c e p t i o n ; import o r g . custommonkey . x m l u n i t . HTMLDocumentBuilder ; import o r g . custommonkey . x m l u n i t . T o l e r a n t S a x D o c u m e n t B u i l d e r ; import o r g . custommonkey . x m l u n i t . XMLUnit ; import o r g . custommonkey . x m l u n i t . X p a t h E n g i n e ; import o r g . custommonkey . x m l u n i t . e x c e p t i o n s . C o n f i g u r a t i o n E x c e p t i o n ; import o r g . custommonkey . x m l u n i t . e x c e p t i o n s . X p a t h E x c e p t i o n ; import o r g . w3c . dom . Document ; import o r g . xml . s a x . SAXException ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . m i c r o f o r m a t o . M i c r o f o r m a t o ;

p u b l i c c l a s s RepresentacaoXHTML { p r i v a t e Document documento ; p r i v a t e XpathEngine executorXPath ; p u b l i c RepresentacaoXHTML ( Document d ) { documento = d ; e x e c u t o r X P a t h = XMLUnit . newXpathEngine ( ) ; } @Override public String t o S t r i n g ( ) { r e t u r n documento . t o S t r i n g ( ) ; } p u b l i c RepresentacaoXHTML ( F i l e R e a d e r f ) throws ConfigurationException , ParserConfigurationException , SAXException , I O E x c e p t i o n { HTMLDocumentBuilder c o n s t r u t o r D e D o c u m e n t o s = new HTMLDocumentBuilder ( new T o l e r a n t S a x D o c u m e n t B u i l d e r ( XMLUnit . n e w T e s t P a r s e r ( ) ) ) ; documento = c o n s t r u t o r D e D o c u m e n t o s . p a r s e ( f ) ; e x e c u t o r X P a t h = XMLUnit . newXpathEngine ( ) ; }

82

p u b l i c M i c r o f o r m a t o o b t e r M i c r o f o r m a t o ( S t r i n g nome ) { r e t u r n new M i c r o f o r m a t o ( documento ) . o b t e r M a r c a o ( nome ); }

public boolean contmTexto ( S t r i n g t e x t o P a r a P r o c u r a r ) { boolean e x i s t e = f a l s e ; try { e x i s t e = executorXPath . getMatchingNodes ( " / / [ contains ( string () , " + textoParaProcurar + " ) ] " , documento ) . g e t L e n g t h ( ) > 0 ; } catch ( XpathException e ) { e . printStackTrace () ; } return e x i s t e ; } p u b l i c S t r i n g obterValorDoMetaDadoDeNome ( S t r i n g nome ) { String valor = null ; try { valor = executorXPath . g e t M a t c h i n g N o d e s ( " / h t m l / h e a d / meta [ @name= " + nome + " ] / @ c o n t e n t " , documento ) . i t e m ( 0 ) . g e t N o d e V a l u e ( ) ; } catch ( Exception e ) { e . printStackTrace () ; } return v a l o r ; } p u b l i c boolean contmOEnlace ( S t r i n g e n l a c e ) { boolean e x i s t e = f a l s e ; try { e x i s t e = executorXPath . getMatchingNodes ( " / / a [ @href = " + e n l a c e + " ] " , documento ) .

83 getLength ( ) > 0; } catch ( XpathException e ) { e . printStackTrace () ; } return e x i s t e ; } }

Listagem A.6: Arquivo: Enlace.java


package b r . u f s c . e d u g r a f . d i s s e m i n a r i o . m i c r o f o r m a t o ; public c l a s s Enlace { p r i v a t e S t r i n g URL, t e x t o ; public Enlace ( S t r i n g url , S t r i n g t ) { URL = u r l ; texto = t ; } p u b l i c S t r i n g obterURL ( ) { r e t u r n URL ; } public String obterTexto ( ) { return t e x t o ; } }

Listagem A.7: Arquivo: Microformato.java


package b r . u f s c . e d u g r a f . d i s s e m i n a r i o . m i c r o f o r m a t o ; import j a v a . i o . I O E x c e p t i o n ; import j a v a . i o . R e a d e r ; import j a v a x . xml . p a r s e r s . P a r s e r C o n f i g u r a t i o n E x c e p t i o n ; import o r g . custommonkey . x m l u n i t . HTMLDocumentBuilder ;

84 import o r g . custommonkey . x m l u n i t . T o l e r a n t S a x D o c u m e n t B u i l d e r ; import o r g . custommonkey . x m l u n i t . XMLUnit ; import o r g . custommonkey . x m l u n i t . X p a t h E n g i n e ; import o r g . custommonkey . x m l u n i t . e x c e p t i o n s . C o n f i g u r a t i o n E x c e p t i o n ; import o r g . custommonkey . x m l u n i t . e x c e p t i o n s . X p a t h E x c e p t i o n ; import o r g . w3c . dom . Document ; import o r g . w3c . dom . N o d e L i s t ; import o r g . xml . s a x . SAXException ; public c l a s s Microformato { p r i v a t e Document documento ; p r i v a t e XpathEngine executorXPath ; private S t r i n g caminhoAtual = " " ; p u b l i c M i c r o f o r m a t o ( Document d ) { documento = d ; e x e c u t o r X P a t h = XMLUnit . newXpathEngine ( ) ; } p u b l i c M i c r o f o r m a t o ( Document d , S t r i n g c ) { this (d) ; caminhoAtual = c ; } p u b l i c M i c r o f o r m a t o ( S t r i n g s ) throws SAXException , IOException , ConfigurationException , ParserConfigurationException { HTMLDocumentBuilder c o n s t r u t o r D e D o c u m e n t o s = new HTMLDocumentBuilder ( new T o l e r a n t S a x D o c u m e n t B u i l d e r ( XMLUnit . n e w T e s t P a r s e r ( ) ) ) ; documento = c o n s t r u t o r D e D o c u m e n t o s . p a r s e ( s ) ; e x e c u t o r X P a t h = XMLUnit . newXpathEngine ( ) ; } p u b l i c M i c r o f o r m a t o ( R e a d e r f ) throws SAXException , IOException , ConfigurationException , ParserConfigurationException {

85 HTMLDocumentBuilder c o n s t r u t o r D e D o c u m e n t o s = new HTMLDocumentBuilder ( new T o l e r a n t S a x D o c u m e n t B u i l d e r ( XMLUnit . n e w T e s t P a r s e r ( ) ) ) ; documento = c o n s t r u t o r D e D o c u m e n t o s . p a r s e ( f ) ; e x e c u t o r X P a t h = XMLUnit . newXpathEngine ( ) ; } private NodeList obterListaDeNodosComAtributoClassIgual ( S t r i n g nome ) { NodeList nodos = n u l l ; try { nodos = executorXPath . getMatchingNodes ( c a m i n h o A t u a l + " / / [ @ c l a s s = " + nome + " ] " , documento ) ; } catch ( XpathException e ) { e . printStackTrace () ; } return nodos ; } private i n t obterNmeroDeNodosComAtributoClassIgualA ( S t r i n g nome ) { r e t u r n o b t e r L i s t a D e N o d o s C o m A t r i b u t o C l a s s I g u a l ( nome ) . getLength ( ) ; } p u b l i c b o o l e a n e x i s t e M a r c a o ( S t r i n g nome ) { r e t u r n o b t e r N m e r o D e N o d o s C o m A t r i b u t o C l a s s I g u a l A ( nome ) > 0; } p u b l i c b o o l e a n e x i s t e E x a t a m e n t e U m a M a r c a o ( S t r i n g nome ) { r e t u r n o b t e r N m e r o D e N o d o s C o m A t r i b u t o C l a s s I g u a l A ( nome ) == 1 ; } p u b l i c M i c r o f o r m a t o o b t e r M a r c a o ( S t r i n g nome ) {

86 r e t u r n new M i c r o f o r m a t o ( documento , " / / [ @ c l a s s = " + nome + " ] " ) ; } p u b l i c S t r i n g obterContedoMarcadoCom ( S t r i n g nome ) { r e t u r n o b t e r L i s t a D e N o d o s C o m A t r i b u t o C l a s s I g u a l ( nome ) . item (0) . getTextContent ( ) ; } p u b l i c b o o l e a n n o E x i s t e M a r c a o ( S t r i n g nome ) { r e t u r n ! e x i s t e M a r c a o ( nome ) ; } p u b l i c E n l a c e o b t e r E n l a c e P e l a U R L ( S t r i n g URL) { String texto = null ; try { texto = executorXPath . getMatchingNodes ( caminhoAtual + " / / a [ @href = " + URL + " ] / t e x t ( ) " , documento ) . i t e m ( 0 ) . g e t T e x t C o n t e n t () ; } catch ( XpathException e ) { e . printStackTrace () ; } r e t u r n new E n l a c e (URL, t e x t o ) ; } public S t r i n g o b t e r V a l o r D o A t r i b u t o ( S t r i n g chave ) { NodeList n = null ; try { n = executorXPath . getMatchingNodes ( caminhoAtual + " / / d t [ @class = " + chave + " ] / f o l l o w i n g s i b l i n g : : dd " , documento ) ; } catch ( XpathException e ) { e . printStackTrace () ; }

87 return n . item ( 0 ) . getTextContent ( ) ; } public Enlace obterEnlacePeloAtributoClass ( S t r i n g nomeDoEnlace ) { String texto = null ; String url = null ; try { url = executorXPath . getMatchingNodes ( caminhoAtual + " / / a [ @class = " + nomeDoEnlace + " ] / @href " , documento ) . i t e m (0) . getTextContent () ; texto = executorXPath . getMatchingNodes ( caminhoAtual + " / / a [ @class = " + nomeDoEnlace + " ] / t e x t ( ) " , documento ) . item (0) . getTextContent ( ) ; } catch ( XpathException e ) { e . printStackTrace () ; } r e t u r n new E n l a c e ( u r l , t e x t o ) ; } }

Listagem A.8: Arquivo: TesteMicroformato.java


package b r . u f s c . e d u g r a f . d i s s e m i n a r i o . m i c r o f o r m a t o ; import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t E q u a l s ; import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t F a l s e ; import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t T r u e ; import j a v a . i o . F i l e ; import j a v a . i o . F i l e N o t F o u n d E x c e p t i o n ; import j a v a . i o . F i l e R e a d e r ; import j a v a . i o . I O E x c e p t i o n ; import j a v a x . xml . p a r s e r s . P a r s e r C o n f i g u r a t i o n E x c e p t i o n ; import o r g . custommonkey . x m l u n i t . e x c e p t i o n s . C o n f i g u r a t i o n E x c e p t i o n ;

88 import o r g . j u n i t . B e f o r e ; import o r g . j u n i t . T e s t ; import o r g . xml . s a x . SAXException ;

public class TesteMicroformato { private Microformato microformato ; @Before p u b l i c v o i d i n i c i a l i z a r ( ) throws C o n f i g u r a t i o n E x c e p t i o n , F i l e N o t F o u n d E x c e p t i o n , SAXException , I O E x c e p t i o n , ParserConfigurationException { m i c r o f o r m a t o = new M i c r o f o r m a t o ( new F i l e R e a d e r ( new F i l e ( " r e p r e s e n t a c o e s / hcard . html " ) ) ) ; } @Test p u b l i c v o i d e x i s t e M a r c a o ( ) throws I O E x c e p t i o n , C o n f i g u r a t i o n E x c e p t i o n , SAXException , ParserConfigurationException { assertTrue ( microformato . existeMarcao ( " vcard " ) ) ; a s s e r t F a l s e ( microformato . existeMarcao ( " xpto " ) ) ; } @Test p u b l i c v o i d e x i s t e M a r c a o D e n t r o D e O u t r a ( ) throws I O E x c e p t i o n , C o n f i g u r a t i o n E x c e p t i o n , SAXException , ParserConfigurationException { a s se r t T r ue ( microformato . obterMarcao ( " vcard " ) . existeMarcao ( " adr " ) ) ; } @Test p u b l i c v o i d e x i s t e E x a t a m e n t e U m a M a r c a o ( ) throws I O E x c e p t i o n , C o n f i g u r a t i o n E x c e p t i o n , SAXException , ParserConfigurationException {

89 a s s e r t T r u e ( microformato . existeExatamenteUmaMarcao ( " vcard " ) ) ; a s s e r t F a l s e ( microformato . existeExatamenteUmaMarcao ( " tel ") ) ; } @Test p u b l i c v o i d conteudoDeUmaMarcao ( ) { a s s e r t E q u a l s ( " Palo Alto " , microformato . obterContedoMarcadoCom ( " l o c a l i t y " ) ) ; } @Test public void o b t e r E n l a c e ( ) { a s s e r t E q u a l s ( " CommerceNet " , m i c r o f o r m a t o . o b t e r E n l a c e P e l o A t r i b u t o C l a s s ( " fn org u r l " ) . obterTexto () ) ; a s s e r t E q u a l s ( " h t t p : / / www. commerce . n e t / " , m i c r o f o r m a t o . o b t e r E n l a c e P e l o A t r i b u t o C l a s s ( " fn org u r l " ) . obterURL ( ) ) ; } }

Listagem A.9: Arquivo: TesteHistoriaDePsicologiaLatinoAmericana.java


package b r . u f s c . e d u g r a f . d i s s e m i n a r i o . t e s t e s . r e c u r s o s ;

import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t E q u a l s ; import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t T r u e ; import j a v a . i o . I O E x c e p t i o n ; import j a v a . u t i l . L i n k e d H a s h S e t ; import j a v a . u t i l . S e t ;

import o r g . custommonkey . x m l u n i t . XMLAssert ; import o r g . custommonkey . x m l u n i t . e x c e p t i o n s . X p a t h E x c e p t i o n ;

90 import o r g . j u n i t . T e s t ; import o r g . r e s t l e t . d a t a . Method ; import o r g . r e s t l e t . d a t a . R e s p o n s e ; import o r g . r e s t l e t . d a t a . S t a t u s ; import o r g . xml . s a x . SAXException ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . m i c r o f o r m a t o . M i c r o f o r m a t o ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . r e p r e s e n t a c o e s . R e p r e s e n t a c a o N u l a ;

public c l a s s TesteHistoriaDePsicologiaLatinoAmericana extends TesteDeRecurso { @Override public String obterEndereoDoRecursoRelativoBase ( ) { return " / seminario / HistoriaDaPsicologiaLatinoAmericana " ; } @Test p u b l i c v o i d g e t R e a l i z a d o C o m S u c e s s o ( ) throws I O E x c e p t i o n { Response r = clienteHTTP . g e t ( endereoDoRecurso ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , r . g e t S t a t u s ( ) ) ; } @Test p u b l i c v o i d p o s t R e t o r n a E r r o D e M t o d o N o P e r m i t i d o ( ) throws IOException { R e s p o n s e r = c l i e n t e H T T P . p o s t ( e n d e r e o D o R e c u r s o , new RepresentacaoNula ( ) ) ; a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_METHOD_NOT_ALLOWED, r . getStatus () ) ; } @Test public void headRealizadoComSucesso ( ) { Response r = clienteHTTP . head ( endereoDoRecurso ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , r . g e t S t a t u s ( ) ) ;

91 } @Test public void optionsRealizadoComSucesso ( ) { Response r = clienteHTTP . o p t i o n s ( endereoDoRecurso ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , r . g e t S t a t u s ( ) ) ; } @Test public void optionsRetornaMtodosPermitidos ( ) { S e t <Method > e s p e r a d o s = new L i n k e d H a s h S e t <Method > ( ) ; e s p e r a d o s . add ( Method . GET) ; e s p e r a d o s . add ( Method . HEAD) ; e s p e r a d o s . add ( Method . OPTIONS ) ; e s p e r a d o s . add ( Method . PUT ) ; e s p e r a d o s . add ( Method . DELETE ) ; Response r = clienteHTTP . o p t i o n s ( endereoDoRecurso ) ; S e t <Method > r e c e b i d o s = r . g e t A l l o w e d M e t h o d s ( ) ; assertEquals ( esperados , recebidos ) ; } private Microformato obterMicroformatoDaRepresentao ( ) throws SAXException , I O E x c e p t i o n { r e t u r n new M i c r o f o r m a t o ( o b t e r R e p r e s e n t a o D o R e c u r s o ( ) ); } @Test p u b l i c v o i d e x i s t e U m S e m i n r i o ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { assertTrue ( obterMicroformatoDaRepresentao () . existeExatamenteUmaMarcao ( " seminario " ) ) ; }

@Test

92 p u b l i c v o i d umSeminrioTemUmaBase ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { assertTrue ( obterMicroformatoDaRepresentao () . obterMarcao ( " seminario " ) . existeExatamenteUmaMarcao ( " base " ) ) ; } @Test p u b l i c v o i d umSeminrioTemUmNome ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { assertTrue ( obterMicroformatoDaRepresentao () . obterMarcao ( " seminario " ) . e x i s t e E x a t a m e n t e U m a M a r c a o ( " nome " ) ) ; } @Test public void oNomeDoSeminrioHistriaDaPsicologiaLatinoAmericana ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n " , obterMicroformatoDaRepresentao () . o b t e r M a r c a o ( " s e m i n a r i o " ) . obterContedoMarcadoCom ( " nome " ) ) ; } @Test p u b l i c v o i d umSeminrioTemUmaDescricao ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { assertTrue ( obterMicroformatoDaRepresentao () . obterMarcao ( " seminario " ) . existeMarcao ( " descricao " ) ) ; } @Test p u b l i c v o i d u m S e m i n r i o T e m I n s t r u c o e s ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { assertTrue ( obterMicroformatoDaRepresentao () . obterMarcao ( " seminario " ) . existeMarcao ( " { a s s e r t E q u a l s ( " H i s t r i a da p s i c o l o g i a l a t i n o a m e r i c a n a

93 instrucoes " ) ) ; } @Test p u b l i c v o i d umSeminrioTemURI ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { assertTrue ( obterMicroformatoDaRepresentao () . obterMarcao ( " seminario " ) . existeMarcao ( " instrucoes " ) ) ; } @Test p u b l i c v o i d umSeminrioTemCoordenador ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { assertTrue ( obterMicroformatoDaRepresentao () . obterMarcao ( " seminario " ) . existeMarcao ( " coordenador " ) ) ; } @Test p u b l i c v o i d umCoordenadorTemURL ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { XMLAssert . a s s e r t X p a t h E x i s t s ( " / / [ @ c l a s s = s e m i n a r i o ] / / [ @class = coordenador ] / / [ @class = urlDoCoordenador ] " , obterRepresentaoDoRecurso ( ) ); / / assertTrue ( obterMicroformatoDaRepresentao ( ) . obterMarcao ( " seminario " ) . obterMarcao ( " c o o r d e n a d o r " ) . e x i s t e M a r c a o ( " URL " ) ) ; } @Test p u b l i c v o i d umSeminrioTemDatas ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { assertTrue ( obterMicroformatoDaRepresentao () . obterMarcao ( " seminario " ) . existeExatamenteUmaMarcao ( " d a t a s " ) ) ; }

94

@Test p u b l i c v o i d d a t a s T e m D a t a D e I n i c i o ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { XMLAssert . a s s e r t X p a t h E x i s t s ( " / / [ @ c l a s s = s e m i n a r i o ] / / [ @class = d a t a s ] / / [ @class = d a t a D e I n i c i o ] " , obterRepresentaoDoRecurso ( ) ) ; } @Test p u b l i c v o i d datasTemDataDeFim ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { XMLAssert . a s s e r t X p a t h E x i s t s ( " / / [ @ c l a s s = s e m i n a r i o ] / / [ @class = d a t a s ] / / [ @class = dataDeTermino ] " , obterRepresentaoDoRecurso ( ) ) ; } @Test p u b l i c v o i d u m S e m i n r i o T e m D e t a l h e s ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { assertTrue ( obterMicroformatoDaRepresentao () . obterMarcao ( " seminario " ) . existeMarcao ( " detalhes " ) ) ; } @Test p u b l i c v o i d d e t a l h e s T e m I n s c r i c a o ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { XMLAssert . a s s e r t X p a t h E x i s t s ( " / / [ @ c l a s s = s e m i n a r i o ] / / [ @class = d e t a l h e s ] / / [ @class = i n s c r i c a o ] " , obterRepresentaoDoRecurso ( ) ) ; } @Test p u b l i c v o i d d e t a l h e s T e m A s s i s t e n c i a ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { XMLAssert . a s s e r t X p a t h E x i s t s ( " / / [ @ c l a s s = s e m i n a r i o ] / / [ @class = d e t a l h e s ] / / [ @class = a s s i s t e n c i a ] "

95 , obterRepresentaoDoRecurso ( ) ) ; } @Test p u b l i c v o i d d e t a l h e s T e m A c e s s o A o s R e s u l t a d o s ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { XMLAssert . a s s e r t X p a t h E x i s t s ( " / / [ @ c l a s s = s e m i n a r i o ] / / [ @class = d e t a l h e s ] / / [ @class = acessoAosResultados ] " , obterRepresentaoDoRecurso ( ) ) ; } @Test p u b l i c v o i d umSeminrioTemDocumentos ( ) throws X p a t h E x c e p t i o n , SAXException , I O E x c e p t i o n { assertTrue ( obterMicroformatoDaRepresentao () . obterMarcao ( " seminario " ) . existeMarcao ( " documentos " ) ) ; } }

Listagem A.10: Arquivo: TesteRecursoSeminario.java


package b r . u f s c . e d u g r a f . d i s s e m i n a r i o . t e s t e s . r e c u r s o s ;

import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t E q u a l s ; import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t N o t N u l l ; import j a v a . i o . I O E x c e p t i o n ; import j a v a . u t i l . L i n k e d H a s h S e t ; import j a v a . u t i l . Map ; import j a v a . u t i l . S e t ; import o r g . j u n i t . T e s t ; import o r g . r e s t l e t . d a t a . Form ; import o r g . r e s t l e t . d a t a . Method ; import o r g . r e s t l e t . d a t a . R e s p o n s e ;

96 import o r g . r e s t l e t . d a t a . S t a t u s ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . r e p r e s e n t a c o e s . R e p r e s e n t a c a o N u l a ; public c l a s s TesteRecursoSeminario extends TesteDeRecurso { @Override public String obterEndereoDoRecursoRelativoBase ( ) { return " / seminario " ; } @Test p u b l i c v o i d p u t R e t o r n a E r r o D e M t o d o N o P e r m i t i d o ( ) throws IOException { R e s p o n s e r = c l i e n t e H T T P . p u t ( e n d e r e o D o R e c u r s o , new RepresentacaoNula ( ) ) ; a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_METHOD_NOT_ALLOWED, r . getStatus () ) ; } @Test p u b l i c v o i d p o s t R e t o r n a E r r o D e M t o d o N o P e r m i t i d o ( ) throws IOException { R e s p o n s e r = c l i e n t e H T T P . p o s t ( e n d e r e o D o R e c u r s o , new RepresentacaoNula ( ) ) ; a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_METHOD_NOT_ALLOWED, r . getStatus () ) ; } @Test p u b l i c v o i d d e l e t e R e t o r n a E r r o D e M t o d o N o P e r m i t i d o ( ) throws IOException { R e s p o n s e r = c l i e n t e H T T P . p u t ( e n d e r e o D o R e c u r s o , new RepresentacaoNula ( ) ) ; a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_METHOD_NOT_ALLOWED, r . getStatus () ) ; } @Test

97 public void optionsRealizadoComSucesso ( ) { Response r = clienteHTTP . o p t i o n s ( endereoDoRecurso ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , r . g e t S t a t u s ( ) ) ; } @Test public void optionsRetornaMtodosPermitidos ( ) { S e t <Method > m t o d o s P e r m i t i d o s E s p e r a d o s = new L i n k e d H a s h S e t <Method > ( ) ; m t o d o s P e r m i t i d o s E s p e r a d o s . add ( Method . GET) ; m t o d o s P e r m i t i d o s E s p e r a d o s . add ( Method .HEAD) ; m t o d o s P e r m i t i d o s E s p e r a d o s . add ( Method . OPTIONS ) ; Response r = clienteHTTP . o p t i o n s ( endereoDoRecurso ) ; S e t <Method > m t o d o s P e r m i t i d o s R e c e b i d o s = r . getAllowedMethods ( ) ; assertEquals ( mtodosPermitidosEsperados , mtodosPermitidosRecebidos ) ; } @Test public void headRetornaNomeEPalavrasChave ( ) { Response s = clienteHTTP . head ( endereoDoRecurso ) ; Map< S t r i n g , O b j e c t > a = s . g e t A t t r i b u t e s ( ) ; Form f = ( Form ) a . g e t ( " o r g . r e s t l e t . h t t p . h e a d e r s " ) ; a s s e r t N o t N u l l ( f . g e t F i r s t ( "Nome" ) ) ; a s s e r t N o t N u l l ( f . g e t F i r s t ( " P a l a v r a s c h a v e " ) ) ; } }

Listagem A.11: Arquivo: TesteDeRecurso.java


package b r . u f s c . e d u g r a f . d i s s e m i n a r i o . t e s t e s . r e c u r s o s ; import j a v a . i o . F i l e ; import j a v a . i o . F i l e I n p u t S t r e a m ; import j a v a . i o . F i l e N o t F o u n d E x c e p t i o n ; import j a v a . i o . I O E x c e p t i o n ; import j a v a . u t i l . P r o p e r t i e s ;

98

import j a v a x . xml . p a r s e r s . P a r s e r C o n f i g u r a t i o n E x c e p t i o n ; import o r g . custommonkey . x m l u n i t . HTMLDocumentBuilder ; import o r g . custommonkey . x m l u n i t . T o l e r a n t S a x D o c u m e n t B u i l d e r ; import o r g . custommonkey . x m l u n i t . XMLUnit ; import o r g . custommonkey . x m l u n i t . e x c e p t i o n s . C o n f i g u r a t i o n E x c e p t i o n ; import o r g . j u n i t . B e f o r e ; import o r g . r e s t l e t . C l i e n t ; import o r g . r e s t l e t . d a t a . P r o t o c o l ; import o r g . r e s t l e t . d a t a . R e s p o n s e ; import o r g . w3c . dom . Document ; import o r g . xml . s a x . SAXException ; public abstract c l a s s TesteDeRecurso { protected S t r i n g endereoDoRecurso ; protected C l i e n t clienteHTTP ; p r o t e c t e d HTMLDocumentBuilder c o n s t r u t o r D e D o c u m e n t o s ; public abstract String obterEndereoDoRecursoRelativoBase ( ) ; @Before p u b l i c v o i d i n i c i a l i z a r ( ) throws C o n f i g u r a t i o n E x c e p t i o n , ParserConfigurationException , IOException { Properties p = carregarConfiguraes () ; endereoDoRecurso = p . g e t P r o p e r t y ( " enderecoBaseDaAplicacao " ) + obterEndereoDoRecursoRelativoBase () ; c l i e n t e H T T P = new C l i e n t ( P r o t o c o l . HTTP ) ; clienteHTTP . getContext ( ) . g e t P a r a m e t e r s ( ) . add ( " c o n v e r t e r " , " com . n o e l i o s . r e s t l e t . h t t p . HttpClientConverter " ) ;

99 TolerantSaxDocumentBuilder t o l e r a n t S a x D o c u m e n t B u i l d e r = new TolerantSaxDocumentBuilder ( XMLUnit . n e w T e s t P a r s e r ( ) ) ; c o n s t r u t o r D e D o c u m e n t o s = new HTMLDocumentBuilder ( tolerantSaxDocumentBuilder ) ; } p r i v a t e P r o p e r t i e s c a r r e g a r C o n f i g u r a e s ( ) throws I O E x c e p t i o n , FileNotFoundException { P r o p e r t i e s p = new P r o p e r t i e s ( ) ; p . l o a d ( new F i l e I n p u t S t r e a m ( new F i l e ( " configuracoes / configuracoes . properties ") ) ) ; return p ; } p r o t e c t e d Document o b t e r R e p r e s e n t a o D o R e c u r s o ( ) throws SAXException , I O E x c e p t i o n { Response r e s p o s t a = clienteHTTP . g e t ( endereoDoRecurso ) ; String contedoDaRepresentao = resposta . getEntity () . getText () ; return construtorDeDocumentos . parse ( contedoDaRepresentao ) ; } }

Listagem A.12: Arquivo: TesteRecursoSeminarios.java


package b r . u f s c . e d u g r a f . d i s s e m i n a r i o . t e s t e s . r e c u r s o s ; import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t E q u a l s ; import j a v a . i o . I O E x c e p t i o n ; import j a v a . u t i l . L i n k e d H a s h S e t ; import j a v a . u t i l . Map ; import j a v a . u t i l . S e t ;

100

import o r g . j u n i t . T e s t ; import o r g . r e s t l e t . d a t a . Form ; import o r g . r e s t l e t . d a t a . Method ; import o r g . r e s t l e t . d a t a . P a r a m e t e r ; import o r g . r e s t l e t . d a t a . R e s p o n s e ; import o r g . r e s t l e t . d a t a . S t a t u s ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . r e p r e s e n t a c o e s . R e p r e s e n t a c a o N u l a ; public c l a s s TesteRecursoSeminarios extends TesteDeRecurso { @Override public String obterEndereoDoRecursoRelativoBase ( ) { return " / seminarios " ; } @Test p u b l i c v o i d g e t R e a l i z a d o C o m S u c e s s o ( ) throws I O E x c e p t i o n { Response r = clienteHTTP . g e t ( endereoDoRecurso ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , r . g e t S t a t u s ( ) ) ; } @Test p u b l i c v o i d p u t R e t o r n a E r r o D e M t o d o N o P e r m i t i d o ( ) throws IOException { R e s p o n s e r = c l i e n t e H T T P . p u t ( e n d e r e o D o R e c u r s o , new RepresentacaoNula ( ) ) ; a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_METHOD_NOT_ALLOWED, r . getStatus () ) ; } @Test public void headRetornaVarivelTamanhoComValor2 ( ) { Response s = clienteHTTP . head ( endereoDoRecurso ) ; Map< S t r i n g , O b j e c t > a = s . g e t A t t r i b u t e s ( ) ; Form f = ( Form ) a . g e t ( " o r g . r e s t l e t . h t t p . h e a d e r s " ) ;

101 a s s e r t E q u a l s ( new P a r a m e t e r ( " Tamanho " , " 2 " ) , f . g e t F i r s t ( " Tamanho " ) ) ; } @Test public void optionsRealizadoComSucesso ( ) { Response r = clienteHTTP . o p t i o n s ( endereoDoRecurso ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , r . g e t S t a t u s ( ) ) ; } @Test public void optionsRetornaMtodosPermitidos ( ) { S e t <Method > m t o d o s P e r m i t i d o s E s p e r a d o s = new L i n k e d H a s h S e t <Method > ( ) ; m t o d o s P e r m i t i d o s E s p e r a d o s . add ( Method . GET) ; m t o d o s P e r m i t i d o s E s p e r a d o s . add ( Method .HEAD) ; m t o d o s P e r m i t i d o s E s p e r a d o s . add ( Method . OPTIONS ) ; m t o d o s P e r m i t i d o s E s p e r a d o s . add ( Method . POST ) ; m t o d o s P e r m i t i d o s E s p e r a d o s . add ( Method . DELETE ) ; Response r = clienteHTTP . o p t i o n s ( endereoDoRecurso ) ; S e t <Method > m t o d o s P e r m i t i d o s R e c e b i d o s = r . getAllowedMethods ( ) ; assertEquals ( mtodosPermitidosEsperados , mtodosPermitidosRecebidos ) ; } }

Listagem A.13: Arquivo: ClienteHTTPComAutenticacao.java


package b r . u f s c . e d u g r a f . d i s s e m i n a r i o . c l i e n t e ; import j a v a . u t i l . L i s t ; import o r g . r e s t l e t . C l i e n t ; import o r g . r e s t l e t . C o n t e x t ; import o r g . r e s t l e t . d a t a . C h a l l e n g e R e s p o n s e ; import o r g . r e s t l e t . d a t a . C h a l l e n g e S c h e m e ; import o r g . r e s t l e t . d a t a . P r o t o c o l ;

102 import o r g . r e s t l e t . d a t a . R e q u e s t ; import o r g . r e s t l e t . d a t a . R e s p o n s e ; public c l a s s ClienteHTTPComAutenticacao extends C l i e n t { private ChallengeResponse a u t e n t i c a o ; public ClienteHTTPComAutenticacao ( S t r i n g usurio , S t r i n g senha ) { s u p e r ( P r o t o c o l . HTTP ) ; a u t e n t i c a o = new C h a l l e n g e R e s p o n s e ( C h a l l e n g e S c h e m e . HTTP_BASIC , u s u r i o , s e n h a ) ; } @Override public void handle ( Request r e q u e s t , Response r e s p o n s e ) { request . setChallengeResponse ( this . autenticao ) ; super . h a n d l e ( r e q u e s t , r e s p o n s e ) ; }

public ClienteHTTPComAutenticacao ( Context context , List < Protocol > protocols ) { super ( c o n t e x t , p r o t o c o l s ) ; }

Listagem A.14: Arquivo: ClienteHTTPAdministrador.java


package b r . u f s c . e d u g r a f . d i s s e m i n a r i o . c l i e n t e ; import i n f r a E s t r u t u r a . C l i e n t e H T T P N a o B l o q u e a n t e ; import i n f r a E s t r u t u r a . I n f r a E s t r u t u r a D e E s p e c i f i c a o ; import o r g . r e s t l e t . C l i e n t ; import o r g . r e s t l e t . d a t a . Form ;

103 import o r g . r e s t l e t . d a t a . P r o t o c o l ; import o r g . r e s t l e t . d a t a . R e q u e s t ; import o r g . r e s t l e t . d a t a . R e s p o n s e ; import o r g . r e s t l e t . d a t a . S t a t u s ;

public c l a s s ClienteHTTPAdministrador extends C l i e n t { p r i v a t e s t a t i c f i n a l S t r i n g SENHA = " p u b l i c a d o r D e S e m i n a r i o s " ; p r i v a t e s t a t i c f i n a l S t r i n g NOME = " A d m i n i s t r a d o r " ; p r i v a t e s t a t i c f i n a l S t r i n g CORREIO_ELETRONICO = " pablo@hipernet . ufsc . br " ; p r i v a t e s t a t i c f i n a l S t r i n g URL = I n f r a E s t r u t u r a D e E s p e c i f i c a o . obterURLBase ( ) + " / a d m i n i s t r a d o r / " + CORREIO_ELETRONICO ; private Client c l i e n t e ; private Client clienteAutenticado ; public ClienteHTTPAdministrador ( ) { s u p e r ( P r o t o c o l . HTTP ) ; c l i e n t e = new C l i e n t ( P r o t o c o l . HTTP ) ; R e s p o n s e r = c l i e n t e . g e t (URL) ; i f ( ! r . g e t S t a t u s ( ) . e q u a l s ( S t a t u s . SUCCESS_OK ) ) { Form f = new Form ( ) ; f . add ( " nome " ,NOME) ; f . add ( " s e n h a " ,SENHA) ; c l i e n t e . p u t (URL, f . g e t W e b R e p r e s e n t a t i o n ( ) ) ; } c l i e n t e A u t e n t i c a d o = new C l i e n t e H T T P N a o B l o q u e a n t e ( new C l i e n t e H T T P C o m A u t e n t i c a c a o ( CORREIO_ELETRONICO , SENHA) ) ; } @Override public void handle ( Request r e q u e s t , Response r e s p o n s e ) { clienteAutenticado . handle ( request , response ) ; }

104

Listagem A.15: Arquivo: QuandoFoiFeitaUmaPropostaDeSeminario.java


package a d m i n i s t r a d o r A p r o v a n d o P r o p o s t a D e S e m i n r i o ; import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t E q u a l s ; import i n f r a E s t r u t u r a . C l i e n t e H T T P N a o B l o q u e a n t e ; import i n f r a E s t r u t u r a . I n f r a E s t r u t u r a D e E s p e c i f i c a o ; import o r g . j u n i t . A f t e r C l a s s ; import o r g . j u n i t . B e f o r e ; import o r g . j u n i t . B e f o r e C l a s s ; import o r g . j u n i t . T e s t ; import o r g . r e s t l e t . d a t a . Form ; import o r g . r e s t l e t . d a t a . R e s p o n s e ; import o r g . r e s t l e t . d a t a . S t a t u s ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . c l i e n t e . ClienteHTTPComAutenticacao ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . m i c r o f o r m a t o . M i c r o f o r m a t o ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . r e p r e s e n t a c o e s . RepresentacaoXHTML ; public c l a s s QuandoFoiFeitaUmaPropostaDeSeminrio extends InfraEstruturaDeEspecificao {

public s t a t i c void considerandoQue ( ) { () ; comNomeParaURL_PsicologiaNoChile ( ) ; comOTtulo_Psicologia_No_Chile ( ) ; comADescrio_Uma_Descrio ( ) ; comAsInstrues_Instrues () ; comOTipoDeInscrio_Somente_Convidados ( ) ; comOTipoDeAssistncia_Pblica ( ) ;

existeUmaPropostaDeSeminrioEm_URL_Proposta_Seminario_Psicolog

105 comADisponibilidadeDeResultados_Pblica () ; comDataDeIncio_20_11_2008 ( ) ; comDataDeEncerramento_27_11_2008 ( ) ; comORamalUFSC_5671 ( ) ; () ; } public s t a t i c void caso ( ) { () ; } public void ento ( ) { deveSerCriadaUmSeminrioEm_URL_Seminario_Psicologia_No_Chile () ; deTtulo_Um_Seminrio ( ) ; deDescrio_Uma_Descrio ( ) ; deInstrues_Instrues () ; deTipoDeInscrio_Somente_Convidados ( ) ; deTipoDeAssistncia_Pblica () ; deDisponibilidadeDeResultados_Pblica () ; deDataDeIncio_20_11_2008 ( ) ; deDataDeEncerramento_27_11_2008 ( ) ; deveExistirUmEnlaceEm_Psicologia_No_Chile_deTexto_Participant () ; deveExistirUmEnlaceEm_Psicologia_No_Chile_deTexto_Apresentaco () ; comCoordenador_chamado_Fulano ( ) ; eEleDeveEstarNaListaDeSeminrios ( ) ; () ; () ; () ; () ;

cujoProponenteOUsurioDeCorreioEletrnico_teste_arroba_edugraf_

o_UsurioDeCorreioEletrnico_administradorDisseminario_arroba_e

OUsurioDeCorreioEletrnico_teste_arroba_edugraf_ufsc_br_EstNa

OUsurioDeCorreioEletrnico_teste_arroba_edugraf_ufsc_br_EstN

deveExistirUmEnlaceEm_Usuarios_apontando_para_o_usuario_teste_a

noUsuario_teste_arroba_edugraf_ufsc_br_deve_existir_o_ramal_UFS

106 } @Test public void () { RepresentacaoXHTML c o o r d e n a d o r e s = o b t e r R e p r e s e n t a o ( URL_DOS_PARTICIPANTES ) ; a s s e r t E q u a l s (NOME_DO_PROPONENTE, c o o r d e n a d o r e s . obterMicroformato ( " p a r t i c i p a n t e s " ) . o b t e r E n l a c e P e l a U R L ( URL_DO_PARTICIPANTE ) . o b t e r T e x t o () ) ; } @Test public void deveExistirUmEnlaceEm_Psicologia_No_Chile_deTexto_Apresentacoes_ap () { Microformato m = obterMicroformato ( URL_SEMINRIO_PSICOLOGIA_NO_CHILE , " a p r e s e n t a c o e s " ); a s s e r t E q u a l s ( " A p r e s e n t a e s " , m. o b t e r E n l a c e P e l a U R L ( URL_SEMINRIO_PSICOLOGIA_NO_CHILE + " / apresentacoes " ) . obterTexto () ) ; } @Test public void deveExistirUmEnlaceEm_Psicologia_No_Chile_deTexto_Participantes_ap () { Microformato m = obterMicroformato ( URL_SEMINRIO_PSICOLOGIA_NO_CHILE , " p a r t i c i p a n t e s " ); a s s e r t E q u a l s ( " P a r t i c i p a n t e s " , m. o b t e r E n l a c e P e l a U R L ( URL_SEMINRIO_PSICOLOGIA_NO_CHILE + " / p a r t i c i p a n t e s " ) . obterTexto () ) ; }

OUsurioDeCorreioEletrnico_teste_arroba_edugraf_ufsc_br_EstNaLista

107 @Test public void eEleDeveEstarNaListaDeSeminrios ( ) { RepresentacaoXHTML s e m i n r i o s = o b t e r R e p r e s e n t a o ( URL_DOS_SEMINARIOS ) ; a s s e r t E q u a l s ( TTULO , s e m i n r i o s . o b t e r M i c r o f o r m a t o ( " seminarios " ) . obterEnlacePelaURL ( URL_SEMINRIO_PSICOLOGIA_NO_CHILE ) . o b t e r T e x t o ( ) ) ; } @Test public void () { RepresentacaoXHTML u s u r i o s = o b t e r R e p r e s e n t a o ( URL_DO_PROPONENTE) ; a s s e r t E q u a l s (RAMAL_UFSC, u s u r i o s . o b t e r M i c r o f o r m a t o ( " u s u a r i o " ) . o b t e r V a l o r D o A t r i b u t o ( " ramalUFSC " ) ) ; } @Test public void () { RepresentacaoXHTML u s u r i o s = o b t e r R e p r e s e n t a o ( obterURLBase ( ) + " / u s u a r i o s " ) ; a s s e r t E q u a l s (NOME_DO_PROPONENTE, u s u r i o s . obterMicroformato ( " u s u a r i o s " ) . obterEnlacePelaURL ( URL_DO_PROPONENTE) . o b t e r T e x t o ( ) ) ; } @Test public void deveSerCriadaUmSeminrioEm_URL_Seminario_Psicologia_No_Chile () { a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , c l i e n t e H T T P . g e t ( URL_SEMINRIO_PSICOLOGIA_NO_CHILE ) . g e t S t a t u s ( ) ) ; }

noUsuario_teste_arroba_edugraf_ufsc_br_deve_existir_o_ramal_UFSC_567

deveExistirUmEnlaceEm_Usuarios_apontando_para_o_usuario_teste_arroba

108 @Test public void deTtulo_Um_Seminrio ( ) { a s s e r t E q u a l s ( TTULO , s e m i n r i o . o b t e r M i c r o f o r m a t o ( " seminario " ) . obterValorDoAtributo ( " t i t u l o " ) ) ; } @Test public void deDescrio_Uma_Descrio ( ) { a s s e r t E q u a l s ( DESCRIO , s e m i n r i o . o b t e r M i c r o f o r m a t o ( " seminario " ) . obterValorDoAtributo ( " descricao " ) ) ; } @Test public void d e I n s t r u e s _ I n s t r u e s ( ) { a s s e r t E q u a l s ( INSTRUES , s e m i n r i o . o b t e r M i c r o f o r m a t o ( " seminario " ) . obterValorDoAtributo ( " instrucoes " ) ) ; } @Test public void deTipoDeInscrio_Somente_Convidados ( ) { a s s e r t E q u a l s ( TIPO_DE_INSCRIO , s e m i n r i o . obterMicroformato ( " seminario " ) . obterValorDoAtributo ( " inscricao " ) ) ; } @Test public void d e T i p o D e A s s i s t n c i a _ P b l i c a ( ) { a s s e r t E q u a l s ( TIPO_DE_ASSISTNCIA , s e m i n r i o . obterMicroformato ( " seminario " ) . obterValorDoAtributo ( " a s s i s t e n c i a " ) ) ; } @Test public void d e D i s p o n i b i l i d a d e D e R e s u l t a d o s _ P b l i c a ( ) { a s s e r t E q u a l s ( DISPONIBILIDADE_DE_RESULTADOS , s e m i n r i o . obterMicroformato ( " seminario " ) . obterValorDoAtributo ( " disponibilidade " ) ) ; }

109

@Test public void deDataDeIncio_20_11_2008 ( ) { a s s e r t E q u a l s ( DATA_INCIO , s e m i n r i o . o b t e r M i c r o f o r m a t o ( " seminario " ) . obterValorDoAtributo ( " dataDeInicio " ) ); } @Test public void deDataDeEncerramento_27_11_2008 ( ) { a s s e r t E q u a l s (DATA_DE_ENCERRAMENTO, s e m i n r i o . obterMicroformato ( " seminario " ) . o b t e r V a l o r D o A t r i b u t o ( " dataDeTermino " ) ) ; } @Test public void () { RepresentacaoXHTML c o o r d e n a d o r e s = o b t e r R e p r e s e n t a o (URL_DE_COORDENADORES) ; a s s e r t E q u a l s (NOME_DO_PROPONENTE, c o o r d e n a d o r e s . obterMicroformato ( " coordenadores " ) . o b t e r E n l a c e P e l a U R L (URL_DO_COORDENADOR) . o b t e r T e x t o () ) ; } @Test p u b l i c void comCoordenador_chamado_Fulano ( ) { a s s e r t E q u a l s (URL_DO_PROPONENTE, s e m i n r i o . obterMicroformato ( " seminario " ) . obterEnlacePeloAtributoClass ( " coordenador " ) . obterURL ( ) ) ; a s s e r t E q u a l s (NOME_DO_PROPONENTE, s e m i n r i o . obterMicroformato ( " seminario " ) . obterEnlacePeloAtributoClass ( " coordenador " ) . obterTexto () ) ; }

OUsurioDeCorreioEletrnico_teste_arroba_edugraf_ufsc_br_EstNaLista

110

private s t a t i c void () { Form a p r o v a o = new Form ( ) ; a p r o v a o . add ( " a p r o v a d a " , " v e r d a d e i r o " ) ; c l i e n t e H T T P A d m i n i s t r a d o r . p u t ( URL_DA_PROPOSTA_CRIADA , aprovao . getWebRepresentation ( ) ) ; } private s t a t i c void () { Form c a d a s t r o = new Form ( ) ; clienteHTTPAdministrador . delete ( URL_DE_CADASTRAMENTO_DO_PROPONENTE) ; Response r = clienteHTTP . put ( URL_DE_CADASTRAMENTO_DO_PROPONENTE, c a d a s t r o . getWebRepresentation () ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_CREATED , r . g e t S t a t u s ( ) ) ; CHAVE_DO_PROPONENTE = o b t e r C h a v e D e C a d a s t r a m e n t o ( ) ; c l i e n t e H T T P A d m i n i s t r a d o r . d e l e t e (URL_DO_PROPONENTE) ; Form f o r m u l r i o = new Form ( ) ; f o r m u l r i o . add ( " nome " , NOME_DO_PROPONENTE) ; f o r m u l r i o . add ( " s e n h a " , SENHA_DO_PROPONENTE) ; f o r m u l r i o . add ( " c h a v e S e c r e t a " , CHAVE_DO_PROPONENTE) ; c l i e n t e H T T P . p u t (URL_DE_CADASTRAMENTO_DO_PROPONENTE, formulrio . getWebRepresentation () ) ; c l i e n t e H T T P = new C l i e n t e H T T P N a o B l o q u e a n t e ( new ClienteHTTPComAutenticacao ( CORREIO_ELETRNICO_DO_PROPONENTE , SENHA_DO_PROPONENTE) ) ; r = c l i e n t e H T T P . p o s t ( URL_DE_CRIAO_DE_PROPOSTAS , proposta . getWebRepresentation () ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_CREATED , r . g e t S t a t u s ( ) ) ;

o_UsurioDeCorreioEletrnico_administradorDisseminario_arroba_edugra

cujoProponenteOUsurioDeCorreioEletrnico_teste_arroba_edugraf_ufsc_

111 URL_DA_PROPOSTA_CRIADA = e x t r a i r C a b e a l h o D e N o m e ( r , " Location " ) ; } private s t a t i c S t r i n g obterChaveDeCadastramento ( ) { RepresentacaoXHTML try { r e p r e s e n t a o = new RepresentacaoXHTML ( obterParserDeDocumentos ( ) . parse ( clienteHTTPAdministrador . get ( URL_DE_CADASTRAMENTO_DO_PROPONENTE) . getEntity () . getText () ) ) ; } catch ( Exception e ) { e . printStackTrace () ; } Microformato m = r e p r e s e n t a o . obterMicroformato ( " cadastroTemporarioDeUsuario " ) ; r e t u r n m. o b t e r V a l o r D o A t r i b u t o ( " c h a v e S e c r e t a " ) ; } p r i v a t e s t a t i c v o i d comORamalUFSC_5671 ( ) { p r o p o s t a . add ( " ramalUFSC " , RAMAL_UFSC) ; } representao = null ;

p r i v a t e s t a t i c v o i d comNomeParaURL_PsicologiaNoChile ( ) { p r o p o s t a . add ( " nomeParaURL " , " P s i c o l o g i a N o C h i l e " ) ; } p r i v a t e s t a t i c void comDataDeEncerramento_27_11_2008 ( ) { p r o p o s t a . add ( " d a t a D e T e r m i n o " , DATA_DE_ENCERRAMENTO) ; } p r i v a t e s t a t i c void comDataDeIncio_20_11_2008 ( ) { p r o p o s t a . add ( " d a t a D e I n i c i o " , DATA_INCIO ) ; }

112 private s t a t i c void comADisponibilidadeDeResultados_Pblica ( ) { p r o p o s t a . add ( " d i s p o n i b i l i d a d e " , DISPONIBILIDADE_DE_RESULTADOS ) ; } private s t a t i c void comOTipoDeAssistncia_Pblica ( ) { p r o p o s t a . add ( " a s s i s t e n c i a " , TIPO_DE_ASSISTNCIA ) ; } private s t a t i c void comOTipoDeInscrio_Somente_Convidados ( ) { p r o p o s t a . add ( " i n s c r i c a o " , TIPO_DE_INSCRIO ) ; } p r i v a t e s t a t i c void comADescrio_Uma_Descrio ( ) { p r o p o s t a . add ( " d e s c r i c a o " , DESCRIO ) ; } private s t a t i c void c o m A s I n s t r u e s _ I n s t r u e s ( ) { p r o p o s t a . add ( " i n s t r u c o e s " , INSTRUES ) ; } private s t a t i c void comOTtulo_Psicologia_No_Chile ( ) { p r o p o s t a . add ( " t i t u l o " , TTULO ) ; } p r i v a t e RepresentacaoXHTML o b t e r R e p r e s e n t a o ( S t r i n g URL) { RepresentacaoXHTML r = n u l l ; try { r = new RepresentacaoXHTML ( obterParserDeDocumentos ( ) . parse ( c l i e n t e H T T P . g e t (URL) . g e t E n t i t y ( ) . g e t T e x t ( ) )); } catch ( Exception e ) { e . printStackTrace () ; } return r ;

113 }

private s t a t i c void () { p r o p o s t a = new Form ( ) ; } @Before public void obterRepresentaoDeSeminrio ( ) { seminrio = obterRepresentao ( URL_SEMINRIO_PSICOLOGIA_NO_CHILE ) ; } @BeforeClass public s t a t i c void p r e l i m i n a r e s ( ) { considerandoQue ( ) ; caso ( ) ; } @AfterClass public s t a t i c void limparCenrio ( ) { a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , clienteHTTPAdministrador . delete ( URL_SEMINRIO_PSICOLOGIA_NO_CHILE ) . g e t S t a t u s ( ) ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , c l i e n t e H T T P A d m i n i s t r a d o r . d e l e t e (URL_DO_PROPONENTE) . getStatus () ) ; } p u b l i c RepresentacaoXHTML s e m i n r i o ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DOS_SEMINARIOS = obterURLBase () + " / " ; p r i v a t e s t a t i c S t r i n g CHAVE_DO_PROPONENTE ; p r i v a t e s t a t i c f i n a l S t r i n g CORREIO_ELETRNICO_DO_PROPONENTE = " pablo@edugraf . ufsc . br " ;

existeUmaPropostaDeSeminrioEm_URL_Proposta_Seminario_Psicologia_No

114 private s t a t i c final String URL_DE_CADASTRAMENTO_DO_PROPONENTE = obterURLBase ( ) + " / c a d a s t r a m e n t o / " + CORREIO_ELETRNICO_DO_PROPONENTE ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DO_PROPONENTE = obterURLBase ( ) + " / u s u a r i o / " + CORREIO_ELETRNICO_DO_PROPONENTE ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DO_COORDENADOR = obterURLBase ( ) + " / c o o r d e n a d o r / " + CORREIO_ELETRNICO_DO_PROPONENTE ; p r i v a t e s t a t i c f i n a l S t r i n g NOME_DO_PROPONENTE = " F u l a n o " ; p r i v a t e s t a t i c f i n a l S t r i n g SENHA_DO_PROPONENTE = " publicadorDeSeminarios " ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DE_CRIAO_DE_PROPOSTAS = obterURLBase ( ) + " / p r o p o s t a s D e S e m i n a r i o " ; p r i v a t e s t a t i c f i n a l S t r i n g URL_SEMINRIO_PSICOLOGIA_NO_CHILE = obterURLBase ( ) + " / P s i c o l o g i a N o C h i l e " ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DO_PARTICIPANTE = URL_SEMINRIO_PSICOLOGIA_NO_CHILE + " / p a r t i c i p a n t e / " + CORREIO_ELETRNICO_DO_PROPONENTE ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DOS_PARTICIPANTES = URL_SEMINRIO_PSICOLOGIA_NO_CHILE + " / p a r t i c i p a n t e s " ; p r i v a t e s t a t i c f i n a l S t r i n g RAMAL_UFSC = " 5671 " ; p r i v a t e s t a t i c f i n a l S t r i n g DATA_INCIO = " 2 0 / 1 1 / 2 0 0 8 " ; p r i v a t e s t a t i c f i n a l S t r i n g DATA_DE_ENCERRAMENTO = " 27/11/2008 " ; p r i v a t e s t a t i c f i n a l S t r i n g DISPONIBILIDADE_DE_RESULTADOS = " publica " ; p r i v a t e s t a t i c f i n a l S t r i n g TIPO_DE_ASSISTNCIA = DISPONIBILIDADE_DE_RESULTADOS ; p r i v a t e s t a t i c f i n a l S t r i n g TIPO_DE_INSCRIO = " c o n v i d a d o s " ; p r i v a t e s t a t i c f i n a l S t r i n g INSTRUES = " I n s t r u e s " ; p r i v a t e s t a t i c f i n a l S t r i n g DESCRIO = "Uma D e s c r i o " ; p r i v a t e s t a t i c f i n a l S t r i n g TTULO = "Um S e m i n r i o " ; p r i v a t e s t a t i c S t r i n g URL_DA_PROPOSTA_CRIADA ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DE_COORDENADORES = obterURLBase ( ) + " / c o o r d e n a d o r e s " ; p r i v a t e s t a t i c Form p r o p o s t a ; }

115

Listagem A.16: Arquivo: QuandoApresentacaoENova.java


package p a r t i c i p a n t e P u b l i c a n d o A p r e s e n t a c a o ; import s t a t i c j u n i t . f r a m e w o r k . A s s e r t . a s s e r t N o t N u l l ; import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t E q u a l s ; import i n f r a E s t r u t u r a . C l i e n t e H T T P N a o B l o q u e a n t e ; import i n f r a E s t r u t u r a . I n f r a E s t r u t u r a D e E s p e c i f i c a o ; import j a v a . t e x t . D a t e F o r m a t ; import j a v a . t e x t . S i m p l e D a t e F o r m a t ; import j a v a . u t i l . C a l e n d a r ; import o r g . j u n i t . A f t e r C l a s s ; import o r g . j u n i t . B e f o r e C l a s s ; import o r g . j u n i t . T e s t ; import o r g . r e s t l e t . C l i e n t ; import o r g . r e s t l e t . d a t a . MediaType ; import o r g . r e s t l e t . d a t a . S t a t u s ; import o r g . r e s t l e t . r e s o u r c e . F i l e R e p r e s e n t a t i o n ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . c l i e n t e . ClienteHTTPComAutenticacao ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . m i c r o f o r m a t o . M i c r o f o r m a t o ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . r e p r e s e n t a c o e s . R e p r e s e n t a c a o N u l a ;

p u b l i c c l a s s Q u a n d o A p r e s e nt a c a o N o v a e x t e n d s InfraEstruturaDeEspecificao {

public s t a t i c void considerandoQue ( ) () ;

considerandoQueExisteOUsuarioDeCorreioEletronico_usuarioDoDissemina eEleParticipanteDoSeminrio_UmSeminario ( ) ; } public s t a t i c void caso ( ) {

116

oUsuarioDeCorreioEletronico_usuarioDoDisseminario_arroba_edugra () ; comTtulo_UmaApresentacao ( ) ; anexandoOArquivo_umaApresentacao_ponto_ppt ( ) ; em_UmSeminario_barra_apresentacao_barra_umaApresentacao () ; } public void ento ( ) { () ; deTtulo_UmaApresentacao ( ) ; deDataDeHoje ( ) ; deHoraDefinida ( ) ; () ; () ; () ; () ; } @Test public void deHoraDefinida ( ) { Microformato m = obterMicroformato ( URL_DA_APRESENTAO, " a p r e s e n t a c a o " ) ; a s s e r t N o t N u l l (m. o b t e r V a l o r D o A t r i b u t o ( " h o r a " ) ) ; } @Test p u b l i c v o i d deDataDeHoje ( ) { Calendar c = Calendar . getInstance ( ) ; D a t e F o r m a t d f = new S i m p l e D a t e F o r m a t ( " dd /MM/ yyyy " ) ; Microformato m = obterMicroformato ( URL_DA_APRESENTAO, " a p r e s e n t a c a o " ) ;

deveSerCriadaUmaApresentacao_em_UmSeminario_barra_apresentacao

comUmEnlaceDeTexto_umaApresentacao_ponto_ppt_apontandoPara_Um

comUmEnlaceDeTexto_Fulano_apontandoPara_UmSeminario_participa

deveExistirUmEnlaceEm_Seminario_UmSeminario_apresentacoes_apon

oArquivoDeveExistirEm_Seminario_UmSeminario_apresentacoes_apon

117 a s s e r t E q u a l s ( d f . f o r m a t ( c . g e t T i m e ( ) ) , m. obterValorDoAtributo ( " data " ) ) ; } @Test public void () { a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , c l i e n t e H T T P . g e t ( URL_DA_APRESENTAO_ARQUIVO) . g e t S t a t u s ( ) ) ; } @Test public void () { Microformato m = obterMicroformato ( URL_DA_APRESENTAO, " a p r e s e n t a c a o " ) ; a s s e r t E q u a l s ( NOME_DO_PARTICIPANTE , m. o b t e r E n l a c e P e l a U R L ( URL_DO_PARTICIPANTE ) . o b t e r T e x t o () ) ; } @Test public void () { a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , c l i e n t e H T T P . g e t ( URL_DA_APRESENTAO) . g e t S t a t u s ( ) ) ; } @Test public void () { Microformato m = obterMicroformato ( URL_DA_APRESENTAO, " a p r e s e n t a c a o " ) ;

oArquivoDeveExistirEm_Seminario_UmSeminario_apresentacoes_apontando

comUmEnlaceDeTexto_Fulano_apontandoPara_UmSeminario_participante_u

deveSerCriadaUmaApresentacao_em_UmSeminario_barra_apresentacao_barra

comUmEnlaceDeTexto_umaApresentacao_ponto_ppt_apontandoPara_UmSemin

118 a s s e r t E q u a l s (NOME_DO_ARQUIVO, m. o b t e r E n l a c e P e l a U R L ( URL_DA_APRESENTAO_ARQUIVO) . o b t e r T e x t o ( ) ) ; }

@Test public void deTtulo_UmaApresentacao ( ) { Microformato m = obterMicroformato ( URL_DA_APRESENTAO, " a p r e s e n t a c a o " ) ; a s s e r t E q u a l s ( TITULO_DA_APRESENTAO , m. obterValorDoAtributo ( " t i t u l o " ) ) ; } @Test public void () { a s s e r t E q u a l s (URL_DA_APRESENTAO, o b t e r M i c r o f o r m a t o ( URL_DAS_APRESENTAES , " a p r e s e n t a c o e s " ) . o b t e r E n l a c e P e l a U R L (URL_DA_APRESENTAO) . obterURL ( ) ); } public s t a t i c void comTtulo_UmaApresentacao ( ) { } private s t a t i c void eEleParticipanteDoSeminrio_UmSeminario () { c r i a r S e m i n r i o ( CORREIO_ELETRONICO_DO_PARTICIPANTE , SENHA_DO_PARTICIPANTE , NOME_PARA_URL_DO_SEMINRIO , NOME_PARA_URL_DO_SEMINRIO) ; C l i e n t c l i e n t e A u t e n t i c a d o = new ClienteHTTPComAutenticacao ( CORREIO_ELETRONICO_DO_PARTICIPANTE , SENHA_DO_PARTICIPANTE ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_CREATED , c l i e n t e A u t e n t i c a d o . p u t ( URL_DO_PARTICIPANTE , new RepresentacaoNula ( ) ) . getStatus ( ) ) ;

deveExistirUmEnlaceEm_Seminario_UmSeminario_apresentacoes_apontando

119 } private s t a t i c void em_UmSeminario_barra_apresentacao_barra_umaApresentacao ( ) { c l i e n t e H T T P . d e l e t e (URL_DA_APRESENTAO) ; F i l e R e p r e s e n t a t i o n f r = new F i l e R e p r e s e n t a t i o n ( " r e c u r s o s / u m a A p r e s e n t a c a o . p p t " , MediaType . APPLICATION_POWERPOINT , 0 ) ; c l i e n t e H T T P = new C l i e n t e H T T P N a o B l o q u e a n t e ( new ClienteHTTPComAutenticacao ( CORREIO_ELETRONICO_DO_PARTICIPANTE , SENHA_DO_PARTICIPANTE ) ) ; c l i e n t e H T T P . p u t (URL_DA_APRESENTAO, f r ) ; } private s t a t i c void () { c r i a r U s u r i o ( CORREIO_ELETRONICO_DO_PARTICIPANTE , NOME_DO_PARTICIPANTE , SENHA_DO_PARTICIPANTE ) ; }

considerandoQueExisteOUsuarioDeCorreioEletronico_usuarioDoDissemina

private s t a t i c void anexandoOArquivo_umaApresentacao_ponto_ppt ( ) { }

private s t a t i c void () { } @AfterClass public s t a t i c void limparCenrio ( ) {

oUsuarioDeCorreioEletronico_usuarioDoDisseminario_arroba_edugraf_ufs

120 a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , c l i e n t e H T T P . d e l e t e ( URL_DA_APRESENTAO) . g e t S t a t u s ( ) ) ; } @BeforeClass public s t a t i c void p r e l i m i n a r e s ( ) { considerandoQue ( ) ; caso ( ) ; } / / TODO: i n c l u i r t e s t e s p a r a a r q u i v o s i n v l i d o s p r i v a t e s t a t i c f i n a l S t r i n g NOME_PARA_URL_DO_SEMINRIO = " UmSeminario " ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DO_SEMINRIO = obterURLBase ( ) + " / " + NOME_PARA_URL_DO_SEMINRIO ; p r i v a t e s t a t i c f i n a l S t r i n g SENHA_DO_PARTICIPANTE = " 1234 " ; p r i v a t e s t a t i c f i n a l S t r i n g NOME_DO_PARTICIPANTE = " F u l a n o " ; private s t a t i c final String CORREIO_ELETRONICO_DO_PARTICIPANTE = " usuarioDoDisseminario@edugraf . ufsc . br " ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DO_PARTICIPANTE = URL_DO_SEMINRIO + " / p a r t i c i p a n t e / " + CORREIO_ELETRONICO_DO_PARTICIPANTE ; p r i v a t e s t a t i c f i n a l S t r i n g TITULO_DA_APRESENTAO = " UmaApresentacao t i t u l o " ; p r i v a t e s t a t i c f i n a l S t r i n g TITULO_PARA_URL_DA_APRESENTAO = " UmaApresentacao " ; p r i v a t e s t a t i c f i n a l S t r i n g NOME_DO_ARQUIVO = " U m a A p r e s e n t a c a o . odp " ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DA_APRESENTAO = URL_DO_SEMINRIO + " / a p r e s e n t a c a o / " + TITULO_PARA_URL_DA_APRESENTAO ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DA_APRESENTAO_ARQUIVO = URL_DA_APRESENTAO + " / " + NOME_DO_ARQUIVO; p r i v a t e s t a t i c f i n a l S t r i n g URL_DAS_APRESENTAES = URL_DO_SEMINRIO + " / a p r e s e n t a c o e s " ;

121 }

Listagem A.17: Arquivo: QuandoUsuarioEVisitante.java


package c r i a o D e P r o p o s t a D e S e m i n r i o ; import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t E q u a l s ; import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t N o t N u l l ; import o r g . j u n i t . B e f o r e C l a s s ; import o r g . j u n i t . T e s t ; import o r g . r e s t l e t . d a t a . C h a l l e n g e S c h e m e ; import o r g . r e s t l e t . d a t a . Form ; import o r g . r e s t l e t . d a t a . R e s p o n s e ; import o r g . r e s t l e t . d a t a . S t a t u s ; import i n f r a E s t r u t u r a . I n f r a E s t r u t u r a D e E s p e c i f i c a o ; public c l a s s QuandoUsurioVisitante extends InfraEstruturaDeEspecificao { p r i v a t e s t a t i c f i n a l S t r i n g URL_PROPOSTA = " / propostasDeSeminario " ; p r i v a t e s t a t i c f i n a l S t r i n g URL_SEMINRIO = " / UmSeminario " ; p r i v a t e s t a t i c Response r e s p o s t a ; private s t a t i c void considerandoQue ( ) { noExisteUmSeminrioEm ( URL_SEMINRIO ) ; oUsurioNoTemContaNoSistema ( ) ; } private s t a t i c void caso ( ) { oUsurioSoliciteACriaoDeUmaProposta ( ) ; } public void ento ( ) { deveSerNegadoOPedido ( ) ; deveSerRequeridaAutenticao () ; }

122

@BeforeClass public s t a t i c void p r e l i m i n a r e s ( ) { considerandoQue ( ) ; caso ( ) ; } @Test publ ic void deveSerNegadoOPedido ( ) { a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_UNAUTHORIZED , resposta . getStatus () ) ; } @Test public void deveSerRequeridaAutenticao ( ) { a s s e r t N o t N u l l ( r e s p o s t a . g e t C h a l l e n g e R e q u e s t ( ) . getRealm () ) ; a s s e r t E q u a l s ( C h a l l e n g e S c h e m e . HTTP_BASIC , r e s p o s t a . g e t C h a l l e n g e R e q u e s t ( ) . getScheme ( ) ) ; } private s t a t i c void oUsurioSoliciteACriaoDeUmaProposta ( ) { Form p r o p o s t a = new Form ( ) ; r e s p o s t a = c l i e n t e H T T P . p o s t ( obterURLBase ( ) + URL_PROPOSTA , p r o p o s t a . g e t W e b R e p r e s e n t a t i o n ( ) ) ; } p r i v a t e s t a t i c v o i d oUsurioNoTemContaNoSistema ( ) {}

p u b l i c s t a t i c v o i d noExisteUmSeminrioEm ( S t r i n g URL) { c l i e n t e H T T P A d m i n i s t r a d o r . d e l e t e ( obterURLBase ( ) + URL) ; a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_NOT_FOUND , c l i e n t e H T T P A d m i n i s t r a d o r . g e t ( obterURLBase ( ) + URL) . getStatus () ) ; }

123 public s t a t i c void noExisteUmaPropostaDeSeminrioEm ( S t r i n g URL) { c l i e n t e H T T P A d m i n i s t r a d o r . d e l e t e ( obterURLBase ( ) + URL) ; a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_NOT_FOUND , c l i e n t e H T T P A d m i n i s t r a d o r . g e t ( obterURLBase ( ) + URL) . getStatus () ) ; }

Listagem A.18: Arquivo: QuandoOSeminarioENovo.java


package c r i a o D e P r o p o s t a D e S e m i n r i o ; import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t E q u a l s ; import i n f r a E s t r u t u r a . C l i e n t e H T T P N a o B l o q u e a n t e ; import i n f r a E s t r u t u r a . I n f r a E s t r u t u r a D e E s p e c i f i c a o ; import o r g . j u n i t . A f t e r C l a s s ; import o r g . j u n i t . B e f o r e ; import o r g . j u n i t . B e f o r e C l a s s ; import o r g . j u n i t . T e s t ; import o r g . r e s t l e t . d a t a . Form ; import o r g . r e s t l e t . d a t a . R e s p o n s e ; import o r g . r e s t l e t . d a t a . S t a t u s ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . c l i e n t e . ClienteHTTPComAutenticacao ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . m i c r o f o r m a t o . M i c r o f o r m a t o ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . r e p r e s e n t a c o e s . RepresentacaoXHTML ;

p u b l i c c l a s s QuandoOSeminrioNovo e x t e n d s InfraEstruturaDeEspecificao {

124

public s t a t i c void considerandoQue ( ) { noExisteUmSeminrioDeURL_UmSeminario ( ) ; existeUmProponenteDeNome_teste_e_correioEletronico_teste_arrob () ; } public s t a t i c void caso ( ) { oUsurioSoliciteACriaoDeUmaPropostaDeSeminrio ( ) ; comOTtulo_Um_Seminrio ( ) ; comADescrio_Uma_Descrio ( ) ; comAsInstrues_Instrues () ; comOTipoDeInscrio_Somente_Convidados ( ) ; comOTipoDeAssistncia_Pblica ( ) ; comADisponilidadeDeResultados_Pblica ( ) ; comDataDeIncio_20_11_2008 ( ) ; comDataDeEncerramento_27_11_2008 ( ) ; comORamalUFSC_5671 ( ) ; em_UmSeminrio ( ) ; } public void ento ( ) { deveSerCriadaUmaPropostaDeSeminrio ( ) ; deTtulo_Um_Seminrio ( ) ; deDescrio_Uma_Descrio ( ) ; deInstrues_Instrues () ; deTipoDeInscrio_Somente_Convidados ( ) ; deTipoDeAssistncia_Pblica () ; deDisponilidadeDeResultados_Pblica () ; deDataDeIncio_20_11_2008 ( ) ; deDataDeEncerramento_27_11_2008 ( ) ; deRamalUFSC_5671 ( ) ; deProponente_disseminario_arroba_edugraf_ufsc_br () ; } @Test public void deveSerCriadaUmaPropostaDeSeminrio ( ) {

125 a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , clienteHTTPAdministrador . get ( URL_DA_PROPOSTA_CRIADA ) . g e t S t a t u s ( ) ) ; } @Test p u b l i c v o i d deRamalUFSC_5671 ( ) { a s s e r t E q u a l s (RAMAL_UFSC, r e p r e s e n t a o . obterMicroformato ( " proposta " ) . obterValorDoAtributo ( " ramal " ) ) ; } @Test public void deDataDeEncerramento_27_11_2008 ( ) { a s s e r t E q u a l s (DATA_DE_ENCERRAMENTO, r e p r e s e n t a o . obterMicroformato ( " proposta " ) . obterValorDoAtributo ( " dataDeTermino " ) ) ; } @Test public void deDataDeIncio_20_11_2008 ( ) { a s s e r t E q u a l s ( DATA_INCIO , r e p r e s e n t a o . obterMicroformato ( " proposta " ) . obterValorDoAtributo ( " dataDeInicio " ) ) ; } @Test public void d e D i s p o n i l i d a d e D e R e s u l t a d o s _ P b l i c a ( ) { a s s e r t E q u a l s ( DISPONIBILIDADE_DE_RESULTADOS , representao . obterMicroformato ( " proposta " ) . obterValorDoAtributo ( " disponibilidade " ) ) ; } @Test public void d e T i p o D e A s s i s t n c i a _ P b l i c a ( ) { a s s e r t E q u a l s ( TIPO_DE_ASSISTNCIA , r e p r e s e n t a o . obterMicroformato ( " proposta " ) . obterValorDoAtributo (" assistencia ") ) ;

126 } @Test public void deTipoDeInscrio_Somente_Convidados ( ) { a s s e r t E q u a l s ( TIPO_DE_INSCRIO , r e p r e s e n t a o . obterMicroformato ( " proposta " ) . obterValorDoAtributo (" inscricao ") ) ; } @Test public void d e I n s t r u e s _ I n s t r u e s ( ) { a s s e r t E q u a l s ( INSTRUES , r e p r e s e n t a o . obterMicroformato ( " proposta " ) . obterValorDoAtributo ( " instrucoes " ) ) ; } @Test public void deDescrio_Uma_Descrio ( ) { a s s e r t E q u a l s ( DESCRIO , r e p r e s e n t a o . obterMicroformato ( " proposta " ) . obterValorDoAtributo ( " descricao " ) ) ; } @Test public void deTtulo_Um_Seminrio ( ) { a s s e r t E q u a l s ( TTULO , r e p r e s e n t a o . o b t e r M i c r o f o r m a t o ( " proposta " ) . obterValorDoAtributo ( " t i t u l o " ) ) ; } @Test public void d e P r o p o n e n t e _ d i s s e m i n a r i o _ a r r o b a _ e d u g r a f _ u f s c _ b r () { a s s e r t E q u a l s (URL_DO_PROPONENTE, r e p r e s e n t a o . obterMicroformato ( " proposta " ) . o b t e r E n l a c e P e l o A t r i b u t o C l a s s ( " URLDoProponente " ) . obterURL ( ) ) ; }

127 p r i v a t e s t a t i c v o i d comORamalUFSC_5671 ( ) { p r o p o s t a . add ( " ramalUFSC " , RAMAL_UFSC) ; } p r i v a t e s t a t i c void comDataDeEncerramento_27_11_2008 ( ) { p r o p o s t a . add ( " d a t a D e T e r m i n o " , DATA_DE_ENCERRAMENTO) ; } p r i v a t e s t a t i c void comDataDeIncio_20_11_2008 ( ) { p r o p o s t a . add ( " d a t a D e I n i c i o " , DATA_INCIO ) ; } private s t a t i c void comADisponilidadeDeResultados_Pblica ( ) { p r o p o s t a . add ( " d i s p o n i b i l i d a d e " , DISPONIBILIDADE_DE_RESULTADOS ) ; } private s t a t i c void comOTipoDeAssistncia_Pblica ( ) { p r o p o s t a . add ( " a s s i s t e n c i a " , TIPO_DE_ASSISTNCIA ) ; } private s t a t i c void comOTipoDeInscrio_Somente_Convidados ( ) { p r o p o s t a . add ( " i n s c r i c a o " , TIPO_DE_INSCRIO ) ; } p r i v a t e s t a t i c v o i d em_UmSeminrio ( ) { c l i e n t e H T T P = new C l i e n t e H T T P N a o B l o q u e a n t e ( new ClienteHTTPComAutenticacao ( CORREIO_ELETRNICO_DO_PROPONENTE , SENHA_DO_PROPONENTE) ) ; Response r = clienteHTTP . p o s t ( URL_DE_CRIAO_DE_PROPOSTAS , p r o p o s t a . getWebRepresentation () ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_CREATED , r . g e t S t a t u s ( ) ) ; URL_DA_PROPOSTA_CRIADA = e x t r a i r C a b e a l h o D e N o m e ( r , " Location " ) ; }

128

p r i v a t e s t a t i c v o i d comOTtulo_Um_Seminrio ( ) { p r o p o s t a . add ( " t i t u l o " , TTULO ) ; } p r i v a t e s t a t i c void comADescrio_Uma_Descrio ( ) { p r o p o s t a . add ( " d e s c r i c a o " , DESCRIO ) ; } private s t a t i c void c o m A s I n s t r u e s _ I n s t r u e s ( ) { p r o p o s t a . add ( " i n s t r u c o e s " , INSTRUES ) ; } private s t a t i c void oUsurioSoliciteACriaoDeUmaPropostaDeSeminrio ( ) { p r o p o s t a = new Form ( ) ; } p u b l i c s t a t i c v o i d noExisteUmSeminrioDeURL_UmSeminario ( ) { c l i e n t e H T T P A d m i n i s t r a d o r . d e l e t e ( URL_DO_SEMINRIO ) ; a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_NOT_FOUND , c l i e n t e H T T P . g e t ( URL_DO_SEMINRIO ) . g e t S t a t u s ( ) ) ; } private s t a t i c void () { Form c a d a s t r o = new Form ( ) ; clienteHTTPAdministrador . delete ( URL_DE_CADASTRAMENTO_DO_PROPONENTE) ; Response r = clienteHTTP . put ( URL_DE_CADASTRAMENTO_DO_PROPONENTE, c a d a s t r o . getWebRepresentation () ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_CREATED , r . g e t S t a t u s ( ) ) ; CHAVE_DO_PROPONENTE = o b t e r C h a v e D e C a d a s t r a m e n t o ( ) ; c l i e n t e H T T P A d m i n i s t r a d o r . d e l e t e (URL_DO_PROPONENTE) ; Form f o r m u l r i o = new Form ( ) ;

existeUmProponenteDeNome_teste_e_correioEletronico_teste_arroba_edu

129 f o r m u l r i o . add ( " nome " , NOME_DO_PROPONENTE) ; f o r m u l r i o . add ( " s e n h a " , SENHA_DO_PROPONENTE) ; f o r m u l r i o . add ( " c h a v e S e c r e t a " , CHAVE_DO_PROPONENTE) ; c l i e n t e H T T P . p u t (URL_DE_CADASTRAMENTO_DO_PROPONENTE, formulrio . getWebRepresentation () ) ; } private s t a t i c S t r i n g obterChaveDeCadastramento ( ) { RepresentacaoXHTML try { r e p r e s e n t a o = new RepresentacaoXHTML ( obterParserDeDocumentos ( ) . parse ( clienteHTTPAdministrador . get ( URL_DE_CADASTRAMENTO_DO_PROPONENTE) . getEntity () . getText () ) ) ; } catch ( Exception e ) { e . printStackTrace () ; } Microformato m = r e p r e s e n t a o . obterMicroformato ( " cadastroTemporarioDeUsuario " ) ; r e t u r n m. o b t e r V a l o r D o A t r i b u t o ( " c h a v e S e c r e t a " ) ; } @AfterClass public s t a t i c void limparCenrio ( ) { a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , c l i e n t e H T T P A d m i n i s t r a d o r . d e l e t e (URL_DO_PROPONENTE) . getStatus () ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , clienteHTTPAdministrador . delete ( URL_DE_CADASTRAMENTO_DO_PROPONENTE) . g e t S t a t u s ( ) ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , clienteHTTPAdministrador . delete ( URL_DA_PROPOSTA_CRIADA ) . g e t S t a t u s ( ) ) ; } @Before representao = null ;

130 public void o b t e r R e p r e s e n t a o ( ) { try { r e p r e s e n t a o = new RepresentacaoXHTML ( construtorDeDocumentos . parse ( clienteHTTPAdministrador . get ( URL_DA_PROPOSTA_CRIADA ) . g e t E n t i t y ( ) . getText () ) ) ; } catch ( Exception e ) { e . printStackTrace () ; } } @BeforeClass public s t a t i c void p r e l i m i n a r e s ( ) { considerandoQue ( ) ; caso ( ) ; }

/ / TODO: e x t r a i r URL b a s e p a r a o c l i e n t e p u b l i c RepresentacaoXHTML r e p r e s e n t a o ; p r i v a t e s t a t i c f i n a l S t r i n g RAMAL_UFSC = " 5671 " ; p r i v a t e s t a t i c f i n a l S t r i n g DATA_INCIO = " 2 0 / 1 1 / 2 0 0 8 " ; p r i v a t e s t a t i c f i n a l S t r i n g DATA_DE_ENCERRAMENTO = " 27/11/2008 " ; p r i v a t e s t a t i c f i n a l S t r i n g DISPONIBILIDADE_DE_RESULTADOS = " publica " ; p r i v a t e s t a t i c f i n a l S t r i n g TIPO_DE_ASSISTNCIA = DISPONIBILIDADE_DE_RESULTADOS ; p r i v a t e s t a t i c f i n a l S t r i n g TIPO_DE_INSCRIO = " c o n v i d a d o s " ; p r i v a t e s t a t i c f i n a l S t r i n g INSTRUES = " I n s t r u e s " ; p r i v a t e s t a t i c f i n a l S t r i n g DESCRIO = "Uma D e s c r i o " ; p r i v a t e s t a t i c f i n a l S t r i n g TTULO = "Um S e m i n r i o " ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DE_CRIAO_DE_PROPOSTAS = obterURLBase ( ) + " / p r o p o s t a s D e S e m i n a r i o " ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DO_SEMINRIO = obterURLBase ( ) + " / UmSeminario " ;

131 p r i v a t e s t a t i c f i n a l S t r i n g CORREIO_ELETRNICO_DO_PROPONENTE = " pablo@edugraf . ufsc . br " ; p r i v a t e s t a t i c S t r i n g CHAVE_DO_PROPONENTE ; private s t a t i c final String URL_DE_CADASTRAMENTO_DO_PROPONENTE = obterURLBase ( ) + " / c a d a s t r a m e n t o / " + CORREIO_ELETRNICO_DO_PROPONENTE ; p r i v a t e s t a t i c f i n a l S t r i n g NOME_DO_PROPONENTE = " T e s t e " ; p r i v a t e s t a t i c f i n a l S t r i n g SENHA_DO_PROPONENTE = " t e s t e " ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DO_PROPONENTE = obterURLBase ( ) + " / u s u a r i o / " + CORREIO_ELETRNICO_DO_PROPONENTE ; p r i v a t e s t a t i c S t r i n g URL_DA_PROPOSTA_CRIADA ; p r i v a t e s t a t i c Form p r o p o s t a ; }

Listagem A.19: Arquivo: QuandoExisteOSeminario.java


package u s u r i o P a r t i c i p a n d o D e S e m i n r i o ;

import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t E q u a l s ; import i n f r a E s t r u t u r a . I n f r a E s t r u t u r a D e E s p e c i f i c a o ; import o r g . j u n i t . B e f o r e C l a s s ; import o r g . j u n i t . T e s t ; import o r g . r e s t l e t . C l i e n t ; import o r g . r e s t l e t . d a t a . S t a t u s ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . c l i e n t e . ClienteHTTPComAutenticacao ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . m i c r o f o r m a t o . M i c r o f o r m a t o ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . r e p r e s e n t a c o e s . R e p r e s e n t a c a o N u l a ; public c l a s s QuandoExisteOSeminrio extends InfraEstruturaDeEspecificao { p r i v a t e s t a t i c f i n a l S t r i n g TTULO_DO_SEMINRIO = "Um Seminrio " ;

132 p r i v a t e s t a t i c f i n a l S t r i n g NOME_PARA_URL_DO_SEMINRIO = " UmSeminario " ; p r i v a t e s t a t i c f i n a l S t r i n g NOME_DO_USURIO = " F u l a n o " ; p r i v a t e s t a t i c f i n a l S t r i n g SENHA_DO_USURIO = " t e s t e " ; p r i v a t e s t a t i c f i n a l S t r i n g CORREIO_ELETRNICO_DO_USURIO = " usuarioDoDisseminario@edugraf . ufsc . br " ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DO_PARTICIPANTE = obterURLBase ( ) + " / " + NOME_PARA_URL_DO_SEMINRIO + " / p a r t i c i p a n t e / " + CORREIO_ELETRNICO_DO_USURIO ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DO_SEMINRIO = obterURLBase ( ) + " / " + NOME_PARA_URL_DO_SEMINRIO ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DOS_PARTICIPANTES = URL_DO_SEMINRIO + " / p a r t i c i p a n t e s " ; public s t a t i c void considerandoQue ( ) { () ; existeUmSeminrio_de_nome_UmSeminario ( ) ; } public s t a t i c void caso ( ) { oUsurio_usuarioDoDisseminario_arroba_edugraf_ufsc_br_envieUma () ; }

existeOUsurio_usuarioDoDisseminario_arroba_edugraf_ufsc_br_de_

public void ento ( ) { () ; deNome_Fulano ( ) ; () ;

deveSerCriadoUmParticipanteEm_seminario_UmSeminario_participan

deEndereoDeCorreioEletrnico_usuarioDoDisseminario_arroba_edu

deveExistirUmEnlaceEm_seminario_UmSeminrio_deTexto_Participan () ; apontandoPara_seminrio_UmSeminrio_participantes () ;

133 deveExistirUmEnlaceEm_seminario_UmSeminario_participantes_deTe () ; () ; } @Test public void deveExistirUmEnlaceEm_seminario_UmSeminrio_deTexto_Participantes () { a s s e r t E q u a l s ( URL_DOS_PARTICIPANTES , o b t e r M i c r o f o r m a t o ( URL_DO_SEMINRIO , " p a r t i c i p a n t e s " ) . o b t e r E n l a c e P e l o A t r i b u t o C l a s s ( " e n l a c e " ) . obterURL ( ) ) ; } @Test public void apontandoPara_seminrio_UmSeminrio_participantes () { assertEquals ( " P a r t i c i p a n t e s " , obterMicroformato ( URL_DO_SEMINRIO , " p a r t i c i p a n t e s " ) . obterEnlacePeloAtributoClass ( " enlace " ) . obterTexto () ) ; } @Test public void () { a s s e r t E q u a l s ( CORREIO_ELETRNICO_DO_USURIO , obterMicroformatoDoParticipante () . obterValorDoAtributo ( " correioEletronico " ) ) ; } @Test p u b l i c v o i d deNome_Fulano ( ) { a s s e r t E q u a l s (NOME_DO_USURIO, obterMicroformatoDoParticipante () .

apontandoPara_seminrio_UmSeminrio_participante_usuarioDoDiss

deEndereoDeCorreioEletrnico_usuarioDoDisseminario_arroba_edugraf_

134 o b t e r V a l o r D o A t r i b u t o ( " nome " ) ) ; } @Test public void () { a s s e r t E q u a l s ( " Fulano " , obterMicroformato ( URL_DOS_PARTICIPANTES , " p a r t i c i p a n t e s " ) . obterEnlacePeloAtributoClass ( " participante " ) . obterTexto () ) ; } @Test public void () { a s s e r t E q u a l s ( URL_DO_PARTICIPANTE , o b t e r M i c r o f o r m a t o ( URL_DOS_PARTICIPANTES , " p a r t i c i p a n t e s " ) . obterEnlacePeloAtributoClass ( " participante " ) . obterURL ( ) ) ; } @BeforeClass public s t a t i c void p r e l i m i n a r e s ( ) { considerandoQue ( ) ; caso ( ) ; } public s t a t i c void () { C l i e n t c l i e n t e A u t e n t i c a d o = new ClienteHTTPComAutenticacao ( CORREIO_ELETRNICO_DO_USURIO , SENHA_DO_USURIO) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_CREATED , c l i e n t e A u t e n t i c a d o . p u t ( URL_DO_PARTICIPANTE , new RepresentacaoNula ( ) ) . getStatus ( ) ) ;

deveExistirUmEnlaceEm_seminario_UmSeminario_participantes_deTexto_F

apontandoPara_seminrio_UmSeminrio_participante_usuarioDoDissemina

oUsurio_usuarioDoDisseminario_arroba_edugraf_ufsc_br_envieUmaSolici

135 } public s t a t i c Microformato obterMicroformatoDeUmSeminrio ( ) { r e t u r n o b t e r M i c r o f o r m a t o ( URL_DO_SEMINRIO , " s e m i n a r i o "); } public s t a t i c Microformato obterMicroformatoDoParticipante ( ) { r e t u r n o b t e r M i c r o f o r m a t o ( URL_DO_PARTICIPANTE , " participante ") ; } @Test public void () { a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , c l i e n t e H T T P . g e t ( URL_DO_PARTICIPANTE ) . g e t S t a t u s ( ) ) ; } public s t a t i c void () { c r i a r U s u r i o ( CORREIO_ELETRNICO_DO_USURIO , NOME_DO_USURIO, SENHA_DO_USURIO) ; } public s t a t i c void existeUmSeminrio_de_nome_UmSeminario ( ) { c r i a r S e m i n r i o ( CORREIO_ELETRNICO_DO_USURIO , SENHA_DO_USURIO , NOME_PARA_URL_DO_SEMINRIO , TTULO_DO_SEMINRIO ) ; } }

deveSerCriadoUmParticipanteEm_seminario_UmSeminario_participante_us

existeOUsurio_usuarioDoDisseminario_arroba_edugraf_ufsc_br_de_nome_

Listagem A.20: Arquivo: QuandoExisteOCadastramento.java


package u s u r i o F i n a l i z a n d o C a d a s t r a m e n t o ;

136 import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t E q u a l s ; import i n f r a E s t r u t u r a . I n f r a E s t r u t u r a D e E s p e c i f i c a o ; import o r g . j u n i t . A f t e r C l a s s ; import o r g . j u n i t . B e f o r e C l a s s ; import o r g . j u n i t . T e s t ; import o r g . r e s t l e t . d a t a . Form ; import o r g . r e s t l e t . d a t a . R e s p o n s e ; import o r g . r e s t l e t . d a t a . S t a t u s ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . m i c r o f o r m a t o . M i c r o f o r m a t o ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . r e p r e s e n t a c o e s . RepresentacaoXHTML ; public c l a s s QuandoExisteOCadastramento extends InfraEstruturaDeEspecificao { public s t a t i c void considerandoQue ( ) () ; } public s t a t i c void caso ( ) { esteCadastramentoSejaFinalizado () ; } public void ento ( ) { () ; } @BeforeClass public s t a t i c void p r e l i m i n a r e s ( ) { considerandoQue ( ) ; caso ( ) ; } @Test {

existeOCadastramentoDeCorreioEletrnico_pablo_arroba_edugraf_u

deveSerCriadoOUsurio_de_correio_eletrnico_pablo_arroba_edugr

137 public void deveSerCriadoOUsurio_de_correio_eletrnico_pablo_arroba_edugraf_uf () { RepresentacaoXHTML try { r e p r e s e n t a o = new RepresentacaoXHTML ( obterParserDeDocumentos ( ) . parse ( c l i e n t e H T T P . g e t ( URL_DO_USURIO ) . g e t E n t i t y () . getText () ) ) ; } catch ( Exception e ) { e . printStackTrace () ; } Microformato m = r e p r e s e n t a o . obterMicroformato ( " usuario " ) ; a s s e r t E q u a l s ( CORREIO_ELETRNICO , m. obterValorDoAtributo ( " correioEletronico " ) ) ; a s s e r t E q u a l s (NOME, m. o b t e r V a l o r D o A t r i b u t o ( " nome " ) ) ; } @AfterClass public s t a t i c void limparCenrio ( ) { c l i e n t e H T T P A d m i n i s t r a d o r . d e l e t e ( URL_DO_USURIO ) ; c l i e n t e H T T P A d m i n i s t r a d o r . d e l e t e (URL_DE_CADASTRAMENTO) ; } private s t a t i c void () { Form c a d a s t r o = new Form ( ) ; c l i e n t e H T T P A d m i n i s t r a d o r . d e l e t e (URL_DE_CADASTRAMENTO) ; R e s p o n s e r = c l i e n t e H T T P . p u t (URL_DE_CADASTRAMENTO, cadastro . getWebRepresentation () ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_CREATED , r . g e t S t a t u s ( ) ) ; } private s t a t i c void e s t e C a d a s t r a m e n t o S e j a F i n a l i z a d o ( ) { representao = null ;

existeOCadastramentoDeCorreioEletrnico_pablo_arroba_edugraf_ufsc_b

138 CHAVE = o b t e r C h a v e D e C a d a s t r a m e n t o ( ) ; c l i e n t e H T T P . d e l e t e ( URL_DO_USURIO ) ; Form f o r m u l r i o = new Form ( ) ; f o r m u l r i o . add ( " nome " , NOME) ; f o r m u l r i o . add ( " s e n h a " , SENHA) ; f o r m u l r i o . add ( " c h a v e S e c r e t a " , CHAVE) ; c l i e n t e H T T P . p u t (URL_DE_CADASTRAMENTO, f o r m u l r i o . getWebRepresentation () ) ; } private s t a t i c S t r i n g obterChaveDeCadastramento ( ) { RepresentacaoXHTML try { r e p r e s e n t a o = new RepresentacaoXHTML ( obterParserDeDocumentos ( ) . parse ( clienteHTTPAdministrador . get ( URL_DE_CADASTRAMENTO) . g e t E n t i t y ( ) . g e t T e x t () ) ) ; } catch ( Exception e ) { e . printStackTrace () ; } Microformato m = r e p r e s e n t a o . obterMicroformato ( " cadastroTemporarioDeUsuario " ) ; r e t u r n m. o b t e r V a l o r D o A t r i b u t o ( " c h a v e S e c r e t a " ) ; } p r i v a t e s t a t i c f i n a l S t r i n g CORREIO_ELETRNICO = " pablo@edugraf . ufsc . br " ; p r i v a t e s t a t i c S t r i n g CHAVE = " c h a v e D e T e s t e " ; p r i v a t e s t a t i c f i n a l S t r i n g NOME = " F u l a n o " ; p r i v a t e s t a t i c f i n a l S t r i n g SENHA = " s e n h a " ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DE_CADASTRAMENTO = obterURLBase ( ) + " / c a d a s t r a m e n t o / " + CORREIO_ELETRNICO ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DO_USURIO = obterURLBase ( ) + " / u s u a r i o / " + CORREIO_ELETRNICO ; } representao = null ;

139

Listagem A.21: Arquivo: InfraEstruturaDeEspecicacao.java


package i n f r a E s t r u t u r a ; import j a v a . i o . F i l e ; import j a v a . i o . F i l e I n p u t S t r e a m ; import j a v a . i o . F i l e N o t F o u n d E x c e p t i o n ; import j a v a . i o . I O E x c e p t i o n ; import j a v a . u t i l . P r o p e r t i e s ; import o r g . custommonkey . x m l u n i t . HTMLDocumentBuilder ; import o r g . custommonkey . x m l u n i t . T o l e r a n t S a x D o c u m e n t B u i l d e r ; import o r g . custommonkey . x m l u n i t . XMLUnit ; import o r g . r e s t l e t . C l i e n t ; import o r g . r e s t l e t . d a t a . Form ; import o r g . r e s t l e t . d a t a . P r o t o c o l ; import o r g . r e s t l e t . d a t a . R e s p o n s e ; import o r g . w3c . dom . Document ; import o r g . xml . s a x . SAXException ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . c l i e n t e . C l i e n t e H T T P A d m i n i s t r a d o r ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . c l i e n t e . ClienteHTTPComAutenticacao ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . m i c r o f o r m a t o . M i c r o f o r m a t o ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . r e p r e s e n t a c o e s . RepresentacaoXHTML ; public class InfraEstruturaDeEspecificao { protected s t a t i c C l i e n t c l i e n t e H T T P = new

C l i e n t e H T T P N a o B l o q u e a n t e ( new C l i e n t ( P r o t o c o l . HTTP ) ) ; p r o t e c t e d s t a t i c C l i e n t c l i e n t e H T T P A d m i n i s t r a d o r = new C l i e n t e H T T P N a o B l o q u e a n t e ( new C l i e n t e H T T P A d m i n i s t r a d o r ( ) ) ; p r o t e c t e d s t a t i c HTMLDocumentBuilder c o n s t r u t o r D e D o c u m e n t o s ; public InfraEstruturaDeEspecificao ( ) { TolerantSaxDocumentBuilder tolerantSaxDocumentBuilder = null ; try {

140 t o l e r a n t S a x D o c u m e n t B u i l d e r = new T o l e r a n t S a x D o c u m e n t B u i l d e r ( XMLUnit . newTestParser ( ) ) ; } catch ( Exception e ) { e . printStackTrace () ; } c o n s t r u t o r D e D o c u m e n t o s = new HTMLDocumentBuilder ( tolerantSaxDocumentBuilder ) ; } p u b l i c s t a t i c HTMLDocumentBuilder o b t e r P a r s e r D e D o c u m e n t o s ( ) { TolerantSaxDocumentBuilder tolerantSaxDocumentBuilder = null ; try { t o l e r a n t S a x D o c u m e n t B u i l d e r = new T o l e r a n t S a x D o c u m e n t B u i l d e r ( XMLUnit . newTestParser ( ) ) ; } catch ( Exception e ) { e . printStackTrace () ; } r e t u r n new HTMLDocumentBuilder ( tolerantSaxDocumentBuilder ) ; } p u b l i c s t a t i c S t r i n g obterURLBase ( ) { P r o p e r t i e s p = new P r o p e r t i e s ( ) ; try { p . l o a d ( new F i l e I n p u t S t r e a m ( new F i l e ( " configuracoes / configuracoes . properties " ) ) ) ; } catch ( Exception e ) { e . printStackTrace () ; } return p . g e t P r o p e r t y ( " enderecoBaseDaAplicacao " ) ; } protected s t a t i c S t r i n g extrairCabealhoDeNome ( Response r , S t r i n g nome ) {

141 r e t u r n ( ( Form ) r . g e t A t t r i b u t e s ( ) . g e t ( " o r g . r e s t l e t . h t t p . h e a d e r s " ) ) . g e t V a l u e s ( nome ) ; } p r o t e c t e d P r o p e r t i e s c a r r e g a r C o n f i g u r a e s ( ) throws IOException , FileNotFoundException { P r o p e r t i e s p = new P r o p e r t i e s ( ) ; p . l o a d ( new F i l e I n p u t S t r e a m ( new F i l e ( " c o n f i g u r a c o e s / configuracoes . properties " ) ) ) ; return p ; } p r i v a t e s t a t i c S t r i n g o b t e r C h a v e D e C a d a s t r a m e n t o ( S t r i n g URL) { RepresentacaoXHTML try { r e p r e s e n t a o = new RepresentacaoXHTML ( obterParserDeDocumentos ( ) . parse ( c l i e n t e H T T P A d m i n i s t r a d o r . g e t (URL) . getEntity () . getText () ) ) ; } catch ( Exception e ) { e . printStackTrace () ; } Microformato m = r e p r e s e n t a o . obterMicroformato ( " cadastroTemporarioDeUsuario " ) ; r e t u r n m. o b t e r V a l o r D o A t r i b u t o ( " c h a v e S e c r e t a " ) ; } protected s t a t i c void c r i a r U s u r i o ( S t r i n g c o r r e i o E l e t r o n i c o , S t r i n g nome , S t r i n g s e n h a ) { S t r i n g URL_DE_CADASTRAMENTO = obterURLBase ( ) + " / cadastramento / " + correioEletronico ; S t r i n g URL_DO_USURIO = obterURLBase ( ) + " / u s u a r i o / " + correioEletronico ; Form c a d a s t r o = new Form ( ) ; c l i e n t e H T T P A d m i n i s t r a d o r . d e l e t e (URL_DE_CADASTRAMENTO) ; representao = null ;

142 c l i e n t e H T T P . p u t (URL_DE_CADASTRAMENTO, c a d a s t r o . getWebRepresentation () ) ; S t r i n g CHAVE_DO_PROPONENTE = o b t e r C h a v e D e C a d a s t r a m e n t o (URL_DE_CADASTRAMENTO) ; c l i e n t e H T T P A d m i n i s t r a d o r . d e l e t e ( URL_DO_USURIO ) ; Form f o r m u l r i o = new Form ( ) ; f o r m u l r i o . add ( " nome " , nome ) ; f o r m u l r i o . add ( " s e n h a " , s e n h a ) ; f o r m u l r i o . add ( " c h a v e S e c r e t a " , CHAVE_DO_PROPONENTE) ; c l i e n t e H T T P . p u t (URL_DE_CADASTRAMENTO, f o r m u l r i o . getWebRepresentation () ) ; } protected s t a t i c void c r i a r S e m i n r i o ( S t r i n g c o r r e i o E l e t r o n i c o , S t r i n g s e n h a , S t r i n g nomeParaURL , S t r i n g t t u l o ) { c l i e n t e H T T P A d m i n i s t r a d o r . d e l e t e ( obterURLBase ( ) + " / " + nomeParaURL ) ; Form p r o p o s t a = new Form ( ) ; p r o p o s t a . add ( " nomeParaURL " , nomeParaURL ) ; p r o p o s t a . add ( " t i t u l o " , t t u l o ) ; C l i e n t c l i e n t e A u t e n t i c a d o = new C l i e n t e H T T P N a o B l o q u e a n t e ( new ClienteHTTPComAutenticacao ( c o r r e i o E l e t r o n i c o , senha ) ) ; R e s p o n s e r = c l i e n t e A u t e n t i c a d o . p o s t ( obterURLBase ( ) + " / propostasDeSeminario " , proposta . getWebRepresentation () ) ; S t r i n g URL_DA_PROPOSTA_CRIADA = extrairCabealhoDeNome ( r , " Location " ) ; Form a t i v a c a o = new Form ( ) ; a t i v a c a o . add ( " a p r o v a d a " , " v e r d a d e i r o " ) ; c l i e n t e H T T P A d m i n i s t r a d o r . p u t ( URL_DA_PROPOSTA_CRIADA , ativacao . getWebRepresentation () ) ; }

143 p r o t e c t e d s t a t i c M i c r o f o r m a t o o b t e r M i c r o f o r m a t o ( S t r i n g URL, S t r i n g nomeDoMicroformato ) { RepresentacaoXHTML try { r e p r e s e n t a o = new RepresentacaoXHTML ( obterParserDeDocumentos ( ) . parse ( c l i e n t e H T T P A d m i n i s t r a d o r . g e t (URL) . getEntity () . getText () ) ) ; } catch ( Exception e ) { e . printStackTrace () ; } return r e p r e s e n t a o . obterMicroformato ( nomeDoMicroformato ) ; } p r o t e c t e d Document o b t e r R e p r e s e n t a o D o R e c u r s o ( S t r i n g e n d e r e o D o R e c u r s o ) throws SAXException , I O E x c e p t i o n { Response r e s p o s t a = clienteHTTP . g e t ( endereoDoRecurso ); String contedoDaRepresentao = () . getText () ; return construtorDeDocumentos . parse ( contedoDaRepresentao ) ; } } resposta . getEntity representao = null ;

Listagem A.22: Arquivo: ClienteHTTPNaoBloqueante.java


package i n f r a E s t r u t u r a ; import o r g . r e s t l e t . C l i e n t ; import o r g . r e s t l e t . d a t a . R e q u e s t ; import o r g . r e s t l e t . d a t a . R e s p o n s e ;

public c l a s s ClienteHTTPNaoBloqueante extends C l i e n t { private Client c l i e n t e ; public ClienteHTTPNaoBloqueante ( C l i e n t c ) {

144 super ( c . g e t P r o t o c o l s ( ) ) ; this . cliente = c ; } @Override public void handle ( Request r e q u e s t , Response r e s p o n s e ) { c l i e n t e . handle ( request , try { c l i e n t e . stop () ; } catch ( Exception e ) { e . printStackTrace () ; } } } response ) ;

Listagem A.23: Arquivo: QuandoCadastramentoENovo.java


package u s u r i o S e C a d a s t r a n d o ; import s t a t i c o r g . j u n i t . A s s e r t . a s s e r t E q u a l s ; import i n f r a E s t r u t u r a . I n f r a E s t r u t u r a D e E s p e c i f i c a o ; import o r g . j u n i t . A f t e r C l a s s ; import o r g . j u n i t . B e f o r e ; import o r g . j u n i t . T e s t ; import o r g . r e s t l e t . d a t a . Form ; import o r g . r e s t l e t . d a t a . R e s p o n s e ; import o r g . r e s t l e t . d a t a . S t a t u s ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . c l i e n t e . C l i e n t e H T T P A d m i n i s t r a d o r ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . m i c r o f o r m a t o . M i c r o f o r m a t o ; import b r . u f s c . e d u g r a f . d i s s e m i n a r i o . r e p r e s e n t a c o e s . RepresentacaoXHTML ; p u b l i c c l a s s QuandoCadastramentoNovo e x t e n d s InfraEstruturaDeEspecificao { public void considerandoQue ( ) {

145 noExisteUmUsurioDeCorreioEletrnico_pablo_arroba_edugraf_ufs () ; } public void caso ( ) { eleSeCadastreCom_CorreioEletrnico_pablo_arroba_edugraf_ufsc_b () ; } public void ento ( ) { () ; } @Test public void () { RepresentacaoXHTML try { r e p r e s e n t a o = new RepresentacaoXHTML ( obterParserDeDocumentos ( ) . parse ( clienteHTTPAdministrador . get ( URL_DE_CADASTRAMENTO) . g e t E n t i t y ( ) . g e t T e x t () ) ) ; } catch ( Exception e ) { e . printStackTrace () ; } Microformato m = r e p r e s e n t a o . obterMicroformato ( " cadastroTemporarioDeUsuario " ) ; a s s e r t E q u a l s ( CORREIO_ELETRNICO , m. obterValorDoAtributo ( " correioEletronico " ) ) ; } @Before public void p r e l i m i n a r e s ( ) { considerandoQue ( ) ; caso ( ) ; representao = null ;

deveSerCriadoUmCadastramentoCom_CorreioEletrnico_pablo_arroba

deveSerCriadoUmCadastramentoCom_CorreioEletrnico_pablo_arroba_edug

146 } @AfterClass public s t a t i c void limparCenrio ( ) { new C l i e n t e H T T P A d m i n i s t r a d o r ( ) . d e l e t e ( URL_DE_CADASTRAMENTO) ; } p u b l i c RepresentacaoXHTML o b t e r R e p r e s e n t a o ( ) { RepresentacaoXHTML r = n u l l ; try { r = new RepresentacaoXHTML ( construtorDeDocumentos . parse ( clienteHTTP . g e t (URL_DE_CADASTRAMENTO) . g e t E n t i t y ( ) . getText () ) ) ; } catch ( Exception e ) { e . printStackTrace () ; } return r ; } private void eleSeCadastreCom_CorreioEletrnico_pablo_arroba_edugraf_ufsc_br () { Form c a d a s t r o = new Form ( ) ; c a d a s t r o . add ( " c o r r e i o E l e t r o n i c o " , CORREIO_ELETRNICO ) ; R e s p o n s e r = c l i e n t e H T T P . p u t (URL_DE_CADASTRAMENTO, cadastro . getWebRepresentation () ) ; a s s e r t E q u a l s ( S t a t u s . SUCCESS_CREATED , r . g e t S t a t u s ( ) ) ; } public void noExisteUmUsurioDeCorreioEletrnico_pablo_arroba_edugraf_ufsc_br () { c l i e n t e H T T P A d m i n i s t r a d o r . d e l e t e ( URL_DE_USURIO ) ; R e s p o n s e r = c l i e n t e H T T P . g e t ( URL_DE_USURIO ) ;

147 a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_NOT_FOUND , r . getStatus () ) ; } / / TODO: t r o c a r p a r a t e s t e p r i v a t e s t a t i c f i n a l S t r i n g CORREIO_ELETRNICO = " pablo@edugraf . ufsc . br " ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DE_CADASTRAMENTO = obterURLBase ( ) + " / c a d a s t r a m e n t o / " + CORREIO_ELETRNICO ; p r i v a t e s t a t i c f i n a l S t r i n g URL_DE_USURIO = obterURLBase ( ) + " / u s u a r i o / " + CORREIO_ELETRNICO ; }

148

ANEXO B -- Cdigo-fonte dos Recursos

Listagem B.1: Arquivo: Data.inc.php


<? php c l a s s Data { private $data ; p u b l i c f u n c t i o n Data ( $ d a t a ) { $ t h i s > d a t a = $ d a t a ; } p r i v a t e f u n c t i o n estNoFormatoAmericano ( ) { r e t u r n e r e g ( " ( [ 0 9 ] { 4 } ) ( [ 0 9 ] { 1 , 2 } ) ( [ 0 9 ] { 1 , 2 }) " , $ t h i s > d a t a ) ; } private function estNoFormatoBrasileiro () { r e t u r n ereg ( " ([0 9]{1 ,2}) /([0 9]{1 ,2}) /([0 9]{4}) " , $ t h i s > d a t a ) ; } p u b l i c f u n c t i o n noFormatoAmericano ( ) { i f ( $ t h i s > e s t N o F o r m a t o B r a s i l e i r o ( ) ) r e t u r n implode ( "" , a r r a y _ r e v e r s e ( e x p l o d e ( " / " , $ t h i s > d a t a ) ) ) ; return } public function noFormatoBrasileiro () { i f ( $ t h i s >e s t N o F o r m a t o A m e r i c a n o ( ) ) $ t h i s > d a t a ;

149 r e t u r n implode ( " / " , a r r a y _ r e v e r s e ( e x p l o d e ( "" , $ t h i s > d a t a ) ) ) ; return } } ?> $ t h i s > d a t a ;

Listagem B.2: Arquivo: BasePropostaDeSeminario.php


<? php / T h i s c l a s s h a s b e e n a u t o g e n e r a t e d by t h e D o c t r i n e ORM Framework / a b s t r a c t c l a s s BasePropostaDeSeminario extends Doctrine_Record { public function setTableDefinition () { $ t h i s >s e t T a b l e N a m e ( p r o p o s t a s D e S e m i n a r i o s ) ; $ t h i s >hasColumn ( c o d i g o , i n t e g e r , n u l l , a r r a y ( t y p e => i n t e g e r , p r i m a r y => t r u e , a u t o i n c r e m e n t => t r u e ) ) ; $ t h i s >hasColumn ( nomeParaURL , s t r i n g , 2 5 0 , a r r a y ( t y p e => s t r i n g , n o t n u l l => t r u e , l e n g t h => 250 ) ) ; $ t h i s >hasColumn ( t i t u l o , s t r i n g , 2 5 0 , a r r a y ( t y p e => s t r i n g , n o t n u l l => t r u e , l e n g t h => 250 ) ) ; $ t h i s >hasColumn ( d e s c r i c a o , c l o b , n u l l , a r r a y ( t y p e => c l o b , n o t n u l l => t r u e ) ) ; $ t h i s >hasColumn ( i n s t r u c o e s , c l o b , n u l l , a r r a y ( t y p e => clob ) ) ; $ t h i s >hasColumn ( i n s c r i c a o , enum , n u l l , a r r a y ( t y p e => enum , n o t n u l l => a r r a y ( 0 => p u b l i c a , 1 => c o n v i d a d o s ) , d e f a u l t => c o n v i d a d o s ) ) ; $ t h i s >hasColumn ( a s s i s t e n c i a , enum , n u l l , a r r a y ( t y p e => enum , n o t n u l l => a r r a y ( 0 => p u b l i c a , 1 => p a r t i c i p a n t e s , 2 => s e m A s s i s t e n c i a ) , d e f a u l t => p a r t i c i p a n t e s ) ) ; $ t h i s >hasColumn ( d i s p o n i b i l i d a d e , enum , n u l l , a r r a y ( t y p e => enum , v a l u e s => a r r a y ( 0 => p u b l i c a , 1 => p a r t i c i p a n t e s ) , d e f a u l t => p a r t i c i p a n t e s ) ) ;

150 $ t h i s >hasColumn ( d a t a D e I n i c i o , d a t e , n u l l , a r r a y ( t y p e => d a t e , n o t n u l l => t r u e ) ) ; $ t h i s >hasColumn ( d a t a D e T e r m i n o , d a t e , n u l l , a r r a y ( t y p e => d a t e , n o t n u l l => t r u e ) ) ; $ t h i s >hasColumn ( ramalUFSC , s t r i n g , 4 , a r r a y ( t y p e => s t r i n g , n o t n u l l => t r u e , l e n g t h => 4 ) ) ; $ t h i s >hasColumn ( p r o p o n e n t e , i n t e g e r , n u l l , a r r a y ( t y p e => i n t e g e r , n o t n u l l => t r u e ) ) ; $ t h i s >hasColumn ( e s t a d o , enum , n u l l , a r r a y ( t y p e => enum , v a l u e s => a r r a y ( 0 => p e n d e n t e , 1 => a c e i t a , 2 => r e j e i t a d a ) , d e f a u l t => p e n d e n t e ) ) ; } p u b l i c f u n c t i o n setUp ( ) { $ t h i s >hasOne ( U s u a r i o a s P r o p o n e n t e , a r r a y ( l o c a l => proponente , f o r e i g n => c o d i g o , o n D e l e t e => CASCADE ) ) ; } }

Listagem B.3: Arquivo: BaseParticipante.php


<? php / T h i s c l a s s h a s b e e n a u t o g e n e r a t e d by t h e D o c t r i n e ORM Framework / a b s t r a c t c l a s s BaseParticipante extends Doctrine_Record { public function setTableDefinition () { $ t h i s >s e t T a b l e N a m e ( p a r t i c i p a n t e s ) ; $ t h i s >hasColumn ( c o d i g o , i n t e g e r , n u l l , a r r a y ( t y p e => i n t e g e r , p r i m a r y => t r u e , a u t o i n c r e m e n t => t r u e ) ) ;

151 $ t h i s >hasColumn ( s e m i n a r i o , i n t e g e r , n u l l , a r r a y ( t y p e => i n t e g e r , n o t n u l l => t r u e ) ) ; $ t h i s >hasColumn ( u s u a r i o , i n t e g e r , n u l l , a r r a y ( t y p e => i n t e g e r , n o t n u l l => t r u e ) ) ; } p u b l i c f u n c t i o n setUp ( ) { $ t h i s >hasOne ( U s u a r i o , a r r a y ( l o c a l => u s u a r i o , f o r e i g n => c o d i g o , o n D e l e t e => CASCADE ) ) ; $ t h i s >hasOne ( S e m i n a r i o , a r r a y ( l o c a l => s e m i n a r i o , f o r e i g n => c o d i g o , o n D e l e t e => CASCADE ) ) ; $ t h i s >hasMany ( A p r e s e n t a c a o , a r r a y ( l o c a l => c o d i g o , f o r e i g n => p a r t i c i p a n t e ) ); } }

Listagem B.4: Arquivo: BaseApresentacao.php


<? php / T h i s c l a s s h a s b e e n a u t o g e n e r a t e d by t h e D o c t r i n e ORM Framework / a b s t r a c t c l a s s BaseApresentacao extends Doctrine_Record { public function setTableDefinition () { $ t h i s >s e t T a b l e N a m e ( a p r e s e n t a c o e s ) ; $ t h i s >hasColumn ( c o d i g o , i n t e g e r , n u l l , a r r a y ( t y p e => i n t e g e r , p r i m a r y => t r u e , a u t o i n c r e m e n t => t r u e ) ) ; $ t h i s >hasColumn ( t i t u l o , s t r i n g , 1 5 0 , a r r a y ( t y p e => s t r i n g , u n i q u e => t r u e , n o t n u l l => t r u e , l e n g t h => 150 ) ) ;

152 $ t h i s >hasColumn ( t i t u l o P a r a U R L , s t r i n g , 1 5 0 , a r r a y ( t y p e => s t r i n g , u n i q u e => t r u e , n o t n u l l => t r u e , l e n g t h => 150 ) ) ; $ t h i s >hasColumn ( s e m i n a r i o , i n t e g e r , n u l l , a r r a y ( t y p e => i n t e g e r , n o t n u l l => t r u e ) ) ; $ t h i s >hasColumn ( p a r t i c i p a n t e , i n t e g e r , n u l l , a r r a y ( t y p e => i n t e g e r , n o t n u l l => t r u e ) ) ; $ t h i s >hasColumn ( nomeDoArquivo , s t r i n g , 1 0 0 , a r r a y ( t y p e => s t r i n g , n o t n u l l => t r u e , l e n g t h => 100 ) ) ; $ t h i s >hasColumn ( a r q u i v o , b l o b , n u l l , a r r a y ( t y p e => b l o b , n o t n u l l => t r u e ) ) ; $ t h i s >hasColumn ( d a t a , d a t e , n u l l , a r r a y ( t y p e => d a t e , n o t n u l l => t r u e ) ) ; $ t h i s >hasColumn ( h o r a , t i m e , n u l l , a r r a y ( t y p e => t i m e , n o t n u l l => t r u e ) ) ; } p u b l i c f u n c t i o n setUp ( ) { $ t h i s >hasOne ( P a r t i c i p a n t e , a r r a y ( l o c a l => p a r t i c i p a n t e , f o r e i g n => c o d i g o , o n D e l e t e => CASCADE ) ) ; $ t h i s >hasOne ( S e m i n a r i o , a r r a y ( l o c a l => s e m i n a r i o , f o r e i g n => c o d i g o , o n D e l e t e => CASCADE ) ) ; } }

Listagem B.5: Arquivo: BaseCadastramento.php


<? php / T h i s c l a s s h a s b e e n a u t o g e n e r a t e d by t h e D o c t r i n e ORM Framework / a b s t r a c t c l a s s BaseCadastramento extends Doctrine_Record { public function setTableDefinition ()

153 { $ t h i s >s e t T a b l e N a m e ( c a d a s t r a m e n t o s ) ; $ t h i s >hasColumn ( c o d i g o , i n t e g e r , n u l l , a r r a y ( t y p e => i n t e g e r , p r i m a r y => t r u e , a u t o i n c r e m e n t => t r u e ) ) ; $ t h i s >hasColumn ( c o r r e i o E l e t r o n i c o , s t r i n g , 1 5 0 , a r r a y ( t y p e => s t r i n g , n o t n u l l => t r u e , u n i q u e => t r u e , l e n g t h => 150 ) ) ; $ t h i s >hasColumn ( c h a v e S e c r e t a , s t r i n g , 4 0 , a r r a y ( t y p e => s t r i n g , n o t n u l l => t r u e , u n i q u e => t r u e , l e n g t h => 40 )); } }

Listagem B.6: Arquivo: BaseCadastrosTemporariosDeUsuarios.php


<? php / T h i s c l a s s h a s b e e n a u t o g e n e r a t e d by t h e D o c t r i n e ORM Framework / a b s t r a c t c l a s s BaseCadastrosTemporariosDeUsuarios extends Doctrine_Record { public function setTableDefinition () { $ t h i s >s e t T a b l e N a m e ( c a d a s t r o s T e m p o r a r i o s D e U s u a r i o s ) ; $ t h i s >hasColumn ( c o d i g o , i n t e g e r , n u l l , a r r a y ( t y p e => i n t e g e r , p r i m a r y => t r u e , a u t o i n c r e m e n t => t r u e ) ) ; $ t h i s >hasColumn ( c o r r e i o E l e t r o n i c o , s t r i n g , 1 5 0 , a r r a y ( t y p e => s t r i n g , n o t n u l l => t r u e , u n i q u e => t r u e , l e n g t h => 150 ) ) ; $ t h i s >hasColumn ( c h a v e S e c r e t a , s t r i n g , 4 0 , a r r a y ( t y p e => s t r i n g , n o t n u l l => t r u e , u n i q u e => t r u e , l e n g t h => 40 )); } }

154

Listagem B.7: Arquivo: BaseSeminario.php


<? php / T h i s c l a s s h a s b e e n a u t o g e n e r a t e d by t h e D o c t r i n e ORM Framework / a b s t r a c t c l a s s BaseSeminario extends Doctrine_Record { public function setTableDefinition () { $ t h i s >s e t T a b l e N a m e ( s e m i n a r i o s ) ; $ t h i s >hasColumn ( c o d i g o , i n t e g e r , n u l l , a r r a y ( t y p e => i n t e g e r , p r i m a r y => t r u e , a u t o i n c r e m e n t => t r u e ) ) ; $ t h i s >hasColumn ( nomeParaURL , s t r i n g , 2 5 0 , a r r a y ( t y p e => s t r i n g , n o t n u l l => t r u e , u n i q u e => t r u e , l e n g t h => 250 )) ; $ t h i s >hasColumn ( t i t u l o , s t r i n g , 2 5 0 , a r r a y ( t y p e => s t r i n g , n o t n u l l => t r u e , u n i q u e => t r u e , l e n g t h => 250 ) ) ; $ t h i s >hasColumn ( d e s c r i c a o , c l o b , n u l l , a r r a y ( t y p e => c l o b , n o t n u l l => t r u e ) ) ; $ t h i s >hasColumn ( i n s t r u c o e s , c l o b , n u l l , a r r a y ( t y p e => clob ) ) ; $ t h i s >hasColumn ( i n s c r i c a o , enum , n u l l , a r r a y ( t y p e => enum , n o t n u l l => a r r a y ( 0 => p u b l i c a , 1 => c o n v i d a d o s ) , d e f a u l t => c o n v i d a d o s ) ) ; $ t h i s >hasColumn ( a s s i s t e n c i a , enum , n u l l , a r r a y ( t y p e => enum , n o t n u l l => a r r a y ( 0 => p u b l i c a , 1 => p a r t i c i p a n t e s , 2 => s e m A s s i s t e n c i a ) , d e f a u l t => p a r t i c i p a n t e s ) ) ; $ t h i s >hasColumn ( d i s p o n i b i l i d a d e , enum , n u l l , a r r a y ( t y p e => enum , v a l u e s => a r r a y ( 0 => p u b l i c a , 1 => p a r t i c i p a n t e s ) , d e f a u l t => p a r t i c i p a n t e s ) ) ; $ t h i s >hasColumn ( d a t a D e I n i c i o , d a t e , n u l l , a r r a y ( t y p e => d a t e , n o t n u l l => t r u e ) ) ; $ t h i s >hasColumn ( d a t a D e T e r m i n o , d a t e , n u l l , a r r a y ( t y p e => d a t e , n o t n u l l => t r u e ) ) ; $ t h i s >hasColumn ( c o o r d e n a d o r , i n t e g e r , n u l l , a r r a y ( t y p e => i n t e g e r , n o t n u l l => t r u e ) ) ; }

155

p u b l i c f u n c t i o n setUp ( ) { $ t h i s >hasOne ( U s u a r i o a s C o o r d e n a d o r , a r r a y ( l o c a l => coordenador , f o r e i g n => codigo , o n D e l e t e => CASCADE ) ) ; $ t h i s >hasMany ( P a r t i c i p a n t e , a r r a y ( l o c a l => c o d i g o , f o r e i g n => s e m i n a r i o ) ) ; $ t h i s >hasMany ( A p r e s e n t a c a o , a r r a y ( l o c a l => c o d i g o , f o r e i g n => s e m i n a r i o ) ) ; } }

Listagem B.8: Arquivo: BaseUsuario.php


<? php / T h i s c l a s s h a s b e e n a u t o g e n e r a t e d by t h e D o c t r i n e ORM Framework / a b s t r a c t c l a s s BaseUsuario extends Doctrine_Record { public function setTableDefinition () { $ t h i s >s e t T a b l e N a m e ( u s u a r i o s ) ; $ t h i s >hasColumn ( c o d i g o , i n t e g e r , n u l l , a r r a y ( t y p e => i n t e g e r , p r i m a r y => t r u e , a u t o i n c r e m e n t => t r u e ) ) ; $ t h i s >hasColumn ( nome , s t r i n g , 2 5 5 , a r r a y ( t y p e => s t r i n g , n o t n u l l => t r u e , l e n g t h => 255 ) ) ; $ t h i s >hasColumn ( c o r r e i o E l e t r o n i c o , s t r i n g , 1 5 0 , a r r a y ( t y p e => s t r i n g , n o t n u l l => t r u e , u n i q u e => t r u e , l e n g t h => 150 ) ) ; $ t h i s >hasColumn ( s e n h a , s t r i n g , 4 1 , a r r a y ( t y p e => s t r i n g , n o t n u l l => t r u e , l e n g t h => 41 ) ) ;

156 $ t h i s >hasColumn ( ramalUFSC , s t r i n g , 4 , a r r a y ( t y p e => s t r i n g , l e n g t h => 4 ) ) ; $ t h i s >hasColumn ( p a p e l , enum , n u l l , a r r a y ( t y p e => enum , v a l u e s => a r r a y ( 0 => u s u a r i o , 1 => c o o r d e n a d o r , 2 => a d m i n i s t r a d o r ) , d e f a u l t => u s u a r i o ) ) ; } p u b l i c f u n c t i o n setUp ( ) { $ t h i s >hasMany ( P a r t i c i p a n t e , a r r a y ( l o c a l => c o d i g o , f o r e i g n => u s u a r i o ) ) ; $ t h i s >hasMany ( S e m i n a r i o , a r r a y ( l o c a l => c o d i g o , f o r e i g n => c o o r d e n a d o r ) ) ; $ t h i s >hasMany ( P r o p o s t a D e S e m i n a r i o , a r r a y ( l o c a l => c o d i g o , f o r e i g n => proponente ) ) ; } }

Listagem B.9: Arquivo: Apresentacoes.inc.php


<? php class Apresentacoes { p r i v a t e s t a t i c $nomeDaTabela = " A p r e s e n t a c a o " ; p u b l i c s t a t i c f u n c t i o n existeComSeminrioETtuloParaURL ( Seminario $seminrio , $ t t u l o ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " s e m i n a r i o = ? and t i t u l o P a r a U R L = ? " , a r r a y ( $ s e m i n r i o >c o d i g o , $ t t u l o ) )>c o u n t ( ) > 0 ; } public s t a t i c function obterPorSeminrioETtuloParaURL ( Seminario $seminrio , $ t t u l o ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " s e m i n a r i o = ? and

157 t i t u l o P a r a U R L = ? " , a r r a y ( $ s e m i n r i o >c o d i g o , $ t t u l o ) )>f e t c h O n e ( ) ; } public s t a t i c function obterPorSeminrio ( Seminario $seminrio ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " s e m i n a r i o = ? " , $ s e m i n r i o >c o d i g o )> e x e c u t e ( ) ; } p u b l i c s t a t i c f u n c t i o n existeComSeminrioETtuloParaURLENome ( S e m i n a r i o $ s e m i n r i o , $ t t u l o , $nomeDoArquivo ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " s e m i n a r i o = ? and t i t u l o P a r a U R L = ? and nomeDoArquivo = ? " , a r r a y ( $ s e m i n r i o >c o d i g o , $ t t u l o , $nomeDoArquivo ) )> count ( ) > 0 ; }

p u b l i c s t a t i c f u n c t i o n obterComSeminrioETtuloParaURLENome ( S e m i n a r i o $ s e m i n r i o , $ t t u l o , $nomeDoArquivo ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " s e m i n a r i o = ? and t i t u l o P a r a U R L = ? and nomeDoArquivo = ? " , a r r a y ( $ s e m i n r i o >c o d i g o , $ t t u l o , $nomeDoArquivo ) )> fetchOne ( ) ; } } ?>

Listagem B.10: Arquivo: Seminarios.inc.php


<? php class Seminarios { p r i v a t e s t a t i c $nomeDaTabela = " S e m i n a r i o " ;

158

public s t a t i c function obterTodos ( ) { r e t u r n D o c t r i n e : : g e t T a b l e ( s e l f : : $nomeDaTabela )> findAll () ; } p u b l i c s t a t i c f u n c t i o n removerTodos ( ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) > d e l e t e ( ) >from ( s e l f : : $nomeDaTabela )> e x e c u t e ( ) ; } p u b l i c s t a t i c f u n c t i o n existeComNomeParaURL ( $ n o m e P a r a U r l ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " nomeParaURL = ? " , $ n o m e P a r a U r l )> e x e c u t e ( ) >c o u n t ( ) > 0 ; } p u b l i c s t a t i c f u n c t i o n obterPorNomeParaURL ( $ n o m e P a r a U r l ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " nomeParaURL = ? " , $ n o m e P a r a U r l )>f e t c h O n e ( ) ; } p u b l i c s t a t i c f u n c t i o n obterURL ( ) { r e t u r n D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) ; } } ?>

Listagem B.11: Arquivo: Usuarios.inc.php


<? php c l a s s Usuarios extends BaseUsuario { p r i v a t e s t a t i c $nomeDaTabela = " U s u a r i o " ; p u b l i c s t a t i c f u n c t i o n s o C r e d e n c i a i s V l i d a s ( $ u s u r i o , $senha , array $ p a p i s ) {

159 $ c o n s u l t a = D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " c o r r e i o E l e t r o n i c o =? and s e n h a =? " , a r r a y ( $ u s u r i o , s h a 1 ( $ s e n h a ) ) )> e x e c u t e () ; i f ( $ c o n s u l t a >c o u n t ( ) > 0 ) { $ u s u r i o = $ c o n s u l t a > g e t ( 0 ) ; r e t u r n $ u s u r i o >UmDos ( $ p a p i s ) ; } return false ; } public s t a t i c function obterTodos ( ) { r e t u r n D o c t r i n e : : g e t T a b l e ( s e l f : : $nomeDaTabela )> findAll () ; } public s t a t i c function obterPorPapel ( $papel ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " p a p e l =? " , $ p a p e l )> e x e c u t e () ; } public s t a t i c function obterPorCorreioEletronico ( $correioEletronico ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " c o r r e i o E l e t r o n i c o =? " , $ c o r r e i o E l e t r o n i c o )>f e t c h O n e ( ) ; } public s t a t i c function existeComEsteCorreioEletronico ( $correioEletronico ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " c o r r e i o E l e t r o n i c o =? " , $ c o r r e i o E l e t r o n i c o )> e x e c u t e ( ) >c o u n t ( ) > 0 ; } p u b l i c s t a t i c f u n c t i o n obterURL ( ) {

160 r e t u r n D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / usuarios " ; } } ?>

Listagem B.12: Arquivo: Apresentacao.inc.php


<? php c l a s s Apresentacao extends BaseApresentacao { p u b l i c f u n c t i o n obterURL ( ) { r e t u r n $ t h i s >S e m i n a r i o >obterURL ( ) . " / a p r e s e n t a c a o / " . $ t h i s > t i t u l o P a r a U R L ; } p u b l i c f u n c t i o n obterURLDoArquivo ( ) { r e t u r n $ t h i s >obterURL ( ) . " / " . $ t h i s >nomeDoArquivo ; } p u b l i c f u n c t i o n obterTamanhoDoArquivo ( ) { r e t u r n s t r l e n ( $ t h i s > a r q u i v o ) ; } p u b l i c f u n c t i o n obterMimeTypeDoArquivo ( ) { r e t u r n MimeTypes : : o b t e r D o A r q u i v o ( $ t h i s >nomeDoArquivo ); } public function obterURLDoParticipante ( ) { r e t u r n $ t h i s >S e m i n a r i o >obterURL ( ) . " / p a r t i c i p a n t e / " . $ t h i s > P a r t i c i p a n t e >U s u a r i o > c o r r e i o E l e t r o n i c o ; } public function preInsert () { $ t h i s > d a t a = d a t e ( c ) ; $ t h i s >h o r a = d a t e ( H : i : s ) ; } }

161 ?>

Listagem B.13: Arquivo: PropostaDeSeminario.inc.php


<? php c l a s s PropostaDeSeminario extends BasePropostaDeSeminario { / / TODO: e x t r a i r p a r a r e c u r s o . . p u b l i c f u n c t i o n obterURL ( ) { r e t u r n D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / p r o p o s t a D e S e m i n a r i o / " . $ t h i s >c o d i g o . " ? autenticar =verdadeiro " ; } } ?>

Listagem B.14: Arquivo: Cadastramento.inc.php


<? php c l a s s Cadastramento extends BaseCadastramento p u b l i c f u n c t i o n obterURL ( ) { r e t u r n D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / c a d a s t r a m e n t o / " . $ t h i s > c o r r e i o E l e t r o n i c o ; } public f u n c t i o n obterURLDeFinalizao ( ) { r e t u r n D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / c a d a s t r a m e n t o / f i n a l i z a c a o / " . $ t h i s > c h a v e S e c r e t a ; } } ?> {

Listagem B.15: Arquivo: Usuario.inc.php


<? php c l a s s Usuario extends BaseUsuario { p r i v a t e s t a t i c $ p a p i s = array ( " a d m i n i s t r a d o r " , " c o o r d e n a d o r " , " usuario " ) ; public function obterPapelBsico () {

162 r e t u r n s e l f : : $ p a p i s [ s i z e o f ( s e l f : : $ p a p i s ) 1]; } p u b l i c f u n c t i o n UmDos ( $ p a p i s ) { f o r e a c h ( $ p a p i s a s $umPapel ) { i f ( $ t h i s >Um( $umPapel ) ) r e t u r n t r u e ; } return false ; } p u b l i c f u n c t i o n Um( $ p a p e l ) { r e t u r n ( $ p a p e l == $ t h i s > p a p e l ) || a r r a y _ s e a r c h ( $ t h i s >p a p e l , s e l f : : $ p a p i s ) <= array_search ( $papel , s e l f : : $papis ) ; } p u b l i c f u n c t i o n Coordenador ( ) { r e t u r n $ t h i s > p a p e l == c o o r d e n a d o r ; } p u b l i c f u n c t i o n CoordenadorDe ( Seminario $ s e m i n r i o ) { r e t u r n $ s e m i n r i o >C o o r d e n a d o r >c o d i g o == $ t h i s > c o d i g o ; / / TODO: r e v e r } p u b l i c f u n c t i o n obterURL ( ) { r e t u r n D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / u s u a r i o / " . $ t h i s > c o r r e i o E l e t r o n i c o ; } p u b l i c f u n c t i o n obterURLDeCoordenador ( ) { r e t u r n D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / c o o r d e n a d o r / " . $ t h i s > c o r r e i o E l e t r o n i c o ; } p u b l i c f u n c t i o n obterURLDeAdministrador ( ) { r e t u r n D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / a d m i n i s t r a d o r / " . $ t h i s > c o r r e i o E l e t r o n i c o ;

163 } } ?>

Listagem B.16: Arquivo: Participante.inc.php


<? php class P a r t i c i p a n t e extends BaseParticipante { p u b l i c f u n c t i o n obterURL ( ) { r e t u r n $ t h i s >S e m i n a r i o >obterURL ( ) . " / p a r t i c i p a n t e / " . $ t h i s >U s u a r i o > c o r r e i o E l e t r o n i c o ; } p u b l i c f u n c t i o n obterNome ( ) { r e t u r n $ t h i s >U s u a r i o >nome ; } } ?>

Listagem B.17: Arquivo: Cadastramentos.inc.php


<? php c l a s s Cadastramentos {

p r i v a t e s t a t i c $nomeDaTabela = " C a d a s t r a m e n t o " ; p u b l i c s t a t i c f u n c t i o n o b t e r P e l a C h a v e S e c r e t a ( $chave ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " c h a v e S e c r e t a =? " , $ c h a v e )> fetchOne ( ) ; } public s t a t i c function obterPeloCorreioEletronico ( $correioEletronico ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " c o r r e i o E l e t r o n i c o =? " , $ c o r r e i o E l e t r o n i c o )>f e t c h O n e ( ) ; }

164 public s t a t i c function existeComEsteCorreioEletronico ( $correioEletronico ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " c o r r e i o E l e t r o n i c o =? " , $ c o r r e i o E l e t r o n i c o )> e x e c u t e ( ) >c o u n t ( ) > 0 ; } p u b l i c s t a t i c f u n c t i o n existeComEstaChaveSecreta ( $chave ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " c h a v e S e c r e t a =? " , $ c h a v e )> e x e c u t e ( ) >c o u n t ( ) > 0 ; } p u b l i c s t a t i c f u n c t i o n removerTodos ( ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) > d e l e t e ( ) >from ( s e l f : : $nomeDaTabela )> e x e c u t e ( ) ; } } ?>

Listagem B.18: Arquivo: Seminario.php


<? php c l a s s Seminario extends BaseSeminario { p u b l i c f u n c t i o n obterURL ( ) { r e t u r n D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / " . $ t h i s >nomeParaURL ; } public function obterURLDeParticipantes () { r e t u r n $ t h i s >obterURL ( ) . " / p a r t i c i p a n t e s " ; } p u b l i c f u n c t i o n obterURLDeApresentaes ( ) { r e t u r n $ t h i s >obterURL ( ) . " / a p r e s e n t a c o e s " ; } public function P a r t i c i p a n t e ( Usuario $usurio ) {

165 return P a r t i c i p a n t e s : : e x i s t e ( $usurio , $ t hi s ) ; } } ?>

Listagem B.19: Arquivo: Participantes.inc.php


<? php class Participantes { p r i v a t e s t a t i c $nomeDaTabela = " P a r t i c i p a n t e " ; public s t a t i c function e x i s t e ( Usuario $usurio , Seminario $seminrio ) { $ c o n s u l t a = D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " u s u a r i o =? and s e m i n a r i o =? " , a r r a y ( $ u s u r i o >c o d i g o , $ s e m i n r i o >c o d i g o ) ) ; r e t u r n $ c o n s u l t a >c o u n t ( ) > 0 ; } public s t a t i c function obterPorSeminrio ( Seminario $seminrio ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " s e m i n a r i o =? " , $ s e m i n r i o > c o d i g o )> e x e c u t e ( ) ; } public s t a t i c function obterPorUsurioESeminrio ( Usuario $usurio , Seminario $seminrio ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " u s u a r i o =? and s e m i n a r i o =? " , a r r a y ( $ u s u r i o >c o d i g o , $ s e m i n r i o >c o d i g o ) )> fetchOne ( ) ; } } ?>

Listagem B.20: Arquivo: PropostasDeSeminarios.inc.php


<? php class PropostasDeSeminarios {

166 p r i v a t e s t a t i c $nomeDaTabela = " P r o p o s t a D e S e m i n a r i o " ; public s t a t i c f u n c t i o n existeAProposta ( $codigo ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " c o d i g o = ? " , $ c o d i g o )> e x e c u t e ( ) >c o u n t ( ) > 0 ; } public s t a t i c f u n c t i o n obterPorCdigo ( $codigo ) { r e t u r n D o c t r i n e _ Q u e r y : : c r e a t e ( ) >from ( s e l f : : $nomeDaTabela )>where ( " c o d i g o = ? " , $ c o d i g o )> fetchOne ( ) ; } public s t a t i c function obterTodas ( ) { r e t u r n D o c t r i n e : : g e t T a b l e ( s e l f : : $nomeDaTabela )> findAll () ; } p u b l i c s t a t i c f u n c t i o n obterURL ( ) { r e t u r n D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / propostasDeSeminario " ; } } ?>

Listagem B.21: Arquivo: MensagemDeConrmacaoDeCadastramento.inc.php


<? php c l a s s MensagemDeConfirmacaoDeCadastramento e x t e n d s MensagemDeCorreioEletronicoAbstrata private $cadastramento ; p u b l i c f u n c t i o n MensagemDeConfirmacaoDeCadastramento ( Cadastramento $cadastramento ) { $ t h i s > c a d a s t r a m e n t o = $ c a d a s t r a m e n t o ; parent : : MensagemDeCorreioEletronicoAbstrata ( ) ; } {

167

public function obterContedo ( ) { r e t u r n s p r i n t f ( " Caro ( a ) %s , P a r a f i n a l i z a r s e u c a d a s t r a m e n t o a c e s s e : %s " , $ t h i s > c a d a s t r a m e n t o > c o r r e i o E l e t r o n i c o , $ t h i s > c a d a s t r a m e n t o >o b t e r U R L D e F i n a l i z a o ( ) ) . " Se v o c no s o l i c i t o u o e n v i o d e s t a mensagem , p o r f a v o r d e s c o n s i d e r e a mesma . " ; } public function obterAssunto () { r e t u r n " C a d a s t r a m e n t o no D i s s e m i n r i o " ; } public function obterDestinatrio () { r e t u r n $ t h i s > c a d a s t r a m e n t o > c o r r e i o E l e t r o n i c o ; } } ?>

Listagem B.22: Arquivo: MensagemHTML.inc.php


<? php c l a s s MensagemHTML i m p l e m e n t s M e n s a g e m D e C o r r e i o E l e t r o n i c o p r i v a t e $msg ; p u b l i c f u n c t i o n MensagemHTML ( M e n s a g e m D e C o r r e i o E l e t r o n i c o $mensagem ) { $ t h i s >msg = $mensagem ; } public function obterContedo ( ) { r e t u r n " < html > <body > " . $ t h i s > t x t 2 h t m l ( $ t h i s >msg> o b t e r C o n t e d o ( ) . " \ n \ n " . $ t h i s >o b t e r R o d a p ( ) ) . " </ body > </ html > " ; } {

168

public function obterAssunto () { r e t u r n $ t h i s >msg> o b t e r A s s u n t o ( ) ; } public f u n c t i o n obterRodap ( ) { r e t u r n $ t h i s >msg>o b t e r R o d a p ( ) ; } public function obterDestinatrio () { r e t u r n $ t h i s >msg> o b t e r D e s t i n a t r i o ( ) ; } private function txt2html ( $txt ) { $ t x t = s t r _ r e p l a c e ( " \ t " , &n b s p ; &n b s p ; , $ t x t ) ; while ( ! ( strpos ( $txt , str_replace ( ) === FALSE ) ) $ t x t = , &n b s p ; , $ t x t ) ;

$ t x t = h t m l e n t i t i e s ( $ t x t , ENT_COMPAT, "UTF8" ) ; $ t x t = s t r _ r e p l a c e ( &amp ; , & , $ t x t ) ; $ t x t = preg_replace ( " / ( h t t p \ \ : \ \ / \ \ / . ? ) ( \ \ s | $ ) / " , "< a h r e f = \ " $1 \ " > $1 < / a >$2 " , $ t x t ) ; r e t u r n nl2br ( $ t x t ) ; } } ?>

Listagem B.23: Arquivo: MensagemDeCorreioEletronicoAbstrata.inc.php


<? php a b s t r a c t c l a s s MensagemDeCorreioEletronicoAbstrata implements MensagemDeCorreioEletronico { protected function MensagemDeCorreioEletronicoAbstrata ( ) { new M e n s a g e i r o ( $ t h i s ) ; } public f u n c t i o n obterRodap ( ) { return " Disseminrio " ; }

169 // // // } ?> public a b s t r a c t f u n c t i o n obterContedo ( ) ; public abstract function obterAssunto () ; public abstract function obterDestinatrio () ;

Listagem B.24: Arquivo: MensagemDeSeminarioCriado.inc.php


<? php c l a s s MensagemDeSeminarioCriado e x t e n d s MensagemDeCorreioEletronicoAbstrata private $seminrio ; p u b l i c f u n c t i o n MensagemDeSeminarioCriado ( Seminario $seminrio ) { $ t h i s > s e m i n r i o = $ s e m i n r i o ; parent : : MensagemDeCorreioEletronicoAbstrata ( ) ; } public function obterContedo ( ) { r e t u r n "O s e m i n r i o " . $ t h i s >s e m i n r i o > t i t u l o . " f o i c r i a d o em : " . $ t h i s >s e m i n r i o >obterURL ( ) ; } public function obterAssunto () { r e t u r n " Seminrio Criado " ; } public function obterDestinatrio () { r e t u r n $ t h i s >s e m i n r i o >C o o r d e n a d o r > correioEletronico ; } } ?> {

Listagem B.25: Arquivo: MensagemDeCorreioEletronico.inc.php


<? php i n t e r f a c e MensagemDeCorreioEletronico { public function obterContedo ( ) ;

170 public function obterAssunto () ; public function obterDestinatrio () ; public f u n c t i o n obterRodap ( ) ; } ?>

Listagem B.26: Arquivo: MensagemDePropostaCriada.inc.php


<? php c l a s s MensagemDePropostaCriada e x t e n d s MensagemDeCorreioEletronicoAbstrata private $proposta ; p u b l i c f u n c t i o n MensagemDePropostaCriada ( PropostaDeSeminario $proposta ) { $ t h i s > p r o p o s t a = $ p r o p o s t a ; parent : : MensagemDeCorreioEletronicoAbstrata ( ) ; } public function obterContedo ( ) { r e t u r n " Caro a d m i n i s t r a d o r , O u s u r i o " . $ t h i s > p r o p o s t a >P r o p o n e n t e >nome . " ( " . $ t h i s > p r o p o s t a > P r o p o n e n t e > c o r r e i o E l e t r o n i c o . " ) c r i o u uma p r o p o s t a de s e m i n r i o , acesse la . " ; } public function obterAssunto () { r e t u r n " P r o p o s t a de S e m i n r i o " ; } / / TODO: e x t r a i r p a r a c o n f i g u r a o / / TODO: mandar p a r a t o d o s . public function obterDestinatrio () { $adm = U s u a r i o s : : o b t e r P o r P a p e l ( " a d m i n i s t r a d o r " ) ; $u = $adm [ 0 ] ; r e t u r n $u> c o r r e i o E l e t r o n i c o ; } } ?> " . $ t h i s > p r o p o s t a >obterURL ( ) . " p a r a c o n f i r m l a ou r e j e i t {

171

Listagem B.27: Arquivo: MensagemDeContaCriada.inc.php


<? php c l a s s MensagemDeContaCriada e x t e n d s MensagemDeCorreioEletronicoAbstrata { private $usurio ; p r i v a t e $senha ; p u b l i c f u n c t i o n MensagemDeContaCriada ( U s u a r i o $ u s u r i o , $senha ) { $ t h i s > u s u r i o = $ u s u r i o ; $ t h i s >s e n h a = $ s e n h a ; parent : : MensagemDeCorreioEletronicoAbstrata ( ) ; } public function obterContedo ( ) { r e t u r n s p r i n t f ( " Caro ( a ) %s , Voc a c a b a de c r i a r s u a c o n t a no D i s s e m i n r i o , s e u s d a d o s de a c e s s o s o : U s u r i o : %s Senha : %s ", $ t h i s > u s u r i o > c o r r e i o E l e t r o n i c o , $ t h i s > u s u r i o > c o r r e i o E l e t r o n i c o , $ t h i s >s e n h a ) ; } public function obterAssunto () { r e t u r n " Conta c r i a d a " ; } public function obterDestinatrio () { r e t u r n $ t h i s > u s u r i o > c o r r e i o E l e t r o n i c o ; } } ?>

172

Listagem B.28: Arquivo: MimeTypes.inc.php


<? php c l a s s MimeTypes { c o n s t CARACTERES_DA_EXTENSO = 3 ; / / TODO: c o m p l e m e n t a r quando h o u v e r n e c e s s i d a d e p r i v a t e s t a t i c $mimeTypes = a r r a y ( " p d f " => " a p p l i c a t i o n / p d f " , " doc " => " a p p l i c a t i o n / msword " , " p p s " => " a p p l i c a t i o n / vnd . msp o w e r p o i n t " , " p p t " => " a p p l i c a t i o n / vnd . msp o w e r p o i n t " , " r t f " => " a p p l i c a t i o n / r t f " , " odp " => " a p p l i c a t i o n / vnd . o a s i s . o p e n d o c u m e n t . p r e s e n t a t i o n " , " o d t " => " a p p l i c a t i o n / vnd . o a s i s . o p e n d o c u m e n t . t e x t " , " t x t " => " t e x t / p l a i n " ) ; p u b l i c s t a t i c f u n c t i o n o b t e r D o A r q u i v o ( $nomeDoArquivo ) { r e t u r n s e l f : : $mimeTypes [ s e l f : : o b t e r E x t e n s o ( $nomeDoArquivo ) ] ; } p r i v a t e s t a t i c f u n c t i o n o b t e r E x t e n s o ( $nomeDoArquivo ) { r e t u r n s u b s t r ( $nomeDoArquivo , s t r l e n ( $nomeDoArquivo ) s e l f : : CARACTERES_DA_EXTENSO) ; } } ?>

Listagem B.29: Arquivo: Disseminario.inc.php


<? php class Disseminario { public s t a t i c f u n c t i o n obterURL_BaseRelativa ( ) { r e t u r n URL_BASE ; } p u b l i c s t a t i c f u n c t i o n obterURL_BaseCompleta ( ) { r e t u r n " h t t p : / / " . $_SERVER [ "SERVER_NAME" ] . URL_BASE ; }

173 } ?>

Listagem B.30: Arquivo: RecursoUmaPropostaDeSeminario.inc.php


<? php c l a s s RecursoUmaPropostaDeSeminario extends Recurso { / @AutenticacaoBasica (" administrador ") / p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { i f (! PropostasDeSeminarios : : existeAProposta ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( c o d i g o ) ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e n o t f o u n d ) ; include_once r e p r e s e n t a c o e s / 4 0 4 . html ; die ( ) ; } $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " P r o p o s t a de S e m i n r i o " ) ; $proposta = PropostasDeSeminarios : : obterPorCdigo ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( c o d i g o ) ) ; $ t e m p l a t e > a s s i g n ( " p r o p o s t a " , $ p r o p o s t a ) ; $usurio = Usuarios : : obterPorCorreioEletronico ( $ r e q u i s i o >o b t e r N o m e D e U s u r i o ( ) ) ; $ t e m p l a t e > a s s i g n ( " URL_paraSubmisso " , $ p r o p o s t a > obterURL ( ) ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / P r o p o s t a D e S e m i n a r i o C o m F o r m u l a r i o . t p l . php " ) ; } / @AutenticacaoBasica (" administrador ") / p u b l i c f u n c t i o n PUT ( R e q u i s i c a o $ r e q u i s i o ) { $ c o d i g o D a P r o p o s t a = $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( codigo ) ;

174 i f (! PropostasDeSeminarios : : existeAProposta ( $codigoDaProposta ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e n o t f o u n d ) ; include_once r e p r e s e n t a c o e s / 4 0 4 . html ; die ( ) ; } $ d a d o s D o F o r m u l r i o = $ r e q u i s i o > obterDadosDoFormulrio ( ) ; i f ( $ d a d o s D o F o r m u l r i o [ a p r o v a d a ] == " v e r d a d e i r o " ) { $ tr a n sa o = Doctrine_Manager : : connection ( ) ; $ t r a n s a o > b e g i n T r a n s a c t i o n ( ) ; $proposta = PropostasDeSeminarios : : obterPorCdigo ( $codigoDaProposta ) ; $ s e m i n a r i o = new S e m i n a r i o ( ) ; $ s e m i n a r i o >merge ( $ p r o p o s t a > t o A r r a y ( ) ) ; $ s e m i n a r i o >c o d i g o = 0 ; $ s e m i n a r i o >C o o r d e n a d o r = $ p r o p o s t a > Proponente ; i f ( $ p r o p o s t a > e s t a d o == " a p r o v a d a " ) { header ( HTTP / 1 . 1 403 F o r b i d d e n ) ; $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $requisio ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " E r r o : P r o p o s t a de s e m i n r i o j f o i a c e i t a " ) ; $ t e m p l a t e > a s s i g n ( " mensagem " , " E s t a p r o p o s t a de s e m i n r i o j f o i a c e i t a " ) ; $ e n l a c e s [ ] = new E n l a c e ( S e m i n a r i o s : : obterURL ( ) , " Clique aqui para i r para a pgina inicial ") ; $ e n l a c e s [ ] = new E n l a c e ( P r o p o s t a s D e S e m i n a r i o s : : obterURL ( ) , " C l i q u e a q u i p a r a i r p a r a a c e s s a r todas as propostas " ) ; $ t e m p l a t e > a s s i g n ( " e n l a c e s " , $ e n l a c e s ) ; $ t e m p l a t e > a s s i g n ( " naoMostrarEtiquetaDeAutenticacao " , true ) ;

175 $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / Mensagem . t p l . php " ) ; die ( ) ; } i f ( $ s e m i n a r i o >C o o r d e n a d o r > p a p e l ! = " administrador " ) $ s e m i n a r i o >C o o r d e n a d o r > p a p e l = " coordenador " ; $ s e m i n a r i o >C o o r d e n a d o r >ramalUFSC = $ p r o p o s t a >ramalUFSC ; try { $ s e m i n a r i o >s a v e ( ) ; $p = new P a r t i c i p a n t e ( ) ; $p>U s u a r i o = $ s e m i n a r i o > Coordenador ; $p>S e m i n a r i o = $ s e m i n a r i o ; $p>s a v e ( ) ; $ p r o p o s t a > e s t a d o = " a p r o v a d a "; $ p r o p o s t a >s a v e ( ) ; new M e n s a g e m D e S e m i n a r i o C r i a d o ( $seminario ) ; $ t r a n s a o >commit ( ) ; } c a t c h ( E x c e p t i o n $e ) { $ t r a n s a o > r o l l b a c k ( ) ; header ( HTTP / 1 . 1 500 I n t e r n a l S e r v e r Error ) ; echo $e>g e t M e s s a g e ( ) ; die ( ) ; } header ( HTTP / 1 . 1 201 C r e a t e d ) ; $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $requisio ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " P r o p o s t a de Seminrio Aceita " ) ;

176 $ t e m p l a t e > a s s i g n ( " mensagem " , "Uma mensagem f o i e n v i a d a p a r a o p r o p o n e n t e a v i s a n d o que voc a c e i t o u sua p r o p o s t a " ) ; $ e n l a c e s [ ] = new E n l a c e ( S e m i n a r i o s : : obterURL ( ) , " Clique aqui para i r para a pgina inicial ") ; $ e n l a c e s [ ] = new E n l a c e ( P r o p o s t a s D e S e m i n a r i o s : : obterURL ( ) , " C l i q u e a q u i p a r a i r p a r a a c e s s a r todas as propostas " ) ; $ e n l a c e s [ ] = new E n l a c e ( $ s e m i n a r i o >obterURL ( ) , " Clique aqui para i r para v i s i t a r o seminrio criado " ) ; $ t e m p l a t e > a s s i g n ( " e n l a c e s " , $ e n l a c e s ) ; $ t e m p l a t e > a s s i g n ( " naoMostrarEtiquetaDeAutenticacao " , true ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / Mensagem . t p l . php " ) ; die ( ) ; } } p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( O p t i o n s : HEAD, GET ) ; } p u b l i c f u n c t i o n DELETE ( R e q u i s i c a o $ r e q u i s i o ) { $proposta = PropostasDeSeminarios : : obterPorNomeParaURL ( $ r e q u i s i o > o b t e r V a r i v e l D a U R L ( nomeParaURL ) ) ; $ p r o p o s t a > d e l e t e ( ) ; header ( HTTP / 1 . 1 200 Ok ) ; } p u b l i c f u n c t i o n HEAD( R e q u i s i c a o $ r e q u i s i o ) { header ( HTTP / 1 . 1 200 OK ) ; } } ?>

177

Listagem B.31: Arquivo: RecursoPropostasDeSeminario.inc.php


<? php c l a s s RecursoPropostasDeSeminario extends Recurso { / @AutenticacaoBasica / p u b l i c f u n c t i o n POST ( R e q u i s i c a o $ r e q u i s i o ) { $ p r o p o s t a = new P r o p o s t a D e S e m i n a r i o ( ) ; $ d a d o s D o F o r m u l r i o = $ r e q u i s i o > obterDadosDoFormulrio ( ) ; $ p r o p o s t a >merge ( $ d a d o s D o F o r m u l r i o ) ; $ d a t a D e I n i c i o = new D a t a ( $ d a d o s D o F o r m u l r i o [ " dataDeInicio " ]) ; $ p r o p o s t a > d a t a D e I n i c i o = $ d a t a D e I n i c i o > noFormatoAmericano ( ) ; $ d a t a D e T e r m i n o = new D a t a ( $ d a d o s D o F o r m u l r i o [ " dataDeTermino " ] ) ; $ p r o p o s t a >d a t a D e T e r m i n o = $ d a t a D e T e r m i n o > noFormatoAmericano ( ) ; $ p r o p o s t a > p r o p o n e n t e = U s u a r i o s : : o b t e r P o r C o r r e i o E l e t r o n i c o ( $ r e q u i s i o > obterNomeDeUsurio ( ) ) ; $ tr a n sa o = Doctrine_Manager : : connection ( ) ; $ t r a n s a o > b e g i n T r a n s a c t i o n ( ) ; try { $ p r o p o s t a >s a v e ( ) ; $ t r a n s a o >commit ( ) ; new M e n s a g e m D e P r o p o s t a C r i a d a ( $ p r o p o s t a ) ; } c a t c h ( E x c e p t i o n $e ) { $ t r a n s a o > r o l l b a c k ( ) ;

178 header ( HTTP / 1 . 1 500 I n t e r n a l S e r v e r E r r o r ) ; echo $e>g e t M e s s a g e ( ) ; die ( ) ; } $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " P r o p o s t a de s e m i n r i o " ) ; $ t e m p l a t e > a s s i g n ( " mensagem " , " Sua s o l i c i t a o s e r a n a l i s a d a p e l o a d m i n i s t r a d o r e voc s e r a v i s a d o p o r c o r r e i o e l e t r n i c o quando h o u v e r uma r e s p o s t a . "); $ e n l a c e s [ ] = new E n l a c e ( S e m i n a r i o s : : obterURL ( ) , " Cl ique a q u i p a r a l i s t a r t o d o s os s e m i n r i o s " ) ; $ t e m p l a t e > a s s i g n ( " e n l a c e s " , $ e n l a c e s ) ; $ t e m p l a t e > a s s i g n ( " n a o M o s t r a r E t i q u e t a D e A u t e n t i c a c a o " , true ) ; header ( L o c a t i o n : . D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / p r o p o s t a D e S e m i n a r i o / " . $ p r o p o s t a >c o d i g o ) ; header ( HTTP / 1 . 1 201 C r e a t e d ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / Mensagem . t p l . php " ); } / @AutenticacaoBasica (" administrador ") / p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " c o l e c a o " , P r o p o s t a s D e S e m i n a r i o s : : obterTodas ( ) ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " P r o p o s t a s de s e m i n r i o " ) ; $ t e m p l a t e > a s s i g n ( " c l a s s e D a C o l e c a o " , " propostasDeSeminario " ) ; $ t e m p l a t e > a s s i g n ( " c l a s s e D o I t e m " , " propostaDeSeminario " ) ; $ t e m p l a t e > a s s i g n ( " a t r i b u t o A M o s t r a r " , " t i t u l o " ) ;

179 $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / C o l e c a o . t p l . php " ) ; } p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( O p t i o n s : POST , GET ) ; } } ?>

Listagem B.32: Arquivo: RecursoAdministradores.inc.php


<? php c l a s s RecursoAdministradores extends Recurso { p u b l i c f u n c t i o n HEAD( R e q u i s i c a o $ r e q u i s i o ) { } p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( Allow : GET , OPTIONS , HEAD ) ; } p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " c o l e c a o " , U s u a r i o s : : o b t e r P o r P a p e l ( " administrador " ) ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " A d m i n i s t r a d o r e s " ) ; $ t e m p l a t e > a s s i g n ( " c l a s s e D a C o l e c a o " , " a d m i n i s t r a d o r e s "); $ t e m p l a t e > a s s i g n ( " URLDeElemento " , " obterURLDeAdministrador " ) ; $ t e m p l a t e > a s s i g n ( " c l a s s e D o I t e m " , " a d m i n i s t r a d o r " ) ; $ t e m p l a t e > a s s i g n ( " a t r i b u t o A M o s t r a r " , " nome " ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / C o l e c a o . t p l . php " ) ; } } ?>

180

Listagem B.33: Arquivo: RecursoUmaApresentacao.inc.php


<? php c l a s s RecursoUmaApresentacao e x t e n d s Recurso { / @AutenticacaoBasica / p u b l i c f u n c t i o n DELETE ( R e q u i s i c a o $ r e q u i s i o ) { i f ( ! S e m i n a r i o s : : existeComNomeParaURL ( $ r e q u i s i o > o b t e r V a r i v e l D a U R L ( " nomeParaURL " ) ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e Not Found ) ; echo S e m i n r i o i n e x i s t e n t e ; die ( ) ; } i f ( ! Apresentacoes : : existeComSeminrioETtuloParaURL ( S e m i n a r i o s : : obterPorNomeParaURL ( $ r e q u i s i o > o b t e r V a r i v e l D a U R L ( nomeParaURL ) ) , $ r e q u i s i o > obterVarivelDaURL ( tituloParaURL ) ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e Not Found ) ; echo A p r e s e n t a o I n e x i s t e n t e ; die ( ) ; } $apresentao = Apresentacoes : : obterPorSeminrioETtuloParaURL ( Seminarios : : obterPorNomeParaURL ( $ r e q u i s i o > o b t e r V a r i v e l D a U R L ( nomeParaURL ) ) , $ r e q u i s i o > obterVarivelDaURL ( tituloParaURL ) ) ; try { $ a p r e s e n t a o > d e l e t e ( ) ; header ( HTTP / 1 . 1 200 OK ) ; } c a t c h ( E x c e p t i o n $e ) { header ( HTTP / 1 . 1 500 OK ) ; } }

181 p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { i f ( ! S e m i n a r i o s : : existeComNomeParaURL ( $ r e q u i s i o > o b t e r V a r i v e l D a U R L ( " nomeParaURL " ) ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e Not Found ) ; echo S e m i n r i o i n e x i s t e n t e ; die ( ) ; } i f ( ! Apresentacoes : : existeComSeminrioETtuloParaURL ( S e m i n a r i o s : : obterPorNomeParaURL ( $ r e q u i s i o > o b t e r V a r i v e l D a U R L ( nomeParaURL ) ) , $ r e q u i s i o > obterVarivelDaURL ( tituloParaURL ) ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e Not Found ) ; echo A p r e s e n t a o I n e x i s t e n t e ; die ( ) ; }

header ( HTTP / 1 . 1 200 OK ) ; $apresentao = Apresentacoes : : obterPorSeminrioETtuloParaURL ( Seminarios : : obterPorNomeParaURL ( $ r e q u i s i o > o b t e r V a r i v e l D a U R L ( nomeParaURL ) ) , $ r e q u i s i o > obterVarivelDaURL ( tituloParaURL ) ) ; $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " A p r e s e n t a o : " . $ a p r e s e n t a o > t i t u l o ) ; $ t e m p l a t e > a s s i g n ( " a p r e s e n t a o " , $ a p r e s e n t a o ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / U m a A p r e s e n t a c a o . t p l . php " ) ; } / @AutenticacaoBasica /

182 p u b l i c f u n c t i o n PUT ( R e q u i s i c a o $ r e q u i s i o ) { i f ( ! S e m i n a r i o s : : existeComNomeParaURL ( $ r e q u i s i o > o b t e r V a r i v e l D a U R L ( " nomeParaURL " ) ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e Not Found ) ; include_once r e p r e s e n t a c o e s / 4 0 4 . html ; die ( ) ; } $ s e m i n r i o = S e m i n a r i o s : : obterPorNomeParaURL ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " nomeParaURL " ) ) ; $usurio = Usuarios : : obterPorCorreioEletronico ( $ r e q u i s i o >o b t e r N o m e D e U s u r i o ( ) ) ; i f ( ! $ s e m i n r i o > P a r t i c i p a n t e ( $ u s u r i o ) ) { header ( HTTP / 1 . 1 401 Not A u t h o r i z e d ) ; echo " Voc p r e c i s a s e r p a r t i c i p a n t e do s e m i n r i o p a r a e n v i a r uma a p r e s e n t a o " ; die ( ) ; } i f ( $ r e q u i s i o >o b t e r N o m e D e U s u r i o ( ) == usuarioDoDisseminario@edugraf . ufsc . br ) { $ a r q u i v o = new A r q u i v o D e C o n t e u d o ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " t i t u l o P a r a U R L " ) . " . odp " , $ r e q u i s i o > l e r C o n t e d o ( ) ) ; $ t i t u l o = $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " t i t u l o P a r a U R L " ) . " t i t u l o " ; } else { i f ( i s s e t ( $_FILES [ a r q u i v o ] [ s i z e ] ) && $_FILES [ a r q u i v o ] [ s i z e ] == 0 ) { header ( HTTP / 1 . 1 400 Bad R e q u e s t ) ; $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $requisio ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " E r r o E n v i o de A p r e s e n t a o " ) ; $ t e m p l a t e > a s s i g n ( " mensagem " , " No f o i p o s s v e l p u b l i c a r sua a p r e s e n t a o porque o arquivo

183 p u b l i c a d o no contm c o n t e d o . " ) ; $ e n l a c e s [ ] = new E n l a c e ( $ s e m i n r i o > obterURL ( ) . " / a p r e s e n t a c a o ? a u t e n t i c a r = verdadeiro " , " Clique aqui para i r para v o l t a r e t e n t a r novamente " ) ; $ t e m p l a t e > a s s i g n ( " e n l a c e s " , $ e n l a c e s ); $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / Mensagem . t p l . php " ) ; die ( ) ; } i f ( empty ( $_FILES [ a r q u i v o ] ) ) { header ( HTTP / 1 . 1 400 Bad R e q u e s t ) ; $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $requisio ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " E r r o E n v i o de A p r e s e n t a o " ) ; $ t e m p l a t e > a s s i g n ( " mensagem " , " No f o i p o s s v e l p u b l i c a r sua a p r e s e n t a o porque o arquivo p u b l i c a d o tem tamanho m a i o r que 2 MB. " ) ; $ e n l a c e s [ ] = new E n l a c e ( $ s e m i n r i o > obterURL ( ) . " / a p r e s e n t a c a o ? a u t e n t i c a r = verdadeiro " , " Clique aqui para i r para v o l t a r e t e n t a r novamente " ) ; $ t e m p l a t e > a s s i g n ( " e n l a c e s " , $ e n l a c e s ); $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / Mensagem . t p l . php " ) ; die ( ) ; } i f ( Apresentacoes : : existeComSeminrioETtuloParaURL (

184 $ s e m i n r i o , $ r e q u i s i o > obterVarivelDaURL ( " tituloParaURL " ) ) ) { header ( HTTP / 1 . 1 409 C o n f l i c t ) ; $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $requisio ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " E r r o E n v i o de A p r e s e n t a o " ) ; $ t e m p l a t e > a s s i g n ( " mensagem " , " No f o i p o s s v e l p u b l i c a r sua a p r e s e n t a o p o r q u e j e x i s t e uma a p r e s e n t a o com o t t u l o informado . " ) ; $ e n l a c e s [ ] = new E n l a c e ( $ s e m i n r i o > obterURL ( ) . " / a p r e s e n t a c a o ? a u t e n t i c a r = verdadeiro " , " Clique aqui para i r para v o l t a r e t e n t a r novamente " ) ; $ t e m p l a t e > a s s i g n ( " e n l a c e s " , $ e n l a c e s ); $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / Mensagem . t p l . php " ) ; die ( ) ; } i f ( $_FILES [ a r q u i v o ] [ e r r o r ] ) { i f ( $_FILES [ a r q u i v o ] [ e r r o r ] == 1 ) { header ( HTTP / 1 . 1 400 Bad Request ) ; $ t e m p l a t e = $ t h i s > obterRepresentao ( $requisio ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " E r r o E n v i o de Apresentao " ) ; $ t e m p l a t e > a s s i g n ( " mensagem " , " No f o i p o s s v e l p u b l i c a r sua a p r e s e n t a o

185 porque o arquivo publicado tem tamanho m a i o r que 2MB ."); $ e n l a c e s [ ] = new E n l a c e ( $ s e m i n r i o >obterURL ( ) . " / apresentacao ? autenticar = verdadeiro " , " Clique aqui para i r para v o l t a r e t e n t a r novamente " ) ; $ t e m p l a t e > a s s i g n ( " e n l a c e s " , $enlaces ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / Mensagem . t p l . php " ) ; die ( ) ; } } $ a r q u i v o = $ r e q u i s i o > o b t e r A r q u i v o ( a r q u i v o ) ; $ t i t u l o = $ r e q u i s i o > obterVarivelDeConsulta ( " t i t u l o " ) ; } / S o l u o p a r a p r o b l e m a do c l i e n t R e s t l e t , que no suporta codificao multipart / / / TODO: mudar o nome de A r q u i v o D e C o n t e u d o . . . $a = new A p r e s e n t a c a o ( ) ; $a>S e m i n a r i o = S e m i n a r i o s : : obterPorNomeParaURL ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " nomeParaURL " ) ) ; $a> t i t u l o P a r a U R L = $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " tituloParaURL " ) ; $a> t i t u l o = $ t i t u l o ; $a> P a r t i c i p a n t e = P a r t i c i p a n t e s : : obterPorUsurioESeminrio ( $usurio , $seminrio ) ; $a> a r q u i v o = $ a r q u i v o >o b t e r C o n t e d o ( ) ; $a>nomeDoArquivo = $ a r q u i v o >obterNome ( ) ;

186 try { $a>s a v e ( ) ; header ( HTTP / 1 . 1 201 C r e a t e d ) ; } c a t c h ( E x c e p t i o n $e ) { header ( HTTP / 1 . 1 500 I n t e r n a l S e r v e r E r r o r ) ; echo ( $e>g e t M e s s a g e ( ) ) ; die ( ) ; } $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " A p r e s e n t a o : " . $a> titulo ) ; $ t e m p l a t e > a s s i g n ( " a p r e s e n t a o " , $a ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / U m a A p r e s e n t a c a o . t p l . php " ) ; } } ?>

Listagem B.34: Arquivo: RecursoAdministrador.inc.php


<? php c l a s s RecursoAdministrador extends Recurso { / / TODO: f a t o r e s , c d i g o comum com R e c u r s o U s u a r i o p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { i f (! Usuarios : : existeComEsteCorreioEletronico ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " c o r r e i o E l e t r o n i c o "))) { header ( HTTP / 1 . 1 404 R e s o u r c e n o t f o u n d ) ; include_once r e p r e s e n t a c o e s / 4 0 4 . html ; die ( ) ; } $usuario = ")); $ t e m p l a t e = new S a v a n t 3 ( ) ; $ t e m p l a t e > a s s i g n ( " u s u a r i o " , $ u s u a r i o ) ; Usuarios : : obterPorCorreioEletronico (

$ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " c o r r e i o E l e t r o n i c o

187 $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / U s u a r i o . t p l . php " ) ; } p u b l i c f u n c t i o n PUT ( R e q u i s i c a o $ r e q u i s i o ) { $ c o r r e i o E l e t r o n i c o = $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " correioEletronico ") ; $ tr a n sa o = Doctrine_Manager : : connection ( ) ; try { $ t r a n s a o > b e g i n T r a n s a c t i o n ( ) ; $ d a d o s = $ r e q u i s i o >o b t e r D a d o s D o F o r m u l r i o () ; $ u s u r i o = new U s u a r i o ( ) ; $ u s u r i o > c o r r e i o E l e t r o n i c o = $correioEletronico ; $ u s u r i o >nome = $ d a d o s [ nome ] ; $ u s u r i o >s e n h a = s h a 1 ( $ d a d o s [ s e n h a ] ) ; $ u s u r i o > p a p e l = " a d m i n i s t r a d o r " ; $ u s u r i o >s a v e ( ) ; $ t r a n s a o >commit ( ) ; } c a t c h ( E x c e p t i o n $e ) { $ t r a n s a o > r o l l b a c k ( ) ; header ( HTTP / 1 . 1 500 I n t e r n a l S e r v e r E r r o r ) ; echo $e>g e t M e s s a g e ( ) ; die ( ) ; } header ( HTTP / 1 . 1 201 C r e a t e d ) ; echo " Sua c o n t a f o i c r i a d a com s u c e s s o " ; } p u b l i c f u n c t i o n DELETE ( R e q u i s i c a o $ r e q u i s i o ) { i f (! Usuarios : : existeComEsteCorreioEletronico ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " c o r r e i o E l e t r o n i c o "))) { header ( HTTP / 1 . 1 404 Not Found ) ; die ( ) ;

188 } $usurio = Usuarios : : obterPorCorreioEletronico ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " c o r r e i o E l e t r o n i c o ")); $ u s u r i o > d e l e t e ( ) ; } } ?>

Listagem B.35: Arquivo: RecursoPropostaDeSeminario.inc.php


<? php c l a s s RecursoPropostaDeSeminario extends Recurso { / @AutenticacaoBasica / p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " URL_paraSubmisso " , " . "? autenticar =verdadeiro " ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / F o r m u l a r i o P r o p o s t a D e S e m i n a r i o . t p l . php " ) ; } p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( O p t i o n s : HEAD, GET ) ; } p u b l i c f u n c t i o n HEAD( R e q u i s i c a o $ r e q u i s i o ) { header ( HTTP / 1 . 1 200 OK ) ; } / / TODO: r e c u r s o s p r o t e g i d o s devem t e r s e m p r e " a u t e n t i c a r = v e r d a d e i r o " em s u a s URls . p u b l i c s t a t i c f u n c t i o n obterURL ( ) { " P r o p o s t a de S e m i n r i o " ) Disseminario : : obterURL_BaseCompleta ( ) . " / p r o p o s t a s D e S e m i n a r i o

189 r e t u r n D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / propostaDeSeminario " . " ? a u t e n t i c a r = verdadeiro " ; } } ?>

Listagem B.36: Arquivo: RecursoUsuario.inc.php


<? php c l a s s RecursoUsuario extends Recurso { p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { i f (! Usuarios : : existeComEsteCorreioEletronico ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " c o r r e i o E l e t r o n i c o "))) { header ( HTTP / 1 . 1 404 R e s o u r c e n o t f o u n d ) ; include_once r e p r e s e n t a c o e s / 4 0 4 . html ; die ( ) ; } $usuario = ")); $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " U s u r i o " ) ; $ t e m p l a t e > a s s i g n ( " u s u a r i o " , $ u s u a r i o ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / U s u a r i o . t p l . php " ) ; } / p u b l i c f u n c t i o n PUT ( R e q u i s i c a o $ r e q u i s i o ) { $ d a d o s = $ r e q u i s i o >o b t e r D a d o s D o F o r m u l r i o ( ) ; i f ( ! $dados [ c h a v e S e c r e t a ] | | ! Cadastramentos : : e x i s t e C o m E s t a C h a v e S e c r e t a ( $dados [ c h a v e S e c r e t a ] ) ) { h e a d e r ( HTTP / 1 . 1 404 Not Found ) ; die () ; } Usuarios : : obterPorCorreioEletronico (

$ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " c o r r e i o E l e t r o n i c o

190 $cadastro = Cadastramentos : : obterPelaChaveSecreta ( $dados [ c h a v e S e c r e t a ] ) ; $transao = Doctrine_Manager : : c o n n e c t i o n ( ) ; try { $ t r a n s a o >b e g i n T r a n s a c t i o n ( ) ; $ d a d o s = $ r e q u i s i o >o b t e r D a d o s D o F o r m u l r i o () ; $ u s u r i o = new U s u a r i o ( ) ; $ u s u r i o > c o r r e i o E l e t r o n i c o = $ r e q u i s i o > obterVarivelDaURL ( c o r r e i o E l e t r o n i c o ) ; $ u s u r i o >nome = $ d a d o s [ nome ] ; $ u s u r i o >s e n h a = s h a 1 ( $ d a d o s [ s e n h a ] ) ; $ c a d a s t r o > d e l e t e ( ) ; $ u s u r i o >s a v e ( ) ; $ t r a n s a o >commit ( ) ; } c a t c h ( E x c e p t i o n $e ) { $ t r a n s a o > r o l l b a c k ( ) ; h e a d e r ( HTTP / 1 . 1 500 I n t e r n a l S e r v e r E r r o r ) ; e c h o $e>g e t M e s s a g e ( ) ; die () ; } h e a d e r ( HTTP / 1 . 1 201 C r e a t e d ) ; e c h o " Sua c o n t a f o i c r i a d a com s u c e s s o " ; } / p u b l i c f u n c t i o n DELETE ( R e q u i s i c a o $ r e q u i s i o ) { i f (! Usuarios : : existeComEsteCorreioEletronico ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " c o r r e i o E l e t r o n i c o "))) { header ( HTTP / 1 . 1 404 Not Found ) ; die ( ) ; } $usurio = Usuarios : : obterPorCorreioEletronico ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " c o r r e i o E l e t r o n i c o "));

191 $ u s u r i o > d e l e t e ( ) ; } } ?>

Listagem B.37: Arquivo: RecursoCoordenador.inc.php


<? php c l a s s RecursoCoordenador extends Recurso { / / TODO: f a t o r e s , c d i g o comum com R e c u r s o U s u a r i o p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { i f (! Usuarios : : existeComEsteCorreioEletronico ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " c o r r e i o E l e t r o n i c o "))) { header ( HTTP / 1 . 1 404 R e s o u r c e n o t f o u n d ) ; include_once r e p r e s e n t a c o e s / 4 0 4 . html ; die ( ) ; } $usuario = ")); $ t e m p l a t e = new S a v a n t 3 ( ) ; $ t e m p l a t e > a s s i g n ( " u s u a r i o " , $ u s u a r i o ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / U s u a r i o . t p l . php " ) ; } } ?> Usuarios : : obterPorCorreioEletronico (

$ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " c o r r e i o E l e t r o n i c o

Listagem B.38: Arquivo: RecursoCadastroDeUsuario.inc.php


<? php c l a s s RecursoCadastroDeUsuario extends Recurso { p u b l i c f u n c t i o n HEAD( R e q u i s i c a o $ r e q u i s i o ) { } p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( Allow : GET , OPTIONS , HEAD ) ; }

192

p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " C a d a s t r a m e n t o de U s u r i o "); $ t e m p l a t e > a s s i g n ( " URL_paraSubmisso " , D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / c a d a s t r a m e n t o " ) ; $ t e m p l a t e > a s s i g n ( " n a o M o s t r a r E t i q u e t a D e A u t e n t i c a c a o " , true ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / F o r m u l a r i o D e C a d a s t r o D e U s u a r i o . t p l . php " ) ; } } ?>

Listagem B.39: Arquivo: RecursoApresentacao.inc.php


<? php c l a s s RecursoApresentacao extends Recurso { / @AutenticacaoBasica / p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ s e m i n r i o = S e m i n a r i o s : : obterPorNomeParaURL ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( nomeParaURL ) ) ; $ t e m p l a t e > a s s i g n ( " URL_paraSubmisso " , $ s e m i n r i o > obterURL ( ) . " / a p r e s e n t a c a o " ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , ; $ t e m p l a t e > a s s i g n ( " s e m i n a r i o " , $seminrio ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / F o r m u l a r i o E n v i o D e A p r e s e n t a c a o . t p l . php " ) ; } p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( O p t i o n s : HEAD, GET ) ; } " E n v i o de A p r e s e n t a o " )

193 p u b l i c f u n c t i o n HEAD( R e q u i s i c a o $ r e q u i s i o ) { header ( HTTP / 1 . 1 200 OK ) ; } } ?>

Listagem B.40: Arquivo: RecursoCoordenadores.inc.php


<? php c l a s s RecursoCoordenadores extends Recurso { p u b l i c f u n c t i o n HEAD( R e q u i s i c a o $ r e q u i s i o ) { } p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( Allow : GET , OPTIONS , HEAD, POST , DELETE ) ; } p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " c o l e c a o " , U s u a r i o s : : o b t e r P o r P a p e l ( " coordenador " ) ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " C o o r d e n a d o r e s " ) ; $ t e m p l a t e > a s s i g n ( " URLDeElemento " , " obterURLDeCoordenador " ) ; $ t e m p l a t e > a s s i g n ( " c l a s s e D a C o l e c a o " , " c o o r d e n a d o r e s " ) ; $ t e m p l a t e > a s s i g n ( " c l a s s e D o I t e m " , " c o o r d e n a d o r " ) ; $ t e m p l a t e > a s s i g n ( " a t r i b u t o A M o s t r a r " , " nome " ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / C o l e c a o . t p l . php " ) ; } } ?>

Listagem B.41: Arquivo: RecursoParticipantes.inc.php


<? php c l a s s R e c u r s o P a r t i c i p a n t e s extends Recurso { p u b l i c f u n c t i o n HEAD( R e q u i s i c a o $ r e q u i s i o ) { }

194

p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( Allow : GET , OPTIONS , HEAD ) ; } p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { $nomeDaURL = $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " nomeParaURL " ) ; i f ( ! S e m i n a r i o s : : existeComNomeParaURL ( $nomeDaURL ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e n o t f o u n d ) ; include_once r e p r e s e n t a c o e s / 4 0 4 . html ; die ( ) ; } $ s e m i n r i o = S e m i n a r i o s : : obterPorNomeParaURL ( $nomeDaURL ) ; $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " u r l A n t e r i o r " , new E n l a c e ( $ s e m i n r i o >obterURL ( ) , " V o l t a r p a r a o S e m i n r i o " ) ); $ t e m p l a t e > a s s i g n ( " c o l e c a o " , P a r t i c i p a n t e s : : obterPorSeminrio ( $seminrio ) ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " P a r t i c i p a n t e s do S e m i n r i o < I > \ " " . $ s e m i n r i o > t i t u l o . " \ " < / I > " ) ; $ t e m p l a t e > a s s i g n ( " c l a s s e D a C o l e c a o " , " p a r t i c i p a n t e s " ) ; $ t e m p l a t e > a s s i g n ( " c l a s s e D o I t e m " , " p a r t i c i p a n t e " ) ; $ t e m p l a t e > a s s i g n ( " a t r i b u t o A M o s t r a r " , a r r a y ( " U s u a r i o " , " nome " ) ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / C o l e c a o . t p l . php " ) ; } } ?>

Listagem B.42: Arquivo: RecursoApresentacoes.inc.php


<? php c l a s s RecursoApresentacoes extends Recurso {

195 p u b l i c f u n c t i o n HEAD( R e q u i s i c a o $ r e q u i s i o ) { header ( HTTP / 1 . 1 200 Ok ) ; } p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( Allow : GET , OPTIONS , HEAD ) ; } p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; i f ( ! S e m i n a r i o s : : existeComNomeParaURL ( $ r e q u i s i o > o b t e r V a r i v e l D a U R L ( nomeParaURL ) ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e Not Found ) ; include_once r e p r e s e n t a c o e s / 4 0 4 . html ; die ( ) ; } $ s e m i n r i o = S e m i n a r i o s : : obterPorNomeParaURL ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( nomeParaURL ) ) ; $ t e m p l a t e > a s s i g n ( " u r l A n t e r i o r " , new E n l a c e ( $ s e m i n r i o >obterURL ( ) , " V o l t a r p a r a o S e m i n r i o " ) ); i f ( $ r e q u i s i o > A u t e n t i c a d a ( ) ) { $ e n l a c e s [ ] = new E n l a c e ( $ s e m i n r i o >obterURL () . " / apresentacao " , " Publicar apresentao " ) ; $ t e m p l a t e > a s s i g n ( " e n l a c e s " , $ e n l a c e s ) ; } $ t e m p l a t e > a s s i g n ( " c o l e c a o " , A p r e s e n t a c o e s : : obterPorSeminrio ( $seminrio ) ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " A p r e s e n t a e s do S e m i n r i o < I > \ " " . $ s e m i n r i o > t i t u l o . " \ " < / I > " ) ; $ t e m p l a t e > a s s i g n ( " c l a s s e D a C o l e c a o " , " a p r e s e n t a c o e s " ) ; $ t e m p l a t e > a s s i g n ( " c l a s s e D o I t e m " , " a p r e s e n t a c a o " ) ;

196 $ t e m p l a t e > a s s i g n ( " a t r i b u t o A M o s t r a r " , " t i t u l o " ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / C o l e c a o . t p l . php " ) ; } } ?>

Listagem B.43: Arquivo: RecursoCadastramento.inc.php


<? php c l a s s RecursoCadastramento extends Recurso { p u b l i c f u n c t i o n HEAD( R e q u i s i c a o $ r e q u i s i o ) { } p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( Allow : GET , OPTIONS , HEAD, PUT DELETE ) ; } p u b l i c f u n c t i o n PUT ( R e q u i s i c a o $ r e q u i s i o ) { $ d a d o s D o F o r m u l r i o = $ r e q u i s i o > obterDadosDoFormulrio ( ) ; i f ( $dadosDoFormulrio [ chaveSecreta ] ) { $ t ra n sa o = Doctrine_Manager : : connection ( ) ; i f ( Cadastramentos : : existeComEstaChaveSecreta ( $dadosDoFormulrio [ chaveSecreta ] ) ) { try { $ t r a n s a o > b e g i n T r a n s a c t i o n () ; $cadastro = Cadastramentos : : obterPelaChaveSecreta ( $dadosDoFormulrio [ chaveSecreta ]) ; $u = new U s u a r i o ( ) ; $u> c o r r e i o E l e t r o n i c o = $ c a d a s t r o > correioEletronico ; $u>s e n h a = s h a 1 ( $dadosDoFormulrio [ senha

197 ]) ; $u>nome = $ d a d o s D o F o r m u l r i o [ nome ] ; $u>s a v e ( ) ; new MensagemDeContaCriada ( $u , $dadosDoFormulrio [ senha ]) ; $ t r a n s a o >commit ( ) ; header ( HTTP / 1 . 1 201 C r e a t e d ); $ t e m p l a t e = $ t h i s > obterRepresentao ( $requisio ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " Cadastramento Finalizado " ) ; $ t e m p l a t e > a s s i g n ( " mensagem " , s p r i n t f ( " Caro ( a ) %s , Voc a c a b a de f i n a l i z a r s e u c a d a s t r a m e n t o , agora voc pode p r o p o r um s e m i n r i o ou p a r t i c i p a r de um j existente . Lembres e que quando p r e c i s a r s e a u t e n t i c a r , s e u nome de u s u r i o : %s " , $u> nome , $u> correioEletronico ) ) ; $ e n l a c e s [ ] = new E n l a c e ( S e m i n a r i o s : : obterURL ( ) , " Clique aqui para i r para a pgina i n i c i a l " ) ; $ t e m p l a t e > a s s i g n ( " e n l a c e s " , $enlaces ) ; $ t e m p l a t e > a s s i g n ( " naoMostrarEtiquetaDeAutenticacao

198 " , true ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / Mensagem . t p l . php " ) ; die ( ) ; } c a t c h ( E x c e p t i o n $e ) { header ( HTTP / 1 . 1 500 I n t e r n a l Server Error ) ; $ t r a n s a o > r o l l b a c k ( ) ; die ( ) ; } } else { header ( HTTP / 1 . 1 404 R e s o u r c e n o t found ) ; include_once r e p r e s e n t a c o e s / 4 0 4 . html ; die ( ) ; } } i f ( ! Cadastramentos : : existeComEsteCorreioEletronico ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " c o r r e i o E l e t r o n i c o "))) { $ c a d a s t r o = new C a d a s t r a m e n t o ( ) ; $ c a d a s t r o > c o r r e i o E l e t r o n i c o = $ r e q u i s i o > obterVarivelDaURL ( " c o r r e i o E l e t r o n i c o " ) ; $ c a d a s t r o > c h a v e S e c r e t a = md5 ( mt_rand ( ) . $ c a d a s t r o > c o r r e i o E l e t r o n i c o ) ; } else { $cadastro = Cadastramentos : : o b t e r P e l o C o r r e i o E l e t r o n i c o ( $ r e q u i s i o > obterVarivelDaURL ( " c o r r e i o E l e t r o n i c o " ) ) ; } $ tr a n sa o = Doctrine_Manager : : connection ( ) ; try { $ t r a n s a o > b e g i n T r a n s a c t i o n ( ) ;

199 $ c a d a s t r o >s a v e ( ) ; new MensagemDeConfirmacaoDeCadastramento ( $cadastro ) ; $ t r a n s a o >commit ( ) ; } c a t c h ( E x c e p t i o n $e ) { $ t r a n s a o > r o l l b a c k ( ) ; header ( HTTP / 1 . 1 500 I n t e r n a l S e r v e r E r r o r ) ; echo $e>g e t M e s s a g e ( ) ; die ( ) ; } header ( HTTP / 1 . 1 201 C r e a t e d ) ; $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ e n l a c e s [ ] = new E n l a c e ( S e m i n a r i o s : : obterURL ( ) , " Todos o s s e m i n r i o s " ) ; $ t e m p l a t e > a s s i g n ( " e n l a c e s C a b e c a l h o " , $ e n l a c e s ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " C a d a s t r a m e n t o de U s u r i o "); $ t e m p l a t e > a s s i g n ( " mensagem " , " O b r i g a d o p e l o i n t e r e s s e . E s t a m o s e n v i a n d o uma mensagem p a r a s e u c o r r e i o e l e t r n i c o com i n s t r u e s p a r a f i n a l i z a o do s e u c a d a s t r a m e n t o . " ) ; $ t e m p l a t e > a s s i g n ( " n a o M o s t r a r E t i q u e t a D e A u t e n t i c a c a o " , true ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / Mensagem . t p l . php " ); } p u b l i c f u n c t i o n DELETE ( R e q u i s i c a o $ r e q u i s i o ) { Cadastramentos : : obterPeloCorreioEletronico ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " c o r r e i o E l e t r o n i c o " ) )> d e l e t e ( ) ; header ( HTTP / 1 . 1 200 OK ) ; } / @AutenticacaoBasica (" administrador ")

200 / p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { $ c o r r e i o E l e t r o n i c o = $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " correioEletronico ") ; i f ( ! Cadastramentos : : existeComEsteCorreioEletronico ( $correioEletronico ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e n o t f o u n d ) ; include_once r e p r e s e n t a c o e s / 4 0 4 . html ; die ( ) ; } $cadastro = Cadastramentos : : obterPeloCorreioEletronico ( $correioEletronico ) ; $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " C a d a s t r a m e n t o de Usurios " ) ; $ t e m p l a t e > a s s i g n ( " c a d a s t r o " , $ c a d a s t r o ) ; $ t e m p l a t e > a s s i g n ( " n a o M o s t r a r E t i q u e t a D e A u t e n t i c a c a o " , true ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / C a d a s t r a m e n t o . t p l . php " ) ; } p u b l i c f u n c t i o n obterURL ( ) { r e t u r n D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / cadastramento " ; } } ?>

Listagem B.44: Arquivo: RecursoSeminarios.inc.php


<? php c l a s s RecursoSeminarios extends Recurso { p u b l i c f u n c t i o n HEAD( R e q u i s i c a o $ r e q u i s i o ) { } p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( Allow : GET , OPTIONS , HEAD, DELETE ) ;

201 } p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " c o l e c a o " , S e m i n a r i o s : : o b t e r T o d o s ( ) ); $ t e m p l a t e > a s s i g n ( " t i t u l o " , " S e m i n r i o s " ) ; $ t e m p l a t e > a s s i g n ( " r a i z " , t r u e ) ; i f ( $ r e q u i s i o > A u t e n t i c a d a ( ) ) { $ e n l a c e s [ ] = new E n l a c e ( R e c u r s o P r o p o s t a D e S e m i n a r i o : : obterURL ( ) , " P r o p o r um s e m i n r i o " ) ; $ t e m p l a t e > a s s i g n ( " e n l a c e s " , $ e n l a c e s ) ; } $ t e m p l a t e > a s s i g n ( " c l a s s e D a C o l e c a o " , " s e m i n a r i o s " ) ; $ t e m p l a t e > a s s i g n ( " c l a s s e D o I t e m " , " s e m i n a r i o " ) ; $ t e m p l a t e > a s s i g n ( " a t r i b u t o A M o s t r a r " , " t i t u l o " ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / C o l e c a o . t p l . php " ) ; } } ?>

Listagem B.45: Arquivo: RecursoUmArquivoDeApresentacao.inc.php


<? php c l a s s RecursoUmArquivoDeApresentacao e x t e n d s Recurso { p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { / / TODO: s o p r e c i s a s t o d a s e s s a s c o m p a r a e s ? i f ( ! S e m i n a r i o s : : existeComNomeParaURL ( $ r e q u i s i o > o b t e r V a r i v e l D a U R L ( " nomeParaURL " ) ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e Not Found ) ; echo S e m i n r i o i n e x i s t e n t e ; die ( ) ; }

202 i f ( ! Apresentacoes : : existeComSeminrioETtuloParaURL ( S e m i n a r i o s : : obterPorNomeParaURL ( $ r e q u i s i o > o b t e r V a r i v e l D a U R L ( nomeParaURL ) ) , $ r e q u i s i o > obterVarivelDaURL ( tituloParaURL ) ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e Not Found ) ; echo A p r e s e n t a o I n e x i s t e n t e ; die ( ) ; } i f (! Apresentacoes : : existeComSeminrioETtuloParaURLENome ( S e m i n a r i o s : : obterPorNomeParaURL ( $ r e q u i s i o > o b t e r V a r i v e l D a U R L ( nomeParaURL ) ) , $ r e q u i s i o > o b t e r V a r i v e l D a U R L ( t i t u l o P a r a U R L ) , $ r e q u i s i o > obterVarivelDaURL ( arquivo ) ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e Not Found ) ; echo A r q u i v o i n e x i s t e n t e ; die ( ) ; } $apresentao = Apresentacoes : : obterComSeminrioETtuloParaURLENome ( S e m i n a r i o s : : obterPorNomeParaURL ( $ r e q u i s i o > o b t e r V a r i v e l D a U R L ( nomeParaURL ) ) , $ r e q u i s i o > o b t e r V a r i v e l D a U R L ( t i t u l o P a r a U R L ) , $ r e q u i s i o > obterVarivelDaURL ( arquivo ) ) ; header ( HTTP / 1 . 1 200 OK ) ; header ( C o n t e n t t y p e : . $ a p r e s e n t a o > obterMimeTypeDoArquivo ( ) ) ; header ( C o n t e n t l e n g t h : . $ a p r e s e n t a o > obterTamanhoDoArquivo ( ) ) ; echo $ a p r e s e n t a o > a r q u i v o ; die ( ) ; } } ?>

203

Listagem B.46: Arquivo: Recurso.inc.php


<? php a b s t r a c t c l a s s Recurso { p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { header ( HTTP / 1 . 1 405 Method Not Allowed ) ; } p u b l i c f u n c t i o n POST ( R e q u i s i c a o $ r e q u i s i o ) { header ( HTTP / 1 . 1 405 Method Not Allowed ) ; } p u b l i c f u n c t i o n PUT ( R e q u i s i c a o $ r e q u i s i o ) { header ( HTTP / 1 . 1 405 Method Not Allowed ) ; } p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( HTTP / 1 . 1 405 Method Not Allowed ) ; } p u b l i c f u n c t i o n DELETE ( R e q u i s i c a o $ r e q u i s i o ) { header ( HTTP / 1 . 1 405 Method Not Allowed ) ; } p u b l i c f u n c t i o n HEAD( R e q u i s i c a o $ r e q u i s i o ) { header ( HTTP / 1 . 1 405 Method Not Allowed ) ; } / @return S a v a n t 3 / public function obterRepresentao ( Requisicao $requisio ) { $ p e d i u = $ r e q u i s i o >o b t e r P a r m e t r o D a U R L ( a u t e n t i c a r ) == " v e r d a d e i r o " ; $configuraes [ plugin_conf ][ url ][ estAutenticado ] = $pediu ; $ t e m p l a t e = new TemplateXHTML ( $ c o n f i g u r a e s ) ;

204 $ t e m p l a t e > a s s i g n ( " nomeDeUsuario " , $ r e q u i s i o > obterNomeDeUsurio ( ) ) ; $ t e m p l a t e > a s s i g n ( " e s t A u t e n t i c a d o " , $ p e d i u ) ; $ t e m p l a t e > a s s i g n ( " URLDeCadastramento " , D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / c a d a s t r a m e n t o " ) ; $ t e m p l a t e > a s s i g n ( " URLAtual " , $ r e q u i s i o > obterURLCompleta ( ) ) ; $ t e m p l a t e > a s s i g n ( " e n l a c e s " , a r r a y ( ) ) ; return $template ; } / / TODO: t e n t a r e x t r a i r p a r a um p r o x y public function tratarRequisio ( Requisicao $requisio ) { $ a n o t a e s M t o d o = new R e f l e c t i o n A n n o t a t e d M e t h o d ( $ t h i s , $ r e q u i s i o >o b t e r M t o d o ( ) ) ; $ p e d i u P a r a A u t e n t i c a r = $ r e q u i s i o > o b t e r P a r m e t r o D a U R L ( a u t e n t i c a r ) == " v e r d a d e i r o " ; i f ( $ a n o t a e s M t o d o > h a s A n n o t a t i o n ( AutenticacaoBasica ) || ( $ a n o t a e s M t o d o > h a s A n n o t a t i o n ( A u t e n t i c a c a o C o n d i c i o n a l ) && $pediuParaAutenticar ) ) { i f ( $ a n o t a e s M t o d o > h a s A n n o t a t i o n ( AutenticacaoBasica ) ) $ p a p i s P e r m i t i d o s = $anotaesMtodo > g e t A n n o t a t i o n ( A u t e n t i c a c a o B a s i c a )> v a l u e ; else $ p a p i s P e r m i t i d o s = $anotaesMtodo > g e t A n n o t a t i o n ( A u t e n t i c a c a o C o n d i c i o n a l )> v a l u e ; i f (! is_array ( $papisPermitidos ) ) $ p a p i s P e r m i t i d o s = array ( $papisPermitidos ? $papisPermitidos : Usuario : : obterPapelBsico () ) ;

205

i f ( ! $ r e q u i s i o > t e m C r e d e n c i a i s ( ) Usuarios : : soCredenciaisVlidas (

||

$ r e q u i s i o >o b t e r N o m e D e U s u r i o ( ) , $ r e q u i s i o > o b t e r S e n h a ( ) , $papisPermitidos ) ) { $ t h i s >n e g a r A c e s s o ( $ r e q u i s i o ) ; } if (! isset ( $pediuParaAutenticar ) ) { / / h e a d e r ( L o c a t i o n : . $ r e q u i s i o > o b t e r U R L C o m p l e t a ( ) . "? a u t e n t i c a r = verdadeiro ") ; } } e l s e i f ( $pediuParaAutenticar ) { i f ( ! $ r e q u i s i o > t e m C r e d e n c i a i s ( ) Usuarios : : soCredenciaisVlidas ( $ r e q u i s i o >o b t e r N o m e D e U s u r i o ( ) , $ r e q u i s i o > o b t e r S e n h a ( ) , a r r a y ( U s u a r i o : : obterPapelBsico () ) ) ) { $ t h i s >n e g a r A c e s s o ( $ r e q u i s i o ) ; } } $ m t o d o A E x e c u t a r = $ r e q u i s i o >o b t e r M t o d o ( ) ; $ t h i s >$ m t o d o A E x e c u t a r ( $ r e q u i s i o ) ; } p r i v a t e f u n c t i o n enviarCabealhosDeAcessoNegado ( ) { header ( "HTTP / 1 . 1 401 UNAUTHORIZED" ) ; header ( "W W u t h e n t i c a t e : B a s i c r e a l m = \ " " . W A mb_convert_encoding ( " A u t e n t i c a o do D i s s e m i n r i o " , " l a t i n 1 " , " u t f 8" ) . " \ " " ) ; } / / TODO: f a t o r a r com o o b t e r R e p r e s e n t a o ( ) public f u n c t i o n negarAcesso ( Requisicao $ r e q u i s i o ) { || !

206 $ t h i s >e n v i a r C a b e a l h o s D e A c e s s o N e g a d o ( ) ; $configuraes [ plugin_conf ][ url ][ estAutenticado ] = false ; $ t e m p l a t e = new TemplateXHTML ( $ c o n f i g u r a e s ) ; $ t e m p l a t e > a s s i g n ( " naoConverterParaHTML " , t r u e ) ; $ t e m p l a t e > a s s i g n ( " mensagem " , " <h2 > D i s s e m i n r i o < / h2 >< h3 ><B> A c e s s o negado < /B> : A c o n t a e a s e n h a i n f o r m a d a no c o n f e r e m . < / h3 > " ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " A c e s s o n e g a d o " ) ; $ t e m p l a t e > a s s i g n ( " URLDeCadastramento " , D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / c a d a s t r a m e n t o " ) ; $ t e m p l a t e > s e t T e m p l a t e ( / r e p r e s e n t a c o e s / Mensagem . t p l . php ) ; $ t e m p l a t e > d i s p l a y ( ) ; die ( ) ; } } ?>

Listagem B.47: Arquivo: RecursoUsuarios.inc.php


<? php c l a s s RecursoUsuarios extends Recurso { p u b l i c f u n c t i o n HEAD( R e q u i s i c a o $ r e q u i s i o ) { } p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( Allow : GET , OPTIONS , HEAD ) ; } p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " c o l e c a o " , U s u a r i o s : : o b t e r T o d o s ( ) ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " U s u r i o s " ) ; $ t e m p l a t e > a s s i g n ( " c l a s s e D a C o l e c a o " , " u s u a r i o s " ) ; $ t e m p l a t e > a s s i g n ( " c l a s s e D o I t e m " , " u s u a r i o " ) ; $ t e m p l a t e > a s s i g n ( " a t r i b u t o A M o s t r a r " , " nome " ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / C o l e c a o . t p l . php " ) ;

207 } } ?>

Listagem B.48: Arquivo: RecursoUmParticipante.inc.php


<? php c l a s s RecursoUmParticipante extends Recurso { p u b l i c f u n c t i o n HEAD( R e q u i s i c a o $ r e q u i s i o ) { } p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( Allow : GET , OPTIONS , HEAD, POST , DELETE ) ; } private function verificarExistnciaDoRecurso ( Requisicao $requisio ) { i f (! Usuarios : : existeComEsteCorreioEletronico ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( c o r r e i o E l e t r o n i c o )) || ! S e m i n a r i o s : : existeComNomeParaURL ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( nomeParaURL ) ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e Not Found ) ; echo " No e n c o n t r a d o " ; die ( ) ; } } / @AutenticacaoBasica / p u b l i c f u n c t i o n PUT ( R e q u i s i c a o $ r e q u i s i o ) { $ t h i s > v e r i f i c a r E x i s t n c i a D o R e c u r s o ( $ r e q u i s i o ) ; i f ( $ r e q u i s i o >o b t e r N o m e D e U s u r i o ( ) ! = $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( c o r r e i o E l e t r o n i c o ) ) { header ( HTTP / 1 . 1 401 U n a u t h o r i z e d ) ; echo " No a u t o r i z a d o " ; die ( ) ; }

208 $usurio = Usuarios : : obterPorCorreioEletronico ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( c o r r e i o E l e t r o n i c o )) ; $ s e m i n r i o = S e m i n a r i o s : : obterPorNomeParaURL ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( nomeParaURL ) ) ; $ p a r t i c i p a n t e = new P a r t i c i p a n t e ( ) ; $ p a r t i c i p a n t e >U s u a r i o = $ u s u r i o ; $ p a r t i c i p a n t e >S e m i n a r i o = $ s e m i n r i o ; try { $ p a r t i c i p a n t e >s a v e ( ) ; $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $requisio ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " S o l i c i t a o de p a r t i c i p a o no s e m i n r i o " . $ s e m i n r i o > titulo ) ; $ t e m p l a t e > a s s i g n ( " mensagem " , " Caro ( a ) " . $ u s u r i o >nome . " , Agora v o c p a r t i c i p a n t e do s e m i n r i o \ " " . $ s e m i n r i o > t i t u l o . " \ " . " ) ; $ e n l a c e s [ ] = new E n l a c e ( $ s e m i n r i o >obterURL ( ) , " Voltar para o seminrio " ) ; / / TODO: e x t r a i r URL $ e n l a c e s [ ] = new E n l a c e ( $ s e m i n r i o >obterURL () . " / apresentacao ? autenticar =verdadeiro " , " P u b l i c a r uma a p r e s e n t a o n e s t e seminrio " ) ; $ t e m p l a t e > a s s i g n ( " e n l a c e s " , $ e n l a c e s ) ; header ( HTTP / 1 . 1 201 C r e a t e d ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / Mensagem . t p l . php " ) ; } catch ( Exception $exceo ) { header ( HTTP / 1 . 1 500 I n t e r n a l S e r v e r E r r o r ) ; echo " E r r o i n t e r n o " . $ e x c e o ; die ( ) ; }

209

} p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { $ t h i s > v e r i f i c a r E x i s t n c i a D o R e c u r s o ( $ r e q u i s i o ) ; $usurio = Usuarios : : obterPorCorreioEletronico ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( c o r r e i o E l e t r o n i c o )) ; $ s e m i n r i o = S e m i n a r i o s : : obterPorNomeParaURL ( $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( nomeParaURL ) ) ; i f ( ! P a r t i c i p a n t e s : : e x i s t e ( $usurio , $seminrio ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e Not Found ) ; echo " No e n c o n t r a d o " ; die ( ) ; } $participante = Participantes :: obterPorUsurioESeminrio ( $usurio , $seminrio ) ; $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " p a r t i c i p a n t e " , $ p a r t i c i p a n t e > Usuario ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " P a r t i c i p a n t e " ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / P a r t i c i p a n t e . t p l . php " ) ; } } ?>

Listagem B.49: Arquivo: RecursoSeminario.inc.php


<? php c l a s s RecursoSeminario extends Recurso { p u b l i c f u n c t i o n HEAD( R e q u i s i c a o $ r e q u i s i o ) { } p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( Allow : GET , OPTIONS , HEAD, PUT , DELETE ) ; }

210 p u b l i c f u n c t i o n DELETE ( R e q u i s i c a o $ r e q u i s i o ) { $nomeParaURL = $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( nomeParaURL ) ; i f ( ! S e m i n a r i o s : : existeComNomeParaURL ( $nomeParaURL ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e n o t f o u n d ) ; include_once r e p r e s e n t a c o e s / 4 0 4 . html ; die ( ) ; } S e m i n a r i o s : : obterPorNomeParaURL ( $nomeParaURL )> d e l e t e () ; header ( HTTP / 1 . 1 200 OK ) ; } / @AutenticacaoCondicional / p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { $nomeParaURL = $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " nomeParaURL " ) ; i f ( ! S e m i n a r i o s : : existeComNomeParaURL ( $nomeParaURL ) ) { header ( HTTP / 1 . 1 404 R e s o u r c e n o t f o u n d ) ; include_once r e p r e s e n t a c o e s / 4 0 4 . html ; die ( ) ; } $ s e m i n r i o = S e m i n a r i o s : : obterPorNomeParaURL ( $nomeParaURL ) ; $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " s e m i n a r i o " , $ s e m i n r i o ) ; i f ( $ r e q u i s i o > o b t e r V a r i v e i s D e C o n s u l t a ( a u t e n t i c a r )) { $usurio = Usuarios : : o b t e r P o r C o r r e i o E l e t r o n i c o ( $ r e q u i s i o > obterNomeDeUsurio ( ) ) ; $ t e m p l a t e > a s s i g n ( " p o d e P a r t i c i p a r " , t r u e ) ;

211 i f ( Usuarios : : existeComEsteCorreioEletronico ( $ r e q u i s i o >o b t e r N o m e D e U s u r i o ( ) ) ) $ t e m p l a t e > a s s i g n ( " P a r t i c i p a n t e " , $ s e m i n r i o > P a r t i c i p a n t e ( $ u s u r i o )); $ t e m p l a t e > a s s i g n ( " URLDeSubmisso " , $ s e m i n r i o >obterURL ( ) . " / p a r t i c i p a n t e / " . $ u s u r i o > c o r r e i o E l e t r o n i c o . " ? autenticar =verdadeiro " ) ; } i f ( $ r e q u i s i o > t e m C r e d e n c i a i s ( ) ) { i f ( Usuarios : : existeComEsteCorreioEletronico ( $ r e q u i s i o >o b t e r N o m e D e U s u r i o ( ) ) ) i f ( $ s e m i n r i o > P a r t i c i p a n t e ( U s u a r i o s :: obterPorCorreioEletronico ( $ r e q u i s i o >o b t e r N o m e D e U s u r i o ( ) ) )) { $formulrioDeEnvioDeApresentao = new E n l a c e ( $ s e m i n r i o > obterURL ( ) . " / apresentacao " , " Publicar apresentao " ) ; $ t e m p l a t e > a s s i g n ( " envioDeApresentacao " , $formulrioDeEnvioDeApresentao ); } } $ t e m p l a t e > a s s i g n ( " t i t u l o " , " S e m i n r i o " ) ; $ t e m p l a t e > a s s i g n ( " URLCadastramento " , D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / c a d a s t r a m e n t o " ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / S e m i n a r i o . t p l . php "); } } ?>

212

Listagem B.50: Arquivo: RecursoConrmacaoDeCadastroDeUsuario.inc.php


<? php c l a s s RecursoConfirmacaoDeCadastroDeUsuario extends Recurso { p u b l i c f u n c t i o n HEAD( R e q u i s i c a o $ r e q u i s i o ) { } p u b l i c f u n c t i o n OPTIONS ( R e q u i s i c a o $ r e q u i s i o ) { header ( Allow : GET , OPTIONS , HEAD ) ; } p u b l i c f u n c t i o n GET( R e q u i s i c a o $ r e q u i s i o ) { $ c h a v e S e c r e t a = $ r e q u i s i o >o b t e r V a r i v e l D a U R L ( " chaveSecreta " ) ; i f ( ! Cadastramentos : : existeComEstaChaveSecreta ( $chaveSecreta ) ) { header ( HTTP / 1 . 1 404 Not Found ) ; echo " R e c u r s o i n e x i s t e n t e " ; die ( ) ; } $ t e m p l a t e = $ t h i s > o b t e r R e p r e s e n t a o ( $ r e q u i s i o ) ; $ t e m p l a t e > a s s i g n ( " t i t u l o " , " C o n f i r m a o de Cadastramento " ) ; $cadastroTemporario = Cadastramentos : : obterPelaChaveSecreta ( $chaveSecreta ) ; $ t e m p l a t e > a s s i g n ( " c h a v e S e c r e t a " , $ c h a v e S e c r e t a ) ; $ t e m p l a t e > a s s i g n ( " URL_paraSubmisso " , $ c a d a s t r o T e m p o r a r i o >obterURL ( ) ) ; $ t e m p l a t e > a s s i g n ( " c o r r e i o E l e t r o n i c o " , $ c a d a s t r o T e m p o r a r i o > c o r r e i o E l e t r o n i c o ) ; $ t e m p l a t e > a s s i g n ( " n a o M o s t r a r E t i q u e t a D e A u t e n t i c a c a o " , true ) ; $ t e m p l a t e > d i s p l a y ( " / r e p r e s e n t a c o e s / F o r m u l a r i o D e C o n f i r m a c a o D e C a d a s t r o . t p l . php " ) ; } }

213 ?>

Listagem B.51: Arquivo: MensagemNaoPodeSerEnviada.inc.php


<? php c l a s s MensagemNaoPodeSerEnviada e x t e n d s E x c e p t i o n { } ?>

Listagem B.52: Arquivo: Mensageiro.inc.php


<? php c l a s s Mensageiro { private $carteiro ; p r i v a t e $enviarMensagens = true ; / / TODO: e x t r a i r e s t a s c o n f i g u r a e s . . p u b l i c f u n c t i o n Mensageiro ( MensagemDeCorreioEletronico $mensagem ) { i f ( $ t h i s >e n v i a r M e n s a g e n s ) { $ t h i s > c a r t e i r o = new PHPMailer ( ) ; $ t h i s > c a r t e i r o >IsSMTP ( ) ; $ t h i s > c a r t e i r o >H o s t = " e d u g r a f . u f s c . b r " ; / / $ t h i s >c a r t e i r o >Username = " d i s s e m i n a r i o " ; / / $ t h i s >c a r t e i r o >SMTPSecure = " t l s " ; / / $ t h i s >c a r t e i r o >SMTPAuth = t r u e ; / / $ t h i s >c a r t e i r o >Password = " publicadorDeSeminarios "; $ t h i s > c a r t e i r o >From = " d i s s e m i n a r i o @ e d u g r a f . ufsc . br " ; $ t h i s > c a r t e i r o >FromName = " D i s s e m i n r i o " ; $ t h i s > c a r t e i r o >C h a r S e t = " u t f 8" ; $ t h i s > c a r t e i r o >IsHTML ( t r u e ) ; $ t h i s > e n v i a r ( $mensagem ) ; }

214 } p r i v a t e f u n c t i o n e n v i a r ( M e n s a g e m D e C o r r e i o E l e t r o n i c o $mensagem ) { $ t h i s > c a r t e i r o >AddAddress ( $mensagem> obterDestinatrio () ) ; $ t h i s > c a r t e i r o > S u b j e c t = $mensagem> obterAssunto () ; $mensagem = new MensagemHTML ( $mensagem ) ; / / TODO: no p a r e c e s e r o m e l h o r l u g a r $ t h i s > c a r t e i r o >Body = $mensagem> obterContedo ( ) ; i f ( ! $ t h i s > c a r t e i r o >Send ( ) ) t h r o w new MensagemNaoPodeSerEnviada ( E r r o , a mensagem no pode s e r e n v i a d a p a r a . $mensagem> o b t e r D e s t i n a t r i o ( ) . pelo s e g u i n t e m o t i v o : . $mensagem> o b t e r D e s t i n a t r i o ( ) . $ t h i s > c a r t e i r o > E r r o r I n f o ) ; } } ?>

Listagem B.53: Arquivo: Requisicao.inc.php


<? php class Requisicao { private $url ; p r i v a t e $mtodo ; p r i v a t e $contedo ; private $rota ; public function Requisicao () { $ t h i s > u r l = $ t h i s >o b t e r U R L A t u a l ( ) ; $ t h i s >mtodo = $ t h i s >obterMtodoHTTP ( $_SERVER [ REQUEST_METHOD ] ) ; $ t h i s >c o n t e d o = &$ t h i s > l e r C o n t e d o ( ) ;

215 } p u b l i c f u n c t i o n o b t e r A r q u i v o ( $nome ) { r e t u r n new A r q u i v o ( $_FILES [ $nome ] [ name ] , $_FILES [ $nome ] [ tmp_name ] ) ; } p r i v a t e f u n c t i o n obterURLAtual ( ) { return urldecode ( ereg_replace ( "^" . Disseminario : : o b t e r U R L _ B a s e R e l a t i v a ( ) , " " , $_SERVER [ REQUEST_URI ]) ) ; } p u b l i c f u n c t i o n obterURLCompleta ( ) { r e t u r n D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . $ t h i s > u r l ; } p u b l i c f u n c t i o n obterURL ( ) { r e t u r n $ t h i s > u r l ; } p u b l i c f u n c t i o n o b t e r V a r i v e l D a U R L ( $nome ) { r e t u r n $ t h i s > r o t a >o b t e r V a r i v e l D a U R L ( $nome ) ; } public function obterContedo ( ) { r e t u r n $ t h i s >c o n t e d o ; } p u b l i c f u n c t i o n a s s u m i r R o t a ( Rota $ r o t a ) { $ t h i s > r o t a = $ r o t a ; $ r e c u r s o = $ r o t a > o b t e r R e c u r s o ( $ t h i s ) ; $ r e c u r s o > t r a t a r R e q u i s i o ( $ t h i s ) ; } public function temCredenciais () { r e t u r n $_SERVER [ PHP_AUTH_USER ] ! = n u l l && $_SERVER [ PHP_AUTH_PW ] ! = n u l l ;

216 } / / TODO: r e n o m e a r p u b l i c f u n c t i o n obterNomeDeUsurio ( ) { r e t u r n $_SERVER [ PHP_AUTH_USER ] ; } public function obterSenha ( ) { r e t u r n $_SERVER [ PHP_AUTH_PW ] ; } p u b l i c f u n c t i o n o b t e r V a r i v e l D e C o n s u l t a ( $nome ) { $ v a r i v e i s = &$ t h i s > o b t e r V a r i v e i s D e C o n s u l t a ( ) ; r e t u r n $ v a r i v e i s [ $nome ] ; } public function obterVariveisDeConsulta () { i f ( $ t h i s >o b t e r M t o d o ( ) == GET ) r e t u r n $_GET ; r e t u r n $_POST ; } p u b l i c f u n c t i o n obterParmetrosDaURL ( ) { r e t u r n $_GET ; } p u b l i c f u n c t i o n o b t e r P a r m e t r o D a U R L ( $nome ) { r e t u r n $_GET [ $nome ] ; } public function lerContedo () { $ d a d o s = f o p e n ( " php : / / i n p u t " , " r " ) ; w h i l e ( $ b u f f e r = f r e a d ( $dados , 1 0 2 4 0 ) ) { $contudoLido .= $buffer ; } f c l o s e ( $dados ) ; unset ( $ b u f f e r ) ; r e t u r n $contudoLido ;

217 } p u b l i c f u n c t i o n obterMtodo ( ) { r e t u r n $ t h i s >mtodo ; } p r i v a t e f u n c t i o n obterMtodoHTTP ( $mtodo ) { i f ( $mtodo == "POST" && ( $_POST [ " _method " ] _method " ] ) ) { $mtodo = s t r t o u p p e r ( $_POST [ " _method " ] ) ; i f ( ! i s s e t ( $_POST [ " _method " ] ) ) $mtodo = s t r t o u p p e r ( $_GET [ " _method " ]) ; i f ( $mtodo == "GET" ) { $_GET = $_POST ; u n s e t ( $_POST ) ; } u n s e t ( $_POST [ _method ] ) ; } r e t u r n $mtodo ; } public f u n c t i o n obterDadosDoFormulrio ( ) { i f ( $ t h i s >mtodo == "POST" ) r e t u r n $_POST ; e l s e i f ( $ t h i s >mtodo == "PUT" ) { $dadosDoFormulrio = array ( ) ; p a r s e _ s t r ( $ t h i s >o b t e r C o n t e d o ( ) , $dadosDoFormulrio ) ; r e t u r n $dadosDoFormulrio ; } } public function Autenticada () { r e t u r n $ t h i s > o b t e r V a r i v e l D e C o n s u l t a ( " a u t e n t i c a r " ) == " v e r d a d e i r o " ; | | $_GET [ "

218 } } ?>

Listagem B.54: Arquivo: ArquivoDeConteudo.inc.php


<? php c l a s s ArquivoDeConteudo { p r i v a t e $contedo ; p r i v a t e $nome ; p u b l i c f u n c t i o n A r q u i v o D e C o n t e u d o ( $nome , $ c o n t e d o ) { $ t h i s >nome = $nome ; $ t h i s >c o n t e d o = &$ c o n t e d o ; } p u b l i c f u n c t i o n obterNome ( ) { r e t u r n $ t h i s >nome ; } public function obterContedo ( ) { r e t u r n $ t h i s >c o n t e d o ; } } ?>

Listagem B.55: Arquivo: Arquivo.inc.php


<? php c l a s s Arquivo { p r i v a t e $caminho ; p r i v a t e $contedo ; p r i v a t e $nome ; p u b l i c f u n c t i o n A r q u i v o ( $nome , $caminho ) { i f ( ! f i l e _ e x i s t s ( $caminho ) ) t h r o w new E x c e p t i o n ( " A r q u i v o no E x i s t e " ) ; $ t h i s >caminho = $caminho ;

219 $ t h i s >nome = $nome ; } p u b l i c f u n c t i o n obterNome ( ) { r e t u r n $ t h i s >nome ; } public function obterContedo ( ) { $ p o n t e i r o P a r a A r q u i v o = f o p e n ( $ t h i s >caminho , r ) ; $contedo = fread ( $ponteiroParaArquivo , f i l e s i z e ( $ t h i s >caminho ) ) ; fclose ( $ponteiroParaArquivo ) ; r e t u r n $contedo ; } public f u n c t i o n fixarContedo ( $conteudo ) { $ p o n t e i r o P a r a A r q u i v o = f o p e n ( $ t h i s >caminho , w ) ; f w r i t e ( $ponteiroParaArquivo , $conteudo ) ; fclose ( $ponteiroParaArquivo ) ; } public function apagar ( ) { u n l i n k ( $ t h i s >caminho ) ; } } ?>

Listagem B.56: Arquivo: AutenticacaoBasica.inc.php


<? php class AutenticacaoBasica extends Annotation { } ?>

Listagem B.57: Arquivo: AutenticacaoCondicional.inc.php


<? php class AutenticacaoCondicional extends Annotation {

220 } ?>

Listagem B.58: Arquivo: Roteador.inc.php


<? php c l a s s Roteador { private $requisio ; private $rotas ; public function Roteador ( Requisicao $ r e q u i s i o ) { $ t h i s > r e q u i s i o = $ r e q u i s i o ; } public function rotear () { $ r o t a s P o s s v e i s = $ t h i s > o b t e r R o t a s P o s s v e i s ( ) ; i f ( s i z e o f ( $ r o t a s P o s s v e i s ) > 0) { $ t h i s > r e q u i s i o >a s s u m i r R o t a ( $rotasPossveis [0]) ; } else { header ( HTTP / 1 . 1 404 R e s o u r c e n o t f o u n d ) ; include_once r e p r e s e n t a c o e s / 4 0 4 . html ; die ( ) ; } } public function incluirRota ( $rota ) { $ t h i s > r o t a s [ ] = $ r o t a ; } private function obterRotasPossveis () { $ r o t a s = array ( ) ; f o r e a c h ( $ t h i s > r o t a s a s $umaRota ) { i f ( $umaRota > c a s a r ( $ t h i s > r e q u i s i o ) ) $ r o t a s [ ] = $umaRota ; } return $rotas ;

221 } } ?>

Listagem B.59: Arquivo: Rota.inc.php


<? php c l a s s Rota { p r i v a t e $padroCompleto ; p r i v a t e $padro ; private $recurso ; p r i v a t e $variveisDaURL ; private $requisio ; const delimitadoresDeVariveis = " [ / ; , ] " ; p u b l i c f u n c t i o n Rota ( $padro , $ r e c u r s o ) { $ t h i s >p a d r o C o m p l e t o = $ p a d r o ; $ t h i s >p a d r o = " ^ " . e r e g _ r e p l a c e ( " { [ ^ / ; , ] + } " , " ( [ ^ / ; , ] + ) " , $padro ) . " ( / ) ? ( \ ? . + ) ?$" ; $ t h i s > r e c u r s o = $ r e c u r s o ; } public function casar ( Requisicao $requisio ) { r e t u r n e r e g ( $ t h i s >p a d r o , $ r e q u i s i o >obterURL ( ) ) ; } p r i v a t e f u n c t i o n obterVariveisDaURL ( ) { $ v a r i v e i s = array ( ) ; $padroEmPedaos = s p l i t ( s e l f : : d e l i m i t a d o r e s D e V a r i v e i s , $ t h i s >p a d r o C o m p l e t o ) ; $urlSemVariveisDeConsulta = array_slice ( s p l i t ( \? , $ t h i s > r e q u i s i o >obterURL ( ) ) , 0 , 1 ) ; $urlEmPedaos = s p l i t ( s e l f : : d e l i m i t a d o r e s D e V a r i v e i s , $urlSemVariveisDeConsulta [ 0 ] ) ; $ p e d a o s C o m b i n a d o s = a r r a y _ c o m b i n e ( $padroEmPedaos , a r r a y _ s l i c e ( $urlEmPedaos , 0 , s i z e o f ( $padroEmPedaos ) ) ) ;

222 f o r e a c h ( $ p e d a o s C o m b i n a d o s a s $ p e d a o D o P a d r o => $pedaoDaUrl ) i f ( $pedaoDoPadro != $pedaoDaUrl ) $ v a r i v e i s [ t r i m ( $pedaoDoPadro , " {} " ) ] = $pedaoDaUrl ; return $variveis ; } p u b l i c f u n c t i o n o b t e r V a r i v e l D a U R L ( $nome ) { r e t u r n $ t h i s >v a r i v e i s D a U R L [ $nome ] ; } / r e t u r n Recurso / public function obterRecurso ( Requisicao $requisio ) { $ t h i s > r e q u i s i o = $ r e q u i s i o ; $ t h i s >v a r i v e i s D a U R L = $ t h i s >o b t e r V a r i v e i s D a U R L ( ) ; r e t u r n new $ t h i s > r e c u r s o ; } } ?>

Listagem B.60: Arquivo: index.php


<? php r e q u i r e _ o n c e dirname ( __FILE__ ) . " / c o n f i g u r a c a o . i n c . php " ; $ r o t e a d o r = new R o t e a d o r ( new R e q u i s i c a o ( ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / " , " R e c u r s o S e m i n a r i o s " ) ) ; / / TODO: r e n o m e a r $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / c a d a s t r a m e n t o / f i n a l i z a c a o / { chaveSecreta }" , " RecursoConfirmacaoDeCadastroDeUsuario " ) ) ;

223 $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / c a d a s t r a m e n t o " , " RecursoCadastroDeUsuario " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / c a d a s t r a m e n t o / { c o r r e i o E l e t r o n i c o } " , " RecursoCadastramento " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / p r o p o s t a D e S e m i n a r i o " , " RecursoPropostaDeSeminario " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / p r o p o s t a s D e S e m i n a r i o " , " RecursoPropostasDeSeminario " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / p r o p o s t a D e S e m i n a r i o / { c o d i g o } " , " RecursoUmaPropostaDeSeminario " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / s e m i n a r i o s " , " R e c u r s o S e m i n a r i o s " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / a d m i n i s t r a d o r / { c o r r e i o E l e t r o n i c o } " , " RecursoAdministrador " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / a d m i n i s t r a d o r e s " , " RecursoAdministradores " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / c o o r d e n a d o r / { c o r r e i o E l e t r o n i c o } " , " RecursoCoordenador " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / c o o r d e n a d o r e s " , " RecursoCoordenadores " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / u s u a r i o / { c o r r e i o E l e t r o n i c o } " , " RecursoUsuario " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / u s u a r i o s " , " R e c u r s o U s u a r i o s " ) ) ; / / TODO: c o r r i g i r p r o b l e m a da p r e c e d n c i a $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / { nomeParaURL } " , " R e c u r s o S e m i n a r i o " ) ); $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / { nomeParaURL } / p a r t i c i p a n t e / { correioEletronico }" , " RecursoUmParticipante " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / { nomeParaURL } / p a r t i c i p a n t e s " , " RecursoParticipantes " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / { nomeParaURL } / a p r e s e n t a c a o " , " RecursoApresentacao " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / { nomeParaURL } / a p r e s e n t a c a o / { tituloParaURL } " , " RecursoUmaApresentacao " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / { nomeParaURL } / a p r e s e n t a c a o / { t it ul oP ar aU RL } / { a r q u i v o } " , " RecursoUmArquivoDeApresentacao " ) ) ; $ r o t e a d o r > i n c l u i r R o t a ( new R o t a ( " / { nomeParaURL } / a p r e s e n t a c o e s " , " RecursoApresentacoes " ) ) ; $ r o t e a d o r > r o t e a r ( ) ;

224 ?>

Listagem B.61: Arquivo: PropostaDeSeminarioComFormulario.tpl.php


< s c r i p t type =" t e x t / j a v a s c r i p t "> function enviar () { document . f o r m s . f o r m u l a r i o D e C a d a s t r o . a c t i o n = <? php e c h o $ t h i s >URL_paraSubmisso ; ?> ; r e t u r n true ; } </ s c r i p t > <dl c l a s s =" p r o p o s t a "> < d t c l a s s = " p r o p o n e n t e " > P r o p o n e n t e : < / d t ><dd ><a c l a s s = " URLDoProponente " h r e f = " <? php e c h o $ t h i s > p r o p o s t a > P r o p o n e n t e >obterURL ( ) ; ?> " ><? php echo $ t h i s > p r o p o s t a > P r o p o n e n t e >nome ? > </ a > </ dd > < d t c l a s s = " r a m a l " >Ramal : < / d t > <dd ><? php echo $ t h i s > p r o p o s t a >ramalUFSC ; ? > </ dd > < d t c l a s s = " d a t a D e T e r m i n o " > D a t a de Trmino : < / d t > <dd ><? php $ d a t a D e T e r m i n o = new D a t a ( $ t h i s > p r o p o s t a > dataDeTermino ) ; echo $ d a t a D e T e r m i n o > n o F o r m a t o B r a s i l e i r o ( ) ; ? > </ dd > < d t c l a s s = " d a t a D e I n i c i o " > D a t a de I n c i o : < / d t > <dd ><? php $ d a t a D e I n i c i o = new D a t a ( $ t h i s > p r o p o s t a > dataDeInicio ) ; echo $ d a t a D e I n i c i o > n o F o r m a t o B r a s i l e i r o ( ) ; ? > </ dd > < d t c l a s s = " t i t u l o " > T t u l o : < / d t > <dd ><? php echo $ t h i s > p r o p o s t a > t i t u l o ; ? > </ dd > < d t c l a s s = " d e s c r i c a o " > D e s c r i o : < / d t > <dd ><? php echo $ t h i s > p r o p o s t a > d e s c r i c a o ; ? > </ dd > < d t c l a s s = " i n s c r i c a o " > I n s c r i o : < / d t > <dd ><? php echo $ t h i s > p r o p o s t a > i n s c r i c a o ; ? > </ dd > < d t c l a s s = " d i s p o n i b i l i d a d e " > D i s p o n i b i l i d a d e : < / d t > <dd ><? php echo $ t h i s > p r o p o s t a > d i s p o n i b i l i d a d e ; ? > </ dd > < d t c l a s s = " a s s i s t e n c i a " > A s s i s t n c i a : < / d t > <dd ><? php echo $ t h i s > p r o p o s t a > a s s i s t e n c i a ; ? > </ dd >

225 < d t c l a s s = " i n s t r u c o e s " > I n s t r u e s : < / d t > <dd ><? php echo $ t h i s > p r o p o s t a > i n s t r u c o e s ; ? > </ dd > < d t c l a s s = " e s t a d o " > E s t a d o : < / d t > <dd ><? php echo $ t h i s > p r o p o s t a > e s t a d o ; ? > </ dd > </ dl > <? php i f ( $ t h i s > p r o p o s t a > e s t a d o == " p e n d e n t e " ) : ?> < form i d = " f o r m u l a r i o D e C a d a s t r o " a c t i o n = " " method = " p o s t " o n s u b m i t = " return enviar () " > < i n p u t name= " _method " t y p e = " h i d d e n " v a l u e = "PUT" / > < i n p u t name= " a p r o v a d a " t y p e = " h i d d e n " v a l u e = " v e r d a d e i r o " / > < i n p u t name= " b o t a o E n v i a r " t y p e = " s u b m i t " v a l u e = " A p r o v a r " / > </ form > <? php e n d i f ; ?>

Listagem B.62: Arquivo: Enlace.inc.php


<? php c l a s s Enlace { p r i v a t e $URL ; private $texto ; p u b l i c f u n c t i o n E n l a c e ( $URL , $ t e x t o ) { $ t h i s >URL = $URL ; $ t h i s > t e x t o = $ t e x t o ; } p u b l i c f u n c t i o n obterURL ( ) { r e t u r n $ t h i s >URL ; } public function obterTexto () { r e t u r n $ t h i s > t e x t o ; } } ?>

Listagem B.63: Arquivo: FormularioEnvioDeApresentacao.tpl.php


< s c r i p t type =" t e x t / j a v a s c r i p t ">

226 / / TODO: e x t r a i r function capitalizar ( texto ) { var textoQuebrado = texto . s p l i t ( ) ; var t e x t o F i n a l = ; f o r ( v a r i = 0 ; i < t e x t o Q u e b r a d o . l e n g t h ; i ++) { t e x t o F i n a l += t e x t o Q u e b r a d o [ i ] . c h a r A t ( 0 ) . t o U p p e r C a s e ( ) + textoQuebrado [ i ] . s u b s t r i n g (1) ; } return textoFinal ; } f u n c t i o n removerAcentos ( t e x t o ) { v a r A c e n t o s = " " ; v a r T r a d u c a o = " aaaaaAAAAeeEEiIoooOOOuuuUUcC " ; var Posic , Carac ; v a r TempLog = " " ; f o r ( v a r i = 0 ; i < t e x t o . l e n g t h ; i ++) { Carac = t e x t o . charAt ( i ) ; Posic = Acentos . indexOf ( Carac ) ; TempLog += T r a d u c a o . c h a r A t ( P o s i c ) ; else TempLog += t e x t o . c h a r A t ( i ) ; } r e t u r n TempLog ; } f u n c t i o n fazerSugestaoDeURL ( ) { v a r umTexto = document . g e t E l e m e n t B y I d ( tituloNaoNormalizado ) . value ; umTexto = r e m o v e r A c e n t o s ( umTexto ) ; umTexto = c a p i t a l i z a r ( umTexto ) ; v a r nomeNormalizado = umTexto . r e p l a c e ( / [ ^ azAZ0 9]+/ g, ) ; document . g e t E l e m e n t B y I d ( t i t u l o ) . v a l u e = nomeNormalizado ; i f ( P o s i c > 1)

227 document . g e t E l e m e n t B y I d ( n o m e P a r a U R L V i s i v e l ) . v a l u e = <? php e c h o $ t h i s >s e m i n a r i o >obterURL ( ) . " / a p r e s e n t a c a o / " ; ?> + nomeNormalizado ; } function corrigirAction () { v a r e r r o s = new A r r a y ( ) ; i f ( document . g e t E l e m e n t B y I d ( t i t u l o N a o N o r m a l i z a d o ) . v a l u e == ) { e r r o s . p u s h ( Voc d e v e f o r n e c e r um t t u l o ) ; } i f ( document . g e t E l e m e n t B y I d ( a r q u i v o ) . v a l u e == ) { e r r o s . p u s h ( Voc d e v e f o r n e c e r um a r q u i v o ) ; } else { i f ( ! v a l i d a r A r q u i v o ( document . g e t E l e m e n t B y I d ( a r q u i v o ))) { e r r o s . p u s h ( O a r q u i v o d e v e s e r . p p t , . odp ou . pdf ) ; } } i f ( e r r o s . length > 0) { var errosConcatenados = ; for ( var erro in erros ) { errosConcatenados = errosConcatenados + + erros [ erro ] + \ n ; } a l e r t ( errosConcatenados ) ; return false } document . f o r m s . f o r m u l a r i o E n v i o D e A p r e s e n t a c a o . a c t i o n = <? php e c h o $ t h i s >URL_paraSubmisso ; ?> + / + document . g e t E l e m e n t B y I d ( t i t u l o ) . v a l u e + ? a u t e n t i c a r = v e r d a d e i r o& _method = p u t ; r e t u r n true ;

228 } f u n c t i o n v a l i d a r A r q u i v o ( campo ) { i f ( / . \ . ( p p t ) | ( odp ) | ( p d f ) | ( doc ) $ / . t e s t ( campo . v a l u e . toLowerCase ( ) ) ) r e t u r n true ; campo . f o c u s ( ) ; return false ; } </ s c r i p t > < s t y l e type =" t e x t / css "> . d e s a b i l i t a d a { b a c k g r o u n d c o l o r : w h i t e ; c o l o r : b l a c k ; } ; </ s t y l e >

<? php echo $ t h i s > u r l ( $ t h i s >s e m i n a r i o >obterURL ( ) , " V o l t a r p a r a o seminrio " ) ; ?>

<h2 ><? php echo $ t h i s > t i t u l o ? > </ h2 > < form i d = " f o r m u l a r i o E n v i o D e A p r e s e n t a c a o " a c t i o n = " <? php e c h o $ t h i s >URL_paraSubmisso ; ?> " e n c t y p e = " m u l t i p a r t / formd a t a " o n S u b m i t = " r e t u r n c o r r i g i r A c t i o n ( ) " method = " p o s t " > <p> T t u l o : < i n p u t t y p e = " t e x t " i d = " t i t u l o N a o N o r m a l i z a d o " name= " t i t u l o N a o N o r m a l i z a d o " s i z e = " 40 " o n c h a n g e = " f a z e r S u g e s t a o D e U R L ( ) " onkeyup = " f a z e r S u g e s t a o D e U R L ( ) " / > </ p> < i n p u t t y p e = " h i d d e n " i d = " t i t u l o " name= " t i t u l o " / > <p> Sua a p r e s e n t a o e s t a r d i s p o n v e l em : < b r / > < i n p u t t y p e = " t e x t " c l a s s = " d e s a b i l i t a d a " i d = " n o m e P a r a U R L V i s i v e l " name= " n o m e P a r a U R L V i s i v e l " s i z e = " 100 " d i s a b l e d = " d i s a b l e d " / > </ p> <p> A r q u i v o : < i n p u t t y p e = " f i l e " i d = " a r q u i v o " name= " a r q u i v o " / > </ p>

229 <h4 > Nota : O a r q u i v o d e v e s e r . p p t , . odp ou . p d f e t e r no mximo 2 MB de tamanho . </ h4 > < i n p u t t y p e = " h i d d e n " name= " _method " v a l u e = "PUT" / > < i n p u t name= " b o t a o E n v i a r " t y p e = " s u b m i t " v a l u e = " E n v i a r " / > </ form >

Listagem B.64: Arquivo: Participante.tpl.php


<? php / / TODO: c o r r i g i r : d o c t r i n e c o n s i d e r a P a r t i c i p a n t e > S e m i n a r i o [ 1 , n ] . . e c o n s i d e r a p a r t i c i p a n t e >S e m i n a r i o uma c o l e o echo $ t h i s > u r l ( $ t h i s > p a r t i c i p a n t e >S e m i n a r i o [0] > obterURL ( ) , " Voltar para P a r t i c i p a n t e s " ) ; ?> <dl c l a s s =" p a r t i c i p a n t e "> < d t c l a s s = " nome " >Nome < / d t > <dd ><? php echo $ t h i s > p a r t i c i p a n t e >nome ; ? > </ dd > < d t c l a s s = " c o r r e i o E l e t r o n i c o " > E n d e r e o de C o r r e i o E l e t r n i c o < / d t > <dd ><? php echo $ t h i s > p a r t i c i p a n t e > c o r r e i o E l e t r o n i c o ; ? > </ dd > </ dl >

Listagem B.65: Arquivo: Cadastramento.tpl.php


<dl c l a s s =" cadastroTemporarioDeUsuario "> < d t c l a s s = " c o r r e i o E l e t r o n i c o " > E n d e r e o de C o r r e i o E l e t r n i c o < / d t > <dd ><? php echo $ t h i s > c a d a s t r o > c o r r e i o E l e t r o n i c o ; ? > </ dd > < d t c l a s s = " c h a v e S e c r e t a " >Chave S e c r e t a < / d t > <dd ><? php echo $ t h i s > c a d a s t r o > c h a v e S e c r e t a ; ? > </ dd > </ dl >

Listagem B.66: Arquivo: FormularioDeConrmacaoDeCadastro.tpl.php


< s c r i p t s r c = " <? php e c h o D i s s e m i n a r i o : : o b t e r U R L _ B a s e C o m p l e t a ( ) . " / " ?> j s / p r o t o t y p e / p r o t o t y p e . j s " t y p e = " t e x t / j a v a s c r i p t " > </ s c r i p t > < s c r i p t type =" t e x t / j a v a s c r i p t "> function senhaConfere ( ) { r e t u r n document . g e t E l e m e n t B y I d ( s e n h a ) . v a l u e == document . g e t E l e m e n t B y I d ( s e n h a C o n f i r m a c a o ) . v a l u e ; }

230

f u n c t i o n e s t P r e e n c h i d o ( nome ) { v a r nome = document . g e t E l e m e n t B y I d ( nome ) . v a l u e ; r e t u r n nome . l e n g t h ! = 0 && nome ! = n u l l ; } / / TODO: f a t o r a r function formulrioVlido () { i f ( ! e s t P r e e n c h i d o ( nome ) ) { a l e r t ( O nome o b r i g a t r i o ) ; return false ; } i f ( ! e st Pr ee nch id o ( senha ) senhaConfirmacao ) ) { a l e r t ( A s e n h a e a c o n f i r m a o s o obrigatrias ) ; return false ; } i f ( ! senhaConfere ( ) ) { a l e r t ( Senha e a c o n f i r m a o no c o n f e r e m ) ; return false ; } r e t u r n true ; } function enviarFormulario () { var t r a n s p o r t = ( new Ajax . R e q u e s t ( <? php e c h o $ t h i s >URL_paraSubmisso ; ?> , { method : p u t , postBody : $ ( formularioDeConfirmacaoDeCadastro ) . serialize () , asynchronous : false , } ) ) . transport ; || ! estPreenchido (

231

autenticar () ; } function autenticar () { var t r a n s p o r t = ( new Ajax . R e q u e s t ( <? php e c h o $ t h i s >URL_paraSubmisso ; ?> , { method : p u t , postBody : $ ( formularioDeConfirmacaoDeCadastro ) . serialize () , asynchronous : false , httpUserName : $ ( c o r r e i o E l e t r o n i c o ) , httpPassword : $ ( senha ) } ) ) . transport ; } </ s c r i p t > <? php echo $ t h i s > u r l ( S e m i n a r i o s : : obterURL ( ) , " Todos o s s e m i n r i o s " , " r a i z " ) ; ?> <h2 > F i n a l i z a o de C a d a s t r a m e n t o < / h2 > < form i d = " f o r m u l a r i o D e C o n f i r m a c a o D e C a d a s t r o " a c t i o n = " <? php e c h o $ t h i s >URL_paraSubmisso ; ?> " o n s u b m i t = " r e t u r n f o r m u l r i o V l i d o ( ) " method = " p o s t " > Caro u s u r i o ( a ) , i n f o r m e s e u s d a d o s e c l i q u e em F i n a l i z a r Cadastramento , para f i n a l i z a r o cadastramento . <br / > <br /> <table > <tr > < t d >Nome : </ t d > < t d >< i n p u t i d = " nome " name= " nome " t y p e = " t e x t " v a l u e = " " / > </ t d > </ t r > <tr > < t d > Senha : </ t d >< t d >< i n p u t i d = " s e n h a " name= " s e n h a " t y p e = " password " v a l u e =" " / > </ td > </ t r > <tr >

232 < t d > C o n f i r m a o da s e n h a : </ t d >< t d >< i n p u t i d = " s e n h a C o n f i r m a c a o " name= " s e n h a C o n f i r m a c a o " t y p e = " p a s s w o r d " v a l u e =" " / > </ td > </ t r > </ t a b l e > <br / > < i n p u t name= " _method " t y p e = " h i d d e n " v a l u e = "PUT" / > < i n p u t name= " c o r r e i o E l e t r o n i c o " t y p e = " h i d d e n " v a l u e = " <? php e c h o $ t h i s > c o r r e i o E l e t r o n i c o ?> " / > < i n p u t name= " c h a v e S e c r e t a " t y p e = " h i d d e n " v a l u e = " <? php e c h o $ t h i s > c h a v e S e c r e t a ?> " / > < b u t t o n name= " e n v i a r " t y p e = " b u t t o n " o n c l i c k = " e n v i a r F o r m u l a r i o ( ) "> F i n a l i z a r Cadastramento </ button > </ form >

Listagem B.67: Arquivo: FormularioPropostaDeSeminario.tpl.php


< s c r i p t type =" t e x t / j a v a s c r i p t "> function capitalizar ( texto ) { var textoQuebrado = texto . s p l i t ( ) ; var t e x t o F i n a l = ; f o r ( v a r i = 0 ; i < t e x t o Q u e b r a d o . l e n g t h ; i ++) { t e x t o F i n a l += t e x t o Q u e b r a d o [ i ] . c h a r A t ( 0 ) . t o U p p e r C a s e ( ) + textoQuebrado [ i ] . s u b s t r i n g (1) ; } return textoFinal ; } f u n c t i o n removerAcentos ( t e x t o ) { v a r A c e n t o s = " " ; v a r T r a d u c a o = " aaaaaAAAAeeEEiIoooOOOuuuUUcC " ; var Posic , Carac ; v a r TempLog = " " ; f o r ( v a r i = 0 ; i < t e x t o . l e n g t h ; i ++) { Carac = t e x t o . charAt ( i ) ; Posic = Acentos . indexOf ( Carac ) ; TempLog += T r a d u c a o . c h a r A t ( P o s i c ) ; i f ( P o s i c > 1)

233 else TempLog += t e x t o . c h a r A t ( i ) ; } r e t u r n TempLog ; } f u n c t i o n v a l i d a r D a t a ( campo ) { v a r expReg = / ^ ( ( [ 0 2 ] \ d | [ 3 ] [ 0 1 ] ) \ / ( [ 0 ] \ d | [ 1 ] [ 0 2 ] ) \ / [ 1 2 ] [ 0 9 ] \ d {2}) $ / ; i f ( campo . v a l u e . match ( expReg ) ) { r e t u r n true ; } return false ; } / / TODO: e x t r a i r v a l i d a o function enviar () { v a r e r r o s = new A r r a y ( ) ; i f ( document . g e t E l e m e n t B y I d ( t i t u l o ) . v a l u e == ) e r r o s . push ( T t u l o v a z i o ) ; i f ( document . g e t E l e m e n t B y I d ( ramalUFSC ) . v a l u e == ) e r r o s . p u s h ( Seu nmero de r a m a l o b r i g a t r i o ) ; i f ( document . g e t E l e m e n t B y I d ( d a t a D e I n i c i o ) . v a l u e == | | document . g e t E l e m e n t B y I d ( d a t a D e T e r m i n o ) . v a l u e == ) { e r r o s . p u s h ( P e r o d o de r e a l i z a o o b r i g a t r i o ) ; } else { i f ( ! v a l i d a r D a t a ( document . g e t E l e m e n t B y I d ( d a t a D e I n i c i o )) || ! document . g e t E l e m e n t B y I d ( d a t a D e T e r m i n o ) ) f o r m a t o dd /mm/ a a a a ) ; } i f ( e r r o s . length > 0) { var errosConcatenados = ; for ( var erro in erros ) { e r r o s . p u s h ( P e r o d o d e v e c o n t e r d a t a s no

234 errosConcatenados = errosConcatenados + + erros [ erro ] + \ n ; } a l e r t ( errosConcatenados ) ; return false } r e t u r n true ; } f u n c t i o n fazerSugestaoDeURL ( ) { v a r umTexto = document . g e t E l e m e n t B y I d ( t i t u l o ) . v a l u e ; umTexto = r e m o v e r A c e n t o s ( umTexto ) ; umTexto = c a p i t a l i z a r ( umTexto ) ; v a r n o m e D o S e m i n a r i o N o r m a l i z a d o = umTexto . r e p l a c e ( / [ ^ azAZ0 9]+/ g , ) ; document . g e t E l e m e n t B y I d ( nomeParaURL ) . v a l u e = nomeDoSeminarioNormalizado ; document . g e t E l e m e n t B y I d ( n o m e P a r a U R L V i s i v e l ) . v a l u e = <? php echo D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / s e m i n a r i o / " ; ?> + n o m e D o S e m i n a r i o N o r m a l i z a d o ; } </ s c r i p t > <? php echo $ t h i s > u r l ( S e m i n a r i o s : : obterURL ( ) , " V o l t a r p a r a t o d o s o s s e m i n r i o s " , " r a i z " ) ; ?> <h2 > P r o p o s t a de S e m i n r i o < / h2 > < form i d = " f o r m u l a r i o D e P r o p o s t a " a c t i o n = " <? php e c h o $ t h i s > URL_paraSubmisso ; ?> " method = " p o s t " o n s u b m i t = " r e t u r n e n v i a r ( ) "> <p > : Campos o b r i g a t r i o s < / p> <p> T t u l o : < / p> < i n p u t t y p e = " t e x t " i d = " t i t u l o " name= " t i t u l o " s i z e = " 100 " o n c h a n g e = " f a z e r S u g e s t a o D e U R L ( ) " onkeyup = " fazerSugestaoDeURL ( ) " / > <p>Seu s e m i n r i o p o d e r s e r a c e s s a d o no e n d e r e o : </ p>

235 < i n p u t t y p e = " t e x t " i d = " n o m e P a r a U R L V i s i v e l " name= " nomeParaURL " d i s a b l e d = " d i s a b l e d " s i z e = " 50 " / > < i n p u t t y p e = " h i d d e n " i d = " nomeParaURL " name= " nomeParaURL " / > <p> D e s c r i o : < / p> < t e x t a r e a i d = " d e s c r i c a o " name= " d e s c r i c a o " rows = " 2 " c o l s = " 80 " > </ t e x t a r e a > <br / > <p> I n s t r u e s : < / p> < t e x t a r e a i d = " i n s t r u c o e s " name= " i n s t r u c o e s " rows = " 2 " c o l s = " 80 " > </ t e x t a r e a > <br / > <p> T i p o de I n s c r i o : < s e l e c t i d = " i n s c r i c a o " name= " i n s c r i c a o " > < o p t i o n value =" p u b l i c a ">Pblica </ option > < o p t i o n s e l e c t e d =" s e l e c t e d " value =" convidados "> Somente p a r a C o n v i d a d o s < / o p t i o n > </ s e l e c t > </ p> <p> Assistncia : < s e l e c t i d = " a s s i s t e n c i a " name= " a s s i s t e n c i a " > < o p t i o n value =" p u b l i c a ">Pblica </ option > < o p t i o n s e l e c t e d =" s e l e c t e d " value =" p a r t i c i p a n t e s "> Somente p a r a P a r t i c i p a n t e s < / o p t i o n > < o p t i o n v a l u e = " s e m A s s i s t e n c i a " >Sem A s s i s t n c i a < / option > </ s e l e c t > </ p> <p> D i s p o n i b i l i d a d e dos R e s u l t a d o s : < s e l e c t id =" d i s p o n i b i l i d a d e "> < o p t i o n value =" p u b l i c a ">Pblica </ option > < o p t i o n s e l e c t e d =" s e l e c t e d " value =" convidados "> Somente p a r a P a r t i c i p a n t e s < / o p t i o n > </ s e l e c t > </ p> <p> P e r o d o de R e a l i z a o ( dd /mm/ a a a a ) :

236 < i n p u t t y p e = " t e x t " name= " d a t a D e I n i c i o " i d = " d a t a D e I n i c i o " v a l u e = " " s i z e = " 10 " / > < i n p u t t y p e = " t e x t " name= " d a t a D e T e r m i n o " i d = " d a t a D e T e r m i n o " v a l u e = " " s i z e = " 10 " / > </ p> <p> Ramal UFSC : < i n p u t t y p e = " t e x t " i d = " ramalUFSC " name= " ramalUFSC " v a l u e = " " s i z e ="4" / > </ p> < i n p u t name= " b o t a o E n v i a r " t y p e = " s u b m i t " v a l u e = " C o n f i r m a r " / > </ form > < s c r i p t type =" t e x t / j a v a s c r i p t "> document . g e t E l e m e n t B y I d ( t i t u l o ) . f o c u s ( ) ; </ s c r i p t >

Listagem B.68: Arquivo: Usuario.tpl.php


<? php echo $ t h i s > u r l ( U s u a r i o s : : obterURL ( ) , " Todos o s u s u r i o s " ) ; ?> <dl c l a s s =" u s u a r i o "> < d t c l a s s = " nome " >Nome < / d t > <dd ><? php echo $ t h i s > u s u a r i o > nome ; ? > </ dd > < d t c l a s s = " c o r r e i o E l e t r o n i c o " > E n d e r e o de C o r r e i o E l e t r n i c o < / d t > <dd ><? php echo $ t h i s > u s u a r i o > c o r r e i o E l e t r o n i c o ; ? > </ dd > <? php i f ( $ t h i s > u s u a r i o > C o o r d e n a d o r ( ) ) : ?> < d t c l a s s = " ramalUFSC " >Ramal UFSC : </ d t > <dd ><? php echo $ t h i s > u s u a r i o >ramalUFSC ? > </ dd > <? php e n d i f ; ?> </ dl >

Listagem B.69: Arquivo: UmaApresentacao.tpl.php


<? php echo $ t h i s > u r l ( $ t h i s > a p r e s e n t a o >S e m i n a r i o > o b t e r U R L D e A p r e s e n t a e s ( ) , " V o l t a r p a r a A p r e s e n t a e s " ) ; ?> <dl c l a s s =" a p r e s e n t a c a o "> < d t c l a s s = " t i t u l o " > T t u l o : < / d t ><dd ><? php echo $ t h i s > a p r e s e n t a o > t i t u l o ; ? > </ dd > < d t c l a s s = " a r q u i v o " > A r q u i v o : < / d t ><dd ><? php echo $ t h i s > u r l N o v a J a n e l a ( $ t h i s > a p r e s e n t a o >obterURLDoArquivo ( ) ,

237 $ t h i s > a p r e s e n t a o >nomeDoArquivo ) ? > </ dd > < d t c l a s s = " d a t a " > D a t a : < / d t ><dd ><? php $d = new D a t a ( $ t h i s > a p r e s e n t a o > d a t a ) ; echo $d> n o F o r m a t o B r a s i l e i r o ( ) ; ? > </ dd > < d t c l a s s = " h o r a " >Hora : < / d t ><dd ><? php echo $ t h i s > a p r e s e n t a o >h o r a ; ? > </ dd > < d t c l a s s = " a r q u i v o " > P a r t i c i p a n t e : < / d t ><dd ><? php echo $ t h i s > u r l ( $ t h i s > a p r e s e n t a o > o b t e r U R L D o P a r t i c i p a n t e ( ) , $ t h i s > a p r e s e n t a o > P a r t i c i p a n t e >U s u a r i o >nome ) ? > </ dd > </ dl >

Listagem B.70: Arquivo: TemplateXHTML.inc.php


<? php c l a s s TemplateXHTML e x t e n d s S a v a n t 3 { p r i v a t e $cabealho ; p r i v a t e $rodap ; p u b l i c f u n c t i o n TemplateXHTML ( $ c o n f i g = n u l l ) { parent : : __construct ( $config ) ; $ t h i s > c a b e a l h o = new S a v a n t 3 ( $ c o n f i g ) ; $ t h i s >r o d a p = new S a v a n t 3 ( $ c o n f i g ) ; } public function display ( $tpl = null ) { $ t h i s >c a b e a l h o > d i s p l a y ( " / r e p r e s e n t a c o e s / C a b e c a l h o . t p l . php " ) ; parent : : display ( $tpl ) ; $ t h i s >r o d a p > d i s p l a y ( " / r e p r e s e n t a c o e s / Rodape . t p l . php " ) ; } public function assign () { $a = @ f u n c _ g e t _ a r g ( 0 ) ; $b = @ f u n c _ g e t _ a r g ( 1 ) ; $ t h i s >c a b e a l h o > a s s i g n ( $a , $b ) ; p a r e n t : : a s s i g n ( $a , $b ) ; $ t h i s >r o d a p > a s s i g n ( $a , $b ) ;

238 } }

?>

Listagem B.71: Arquivo: Mensagem.tpl.php


<? php i f ( $ t h i s > e n l a c e s C a b e c a l h o ) { f o r e a c h ( $ t h i s > e n l a c e s C a b e c a l h o a s $ e n l a c e ) { echo $ t h i s > u r l ( $ e n l a c e >obterURL ( ) , $ e n l a c e > o b t e r T e x t o ( ) , NULL) . " < b r / > " ; } echo " < b r / > " ; } i f ( $ t h i s >naoConverterParaHTML ) echo $ t h i s >mensagem ; else echo $ t h i s > t x t 2 h t m l ( $ t h i s >mensagem ) ; i f ( $ t h i s > e n l a c e s ) { echo " < b r / > " ; f o r e a c h ( $ t h i s > e n l a c e s a s $ e n l a c e ) { echo " < b r / > " . $ t h i s > u r l ( $ e n l a c e >obterURL ( ) , $ e n l a c e > o b t e r T e x t o ( ) , NULL) ; } echo " < b r / > " ; } ?>

Listagem B.72: Arquivo: Seminario.tpl.php


<? php echo $ t h i s > u r l ( S e m i n a r i o s : : obterURL ( ) , " Todos o s s e m i n r i o s " ) ; ?> <dl c l a s s =" seminario "> <dt >Coordenador : </ dt > <dd >

239 <? php echo $ t h i s > u r l ( $ t h i s >s e m i n a r i o >C o o r d e n a d o r > obterURL ( ) , $ t h i s >s e m i n a r i o >C o o r d e n a d o r >nome , " c o o r d e n a d o r " ) ; ?> </ dd > < d t c l a s s = " d a t a D e T e r m i n o " > D a t a de Trmino : < / d t > <dd ><? php $ d a t a D e T e r m i n o = new D a t a ( $ t h i s >s e m i n a r i o > dataDeTermino ) ; echo $ d a t a D e T e r m i n o > n o F o r m a t o B r a s i l e i r o ( ) ; ? > </ dd > < d t c l a s s = " d a t a D e I n i c i o " > D a t a de I n c i o : < / d t > <dd ><? php $ d a t a D e I n i c i o = new D a t a ( $ t h i s >s e m i n a r i o > dataDeInicio ) ; echo $ d a t a D e I n i c i o > n o F o r m a t o B r a s i l e i r o ( ) ; ? > </ dd > < d t c l a s s = " t i t u l o " > T t u l o : < / d t > <dd ><? php echo $ t h i s > s e m i n a r i o > t i t u l o ; ? > </ dd > < d t c l a s s = " d e s c r i c a o " > D e s c r i o : < / d t > <dd ><? php echo $ t h i s > s e m i n a r i o > d e s c r i c a o ; ? > </ dd > < d t c l a s s = " i n s c r i c a o " > I n s c r i o : < / d t > <dd ><? php echo $ t h i s > s e m i n a r i o > i n s c r i c a o ; ? > </ dd > < d t c l a s s = " d i s p o n i b i l i d a d e " > D i s p o n i b i l i d a d e : < / d t > <dd ><? php echo $ t h i s >s e m i n a r i o > d i s p o n i b i l i d a d e ; ? > </ dd > < d t c l a s s = " a s s i s t e n c i a " > A s s i s t n c i a : < / d t > <dd ><? php echo $ t h i s >s e m i n a r i o > a s s i s t e n c i a ; ? > </ dd > < d t c l a s s = " i n s t r u c o e s " > I n s t r u e s : < / d t > <dd ><? php echo $ t h i s >s e m i n a r i o > i n s t r u c o e s ; ? > </ dd > </ dl > <span c l a s s =" p a r t i c i p a n t e s "> <? php echo $ t h i s > u r l ( $ t h i s >s e m i n a r i o > o b t e r U R L D e P a r t i c i p a n t e s ( ) , " P a r t i c i p a n t e s " , " e n l a c e " ) ; ?> </ span > < b r / > <span c l a s s =" a p r e s e n t a c o e s "> <? php echo $ t h i s > u r l ( $ t h i s >s e m i n a r i o > o b t e r U R L D e A p r e s e n t a e s ( ) , " A p r e s e n t a e s " , " e n l a c e " ) ; ?> </ span > <? php i f ( $ t h i s >e n v i o D e A p r e s e n t a c a o )

240 echo " < b r / > " . $ t h i s > u r l ( $ t h i s >e n v i o D e A p r e s e n t a c a o >obterURL ( ) , $ t h i s >e n v i o D e A p r e s e n t a c a o > obterTexto () , " enlace " ) ; ?> <? php i f ( ! $ t h i s > P a r t i c i p a n t e ) : ?> <? php i f ( $ t h i s > p o d e P a r t i c i p a r ) : ?> < form i d = " f o r m u l a r i o D e C a d a s t r o " a c t i o n = " <? php e c h o $ t h i s >URLDeSubmisso ; ?> " method = " p o s t " > < i n p u t name= " _method " t y p e = " h i d d e n " v a l u e = " PUT" / > < i n p u t name= " b o t a o E n v i a r " t y p e = " s u b m i t " v a l u e =" P a r t i c i p a r " / > </ form > <? php e n d i f ; e n d i f ;? >

Listagem B.73: Arquivo: Rodape.tpl.php


<? php i f ( ! i s s e t ( $ t h i s > n a o M o s t r a r E t i q u e t a D e A u t e n t i c a c a o ) ) { i f ( $ t h i s > e s t A u t e n t i c a d o ) { echo " < b r / > " . " Voc e s t a c e s s a n d o como <b> $ t h i s > nomeDeUsuario < / b > , <a h r e f = \ " " . s t r _ r e p l a c e ( " ? a u t e n t i c a r = v e r d a d e i r o " , " " , $ t h i s >URLAtual ) . " \ " o n c l i c k = d e s a u t e n t i c a r ( ) > c l i q u e aqui </ a> para desautenticar . " ; } else { echo " < b r / > < b r / > Se v o c a i n d a no tem c a d a s t r o " . $ t h i s > u r l ( $ t h i s >URLDeCadastramento , " c l i q u e a q u i " , 0 , f a l s e ) . " para se c a d a s t r a r . " ; echo " < b r / > Caso v o c j s e j a c a d a s t r a d o , " . $ t h i s > u r l ( $ t h i s >URLAtual , " c l i q u e a q u i " , 0 , t r u e ) . " para se a u t e n t i c a r . " ; } } ?> < s c r i p t type =" t e x t / j a v a s c r i p t ">

241 i f ( t y p e o f ( document . f o r m s [ 0 ] ) ! = u n d e f i n e d ) { document . f o r m s [ 0 ] . e l e m e n t s [ 0 ] . f o c u s ( ) ; } </ s c r i p t > </ body > </ html >

Listagem B.74: Arquivo: Colecao.tpl.php


<? php i f ( ! $ t h i s > r a i z && ! $ t h i s > u r l A n t e r i o r ) echo $ t h i s > u r l ( S e m i n a r i o s : : obterURL ( ) , " Todos o s seminrios " , " raiz " ) ; e l s e i f ( $ t h i s > u r l A n t e r i o r ) echo $ t h i s > u r l ( $ t h i s > u r l A n t e r i o r >obterURL ( ) , $ t h i s > u r l A n t e r i o r > o b t e r T e x t o ( ) , " a n t e r i o r " ) ;

echo " <h2 > $ t h i s > t i t u l o : < / h2 > " ; echo " < u l c l a s s = \ " $ t h i s > c l a s s e D a C o l e c a o \ " > " ; i f ( s i z e o f ( $ t h i s > c o l e c a o ) == 0 ) { i f ( $ t h i s >m e n s a g e m C o l e o V a z i a ) echo " < l i > <h3 > " . $ t h i s >m e n s a g e m C o l e o V a z i a . " </ h3 > </ l i > " ; e l s e echo " < l i > <h3 > No e x i s t e m . </ h3 > </ l i > " ; } else { f o r e a c h ( $ t h i s > c o l e c a o a s $ i t e m ) { i f ( i s _ a r r a y ( $ t h i s > a t r i b u t o A M o s t r a r ) ) { $ u m P a r m e t r o = $ t h i s > atributoAMostrar [0]; $ o u t r o P a r m e t r o = $ t h i s > atributoAMostrar [1]; $ v i s u a l i z a o = $ i t e m >$umParmetro > $outroParmetro ; } else

242 $ v i s u a l i z a o = $ i t e m [ $ t h i s > atributoAMostrar ]; $metodo = $ t h i s >URLDeElemento ? $ t h i s > URLDeElemento : " obterURL " ; echo " < l i > " ; echo $ t h i s > u r l ( $ i t e m >$metodo ( ) , $ v i s u a l i z a o , $ t h i s > c l a s s e D o I t e m ) ; echo " </ l i > " ; } } echo " </ u l > " ; f o r e a c h ( $ t h i s > e n l a c e s a s $ e n l a c e ) { echo $ t h i s > u r l ( $ e n l a c e >obterURL ( ) , $ e n l a c e > o b t e r T e x t o ( ) , NULL) . " < b r / > < b r / > " ; } ?>

Listagem B.75: Arquivo: Cabecalho.tpl.php


<!DOCTYPE h t m l PUBLIC " //W3C / / DTD XHTML 1 . 0 T r a n s i t i o n a l / / EN" " h t t p : / / www. w3 . o r g / TR / x h t m l 1 /DTD/ xhtml1 t r a n s i t i o n a l . d t d " > < h t m l xmlns = " h t t p : / / www. w3 . o r g / 1 9 9 9 / x h t m l " xml : l a n g = " pt_BR " l a n g = " pt_BR " > <head > < t i t l e ><? php echo $ t h i s > t i t u l o ; ? > </ t i t l e > < meta h t t p e q u i v = " C o n t e n t Type " c o n t e n t = " t e x t / h t m l ; c h a r s e t =UTF8" / > < s c r i p t s r c = " j s / p r o t o t y p e / p r o t o t y p e . j s " t y p e = " t e x t / j a v a s c r i p t " > </ script > < s c r i p t language =" j a v a s c r i p t " type =" t e x t / j a v a s c r i p t "> function desautenticar () { try { var a g t = n a v i g a t o r . userAgent . toLowerCase ( ) ; i f ( a g t . i n d e x O f ( " m s i e " ) ! = 1) { document . execCommand ( " C l e a r A u t h e n t i c a t i o n C a c h e " ) ; } else {

243 var xmlhttp = createXMLObject ( ) ; x m l h t t p . open ( "GET" , " <? php e c h o D i s s e m i n a r i o : : o b t e r U R L _ B a s e C o m p l e t a ( ) . " / p r o p o s t a D e S e m i n a r i o " ?> " , true , " l o g o u t " , " " ) ; xmlhttp . send ( " " ) ; xmlhttp . abort ( ) ; } } catch ( e ) { a l e r t ( " E r r o ao d e s a u t e n t i c a r . " ) ; } } f u n c t i o n createXMLObject ( ) { try { i f ( window . XMLHttpRequest ) { x m l h t t p = new XMLHttpRequest ( ) ; } / / c o d e f o r IE e l s e i f ( window . A c t i v e X O b j e c t ) { x m l h t t p =new A c t i v e X O b j e c t ( " M i c r o s o f t . XMLHTTP" ); } } catch ( e ) { xmlhttp= false } return xmlhttp ; } </ s c r i p t > </ head > <body >

Listagem B.76: Arquivo: FormularioDeCadastroDeUsuario.tpl.php


< s c r i p t type =" t e x t / j a v a s c r i p t "> function enviar () { document . f o r m s . f o r m u l a r i o D e C a d a s t r o . a c t i o n = <? php e c h o $ t h i s >URL_paraSubmisso ; ?> + / + document . getElementById ( enderecoDeCorreioEletronico ) . value ;

244 i f ( document . g e t E l e m e n t B y I d ( e n d e r e c o D e C o r r e i o E l e t r o n i c o ) . v a l u e == ) { a l e r t ( Correio e l e t r n i c o vazio ) ; return false ; } r e t u r n true ; } </ s c r i p t > <? php echo $ t h i s > u r l ( S e m i n a r i o s : : obterURL ( ) , " Todos o s s e m i n r i o s " , " r a i z " ) ; ?> <h2 > C a d a s t r a m e n t o de U s u r i o < / h2 > P o r f a v o r , e n t r e com s e u e n d e r e o de c o r r e i o e l e t r n i c o no campo a b a i x o e c l i q u e no b o t o p r o s s e g u i r , e n v i a r e m o s uma mensagem p a r a e s t e e n d e r e o com a s i n s t r u e s p a r a que voc c o n c l u a seu c a d a s t r a m e n t o : <br / > <br / > Seu e n d e r e o de c o r r e i o e l e t r n i c o s e r u t i l i z a d o como s e u " nome de u s u r i o " quando v o c r e a l i z a r alguma t a r e f a que p r e c i s e de a u t o r i z a o , ex : p a r t i c i p a r de um s e m i n r i o ou p u b l i c a r uma a p r e s e n t a o . < form i d = " f o r m u l a r i o D e C a d a s t r o " a c t i o n = " " method = " p o s t " onsubmit=" r e t u r n e n v i a r ( ) " > <p> E n d e r e o e l e t r n i c o : < i n p u t i d = " e n d e r e c o D e C o r r e i o E l e t r o n i c o " name= " e n d e r e c o D e C o r r e i o E l e t r o n i c o " type =" t e x t " value =" " / > < i n p u t name= " b o t a o E n v i a r " t y p e = " s u b m i t " v a l u e = " P r o s s e g u i r " / > < / p> <br / > < i n p u t name= " _method " t y p e = " h i d d e n " v a l u e = "PUT" / > </ form >

Listagem B.77: Arquivo: PropostaDeSeminario.tpl.php


<dl c l a s s =" p r o p o s t a "> < d t c l a s s = " p r o p o n e n t e " > P r o p o n e n t e : < / d t ><dd ><a c l a s s = " URLDoProponente " h r e f = " <? php e c h o $ t h i s > p r o p o s t a > P r o p o n e n t e >obterURL ( ) ; ?> " ><? php echo $ t h i s > p r o p o s t a > P r o p o n e n t e >nome ? > </ a > </ dd >

245 < d t c l a s s = " r a m a l " >Ramal : < / d t > <dd ><? php echo $ t h i s > p r o p o s t a >ramalUFSC ; ? > </ dd > < d t c l a s s = " d a t a D e T e r m i n o " > D a t a de Trmino : < / d t > <dd ><? php $ d a t a D e T e r m i n o = new D a t a ( $ t h i s > p r o p o s t a > dataDeTermino ) ; echo $ d a t a D e T e r m i n o > n o F o r m a t o B r a s i l e i r o ( ) ; ? > </ dd > < d t c l a s s = " d a t a D e I n i c i o " > D a t a de I n c i o : < / d t > <dd ><? php $ d a t a D e I n i c i o = new D a t a ( $ t h i s > p r o p o s t a > dataDeInicio ) ; echo $ d a t a D e I n i c i o > n o F o r m a t o B r a s i l e i r o ( ) ; ? > </ dd > < d t c l a s s = " t i t u l o " > T t u l o : < / d t > <dd ><? php echo $ t h i s > p r o p o s t a > t i t u l o ; ? > </ dd > < d t c l a s s = " d e s c r i c a o " > D e s c r i o : < / d t > <dd ><? php echo $ t h i s > p r o p o s t a > d e s c r i c a o ; ? > </ dd > < d t c l a s s = " i n s c r i c a o " > I n s c r i o : < / d t > <dd ><? php echo $ t h i s > p r o p o s t a > i n s c r i c a o ; ? > </ dd > < d t c l a s s = " d i s p o n i b i l i d a d e " > D i s p o n i b i l i d a d e : < / d t > <dd ><? php echo $ t h i s > p r o p o s t a > d i s p o n i b i l i d a d e ; ? > </ dd > < d t c l a s s = " a s s i s t e n c i a " > A s s i s t n c i a : < / d t > <dd ><? php echo $ t h i s > p r o p o s t a > a s s i s t e n c i a ; ? > </ dd > < d t c l a s s = " i n s t r u c o e s " > I n s t r u e s : < / d t > <dd ><? php echo $ t h i s > p r o p o s t a > i n s t r u c o e s ; ? > </ dd > </ dl >

Listagem B.78: Arquivo: conguracao.inc.php


<? php d e f i n e ( URL_BASE , " / d i s s e m i n a r i o " ) ; d e f i n e ( RAIZ_DO_DISSEMINARIO , dirname ( __FILE__ ) ) ; d e f i n e ( CAMINHO_DO_MODELO_ORM , RAIZ_DO_DISSEMINARIO . " / modelo / orm " ) ; d e f i n e ( CAMINHO_DE_MIGRACAO , RAIZ_DO_DISSEMINARIO . " / tmp / m i g r a c a o " ) ; d e f i n e ( CAMINHO_DE_SQL , RAIZ_DO_DISSEMINARIO . " / tmp / s q l " ) ; d e f i n e ( CAMINHO_YAML , RAIZ_DO_DISSEMINARIO . " / modelo / orm / esquema " ) ; d e f i n e ( PROTOTYPE , " h t t p : / / " . $_SERVER [ SERVER_NAME ] . URL_BASE . " / js / prototype / prototype . js " ) ; / / r e q u i r e _ o n c e Log . php ;

246 r e q u i r e _ o n c e ( dirname ( __FILE__ ) . / b i b / p h p M a i l e r / c l a s s . p h p m a i l e r . php ) ; r e q u i r e _ o n c e ( dirname ( __FILE__ ) . / b i b / addendum 0 . 3 . 2 / a n n o t a t i o n s . php ) ; r e q u i r e _ o n c e ( dirname ( __FILE__ ) . / b i b / d o c t r i n e / l i b / D o c t r i n e . php ) ; r e q u i r e _ o n c e ( dirname ( __FILE__ ) . / b i b / S a v a n t 3 3 . 0 . 0 / S a v a n t 3 . php ) ; s p l _ a u t o l o a d _ r e g i s t e r ( array ( D o c t r i n e , a u t o l o a d ) ) ; s p l _ a u t o l o a d _ r e g i s t e r ( array ( CarregamentoDeClasses , a u t o l o a d ) ) ; D o c t r i n e _ M a n a g e r : : c o n n e c t i o n ( " mysql : / / r o o t @ l o c a l h o s t / d i s s e m i n a r i o " , disseminario ) ; D o c t r i n e _ M a n a g e r : : g e t I n s t a n c e ( ) > s e t A t t r i b u t e ( m o d e l _ l o a d i n g , conservative ) ; D o c t r i n e : : l o a d M o d e l s (CAMINHO_DO_MODELO_ORM) ; c l a s s CarregamentoDeClasses { s t a t i c p r i v a t e $cache = n u l l ; p u b l i c s t a t i c f u n c t i o n a u t o l o a d ( $nomeDaClasse ) { i f ( s e l f : : $ c a c h e == n u l l ) { C a r r e g a m e n t o D e C l a s s e s : : o b t e r A r q u i v o s ( dirname ( __FILE__ ) , s e l f : : $ c a c h e ) ; } i f ( ! i s _ n u l l ( s e l f : : $ c a c h e [ $nomeDaClasse . " . i n c . php " ] ) ) { r e q u i r e _ o n c e s e l f : : $ c a c h e [ $nomeDaClasse . " . i n c . php " ] ; r e t u r n true ; } else return false ; } public s t a t i c f u n c t i o n autoload2 ( $class_name ) { $arquivo ; i f ( ! i s s e t ( s e l f : : $cache [ $class_name ] ) ) { s e l f : : f i n d _ f i l e ( dirname ( __FILE__ ) , $ c l a s s _ n a m e . " . i n c . php " , $ a r q u i v o ) ;

247 i f ( trim ( $ a r q u i v o ) != " " ) { s e l f : : colocarNoCache ( $class_name , $arquivo ) ; require_once $arquivo ; r e t u r n true ; } else { return false ; } } else { re qui re_ once s e l f : : $cache [ $class_name ] ; } } p r i v a t e s t a t i c f u n c t i o n c o l o c a r N o C a c h e ( $nomeDaClasse , $arquivo ) { i f ( ! i s s e t ( s e l f : : $ c a c h e [ $nomeDaClasse ] ) ) s e l f : : $ c a c h e [ $nomeDaClasse ] = $ a r q u i v o ; }

p r i v a t e s t a t i c f u n c t i o n f i n d _ f i l e ( $ p a t h , $ p a t t e r n , &$ x p t o ) { $path = rtrim ( s t r _ r e p l a c e ( " \ \ " , " / " , $path ) , / ) . / ; $matches = Array ( ) ; $ e n t r i e s = Array ( ) ; $dir = dir ( $path ) ; w h i l e ( f a l s e !== ( $ e n t r y = $ d i r > r e a d ( ) ) ) { $entries [] = $entry ; } $ d i r > c l o s e ( ) ; foreach ( $ e n t r i e s as $entry ) { $fullname = $path . $entry ; i f ( $ e n t r y ! = . && $ e n t r y ! = . . && i s _ d i r ( $ f u l l n a m e ) ) { s e l f : : f i n d _ f i l e ( $fullname , $pattern , $xpto ) ; } e l s e i f ( i s _ f i l e ( $ f u l l n a m e ) && ( e r e g ( " / " . $ p a t t e r n , $ f u l l n a m e ) !== FALSE) ) { $xpto = $fullname ; }

248 } } public s t a t i c function obterArquivos ( $diretrioDeIncio , & $arquivosVisitados ) { $ d i r e t r i o = dir ( $ d i r e t r i o D e I n c i o ) ; w h i l e ( ( $ e n t r a d a D o D i r e t r i o = $ d i r e t r i o > r e a d ( ) ) !== false ) { $entradas [] = $entradaDoDiretrio ; } $ d i r e t r i o > c l o s e ( ) ; foreach ( $entradas as $entradaDoDiretrio ) { if ( is_dir ( $diretrioDeIncio . " / " . $ e n t r a d a D o D i r e t r i o ) && ( $ e n t r a d a D o D i r e t r i o ! = " . " && $ e n t r a d a D o D i r e t r i o != " . . " ) ) s e l f : : obterArquivos ( $diretrioDeIncio . " / " . $entradaDoDiretrio , $arquivosVisitados ) ; else if ( is_file ( $diretrioDeIncio . " / " . $entradaDoDiretrio ) ) { $arquivosVisitados [ $entradaDoDiretrio ] = $diretrioDeIncio . " / " . $entradaDoDiretrio ; } } } } ?>

249

ANEXO C -- Tipos de Representaes

C.1

Codicao de Formulrio

A codicao de formulrio a representao utilizada por navegadores quando enviado algum formulrio para o servidor. Exemplo: nome=Juca&correioEletronico=cocoBranco@inf.ufsc.br

C.2

JSON

O formato JSON (JavaScript Notation Object) um padro leve de troca de dados [19], baseado em um sub-conjunto da denio de JavaScript [20]. Por isso, os navegadores tem suporte nativo a este formato. Como pode-se observar no exemplo abaixo, os dados so reprentados em pares de chavevalor. Exemplo: {nome:Juca, correioEletronico: cocoBranco@inf.ufsc.br}

C.3

XML

A linguagem XML uma linguagem de marcao extensvel e amplamente utilizada para troca de dados na Web [6].
<usuario> <nome> J u c a < / nome> < c o r r e i o E l e t r o n i c o >cocoBranco@inf . u f s c . br < / c o r r e i o E l e t r o n i c o > </ usuario>

250

C.4

XHTML com Marcaes Descritivas


<li> <a h r e f = " h t t p : / / d i s s e m i n a r i o . e d u g r a f . u f s c . b r / UmSeminario " c l a s s = " s e m i n a r i o " >Um S e m i n a r i o < / a > </ li > <li> <a h r e f =" h t t p : / / d i s s e m i n a r i o . edugraf . ufsc . br / OutroSeminario " c l a s s =" s e m i n a r i o ">Outro Seminario < / a> </ li >

< ul c l a s s =" s e m i n a r i o s ">

</ ul>

251

ANEXO D -- Artigo: Uma Aplicao da Arquitetura Orientada a Recursos

UmaAplicaodaArquiteturaOrientadaaRecursos
ErichD.LunardeliSilvestre1,PabloValrioPolnia1
1

LaboratriodeSoftwareEducacional(EDUGRAF)DepartamentodeInformticae EstatsticaUniversidadeFederaldeSantaCatarina(UFSC) CampusUniversitrioTrindadeCaixaPostal476CEP88040900Brazil Abstract. Abigefforthasbeendoneresearchingthesubjectofwebservices and most of the researches ignores completely the original proposed web architecture.Wetried,inthiswork,bringanarchitecturalstylethatwasmade upfordistributedhipermediasystemsback,REST,andstudyanwebbased architecturethatfollowsthisstyle,theResourceOrientedArchitecture(ROA). Withthegoalofapplyingthesestheoriesonthedevelopmentofaseminars helpingsystem,usingBehaviourDrivenDevelopment.Asresult,aresource orientedseminar system has been built,the Disseminrio seminar helping system. Resumo.Muitoesforotemseempregadoempesquisassobreserviosweb,e grandepartedestaspesquisasignoracompletamenteoestilodearquitetura propostaoriginalmenteparaaweb.Buscousecomestetrabalho,resgatarum estilo arquitetural desenvolvido para sistema distribudos de hipermdia, REST,eestudarumaarquiteturavoltadaparaawebquesegueesseestilo,a ArquiteturaOrientadaaRecursos(ROA).Tendocomoobjetivo,oemprego destasteoriasnodesenvolvimentodeumaaplicaodeapoioaseminrios comusodeProgramaoOrientadaporComportamento.Comoresultado, criouse um sistema web orientado a recursos, o sistema Disseminrio de apoioaseminrios.

1.Introduo
Grandepartedossistemaswebprojetadosfazemusodearquiteturaorientadaaservios. Muitasvezesinapropriada,porsetrataremdeumamaneiracomplexadesemodelar sistemasequeapresentarecursosavanadosquesoproveitososapenasemcontextos especficos. Nestetrabalho,fazseousodaarquiteturaorientadaarecursos,quesegueo estiloarquiteturalRESTefazusodosverbosHTTP,respeitandoasemnticaimpostaa elesquandodasuadefinio.Buscaserespeitarapropostainicialdawebefazerum intensivodehipermdia.Desenvolveseumsistemaweborientadoarecursos,utilizando sedametodologiapropostaedetcnicasgeis,comoodesenvolvimentoguiadopor comportamento. Dividiuseestaartigoemquatrosees,noprimeiratratasesobreREST,os estilos do qual se derivou e seus elementos arquiteturais. Na segundo fazse uma explanao da Arquitetura Orientada a Recursos, seus conceitos, propriedade, na seguinte descrevese uma metodologia que serve para se projetar sistemas web orientados a recursos e programao guiada por comportamento. Na ltima, falase

sobre a implementao do sistema Disseminrio. Ele um sistema de apoio a seminrios,quepermiteaosusurioscriaremeparticiparemdeseminrios,divulgarem seusseminriosepublicaremapresentaes,elaboradocomoumexemplodesistema querespeitaateoriaestudada.

2.REST
REST um estilo arquitetural hbrido, derivado de vrios estilos arquiteturais de software em rede. Ele proposto por Roy Fielding em 2000, na sua dissertao de doutorado[1],quebuscouumacombinaodeestilosarquiteturais,quepossuisseas melhorescaractersticasparaumsistemadistribudodehipermdia. Umestiloarquiteturalumconjuntocoordenadoderestriesarquiteturais,que recebenomeporfacilidadedeuso,ecompostoporrestriesarquiteturaiseelementos arquiteturais,estes,divididosemelementosdedados,conectoresecomponentes. Estilos arquiteturais podem ser criados do zero, sem o reuso de estilos pr existentes,oucriadosapartirdecomposiodeestilosjexistentes,estafoiaidia utilizadaemREST. 2.1EstilosArquiteturaisdeREST Nestaseo,seroabordadososestilosarquiteturaisdosquaisRESTfoiderivado. 2.1.1Cliente/Servidor OprimeiroestiloarquiteturalutilizadonaderivaodeRESTfoioCliente/Servidor. Nele so definidos dois papis: o do servidor, que disponibiliza um conjunto de servios,edocliente,quefazusodestesservios. Fieldingconsideraaseparaodepreocupaescomosendooprincpioportrs destaarquitetura[1],oquepermiteaevoluoindependentedeclienteeservidor. 2.1.2SemEstado NarestrioSemEstadooservidornoarmazenaqualquerinformaodecontexto, qualquerinformaonecessriaparaatenderaumarequisiodeveestarcontidanela mesma. Podesedizerquecomainclusodestarestrioaescabilidadeaumenta,poiso servidornoprecisaarmazenardadosdecontexto entrerequisies,podendoassim, liberarrecursos.Comocadarequisioportatodososdadosnecessriosparareconhec la,avisibilidadeaumentada. 2.1.3Cache Arestrioarquiteturalcacheevitaquedadosjtenhamsidoenviadosanteriormenteao cliente,sejamreenviados.Paratanto,devehaverumaindicaoimplcitaouexplcita emcadarequisio,informandosedeveserutilizadocacheouno. Segundo[1],avantagemdeseutilizarcacheaeliminaoparcialoutotalde algumas interaes entre cliente/servidor. Melhorando a eficincia (menos dados trafegandocomamesmafuncionalidade),escalabilidade(menosprocessamentoee/s)e a performance percebida pelo usurio (servidor menos carregado, menor tempo de resposta).

2.1.4Interfaceuniforme AprincipaldistinoentreRESTeoutrosestilosarquiteturaisparawebaenfseno usodeumainterfaceuniformeentreseuscomponentes[1]. Com o uso de uma interface uniforme, a visibilidade de cada interao aumentadapoisoconjuntodemtodos paracadaelementodosistemaconhecido, sendoassim,acadaexecuodemtodosesabeasemnticadeste.Osistemasetorna maissimplescomoumtodo,poiscadacomponenteimplementaosmesmosmtodos. 2.1.5SistemaemCamadas NarestriodeSistemaemCamadas,osistemadivididoemcamadaseacadacamada conheceapenasafachadadacamadaseguinte,criandosevriossubsistemas. Essarestriodiminuiaacoplamento,poiscadacamadatemacessoapenasa APIdacamadaseguinte,semsaberosdetalhesdeimplementaodesta.suaAPI.Isso permiteasubstituiodecamadas,casosefaanecessrio. 2.1.6Cdigosobdemanda Ocdigosobdemandaautilizaodelgicaarmazenadanoservidor,aserexecutada pelo cliente. Desta forma, partes do cliente ficam primplementadas no servidor. Applets e cdigo JavaScript armazenados no servidor, so exemplos de cdigo sob demanda. OcdigosobdemandaanicarestrioarquiteturalopcionaldoREST. 2.2ElementosArquiteturaisdeREST NestaseoserodetalhadososelementosarquiteturaisdeREST. 2.2.1ElementosdeDados Oselementosdedadosdeumestiloarquiteturalsooselementosdeinformaoque sotrocadosentrecomponentes,viaconectores.RESTpossuetrselementosdedados: Recursos,IdentificadoresdeRecursoseRepresentaes. Umrecursoqualquerinformaoquepossasernomeada:umdocumento,uma imagem,umserviometereolgico,umacoleodeoutrosrecursos,umrecursono virtual(porexemplo uma pessoa) eassimpor diante. Emoutraspalavras,qualquer conceitoquepossasersujeitoaumarefernciahipertextualseencaixanadefiniode recurso[1]. Afunodoidentificadorderecursoaidentificaodeumrecursoenvolvido em uma determinao interao. Todo recurso referenciado por meio de um identificador derecurso, o responsvelpelo identificador tambm responsvelpor manter a validade semntica do mapeamento, garantindo que o identificador estar referenciandoorecursocorreto.OidentificadorderecursoutilizadonaWebaURI. Umarepresentaoumaseqenciadebytesemetadadosparadescreverestes bytes[1].Osrecursossomanipuladosatravsdousoderepresentaes. 2.3.1ConectoreseComponentes Umcomponenteumaunidadeabstratadesoftwareeumestadointerno,queexecuta transformaesemdadosatravsdesuainterface[1].Podesedefinirtambm,comoo

elemento de um sistema que efetua computaes [3]. Eles so os extremos nas interaes,fazendointerfacecomousurio. Osconectoressomecanismosabstratosdesoftwarequemediamcomunicao, coordenaooucooperaoentrecomponentes[1]. Umexemplodeinteraoconectorecomponenteoacessoaumrecurso.Pode secitarautilizaodonavegadorMozillaFirefoxcomocomponente,queutilizauma bibliotecainternaclientehttp,queumconector,eseconectaaumservidorapacheque umcomponente,viaumconectorhttpservidor,queumabibliotecahttpservidor. 3.ArquiteturaOrientadaaRecursos A Arquitetura Orientada a Recursos (ROA) uma arquitetura que segue o estilo arquiteturalREST,herdandodele,todasasrestrieseelementosarquiteturais[2]. ROAumaarquiteturavoltadaparaserviosWeb,sendoimplementadaapartir de tecnologias da Web como o protocolo HTTP [5] e a linguagem de marcao XML[6]. 3.1Conceitos Osconceitos deROAsomais especificosquesuasdefinies emREST,poisso utilizadastecnologiasWebespecificasnasdefinies. 3.1.1Recursos EmROAainterfaceuniformedecadarecursodefinidapeloconjuntodemtodos utilizadosnoprotocoloHTTP. 3.1.2IdentificadoresdeRecursos OsidentificadoresderecursosdevemserURIs(UniformResourceIdentifiers)[7],que o formato de identificadores utilizado na Web. Alm disso, as URIs devem ser descritivaseseguirumacertaestrutura. AjustificativaparaadescritividadedasURIsqueelassointuitivasparao usurio,quedevepoderllaesaberfacilmentequeelaserefere. URIsdevemterumaestrutura,variardemaneiraprevisivel,parafacilitarseu usoporclientessejameleshumanosoumquinas. Porexemplo,considereasseguintesURIs: Exemplo: /animal/Gato /bicho/Tainha Nalistagemacima,hdoisendereospararecursoscomamesmasemntica informal:/bichoe/animal.Umusurioqueacessar/animal/Gatopodequereracessar /animal/Tainha, caso o recurso endereado por /animal/Tainha no esteja acessvel teremos um problema, pois impedimos o usurio de acessar um recurso que semnticamentevlidomasnoestacessvel,poisnofoiseguidaumaestruturaao enderearosrecursos.

3.1.3Representaes RepresentaessotrocadasentreclienteeservidoratravsdosmtodosHTTP. Negociaodecontedopodeserefetuadaatravsdemetadadosenviadosnos cabealhosdasrequisies,porexemploocabealhoAcceptpodeserusadoemuma requisiopararestringirotipodemdia(MIMEtype)obtidonaresposta. Uma alternativa a utilizao de metadados nos cabealhos das requisies enderearcadarepresentaodorecursoatravsdeumaURI,porexemplo: Um usurio acessando: /animal/Gato, utilizando o cabealho Accept na requisio um cliente pode decidir se deseja receber uma imagem ou informaes textuaissobregatos,comoalternativaaistopodemosterduasURIs/animal/Gato.txt designandoinformaestextuaissobregatose/animal/Gato.svgcomoumaimagem. AvantagemdeutilizardiferentesURIsparadiferentesrepresentaesdeum mesmo re curso que a informao est explicita na URI, este endereo pode ser copiadoepassadoadianteporumusurio. A desvantagem que os recursos endereados por /animal/Gato.svg e /animal/Gato.txt parecem recursos diferentes,mas ambos descrevem amesmacoisa, apenascomumformatodiferente,umasoluoparaesteproblema criarumURI canonicaem/animal/Gato,nestaURIexistiriaumarepresentaoqueteriaenlacespara todasasrepresentaespossveisdorecursoemquesto. 3.2Propriedades 3.2.1Endereabilidade Umaaplicaoendereavelquandoumusuriopodeacessarosdados,osrecursosda aplicao,atravsdeURIs. Estapropriedadegaranteaspectosinteressantes,porexemplo umusurioque queiraprocurarsobreburacosnegrosacessaaURI: http://www.google.com.br/search?q=buraco+negro Suabuscaestendereada,aURIpodesercopiadaepassadaadianteparaque outrosinteressadospossamrealizaramesmabusca. ComendereabilidadetambmpossvelfazerCachederequisies,emuma redelocalpodemosterumamquinarecebendotodasasrequisies(umproxyHTTP), quando uma requisio repetida podemos enviar um resultado salvo ao invs de consumirbandarealizandoamesmarequisioduasvezes,semendereabilidadeno saberiamosquaisrequisiesjforamefetuadas. 3.2.2Semestado SemestadosignificaquecadarequisioHTTPocorreemcompletoisolamento. Quando o cliente envia uma requisio HTTP, ele inclue toda a informao necessria para que o servidor satisfaa a requisio. O servidor nunca se vale de informaesderequisiesanteriores[2]. Por exemplo, um usurio que esteja na pgina dois da sua pesquisa sobre buracosnegros,casoelequeiraenviaroendereodesuabuscaparaoutrapessoaele pode:

http://www.google.com.br/search?q=buraco+negro&start=2 NestecasoaprpriaURIcontmoestadodaaplicao,enooservidor. Casoestainformaoestivessenoservidoresteteriadegerenciarainformao donmerodapginadecadaclientedaaplicao,umnovoclienteteriadeefetuar transiesrealizandooperaesnoservidoratchegaraoestadodesejado. 3.2.3Conectividade Conectividadeapropriedadequepermitequeumclientenavegueporentreosrecursos daaplicaoatravsdeenlacesembutidosnasrepresentaes. Quando um usurio acessa: http://www.google.com.br/search?q=buraco+negro elerecebeumasriedeenlacespelosquais podenavegar,podendoacessarumdos resultadosdapesquisa,mudardepginaentreoutrasfuncionalidades,comopodeser vistonafigura3.1.

Figura3.1BuscaporburaconegronoGoogle Quandooservidorenviaumarepresentaocomenlaces,eleestenviandopara oclienteumasriedeURIscomestadospossveisdaaplicao,possvelmostraresta propriedadeatravsdeumgrafo,ondeosnodossoosrecursoseasarestasenlaces ligandoos. 3.2.4InterfaceUniforme Ainterfaceuniformedefineoconjuntodeoperaespossveisparacadarecurso. Estasoperaessorestritas aosmtodos doprotocolo HTTP,esolistadas abaixo,comasemnticaassociada: GET: Obtm a representao de um recurso, assim como os metadados associados. DELETE:Removeumrecurso. PUT:CriaouatualizaumrecursonaURIespecificada.

POST: Cria um recurso subordinado ou anexa informaes a um recurso, respondendocomaURIdonovorecurso. OPTIONS:Listaquaisosmtodosquepodemserexecutadosnorecurso. HEAD:IdnticoaoGET,masomitindoarepresentao. 4METODOLOGIA ROAalmdeserumaarquiteturaumametodologiadecomoexplorarumproblemae o expor em forma de recursos [2]. Ela foi utilizada como metodologia para o desenvolvimento do Disseminrio em conjunto com Programao Orientada por Comportamento(BDD). 4.1MetodologiaROAaplicadaaoDisseminrio AmetodologiaROAdivididaemnovepassos,queserodescritosaseguir. 4.1.1Identificaodosdadosdodomnio Nestaetapasoidentificadasquaisasinformaesqueserofornecidasaosclientesdo servio,baseandosenodomniodaaplicao. NoDisseminrio,temosdiversosdadosnosquaisumclientepodeestarinteressado, tais como: Usurios, Seminrios, Coordenadores de seminrio, Participantes de SeminrioeApresentaes. 4.1.2Definiodosrecursos Comoconjuntodedadosdefinidooprximopassodefinircomoseroexpostoscomo recursosHTTP,umrecursoqualquercoisaimportanteosuficienteparaseralvodeum hyperlink [2]. Nesta etapa so detalhados os dados do domnio paraescolhercomo explosparaocliente. Foiestabelecidaumarelaodiretaentreasentidadeserecursos,umrecurso paracadaentidadededomnio: Usurio Seminrio Apresentao Entidadesderivadasderelaestambmpodemserreferenciadas,tornandoas recursos. Umcoordenadorpodeserreferenciado,assimcomoumparticipante,tornando osendereveis. Quandoumapropostadeseminriofeitaeladeveterumendereo,paraqueo administradorpossaacessaledecidirseiraproval. Coordenador Participantedeumseminrio Propostadeseminrio

Umclientepodeestarinteressadonalistadeseminrios,parapublicaremseu blog,ounalistadeusurios,paraentraremcontatocomelesatravsdemensagensde correioeletrnico. Alistadeseminriosealistadeusuriossorecursosdecoleo,foramcriados recursosdecoleoparacadarecursodeentidade: Usurios Seminrios Coordenadores Participantesdeumseminrio Apresentaesdeumseminrio Propostasdeseminrios Comonossosusuriosinteragemcomoservioatravsdonavegadorprecisamos proverformulriosquepossamserrenderizadospelonavegador,taiscomo5.11,para que possam ser preenchidos pelo usurio em enviados novamente ao servidor, tais formulriostambmsorecursos. Formulriodecadastramento Formulriodeconfirmaodecadastramento Formulriodecriaodepropostadeseminrio Formulriodeenviodeapresentao Outrorecursocriadofoiodecadastramento,querepresentaumaoperaode criaodecontaqueaindanofoiconcluda.Oquemotivouacriaodesterecursofoi ofatodacriaodecontaserfeitaemduasetapas,sendocriadoorecursonaprimeira etapaetendoquepersistireserendereavelparaaconfirmaonasegunda,esterecurso foicriadobaseadonaidiadetransao,expostaem[2]. 4.1.3Definiodosnomesdosrecursos Todorecursodeveterumnome,estabelecidoatravsdeumaURI[2],almdissocada URI deve ser descritiva, de fcil entendimento para humanos, e seguir uma certa estruturaquevarieomnimopossvel,evitandoambiguidades. Na URI raiz do Disseminrio so listados todos os seminrios abertos ao pblico,osdemaisrecursosdecoleosodenotadospelonomedacoleo. Abaixo podemos visualizar algumas URIs e as semnticas dos recursos identificadosporcadaumadelas,asURIsforamabreviadasparaficaremrelativasao endereocompletodoDisseminrio. /:Coleodetodososseminriospblicos /propostasDeSeminario:Coleodepropostasdeseminrio /usuarios:Coleodetodososusurios /administradores:Coleodeusuriosquesoadministradores /coordenadores:Coleodeusuriosquesocoordenadores

Foram criadas recursos relativos a outros recursos, todos os recursos esto vinculadosaorecursoraizmaspodemosaprofundarestasrelaes,comoporexemploa coleo de partici pantes ou as apresentaes de um seminrio, a barra neste caso forneceaidiadeescopoondeorecursodoladodireitodabarraestvinculadoao recursodoladoesquerdo,comopodeservistoabaixo: /ArteBarroca:Seminriodeartebarroca barroca barroca /ArteBarroca/participantes : Coleo de participantes do seminrio de arte /ArteBarroca/apresentacoes:Coleodeapresentaesdoseminriodearte

Umrecursoquemerecedestaqueoarquivodaapresentao(quepodeserdo formatoodp,pptoupdf),usuriospoderiamenviarsuaapresentaoemvriosformatos paraevitarproblemasrelacionadosadiferentesversesdosoftwaredevisualizaode apresentaes,existemduasopespararepresentartiposdemdiaespecficos,para possibilitarestafuncionalidade[2]. Poderiamos incluir a informao do tipo de mdia no cabealho HTTP da respostaatravsdapropriedadeContentType,destaformaumamesmaURIpodeservir representaes de tipos diferentes de mdia, um cliente acessaria /ArteBarroca/Aleijadinho/apresentacao podendo esco lher qual tipo de mdia quer recebernaresposta,informandonocabealhodesuarequisioapropriedadeAccept. AoutraopoestabelecerURIsdiferentesparacadatipodemdia,taiscomo: /ArteBarroca/Aleijadinho/apresentacao.pdf /ArteBarroca/Aleijadinho/apresentacao.odp NestaopootipodemdiaficaexplcitonaURI,tornandomaisclaroparao usuriooqueestsendorequisitado.EstafoiaopoescolhidanoDisseminrio. TodososexemplosdeURIspodemservisualizadosnatabela4.1.

Tabela4.1:URIsdeRecursos

4.1.4Definiodasoperaessobreosrecursos Neste ponto, necessrio decidir quais os mtodos da interface uniforme sero permitidosemcadarecurso.Estaescolhaumadecisodeprojetoeguiadapelopoder quesedesejaconferiraosclientes. Comodescritonaseo3.2.4,ainterfaceuniformedeROAcompostapelos mtodosHTTP.Adecisodeimplementarounoummtodopodesertomadaapartir deperguntas,relativas asaesqueosclientespoderoefetuaremumdeterminado recurso: Osclientespoderolerorecurso?Sesim,implementarGET Osclientespoderocriarnovosrecursosdestetipo?Casoafirmativo.Quem est encarregado de saber onde ficaro os novos recursos criados? Se o cliente, implementarPUT,casosejaoservidor,implementarPOST. PUT Osclientesiroatualizardadosdorecurso?Emcasoafirmativo,implementar Osclienteiroremoverrecursosdestetipo?Sesim,implementarDELETE Osoutrosdoismtodosdainterfaceuniforme,HEADeOPTIONS,provmdos mtodosjdefinidos.OmtodoHEAD,pordiferenciarsedomtodoGETapenaspor noenviarocorpodarepresentao,serimplementadosomentecasoomtodoGETo seja.OmtodoOPTIONStemafunodeinformarquaismtodossopermitidosno recurso,sendoimplementadoemtodososrecursos.

Tabela4.2:MtodosimplementadosnosRecursos A tabela 4.2 evidncia o projeto escolhido para cada recurso. Recursos que somenteimplementarGETsosomenteleitura.Paraestetipoderecurso,tomousea decisodenodaropoderaoclientedeapagarouatualizarcoleesinteiras. Um recurso de somente leitura particularmente interessante o Arquivo de Apresentao,criadoapartirdomomentoemqueumrecursoApresentaocriado, sendoseuciclodevidavinculadoaumrecursodeApresentao. Avriosrecursosqueimplementamummesmoconjuntodeoperaesqueo recursodeAdministrador,estessoatualizveisedelveis,efoiescolhidoocliente

comooresponsvelporsaberondeumnovorecursodotipoficariaaosercriado,razo doPUTparacriao. OutrorecursoquechamaatenooPropostasdeSeminrios,decidiusequeo servidorseriaoencarregadodesaberondeficariamosnovosrecursos,jquepodem havervriaspropostascriadasporusurios,inclusivecommesmonome,justificandose aimplementaodePOST. OrecursoUsurionopossumtodoPUT/POST,portantonopossvelpara umclientecriarumusuriocomumaoperao,oquesedeveaofatodacriaode usuriosdarseemduasetapas,efetuadasatravsdeumtransaodecadastramento. 4.1.5Representaesaceitaspeloservidor O principal critrio na escolha de representaes o tipo de representao que os clientes desejam consumir. A metodologia ROA prope que se use representaes comuns a web, como codificao de formulrio, XML, JSON e XHTML com microformatos. Como nossos clientes so o navegador web e um cliente automatizado, necessrio utilizar representaes de entrada que possam ser facilmente geradas por eles.Porisso,decidiuseutilizarcodificaodeformulrio,queumarepresentao nativanosnavegadoresecomsuportenonossoclienteverificadordeespecificaes. 4.1.6Definiodasrepresentaesoferecidaspeloservidor Comojditonaseo4.1.5,aescolhaderepresentaesdependedosclientes.Porisso, buscouseumarepresentaodesadaquepudesseserrenderizadaporumanavegadore queaomesmotempo,fossefcilparaumclienteautomatizadoextrairasinformaes dequeprecisa. FoiescolhidooformatoXHTML,porserXML,oquegaranteboaformaoa facilidade extrao de informaes atravs de um parser e renderizvel em um navegador,almdissoumarepresentaohipermdia,totalmentedeacordocomos conceitosdeRESTeROA.Portaisvantagens,elefoiadotadocomorepresentaode sadadetodosnossosrecursos,excetooArquivodeApresentao.Nesterecurso,a representaooprprioarquivodeumaapresentaoenviadaporumparticipantede seminrio. 4.1.7Interligaodosrecursos UmdosaspectosmaisimportantesnoprojetoROAapropriedadedeconectividade, queobtidaduranteestafasedoprojeto.Buscaseinterligarosrecursosdemaneiraque setenhaumanavegabilidadetimanosistema,comocritriodequeasligaesentre recursosfaamsentido. Nosebuscaumgrafototalmenteconexocomooresultadodasinterligaes entreosrecursos,massim,omximodeligaescoesas. Observandose o grafo da modelagem das interligaes de recursos no Disseminrio,nafigura4.1.Verificaseumaboaconectiviadenosistema,pois,apartir dequalquerrecurso,conseguesechegaraoutrorecursoquetenhaalgumarelaocom esse. Comoexemplodeboamodelagem,podesecitaraligaoentreoseminrio Histria de Arte e Participantes, Apresentaes e Coordenador. Todas estas

informaessorealmentepertinentesaoseminrioemquesto,e,almdeconseguir chegar at elas a partir do recurso do seminrio, possvel voltar ao seminrio posteriormente,casosequeira.

Figura4.1:DiagramadaInterligaodeRecursos 4.1.8Definiodasrespostasbemsucedidas Nestaetapadefinidaainteraoentreclienteeservidornoscasosnormais,aquelesem quenenhumerroocorreu. DeveserrespeitadooprotocoloHTTP,quedefinecdigosderespostadeacordo com a requisio que foi feita, alm de estabelecidas quais sero as representaes enviadasemcadaresposta. RequisiesGETeDELETE,quandoefetuadascomsucesso,devemreceberno cabealho da representao da resposta o cdigo 200 ("OK"), e no seu corpo as informaesdesejadas.Porexemplo,noDisseminrioumGETemUsuriosobtmuma lista de usurios, uma operao DELETE nas propostas de seminrio retorna uma pginainformandoqueapropostafoiremovidacomsucesso. Requisies PUT e POST, quando efetuadas com sucesso, devem receber no cabealho da representao da resposta o cdigo 201 ("Criado"), no caso de uma requisioPOSTincludoumparamatroLocationcontendoaURIdeondeorecurso foicriado,porexemplo,oendereodeumapropostadeseminrioquandoefetuado umPOSTnorecursoPropostasdeSeminrios.

Neste ponto tambm so consideradas questes de cache, um cliente pode ignorar representaes de recursos que no tenham sido atualizadas depois de um determinadoperodoparaeconomizartempoelarguradebanda,mascabeaoservidor verificarseorecursofoiatualizado,respondendocomarepresentaotodacasotenha sido,ouentorespondendocomocdigo304("NoModificado")eomitindoocorpoda representao.TodavianofoiimplementadomecnismodecachenoDisseminrio. 4.1.9Definiodasrespostasmalsucedidas Quandoalgoocorredeerradonainteraoentreaspartescomunicantesoservidordeve respondercomcdigosHTTPnasfaixas:3xx,4xx,ou5xx. Cdigos de erros so importantes pois explicitam o motivo do erro, por exemplo,casoumclienteenvieumarepresentaocomerrosemumarequisioPUT,o servidor deve responder com o cdigo 400("Requisio Incorreta") de forma que o clienteidentifiqueacausapelaqualsuarequisionoteveoefeitodesejado. AlmdoscdigosdeerronoDisseminriosoenviadaspginasXHTMLque descrevemomotivodoerroepossuemligaeshipermdia,paraqueousuriopossa contornarestasituao. 4.2DesenvolvimentoGuiadoporComportamento ODesenvolvimentoGuiadoporComportamento (BehaviourDrivenDevelopment) umatcnicadedesenvolvimentogilquetemnfasenadescriodocomportamentoda aplicao. Ela foi criada por Dan North [8], que enfrentava problemas ao ensinar ProgramaoGuiadaporTestes paraseusalunos: oquetestar,como darnomeaos testesecomoentenderporqueumtestefalhou[8]. OBDDfoicriadoapartirdoTDD[4],queumatcnicadedesenvolvimento gilnaqualtodoocdigooriginadoapartirdetestes,umainversodoparadigma tradicionaldecodificao. Acadaciclodeoprogramadorassumediversospapis,odetestadorquandocria testes,odeanalistaquandobuscaformasderesolveroproblemautilizandotestes,ode projetistaquandofatoraocdigoparamelhoraroprojetoedeprogramadorquandofaz ocdigoparapassarnostestes.OcicloTDDpodeserobservadonafigura4.3. NoDesenvolvimentoGuiadoporTestesnormalmentesetemparacadaclassedo modeloumaclassedetestes[9],quepossuiumasriedemtodos,cadaumdelesum testedeunidade. Noexisteumaconvenosobreoquantoumtestedeunidadedevetestar,ouse cada teste de unidade deve contemplar todas as possibilidades de execuo de um mtododaclassedomodeloouapenasumestadopossvel. NoDesenvolvimentoGuiadoporComportamentoapalavratesteabolida. ElasubstitudaporHistrias,CenrioseExpectativas.Oquetornamaisfcilsaber onde e o que testar, pois as histrias e cenrios so as prprias especificaes do sistema, quevmdiretamente docliente do softwareedefinem o ponto de partida. Destamaneira,nodependendodacriatividadedoprogramador,comoaconteceem TDD.

Ousodeumalinguagemprximadanaturalfacilitaacriaodaespecificao, pois,podeseusarumalinguagemmuitoparecidacomadocliente,queemseguida,se tornarcdigoexecutvel. 4.2.1Histrias As histrias so descries de funcionalidades, os cenrios so contextos para a ocorrncia das histrias e as expectativas so o que se espera que acontea em determinados cenrios de uma histria. Sendo assim, as histrias so compostas de cenrios,estes,compostosporprcondieseexpectativas. Assimcomoo[10],oBDDpropequesefaausodelinguagemubqua[8]. Escolheuse o seguinte modelo para a escrita de histrias, o que culminou no estabelecimentodeumalinguagemcomum: Histria:{Ttulodahistria} Eucomo{umpapel} Quero{ao} Para{resultadoesperado} Cenrio:{Ttulodocenrio} Dadoque{prcondio} Caso{ao} Ento{expectativas} Apartirdomomentoquesetemahistriaescrita,podesetransformlaem cdigoexecutvel. 4.2.2BDDnoDisseminrio No Disseminrio, todas as histrias foram escritas em texto e depois passadas para cdigo. Em termosde cdigo foiutilizada a linguagem Java eo frameworkJUnit e adotadoaseguinteestruturaparaarmazenarasespecificaes: pacote:nomecorrespondeaonomedahistria classesdopacote:nomescorrespondentesaoscenriosdahistria mtodosdasclasses:prcondieseexpectativasdoscenrios Abaixo,segueumexemplodehistriaUsurioParticipandodeSeminrioque foiimplementadanoDisseminrio: Histria:UsurioParticipandodeSeminrio Eucomoumusurio Queroparticipardeumseminrio

Parapoderpublicarumaapresentao Cenrio:QuandoexisteoSeminrio DadoqueexisteousuriousuarioDoDisseminario@edugraf.ufsc.br eQueexisteoseminriodenomeUmSeminrio Caso ousuriousuarioDoDisseminario@edugraf.ufsc.brenvieumasolicitao departicipaoparaoseminrioUmSeminrio Ento Deve ser criado um participante /UmSeminario/participante/usuarioDoDisseminario@edugraf.ufsc.br denomeFulano deendereodecorreioeletrnicousuarioDoDisseminario@edugraf.ufsc.br Deveexistirumenlaceem/UmSeminario/participantes/ apontandopara/UmSeminario/participante/usuarioDoDisseminario@edugraf.ufsc.br. AhistriaacimafoitransformadaemumesqueletodecdigoJava,comopode serobservadonalistagem4.1.
Listagem4.1:Histria:UsurioParticipandodeSeminrio

em

packageusuarioParticipandoDeSeminario; publicclassQuandoExisteOSeminarioextendsInfraEstruturaDeEspecificacao{ publicstaticvoidconsiderandoQue(){ existeOUsuario_usuarioDoDisseminario_arroba_edugraf_ ufsc_br_de_nome_Fulano(); existeUmSeminario_de_nome_UmSeminario(); } publicstaticvoidcaso(){ oUsuario_usuarioDoDisseminario_arroba_edugraf_ufsc_br _envieUmaSolicitacaoDeParticipacaoParaOSeminario _UmSeminario(); } publicvoidentao(){ deveSerCriadoUmParticipanteEm_seminario_UmSeminario_participa DoDisseminario_arroba_edugraf_ufsc_br(); deNome_Fulano(); deEnderecoDeCorreioEletronico_usuarioDoDisseminario_arroba_

edugraf_ufsc_br(); deveExistirUmEnlaceEm_seminario_UmSeminario_participantes_ deTexto_Fulano(); apontandoPara_seminario_UmSeminario_participante_usuarioDo Disseminario_arroba_edugraf_ufsc_br(); } Umavezqueahistriatransformadaemcdigo,nohmaisnecessidadede mantlacomotexto,poispossvelobterotextoapartirdahistriaemcdigo.Eessa umadasgrandesvantagensdeseterespecificaesexecutveis:asincroniaquese mantm entre elas e o cdigo. Qualquer alterao que se faa na especificaes registradadiretamentenocdigo.Umavezqueaespecificaocdigo,mantendoas especificaessempreatualizadas. 5Implementao EstaseodescreveaimplementaodoDisseminrio,explicitandoaorganizaode seusmduloseastecnologiasutilizadasnaimplementao. 5.1Disseminrio A implementao do Disseminrio foi realizado utilizandose a linguagem de programaoPHP,umalinguageminterpretadaefracamentetipada,criadaem1995 paraacriaodepginaswebdinmicas,podendoserembutidaempginasHTML[11]. Foiutilizadaaverso5dalinguagem,quepossuumsuportemaiscompletoa orientaoaobjetosquesuapredecessora. 5.1.1Arquitetura Odisseminrioumsistemaemcamadas,conformepodeservistonafigura5.1.Cada camadatemumsubsistemaqueofereceserviossomenteparaacamadaimediatamente superior.

Figura5.1CamadasdoDisseminrio

As requisies HTTP so tratadas pela camada de servios, ocasionando chamadasascamadassubsequenteseporfimumarespostacontendoumarepresentao enviadaparaoclientequeoriginouarequisio,destaformaacamadadeserviosa nica interface do sistema para com o cliente, reduzindose o acoplamento com o mesmo.Estainteraoentreclienteservidorpodeservisualizadanafigura5.2.

Figura5.2InteraoCliente/Servidor 6.1.2Camadadeservios AcamadadeserviosfoiimplementadadeformaarecebertodasasrequisiesHTTP feitasparaoservidor,direcionandoasparaumafachada. Nafachadaarequisioanalisadaeidentificadoqualotratadorresponsvel por ela na camada de negcios, a estes tratadores dado o nome de recursos, que possuem uma interface com um mtodo para cada operao da interface interface uniformeHTTP. Namodelagemfoiutilizadaumametforaderoteamento,ondeumaRotaa ligao entre uma URI e o Recurso responsvel pelo seu tratamento, e a responsabilidadedeidentificaraqualarotacorrespondeumarequisiodelegadaa umRoteador. 6.1.3CamadadePersistncia Foi utilizado o arcabouo Doctrine[10], responsvel pelo mapeamento objeto relacional,realizandoainterfaceentreomodelodenegcioseacamadadepersistncia. ComoSGBDfoiutilizadoMySQL. NoDoctrineoesquemadabasededadosdescritoemYAML[11],umalinguagem dedescriodedadosdefcilleituraparahumanosemquinas,apartirdesteesquema sogeradasasclassesresponsveispelomapeamentoobjetorelacional,basededadose tabelasassociadas.

ODoctrineutilizaumalinguagemprpriaparaasconsultas,aDQL(DoctrineQuery Language),inspiradaemSQLequecapazderetornarobjetoscomoresultadodeuma consulta. Alm de automatizar tarefas queteriam de ser feitas manualmente o Doctrine tambmpossuiavantagemdenoseracopladoaumSGBDespecfico,bastandoque algumas configuraes sejam feitas para que outro SGBD seja utilizado, sem que nenhum cdigo precise ser alterado, j que tanto o esquema como a linguagem de consultasoindependentesdeumaplataformaespecfica. 6.2Verificaodasespecificaes AsespecificaesforamimplementadasemJava,utilizandooarcabouoJUnit. ComoclienteHTTPfoiutilizadooconectorRestlet,baseadonoclienteApache Commons[12]. PararealizaodasextraodasinformaesdasrepresentaesXHTMLfoi utilizadooparserApacheXerxes[13],quepossuisuporteaconsultasXPath,utilizadas paraobterasinformaesdesejadas. Concluses Um sistema web de apoio de Seminrios foi desenvolvido, baseado na arquitetura orientada a recursos. Isto lhe conferiu caractersticas distintas quando comparado a maioria dos sistemas web projetados, tanto pro usurio comum, quanto pro desenvolvedor. Paraousuriocomumaspartesmaisimportantesasedestacarsoasprprias propriedadesdaROA.Oestadodaaplicaosendomantidopelocliente,garantequeos enlacesnodeixarodefuncionaremacessosposteriores,poisoservidornoguardao estadodaaplicao.Aendereabilidade,quepermiteaousuriomandaroenlacede qualquerumdosrecursosdosistemaparaoutrapessoaeestaconseguiracesslo.A conectividade, quedaousurioafacilidadedenavegarentreasdiversaspartesdo sistemaeainterfaceuniforme,quedevidoasemnticaempregadanohttp,protegeas aesdousurio,nofazendoalteraesemdadossimplesmenteaoacessarenlaces. Quanto ao desenvolvedor, alm de poder aproveitar as caractersticas gosadaspelo usuriocomum,temapossibilidadedecriardiversosclientesparaacessarosistema. Uma das peculiaridades do desenvolvimento foi o emprego de programao orientadaporcomportamento.Portratarsedeumatcnicadedesenvolvimentopouco pesquisadaeutilizadaemmeioacadmico,poucossoosartigoscientificospublicados sobreela. Elafoi empregadade uma formadiferented decostume,sem ousode mocks. Pois, o sistema que estava sendo testado, era acessvel atravs da interface uniformedeROA,einjetandosemocksnelediferentementedaabordagemcomum, ondesefazousodemocks,tinhaseainterfaceuniformedohttpparasecomunicar,e atravsdela,faziaseaconfiguraodosistemanocenrioesperadoparaaverificao daespecificao. Algunsaspectosforamforadoscombasenateoriadescritaem[2],ehouve dificuldade no desenvolvimento de autenticao HTTP sem o uso de cookies, no encontrouseumaboasoluoparaobomfuncionamentodamesma. Otrabalhocomoumtodofoimuito proveitoso,poiscompreendeuoestudode conceitosavanadoseatuaisemconjunocomaaplicaodeles.Almdoempregode

tcnicas em circunstncias talvez nunca antes utilizadas, como o caso de BDD combinadoaROA.

Referncias
[1]FIELDING,R.ArchitecturalStylesandtheDesignofNetworkbasedSoftware Architectures.Tese(Doutorado)UNIVERSITYOFCALIFORNIA,IRVINE,2000. [2]RICHARDSON,S.R.L.RESTfulWebServices.[S.l.]:OReillyMedia,2007. [3]GARLAN,M.S.D.AdvancesinSoftwareEngineeringandKnowledge Engineering.[S.l.]:WorldScientificPubCo.,1993. [4]BECK,K.TestDrivenDevelopment:ByExample.[S.l.]:AddisonWesley Professional,2002. [5]HYPERTEXTTransferProtocolHTTP/1.1(RFC2616Fielding,etal).Disponvel em:http://www.w3.org/Protocols/rfc2616/rfc2616.html.Acessoem:20out.2008. [6]EXTENSIBLEMarkupLanguage(XML).Disponvelem: http://www.w3.org/XML/.Acessoem:20out.2008. [7]UNIFORMResourceIdentifier(URI):GenericSyntax.Disponvelem: http://labs.apache.org/webarch/uri/rfc/rfc3986.html.Acessoem:20out.2008. [8]NORTH,D.Introducingbdd.BetterSoftwareMagazine,2006.Disponvelem: http://dannorth.net/introducingbdd.Acessoem:13out.2008. [9]ADAMS,T.Bettertestingthroughbehaviour.OpenSourceDevelopers Conference,2007. [10]DOCTRINEFreeOpenSourcePHPORM.Disponvelem:http://www.doctrine project.org/.Acessoem:20out.2008. [11]YAML:YAMLAintMarkupLanguage.Disponvelem:http://www.yaml.org/. Acessoem:20out.2008. [12]RESTLET1.0Connectors.Disponvelem: http://www.restlet.org/documentation/1.0/connectorshttpclAcessoem:20out.2008. [13]XERCESJavaParser.Disponvelem:http://xerces.apache.org/xercesj/.Acesso em:20out.2008.

Anda mungkin juga menyukai