uma aplicação da arquitetura orientada a recursos · orientado a recursos, o sistema...
TRANSCRIPT
Erich Silvestre, Pablo Valério Polônia
Uma Aplicação da Arquitetura Orientada a Recursos
02 de dezembro de 2008
Erich Silvestre, Pablo Valério Polônia
Uma Aplicação da Arquitetura Orientada a Recursos
Orientador:
Luiz Fernando Bier Melgarejo
02 de dezembro de 2008
Uma Aplicação da Arquitetura Orientada a Recursos
Trabalho de conclusão de curso apresentado como parte dos requisitos para obtenção do grau
de Bacharel em Ciência da Computação.
Prof. M. Sc. Luiz Fernando Bier MelgarejoOrientador
Banca Examinadora
Prof. Dr. José Mazzucco Jr.
Prof. Dr. Rosvelter Coelho da Costa
Resumo
Muito esforço tem-se empregado em pesquisas sobre serviços web, e grande parte des-tas pesquisas ignora completamente o estilo de arquitetura proposta originalmente para a web.Buscou-se com este trabalho resgatar um estilo arquitetural desenvolvido para sistema distribuí-dos de hipermídia, REST, que foi introduzido por um dos idealizadores da web, Roy Fielding, eestudar uma arquitetura que segue esse estilo, a Arquitetura Orientada a Recursos (ROA), pro-posta por Leonard Richardson e Sam Ruby em 2007 a partir de observações pragmáticas sobre oemprego de REST na web. Tendo como objetivo, o emprego destas teorias no desenvolvimentode uma aplicação de apoio a seminários, utilizando-se de técnicas agéis tais como ProgramaçãoOrientada por Comportamento como metodologia. Como resultado, criou-se um sistema weborientado a recursos, o sistema Disseminário de apoio a seminários.
Palavras-chave: REST, Arquitetura Orientada a Recursos, Desenvolvimento Guiado porComportamento, Desenvolvimento Guiado por Testes, Seminários.
Abstract
A big effort has been done on web services research and most of these researches com-pletely ignore the originally proposed web architecture. In this work we tried to bring backan architectural style built for distributed hypermedia systems, REST, introduced by one of theweb idealizers, Roy Fielding, and study an architecture that follows this style, the Resource-Oriented Architecture (ROA), proposed by Leonard Richardson and Sam Ruby on 2007 basedon pragmatic observations of REST on the web. Our goal is to apply these theories to developa seminars management system, using agile techniques as Behaviour-Driven Development asour development methodology. As result, a resource-oriented seminar system has been built,the Disseminário seminars management system.
Keywords: REST, Resource-Oriented Architecture, Behaviour-driven Development, Test-Driven Development, Seminars.
Sumário
Lista de Figuras
Lista de Tabelas
Lista de abreviaturas e siglas
1 Introdução p. 18
1.1 Objetivo Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 18
1.2 Objetivos Específicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 18
2 REST p. 20
2.1 Derivação de REST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 20
2.1.1 Cliente/Servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 21
2.1.2 Sem-Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 21
2.1.3 Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 22
2.1.4 Interface uniforme . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 23
2.1.5 Camadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 23
2.1.6 Código sob demanda . . . . . . . . . . . . . . . . . . . . . . . . . . p. 25
2.2 Elementos Arquiteturais . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 25
2.2.1 Elementos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . p. 25
2.2.2 Componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 27
2.2.3 Conectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 28
3 Arquitetura Orientada a Recursos p. 29
3.1 Conceitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 29
3.1.1 Recursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 29
3.1.2 Identificadores de Recursos . . . . . . . . . . . . . . . . . . . . . . p. 29
3.1.3 Representações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 30
3.2 Propriedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 31
3.2.1 Endereçabilidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 31
3.2.2 Sem-estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 31
3.2.3 Conectividade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 33
3.2.4 Interface Uniforme . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 34
4 Metodologia p. 36
4.1 Resumo do Procedimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 36
4.1.1 Identificação dos dados do domínio . . . . . . . . . . . . . . . . . . p. 37
4.1.2 Definição dos recursos . . . . . . . . . . . . . . . . . . . . . . . . . p. 38
4.1.3 Definição dos nomes dos recursos . . . . . . . . . . . . . . . . . . . p. 39
4.1.4 Definição das operações sobre os recursos . . . . . . . . . . . . . . . p. 41
4.1.5 Representações aceitas pelo servidor . . . . . . . . . . . . . . . . . . p. 43
4.1.6 Definição das representações oferecidas pelo servidor . . . . . . . . . p. 43
4.1.7 Interligação dos recursos . . . . . . . . . . . . . . . . . . . . . . . . p. 44
4.1.8 Definição das respostas bem sucedidas . . . . . . . . . . . . . . . . . p. 44
4.1.9 Definição das respostas mal sucedidas . . . . . . . . . . . . . . . . . p. 46
4.2 Desenvolvimento Guiado por Comportamento . . . . . . . . . . . . . . . . . p. 46
4.2.1 Histórias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 47
4.2.2 BDD no Disseminário . . . . . . . . . . . . . . . . . . . . . . . . . p. 48
5 Disseminário p. 51
5.1 Descrição das funcionalidades . . . . . . . . . . . . . . . . . . . . . . . . . p. 51
5.1.1 Criação de conta . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 51
5.1.2 Autenticação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 54
5.1.3 Criação de Proposta de Seminário . . . . . . . . . . . . . . . . . . . p. 57
5.1.4 Aprovação de Proposta de Seminário . . . . . . . . . . . . . . . . . p. 57
5.1.5 Participação em Seminário . . . . . . . . . . . . . . . . . . . . . . . p. 59
5.1.6 Publicação de Apresentação . . . . . . . . . . . . . . . . . . . . . . p. 59
5.2 Papéis de Usuários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 65
5.2.1 Visitante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 65
5.2.2 Usuário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 66
5.2.3 Coordenador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 66
5.2.4 Administrador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 66
6 Implementação p. 67
6.1 Disseminário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 67
6.1.1 Arquitetura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 67
6.1.2 Camada de serviços . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 67
6.1.3 Modelo de negócios . . . . . . . . . . . . . . . . . . . . . . . . . . p. 69
6.1.4 Camada de Persistência . . . . . . . . . . . . . . . . . . . . . . . . . p. 70
6.2 Verificação das especificações . . . . . . . . . . . . . . . . . . . . . . . . . p. 71
7 Conclusões p. 72
7.1 Resultados Alcançados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 73
7.2 Trabalhos Futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 73
Referências Bibliográficas p. 74
Anexo A -- Código-fonte das Especificações p. 76
Anexo B -- Código-fonte dos Recursos p. 148
Anexo C -- Tipos de Representações p. 249
C.1 Codificação de Formulário . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 249
C.2 JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 249
C.3 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 249
C.4 XHTML com Marcações Descritivas . . . . . . . . . . . . . . . . . . . . . . p. 250
Anexo D -- Artigo: Uma Aplicação da Arquitetura Orientada a Recursos p. 251
Lista de Figuras
2.1 O estilo cliente servidor [1] . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 21
2.2 O estilo Sem-Estado [1] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 22
2.3 O estilo Cache [1] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 23
2.4 Interface Uniforme [1] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 24
2.5 Sistema em Camadas [1] . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 24
2.6 Código sob demanda [1] . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 25
3.1 Aplicação Sem-Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 32
3.2 Aplicação Com-Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 32
3.3 Pesquisa sobre Buracos Negros . . . . . . . . . . . . . . . . . . . . . . . . . p. 33
3.4 Uma aplicação conexa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 34
4.1 Diagrama entidade relacionamento do Disseminário . . . . . . . . . . . . . . p. 37
4.2 Diagrama da Interligação de Recursos . . . . . . . . . . . . . . . . . . . . . p. 45
4.3 O ciclo TDD [2] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 47
5.1 Primeira etapa do cadastramento . . . . . . . . . . . . . . . . . . . . . . . . p. 52
5.2 Mensagem de confirmação de cadastramento . . . . . . . . . . . . . . . . . p. 52
5.3 Segunda etapa do cadastramento . . . . . . . . . . . . . . . . . . . . . . . . p. 53
5.4 Mensagem de conta criada . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 54
5.5 Página de um usuário do Disseminário . . . . . . . . . . . . . . . . . . . . . p. 54
5.6 Lista de usuários do Disseminário . . . . . . . . . . . . . . . . . . . . . . . p. 55
5.7 Enlace de autenticação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 55
5.8 Janela de autenticação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 56
5.9 Usuário navegando autenticado . . . . . . . . . . . . . . . . . . . . . . . . . p. 56
5.10 Enlace de proposta de seminário . . . . . . . . . . . . . . . . . . . . . . . . p. 57
5.11 Página de criação de proposta de seminário . . . . . . . . . . . . . . . . . . p. 58
5.12 Página de uma proposta de seminário . . . . . . . . . . . . . . . . . . . . . p. 59
5.13 Página de um seminário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 60
5.14 Página principal do Disseminário . . . . . . . . . . . . . . . . . . . . . . . . p. 61
5.15 Opção para participar de um seminário . . . . . . . . . . . . . . . . . . . . . p. 61
5.16 Página de um participante de um seminário . . . . . . . . . . . . . . . . . . p. 62
5.17 Lista de participantes de um seminário . . . . . . . . . . . . . . . . . . . . . p. 62
5.18 Enlace para publicação de apresentação . . . . . . . . . . . . . . . . . . . . p. 63
5.19 Página de publicação de apresentação . . . . . . . . . . . . . . . . . . . . . p. 63
5.20 Lista de apresentações de um seminário . . . . . . . . . . . . . . . . . . . . p. 64
5.21 Uma apresentação publicada em um seminário . . . . . . . . . . . . . . . . . p. 64
5.22 Hierarquia de papéis de usuários . . . . . . . . . . . . . . . . . . . . . . . . p. 65
6.1 Arquitetura do Disseminário . . . . . . . . . . . . . . . . . . . . . . . . . . p. 68
6.2 Comunicação entre um cliente e o Disseminário . . . . . . . . . . . . . . . . p. 68
6.3 Diagrama das classes dos recursos . . . . . . . . . . . . . . . . . . . . . . . p. 70
Lista de Tabelas
2.1 Componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 28
2.2 Conectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 28
3.1 Segurança e Idempotência . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 35
4.1 URIs de Recursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 41
4.2 Métodos implementados nos Recursos . . . . . . . . . . . . . . . . . . . . . p. 42
Lista de Listagens
4.1 Representação XHTML com Marcações Descritivas . . . . . . . . . . . . . . p. 43
4.2 História: Usuário Participando de Seminário . . . . . . . . . . . . . . . . . . p. 49
A.1 Arquivo: Teste.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 76
A.2 Arquivo: PublicadorDaHistoriaDaPsicologiaLatinoAmericana.java . . . . . . p. 76
A.3 Arquivo: TesteRepresentacaoXHTML.java . . . . . . . . . . . . . . . . . . p. 78
A.4 Arquivo: RepresentacaoNula.java . . . . . . . . . . . . . . . . . . . . . . . p. 79
A.5 Arquivo: RepresentacaoXHTML.java . . . . . . . . . . . . . . . . . . . . . p. 80
A.6 Arquivo: Enlace.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 83
A.7 Arquivo: Microformato.java . . . . . . . . . . . . . . . . . . . . . . . . . . p. 83
A.8 Arquivo: TesteMicroformato.java . . . . . . . . . . . . . . . . . . . . . . . p. 87
A.9 Arquivo: TesteHistoriaDePsicologiaLatinoAmericana.java . . . . . . . . . . p. 89
A.10 Arquivo: TesteRecursoSeminario.java . . . . . . . . . . . . . . . . . . . . . p. 95
A.11 Arquivo: TesteDeRecurso.java . . . . . . . . . . . . . . . . . . . . . . . . . p. 97
A.12 Arquivo: TesteRecursoSeminarios.java . . . . . . . . . . . . . . . . . . . . . p. 99
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: InfraEstruturaDeEspecificacao.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: MensagemDeConfirmacaoDeCadastramento.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: RecursoConfirmacaoDeCadastroDeUsuario.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: FormularioDeConfirmacaoDeCadastro.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: configuracao.inc.php . . . . . . . . . . . . . . . . . . . . . . . . . p. 245
Lista de abreviaturas e siglas
SOA Service-Oriented Architecture, p. 18
REST Representational State Transfer, p. 20
BDD Behaviour Driven Development, p. 46
TDD Test-Driven Development, p. 46
DDD Domain Driven Development, p. 48
18
1 Introdução
Atualmente grande parte dos sistemas web são projetados baseados em uma arquitetura ori-
entada a serviços (), muitas vezes inapropriada dada sua complexidade, que apresenta recursos
avançados proveitosos apenas em contextos específicos.
Como alternativa tem-se o estilo arquitetural no qual a web foi projetada, REST, e uma série
de boas práticas para o desenvolvimento de um sistema web que sigam as restrições REST, a
arquitetura orientada a recursos.
Estas teorias foram aplicadas no desenvolvimento de um sistema web de apoio a seminários,
o Disseminário, utilizando-se também de técnicas ágeis, como o desenvolvimento guiado por
comportamento como metodologia.
Esta monografia é dividida em seis capítulos, no primeiro trata-se de REST, os estilos do
qual se derivou e seus elementos arquiteturais. No segundo capítulo é tratado sobre Arquitetura
orientada a recursos, seus conceitos, propriedades. O terceiro capítulo descreve a metodologia
utilizada no projeto de sistemas orientados a recursos.No quarto é abordado o sistema Dissemi-
nário de apoio a seminários. No quinto são expostos aspectos da implementação e no capítulo
final, são apresentadas conclusões, 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 seminários.
1.2 Objetivos Específicos
• Compreender o estilo arquitetural REST
• Compreender a arquitetura orientada a recursos
20
2 REST
Rest é um estilo arquitetural híbrido, derivado de vários estilos arquiteturais de software
em rede. Ele foi proposto por Roy Fielding em 2000, na sua dissertação de doutorado[1], que
buscou uma combinação de estilos arquiteturais de forma a compor um estilo que reunisse as
melhores características1 para um sistema distribuído de hipermídia.
Um estilo arquitetural é um conjunto coordenado de restrições arquiteturais, que recebe
nome por facilidade de uso, sendo composto por restrições arquiteturais e elementos arquitetu-
rais, 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 composição de estilos já existentes, REST se encaixa na última.
A cada adição de uma restrição a um estilo arquitetural, pode ocasionar a derivação de um
novo estilo. O espaço de todos estilos arquiteturais pode ser visto com uma árvore, em que a
raiz é o estilo nulo ou sem restrições, e a cada adição de uma restrição é criado um novo estilo,
que por sua vez, pode dar origem a outro, caso seja adicionada a ele uma nova restrição.
2.1 Derivação de REST
REST foi derivado dos seguintes estilos:
• Cliente/servidor
• Sem estado
• Cache
• Interface Uniforme1Performance em rede, performance percebida pelo usuário, eficiência, escalonabilidade, simplicidade, evolu-
tividade, extensibilidade, personabilidade, configurabilidade, reusabilidade, visibilidade, portabilidade e confiabi-lidade.
21
• Sistema em Camadas
• Código sob-demanda
2.1.1 Cliente/Servidor
A primeiro estilo arquitetural utilizado na derivação de REST foi o Cliente/Servidor. Nele
são definidos dois papéis: o do servidor, que disponibiliza um conjunto de serviços, e do cliente,
que faz uso destes serviços.
O servidor aguarda por requisições de clientes para uso de serviços, e ao recebê-las, toma a
decisão de aceitá-las ou não.
Fielding considera a separação de preocupações como sendo o princípio por trás desta ar-
quitetura. Um exemplo é o serviço de correio eletrônico. De um lado têm-se o leitor de correio
eletrônico, que assume o papel de cliente, e do outro o servidor de correio eletrônico.
O leitor tem a preocupação de facilitar o gerenciamento e leitura de mensagens, através de
uma interface gráfica operada pelo usuário. O servidor tem preocupações diferentes, como o
armazenamento eficiente das mensagens e a rapidez no acesso as mesmas.
Fazendo-se tal separação, resta entre os dois uma interface comum, facilitando a portabili-
dade do cliente e a simplificação do servidor, aumentando a escalonabilidade.
A figura 2.1 ilustra o estilo arquitetural após a primeira restrição aplicada.
Figura 2.1: O estilo cliente servidor [1]
2.1.2 Sem-Estado
Na restrição Sem Estado o servidor não armazena qualquer informação de contexto, qual-
quer informação necessária para atender a uma requisição deve estar contida nela mesma. Isto
torna o servidor mais simples, pois ele não precisa levar em consideração o contexto atual para
tomar decisões, toda informação necessária será enviada a ele a cada requisição.
22
. Pode-se citar a autenticação via cabeçalho HTTP como um exemplo da aplicação da
restrição sem estado.
Numa primeira requisição enviada pelo cliente, o servidor responde com um cabeçalho
exigindo autenticação, esse deve enviar as credenciais e aguardar pelo resultado, caso forem
aceitas o servidor atenderá a requisição. O processo não se altera nas requisições seguintes,
porém, o cliente poderá optar por armazenar as credenciais, para evitar que o usuário tenha de
digitá-las novamente a cada requisição.
Pode-se dizer que com a inclusão desta restrição a escabilidade aumenta, pois o servidor não
precisa armazenar dados de contexto entre requisições, podendo assim, liberar recursos. Como
cada requisição porta todos os dados necessários para reconhecê-la, a visibilidade é aumentada.
A figura 2.2 evidencia o estilo arquitetural cliente/servidor sem estado.
Figura 2.2: O estilo Sem-Estado [1]
Algumas desvantagens do estilo Sem-Estado são a redundância dos dados, que precisam
ser enviados novamente a cada requisição e a redução do controle por parte do servidor do
funcionamento correto da aplicação, pois o cliente que efetua o controle do estado da aplicação.
2.1.3 Cache
A restrição arquitetural cache evita que dados já tenham sido enviados anteriormente ao
cliente, sejam re-enviados. Para tanto, deve haver uma indicação implícita ou explícita em cada
requisição, informando se deve ser utilizado cache ou não.
Segundo [1], a vantagem de se utilizar cache é a eliminação parcial ou total de algumas in-
terações entre cliente/servidor. Melhorando a eficiência (menos dados trafegando com a mesma
funcionalidade), escalabilidade (menos processamento e E/S) e a performance percebida pelo
usuário (servidor menos carregado, menor tempo de resposta). Contudo, a confiabilidade é
23
Figura 2.3: O estilo Cache [1]
reduzida, pois pode acontecer de dados obtidos diretamente do servidor (sem uso de cache), se-
rem substancialmente diferentes dos dados obtidos anteriormente com cache, isso depende da
política adotada pelo cliente, que pode expirar uma requisição depois de n tempo ou trabalhar
com requisições ’se modificado depois de’. O resultado da aplicação da restrição cache ao estilo
Cliente/Servidor, Sem-Estado, pode ser visualizado na figura 2.3
2.1.4 Interface uniforme
A principal distinção entre REST e outros estilos arquiteturais para web é a enfâse no uso
de uma interface uniforme entre seus componentes [1].
Com o uso de uma interface uniforme, a visibilidade de cada interação é aumentada pois o
conjunto de métodos para cada elemento do sistema é conhecido, sendo assim, a cada execução
de um método sua semântica é sempre conhecida. O sistema se torna mais simples, pois cada
componente implementa os mesmos métodos.
Aplicando-se a restrição interface uniforme ao REST, verificamos o seguinte estilo 2.4
2.1.5 Camadas
Na restrição camadas, o sistema é dividido em camadas e a cada camada conhece apenas
a fachada da camada seguinte, criando-se vários subsistemas. Essa restrição diminui a aco-
plamento, pois cada camada tem acesso apenas a interface da camada seguinte, sem saber os
detalhes de implementação desta.
Pode-se utilizar, por exemplo, a persistência em uma subcamada, permitindo acesso apenas
25
à sua API, isso permite sua substituição, caso torne-se necessário.
2.1.6 Código sob demanda
O código sob demanda é a utilização de lógica armazenada no servidor, a ser executada
pelo cliente. Desta forma, partes do cliente ficam pré-implementadas no servidor. Applets e
código JavaScript armazenados no servidor, são exemplos de código sob demanda.
O código sob demanda é a única restrição arquitetural opcional de REST.
Figura 2.6: Código sob demanda [1]
2.2 Elementos Arquiteturais
2.2.1 Elementos de Dados
Os elementos de dados de um estilo arquitetural são os elementos de informação que são
trocados entre componentes, via conectores. Rest possue três elementos de dados: Recursos,
Identificadores de Recursos e Representações.
Recursos
Um recurso é qualquer informação que possa ser nomeada: um documento, uma imagem,
um serviço metereológico, uma coleção de outros recursos, um recurso não virtual (por exemplo
26
uma pessoa) e assim por diante. Em outras palavras, qualquer conceito que possa ser sujeito a
uma referência hipertextual se encaixa na definição de recurso [1].
Formalmente um recurso R é uma função de pertinência, que tem como domínio o tempo
e como imagem um conjunto de entidades ou valores que são equivalentes, os valores neste
conjunto podem ser representações de recurso e/ou identificadores de recurso. Um recurso
pode mapear para o conjunto vazio, o que permite que referências sejam feitas antes de que
qualquer implementação do conceito exista [1]. Um recurso é considerado dinâmico caso o
conjunto de entidades ao qual mapeia varie com o tempo, ou estático caso contrário.
O recurso se refere ao mapeamento em si, e não ao conjunto de entidades ao qual ele
mapeia. Por exemplo um recurso que corresponde a última versão de um software qualquer
e outro que corresponde a versão 1.0 deste mesmo software, em um determinado instante de
tempo podemos ter a versão 1.0 coincidindo com última versão, ambos os recursos estarão
mapeando para a mesma entidade, mas estes recursos são diferentes pois suas semânticas são
diferentes, podendo ser identificados e referenciados de forma independente.
Recursos generalizam várias fontes de informação, sem distinguir por tipo ou implementa-
ção e permitem uma ligação tardia entre recurso e representação, permitindo que o conteúdo da
resposta seja definido através de características da requisição e permitindo que o autor de uma
referencia aponte para um conceito, e não uma representação única do mesmo, desta forma
quando a representação for alterada não será necessário alterar as referências ao seu recurso
(assumindo que o autor utilizou o identificador correto). [1]
Identificadores de recursos
A função do identificador de recurso é a identificação de um recurso envolvido em uma
determinação interação. Todo recurso é referenciado por meio de um identificador de recurso, o
responsável pelo identificador também é responsável por manter a validade semântica do mape-
amento, garantindo que o identificador estará referenciando o recurso correto. O identificador
de recurso utilizado na Web é a URI.
Representações
Componentes REST manipulam recursos usando uma representação para descrever o es-
tado atual ou desejado do recurso e transferindo esta representação entre os componentes. Uma
representação é uma sequência de bytes e meta-dados(informação sobre informação) para des-
crever estes bytes [1]
27
Meta-dados são enviados como pares de nome-valor e podem descrever dados sobre o re-
curso, uma de suas representações ou mesmo sobre outros meta-dados (esta referencia cíclica é
geralmente utilizada para verificar a integridade de mensagens).
Dados de controle definem o propósito de uma mensagem entre os componentes como
a ação requisitada ou o significado de uma resposta, estes dados tambem são utilizados para
parametrizar uma requisição e alterar o comportamento padrão dos elementos conectados. Por
exemplo o comportamento da cache pode ser modificado por dados de controle embutidos em
uma requisição.[1]
O tipo de dados de uma representação é conhecido como tipo de mídia, uma representação
pode ser entregue através de uma mensagem e processada pelo destinatário de acordo com os
dados de controle e o tipo de mídia, tipos de mídia compostos podem envolver várias represen-
tações em uma única mensagem.[1]
Podemos realizar a negociação de conteúdo baseada nos tipo de mídias disponíveis de uma
representação, por exemplo um recurso ata de reunião pode ser representada por um documento,
uma imagem da ata manuscrita ou mesmo uma gravação em um arquivo de áudio, a represen-
tação pode conter meta-dados como: o número de páginas no caso do documento, tamanho em
pixeis na imagem ou duração em segundos na gravação.
2.2.2 Componentes
Um componente é uma unidade abstrata de software, e um estado interno, que executa
transformações em dados através de sua interface [1]. Pode-se definir também, como o elemento
de um sistema que efetua computações [3]. Os componentes são os extremos nas interações,
fazendo interface com o usuário. Exemplos de componentes estão expostos na tabela 2.1.
O componente agente de usuário utiliza um conector cliente para fazer requisições a um
servidor de origem e receber respostas. Ele pode também, conectar-se a um proxy e fazer requi-
sições a este, a fim encapsular a API de outros serviços, traduzir dados, melhorar a performance
ou melhorar a aspectos de segurança [1]. Um gateway é um proxy inverso, imposto pelo agente
servidor de origem, utilizado pelos mesmos motivos que levam o agente de usuário a utilizar
um proxy.
28
Componente Exemplo WEB Atualservidor de origem apacheagente do usuário Firefox
gateway Squidproxy Squid
Tabela 2.1: Componentes
Conector Exemplo WEB Atualcliente libwww
servidor libwwwcache cache do navegador
resolvedor libDNStúnel SOCKS
Tabela 2.2: Conectores
2.2.3 Conectores
Os conectores são mecanismos abstratos de software que mediam comunicação, coordena-
ção ou cooperação entre componentes[1]. REST possui uma série deles, como pode ser visto
na tabela 2.2, com a finalidade de encapsular o acesso a recursos e a transferência de repre-
sentações entre componentes. Por causa da interface uniforme de REST, os conectores podem
ser facilmente substituídos, uma vez que compartilham da mesma interface, abstraindo-se os
detalhes de implementação.
29
3 Arquitetura Orientada a Recursos
A arquitetura orientada a recursos é uma arquitetura que segue o estilo arquitetural REST,
herdando dele, todas as restrições e elementos arquiteturais. Foi desenvolvida através de diver-
sas observações empíricas por Sam Ruby e Leonard Richardson em [4].
ROA é uma arquitetura voltada para serviços web, sendo implementada a partir de tecnolo-
gias da web como o protocolo HTTP[5] e a linguagem de marcação XML[6].
ROA também define algumas propriedades que uma aplicação que segue esta arquitetura
deve possuir: Endereçabilidade, Sem-estado, Conectividade e Interface Uniforme.
3.1 Conceitos
Os conceitos de ROA são mais especificos que suas definições em REST, pois são utilizadas
tecnologias web especificas nas definições.
3.1.1 Recursos
Em ROA a interface uniforme de cada recurso é definida pelo conjunto de métodos utiliza-
dos no protocolo HTTP.
3.1.2 Identificadores de Recursos
Os identificadores de recursos devem ser URIs(Uniform Resource Identifiers)[7], que é o
formato de identificadores utilizado na web. Além disso, as URIs devem ser descritivas e seguir
uma certa estrutura.
A justificativa para a descritividade das URIs é que elas são intuitivas para o usuário, 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 clien-
tes sejam eles humanos ou máquinas.
Por exemplo, considere as seguintes URIs:
Exemplo:
• /animal/Gato
• /bicho/Tainha
Na listagem acima, há dois endereços para recursos com a mesma semântica informal:
/bicho e /animal. Um usuário que acessar /animal/Gato pode querer acessar /animal/Tainha,
caso o recurso endereçado por /animal/Tainha não esteja acessível teremos um problema, pois
impedimos o usuário de acessar um recurso que é semânticamente válido mas não está acessível,
pois não foi seguida uma estrutura previsível ao endereçar os recursos.
3.1.3 Representações
Representações são trocadas entre cliente e servidor através dos métodos HTTP.
Negociação de conteúdo pode ser efetuada através de meta-dados enviados nos cabeça-
lhos das requisições, por exemplo o cabeçalho Accept pode ser usado em uma requisição para
restringir o tipo de mídia (MIME Type) obtido na resposta.
Uma alternativa a utilização de meta-dados nos cabeçalhos das requisições é endereçar cada
representação do recurso através de uma URI, por exemplo:
Um usuário acessando: /animal/Gato, utilizando o cabeçalho Accept na requisição um cli-
ente pode decidir se deseja receber uma imagem ou informações textuais sobre gatos, como
alternativa a isto podemos ter duas URIs /animal/Gato.txt designando informações textuais so-
bre gatos e /animal/Gato.svg como uma imagem.
A vantagem de utilizar diferentes URIs para diferentes representações de um mesmo re-
curso é que a informação está explicita na URI, este endereço pode ser copiado e passado
adiante por um usuário.
A desvantagem é que os recursos endereçados por /animal/Gato.svg e /animal/Gato.txt pa-
recem recursos diferentes, mas ambos descrevem o mesmo conceito, apenas com um formato
diferente, uma solução para este problema é criar um URI canônica em /animal/Gato, nesta URI
existiria uma representação que teria enlaces para todas as representações possíveis do recurso
em questão.
31
3.2 Propriedades
3.2.1 Endereçabilidade
Uma aplicação é endereçavel quando um usuário pode acessar os dados, os recursos da
aplicação, através de URIs.
Esta propriedade garante aspectos interessantes, por exemplo um usuário que queira procu-
rar sobre buracos negros acessa a URI:
http://www.google.com.br/search?q=buraco+negro
Sua busca está endereçada, a URI pode ser copiada e passada adiante para que outros inte-
ressados possam realizar a mesma busca.
Com endereçabilidade também é possível fazer cache de requisições, em uma rede local
podemos ter uma máquina recebendo todas as requisições(um proxy HTTP), quando uma re-
quisição é repetida podemos enviar um resultado salvo ao invés de consumir banda realizando
a mesma requisição duas vezes, sem endereçabilidade não é possível saber quais requisições já
foram efetuadas.
3.2.2 Sem-estado
Sem-estado significa que cada requisição HTTP ocorre em completo isolamento.
Quando o cliente envia uma requisição HTTP, ele inclue toda a informação necessária para
que o servidor satisfaça a requisição. O servidor nunca se vale de informações de requisições
anteriores.[4].
Por exemplo, um usuário que esteja na página dois da sua pesquisa sobre buracos negros,
caso ele queira que outro usuários 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 própria URI contém o estado da aplicação, e não o servidor, o que é evidenci-
ado pela figura 3.1 que representa um diagrama de estados.
Caso esta informação estivesse no servidor este teria de gerenciar a informação do número
da página de cada cliente da aplicação, e um novo cliente teria de efetuar transições realizando
33
operações no servidor até chegar ao estado desejado, conforme pode ser verificado na figura
3.1.
3.2.3 Conectividade
Conectividade é a propriedade que permite que um cliente navegue por entre os recursos da
aplicação através de enlaces hipermídia embutidos nas representações.
Quando um usuário acessa: http://www.google.com.br/search?q=buraco+negro ele recebe
uma série de enlaces pelos quais pode navegar, podendo acessar um dos resultados da pesquisa,
mudar de página, entre outras funcionalidades, conforme a figura 3.3.
Quando o servidor envia uma representação com enlaces, ele está enviando para o cliente
uma série de URIs com estados possíveis da aplicação, é possível mostrar esta propriedade
através de um grafo, onde os nodos são os recursos e as arestas enlaces ligando-os, conforme a
figura3.4.
Figura 3.3: Pesquisa sobre Buracos Negros
34
Figura 3.4: Uma aplicação conexa
3.2.4 Interface Uniforme
A interface uniforme define o conjunto de operações possíveis para cada recurso.
Estas operações são restritas aos métodos do protocolo HTTP, e são listadas abaixo, com a
semântica associada:
• GET: Obtêm a representação de um recurso, assim como os meta-dados associados.
• DELETE: Remove um recurso.
• PUT: Cria ou atualiza um recurso na URI especificada.
• POST: Cria um recurso subordinado ou anexa informações a um recurso, respondendo
com a URI do novo recurso.
• OPTIONS: Lista quais os métodos que podem ser executados no recurso.
• HEAD: Idêntico ao GET, mas omitindo a representação.
Idempotência e Segurança dos métodos da Interface Uniforme
Os métodos da interface uniforme de ROA, podem ser classificados quanto a sua idempo-
tência e segurança.
Um método é seguro, se e somente se, ao ser executado não altera o estado do recurso.
35
Mtodo Seguro IdempotenteGET X XPUT X
POSTDELETE X
HEAD X XOPTIONS X X
Tabela 3.1: Segurança e Idempotência
Um método é idempotente quando a execução dele mais de uma vez consecutiva tem o
mesmo efeito da execução do mesmo uma única vez, todo método seguro é também idempo-
tente.
Os métodos GET, HEAD e OPTIONS são seguros e idempotentes, pois não alteram o
estado do recurso.
PUT e DELETE não são seguros mas são idempotentes, uma sequência de requisições
PUT idênticas irão manter o estado do recurso, assim como a requisição DELETE, que remove
o recurso na primeira requisição e este continua não existindo se outras requisições DELETE
forem efetuadas.
O método POST é o único método não-seguro e não-idempotente.
Estas informações podem ser verificadas na tabela 3.1.
36
4 Metodologia
A metodologia de projeto foi baseada no procedimento descrito em [4] que descreve deta-
lhadamente como desenvolver uma aplicação orientada a recursos.
Também foi utilizada a técnica ágil conhecida como Behavior Driven Development[8] na
elaboração especificações executáveis que garantem o funcionamento do sistema e também
podem ser usadas como documentação, pois descrevem todas as regras do negócio em uma
linguagem próxima da natural.
4.1 Resumo do Procedimento
O procedimento proposto em [4] é dividido em nove passos:
1. Identificação dos dados do domínio
2. Definição dos recursos
3. Definição dos nomes dos recursos
4. Definição das operações sobre os recursos
5. Definição das representações aceitas pelo servidor
6. Definição das representações oferecidas pelo servidor
7. Interligação dos recursos
8. Definição das respostas bem sucedidas
9. Definição das respostas mal sucedidas
37
4.1.1 Identificação dos dados do domínio
Nesta etapa são identificadas quais as informações que serão fornecidas aos clientes do
serviço, baseando-se no domínio da aplicação.
No Disseminário, temos diversos dados nos quais um cliente pode estar interessado, tais
como:
• Usuários
• Seminários
• Coordenadores de seminário
• Participantes de um seminário
• Apresentações
Podemos visualizar a relação entre os dados de domínio através de um diagrama entidade-
relacionamento 4.1
Figura 4.1: Diagrama entidade relacionamento do Disseminário
38
4.1.2 Definição dos recursos
Com o conjunto de dados definido o próximo passo é definir como serão expostos como
recursos HTTP, um recurso é qualquer coisa importante o suficiente para ser alvo de um hyper-
link[4]. Nesta etapa são detalhados os dados do domínio para escolher como expô-los para o
cliente.
Cada entidade de domínio possuí informações, seus atributos, por exemplo um seminário
possuí um título e um tema, um usuário possuí um endereço de correio eletrônico, estas são
informações que podem ser de interesse de um cliente, recursos acessíveis por ele.
Foi estabelecida uma relação direta entre as entidades e recursos, um recurso para cada
entidade do domínio:
• Usuário
• Seminário
• Apresentação
Entidades derivadas de relações também podem ser referenciadas, tornando-as recursos.
Um coordenador pode ser referenciado, assim como um participante, tornando-os endereçáveis.
Quando uma proposta de seminário é feita ela deve ter um endereço, para que o administrador
possa acessa-lá e decidir se irá aprovar ou não.
• Coordenador
• Participante de um seminário
• Proposta de seminário
Um cliente pode estar interessado na lista de seminários, para publicar em seu blog, ou na
lista de usuários, para entrar em contato com eles através de mensagens de correio eletrônico.
A lista de seminários e a lista de usuários são recursos de coleção, foram criados recursos
de coleção para cada recurso de entidade:
• Usuários
• Seminários
39
• Coordenadores
• Participantes de um seminário
• Apresentações de um seminário
• Propostas de seminários
Como os usuários interagem com o serviço através do navegador é preciso prover formulá-
rios que possam ser renderizados pelo navegador, tais como 5.11, para que possam ser preen-
chidos pelo usuário em enviados novamente ao servidor, tais formulários também são recursos.
• Formulário de cadastramento 5.1
• Formulário de confirmação de cadastramento 5.3
• Formulário de criação de proposta de seminário 5.11
• Formulário de envio de apresentação 5.19
Outro recurso criado foi o de cadastramento, que representa uma operação de criação de
conta que ainda não foi concluída. O que motivou a criação deste recurso foi o fato da criação
de conta ser feita em duas etapas, sendo criado o recurso na primeira etapa e tendo que persistir
e ser endereçável para a confirmação na segunda, este recurso foi criado baseado na idéia de
transação, exposta em [4].
4.1.3 Definição dos nomes dos recursos
Todo recurso deve ter um nome, estabelecido através de uma URI[4], além disso cada URI
deve ser descritiva, de fácil entendimento para humanos, e seguir uma certa estrutura que varie
o mínimo possível, evitando ambiguidades.
Na URI raiz do Disseminário são listados todos os seminários abertos ao público, os demais
recursos de coleção são denotados pelo nome da coleção.
Abaixo podemos visualizar algumas URIs e as semânticas dos recursos identificados por
cada uma delas, as URIs foram abreviadas para ficarem relativas ao endereço completo do
Disseminário.
• / : Coleção de todos os seminários públicos
40
• /propostasDeSeminario : Coleção de propostas de seminário
• /usuarios : Coleção de todos os usuários
• /administradores : Coleção de usuários que são administradores
• /coordenadores : Coleção de usuários que são coordenadores
Foram criadas recursos relativos a outros recursos, todos os recursos estão vinculados ao
recurso raiz mas podemos aprofundar estas relações, como por exemplo a coleção de partici-
pantes ou as apresentações de um seminário, a barra neste caso fornece a idéia de escopo onde
o recurso do lado direito da barra está vinculado ao recurso do lado esquerdo, como pode ser
visto abaixo:
• /ArteBarroca : Seminário de arte barroca
• /ArteBarroca/participantes : Coleção de participantes do seminário de arte barroca
• /ArteBarroca/apresentacoes : Coleção de apresentações do seminário de arte barroca
Um recurso que merece destaque é o arquivo da apresentação (que pode ser do formato
odp,ppt ou pdf), usuários poderiam enviar sua apresentação em vários formatos para evitar pro-
blemas relacionados a diferentes versões do software de visualização de apresentações, existem
duas opções para representar tipos de mídia específicos, para possibilitar esta funcionalidade.[4].
Uma opção é a inclusão da informação do tipo de mídia no cabeçalho HTTP da resposta
através da propriedade Content-Type, desta forma uma mesma URI pode servir representações
de tipos diferentes de mídia, um cliente acessaria /ArteBarroca/Aleijadinho/apresentacao po-
dendo escolher qual tipo de mídia quer receber na resposta, informando no cabeçalho de sua
requisição a propriedade Accept.
A outra opção é estabelecer URIs diferentes para cada tipo de mídia, tais como:
• /ArteBarroca/Aleijadinho/apresentacao.pdf
• /ArteBarroca/Aleijadinho/apresentacao.odp
Nesta opção o tipo de mídia fica explícito na URI, tornando mais claro para o usuário o que
está sendo requisitado. Esta foi a opção escolhida no Disseminário.
Todos os exemplos de URIs podem ser visualizados na tabela abaixo:
41
/ Todos os seminários públicos/propostasDeSeminario Propostas de seminário/usuarios Todos os usuários/coordenadores Usuários que são coordenadores/ArteBarroca Seminário de arte barroca/ArteBarroca/participantes Participantes do seminário de arte barroca/ArteBarroca/apresentacoes Apresentações do seminário de arte barroca/ArteBarroca/participante/[email protected] Participante do seminário de arte barroca/ArteBarroca/Aleijadinho/apresentacao.pdf Arquivo pdf da apresentação de título Aleijadinho/ArteBarroca/Aleijadinho/apresentacao.odp Arquivo odp da apresentação de título Aleijadinho/ArteBarroca/apresentacao Formulário de envio de apresentação/ArteBarroca/apresentacao/Aleijadinho Apresentação de título Aleijadinho/usuario/[email protected] Usuário/administrador/[email protected] Usuário administrador/coordenador/[email protected] Usuário coordenador de/cadastramento Formulário de cadastramento/cadastramento/[email protected] Processo de cadastramento do usuário/propostaDeSeminario Formulário de proposta de seminário/propostaDeSeminario/2 Proposta de seminário de código dois
Tabela 4.1: URIs de Recursos
4.1.4 Definição das operações sobre os recursos
Neste ponto, é necessário decidir quais os métodos da interface uniforme serão permitidos
em cada recurso. Esta escolha é uma decisão de projeto e guiada pelo poder que se deseja
conferir aos clientes.
Como descrito na seção 3.2.4, a interface uniforme de ROA é composta pelos métodos
HTTP. A decisão de implementar ou não um método pode ser tomada a partir de perguntas,
relativas as ações que os clientes poderão efetuar em um determinado recurso:
• Os clientes poderão ler o recurso? Se sim, implementar GET
• Os clientes poderão criar novos recursos deste tipo? Caso afirmativo. Quem está encar-
regado de saber onde ficarão os novos recursos criados? Se o cliente, implementar PUT,
caso seja o servidor, implementar POST.
• Os clientes irão atualizar dados do recurso? Em caso afirmativo, implementar PUT
• Os cliente irão remover recursos deste tipo? Se sim, implementar DELETE
Os outros dois métodos da interface uniforme, HEAD e OPTIONS, provêm dos métodos já
definidos. O método HEAD, por diferenciar-se do método GET apenas por não enviar o corpo
42
Recurso URI GET POST PUT DELET EAdministradores /administradores XApresentações /{seminário}/apresentacoes XArquivo de apresentação /{seminário}/{apresentação}/{arquivo} XCoordenadores /coordenadores XParticipantes /{seminário}/participantes XRaiz ou Seminários / XUsuários /usuarios XAdministrador /administrador/{correioEletronico} X X XApresentação /{seminário}/{apresentação} X X XCadastramento /cadastramento/{correioEletronico} X X XCoordenador /coordenador/{correioEletronico} X X XParticipante /participante/{seminário}/{correioEl..} X X XProposta de Seminário /propostaDeSeminario/{codigo} X X XPropostas de Seminários /propostasDeSeminario X XUsuário /usuario/{correioEletronico} X X
Tabela 4.2: Métodos implementados nos Recursos
da representação, será implementado somente caso o método GET o seja.
O método OPTIONS tem a função de informar quais métodos são permitidos no recurso,
sendo implementado em todos eles.
A tabela 4.1.4 evidência as decisões tomadas para cada recurso. Recursos que somente
implementam GET são somente leitura. Para este tipo de recurso, tomou-se a decisão de não
dar o poder ao cliente de apagar ou atualizar coleções inteiras.
Um recurso de somente leitura particularmente interessante é o Arquivo de Apresentação,
criado a partir do momento em que um recurso Apresentação é criado, sendo seu ciclo de vida
vinculado a um recurso de Apresentação.
A vários recursos que implementam um mesmo conjunto de operações que o recurso de
Administrador, estes são atualizáveis e deléveis, sendo escolhido o cliente como o responsável
por saber onde um novo recurso do tipo fica ao ser criado, razão do PUT para criação.
No recurso Propostas de Seminários, decidiu-se que o servidor seria o encarregado de saber
onde ficariam os novos recursos, já que podem haver várias propostas criadas por usuários,
inclusive com mesmo nome, justificando-se a implementação de POST.
O recurso Usuário não possuí método PUT/POST, portanto não é possível para um cliente
criar um usuário com uma operação, o que se deve ao fato da criação de usuários dar-se em
duas etapas, efetuadas através de um transação de cadastramento.
43
4.1.5 Representações aceitas pelo servidor
O principal critério na escolha de representações é o tipo de representação que os clientes
desejam consumir. A metodologia ROA propõe que sejam utilizadas representações comuns a
web, como codificação de formulário, XML, JSON e XHTML.
Como nossos clientes são o navegador web e um cliente automatizado, é necessário utilizar
representações de entrada que possam ser facilmente geradas por eles. Por isso, decidiu-se optar
pela codificação de formulário, que é uma representação nativa nos navegadores e com suporte
no cliente verificador de especificações.
4.1.6 Definição das representações oferecidas pelo servidor
Como já dito na seção 4.1.5, a escolha de representações depende dos clientes.
Buscou-se uma representação de saída que pudesse ser renderizada por um navegador e
apresentasse fácilidade para um cliente automatizado extrair as informações de que precisa.
Foi escolhido o formato XHTML[9], por ser XML[6], o que garante boa formação e facili-
dade extração de informações através de um parser e também renderizável em um navegador.
Além disto é uma representação hipermídia, permitindo a ligação entre recursos. Por tais vanta-
gem, o formato XHTML foi adotado como representação de saída de todos os recursos, exceto
o Arquivo de Apresentação. Neste recurso, a representação é o próprio arquivo de uma apre-
sentação enviada por um participante de seminário.
A listagem 4.1 é um exemplo de representação XHTML.
Listagem 4.1: Representação XHTML com Marcações Descritivas
< u l c l a s s =" s e m i n a r i o s ">
< l i >
<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 /
S u r r e a l i s m o "
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 >
< l i >
<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 /
Rea l i smo "
c l a s s =" s e m i n a r i o "> Real ismo </ a>
44
</ l i >
</ ul >
4.1.7 Interligação 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 critério de que as ligações entre recursos façam
sentido.
Não se busca um grafo totalmente conexo como o resultado das interligações entre os re-
cursos, mas sim, o máximo de ligações coesas.
Observando-se o grafo da modelagem das interligações de recursos no Disseminário, na
figura 4.2, verifica-se uma boa conectiviade no sistema. Pois, a partir de qualquer recurso,
consegue-se chegar a outro recurso que tenha alguma relação com esse.
Como exemplo de boa modelagem, pode-se citar a ligação entre o seminário “História de
Arte” e Participantes, Apresentações e Coordenador. Todas estas informações são realmente
pertinentes ao seminário em questão, e, além de conseguir chegar até elas a partir do recurso do
seminário, é possível voltar ao seminário posteriormente, caso se queira.
4.1.8 Definição das respostas bem sucedidas
Nesta etapa é definida a interação entre cliente e servidor nos casos normais, aqueles em
que nenhum erro ocorreu.
Deve ser respeitado o protocolo HTTP, que define códigos de resposta de acordo com a
requisição que foi feita, além de estabelecidas quais serão as representações enviadas em cada
resposta.
Requisições GET e DELETE, quando efetuadas com sucesso, devem receber no cabeçalho
da representação da resposta o código 200 ("OK"), e no seu corpo as informações desejadas,
por exemplo no Disseminário um GET em Usuários obtém uma lista de usuários, uma opera-
ção DELETE nas propostas de seminário retorna uma página informando que a proposta foi
removida com sucesso.
Requisições PUT e POST, quando efetuadas com sucesso, devem receber no cabeçalho da
representação da resposta o código 201 ("Criado"), no caso de uma requisição POST é incluído
46
um paramatro Location contendo a URI de onde o recurso foi criado, por exemplo, o endereço
de uma proposta de seminário quando é efetuado um POST no recurso Propostas de Seminários.
Neste ponto também são consideradas questões de cache, um cliente pode ignorar repre-
sentações de recursos que não tenham sido atualizadas depois de um determinado periodo para
economizar tempo e largura de banda, mas cabe ao servidor verificar se o recurso foi atualizado,
repondendo com a representação toda caso tenha sido, ou então respondendo com o código
304("Não Modificado") e omitindo o corpo da representação. Todavia não foi implementado
mecânismo de cache no Disseminário.
4.1.9 Definição das respostas mal sucedidas
Quando algo ocorre de errado na interação entre as partes comunicantes o servidor deve
responder com códigos HTTP nas faixas: 3xx, 4xx, ou 5xx.
Códigos de erros são importantes pois explicitam o motivo do erro, por exemplo, caso um
cliente envie uma representação com erros em uma requisição PUT, o servidor deve responder
com o código 400("Requisição Incorreta") de forma que o cliente identifique a causa pela qual
sua requisição não teve o efeito desejado.
Além dos códigos de erro no Disseminário são enviadas páginas XHTML que descrevem o
motivo do erro e possuem ligações hipermídia, para que o usuário possa contornar esta situação.
Uma documentação completa descrevendo os códigos 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
técnica de desenvolvimento ágil que tem ênfase na descrição do comportamento da aplicação.
Ela foi criada por Dan North [8], que enfrentava problemas ao ensinar Programação 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 técnica de desenvolvimento ágil na qual todo o código
é originado a partir de testes, uma inversão do paradigma tradicional de codificação.
A cada ciclo de TDD o programador assume diversos papéis, 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 código para melhorar o projeto e de programador quando faz o código para
passar nos testes. O ciclo TDD pode ser observado na figura 4.3.
No Desenvolvimento Guiado por Testes normalmente se tem para cada classe do modelo
uma classe de testes [10], que possui uma série de métodos.
No Desenvolvimento Guiado por Comportamento a palavra ”teste” é abolida. Ela é substi-
tuida por Histórias, Cenários e Expectativas. O que torna mais fácil saber onde e o que testar,
pois as histórias e cenários são as próprias especificações do sistema, que vêm diretamente do
cliente do software e definem o ponto de partida. Desta maneira, não dependendo da criativi-
dade do programador, como acontece em TDD.
O uso de uma linguagem próxima da natural facilita a criação da especificação, pois, pode-
se usar uma linguagem muito parecida com a do cliente, que em seguida, se tornará código
executável.
4.2.1 Histórias
As histórias são descrições de funcionalidades, os cenários são contextos para a ocorrência
das histórias e as expectativas são o que se espera que aconteça em determinados cenários de
uma história. Sendo assim, as histórias são compostas de cenários, estes, compostos por pré-
condições e expectativas.
48
Assim como o [11], o BDD propõe que se faça uso de linguagem ubíqua[8]. Escolheu-
se o seguinte modelo para a escrita de histórias, oque culminou no estabelecimento de uma
linguagem comum:
História: {Título da história}
Eu como {um papel}
Quero {ação}
Para {resultado esperado}
Cenário: {Título do cenário}
Dado que {pré-condição}
Caso {ação}
Então {expectativas}
A partir do momento que se tem a história escrita, ela pode ser transformada em código
executável.
4.2.2 BDD no Disseminário
No Disseminário, todas as histórias foram escritas em linguagem natural e depois passadas
para código executável. Em termos de código foi utilizada a linguagem Java e o arcabouço
JUnit, além de adotada a seguinte estrutura para representar as especificações:
• pacote: nome corresponde ao nome da história
• classes do pacote: nomes correspondentes aos cenários da história
• métodos das classes: pré-condições e expectativas dos cenários
Abaixo, segue um exemplo de história “Usuário Participando de Seminário” que foi imple-
mentada no Disseminário:
História: Usuário Participando de Seminário
Eu como um usuário
Quero participar de um seminário
Para poder publicar uma apresentação
49
Cenário: Quando existe o Seminário
Dado que existe o usuário [email protected]
e que existe o seminário de nome “Um Seminário”
Caso o usuário [email protected] envie uma solicitação de partici-
pação para o seminário “Um Seminário”
Então Deve ser criado um participante em /UmSeminario/participante/usuarioDoDissemi-
de nome “Fulano”
de endereço de correio eletrônico “[email protected]”
Deve existir um enlace em “/UmSeminario/participantes/”
apontando para “/UmSeminario/participante/[email protected]”.
A história acima foi transformada em código Java1, como pode ser observado na listagem
4.2.
Listagem 4.2: História: Usuário Participando de Seminário
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 ;
p u b l i c c l a s s QuandoExis t eOSeminar io ex tends 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 {
p u b l i c s t a t i c vo id cons ide r ando Que ( ) {
e x i s t e O U s u a r i o _ u s u a r i o D o 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 _
uf sc_br_de_nome_Fu lano ( ) ;
exis teUmSeminar io_de_nome_UmSeminar io ( ) ;
}
p u b l i c s t a t i c vo id caso ( ) {
o U s u a r i o _ u s u a r i o D o 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
_ e n v i e U m a S o l i c i t a c a o D e P a r t i c i p a c a o P a r a O S e m i n a r i o
_UmSeminario ( ) ;
}
p u b l i c vo id e n t a o ( ) {
d e v e S e r C r i a d o U m P a r t i c i p a n t e E m _ s e m i n a r i o _ U m S e m i n a r i o _ p a r t i c i p a n t e _ u s u a r i o
1Todas as histórias estão no anexo A
50
D o 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 ( ) ;
deNome_Fulano ( ) ;
d e 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 _ u s u a r i o D o 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 ( ) ;
d e v e E x i s t i r U m E n l a c e E m _ s e m i n a r i o _ U m S e m i n a r i o _ p a r t i c i p a n t e s _
deTex to_Fu lano ( ) ;
a p o n t a n d o P a r a _ s e m i n a r i o _ U m S e m i n a r i o _ p a r t i c i p a n t e _ u s u a r i o D o
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 ( ) ;
}
Uma vez que a história é transformada em código, não há mais necessidade de manter a
história em texto, pois é possível obter o texto a partir da história em código. E essa é uma das
grandes vantagens de se ter especificações executáveis: a sincronia que mantida entre elas e o
código. Qualquer alteração que se faça na especificações é registrada diretamente no código, já
que a especificação é código, mantendo as especificações sempre atualizadas.
51
5 Disseminário
O Disseminário é uma aplicação de apoio a seminários, que permite aos seus usuários se
cadastrarem, criarem e participarem de seminários e publicarem apresentações.
Como cliente e interface com o usuário, foi utilizado o navegador web, cabendo ao servidor
fornecer representações que pudessem ser renderizadas e manipuladas pelo navegador.
Também foi desenvolvido um cliente para realizar testes automatizados que verificam se o
sistema está de acordo com as especificações, como descrito na seção 4.2.
5.1 Descrição das funcionalidades
Nesta seção iremos detalhar as funcionalidades do Disseminário, descrevendo-as e mos-
trando algumas imagens de telas do sistema.
5.1.1 Criação de conta
Para participar de um seminário ou publicar uma apresentação é necessário que o usuário
possua uma conta no sistema. Cada conta de usuário é identificada por um endereço de correio
eletrônico, para garantir a autenticidade de uma conta o cadastro se dá em duas etapas.
Na primeira etapa o usuário informa seu endereço de correio eletrônico e uma mensagem é
enviada para o endereço informado, como pode ser observado nas figuras 5.1 e 5.2 respectiva-
mente.
Na segunda etapa, o usuário acessa a URI que recebeu na mensagem de correio eletrô-
nico, esta URI contém um código criado através da aplicação de uma função hash a um dado
pseudo-aleatório, desta forma somente um usuário que tenha recebido a mensagem de correio
eletrônico poderá continuar com o processo de cadastramento, garantindo sua responsabilidade
pelo endereço de correio eletrônico informado.
53
Ao acessar esta URI, é requisitado ao usuário o preenchimento de seu nome e senha, con-
forme observado na figura 5.3.
Figura 5.3: Segunda etapa do cadastramento
Ao finalizar seu cadastramento, o usuário recebe uma mensagem de correio eletrônico in-
formando que sua conta foi criada e contendo sua senha, para acesso posterior, oque pode ser
visto na figura 5.4.
O cadastramento agora foi finalizado, e o usuário pode se autenticar no sistema utilizando
sua conta.
Também é incluído um enlace para sua página de usuário 5.5 na lista de usuários do Disse-
minário5.6.
54
Figura 5.4: Mensagem de conta criada
Figura 5.5: Página de um usuário do Disseminário
5.1.2 Autenticação
Muitas funcionalidades só estão disponíveis para usuários autenticados, tais como a publi-
cação de apresentações em um seminário.
Para se autenticar, o usuário necessita acessar o enlace de autenticação, que está presente
nas páginas do sistema 5.7.
55
Figura 5.6: Lista de usuários do Disseminário
Figura 5.7: Enlace de autenticação
Após acessar uma URI de autenticação o usuário necessita de informar seu endereço de
correio eletrônico e sua senha para efetuar a autenticação5.8.
Depois de autenticado, o usuário poderá navegar pelo sistema acessando funcionalidades
até então indisponíveis, podendo desautenticar quando desejar para voltar a navegar como um
visitante, conforme a figura 5.9.
57
5.1.3 Criação de Proposta de Seminário
Para criar uma proposta de seminário, o usuário deve se autenticar e clicar no enlace que
irá aparecer, como na figura 5.10, preencher um formulário com dados sobre o seminário que
deseja criar conforme a figura 5.11, quando enviar este formulário, será criada uma proposta em
uma URI baseada no nome do seminário, e enviada uma mensagem de correio eletrônico para
o administrador do Disseminário.
Figura 5.10: Enlace de proposta de seminário
5.1.4 Aprovação de Proposta de Seminário
Depois que uma proposta de seminário é feita, o administrador do Disseminário recebe
uma mensagem de correio eletrônico, nesta mensagem esta o endereço para que ele acesse a
proposta que foi criada.
Ao acessar o endereço da proposta, o administrador terá de se autenticar, podendo então
visualizar as informações da proposta, como na figura 5.12, tendo a opção de aprovar a proposta
ou deixa-lá pendente.
Quando o administrador aprova uma proposta, um seminário é criado e seu proponente é
avisado através de uma mensagem de correio eletrônico.
O seminário criado, figura 5.13, passa a ser listado na página principal do Disseminário, a
exemplo da figura 5.14.
59
Figura 5.12: Página de uma proposta de seminário
5.1.5 Participação em Seminário
Um usuário pode participar de um seminário se estiver autenticado e acessar o seminário,
onde estará disponível a opção de participar do mesmo, como pode ser visto na figura 5.15.
Após participar de um seminário o usuário é incluído um enlace para sua página de partici-
pante, como na figura 5.16 e na lista de participantes do seminário a exemplo da figura 5.17.
5.1.6 Publicação de Apresentação
Para publicar uma apresentação em um seminário, o usuário deve estar autenticado e ser
um dos participantes do seminário.
Ao acessar o enlace de publicação de apresentação como o observado na figura 5.18, o
usuário é levado a página de publicação como observada na figura 5.19, onde deve fornecer um
título e enviar um arquivo da apresentação, ao enviar o formulário será publicada a apresentação.
Após publicada, a apresentação ficará disponível na lista de apresentações do seminário,
como pode ser visto na figura 5.20, onde poderá ser acessada por outros usuários 5.21.
62
Figura 5.16: Página de um participante de um seminário
Figura 5.17: Lista de participantes de um seminário
63
Figura 5.18: Enlace para publicação de apresentação
Figura 5.19: Página de publicação de apresentação
64
Figura 5.20: Lista de apresentações de um seminário
Figura 5.21: Uma apresentação publicada em um seminário
65
5.2 Papéis de Usuários
As funcionalidades disponíveis a um usuário são determinadas pelo seu papel no sistema.
Existem quatro papéis diferentes:
• Visitante
• Usuário
• Coordenador
• Administrador
A relação entre um papel e suas permissões pode ser descrita através de uma hierarquia,
onde as permissões de um papel são herdadas pelo papel acima na relação hierárquica, repre-
sentada na figura 5.22, onde a seta representa a relação de herança de permissões, por exemplo
o administrador herda todas as permissões do coordenador, além de possuir permissões as quais
o coordenador não possuí.
Figura 5.22: Hierarquia de papéis de usuários
5.2.1 Visitante
Um usuário não autenticado é um visitante, um visitante pode acessar as seguintes funcio-
nalidades:
66
• Criação de conta de usuário
• Acesso a página principal, listando todos os seminários
• Acesso a lista de usuários
• Acesso a página de um usuário
• Acesso aos participantes de um seminário
• Acesso as apresentações de um seminário
• Acesso a uma apresentação de um seminário
5.2.2 Usuário
Um usuário que tenha uma conta e esteja autenticado tem as seguintes permissões:
• Propor um seminário
• Participar de um seminário
• Publicar uma apresentação em um seminário do qual participe
5.2.3 Coordenador
Quando um usuário tem sua proposta de criação de seminário aprovada ele se torna coor-
denador de seminários, podendo criar seminários sem precisar de aprovação do administrador.
5.2.4 Administrador
Quando uma proposta de criação de seminário é feita o administrador a recebe, ele é res-
ponsável por julgar se a proposta é válida aprovando-a ou deixando-a pendente.
67
6 Implementação
Este capítulo descreve a implementação do Disseminário, explicitando a organização de
seus módulos e as tecnologias utilizadas na implementação.
6.1 Disseminário
A implementação do Disseminário foi realizado utilizando-se a linguagem de programação
PHP, uma linguagem interpretada e fracamente tipada, criada em 1995 para a criação de páginas
web dinâmicas, podendo ser embutida em páginas HTML[12].
Foi utilizada a versão 5 da linguagem, que possuí um suporte mais completo a orientação a
objetos que sua predecessora.
6.1.1 Arquitetura
O disseminário é um sistema em camadas, conforme pode ser visto na figura 6.1 cada
camada á um subsistema que oferece serviços somente para a camada imediatamente superior.
As requisições HTTP são tratadas pela camada de serviços, ocasionando chamadas as ca-
madas subsequentes e por fim uma resposta contendo uma representação á enviada para o cli-
ente que originou a requisição, desta forma a camada de serviços é a única interface do sistema
para com o cliente, reduzindo-se o acoplamento com o mesmo. Esta interação entre cliente e
servidor pode ser visualizada na figura 6.2.
6.1.2 Camada de serviços
A camada de serviços foi implementada de forma a receber todas as requisições HTTP
feitas para o servidor, direcionando-as para uma fachada.
Na fachada a requisição é analisada e é identificado qual o tratador responsável por ela na
68
Figura 6.1: Arquitetura do Disseminário
Figura 6.2: Comunicação entre um cliente e o Disseminário
69
camada de negócios, a estes tratadores é dado o nome de Recurso.
Na modelagem foi utilizada uma metáfora de roteamento, onde uma Rota é a ligação entre
uma fámilia de URIs e o Recurso responsável pelo seu tratamento, sendo a responsabilidade de
identificar a qual rota corresponde uma requisição delegada a classe Roteador.
Outro aspecto importante da camada de serviços foi a autenticação, alguns recursos não
podem ser acessados por usuários não autenticados, outros tem seus métodos restringidos de-
pendendo do papel do usuário que o esta acessando.
Como forma de autenticação foi utilizada a autenticação HTTP do tipo Basic, de maior
facilidade de implementação.
Algumas dificuldades foram encontradas ao utilizar autenticação HTTP pura, sem Cookies
e sem uso sessão. Certos recursos tem representações diferentes quando um usuário esta auten-
ticado, por exemplo ao acessar um seminário sem autenticação um usuário só poderá visualizar
as informações do seminário, mas se estiver autenticado ele terá possibilidade de participar do
mesmo, mudando a representação que agora terá um botão, o problema é que não é possível
determinar se um usuário está autenticado a não ser que o servidor peça autenticação a ele, ne-
gando o acesso caso o usuário não possua conta no sistema mesmo que o recurso acessado seja
público para leitura.
Este problema foi resolvido utilizando um parâmetro adicional nas URIs, ao se autenticar
um usuário passa a navegar com um parâmetro “?autenticar=verdadeiro” no sufixo de todas as
URIs que visitar.
O outro problema foi relativo a desautenticação no sistema, infelizmente os navegadores
não possuem uma forma padrão de desautenticar(via JavaScript por exemplo), alguns acabam
guardando em cache as credenciais do usuário, fazendo que o único modo de desautenticar
seja fechando o navegador ou limpando manualmente o cache, a solução encontrada[13] foi
utilizar requisições AJAX(Asynchronous Javascript And XML) para enviar uma requisição com
credenciais falsas para um recurso protegido, o que tem como efeito colateral a remoção das
credenciais gravadas no cache do navegador.
6.1.3 Modelo de negócios
No cerne do modelo de negócios estão os Recursos, cada recurso definido em 4.1.2 corres-
ponde a uma classe de Recurso, que implementa os métodos da interface uniforme definidos
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 métodos dos recursos são invocados pela camada de serviços quando uma requisição é
efetuada, podendo o recurso comunicar-se com a camada de persistência para obter ou alterar
informações na base de dados.
Nesta camada também são geradas as representações, páginas XHTML4.1.6 geradas dina-
micamente que serão enviadas na resposta ao cliente. Para montar as representações é utilizado
o motor de modelos Savant[14], desta forma a apresentação é separada do modelo lógico.
6.1.4 Camada de Persistência
Foi utilizado o arcabouço Doctrine[15], responsável pelo mapeamento objeto-relacional,
realizando a interface entre o modelo de negócios e a camada de persistência. Como SGBD foi
utilizado MySQL
No Doctrine o esquema da base de dados é descrito em YAML[16], uma linguagem de
descrição de dados de fácil leitura para humanos e máquinas, a partir deste esquema são geradas
as classes responsáveis pelo mapeamento objeto-relacional, base de dados e tabelas associadas.
O Doctrine utiliza uma linguagem própria para as consultas, a DQL(Doctrine Query Lan-
guage), inspirada em SQL e que é capaz de retornar objetos como resultado de uma consulta.
Além de automatizar tarefas que teriam de ser feitas manualmente o Doctrine também pos-
71
suí a vantagem de não ser acoplado a um SGBD específico, bastando que algumas configurações
sejam feitas para que outro SGBD seja utilizado, sem que nenhum código precise ser alterado,
já que tanto o esquema como a linguagem de consulta são independentes de uma plataforma
específica.
6.2 Verificação das especificações
As especificações foram implementadas em Java, utilizando o arcabouço JUnit, conforme
explicado em 4.2.2.
Como cliente HTTP foi utilizado o conector Restlet, baseado no cliente Apache Commons[17].
Para realização das extração das informações das representações XHTML foi utilizado o
parser Apache Xerxes[18], que possuí suporte a consultas XPath, utilizadas para obter as infor-
mações desejadas.
72
7 Conclusões
Um sistema web de apoio de Seminários foi desenvolvido, baseado na arquitetura orientada
a recursos. Isto lhe conferiu características distintas quando comparado a maioria dos sistemas
web projetados, tanto pro usuário comum, quanto pro desenvolvedor.
Para um usuário comum os principais resultados a se destacar são as próprias propriedades
da ROA.
A endereçabilidade, permite ao usuário enviar qualquer enlace para outro usuário e este
conseguir acessá-lo. O estado da aplicação sendo mantido pelo cliente, garante que os enla-
ces não deixarão de funcionar em acessos posteriores, pois o servidor não guarda o estado da
aplicação.
A conectividade facilita a navegação entre as diversas partes do sistema e a interface uni-
forme, protege as ações do usuário, não fazendo alterações em dados simplesmente ao acessar
uma URI.
Do ponto de vista do desenvolvedor, a possibilidade de criação de diferentes clientes para
acessar o sistema mostrou-se muito interessante.
Alguns aspectos foram forçados com base na teoria descrita em [4], e houve dificuldade no
desenvolvimento de autenticação HTTP sem o uso de cookies, não encontrou-se uma solução
satisfatória para este problema.
Uma das peculiaridades do desenvolvimento deste trabalho foi o emprego de programação
orientada por comportamento. Por tratar-se de uma técnica de desenvolvimento pouco pesqui-
sada e utilizada em meio acadêmico, poucos são os artigos científicos publicados sobre ela.
Esta técnica foi empregada de uma forma diferente da usual, sem o uso de mocks, pois o sis-
tema testado estava isolado, alêm de ter sido combinada a ROA, exemplo de experiência que
não encontramos na literatura atual.
O trabalho como um todo foi muito proveitoso, pois abrangeu o estudo de conceitos avan-
çados e atuais em sinergia com a aplicação dos mesmos em um trabalho prático.
73
7.1 Resultados Alcançados
Como resultados alcançados, podemos citar:
• Aprofundamento nas teorias estudadas
• Aplicação das teorias em um caso prático
• Criação de representações acessíveis para cliente via navegador e consumíveis por cliente
automatizado
• Implementação de cliente verificador de especificações
7.2 Trabalhos Futuros
Algumas partes do sistema, que faziam parte do núcleo básico, ainda não foram implemen-
tas e estão listadas abaixo:
• Versionamento de apresentações: permitir que participantes enviem novas versões de
apresentações e o histórico delas se mantenha.
• Tipos de mídia diferentes para cada apresentação .
• Convite de Participantes: os coordenadores devem poder convidar pessoas via correio
eletrônico para participarem de seminários.
• Criação de Grupos: participantes devem ter o poder de criar grupos.
Algumas outras idéias interessante de serem implementadas:
• Criação de outros clientes (Desktop, JavaScript)
• Implementação de sindicância via Atom ou RSS
• Documentação detalhada dos recursos e representações de forma a facilitar a implemen-
tação de novos clientes
74
Referências Bibliográficas
[1] FIELDING, R. Architectural Styles and the Design of Network-based Software Architectu-res. 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 Scientific Pub Co., 1993.
[4] RICHARDSON, S. R. L. RESTful Web Services. [S.l.]: O’Reilly Media, 2007.
[5] HYPERTEXT Transfer Protocol - HTTP/1.1 (RFC 2616 Fielding, et al). Disponível em:http://www.w3.org/Protocols/rfc2616/rfc2616.html. Acesso em: 20 out. 2008.
[6] EXTENSIBLE Markup Language (XML). Disponível em: http://www.w3.org/XML/.Acesso em: 20 out. 2008.
[7] UNIFORM Resource Identifier (URI): Generic Syntax. Disponível em:http://labs.apache.org/webarch/uri/rfc/rfc3986.html. Acesso em: 20 out. 2008.
[8] NORTH, D. Introducing bdd. Better Software Magazine, 2006. Disponível em:http://dannorth.net/introducing-bdd. Acesso em: 13 out. 2008.
[9] XHTML 1.0: The Extensible HyperText Markup Language. Disponível 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. 9–11, 2007. ISSN: 0740-7459.
[12] PHP: Hypertext Preprocessor. Disponível em: http://www.php.net/. Acesso em: 20 out.2008.
[13] TRUE logout mechanism for Basic/Digest Authentication. Disponível em: https://trac-hacks.org/wiki/TrueHttpLogoutPatch. Acesso em: 20 out. 2008.
[14] SAVANT - PHP Template Engine. Disponível em: http://phpsavant.com/. Acesso em: 20out. 2008.
[15] DOCTRINE - Free Open Source PHP ORM. Disponível em: http://www.doctrine-project.org/. Acesso em: 20 out. 2008.
[16] YAML: YAML Ain’t Markup Language. Disponível em: http://www.yaml.org/. Acessoem: 20 out. 2008.
75
[17] RESTLET 1.0 Connectors. Disponível em: http://www.restlet.org/documentation/1.0/connectorshttpclient.Acesso em: 20 out. 2008.
[18] XERCES Java Parser. Disponível em: http://xerces.apache.org/xerces-j/. Acesso em: 20out. 2008.
[19] INTRODUCING JSON. Disponível em: http://www.json.org. Acesso em: 20 out. 2008.
[20] ECMA INTERNATIONAL. ECMAScript Language Specification. [S.l.].
76
ANEXO A -- Código-fonte das Especificações
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 ;
p u b l i c c l a s s T e s t e {
/∗ ∗∗ @param args
∗ /
p u b l i c s t a t i c vo id 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 br . 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 . IOExcep t ion ;
import j a v a . u t i l . P r o p e r t i e s ;
import org . r e s t l e t . d a t a . MediaType ;
import org . r e s t l e t . d a t a . Response ;
import org . 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 org . 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 br . 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 ;
p u b l i c c l a s s P u b l i c a d o r D a H i s t o r i a D a 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 {
p r i v a 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 c l i e n t e H T T P A u t e n t i c a d o ;
p r i v a t e S t r i n g URLBase ;
p r i v a t e S t r i n g e n d e r e ç o D e S e m i n á r i o s ;
p r i v a t e R e p r e s e n t a t i o n h i s t ó r i a D a P s i c o l o g i a L A ;
p u b l i c P u b l i c a d o r D a H i s t o r i a D a 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 ( ) {
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
( ) ;
t r y {
URLBase = c a r r e g a r C o n f i g u r a ç õ e s ( ) .
g e t P r o p e r t y ( " e n d e r e c o B a s e D a A p l i c a c a o " ) ;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
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
F i l e ( " r e p r e s e n t a c o e s /
H i s t o r i a D a 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 . j s " ) ,
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
IOExcept ion , F i l e N o t F o u n d E x c e p t i o n {
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 /
c o n f i g u r a c o e s . p r o p e r t i e s " ) ) ) ;
re turn p ;
}
p r i v a t e vo id p u b l i c a r ( ) {
Response r = c l i e n t e H T T P A u t e n t i c a d o . p o s t (
ende reçoDeSeminá r io s , h i s t ó r i a D a P s i c o l o g i a L A ) ;
t r y {
r . g e t E n t i t y ( ) . g e t T e x t ( ) ;
78
} catch ( IOExcep t ion e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
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 vo id main ( S t r i n g [ ] a r g s ) {
P u b l i c a d o r D a H i s t o r i a D a 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
p u b l i c a d o r = new
P u b l i c a d o r D a H i s t o r i a D a 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 ( ) ;
p u b l i c a d o r . p u b l i c a r ( ) ;
}
}
Listagem A.3: Arquivo: TesteRepresentacaoXHTML.java
package br . 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 org . 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 . IOExcep t ion ;
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 org . 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 org . j u n i t . Be f o r e ;
import org . j u n i t . T e s t ;
import org . xml . sax . SAXException ;
p u b l i c c l a s s TesteRepresentaçãoXHTML {
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 vo id 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 , IOExcep t ion ,
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 {
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 tml " ) ) ) ;
}
@Test
p u b l i c vo id obterValorDoMetaDadoDeNome ( ) {
a s s e r t E q u a l s ( " xp to " , r e p r e s e n t a ç ã o .
obterValorDoMetaDadoDeNome ( " t e s t e " ) ) ;
}
}
Listagem A.4: Arquivo: RepresentacaoNula.java
package br . 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 . IOExcep t ion ;
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 . Ou tpu tS t r eam ;
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 . Readab leBy teChanne 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 org . 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 ;
p u b l i c c l a s s R e p r e s e n t a c a o N u l a ex tends R e p r e s e n t a t i o n {
@Override
p u b l i c Readab leBy teChanne l g e t C h a n n e l ( ) throws IOExcep t i on {
/ / TODO Auto−g e n e r a t e d method s t u b
re turn new Readab leBy teChanne 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
IOExcep t i on {
re turn 0 ;
80
}
@Override
p u b l i c vo id c l o s e ( ) throws IOExcep t i on {
}
@Override
p u b l i c boolean i sOpen ( ) {
re turn 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 IOExcep t i on {
re turn 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 vo id w r i t e ( Ou tpu tS t r eam arg0 ) throws IOExcep t i on {
}
@Override
p u b l i c vo id 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 rg0 ) throws
IOExcep t i on {
}
}
Listagem A.5: Arquivo: RepresentacaoXHTML.java
package br . 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 . IOExcep t ion ;
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 org . custommonkey . x m l u n i t . HTMLDocumentBuilder ;
import org . 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 org . custommonkey . x m l u n i t . XMLUnit ;
import org . custommonkey . x m l u n i t . XpathEngine ;
import org . 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 org . 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 org . w3c . dom . Document ;
import org . xml . sax . SAXException ;
import br . 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 . Mic ro fo rma to ;
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 e x e c u t o r X P a t h ;
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
p u b l i c S t r i n g t o S t r i n g ( ) {
re turn 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
C o n f i g u r a t i o n E x c e p t i o n , 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 ,
SAXException , IOExcep t ion {
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 Micro fo rma to o b t e r M i c r o f o r m a t o ( S t r i n g nome ) {
re turn new Micro fo rma to ( documento ) . o b t e r M a r c a ç ã o ( nome
) ;
}
p u b l i c boolean contémTexto ( 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 ;
t r y {
e x i s t e = e x e c u t o r X P a t h . ge tMatch ingNodes ( " / / ∗ [
c o n t a i n s ( s t r i n g ( ) , ’ " + t e x t o P a r a P r o c u r a r +
" ’ ) ] " , documento ) . g e t L e n g t h ( ) > 0 ;
} catch ( X p a t h E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
re turn 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 ) {
S t r i n g v a l o r = n u l l ;
t r y {
v a l o r = e x e c u t o r X P a t h .
ge tMatch ingNodes ( " / h tml / head / meta [
@name= ’ " + nome + " ’ ] / @content " ,
documento ) . i t em ( 0 ) . ge tNodeValue ( ) ;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
re turn v a l o r ;
}
p u b l i c boolean contémOEnlace ( S t r i n g e n l a c e ) {
boolean e x i s t e = f a l s e ;
t r y {
e x i s t e = e x e c u t o r X P a t h . ge tMatch ingNodes ( " / / a [
@href = ’ " + e n l a c e + " ’ ] " , documento ) .
83
g e t L e n g t h ( ) > 0 ;
} catch ( X p a t h E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
re turn e x i s t e ;
}
}
Listagem A.6: Arquivo: Enlace.java
package br . 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 ;
p u b l i c c l a s s E nl ac e {
p r i v a t e S t r i n g URL, t e x t o ;
p u b l i c E nl ac e ( S t r i n g u r l , S t r i n g t ) {
URL = u r l ;
t e x t o = t ;
}
p u b l i c S t r i n g obterURL ( ) {
re turn URL;
}
p u b l i c S t r i n g o b t e r T e x t o ( ) {
re turn t e x t o ;
}
}
Listagem A.7: Arquivo: Microformato.java
package br . 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 . IOExcep t ion ;
import j a v a . i o . Reader ;
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 org . custommonkey . x m l u n i t . HTMLDocumentBuilder ;
84
import org . 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 org . custommonkey . x m l u n i t . XMLUnit ;
import org . custommonkey . x m l u n i t . XpathEngine ;
import org . 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 org . 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 org . w3c . dom . Document ;
import org . w3c . dom . NodeLis t ;
import org . xml . sax . SAXException ;
p u b l i c c l a s s Micro fo rma to {
p r i v a t e Document documento ;
p r i v a t e XpathEngine e x e c u t o r X P a t h ;
p r i v a t e S t r i n g caminhoAtua l = " " ;
p u b l i c Micro fo rma to ( 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 Micro fo rma to ( Document d , S t r i n g c ) {
t h i s ( d ) ;
caminhoAtua l = c ;
}
p u b l i c Micro fo rma to ( S t r i n g s ) throws SAXException ,
IOExcept ion , C o n f i g u r a t i o n E x c e p t i o n ,
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 {
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 Micro fo rma to ( Reader f ) throws SAXException ,
IOExcept ion , C o n f i g u r a t i o n E x c e p t i o n ,
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 {
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 ( ) ;
}
p r i v a t e NodeLis t 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 (
S t r i n g nome ) {
NodeLis t nodos = n u l l ;
t r y {
nodos = e x e c u t o r X P a t h . ge tMatch ingNodes (
caminhoAtua l + " / / ∗ [ @class = ’ " + nome + " ’ ]
" , documento ) ;
} catch ( X p a t h E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
re turn nodos ;
}
p r i v a t e i n t obterNúmeroDeNodosComAtr ibu toClass Igua lA ( S t r i n g
nome ) {
re turn 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 ) .
g e t L e n g t h ( ) ;
}
p u b l i c boolean e x i s t e M a r c a ç ã o ( S t r i n g nome ) {
re turn obterNúmeroDeNodosComAtr ibu toClass Igua lA ( nome )
> 0 ;
}
p u b l i c boolean ex i s teExa tamenteUmaMarcação ( S t r i n g nome ) {
re turn obterNúmeroDeNodosComAtr ibu toClass Igua lA ( nome )
== 1 ;
}
p u b l i c Micro fo rma to o b t e r M a r c a ç ã o ( S t r i n g nome ) {
86
re turn new Micro fo rma to ( documento , " / / ∗ [ @class = ’ " +
nome + " ’ ] " ) ;
}
p u b l i c S t r i n g obterConteúdoMarcadoCom ( S t r i n g nome ) {
re turn 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 ) .
i t em ( 0 ) . g e t T e x t C o n t e n t ( ) ;
}
p u b l i c boolean n ã o E x i s t e M a r c a ç ã o ( S t r i n g nome ) {
re turn ! e x i s t e M a r c a ç ã o ( nome ) ;
}
p u b l i c E nl ac e ob te rEn lacePe laURL ( S t r i n g URL) {
S t r i n g t e x t o = n u l l ;
t r y {
t e x t o = e x e c u t o r X P a t h .
ge tMatch ingNodes ( caminhoAtua l + "
/ / a [ @href = ’ " + URL + " ’ ] / t e x t ( ) " ,
documento ) . i t em ( 0 ) . g e t T e x t C o n t e n t
( ) ;
} catch ( X p a t h E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
re turn new E nl ac e (URL, t e x t o ) ;
}
p u b l i c 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 ) {
NodeLis t n = n u l l ;
t r y {
n = e x e c u t o r X P a t h . ge tMatch ingNodes (
caminhoAtua l + " / / d t [ @class = ’ " + chave + "
’ ] / f o l l o w i n g−s i b l i n g : : dd " , documento ) ;
}
catch ( X p a t h E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
87
re turn n . i t em ( 0 ) . g e t T e x t C o n t e n t ( ) ;
}
p u b l i c E nl ac e 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 ( S t r i n g
nomeDoEnlace ) {
S t r i n g t e x t o = n u l l ;
S t r i n g u r l = n u l l ;
t r y {
u r l = e x e c u t o r X P a t h . ge tMatch ingNodes (
caminhoAtua l + " / / a [ @class = ’ " +
nomeDoEnlace + " ’ ] / @href " , documento ) . i t em
( 0 ) . g e t T e x t C o n t e n t ( ) ;
t e x t o = e x e c u t o r X P a t h . ge tMatch ingNodes (
caminhoAtua l + " / / a [ @class = ’ " +
nomeDoEnlace + " ’ ] / t e x t ( ) " , documento ) .
i t em ( 0 ) . g e t T e x t C o n t e n t ( ) ;
} catch ( X p a t h E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
re turn new E nl ac e ( u r l , t e x t o ) ;
}
}
Listagem A.8: Arquivo: TesteMicroformato.java
package br . 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 org . 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 org . 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 org . 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 . IOExcep t ion ;
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 org . 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 org . j u n i t . Be f o r e ;
import org . j u n i t . T e s t ;
import org . xml . sax . SAXException ;
p u b l i c c l a s s T e s t e M i c r o f o r m a t o {
p r i v a t e Micro fo rma to m i c r o f o r m a t o ;
@Before
p u b l i c vo id 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 , IOExcep t ion ,
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 {
m i c r o f o r m a t o = new Micro fo rma to ( 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 tml " ) ) ) ;
}
@Test
p u b l i c vo id e x i s t e M a r c a ç ã o ( ) throws IOExcept ion ,
C o n f i g u r a t i o n E x c e p t i o n , SAXException ,
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 {
a s s e r t T r u e ( m i c r o f o r m a t o . e x i s t e M a r c a ç ã o ( " v c a r d " ) ) ;
a s s e r t F a l s e ( m i c r o f o r m a t o . e x i s t e M a r c a ç ã o ( " xp to " ) ) ;
}
@Test
p u b l i c vo id 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 IOExcept ion ,
C o n f i g u r a t i o n E x c e p t i o n , SAXException ,
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 {
a s s e r t T r u e ( m i c r o f o r m a t o . o b t e r M a r c a ç ã o ( " v c a r d " ) .
e x i s t e M a r c a ç ã o ( " a d r " ) ) ;
}
@Test
p u b l i c vo id ex i s teExa tamenteUmaMarcação ( ) throws IOExcept ion ,
C o n f i g u r a t i o n E x c e p t i o n , SAXException ,
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 {
89
a s s e r t T r u e ( m i c r o f o r m a t o . ex i s t eExa tamenteUmaMarcação ( "
v c a r d " ) ) ;
a s s e r t F a l s e ( m i c r o f o r m a t o . ex i s t eExa tamenteUmaMarcação (
" t e l " ) ) ;
}
@Test
p u b l i c vo id conteudoDeUmaMarcação ( ) {
a s s e r t E q u a l s ( " Pa lo Al to " , m i c r o f o r m a t o .
obterConteúdoMarcadoCom ( " l o c a l i t y " ) ) ;
}
@Test
p u b l i c vo id 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 " ) .
o b t e r T e x t o ( ) ) ;
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 br . 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 org . 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 org . 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 . IOExcep t ion ;
import j a v a . u t i l . L inkedHashSe t ;
import j a v a . u t i l . S e t ;
import org . custommonkey . x m l u n i t . XMLAssert ;
import org . 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 org . j u n i t . T e s t ;
import org . r e s t l e t . d a t a . Method ;
import org . r e s t l e t . d a t a . Response ;
import org . r e s t l e t . d a t a . S t a t u s ;
import org . xml . sax . SAXException ;
import br . 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 . Mic ro fo rma to ;
import br . 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 T e s t e H i s t o r i a D e 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 ex tends
Tes teDeRecurso {
@Override
p u b l i c S t r i n g o b t e r E n d e r e ç o D o R e c u r s o R e l a t i v o B a s e ( ) {
re turn " / s e m i n a r i o /
H i s t o r i a D a 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 " ;
}
@Test
p u b l i c vo id ge tÉRea l i zadoComSucesso ( ) throws IOExcep t i on {
Response r = c l i en teHTTP . g e t ( endereçoDoRecurso ) ;
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 vo id pos tRe to r naEr roDeMétodoNã oPe rmi t i do ( ) throws
IOExcep t i on {
Response r = c l i en teHTTP . p o s t ( endereçoDoRecurso , new
R e p r e s e n t a c a o N u l a ( ) ) ;
a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_METHOD_NOT_ALLOWED,
r . g e t S t a t u s ( ) ) ;
}
@Test
p u b l i c vo id headÉReal izadoComSucesso ( ) {
Response r = c l i en teHTTP . head ( endereçoDoRecurso ) ;
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
p u b l i c vo id op t ionsÉRea l i zadoComSuces so ( ) {
Response r = c l i en teHTTP . o p t i o n s ( endereçoDoRecurso ) ;
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 vo id o p t i o n s R e t o r n a M é t o d o s P e r m i t i d o s ( ) {
Set <Method > e s p e r a d o s = new LinkedHashSet <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 = c l i en teHTTP . o p t i o n s ( endereçoDoRecurso ) ;
Set <Method > r e c e b i d o s = r . ge tAl lowedMethods ( ) ;
a s s e r t E q u a l s ( e s p e r a d o s , r e c e b i d o s ) ;
}
p r i v a t e Micro fo rma to o b t e r M i c r o f o r m a t o D a R e p r e s e n t a ç ã o ( )
throws SAXException , IOExcep t ion {
re turn new Micro fo rma to ( 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 vo id ex i s t eUm Sem iná r io ( ) throws XpathExcep t ion ,
SAXException , IOExcep t ion {
a s s e r t T r u e ( o b t e r M i c r o f o r m a t o D a R e p r e s e n t a ç ã o ( ) .
ex i s t eExa tamenteUmaMarcação ( " s e m i n a r i o " ) ) ;
}
@Test
92
p u b l i c vo id umSeminárioTemUmaBase ( ) throws XpathExcep t ion ,
SAXException , IOExcep t ion {
a s s e r t T r u e ( o b t e r M i c r o f o r m a t o D a R e p r e s e n t a ç ã o ( ) .
o b t e r M a r c a ç ã o ( " s e m i n a r i o " ) .
ex i s t eExa tamenteUmaMarcação ( " base " ) ) ;
}
@Test
p u b l i c vo id umSeminárioTemUmNome ( ) throws XpathExcep t ion ,
SAXException , IOExcep t ion {
a s s e r t T r u e ( o b t e r M i c r o f o r m a t o D a R e p r e s e n t a ç ã o ( ) .
o b t e r M a r c a ç ã o ( " s e m i n a r i o " ) .
ex i s t eExa tamenteUmaMarcação ( " nome " ) ) ;
}
@Test
p u b l i c vo id
o N o m e D o S e m i n á r i o É H i s t ó r i a D a 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 ( )
throws XpathExcep t ion , SAXException , IOExcep t ion {
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
" , o b t e r M i c r o f o r m a t o D a R e p r e s e n t a ç ã o ( ) .
o b t e r M a r c a ç ã o ( " s e m i n a r i o " ) . obterConteúdoMarcadoCom
( " nome " ) ) ;
}
@Test
p u b l i c vo id umSeminárioTemUmaDescricao ( ) throws
XpathExcep t ion , SAXException , IOExcep t ion {
a s s e r t T r u e ( o b t e r M i c r o f o r m a t o D a R e p r e s e n t a ç ã o ( ) .
o b t e r M a r c a ç ã o ( " s e m i n a r i o " ) . e x i s t e M a r c a ç ã o ( "
d e s c r i c a o " ) ) ;
}
@Test
p u b l i c vo id umSeminá r ioTemIns t rucoes ( ) throws XpathExcep t ion ,
SAXException , IOExcep t ion {
a s s e r t T r u e ( o b t e r M i c r o f o r m a t o D a R e p r e s e n t a ç ã o ( ) .
o b t e r M a r c a ç ã o ( " s e m i n a r i o " ) . e x i s t e M a r c a ç ã o ( "
93
i n s t r u c o e s " ) ) ;
}
@Test
p u b l i c vo id umSeminárioTemURI ( ) throws XpathExcep t ion ,
SAXException , IOExcep t ion {
a s s e r t T r u e ( o b t e r M i c r o f o r m a t o D a R e p r e s e n t a ç ã o ( ) .
o b t e r M a r c a ç ã o ( " s e m i n a r i o " ) . e x i s t e M a r c a ç ã o ( "
i n s t r u c o e s " ) ) ;
}
@Test
p u b l i c vo id umSeminárioTemCoordenador ( ) throws XpathExcep t ion
, SAXException , IOExcep t ion {
a s s e r t T r u e ( o b t e r M i c r o f o r m a t o D a R e p r e s e n t a ç ã o ( ) .
o b t e r M a r c a ç ã o ( " s e m i n a r i o " ) . e x i s t e M a r c a ç ã o ( "
c o o r d e n a d o r " ) ) ;
}
@Test
p u b l i c vo id umCoordenadorTemURL ( ) throws XpathExcep t ion ,
SAXException , IOExcep t ion {
XMLAssert . a s s e r t X p a t h E x i s t s ( " / / ∗ [ @class = ’ s e m i n a r i o
’ ] / / ∗ [ @class = ’ c o o r d e n a d o r ’ ] / / ∗ [ @class = ’
u r lDoCoordenador ’ ] " , 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 ( )
) ;
/ / a s s e r t T r u e ( o b t e r M i c r o f o r m a t o D a R e p r e s e n t a ç ã o ( ) .
ob terMarcação ( " s e m i n a r i o " ) . ob terMarcação ( "
coordenador " ) . e x i s t e M a r c a ç ã o ( " URL " ) ) ;
}
@Test
p u b l i c vo id umSeminárioTemDatas ( ) throws XpathExcep t ion ,
SAXException , IOExcep t ion {
a s s e r t T r u e ( o b t e r M i c r o f o r m a t o D a R e p r e s e n t a ç ã o ( ) .
o b t e r M a r c a ç ã o ( " s e m i n a r i o " ) .
ex i s t eExa tamenteUmaMarcação ( " d a t a s " ) ) ;
}
94
@Test
p u b l i c vo id d a t a s T e m D a t a D e I n i c i o ( ) throws XpathExcep t ion ,
SAXException , IOExcep t ion {
XMLAssert . a s s e r t X p a t h E x i s t s ( " / / ∗ [ @class = ’ 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 ’ ] " ,
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 vo id datasTemDataDeFim ( ) throws XpathExcep t ion ,
SAXException , IOExcep t ion {
XMLAssert . a s s e r t X p a t h E x i s t s ( " / / ∗ [ @class = ’ s e m i n a r i o
’ ] / / ∗ [ @class = ’ d a t a s ’ ] / / ∗ [ @class = ’ dataDeTermino ’ ] " ,
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 vo id umSeminár ioTemDeta lhes ( ) throws XpathExcep t ion ,
SAXException , IOExcep t ion {
a s s e r t T r u e ( o b t e r M i c r o f o r m a t o D a R e p r e s e n t a ç ã o ( ) .
o b t e r M a r c a ç ã o ( " s e m i n a r i o " ) . e x i s t e M a r c a ç ã o ( "
d e t a l h e s " ) ) ;
}
@Test
p u b l i c vo id d e t a l h e s T e m I n s c r i c a o ( ) throws XpathExcep t ion ,
SAXException , IOExcep t ion {
XMLAssert . a s s e r t X p a t h E x i s t s ( " / / ∗ [ @class = ’ 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 ’ ] " ,
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 vo id d e t a l h e s T e m A s s i s t e n c i a ( ) throws XpathExcep t ion ,
SAXException , IOExcep t ion {
XMLAssert . a s s e r t X p a t h E x i s t s ( " / / ∗ [ @class = ’ 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
, 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 vo id 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
XpathExcep t ion , SAXException , IOExcep t ion {
XMLAssert . a s s e r t X p a t h E x i s t s ( " / / ∗ [ @class = ’ s e m i n a r i o
’ ] / / ∗ [ @class = ’ d e t a l h e s ’ ] / / ∗ [ @class = ’
a c e s s o A o s R e s u l t a d o s ’ ] " ,
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 vo id umSeminárioTemDocumentos ( ) throws XpathExcep t ion ,
SAXException , IOExcep t ion {
a s s e r t T r u e ( o b t e r M i c r o f o r m a t o D a R e p r e s e n t a ç ã o ( ) .
o b t e r M a r c a ç ã o ( " s e m i n a r i o " ) . e x i s t e M a r c a ç ã o ( "
documentos " ) ) ;
}
}
Listagem A.10: Arquivo: TesteRecursoSeminario.java
package br . 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 org . 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 org . 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 . IOExcep t ion ;
import j a v a . u t i l . L inkedHashSe t ;
import j a v a . u t i l . Map ;
import j a v a . u t i l . S e t ;
import org . j u n i t . T e s t ;
import org . r e s t l e t . d a t a . Form ;
import org . r e s t l e t . d a t a . Method ;
import org . r e s t l e t . d a t a . Response ;
96
import org . r e s t l e t . d a t a . S t a t u s ;
import br . 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 T e s t e R e c u r s o S e m i n a r i o ex tends Tes teDeRecurso {
@Override
p u b l i c S t r i n g o b t e r E n d e r e ç o D o R e c u r s o R e l a t i v o B a s e ( ) {
re turn " / s e m i n a r i o " ;
}
@Test
p u b l i c vo id pu tRe to rnaEr roDeMétodoNãoPermi t ido ( ) throws
IOExcep t i on {
Response r = c l i en teHTTP . p u t ( endereçoDoRecurso , new
R e p r e s e n t a c a o N u l a ( ) ) ;
a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_METHOD_NOT_ALLOWED,
r . g e t S t a t u s ( ) ) ;
}
@Test
p u b l i c vo id pos tRe to r naEr roDeMétodoNã oPe rmi t i do ( ) throws
IOExcep t i on {
Response r = c l i en teHTTP . p o s t ( endereçoDoRecurso , new
R e p r e s e n t a c a o N u l a ( ) ) ;
a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_METHOD_NOT_ALLOWED,
r . g e t S t a t u s ( ) ) ;
}
@Test
p u b l i c vo id 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
IOExcep t i on {
Response r = c l i en teHTTP . p u t ( endereçoDoRecurso , new
R e p r e s e n t a c a o N u l a ( ) ) ;
a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_METHOD_NOT_ALLOWED,
r . g e t S t a t u s ( ) ) ;
}
@Test
97
p u b l i c vo id op t ionsÉRea l i zadoComSuces so ( ) {
Response r = c l i en teHTTP . o p t i o n s ( endereçoDoRecurso ) ;
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 vo id o p t i o n s R e t o r n a M é t o d o s P e r m i t i d o s ( ) {
Set <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
LinkedHashSet <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 = c l i en teHTTP . o p t i o n s ( endereçoDoRecurso ) ;
Set <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 .
ge tAl lowedMethods ( ) ;
a s s e r t E q u a l s ( 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 ,
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 ) ;
}
@Test
p u b l i c vo id headRetornaNomeEPalavrasChave ( ) {
Response s = c l i en teHTTP . head ( endereçoDoRecurso ) ;
Map< S t r i n g , Objec t > a = s . g e t A t t r i b u t e s ( ) ;
Form f = ( Form ) a . g e t ( " o rg . 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−chave " ) ) ;
}
}
Listagem A.11: Arquivo: TesteDeRecurso.java
package br . 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 . IOExcep t ion ;
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 org . custommonkey . x m l u n i t . HTMLDocumentBuilder ;
import org . 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 org . custommonkey . x m l u n i t . XMLUnit ;
import org . 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 org . j u n i t . Be f o r e ;
import org . r e s t l e t . C l i e n t ;
import org . r e s t l e t . d a t a . P r o t o c o l ;
import org . r e s t l e t . d a t a . Response ;
import org . w3c . dom . Document ;
import org . xml . sax . SAXException ;
p u b l i c a b s t r a c t c l a s s Tes teDeRecurso {
p r o t e c t e d S t r i n g endereçoDoRecurso ;
p r o t e c t e d C l i e n t c l i en teHTTP ;
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 ;
p u b l i c a b s t r a c t S t r i n g o b t e r E n d e r e ç o D o R e c u r s o R e l a t i v o B a s e ( ) ;
@Before
p u b l i c vo id 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 ,
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 , IOExcep t ion {
P r o p e r t i e s p = c a r r e g a r C o n f i g u r a ç õ e s
( ) ;
endereçoDoRecurso = p . g e t P r o p e r t y ( "
e n d e r e c o B a s e D a A p l i c a c a o " ) +
o b t e r E n d e r e ç o D o R e c u r s o R e l a t i v o B a s e
( ) ;
c l i en teHTTP = new C l i e n t ( P r o t o c o l .
HTTP) ;
c l i en teHTTP . g e t C o n t e x t ( ) .
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 .
H t t p C l i e n t C o n v e r t e r " ) ;
99
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
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 . 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 (
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 ) ;
}
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 IOExcept ion
, F i l e N o t F o u n d E x c e p t i o n {
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 / c o n f i g u r a c o e s .
p r o p e r t i e s " ) ) ) ;
re turn 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 , IOExcep t ion {
Response r e s p o s t a = c l i en teHTTP . g e t (
endereçoDoRecurso ) ;
S t r i n g c o n t e ú d o D a R e p r e s e n t a ç ã o =
r e s p o s t a . g e t E n t i t y ( ) . g e t T e x t ( ) ;
re turn 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 (
c o n t e ú d o D a R e p r e s e n t a ç ã o ) ;
}
}
Listagem A.12: Arquivo: TesteRecursoSeminarios.java
package br . 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 org . 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 . IOExcep t ion ;
import j a v a . u t i l . L inkedHashSe 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 org . j u n i t . T e s t ;
import org . r e s t l e t . d a t a . Form ;
import org . r e s t l e t . d a t a . Method ;
import org . r e s t l e t . d a t a . P a r a m e t e r ;
import org . r e s t l e t . d a t a . Response ;
import org . r e s t l e t . d a t a . S t a t u s ;
import br . 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 T e s t e R e c u r s o S e m i n a r i o s ex tends Tes teDeRecurso {
@Override
p u b l i c S t r i n g o b t e r E n d e r e ç o D o R e c u r s o R e l a t i v o B a s e ( ) {
re turn " / s e m i n a r i o s " ;
}
@Test
p u b l i c vo id ge tÉRea l i zadoComSucesso ( ) throws IOExcep t i on {
Response r = c l i en teHTTP . g e t ( endereçoDoRecurso ) ;
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 vo id pu tRe to rnaEr roDeMétodoNãoPermi t ido ( ) throws
IOExcep t i on {
Response r = c l i en teHTTP . p u t ( endereçoDoRecurso , new
R e p r e s e n t a c a o N u l a ( ) ) ;
a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_METHOD_NOT_ALLOWED,
r . g e t S t a t u s ( ) ) ;
}
@Test
p u b l i c vo id headRetornaVar iáve lTamanhoComValor2 ( ) {
Response s = c l i en teHTTP . head ( endereçoDoRecurso ) ;
Map< S t r i n g , Objec t > a = s . g e t A t t r i b u t e s ( ) ;
Form f = ( Form ) a . g e t ( " o rg . 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
p u b l i c vo id op t ionsÉRea l i zadoComSuces so ( ) {
Response r = c l i en teHTTP . o p t i o n s ( endereçoDoRecurso ) ;
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 vo id o p t i o n s R e t o r n a M é t o d o s P e r m i t i d o s ( ) {
Set <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
LinkedHashSet <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 = c l i en teHTTP . o p t i o n s ( endereçoDoRecurso ) ;
Set <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 .
ge tAl lowedMethods ( ) ;
a s s e r t E q u a l s ( 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 ,
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 ) ;
}
}
Listagem A.13: Arquivo: ClienteHTTPComAutenticacao.java
package br . 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 org . r e s t l e t . C l i e n t ;
import org . r e s t l e t . C o n t e x t ;
import org . 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 org . r e s t l e t . d a t a . Chal lengeScheme ;
import org . r e s t l e t . d a t a . P r o t o c o l ;
102
import org . r e s t l e t . d a t a . Reques t ;
import org . r e s t l e t . d a t a . Response ;
p u b l i c c l a s s Clien teHTTPComAutent icacao ex tends C l i e n t {
p r i v a t e C h a l l e n g e R e s p o n s e a u t e n t i c a ç ã o ;
p u b l i c Clien teHTTPComAutent icacao ( S t r i n g u s u á r i o , S t r i n g
senha ) {
super ( 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 ( Chal lengeScheme .
HTTP_BASIC , u s u á r i o , s enha ) ;
}
@Override
p u b l i c vo id h a n d l e ( Reques t r e q u e s t , Response r e s p o n s e ) {
r e q u e s t . s e t C h a l l e n g e R e s p o n s e ( t h i s . a u t e n t i c a ç ã o ) ;
super . h a n d l e ( r e q u e s t , r e s p o n s e ) ;
}
p u b l i c Clien teHTTPComAutent icacao ( C o n t e x t c o n t e x t , L i s t <
P r o t o c o l > p r o t o c o l s ) {
super ( c o n t e x t , p r o t o c o l s ) ;
}
}
Listagem A.14: Arquivo: ClienteHTTPAdministrador.java
package br . 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 . Cl ien teHTTPNaoBloqueante ;
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 org . r e s t l e t . C l i e n t ;
import org . r e s t l e t . d a t a . Form ;
103
import org . r e s t l e t . d a t a . P r o t o c o l ;
import org . r e s t l e t . d a t a . Reques t ;
import org . r e s t l e t . d a t a . Response ;
import org . r e s t l e t . d a t a . S t a t u s ;
p u b l i c c l a s s C l i e n t e H T T P A d m i n i s t r a d o r ex tends 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 = "
p a b l o @ h i p e r n e t . u f s c . b 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 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 ;
p r i v a t e C l i e n t c l i e n t e ;
p r i v a t e C l i e n t c l i e n t e A u t e n t i c a d o ;
p u b l i c C l i e n t e H T T P A d m i n i s t r a d o r ( ) {
super ( 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) ;
Response 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 ( " senha " ,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 Clien teHTTPNaoBloqueante ( new
Clien teHTTPComAutent icacao (CORREIO_ELETRONICO ,
SENHA) ) ;
}
@Override
p u b l i c vo id h a n d l e ( Reques t r e q u e s t , Response r e s p o n s e ) {
c l i e n t e A u t e n t i c a d o . h a n d l e ( r e q u e s t , r e s p o n s e ) ;
}
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 org . 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 . Cl ien teHTTPNaoBloqueante ;
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 org . j u n i t . A f t e r C l a s s ;
import org . j u n i t . Be f o r e ;
import org . j u n i t . B e f o r e C l a s s ;
import org . j u n i t . T e s t ;
import org . r e s t l e t . d a t a . Form ;
import org . r e s t l e t . d a t a . Response ;
import org . r e s t l e t . d a t a . S t a t u s ;
import br . 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 .
Cl ien teHTTPComAutent icacao ;
import br . 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 . Mic ro fo rma to ;
import br . 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 QuandoFoiFe i t aUmaPropos taDeSeminár io ex tends
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 {
p u b l i c s t a t i c vo id cons ide r ando Que ( ) {
ex i s t eUmaPropos t aDeSeminá r ioEm_URL_Propos t a_Semina r io_Ps i co log i a_No_Ch i l e
( ) ;
comNomeParaURL_PsicologiaNoChile ( ) ;
c o m O T í t u l o _ P s i c o l o g i a _ N o _ C h i l e ( ) ;
comADescrição_Uma_Descrição ( ) ;
c o m A s I n s t r u ç õ e s _ I n s t r u ç õ e s ( ) ;
comOTipoDeInscr ição_Somente_Convidados ( ) ;
c o m O T i p o D e A s s i s t ê n c i a _ P ú b l i c a ( ) ;
105
c o m A 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 ( ) ;
comDataDeIn íc io_20_11_2008 ( ) ;
comDataDeEncerramento_27_11_2008 ( ) ;
comORamalUFSC_5671 ( ) ;
c u j o P r o p o n e n t e É O U s u á r i o D e C o r r e i o E l e t r ô n i c o _ t e s t e _ a r r o b a _ e d u g r a f _ u f s c _ b r _ E _ N o m e _ F u l a n o
( ) ;
}
p u b l i c s t a t i c vo id caso ( ) {
o _ U s u á r i o D e C o r r e i o E l e t r ô n i c o _ a d m i n i s t r a d o r 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 p r o v e _ A _ P r o p o s t a _ S e m i n a r i o _ P s i c o l o g i a _ N o _ C h i l e
( ) ;
}
p u b l i c vo id e n t ã o ( ) {
deveSerCr iadaUmSeminár ioEm_URL_Seminar io_Ps ico log ia_No_Chi le
( ) ;
deTí tu lo_Um_Seminár io ( ) ;
deDesc r i ção_Uma_Desc r i ção ( ) ;
d e I n s t r u ç õ e s _ I n s t r u ç õ e s ( ) ;
d e T i po D e I n s c r i ç ã o _ S o m e n t e_ C o n v i d a d os ( ) ;
d e T i p o D e A s s i s t ê n c i a _ P ú b l i c a ( ) ;
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 ( ) ;
deDa taDeIn í c io_20_11_2008 ( ) ;
deDataDeEncerramento_27_11_2008 ( ) ;
d e v e E x i s t i r U m E n l a c e E m _ P s i c o l o g i a _ N o _ C h i l e _ d e T e x t o _ P a r t i c i p a n t e s _ a p o n t a n d o P a r a _ P s i c o l o g i a N o C h i l e _ p a r t i c i p a n t e s
( ) ;
d e v e E x i s t i r U m E n l a c e E m _ P s i c o l o g i a _ N o _ C h i l e _ d e T e x t o _ A p r e s e n t a c o e s _ a p o n t a n d o P a r a _ P s i c o l o g i a N o C h i l e _ a p r e s e n t a c o e s
( ) ;
comCoordenador_chamado_Fulano ( ) ;
e E l e D e v e E s t a r N a L i s t a D e S e m i n á r i o s ( ) ;
O U s u á r i o D e C o r r e i o E l e t r ô n i c o _ t e s t e _ a r r o b a _ e d u g r a f _ u f s c _ b r _ E s t á N a L i s t a D e C o o r d e n a d o r e s
( ) ;
O U s u á r i o D e C o r r e i o E l e t r ô n i c o _ t e s t e _ a r r o b a _ e d u g r a f _ u f s c _ b r _ E s t á N a L i s t a D e P a r t i c i p a n t e s D o S e m i n á r i o
( ) ;
d e v e E x i s t i r U m E n l a c e E m _ U s u a r i o s _ a p o n t a n d o _ p a r a _ o _ u s u a r i o _ t e s t e _ a r r o b a _ e d u g r a f _ u f s c _ b r _ D e _ n o m e _ F u l a n o
( ) ;
n o U s u a r i o _ t e s t e _ a r r o b a _ e d u g r a f _ u f s c _ b r _ d e v e _ e x i s t i r _ o _ r a m a l _ U F S C _ 5 6 7 1
( ) ;
106
}
@Test
p u b l i c vo id
O U s u á r i o D e C o r r e i o E l e t r ô n i c o _ t e s t e _ a r r o b a _ e d u g r a f _ u f s c _ b r _ E s t á N a L i s t a D e P a r t i c i p a n t e s D o S e m i n á r i o
( ) {
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 .
o b t e r M i c r o f o r m a t o ( " p a r t i c i p a n t e s " ) .
ob te rEn lacePe laURL ( URL_DO_PARTICIPANTE ) . o b t e r T e x t o
( ) ) ;
}
@Test
p u b l i c vo id
d e v e E x i s t i r U m E n l a c e E m _ P s i c o l o g i a _ N o _ C h i l e _ d e T e x t o _ A p r e s e n t a c o e s _ a p o n t a n d o P a r a _ P s i c o l o g i a N o C h i l e _ a p r e s e n t a c o e s
( ) {
Mic ro fo rma to m = o b t e r M i c r o f o r m a t o (
URL_SEMINÁRIO_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. ob te rEn lacePe laURL (
URL_SEMINÁRIO_PSICOLOGIA_NO_CHILE + " /
a p r e s e n t a c o e s " ) . o b t e r T e x t o ( ) ) ;
}
@Test
p u b l i c vo id
d e v e E x i s t i r U m E n l a c e E m _ P s i c o l o g i a _ N o _ C h i l e _ d e T e x t o _ P a r t i c i p a n t e s _ a p o n t a n d o P a r a _ P s i c o l o g i a N o C h i l e _ p a r t i c i p a n t e s
( ) {
Mic ro fo rma to m = o b t e r M i c r o f o r m a t o (
URL_SEMINÁRIO_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. ob te rEn lacePe laURL (
URL_SEMINÁRIO_PSICOLOGIA_NO_CHILE + " /
p a r t i c i p a n t e s " ) . o b t e r T e x t o ( ) ) ;
}
107
@Test
p u b l i c vo id e E l e D e v e E s t a r N a L i s t a D e S e m i n á r i o s ( ) {
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 ( TÍTULO , 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 ( "
s e m i n a r i o s " ) . ob te rEn lacePe laURL (
URL_SEMINÁRIO_PSICOLOGIA_NO_CHILE ) . o b t e r T e x t o ( ) ) ;
}
@Test
p u b l i c vo id
n o U s u a r i o _ t e s t e _ a r r o b a _ e d u g r a f _ u f s c _ b r _ d e v e _ e x i s t i r _ o _ r a m a l _ U F S C _ 5 6 7 1
( ) {
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
p u b l i c vo id
d e v e E x i s t i r U m E n l a c e E m _ U s u a r i o s _ a p o n t a n d o _ p a r a _ o _ u s u a r i o _ t e s t e _ a r r o b a _ e d u g r a f _ u f s c _ b r _ D e _ n o m e _ F u l a n o
( ) {
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 .
o b t e r M i c r o f o r m a t o ( " u s u a r i o s " ) . ob te rEn lacePe laURL (
URL_DO_PROPONENTE) . o b t e r T e x t o ( ) ) ;
}
@Test
p u b l i c vo id
deveSerCr iadaUmSeminár ioEm_URL_Seminar io_Ps ico log ia_No_Chi le
( ) {
a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , c l i en teHTTP . g e t (
URL_SEMINÁRIO_PSICOLOGIA_NO_CHILE ) . g e t S t a t u s ( ) ) ;
}
108
@Test
p u b l i c vo id deTí tu lo_Um_Seminár io ( ) {
a s s e r t E q u a l s ( TÍTULO , 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 ( "
s e m i n a r i o " ) . o b t e r V a l o r D o A t r i b u t o ( " t i t u l o " ) ) ;
}
@Test
p u b l i c vo id deDesc r i ção_Uma_Desc r i ção ( ) {
a s s e r t E q u a l s (DESCRIÇÃO , 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 ( "
s e m i n a r i o " ) . o b t e r V a l o r D o A t r i b u t o ( " d e s c r i c a o " ) ) ;
}
@Test
p u b l i c vo id 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 ( INSTRUÇÕES , 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 (
" s e m i n a r i o " ) . o b t e r V a l o r D o A t r i b u t o ( " i n s t r u c o e s " ) ) ;
}
@Test
p u b l i c vo id d e T i po D e I n s c r i ç ã o _ S o m e n t e_ C o n v i d a d os ( ) {
a s s e r t E q u a l s ( TIPO_DE_INSCRIÇÃO , 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 ( " s e m i n a r i o " ) .
o b t e r V a l o r D o A t r i b u t o ( " i n s c r i c a o " ) ) ;
}
@Test
p u b l i c vo id 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_ASSISTÊNCIA , 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 ( " s e m i n a r i o " ) .
o b t e r V a l o r D o A t r i b u t o ( " a s s i s t e n c i a " ) ) ;
}
@Test
p u b l i c vo id 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
. o b t e r M i c r o f o r m a t o ( " s e m i n a r i o " ) .
o b t e r V a l o r D o A t r i b u t o ( " d i s p o n i b i l i d a d e " ) ) ;
}
109
@Test
p u b l i c vo id deDa taDeIn í c io_20_11_2008 ( ) {
a s s e r t E q u a l s ( DATA_INÍCIO , 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
( " s e m i n a r i o " ) . o b t e r V a l o r D o A t r i b u t o ( " d a t a D e I n i c i o " )
) ;
}
@Test
p u b l i c vo id 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 .
o b t e r M i c r o f o r m a t o ( " s e m i n a r i o " ) .
o b t e r V a l o r D o A t r i b u t o ( " da taDeTermino " ) ) ;
}
@Test
p u b l i c vo id
O U s u á r i o D e C o r r e i o E l e t r ô n i c o _ t e s t e _ a r r o b a _ e d u g r a f _ u f s c _ b r _ E s t á N a L i s t a D e C o o r d e n a d o r e s
( ) {
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 .
o b t e r M i c r o f o r m a t o ( " c o o r d e n a d o r e s " ) .
ob te rEn lacePe laURL (URL_DO_COORDENADOR) . o b t e r T e x t o
( ) ) ;
}
@Test
p u b l i c vo id 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 .
o b t e r M i c r o f o r m a t o ( " s e m i n a r i 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 ( " c o o r d e n a d o r " ) .
obterURL ( ) ) ;
a s s e r t E q u a l s (NOME_DO_PROPONENTE, 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 ( " s e m i n a r i 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 ( " c o o r d e n a d o r " ) .
o b t e r T e x t o ( ) ) ;
}
110
p r i v a t e s t a t i c vo id
o _ U s u á r i o D e C o r r e i o E l e t r ô n i c o _ a d m i n i s t r a d o r 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 p r o v e _ A _ P r o p o s t a _ S e m i n a r i o _ P s i c o l o g i a _ N o _ C h i l e
( ) {
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,
a p r o v a ç ã o . 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 vo id
c u j o P r o p o n e n t e É O U s u á r i o D e C o r r e i o E l e t r ô n i c o _ t e s t e _ a r r o b a _ e d u g r a f _ u f s c _ b r _ E _ N o m e _ F u l a n o
( ) {
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_DO_PROPONENTE) ;
Response r = c l i en teHTTP . p u t (
URL_DE_CADASTRAMENTO_DO_PROPONENTE, c a d a s t r o .
g e t W e b R e p r e s e n t a t i o n ( ) ) ;
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 = ob te rChaveDeCadas t r amen to ( ) ;
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 ( " senha " , 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 en teHTTP . p u t (URL_DE_CADASTRAMENTO_DO_PROPONENTE,
f o r m u l á r i o . g e t W e b R e p r e s e n t a t i o n ( ) ) ;
c l i en teHTTP = new Clien teHTTPNaoBloqueante ( new
Clien teHTTPComAutent icacao (
CORREIO_ELETRÔNICO_DO_PROPONENTE,
SENHA_DO_PROPONENTE) ) ;
r = c l i en teHTTP . p o s t (URL_DE_CRIAÇÃO_DE_PROPOSTAS ,
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 ( ) ) ;
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 ( ) ) ;
111
URL_DA_PROPOSTA_CRIADA = ex t ra i rCabeça lhoDeNome ( r , "
L o c a t i o n " ) ;
}
p r i v a t e s t a t i c S t r i n g ob te rChaveDeCadas t r amen to ( ) {
RepresentacaoXHTML r e p r e s e n t a ç ã o = n u l l ;
t r y {
r e p r e s e n t a ç ã o = new RepresentacaoXHTML (
o b t e r P a r s e r D e D o c u m e n t o s ( ) . p a r s 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 . g e t (
URL_DE_CADASTRAMENTO_DO_PROPONENTE) .
g e t E n t i t y ( ) . g e t T e x t ( ) ) ) ;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
Mic ro fo rma to m = 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 ( "
c a d a s t r o T e m p o r a r i o D e U s u a r i o " ) ;
re turn 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 vo id 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 vo id 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 vo id comDataDeEncerramento_27_11_2008 ( ) {
p r o p o s t a . add ( " da taDeTermino " , DATA_DE_ENCERRAMENTO) ;
}
p r i v a t e s t a t i c vo id comDataDeIn íc io_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_INÍCIO ) ;
}
112
p r i v a t e s t a t i c vo id c o m A 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 ( )
{
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 ) ;
}
p r i v a t e s t a t i c vo id c o m O T i p o D e A s s i s t ê n c i a _ P ú b l i c a ( ) {
p r o p o s t a . add ( " a s s i s t e n c i a " , TIPO_DE_ASSISTÊNCIA ) ;
}
p r i v a t e s t a t i c vo id comOTipoDeInscr ição_Somente_Convidados ( )
{
p r o p o s t a . add ( " i n s c r i c a o " , TIPO_DE_INSCRIÇÃO ) ;
}
p r i v a t e s t a t i c vo id comADescrição_Uma_Descrição ( ) {
p r o p o s t a . add ( " d e s c r i c a o " , DESCRIÇÃO) ;
}
p r i v a t e s t a t i c vo id 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 " , INSTRUÇÕES) ;
}
p r i v a t e s t a t i c vo id c o m O T í t u l o _ P s i c o l o g i a _ N o _ C h i l e ( ) {
p r o p o s t a . add ( " t i t u l o " , TÍTULO ) ;
}
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 ;
t r y {
r = new RepresentacaoXHTML (
o b t e r P a r s e r D e D o c u m e n t o s ( ) . p a r s e (
c l i en teHTTP . g e t (URL) . g e t E n t i t y ( ) . g e t T e x t ( )
) ) ;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
re turn r ;
113
}
p r i v a t e s t a t i c vo id
ex i s t eUmaPropos t aDeSeminá r ioEm_URL_Propos t a_Semina r io_Ps i co log i a_No_Ch i l e
( ) {
p r o p o s t a = new Form ( ) ;
}
@Before
p u b l i c vo id o b t e r R e p r e s e n t a ç ã o D e S e m i n á r i o ( ) {
s e m i n á r i o = o b t e r R e p r e s e n t a ç ã o (
URL_SEMINÁRIO_PSICOLOGIA_NO_CHILE ) ;
}
@BeforeClass
p u b l i c s t a t i c vo id p r e l i m i n a r e s ( ) {
cons i de r ando Que ( ) ;
c a so ( ) ;
}
@Afte rClass
p u b l i c s t a t i c vo id l i m p a r C e n á r i o ( ) {
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_SEMINÁRIO_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)
. g e t S t a t u s ( ) ) ;
}
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_ELETRÔNICO_DO_PROPONENTE
= " pablo@edugra f . u f s c . b r " ;
114
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_DO_PROPONENTE = obterURLBase ( ) + " /
c a d a s t r a m e n t o / " + CORREIO_ELETRÔNICO_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_ELETRÔNICO_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_ELETRÔNICO_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 = " Fulano " ;
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 = "
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 URL_DE_CRIAÇÃO_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_SEMINÁRIO_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_SEMINÁRIO_PSICOLOGIA_NO_CHILE + " / p a r t i c i p a n t e / " +
CORREIO_ELETRÔNICO_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_SEMINÁRIO_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_INÍCIO = " 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 = "
2 7 / 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 DISPONIBILIDADE_DE_RESULTADOS = "
p u b l i c 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 TIPO_DE_ASSISTÊNCIA =
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_INSCRIÇÃO = " 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 INSTRUÇÕES = " 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 DESCRIÇÃO = "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 TÍTULO = "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 ramework . 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 org . 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 . Cl ien teHTTPNaoBloqueante ;
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 . DateFormat ;
import j a v a . t e x t . S impleDateFormat ;
import j a v a . u t i l . C a l e n d a r ;
import org . j u n i t . A f t e r C l a s s ;
import org . j u n i t . B e f o r e C l a s s ;
import org . j u n i t . T e s t ;
import org . r e s t l e t . C l i e n t ;
import org . r e s t l e t . d a t a . MediaType ;
import org . r e s t l e t . d a t a . S t a t u s ;
import org . 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 br . 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 .
Cl ien teHTTPComAutent icacao ;
import br . 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 . Mic ro fo rma to ;
import br . 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 QuandoApresentacaoÉNova ex tends
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 {
p u b l i c s t a t i c vo id cons ide r ando Que ( ) {
c o n s i d e r a n d o Q u e E x i s t e O U s u a r i o D e C o r r e i o E l e t r o n i c o _ u s u a r i o D o 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
( ) ;
e E l e É P a r t i c i p a n t e D o S e m i n á r i o _ U m S e m i n a r i o ( ) ;
}
p u b l i c s t a t i c vo id caso ( ) {
116
o U s u a r i o D e C o r r e i o E l e t r o n i c o _ u s u a r i o D o 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 _ p u b l i q u e U m a A p r e s e n t a c a o
( ) ;
comTí tu lo_UmaApresen tacao ( ) ;
anexandoOArqu ivo_umaApresen tacao_pon to_pp t ( ) ;
e m _ U m S e m i n a r i o _ b a r r a _ a p r e s e n t a c a o _ b a r r a _ u m a A p r e s e n t a c a o
( ) ;
}
p u b l i c vo id e n t ã o ( ) {
d e v e S e r C r i a d a U m a A p r e s e n t a c a o _ e m _ U m S e m i n a r i o _ b a r r a _ a p r e s e n t a c a o _ b a r r a _ u m a A p r e s e n t a c a o
( ) ;
deT í tu lo_UmaApresen t acao ( ) ;
deDataDeHoje ( ) ;
d e H o r a D e f i n i d a ( ) ;
comUmEnlaceDeTex to_umaApresen tacao_pon to_pp t_apon tandoPara_UmSeminar io_apresen tacao_UmaApresen tacao_umaApresen tacao_pon to_pp t
( ) ;
c o m U m E n l a c e D e T e x t o _ F u l a n o _ a p o n t a n d o P a r a _ U m S e m i n a r i o _ p a r t i c i p a n t e _ u s u a r i o D o 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
( ) ;
d e v e E x i s t i r U m E n l a c e E m _ S e m i n a r i o _ U m S e m i n a r i o _ a p r e s e n t a c o e s _ a p o n t a n d o _ p a r a _ U m S e m i n a r i o _ b a r r a _ a p r e s e n t a c a o _ b a r r a _ u m a A p r e s e n t a c a o _ p o n t o _ p p t
( ) ;
o A r q u i v o D e v e E x i s t i r E m _ S e m i n a r i o _ U m S e m i n a r i o _ a p r e s e n t a c o e s _ a p o n t a n d o _ p a r a _ U m S e m i n a r i o _ b a r r a _ a p r e s e n t a c a o _ b a r r a _ u m a A p r e s e n t a c a o _ p o n t o _ p p t
( ) ;
}
@Test
p u b l i c vo id d e H o r a D e f i n i d a ( ) {
Mic ro fo rma to m = o b t e r M i c r o f o r m a t o (
URL_DA_APRESENTAÇÃO, " 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 ( " ho ra " ) ) ;
}
@Test
p u b l i c vo id deDataDeHoje ( ) {
C a l e n d a r c = C a l e n d a r . g e t I n s t a n c e ( ) ;
DateFormat d f = new SimpleDateFormat ( " dd /MM/ yyyy " ) ;
Mic ro fo rma to m = o b t e r M i c r o f o r m a t o (
URL_DA_APRESENTAÇÃO, " a p r e s e n t a c a o " ) ;
117
a s s e r t E q u a l s ( d f . f o r m a t ( c . ge tTime ( ) ) , m.
o b t e r V a l o r D o A t r i b u t o ( " d a t a " ) ) ;
}
@Test
p u b l i c vo id
o A r q u i v o D e v e E x i s t i r E m _ S e m i n a r i o _ U m S e m i n a r i o _ a p r e s e n t a c o e s _ a p o n t a n d o _ p a r a _ U m S e m i n a r i o _ b a r r a _ a p r e s e n t a c a o _ b a r r a _ u m a A p r e s e n t a c a o _ p o n t o _ p p t
( ) {
a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , c l i en teHTTP . g e t (
URL_DA_APRESENTAÇÃO_ARQUIVO) . g e t S t a t u s ( ) ) ;
}
@Test
p u b l i c vo id
c o m U m E n l a c e D e T e x t o _ F u l a n o _ a p o n t a n d o P a r a _ U m S e m i n a r i o _ p a r t i c i p a n t e _ u s u a r i o D o 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
( ) {
Mic ro fo rma to m = o b t e r M i c r o f o r m a t o (
URL_DA_APRESENTAÇÃO, " 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.
ob te rEn lacePe laURL ( URL_DO_PARTICIPANTE ) . o b t e r T e x t o
( ) ) ;
}
@Test
p u b l i c vo id
d e v e S e r C r i a d a U m a A p r e s e n t a c a o _ e m _ U m S e m i n a r i o _ b a r r a _ a p r e s e n t a c a o _ b a r r a _ u m a A p r e s e n t a c a o
( ) {
a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , c l i en teHTTP . g e t (
URL_DA_APRESENTAÇÃO) . g e t S t a t u s ( ) ) ;
}
@Test
p u b l i c vo id
comUmEnlaceDeTex to_umaApresen tacao_pon to_pp t_apon tandoPara_UmSeminar io_apresen tacao_UmaApresen tacao_umaApresen tacao_pon to_pp t
( ) {
Mic ro fo rma to m = o b t e r M i c r o f o r m a t o (
URL_DA_APRESENTAÇÃO, " a p r e s e n t a c a o " ) ;
118
a s s e r t E q u a l s (NOME_DO_ARQUIVO, m. ob te rEn lacePe laURL (
URL_DA_APRESENTAÇÃO_ARQUIVO) . o b t e r T e x t o ( ) ) ;
}
@Test
p u b l i c vo id deT í tu lo_UmaApresen t acao ( ) {
Mic ro fo rma to m = o b t e r M i c r o f o r m a t o (
URL_DA_APRESENTAÇÃO, " 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_APRESENTAÇÃO, m.
o b t e r V a l o r D o A t r i b u t o ( " t i t u l o " ) ) ;
}
@Test
p u b l i c vo id
d e v e E x i s t i r U m E n l a c e E m _ S e m i n a r i o _ U m S e m i n a r i o _ a p r e s e n t a c o e s _ a p o n t a n d o _ p a r a _ U m S e m i n a r i o _ b a r r a _ a p r e s e n t a c a o _ b a r r a _ u m a A p r e s e n t a c a o _ p o n t o _ p p t
( ) {
a s s e r t E q u a l s (URL_DA_APRESENTAÇÃO, o b t e r M i c r o f o r m a t o (
URL_DAS_APRESENTAÇÕES, " a p r e s e n t a c o e s " ) .
ob te rEn lacePe laURL (URL_DA_APRESENTAÇÃO) . obterURL ( )
) ;
}
p u b l i c s t a t i c vo id comTí tu lo_UmaApresen tacao ( ) {
}
p r i v a t e s t a t i c vo id e E l e É P a r t i c i p a n t e D o S e m i n á r i o _ U m S e m i n a r i o
( ) {
c r i a r S e m i n á r i o (CORREIO_ELETRONICO_DO_PARTICIPANTE ,
SENHA_DO_PARTICIPANTE , NOME_PARA_URL_DO_SEMINÁRIO,
NOME_PARA_URL_DO_SEMINÁRIO) ;
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
Clien teHTTPComAutent icacao (
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
R e p r e s e n t a c a o N u l a ( ) ) . g e t S t a t u s ( ) ) ;
119
}
p r i v a t e s t a t i c vo id
e m _ U m S e m i n a r i o _ b a r r a _ a p r e s e n t a c a o _ b a r r a _ u m a A p r e s e n t a c a o ( )
{
c l i en teHTTP . d e l e t e (URL_DA_APRESENTAÇÃO) ;
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 / umaApresen tacao . p p t " , MediaType .
APPLICATION_POWERPOINT , 0 ) ;
c l i en teHTTP = new Clien teHTTPNaoBloqueante ( new
Clien teHTTPComAutent icacao (
CORREIO_ELETRONICO_DO_PARTICIPANTE ,
SENHA_DO_PARTICIPANTE) ) ;
c l i en teHTTP . p u t (URL_DA_APRESENTAÇÃO, f r ) ;
}
p r i v a t e s t a t i c vo id
c o n s i d e r a n d o Q u e E x i s t e O U s u a r i o D e C o r r e i o E l e t r o n i c o _ u s u a r i o D o 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
( ) {
c r i a r U s u á r i o (CORREIO_ELETRONICO_DO_PARTICIPANTE ,
NOME_DO_PARTICIPANTE , SENHA_DO_PARTICIPANTE) ;
}
p r i v a t e s t a t i c vo id
anexandoOArqu ivo_umaApresen tacao_pon to_pp t ( ) {
}
p r i v a t e s t a t i c vo id
o U s u a r i o D e C o r r e i o E l e t r o n i c o _ u s u a r i o D o 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 _ p u b l i q u e U m a A p r e s e n t a c a o
( ) {
}
@Afte rClass
p u b l i c s t a t i c vo id l i m p a r C e n á r i o ( ) {
120
a s s e r t E q u a l s ( S t a t u s . SUCCESS_OK , c l i en teHTTP . d e l e t e (
URL_DA_APRESENTAÇÃO) . g e t S t a t u s ( ) ) ;
}
@BeforeClass
p u b l i c s t a t i c vo id p r e l i m i n a r e s ( ) {
cons i de r ando Que ( ) ;
c a so ( ) ;
}
/ / TODO: i n c l u i r t e s t e s para 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_SEMINÁRIO = "
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_SEMINÁRIO = obterURLBase ( )
+ " / " + NOME_PARA_URL_DO_SEMINÁRIO;
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 = " Fulano " ;
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_DO_PARTICIPANTE = "
u s u a r i o D o 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 " ;
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_SEMINÁRIO + " / 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_APRESENTAÇÃO = "
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_APRESENTAÇÃO =
" 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 = "
UmaApresentacao . 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_APRESENTAÇÃO =
URL_DO_SEMINÁRIO + " / a p r e s e n t a c a o / " +
TITULO_PARA_URL_DA_APRESENTAÇÃ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_DA_APRESENTAÇÃO_ARQUIVO =
URL_DA_APRESENTAÇÃO + " / " + 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_APRESENTAÇÕES =
URL_DO_SEMINÁRIO + " / 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 org . 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 org . 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 org . j u n i t . B e f o r e C l a s s ;
import org . j u n i t . T e s t ;
import org . r e s t l e t . d a t a . Chal lengeScheme ;
import org . r e s t l e t . d a t a . Form ;
import org . r e s t l e t . d a t a . Response ;
import org . 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 ;
p u b l i c c l a s s Q u a n d o U s u á r i o É V i s i t a n t e ex tends
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 {
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 = " /
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_SEMINÁRIO = " / UmSeminario " ;
p r i v a t e s t a t i c Response r e s p o s t a ;
p r i v a t e s t a t i c vo id cons i de r ando Que ( ) {
nãoExisteUmSeminárioEm (URL_SEMINÁRIO) ;
oUsuárioNãoTemContaNoSistema ( ) ;
}
p r i v a t e s t a t i c vo id caso ( ) {
o U s u á r i o S o l i c i t e A C r i a ç ã o D e U m a P r o p o s t a ( ) ;
}
p u b l i c vo id e n t ã o ( ) {
deveSerNegadoOPedido ( ) ;
d e v e S e r R e q u e r i d a A u t e n t i c a ç ã o ( ) ;
}
122
@BeforeClass
p u b l i c s t a t i c vo id p r e l i m i n a r e s ( ) {
cons i de r ando Que ( ) ;
c a so ( ) ;
}
@Test
p u b l i c vo id deveSerNegadoOPedido ( ) {
a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_UNAUTHORIZED,
r e s p o s t a . g e t S t a t u s ( ) ) ;
}
@Test
p u b l i c vo id d e v e S e r R e q u e r i d a A u t e n t i c a ç ã o ( ) {
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 ( ) . ge tRealm
( ) ) ;
a s s e r t E q u a l s ( Chal lengeScheme . 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 ( ) ) ;
}
p r i v a t e s t a t i c vo id o U s u á r i o S o l i c i t e A C r i a ç ã o D e U m a P r o p o s t a ( ) {
Form p r o p o s t a = new Form ( ) ;
r e s p o s t a = c l i en teHTTP . 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 vo id oUsuárioNãoTemContaNoSistema ( ) {}
p u b l i c s t a t i c vo id nãoExisteUmSeminárioEm ( 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)
. g e t S t a t u s ( ) ) ;
}
123
p u b l i c s t a t i c vo id nãoExis teUmaPropos taDeSeminár ioEm ( 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)
. g e t S t a t u s ( ) ) ;
}
}
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 org . 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 . Cl ien teHTTPNaoBloqueante ;
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 org . j u n i t . A f t e r C l a s s ;
import org . j u n i t . Be f o r e ;
import org . j u n i t . B e f o r e C l a s s ;
import org . j u n i t . T e s t ;
import org . r e s t l e t . d a t a . Form ;
import org . r e s t l e t . d a t a . Response ;
import org . r e s t l e t . d a t a . S t a t u s ;
import br . 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 .
Cl ien teHTTPComAutent icacao ;
import br . 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 . Mic ro fo rma to ;
import br . 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 QuandoOSeminárioÉNovo ex tends
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 {
124
p u b l i c s t a t i c vo id cons ide r ando Que ( ) {
nãoExisteUmSeminárioDeURL_UmSeminario ( ) ;
e x i s t e U m P r o p o n e n t e D e N o m e _ t e s t e _ e _ c o r r e i o E l e t r o n i c o _ t e s t e _ a r r o b a _ e d u g r a f _ u f s c _ b r
( ) ;
}
p u b l i c s t a t i c vo id caso ( ) {
o U s u á r i o S o l i c i t e A C r i a ç ã o D e U m a P r o p o s t a D e S e m i n á r i o ( ) ;
comOTítulo_Um_Seminário ( ) ;
comADescrição_Uma_Descrição ( ) ;
c o m A s I n s t r u ç õ e s _ I n s t r u ç õ e s ( ) ;
comOTipoDeInscr ição_Somente_Convidados ( ) ;
c o m O T i p o D e A s s i s t ê n c i a _ P ú b l i c a ( ) ;
c o m A 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 ( ) ;
comDataDeIn íc io_20_11_2008 ( ) ;
comDataDeEncerramento_27_11_2008 ( ) ;
comORamalUFSC_5671 ( ) ;
em_UmSeminário ( ) ;
}
p u b l i c vo id e n t ã o ( ) {
deveSe rCr i adaUmaPropos t aDeSeminá r io ( ) ;
deTí tu lo_Um_Seminár io ( ) ;
deDesc r i ção_Uma_Desc r i ção ( ) ;
d e I n s t r u ç õ e s _ I n s t r u ç õ e s ( ) ;
d e T i po D e I n s c r i ç ã o _ S o m e n t e_ C o n v i d a d os ( ) ;
d e T i p o D e A s s i s t ê n c i a _ P ú b l i c a ( ) ;
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 ( ) ;
deDa taDeIn í c io_20_11_2008 ( ) ;
deDataDeEncerramento_27_11_2008 ( ) ;
deRamalUFSC_5671 ( ) ;
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 ( ) ;
}
@Test
p u b l i c vo id deveSe rCr i adaUmaPropos t aDeSeminá r io ( ) {
125
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 . g e t (
URL_DA_PROPOSTA_CRIADA) . g e t S t a t u s ( ) ) ;
}
@Test
p u b l i c vo id 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 .
o b t e r M i c r o f o r m a t o ( " p r o p o s t a " ) . o b t e r V a l o r D o A t r i b u t o
( " rama l " ) ) ;
}
@Test
p u b l i c vo id 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 .
o b t e r M i c r o f o r m a t o ( " p r o p o s t a " ) . o b t e r V a l o r D o A t r i b u t o
( " da taDeTermino " ) ) ;
}
@Test
p u b l i c vo id deDa taDeIn í c io_20_11_2008 ( ) {
a s s e r t E q u a l s ( DATA_INÍCIO , 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 ( " p r o p o s t a " ) . o b t e r V a l o r D o A t r i b u t o
( " d a t a D e I n i c i o " ) ) ;
}
@Test
p u b l i c vo id 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 ,
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 ( " p r o p o s t a " ) .
o b t e r V a l o r D o A t r i b u t o ( " d i s p o n i b i l i d a d e " ) ) ;
}
@Test
p u b l i c vo id 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_ASSISTÊNCIA , 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 ( " p r o p o s t a " ) . o b t e r V a l o r D o A t r i b u t o
( " a s s i s t e n c i a " ) ) ;
126
}
@Test
p u b l i c vo id d e T i po D e I n s c r i ç ã o _ S o m e n t e_ C o n v i d a d os ( ) {
a s s e r t E q u a l s ( TIPO_DE_INSCRIÇÃO , 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 ( " p r o p o s t a " ) . o b t e r V a l o r D o A t r i b u t o
( " i n s c r i c a o " ) ) ;
}
@Test
p u b l i c vo id 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 ( INSTRUÇÕES , 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 ( " p r o p o s t a " ) . o b t e r V a l o r D o A t r i b u t o
( " i n s t r u c o e s " ) ) ;
}
@Test
p u b l i c vo id deDesc r i ção_Uma_Desc r i ção ( ) {
a s s e r t E q u a l s (DESCRIÇÃO , 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 ( " p r o p o s t a " ) . o b t e r V a l o r D o A t r i b u t o
( " d e s c r i c a o " ) ) ;
}
@Test
p u b l i c vo id deTí tu lo_Um_Seminár io ( ) {
a s s e r t E q u a l s ( TÍTULO , 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 (
" p r o p o s t a " ) . o b t e r V a l o r D o A t r i b u t o ( " t i t u l o " ) ) ;
}
@Test
p u b l i c vo id 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 .
o b t e r M i c r o f o r m a t o ( " p r o p o s t a " ) .
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 vo id 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 vo id comDataDeEncerramento_27_11_2008 ( ) {
p r o p o s t a . add ( " da taDeTermino " , DATA_DE_ENCERRAMENTO) ;
}
p r i v a t e s t a t i c vo id comDataDeIn íc io_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_INÍCIO ) ;
}
p r i v a t e s t a t i c vo id c o m A 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 ( ) {
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 ) ;
}
p r i v a t e s t a t i c vo id c o m O T i p o D e A s s i s t ê n c i a _ P ú b l i c a ( ) {
p r o p o s t a . add ( " a s s i s t e n c i a " , TIPO_DE_ASSISTÊNCIA ) ;
}
p r i v a t e s t a t i c vo id comOTipoDeInscr ição_Somente_Convidados ( )
{
p r o p o s t a . add ( " i n s c r i c a o " , TIPO_DE_INSCRIÇÃO ) ;
}
p r i v a t e s t a t i c vo id em_UmSeminário ( ) {
c l i en teHTTP = new Clien teHTTPNaoBloqueante ( new
Clien teHTTPComAutent icacao (
CORREIO_ELETRÔNICO_DO_PROPONENTE,
SENHA_DO_PROPONENTE) ) ;
Response r = c l i en teHTTP . p o s t (
URL_DE_CRIAÇÃO_DE_PROPOSTAS , 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 ( ) ) ;
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 = ex t ra i rCabeça lhoDeNome ( r , "
L o c a t i o n " ) ;
}
128
p r i v a t e s t a t i c vo id comOTítulo_Um_Seminário ( ) {
p r o p o s t a . add ( " t i t u l o " , TÍTULO ) ;
}
p r i v a t e s t a t i c vo id comADescrição_Uma_Descrição ( ) {
p r o p o s t a . add ( " d e s c r i c a o " , DESCRIÇÃO) ;
}
p r i v a t e s t a t i c vo id 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 " , INSTRUÇÕES) ;
}
p r i v a t e s t a t i c vo id
o U s u á r i o S o l i c i t e A C r i a ç ã o D e U m a P r o p o s t a D e S e m i n á r i o ( ) {
p r o p o s t a = new Form ( ) ;
}
p u b l i c s t a t i c vo id nãoExisteUmSeminárioDeURL_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_SEMINÁRIO) ;
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 en teHTTP . g e t (URL_DO_SEMINÁRIO) . g e t S t a t u s ( ) ) ;
}
p r i v a t e s t a t i c vo id
e x i s t e U m P r o p o n e n t e D e N o m e _ t e s t e _ e _ c o r r e i o E l e t r o n i c o _ t e s t e _ a r r o b a _ e d u g r a f _ u f s c _ b r
( ) {
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_DO_PROPONENTE) ;
Response r = c l i en teHTTP . p u t (
URL_DE_CADASTRAMENTO_DO_PROPONENTE, c a d a s t r o .
g e t W e b R e p r e s e n t a t i o n ( ) ) ;
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 = ob te rChaveDeCadas t r amen to ( ) ;
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 ( ) ;
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 ( " senha " , 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 en teHTTP . p u t (URL_DE_CADASTRAMENTO_DO_PROPONENTE,
f o r m u l á r i o . 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 S t r i n g ob te rChaveDeCadas t r amen to ( ) {
RepresentacaoXHTML r e p r e s e n t a ç ã o = n u l l ;
t r y {
r e p r e s e n t a ç ã o = new RepresentacaoXHTML (
o b t e r P a r s e r D e D o c u m e n t o s ( ) . p a r s 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 . g e t (
URL_DE_CADASTRAMENTO_DO_PROPONENTE) .
g e t E n t i t y ( ) . g e t T e x t ( ) ) ) ;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
Mic ro fo rma to m = 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 ( "
c a d a s t r o T e m p o r a r i o D e U s u a r i o " ) ;
re turn 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 " ) ;
}
@Afte rClass
p u b l i c s t a t i c vo id l i m p a r C e n á r i o ( ) {
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)
. 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_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 ,
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_DA_PROPOSTA_CRIADA) . g e t S t a t u s ( ) ) ;
}
@Before
130
p u b l i c vo id o b t e r R e p r e s e n t a ç ã o ( ) {
t r y {
r e p r e s e n t a ç ã o = new RepresentacaoXHTML (
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 (
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_DA_PROPOSTA_CRIADA) . g e t E n t i t y ( ) .
g e t T e x t ( ) ) ) ;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
}
@BeforeClass
p u b l i c s t a t i c vo id p r e l i m i n a r e s ( ) {
cons i de r ando Que ( ) ;
c a so ( ) ;
}
/ / TODO: e x t r a i r URL base para 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_INÍCIO = " 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 = "
2 7 / 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 DISPONIBILIDADE_DE_RESULTADOS = "
p u b l i c 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 TIPO_DE_ASSISTÊNCIA =
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_INSCRIÇÃO = " 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 INSTRUÇÕES = " 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 DESCRIÇÃO = "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 TÍTULO = "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_CRIAÇÃO_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_SEMINÁRIO = 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_ELETRÔNICO_DO_PROPONENTE
= " pablo@edugra f . u f s c . b r " ;
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
URL_DE_CADASTRAMENTO_DO_PROPONENTE = obterURLBase ( ) + " /
c a d a s t r a m e n t o / " + CORREIO_ELETRÔNICO_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_ELETRÔNICO_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 org . 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 org . j u n i t . B e f o r e C l a s s ;
import org . j u n i t . T e s t ;
import org . r e s t l e t . C l i e n t ;
import org . r e s t l e t . d a t a . S t a t u s ;
import br . 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 .
Cl ien teHTTPComAutent icacao ;
import br . 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 . Mic ro fo rma to ;
import br . 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 QuandoExis t eOSeminár io ex tends
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 {
p r i v a t e s t a t i c f i n a l S t r i n g TÍTULO_DO_SEMINÁRIO = "Um
S e m i n á r i o " ;
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_SEMINÁRIO = "
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_USUÁRIO = " Fulano " ;
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_USUÁRIO = " 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_ELETRÔNICO_DO_USUÁRIO = "
u s u a r i o D o 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 " ;
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_SEMINÁRIO + " /
p a r t i c i p a n t e / " + CORREIO_ELETRÔNICO_DO_USUÁRIO ;
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_SEMINÁRIO = obterURLBase ( )
+ " / " + NOME_PARA_URL_DO_SEMINÁRIO;
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_SEMINÁRIO + " / p a r t i c i p a n t e s " ;
p u b l i c s t a t i c vo id cons ide r ando Que ( ) {
e x i s t e O U s u á r i o _ u s u a r i o D o 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 _ d e _ n o m e _ F u l a n o
( ) ;
exis teUmSeminár io_de_nome_UmSeminar io ( ) ;
}
p u b l i c s t a t i c vo id caso ( ) {
o U s u á r i o _ u s u a r i o D o 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 _ e n v i e U m a S o l i c i t a ç ã o D e P a r t i c i p a ç ã o P a r a O S e m i n á r i o _ U m S e m i n á r i o
( ) ;
}
p u b l i c vo id e n t ã o ( ) {
d e v e S e r C r i a d o U m P a r t i c i p a n t e E m _ s e m i n a r i o _ U m S e m i n a r i o _ p a r t i c i p a n t e _ u s u a r i o D o 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
( ) ;
deNome_Fulano ( ) ;
d e E n d e r e ç o D e C o r r e i o E l e t r ô n i c o _ u s u a r i o D o 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
( ) ;
d e v e E x i s t i r U m E n l a c e E m _ s e m i n a r i o _ U m S e m i n á r i o _ d e T e x t o _ P a r t i c i p a n t e s
( ) ;
a p o n t a n d o P a r a _ s e m i n á r i o _ U m S e m i n á r i o _ p a r t i c i p a n t e s ( ) ;
133
d e v e E x i s t i r U m E n l a c e E m _ s e m i n a r i o _ U m S e m i n a r i o _ p a r t i c i p a n t e s _ d e T e x t o _ F u l a n o
( ) ;
a p o n t a n d o P a r a _ s e m i n á r i o _ U m 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 D o 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
( ) ;
}
@Test
p u b l i c vo id
d e v e E x i s t i r U m E n l a c e E m _ s e m i n a r i o _ U m S e m i n á r i o _ d e T e x t o _ 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 ( URL_DOS_PARTICIPANTES , o b t e r M i c r o f o r m a t o
(URL_DO_SEMINÁRIO , " 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
p u b l i c vo id a p o n t a n d o P a r a _ s e m i n á r i o _ U m S e m i n á r i o _ 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 " , o b t e r M i c r o f o r m a t o (
URL_DO_SEMINÁRIO , " 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 " ) . o b t e r T e x t o
( ) ) ;
}
@Test
p u b l i c vo id
d e E n d e r e ç o D e C o r r e i o E l e t r ô n i c o _ u s u a r i o D o 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 (CORREIO_ELETRÔNICO_DO_USUÁRIO ,
o b t e r M i c r o f o r m a t o D o P a r t i c i p a n t e ( ) .
o b t e r V a l o r D o A t r i b u t o ( " c o r r e i o E l e t r o n i c o " ) ) ;
}
@Test
p u b l i c vo id deNome_Fulano ( ) {
a s s e r t E q u a l s (NOME_DO_USUÁRIO,
o b t e r M i c r o f o r m a t o D o P a r t i c i p a n t e ( ) .
134
o b t e r V a l o r D o A t r i b u t o ( " nome " ) ) ;
}
@Test
p u b l i c vo id
d e v e E x i s t i r U m E n l a c e E m _ s e m i n a r i o _ U m S e m i n a r i o _ p a r t i c i p a n t e s _ d e T e x t o _ F u l a n o
( ) {
a s s e r t E q u a l s ( " Fu lano " , 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 " ) .
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 ( " p a r t i c i p a n t e " ) .
o b t e r T e x t o ( ) ) ;
}
@Test
p u b l i c vo id
a p o n t a n d o P a r a _ s e m i n á r i o _ U m 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 D o 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_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 " ) .
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 ( " p a r t i c i p a n t e " ) .
obterURL ( ) ) ;
}
@BeforeClass
p u b l i c s t a t i c vo id p r e l i m i n a r e s ( ) {
cons i de r ando Que ( ) ;
c a so ( ) ;
}
p u b l i c s t a t i c vo id
o U s u á r i o _ u s u a r i o D o 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 _ e n v i e U m a S o l i c i t a ç ã o D e P a r t i c i p a ç ã o P a r a O S e m i n á r i o _ U m S e m i n á r i 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
Clien teHTTPComAutent icacao (
CORREIO_ELETRÔNICO_DO_USUÁRIO , SENHA_DO_USUÁRIO) ;
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
R e p r e s e n t a c a o N u l a ( ) ) . g e t S t a t u s ( ) ) ;
135
}
p u b l i c s t a t i c Micro fo rma to ob te rMicroformatoDeUmSeminár io ( ) {
re turn o b t e r M i c r o f o r m a t o (URL_DO_SEMINÁRIO , " s e m i n a r i o
" ) ;
}
p u b l i c s t a t i c Micro fo rma to o b t e r M i c r o f o r m a t o D o P a r t i c i p a n t e ( )
{
re turn o b t e r M i c r o f o r m a t o ( URL_DO_PARTICIPANTE , "
p a r t i c i p a n t e " ) ;
}
@Test
p u b l i c vo id
d e v e S e r C r i a d o U m P a r t i c i p a n t e E m _ s e m i n a r i o _ U m S e m i n a r i o _ p a r t i c i p a n t e _ u s u a r i o D o 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 ( S t a t u s . SUCCESS_OK , c l i en teHTTP . g e t (
URL_DO_PARTICIPANTE) . g e t S t a t u s ( ) ) ;
}
p u b l i c s t a t i c vo id
e x i s t e O U s u á r i o _ u s u a r i o D o 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 _ d e _ n o m e _ F u l a n o
( ) {
c r i a r U s u á r i o (CORREIO_ELETRÔNICO_DO_USUÁRIO ,
NOME_DO_USUÁRIO, SENHA_DO_USUÁRIO) ;
}
p u b l i c s t a t i c vo id exis teUmSeminár io_de_nome_UmSeminar io ( ) {
c r i a r S e m i n á r i o (CORREIO_ELETRÔNICO_DO_USUÁRIO ,
SENHA_DO_USUÁRIO, NOME_PARA_URL_DO_SEMINÁRIO,
TÍTULO_DO_SEMINÁRIO) ;
}
}
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 org . 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 org . j u n i t . A f t e r C l a s s ;
import org . j u n i t . B e f o r e C l a s s ;
import org . j u n i t . T e s t ;
import org . r e s t l e t . d a t a . Form ;
import org . r e s t l e t . d a t a . Response ;
import org . r e s t l e t . d a t a . S t a t u s ;
import br . 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 . Mic ro fo rma to ;
import br . 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 QuandoExi s t eOCadas t r amen to ex tends
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 {
p u b l i c s t a t i c vo id cons ide r ando Que ( ) {
e x i s t e O C a d a s t r a m e n t o D e C o r r e i o E l e t r ô n i c o _ p a b l o _ a r r o b a _ e d u g r a f _ u f s c _ b r
( ) ;
}
p u b l i c s t a t i c vo id caso ( ) {
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 ( ) ;
}
p u b l i c vo id e n t ã o ( ) {
d e v e S e r C r i a d o O U s u á r i o _ d e _ c o r r e i o _ e l e t r ô n i c o _ p a b l o _ a r r o b a _ e d u g r a f _ u f s c _ b r
( ) ;
}
@BeforeClass
p u b l i c s t a t i c vo id p r e l i m i n a r e s ( ) {
cons i de r ando Que ( ) ;
c a so ( ) ;
}
@Test
137
p u b l i c vo id
d e v e S e r C r i a d o O U s u á r i o _ d e _ c o r r e i o _ e l e t r ô n i c o _ p a b l o _ a r r o b a _ e d u g r a f _ u f s c _ b r
( ) {
RepresentacaoXHTML r e p r e s e n t a ç ã o = n u l l ;
t r y {
r e p r e s e n t a ç ã o = new RepresentacaoXHTML (
o b t e r P a r s e r D e D o c u m e n t o s ( ) . p a r s e (
c l i en teHTTP . g e t (URL_DO_USUÁRIO) . g e t E n t i t y
( ) . g e t T e x t ( ) ) ) ;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
Mic ro fo rma to m = 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 ( "
u s u a r i o " ) ;
a s s e r t E q u a l s (CORREIO_ELETRÔNICO , m.
o b t e r V a l o r D o A t r i b u t o ( " c o r r e i o E l e t r o n i c o " ) ) ;
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 " ) ) ;
}
@Afte rClass
p u b l i c s t a t i c vo id l i m p a r C e n á r i 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_USUÁRIO) ;
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 r i v a t e s t a t i c vo id
e x i s t e O C a d a s t r a m e n t o D e C o r r e i o E l e t r ô n i c o _ p a b l o _ a r r o b a _ e d u g r a f _ u f s c _ b r
( ) {
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)
;
Response r = c l i en teHTTP . p u t (URL_DE_CADASTRAMENTO,
c a d a s t r o . g e t W e b R e p r e s e n t a t i o n ( ) ) ;
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 ( ) ) ;
}
p r i v a t e s t a t i c vo id 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 ( ) {
138
CHAVE = ob te rChaveDeCadas t r amen to ( ) ;
c l i en teHTTP . d e l e t e (URL_DO_USUÁRIO) ;
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 ( " senha " , 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 en teHTTP . p u t (URL_DE_CADASTRAMENTO, f o r m u l á r i o .
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 S t r i n g ob te rChaveDeCadas t r amen to ( ) {
RepresentacaoXHTML r e p r e s e n t a ç ã o = n u l l ;
t r y {
r e p r e s e n t a ç ã o = new RepresentacaoXHTML (
o b t e r P a r s e r D e D o c u m e n t o s ( ) . p a r s 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 . g e t (
URL_DE_CADASTRAMENTO) . g e t E n t i t y ( ) . g e t T e x t
( ) ) ) ;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
Mic ro fo rma to m = 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 ( "
c a d a s t r o T e m p o r a r i o D e U s u a r i o " ) ;
re turn 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_ELETRÔNICO = "
pab lo@edugraf . u f s c . b r " ;
p r i v a t e s t a t i c S t r i n g CHAVE = " chaveDeTes te " ;
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 = " Fulano " ;
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 = " senha " ;
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_ELETRÔNICO ;
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_USUÁRIO = obterURLBase ( ) +
" / u s u a r i o / " + CORREIO_ELETRÔNICO ;
}
139
Listagem A.21: Arquivo: InfraEstruturaDeEspecificacao.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 . IOExcep t ion ;
import j a v a . u t i l . P r o p e r t i e s ;
import org . custommonkey . x m l u n i t . HTMLDocumentBuilder ;
import org . 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 org . custommonkey . x m l u n i t . XMLUnit ;
import org . r e s t l e t . C l i e n t ;
import org . r e s t l e t . d a t a . Form ;
import org . r e s t l e t . d a t a . P r o t o c o l ;
import org . r e s t l e t . d a t a . Response ;
import org . w3c . dom . Document ;
import org . xml . sax . SAXException ;
import br . 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 br . 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 .
Cl ien teHTTPComAutent icacao ;
import br . 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 . Mic ro fo rma to ;
import br . 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 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 {
p r o t e c t e d s t a t i c C l i e n t c l i en teHTTP = new
Clien teHTTPNaoBloqueante ( 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
Clien teHTTPNaoBloqueante ( 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 ;
p u b l i c 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 ( ) {
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 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
= n u l l ;
t r y {
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 .
n e w T e s t P a r s e r ( ) ) ;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
c o n s t r u t o r D e D o c u m e n t o s = new HTMLDocumentBuilder (
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 ) ;
}
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 ( ) {
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 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
= n u l l ;
t r y {
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 .
n e w T e s t P a r s e r ( ) ) ;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
re turn new HTMLDocumentBuilder (
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 ) ;
}
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 ( ) ;
t r y {
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 / c o n f i g u r a c o e s . p r o p e r t i e s " ) ) )
;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
re turn p . g e t P r o p e r t y ( " e n d e r e c o B a s e D a A p l i c a c a o " ) ;
}
p r o t e c t e d s t a t i c S t r i n g ex t r a i rCabeça lhoDeNome ( Response r ,
S t r i n g nome ) {
141
re turn ( ( Form ) r . g e t A t t r i b u t e s ( ) . g e t ( " o rg . 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
IOExcept ion , F i l e N o t F o u n d E x c e p t i o n {
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 /
c o n f i g u r a c o e s . p r o p e r t i e s " ) ) ) ;
re turn p ;
}
p r i v a t e s t a t i c S t r i n g ob te rChaveDeCadas t r amen to ( S t r i n g URL) {
RepresentacaoXHTML r e p r e s e n t a ç ã o = n u l l ;
t r y {
r e p r e s e n t a ç ã o = new RepresentacaoXHTML (
o b t e r P a r s e r D e D o c u m e n t o s ( ) . p a r s 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 . g e t (URL) .
g e t E n t i t y ( ) . g e t T e x t ( ) ) ) ;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
Mic ro fo rma to m = 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 ( "
c a d a s t r o T e m p o r a r i o D e U s u a r i o " ) ;
re turn 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 o t e c t e d s t a t i c vo id 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 senha ) {
S t r i n g URL_DE_CADASTRAMENTO = obterURLBase ( ) + " /
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 ;
S t r i n g URL_DO_USUÁRIO = obterURLBase ( ) + " / u s u a r i o / "
+ c o r r e i o E l e t r o n i c o ;
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)
;
142
c l i en teHTTP . p u t (URL_DE_CADASTRAMENTO, c a d a s t r o .
g e t W e b R e p r e s e n t a t i o n ( ) ) ;
S t r i n g CHAVE_DO_PROPONENTE =
ob te rChaveDeCadas t r amen to (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_USUÁRIO) ;
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 ( " senha " , senha ) ;
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 en teHTTP . p u t (URL_DE_CADASTRAMENTO, f o r m u l á r i o .
g e t W e b R e p r e s e n t a t i o n ( ) ) ;
}
p r o t e c t e d s t a t i c vo id 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 senha , 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
Clien teHTTPNaoBloqueante ( new
Clien teHTTPComAutent icacao ( c o r r e i o E l e t r o n i c o ,
senha ) ) ;
Response r = c l i e n t e A u t e n t i c a d o . p o s t ( obterURLBase ( ) +
" / p r o p o s t a s D e S e m i n a r i o " , 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 ( ) ) ;
S t r i n g URL_DA_PROPOSTA_CRIADA =
ex t ra i rCabeça lhoDeNome ( r , " L o c a t i o n " ) ;
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,
a t i v a c a o . g e t W e b R e p r e s e n t a t i o n ( ) ) ;
}
143
p r o t e c t e d s t a t i c Micro fo rma to 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 r e p r e s e n t a ç ã o = n u l l ;
t r y {
r e p r e s e n t a ç ã o = new RepresentacaoXHTML (
o b t e r P a r s e r D e D o c u m e n t o s ( ) . p a r s 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 . g e t (URL) .
g e t E n t i t y ( ) . g e t T e x t ( ) ) ) ;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
re turn 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 (
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
endereçoDoRecurso ) throws SAXException , IOExcep t ion {
Response r e s p o s t a = c l i en teHTTP . g e t ( endereçoDoRecurso
) ;
S t r i n g c o n t e ú d o D a R e p r e s e n t a ç ã o = r e s p o s t a . g e t E n t i t y
( ) . g e t T e x t ( ) ;
re turn 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 (
c o n t e ú d o D a R e p r e s e n t a ç ã o ) ;
}
}
Listagem A.22: Arquivo: ClienteHTTPNaoBloqueante.java
package i n f r a E s t r u t u r a ;
import org . r e s t l e t . C l i e n t ;
import org . r e s t l e t . d a t a . Reques t ;
import org . r e s t l e t . d a t a . Response ;
p u b l i c c l a s s Clien teHTTPNaoBloqueante ex tends C l i e n t {
p r i v a t e C l i e n t c l i e n t e ;
p u b l i c Clien teHTTPNaoBloqueante ( C l i e n t c ) {
144
super ( c . g e t P r o t o c o l s ( ) ) ;
t h i s . c l i e n t e = c ;
}
@Override
p u b l i c vo id h a n d l e ( Reques t r e q u e s t , Response r e s p o n s e ) {
c l i e n t e . h a n d l e ( r e q u e s t , r e s p o n s e ) ;
t r y {
c l i e n t e . s t o p ( ) ;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
}
}
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 org . 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 org . j u n i t . A f t e r C l a s s ;
import org . j u n i t . Be f o r e ;
import org . j u n i t . T e s t ;
import org . r e s t l e t . d a t a . Form ;
import org . r e s t l e t . d a t a . Response ;
import org . r e s t l e t . d a t a . S t a t u s ;
import br . 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 br . 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 . Mic ro fo rma to ;
import br . 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 QuandoCadastramentoÉNovo ex tends
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 {
p u b l i c vo id cons i de r ando Que ( ) {
145
n ã o E x i s t e U m U s u á r i o D e C o r r e i o E l e t r ô n i c o _ p a b l o _ a r r o b a _ e d u g r a f _ u f s c _ b r
( ) ;
}
p u b l i c vo id caso ( ) {
e l e S e C a d a s t r e C o m _ C o r r e i o E l e t r ô n i c o _ p a b l o _ a r r o b a _ e d u g r a f _ u f s c _ b r
( ) ;
}
p u b l i c vo id e n t ã o ( ) {
d e v e S e r C r i a d o U m C a d a s t r a m e n t o C o m _ C o r r e i o E l e t r ô n i c o _ p a b l o _ a r r o b a _ e d u g r a f _ u f s c _ b r
( ) ;
}
@Test
p u b l i c vo id
d e v e S e r C r i a d o U m C a d a s t r a m e n t o C o m _ C o r r e i o E l e t r ô n i c o _ p a b l o _ a r r o b a _ e d u g r a f _ u f s c _ b r
( ) {
RepresentacaoXHTML r e p r e s e n t a ç ã o = n u l l ;
t r y {
r e p r e s e n t a ç ã o = new RepresentacaoXHTML (
o b t e r P a r s e r D e D o c u m e n t o s ( ) . p a r s 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 . g e t (
URL_DE_CADASTRAMENTO) . g e t E n t i t y ( ) . g e t T e x t
( ) ) ) ;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
Mic ro fo rma to m = 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 ( "
c a d a s t r o T e m p o r a r i o D e U s u a r i o " ) ;
a s s e r t E q u a l s (CORREIO_ELETRÔNICO , m.
o b t e r V a l o r D o A t r i b u t o ( " c o r r e i o E l e t r o n i c o " ) ) ;
}
@Before
p u b l i c vo id p r e l i m i n a r e s ( ) {
cons i de r ando Que ( ) ;
c a so ( ) ;
146
}
@Afte rClass
p u b l i c s t a t i c vo id l i m p a r C e n á r i 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 ( ) . 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 ;
t r y {
r = new RepresentacaoXHTML (
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 ( c l i en teHTTP .
g e t (URL_DE_CADASTRAMENTO) . g e t E n t i t y ( ) .
g e t T e x t ( ) ) ) ;
} catch ( E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
re turn r ;
}
p r i v a t e vo id
e l e S e C a d a s t r e C o m _ C o r r e i o E l e t r ô n i c o _ p a b l o _ a r r o b a _ e d u g r a f _ u f s c _ b r
( ) {
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_ELETRÔNICO)
;
Response r = c l i en teHTTP . p u t (URL_DE_CADASTRAMENTO,
c a d a s t r o . g e t W e b R e p r e s e n t a t i o n ( ) ) ;
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 ( ) ) ;
}
p u b l i c vo id
n ã o E x i s t e U m U s u á r i o D e C o r r e i o E l e t r ô n i c o _ p a b l o _ a r r o b a _ e d u g r a f _ u f s c _ b r
( ) {
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_USUÁRIO) ;
Response r = c l i en teHTTP . g e t (URL_DE_USUÁRIO) ;
147
a s s e r t E q u a l s ( S t a t u s . CLIENT_ERROR_NOT_FOUND, r .
g e t S t a t u s ( ) ) ;
}
/ / TODO: t r o c a r para 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_ELETRÔNICO = "
pab lo@edugraf . u f s c . b 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 URL_DE_CADASTRAMENTO =
obterURLBase ( ) + " / c a d a s t r a m e n t o / " + CORREIO_ELETRÔNICO ;
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_USUÁRIO = obterURLBase ( ) +
" / u s u a r i o / " + CORREIO_ELETRÔNICO ;
}
148
ANEXO B -- Código-fonte dos Recursos
Listagem B.1: Arquivo: Data.inc.php
<?php
c l a s s Data {
p r i v a t e $ d a t a ;
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 es táNoFormatoAmer icano ( ) {
r e t u r n ereg ( " ( [0 −9]{4}) −( [0−9]{1 ,2}) −( [0−9]{1 ,2}) " ,
$ t h i s −>d a t a ) ;
}
p r i v a t e f u n c t i o n 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 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 ( explode ( " / "
, $ t h i s −>d a t a ) ) ) ;
r e t u r n $ t h i s −>d a t a ;
}
p u b l i c f u n c t i o n n o F o r m a t o B r a s i l e i r o ( ) {
i f ( $ t h i s −>es táNoFormatoAmer icano ( ) )
149
r e t u r n implode ( " / " , a r r a y _ r e v e r s e ( explode ( "−"
, $ t h i s −>d a t a ) ) ) ;
r e t u r n $ t h i s −>d a t a ;
}
}
?>
Listagem B.2: Arquivo: BasePropostaDeSeminario.php
<?php
/∗ ∗∗ T h i s c l a s s has been auto−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 B a s e P r o p o s t a D e S e m i n a r i o e x t e n d s D o c t r i n e _ R e c o r d
{
p u b l i c f u n c t i o n s e t T a b l e D e f i n i t i o n ( )
{
$ t h i s −>setTableName ( ’ 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 od igo ’ , ’ i n t e g e r ’ , n u l l , array ( ’ t y p e ’ => ’
i n t e g e r ’ , ’ p r i m a r y ’ => true , ’ a u t o i n c r e m e n t ’ => t rue ) ) ;
$ t h i s −>hasColumn ( ’ nomeParaURL ’ , ’ s t r i n g ’ , 250 , array ( ’ t y p e ’ => ’
s t r i n g ’ , ’ n o t n u l l ’ => true , ’ l e n g t h ’ => ’ 250 ’ ) ) ;
$ t h i s −>hasColumn ( ’ t i t u l o ’ , ’ s t r i n g ’ , 250 , array ( ’ t y p e ’ => ’ s t r i n g
’ , ’ n o t n u l l ’ => true , ’ 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 , array ( ’ t y p e ’ => ’ c l o b
’ , ’ n o t n u l l ’ => t rue ) ) ;
$ t h i s −>hasColumn ( ’ i n s t r u c o e s ’ , ’ c l o b ’ , n u l l , array ( ’ t y p e ’ => ’
c l o b ’ ) ) ;
$ t h i s −>hasColumn ( ’ i n s c r i c a o ’ , ’ enum ’ , n u l l , array ( ’ t y p e ’ => ’enum
’ , ’ n o t n u l l ’ => array (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 , array ( ’ t y p e ’ => ’
enum ’ , ’ n o t n u l l ’ => array (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 , array ( ’ t y p e ’ =>
’enum ’ , ’ v a l u e s ’ => array (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 , array ( ’ t y p e ’ => ’
d a t e ’ , ’ n o t n u l l ’ => t rue ) ) ;
$ t h i s −>hasColumn ( ’ dataDeTermino ’ , ’ d a t e ’ , n u l l , array ( ’ t y p e ’ => ’
d a t e ’ , ’ n o t n u l l ’ => t rue ) ) ;
$ t h i s −>hasColumn ( ’ ramalUFSC ’ , ’ s t r i n g ’ , 4 , array ( ’ t y p e ’ => ’
s t r i n g ’ , ’ n o t n u l l ’ => true , ’ 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 , array ( ’ t y p e ’ => ’
i n t e g e r ’ , ’ n o t n u l l ’ => t rue ) ) ;
$ t h i s −>hasColumn ( ’ e s t a d o ’ , ’ enum ’ , n u l l , array ( ’ t y p e ’ => ’enum ’ ,
’ v a l u e s ’ => array (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 se tUp ( )
{
$ t h i s −>hasOne ( ’ U s u a r i o as P r o p o n e n t e ’ , array ( ’ l o c a l ’ => ’
p r o p o n e n t e ’ ,
’ f o r e i g n ’ => ’ cod ig 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 has been auto−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 B a s e P a r t i c i p a n t e e x t e n d s D o c t r i n e _ R e c o r d
{
p u b l i c f u n c t i o n s e t T a b l e D e f i n i t i o n ( )
{
$ t h i s −>setTableName ( ’ p a r t i c i p a n t e s ’ ) ;
$ t h i s −>hasColumn ( ’ c od igo ’ , ’ i n t e g e r ’ , n u l l , array ( ’ t y p e ’ => ’
i n t e g e r ’ , ’ p r i m a r y ’ => true , ’ a u t o i n c r e m e n t ’ => t rue ) ) ;
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 , array ( ’ t y p e ’ => ’
i n t e g e r ’ , ’ n o t n u l l ’ => t rue ) ) ;
$ t h i s −>hasColumn ( ’ u s u a r i o ’ , ’ i n t e g e r ’ , n u l l , array ( ’ t y p e ’ => ’
i n t e g e r ’ , ’ n o t n u l l ’ => t rue ) ) ;
}
p u b l i c f u n c t i o n se tUp ( )
{
$ t h i s −>hasOne ( ’ U s u a r i o ’ , array ( ’ l o c a l ’ => ’ u s u a r i o ’ ,
’ f o r e i g n ’ => ’ cod ig o ’ ,
’ o n D e l e t e ’ => ’CASCADE’ ) ) ;
$ t h i s −>hasOne ( ’ S e m i n a r i o ’ , array ( ’ l o c a l ’ => ’ s e m i n a r i o ’ ,
’ f o r e i g n ’ => ’ cod ig 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 ’ , array ( ’ l o c a l ’ => ’ co d i go ’ ,
’ 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 has been auto−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 B a s e A p r e s e n t a c a o e x t e n d s D o c t r i n e _ R e c o r d
{
p u b l i c f u n c t i o n s e t T a b l e D e f i n i t i o n ( )
{
$ t h i s −>setTableName ( ’ a p r e s e n t a c o e s ’ ) ;
$ t h i s −>hasColumn ( ’ c od igo ’ , ’ i n t e g e r ’ , n u l l , array ( ’ t y p e ’ => ’
i n t e g e r ’ , ’ p r i m a r y ’ => true , ’ a u t o i n c r e m e n t ’ => t rue ) ) ;
$ t h i s −>hasColumn ( ’ t i t u l o ’ , ’ s t r i n g ’ , 150 , array ( ’ t y p e ’ => ’ s t r i n g
’ , ’ u n i qu e ’ => true , ’ n o t n u l l ’ => true , ’ 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 ’ , 150 , array ( ’ t y p e ’ =>
’ s t r i n g ’ , ’ u n i qu e ’ => true , ’ n o t n u l l ’ => true , ’ 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 , array ( ’ t y p e ’ => ’
i n t e g e r ’ , ’ n o t n u l l ’ => t rue ) ) ;
$ 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 , array ( ’ t y p e ’ =>
’ i n t e g e r ’ , ’ n o t n u l l ’ => t rue ) ) ;
$ t h i s −>hasColumn ( ’ nomeDoArquivo ’ , ’ s t r i n g ’ , 100 , array ( ’ t y p e ’ =>
’ s t r i n g ’ , ’ n o t n u l l ’ => true , ’ l e n g t h ’ => ’ 100 ’ ) ) ;
$ t h i s −>hasColumn ( ’ a r q u i v o ’ , ’ b lob ’ , n u l l , array ( ’ t y p e ’ => ’ b lob ’ ,
’ n o t n u l l ’ => t rue ) ) ;
$ t h i s −>hasColumn ( ’ d a t a ’ , ’ d a t e ’ , n u l l , array ( ’ t y p e ’ => ’ d a t e ’ , ’
n o t n u l l ’ => t rue ) ) ;
$ t h i s −>hasColumn ( ’ ho ra ’ , ’ t ime ’ , n u l l , array ( ’ t y p e ’ => ’ t ime ’ , ’
n o t n u l l ’ => t rue ) ) ;
}
p u b l i c f u n c t i o n se tUp ( )
{
$ t h i s −>hasOne ( ’ P a r t i c i p a n t e ’ , array ( ’ 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 od ig o ’ ,
’ o n D e l e t e ’ => ’CASCADE’ ) ) ;
$ t h i s −>hasOne ( ’ S e m i n a r i o ’ , array ( ’ l o c a l ’ => ’ s e m i n a r i o ’ ,
’ f o r e i g n ’ => ’ cod ig 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 has been auto−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 Bas eC ada s t r am en to e x t e n d s D o c t r i n e _ R e c o r d
{
p u b l i c f u n c t i o n s e t T a b l e D e f i n i t i o n ( )
153
{
$ t h i s −>setTableName ( ’ c a d a s t r a m e n t o s ’ ) ;
$ t h i s −>hasColumn ( ’ c od igo ’ , ’ i n t e g e r ’ , n u l l , array ( ’ t y p e ’ => ’
i n t e g e r ’ , ’ p r i m a r y ’ => true , ’ a u t o i n c r e m e n t ’ => t rue ) ) ;
$ 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 ’ , 150 , array ( ’ t y p e ’
=> ’ s t r i n g ’ , ’ n o t n u l l ’ => true , ’ u n i qu e ’ => true , ’ 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 ’ , 40 , array ( ’ t y p e ’ => ’
s t r i n g ’ , ’ n o t n u l l ’ => true , ’ u n i qu e ’ => true , ’ l e n g t h ’ => ’ 40 ’
) ) ;
}
}
Listagem B.6: Arquivo: BaseCadastrosTemporariosDeUsuarios.php
<?php
/∗ ∗∗ T h i s c l a s s has been auto−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 B a s 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 e x t e n d s
D o c t r i n e _ R e c o r d
{
p u b l i c f u n c t i o n s e t T a b l e D e f i n i t i o n ( )
{
$ t h i s −>setTableName ( ’ 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 od igo ’ , ’ i n t e g e r ’ , n u l l , array ( ’ t y p e ’ => ’
i n t e g e r ’ , ’ p r i m a r y ’ => true , ’ a u t o i n c r e m e n t ’ => t rue ) ) ;
$ 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 ’ , 150 , array ( ’ t y p e ’
=> ’ s t r i n g ’ , ’ n o t n u l l ’ => true , ’ u n i qu e ’ => true , ’ 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 ’ , 40 , array ( ’ t y p e ’ => ’
s t r i n g ’ , ’ n o t n u l l ’ => true , ’ u n i qu e ’ => true , ’ l e n g t h ’ => ’ 40 ’
) ) ;
}
}
154
Listagem B.7: Arquivo: BaseSeminario.php
<?php
/∗ ∗∗ T h i s c l a s s has been auto−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 BaseSemina r io e x t e n d s D o c t r i n e _ R e c o r d
{
p u b l i c f u n c t i o n s e t T a b l e D e f i n i t i o n ( )
{
$ t h i s −>setTableName ( ’ s e m i n a r i o s ’ ) ;
$ t h i s −>hasColumn ( ’ c od igo ’ , ’ i n t e g e r ’ , n u l l , array ( ’ t y p e ’ => ’
i n t e g e r ’ , ’ p r i m a r y ’ => true , ’ a u t o i n c r e m e n t ’ => t rue ) ) ;
$ t h i s −>hasColumn ( ’ nomeParaURL ’ , ’ s t r i n g ’ , 250 , array ( ’ t y p e ’ => ’
s t r i n g ’ , ’ n o t n u l l ’ => true , ’ u n i qu e ’ => true , ’ l e n g t h ’ => ’ 250
’ ) ) ;
$ t h i s −>hasColumn ( ’ t i t u l o ’ , ’ s t r i n g ’ , 250 , array ( ’ t y p e ’ => ’ s t r i n g
’ , ’ n o t n u l l ’ => true , ’ u n i qu e ’ => true , ’ 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 , array ( ’ t y p e ’ => ’ c l o b
’ , ’ n o t n u l l ’ => t rue ) ) ;
$ t h i s −>hasColumn ( ’ i n s t r u c o e s ’ , ’ c l o b ’ , n u l l , array ( ’ t y p e ’ => ’
c l o b ’ ) ) ;
$ t h i s −>hasColumn ( ’ i n s c r i c a o ’ , ’ enum ’ , n u l l , array ( ’ t y p e ’ => ’enum
’ , ’ n o t n u l l ’ => array (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 , array ( ’ t y p e ’ => ’
enum ’ , ’ n o t n u l l ’ => array (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 , array ( ’ t y p e ’ =>
’enum ’ , ’ v a l u e s ’ => array (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 , array ( ’ t y p e ’ => ’
d a t e ’ , ’ n o t n u l l ’ => t rue ) ) ;
$ t h i s −>hasColumn ( ’ dataDeTermino ’ , ’ d a t e ’ , n u l l , array ( ’ t y p e ’ => ’
d a t e ’ , ’ n o t n u l l ’ => t rue ) ) ;
$ 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 , array ( ’ t y p e ’ =>
’ i n t e g e r ’ , ’ n o t n u l l ’ => t rue ) ) ;
}
155
p u b l i c f u n c t i o n se tUp ( )
{
$ t h i s −>hasOne ( ’ U s u a r i o as Coordenador ’ , array ( ’ l o c a l ’ => ’
c o o r d e n a d o r ’ ,
’ f o r e i g n ’ => ’
co d i go ’ ,
’ 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 ’ , array ( ’ l o c a l ’ => ’ co d i go ’ ,
’ 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 ’ , array ( ’ l o c a l ’ => ’ co d i go ’ ,
’ 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 has been auto−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 BaseUsua r io e x t e n d s D o c t r i n e _ R e c o r d
{
p u b l i c f u n c t i o n s e t T a b l e D e f i n i t i o n ( )
{
$ t h i s −>setTableName ( ’ u s u a r i o s ’ ) ;
$ t h i s −>hasColumn ( ’ c od igo ’ , ’ i n t e g e r ’ , n u l l , array ( ’ t y p e ’ => ’
i n t e g e r ’ , ’ p r i m a r y ’ => true , ’ a u t o i n c r e m e n t ’ => t rue ) ) ;
$ t h i s −>hasColumn ( ’nome ’ , ’ s t r i n g ’ , 255 , array ( ’ t y p e ’ => ’ s t r i n g ’ ,
’ n o t n u l l ’ => true , ’ 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 ’ , 150 , array ( ’ t y p e ’
=> ’ s t r i n g ’ , ’ n o t n u l l ’ => true , ’ u n i qu e ’ => true , ’ l e n g t h ’ =>
’ 150 ’ ) ) ;
$ t h i s −>hasColumn ( ’ senha ’ , ’ s t r i n g ’ , 41 , array ( ’ t y p e ’ => ’ s t r i n g ’ ,
’ n o t n u l l ’ => true , ’ l e n g t h ’ => ’ 41 ’ ) ) ;
156
$ t h i s −>hasColumn ( ’ ramalUFSC ’ , ’ s t r i n g ’ , 4 , array ( ’ 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 , array ( ’ t y p e ’ => ’enum ’ , ’
v a l u e s ’ => array (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 se tUp ( )
{
$ t h i s −>hasMany ( ’ P a r t i c i p a n t e ’ , array ( ’ l o c a l ’ => ’ co d i go ’ ,
’ 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 ’ , array ( ’ l o c a l ’ => ’ co d i go ’ ,
’ 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 ’ , array ( ’ l o c a l ’ => ’ co d i go ’ ,
’ f o r e i g n ’ => ’
p r o p o n e n t e ’ ) ) ;
}
}
Listagem B.9: Arquivo: Apresentacoes.inc.php
<?php
c l a s s A p r e s e n t a c o e s {
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 ex i s t eComSeminá r ioETí tu loParaURL (
S e m i n a r i o $ s e m i n á r i o , $ 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 = ? " , array ( $ s e m i n á r i o−>codigo ,
$ t í t u l o ) )−>count ( ) > 0 ;
}
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 o r S e m i n á r i o E T í t u l o P a r a U R L (
S e m i n a r i o $ s e m i n á r i o , $ 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 = ? " , array ( $ s e m i n á r i o−>codigo ,
$ t í t u l o ) )−>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 o b t e r P o r S e m i n á r i o ( S e m i n a r i o $ s e m i n á r i 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 = ? " , $ s e m i n á r i o
−>c od i go )−>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 exis teComSeminár ioETítuloParaURLENome (
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 = ? " , array (
$ s e m i n á r i o−>codigo , $ 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 obterComSeminárioETítuloParaURLENome (
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 = ? " , array (
$ s e m i n á r i o−>codigo , $ t í t u l o , $nomeDoArquivo ) )−>
f e t c h O n e ( ) ;
}
}
?>
Listagem B.10: Arquivo: Seminarios.inc.php
<?php
c l a s s S e m i n a r i o s {
p r i v a t e s t a t i c $nomeDaTabela = " S e m i n a r i o " ;
158
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 T o d o s ( ) {
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 )−>
f i n d A l l ( ) ;
}
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 ( $nomeParaUrl ) {
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 = ? " ,
$nomeParaUrl )−>e x e c u t e ( )−>count ( ) > 0 ;
}
p u b l i c s t a t i c f u n c t i o n obterPorNomeParaURL ( $nomeParaUrl ) {
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 = ? " ,
$nomeParaUrl )−>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 U s u a r i o s e x t e n d s BaseUsua r io {
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
senha =? " , array ( $ u s u á r i o , sha1 ( $senha ) ) )−>e x e c u t e
( ) ;
i f ( $ c o n s u l t a −>count ( ) > 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 ) ;
}
r e t u r n f a l s e ;
}
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 T o d o s ( ) {
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 )−>
f i n d A l l ( ) ;
}
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 o r P a p e l ( $ p a p e 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 ( " p a p e l =? " , $ p a p e l )−>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 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 (
$ c o r r e i o E l e t r o n i c 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 ( " 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 ( ) ;
}
p u b l i c s t a t i c f u n c t i o n e x i s t e C o m E s t e 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 ) {
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 ( )−>count ( ) > 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 ( ) . " /
u s u a r i o s " ;
}
}
?>
Listagem B.12: Arquivo: Apresentacao.inc.php
<?php
c l a s s A p r e s e n t a c a o e x t e n d s B a s e A p r e s e n t a c a 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 −>Seminar io−>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 : : ob te rDoArqu ivo ( $ t h i s −>nomeDoArquivo
) ;
}
p u b l i c f u n c t i o n o b t e r U R L D o P a r t i c i p a n t e ( ) {
r e t u r n $ t h i s −>Seminar io−>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 −>Usuar io−> 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 p r e I n s e r t ( ) {
$ t h i s −>d a t a = date ( ’ c ’ ) ;
$ t h i s −>hora = date ( ’H: i : s ’ ) ;
}
}
161
?>
Listagem B.13: Arquivo: PropostaDeSeminario.inc.php
<?php
c l a s s P r o p o s t a D e S e m i n a r i o e x t e n d s B a s e P r o p o s t a D e S e m i n a r i o {
/ / TODO: e x t r a i r para 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 od igo . " ?
a u t e n t i c a r = v e r d a d e i r o " ;
}
}
?>
Listagem B.14: Arquivo: Cadastramento.inc.php
<?php
c l a s s C a d a s t r a m e n t o e x t e n d s Bas eC ada s t r am en to {
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 ;
}
p u b l i c f u n c t i o n o b t e r U R L D e Fi n a l i z aç ã o ( ) {
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 U s u a r i o e x t e n d s BaseUsua r io {
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
" , " u s u a r i o " ) ;
p u b l i c f u n c t i o n o b t e r P a p e l B á s i c o ( ) {
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 ) {
foreach ( $ p a p é i s a s $umPapel ) {
i f ( $ t h i s −>éUm( $umPapel ) ) r e t u r n t rue ;
}
r e t u r n f a l s e ;
}
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 ) | |
array_search ( $ t h i s −>pape l , s e l f : : $ p a p é i s ) <=
array_search ( $pape l , s e l f : : $ p a p é i s ) ;
}
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 ( S e m i n a r i o $ s e m i n á r i o ) {
r e t u r n $ s e m i n á r i o−>Coordenador−>c od i go == $ t h i s −>
co d i go ; / / 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 obte rURLDeAdmin is t rador ( ) {
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
c l a s s P a r t i c i p a n t e e x t e n d s B a s e P a r t i c i p a n t e {
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 −>Seminar io−>obterURL ( ) . " / p a r t i c i p a n t e / "
. $ t h i s −>Usuar io−> 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 −>Usuar io−>nome ;
}
}
?>
Listagem B.17: Arquivo: Cadastramentos.inc.php
<?php
c l a s s C a d a s t r a m e n t o s {
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 =? " , $chave )−>
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 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 (
$ c o r r e i o E l e t r o n i c 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 ( " 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
p u b l i c s t a t i c f u n c t i o n e x i s t e C o m E s t e 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 ) {
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 ( )−>count ( ) > 0 ;
}
p u b l i c s t a t i c f u n c t i o n 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 ( $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 =? " , $chave )−>
e x e c u t e ( )−>count ( ) > 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 S e m i n a r i o e x t e n d s BaseSemina r io {
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 ;
}
p u b l i c f u n c t i o n o b t e r U R L D e P a r t i c i p a n t e s ( ) {
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 obte rURLDeApresen tações ( ) {
r e t u r n $ t h i s −>obterURL ( ) . " / a p r e s e n t a c o e s " ;
}
p u b l i c f u n c t i o n é 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 ) {
165
r e t u r n P a r t i c i p a n t e s : : e x i s t e ( $ u s u á r i o , $ t h i s ) ;
}
}
?>
Listagem B.19: Arquivo: Participantes.inc.php
<?php
c l a s s 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 $nomeDaTabela = " P a r t i c i p a n t e " ;
p u b l i c s t a t i c f u n c t i o n e x i s t e ( U s u a r i o $ u s u á r i o , S e m i n a r i o
$ s e m i n á r i o ) {
$ 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 =? " ,
array ( $ u s u á r i o −>codigo , $ s e m i n á r i o−>c od igo ) ) ;
r e t u r n $ c o n s u l t a −>count ( ) > 0 ;
}
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 o r S e m i n á r i o ( S e m i n a r i o $ s e m i n á r i 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 =? " , $ s e m i n á r i o−>
co d i go )−>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 o b t e r P o r U s u á r i o E S e m i n á r i o ( U s u a r i o
$ u s u á r i o , S e m i n a r i o $ s e m i n á r i 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 ( " u s u a r i o =? and s e m i n a r i o =? " ,
array ( $ u s u á r i o −>codigo , $ s e m i n á r i o−>c od igo ) )−>
f e t c h O n e ( ) ;
}
}
?>
Listagem B.20: Arquivo: PropostasDeSeminarios.inc.php
<?php
c l a s s P r o p o s t a s D e S e m i n a r i o s {
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 " ;
p u b l i c s t a t i c f u n c t i o n e x i s t e A P r o p o s t a ( $cod igo ) {
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 od igo = ? " , $cod igo )−>
e x e c u t e ( )−>count ( ) > 0 ;
}
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 o r C ó d i g o ( $cod igo ) {
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 od igo = ? " , $cod igo )−>
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 o b t e r T o d a s ( ) {
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 )−>
f i n d A l l ( ) ;
}
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 ( ) . " /
p r o p o s t a s D e S e m i n a r i o " ;
}
}
?>
Listagem B.21: Arquivo: MensagemDeConfirmacaoDeCadastramento.inc.php
<?php
c l a s s MensagemDeConfirmacaoDeCadastramento e x t e n d 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 A b s t r a t a {
p r i v a t e $ c a d a s t r a m e n t o ;
p u b l i c f u n c t i o n MensagemDeConfirmacaoDeCadastramento (
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 ) {
$ 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 ;
p a r e n t : : 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 A b s t r a t a ( ) ;
}
167
p u b l i c f u n c t i o n o b t e r C o n t e ú d o ( ) {
r e t u r n s p r i n t f ( " Caro ( a ) %s ,
Pa ra f i n a l i z a r seu 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 De F i n a l i z a ç ã o ( ) )
.
"
Se você não s o l i c i t o u o e n v i o d e s t a mensagem , por
f a v o r d e s c o n s i d e r e a mesma . " ;
}
p u b l i c f u n c t i o n o b t e r A s s u n t o ( ) {
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 " ;
}
p u b l i c f u n c t i o n o b t e r D e s t i n a t á r i o ( ) {
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 implemen t s MensagemDeCor re ioE le t ron i co {
p r i v a t e $msg ;
p u b l i c f u n c t i o n MensagemHTML ( MensagemDeCor re ioE le t ron i co
$mensagem ) {
$ t h i s −>msg = $mensagem ;
}
p u b l i c f u n c t i o n o b t e r C o n t e ú d o ( ) {
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 −>ob te rRodapé ( ) ) . " </
body > </ html >" ;
}
168
p u b l i c f u n c t i o n o b t e r A s s u n t o ( ) {
r e t u r n $ t h i s −>msg−>o b t e r A s s u n t o ( ) ;
}
p u b l i c f u n c t i o n ob t e rRodapé ( ) {
r e t u r n $ t h i s −>msg−>ob te rRodapé ( ) ;
}
p u b l i c f u n c t i o n o b t e r D e s t i n a t á r i o ( ) {
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 ( ) ;
}
p r i v a t e f u n c t i o n t x t 2 h t m l ( $ t x t ) {
$ t x t = s t r _ r e p l a c e ( " \ t " , ’   ;   ; ’ , $ t x t ) ;
whi le ( ! ( s t r p o s ( $ t x t , ’ ’ ) === FALSE ) ) $ t x t =
s t r _ r e p l a c e ( ’ ’ , ’   ; ’ , $ t x t ) ;
$ t x t = h t m l e n t i t i e s ( $ t x t , ENT_COMPAT, "UTF−8" ) ;
$ t x t = s t r _ r e p l a c e ( ’& ; ’ , ’&’ , $ t x t ) ;
$ t x t = p r e g _ r e p l a c e ( " / ( 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 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 A b s t r a t a imp lemen t s
MensagemDeCor re ioE le t ron i co {
p r o t e c t e d f u n c t i o n 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 A b s t r a t a ( ) {
new Mensage i ro ( $ t h i s ) ;
}
p u b l i c f u n c t i o n ob t e rRodapé ( ) {
r e t u r n " D i s s e m i n á r i o " ;
}
169
/ / p u b l i c a b s t r a c t f u n c t i o n o b t e r C o n t e ú d o ( ) ;
/ / p u b l i c a b s t r a c t f u n c t i o n o b t e r A s s u n t o ( ) ;
/ / p u b l i c a b s t r a c t f u n c t i o n o b t e r D e s t i n a t á r i o ( ) ;
}
?>
Listagem B.24: Arquivo: MensagemDeSeminarioCriado.inc.php
<?php
c l a s s MensagemDeSeminarioCriado e x t e n d 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 A b s t r a t a {
p r i v a t e $ s e m i n á r i o ;
p u b l i c f u n c t i o n MensagemDeSeminarioCriado ( S e m i n a r i o
$ s e m i n á r i o ) {
$ t h i s −>s e m i n á r i o = $ s e m i n á r i o ;
p a r e n t : : 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 A b s t r a t a ( ) ;
}
p u b l i c f u n c t i o n o b t e r C o n t e ú d o ( ) {
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 ( ) ;
}
p u b l i c f u n c t i o n o b t e r A s s u n t o ( ) {
r e t u r n " S e m i n á r i o C r i ad o " ;
}
p u b l i c f u n c t i o n o b t e r D e s t i n a t á r i o ( ) {
r e t u r n $ t h i s −>s e m i n á r i o−>Coordenador−>
c o r r e i o E l e t r o n i c o ;
}
}
?>
Listagem B.25: Arquivo: MensagemDeCorreioEletronico.inc.php
<?php
i n t e r f a c e MensagemDeCor re ioE le t ron i co {
p u b l i c f u n c t i o n o b t e r C o n t e ú d o ( ) ;
170
p u b l i c f u n c t i o n o b t e r A s s u n t o ( ) ;
p u b l i c f u n c t i o n o b t e r D e s t i n a t á r i o ( ) ;
p u b l i c f u n c t i o n ob t e rRodapé ( ) ;
}
?>
Listagem B.26: Arquivo: MensagemDePropostaCriada.inc.php
<?php
c l a s s MensagemDePropostaCr iada e x t e n d 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 A b s t r a t a {
p r i v a t e $ p r o p o s t a ;
p u b l i c f u n c t i o n MensagemDePropostaCr iada ( 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 ) {
$ t h i s −>p r o p o s t a = $ p r o p o s t a ;
p a r e n t : : 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 A b s t r a t a ( ) ;
}
p u b l i c f u n c t i o n o b t e r C o n t e ú d o ( ) {
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 −>Proponen te−>nome . " ( " . $ t h i s −>p r o p o s t a −>
Proponen te−> 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 ,
a c e s s e " . $ t h i s −>p r o p o s t a −>obterURL ( ) . " p a r a conf i rmá−l a ou r e j e i t á −l a . " ;
}
p u b l i c f u n c t i o n o b t e r A s s u n t o ( ) {
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 para c o n f i g u r a ç ã o
/ / TODO: mandar para t o d o s .
p u b l i c f u n c t i o n o b t e r D e s t i n a t á r i o ( ) {
$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 ;
}
}
?>
171
Listagem B.27: Arquivo: MensagemDeContaCriada.inc.php
<?php
c l a s s MensagemDeContaCriada e x t e n d 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 A b s t r a t a {
p r i v a t e $ u s u á r i o ;
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 −>senha = $senha ;
p a r e n t : : 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 A b s t r a t a ( ) ;
}
p u b l i c f u n c t i o n o b t e r C o n t e ú d o ( ) {
r e t u r n s p r i n t f ( " Caro ( a ) %s ,
Você acaba de c r i a r sua c o n t a no D i s s e m i n á r i o , s e u s
dados 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 −>senha ) ;
}
p u b l i c f u n c t i o n o b t e r A s s u n t o ( ) {
r e t u r n " Conta c r i a d a " ;
}
p u b l i c f u n c t i o n o b t e r D e s t i n a t á r i o ( ) {
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_EXTENSÃO = 3 ;
/ / TODO: complementar quando houver 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 = array (
" pdf " => " a p p l i c a t i o n / pdf " ,
" doc " => " a p p l i c a t i o n / msword " ,
" pps " => " a p p l i c a t i o n / vnd . ms−p o w e r p o i n t " ,
" p p t " => " a p p l i c a t i o n / vnd . ms−p 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 . opendocument . 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 . opendocument . 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 ob te rDoArqu ivo ( $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_EXTENSÃO) ;
}
}
?>
Listagem B.29: Arquivo: Disseminario.inc.php
<?php
c l a s s D i s s e m i n a r i 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 U R L_ B a s e Re l a t i v a ( ) {
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 RecursoUmaPropos taDeSeminar io e x t e n d s Recurso {
/∗ ∗∗ @Auten t i cacaoBas i ca ( " a d m i n i s t r a d o r " )
∗ /
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 ( ! P r o p o s t a s D e S e m i n a r i o s : : e x i s t e A P r o p o s t a (
$ r e q u i s i ç ã o −>obterVar iáve lDaURL ( ’ c od igo ’ ) ) ) {
header ( ’HTTP / 1 . 1 404 Resource n o t found ’ ) ;
i n c l u d e _ o n c e ’ r e p r e s e n t a c o e s / 4 0 4 . h tml ’ ;
d i 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 ( $ 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 " ) ;
$ p r o p o s t a = P r o p o s t a s D e S e m i n a r i o s : : o b t e r P o r C ó d i g o (
$ r e q u i s i ç ã o −>obterVar iáve lDaURL ( ’ c od igo ’ ) ) ;
$ 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 ) ;
$ u s u á r i o = 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 −>obterNomeDeUsuár io ( ) ) ;
$ t e m p l a t e−>a s s i g n ( " URL_paraSubmissão " , $ 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 ropos t aDeSemina r ioComFormula r io . t p l . php " ) ;
}
/∗ ∗∗ @Auten t i cacaoBas i ca ( " a d m i n i s t r a d o r " )
∗ /
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 −>obterVar iáve lDaURL ( ’
co d i go ’ ) ;
174
i f ( ! P r o p o s t a s D e S e m i n a r i o s : : e x i s t e A P r o p o s t a (
$ c o d i g o D a P r o p o s t a ) ) {
header ( ’HTTP / 1 . 1 404 Resource n o t found ’ ) ;
i n c l u d e _ o n c e ’ r e p r e s e n t a c o e s / 4 0 4 . h tml ’ ;
d i e ( ) ;
}
$dadosDoFormulá r io = $ r e q u i s i ç ã o −>
ob te rDadosDoFormu lá r i o ( ) ;
i f ( $dadosDoFormulá r io [ ’ a p r o v a d a ’ ] == " v e r d a d e i r o " ) {
$ t r a n s a ç ã o = Doc t r ine_Manager : : c o n n e c t i o n ( ) ;
$ t r a n s a ç ã o −>b e g i n T r a n s a c t i o n ( ) ;
$ p r o p o s t a = P r o p o s t a s D e S e m i n a r i o s : :
o b t e r P o r C ó d i g o ( $ c o d i g o D a P r o p o s t a ) ;
$ 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 od igo = 0 ;
$ s e m i n a r i o−>Coordenador = $ p r o p o s t a−>
P r o p o n e n t e ;
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 (
$ 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 " , " E r ro : 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 ac 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 p á g i n a
i n i c i a l " ) ;
$ e n l a c e s [ ] = new E n l ac 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 t o d a s as p r o p o s t a 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 " , t rue ) ;
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 " ) ;
d i e ( ) ;
}
i f ( $ s e m i n a r i o−>Coordenador−>p a p e l != "
a d m i n i s t r a d o r " )
$ s e m i n a r i o−>Coordenador−>p a p e l = "
c o o r d e n a d o r " ;
$ s e m i n a r i o−>Coordenador−>ramalUFSC =
$ p r o p o s t a−>ramalUFSC ;
t r y {
$ s e m i n a r i o−>save ( ) ;
$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−>save ( ) ;
$ 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−>save ( ) ;
new MensagemDeSeminarioCriado
( $ s e m i n a r i o ) ;
$ 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−>ge tMessage ( ) ;
d i e ( ) ;
}
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 ) ;
$ 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 A c e i t a " ) ;
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 En l ac 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 p á g i n a
i n i c i a l " ) ;
$ e n l a c e s [ ] = new En l ac 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 t o d a s as p r o p o s t a s " ) ;
$ e n l a c e s [ ] = new En l ac e ( $ s e m i n a r i o−>obterURL
( ) , " C l i q u e a q u i p a r a i r p a r a v i s i t a r o
s e m i n á r i o c r i a d 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 ( "
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 " , t rue ) ;
$ 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 " ) ;
d i e ( ) ;
}
}
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 ) {
$ p r o p o s t a = P r o p o s t a s D e S e m i n a r i o s : :
obterPorNomeParaURL ( $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ 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 R e c u r s o P r o p o s t a s D e S e m i n a r i o e x t e n d s Recurso {
/∗ ∗∗ @Auten t i cacaoBas i ca
∗ /
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 ( ) ;
$dadosDoFormulá r io = $ r e q u i s i ç ã o −>
ob te rDadosDoFormu lá r i o ( ) ;
$ p r o p o s t a−>merge ( $dadosDoFormulá r io ) ;
$ d a t a D e I n i c i o = new Data ( $dadosDoFormulá r io [ "
d a t a D e I n i c i o " ] ) ;
$ 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 ( ) ;
$dataDeTermino = new Data ( $dadosDoFormulá r io [ "
da taDeTermino " ] ) ;
$ p r o p o s t a−>dataDeTermino = $dataDeTermino−>
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 −>
obterNomeDeUsuár io ( ) ) ;
$ t r a n s a ç ã o = Doc t r ine_Manager : : c o n n e c t i o n ( ) ;
$ t r a n s a ç ã o −>b e g i n T r a n s a c t i o n ( ) ;
t r y {
$ p r o p o s t a−>save ( ) ;
$ t r a n s a ç ã o −>commit ( ) ;
new MensagemDePropostaCr iada ( $ 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−>ge tMessage ( ) ;
d i 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 ( $ 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
por c o r r e i o e l e t r ô n i c o quando houver uma r e s p o s t a .
" ) ;
$ e n l a c e s [ ] = new E n l ac 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 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 " ,
t rue ) ;
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 od igo ) ;
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 "
) ;
}
/∗ ∗∗ @Auten t i cacaoBas i ca ( " a d m i n i s t r a d o r " )
∗ /
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 : :
o b t e r T o d a s ( ) ) ;
$ 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 " , "
p r o p o s t a s D e S e m i n a r i o " ) ;
$ 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 r o p o s t a D e 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 " ) ;
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 / Colecao . 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 R e c u r s o A d m i n i s t r a d o r e s e x t e n d s 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 (
" 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 ( " 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 " , "
ob te rURLDeAdminis t rador " ) ;
$ 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 / Colecao . 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 {
/∗ ∗∗ @Auten t i cacaoBas i ca
∗ /
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 −>
obterVar iáve lDaURL ( " nomeParaURL " ) ) ) {
header ( ’HTTP / 1 . 1 404 Resource Not Found ’ ) ;
echo ’ S e m i n á r i o i n e x i s t e n t e ’ ;
d i e ( ) ;
}
i f ( ! A p r e s e n t a c o e s : : ex i s t eComSeminá r ioETí tu loPa raURL (
S e m i n a r i o s : : obterPorNomeParaURL ( $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ nomeParaURL ’ ) ) , $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ t i t u l o P a r a U R L ’ ) ) ) {
header ( ’HTTP / 1 . 1 404 Resource Not Found ’ ) ;
echo ’ A p r e s e n t a ç ã o I n e x i s t e n t e ’ ;
d i e ( ) ;
}
$ a p r e s e n t a ç ã o = A p r e s e n t a c o e s : :
o b t e r P o r S e m i n á r i o E T í t u l o P a r a U R L ( S e m i n a r i o s : :
obterPorNomeParaURL ( $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ nomeParaURL ’ ) ) , $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ t i t u l o P a r a U R L ’ ) ) ;
t r y {
$ 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 −>
obterVar iáve lDaURL ( " nomeParaURL " ) ) ) {
header ( ’HTTP / 1 . 1 404 Resource Not Found ’ ) ;
echo ’ S e m i n á r i o i n e x i s t e n t e ’ ;
d i e ( ) ;
}
i f ( ! A p r e s e n t a c o e s : : ex i s t eComSeminá r ioETí tu loPa raURL (
S e m i n a r i o s : : obterPorNomeParaURL ( $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ nomeParaURL ’ ) ) , $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ t i t u l o P a r a U R L ’ ) ) ) {
header ( ’HTTP / 1 . 1 404 Resource Not Found ’ ) ;
echo ’ A p r e s e n t a ç ã o I n e x i s t e n t e ’ ;
d i e ( ) ;
}
header ( ’HTTP / 1 . 1 200 OK’ ) ;
$ a p r e s e n t a ç ã o = A p r e s e n t a c o e s : :
o b t e r P o r S e m i n á r i o E T í t u l o P a r a U R L ( S e m i n a r i o s : :
obterPorNomeParaURL ( $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ nomeParaURL ’ ) ) , $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ t i t u l o P a r a U R L ’ ) ) ;
$ 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 / UmaApresentacao .
t p l . php " ) ;
}
/∗ ∗∗ @Auten t i cacaoBas i ca
∗ /
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 −>
obterVar iáve lDaURL ( " nomeParaURL " ) ) ) {
header ( ’HTTP / 1 . 1 404 Resource Not Found ’ ) ;
i n c l u d e _ o n c e ’ r e p r e s e n t a c o e s / 4 0 4 . h tml ’ ;
d i e ( ) ;
}
$ 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 −>obterVar iáve lDaURL ( " nomeParaURL " ) ) ;
$ u s u á r i o = 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 −>obterNomeDeUsuár io ( ) ) ;
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 " ;
d i e ( ) ;
}
i f ( $ r e q u i s i ç ã o −>obterNomeDeUsuár io ( ) == ’
u s u a r i o D o 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 ’ ) {
$ a r q u i v o = new ArquivoDeConteudo ( $ r e q u i s i ç ã o
−>obterVar iáve lDaURL ( " 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 −>obterVar iáve lDaURL ( "
t i t u l o P a r a U R L " ) . "− t i t u l o " ;
}
e l s e {
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 Reques 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
( $ 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 " , " E r ro −Envio 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 " , " Não
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 a r q u i v o
183
p u b l i c a d o não contém c o n t e ú d o . " ) ;
$ e n l a c e s [ ] = new En l ac 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 = v e r d a d e i r o " , " C l i q u e
a q u i p a r a i r p a r a 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 " ) ;
d i e ( ) ;
}
i f ( empty ( $_FILES [ ’ a r q u i v o ’ ] ) ) {
header ( ’HTTP / 1 . 1 400 Bad Reques 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
( $ 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 " , " E r ro −Envio 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 " , " Não
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 a r q u i v o
p u b l i c a d o tem tamanho maior que 2
MB. " ) ;
$ e n l a c e s [ ] = new E n l ac 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 = v e r d a d e i r o " , " C l i q u e
a q u i p a r a i r p a r a 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 " ) ;
d i e ( ) ;
}
i f ( A p r e s e n t a c o e s : :
ex i s t eComSeminá r ioETí tu loPa raURL (
184
$ s e m i n á r i o , $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( " t i t u l o P a r a U R L " ) ) ) {
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
( $ 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 " , " E r ro −Envio 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 " , " Não
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 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
in fo rmado . " ) ;
$ e n l a c e s [ ] = new E n l ac 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 = v e r d a d e i r o " , " C l i q u e
a q u i p a r a i r p a r a 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 " ) ;
d i e ( ) ;
}
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
Reques 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 (
$ 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 " , "
E r ro − Envio 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 " ,
" Não 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 a r q u i v o p u b l i c a d o
tem tamanho maior que 2MB
. " ) ;
$ e n l a c e s [ ] = new En l ac 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 =
v e r d a d e i r o " , " C l i q u e a q u i
p a r a i r p a r a 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 " ) ;
d i e ( ) ;
}
}
$ 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 −>
o b t e r V a r i á v e l D e C o n s u l t a ( " t i t u l o " ) ;
}
/∗ So lução para problema do c l i e n t R e s t l e t , que não
s u p o r t a c o d i f i c a ç ã o m u l t i p a r t ∗ /
/ / TODO: mudar o nome de ArquivoDeConteudo . . .
$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 −>obterVar iáve lDaURL ( " nomeParaURL " ) ) ;
$a−>t i t u l o P a r a U R L = $ r e q u i s i ç ã o −>obterVar iáve lDaURL ( "
t i t u l o P a r a U R L " ) ;
$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 : :
o b t e r P o r U s u á r i o E S e m i n á r i o ( $ u s u á r i o , $ s e m i n á r i o ) ;
$a−>a r q u i v o = $a rqu ivo−>o b t e r C o n t e ú d o ( ) ;
$a−>nomeDoArquivo = $a rqu ivo−>obterNome ( ) ;
186
t r y {
$a−>save ( ) ;
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−>ge tMessage ( ) ) ;
d i 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 ( $ 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−>
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 ) ;
$ 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 / UmaApresentacao .
t p l . php " ) ;
}
}
?>
Listagem B.34: Arquivo: RecursoAdministrador.inc.php
<?php
c l a s s R e c u r s o A d m i n i s t r a d o r e x t e n d s Recurso {
/ / TODO: f a t o r e s , có d i go comum com RecursoUsuar io
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 ( ! U s u a r i o s : : e x i s t e C o m E s t e 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 −>obterVar iáve lDaURL ( " c o r r e i o E l e t r o n i c o
" ) ) ) {
header ( ’HTTP / 1 . 1 404 Resource n o t found ’ ) ;
i n c l u d e _ o n c e ’ r e p r e s e n t a c o e s / 4 0 4 . h tml ’ ;
d i e ( ) ;
}
$ u s u a r i o = 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 −>obterVar iáve lDaURL ( " 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 = new Savan t3 ( ) ;
$ 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 ) ;
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 −>obterVar iáve lDaURL (
" c o r r e i o E l e t r o n i c o " ) ;
$ t r a n s a ç ã o = Doc t r ine_Manager : : c o n n e c t i o n ( ) ;
t r y {
$ t r a n s a ç ã o −>b e g i n T r a n s a c t i o n ( ) ;
$dados = $ r e q u i s i ç ã o −>ob te rDadosDoFormulá 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 =
$ c o r r e i o E l e t r o n i c o ;
$ u s u á r i o −>nome = $dados [ ’nome ’ ] ;
$ u s u á r i o −>senha = sha1 ( $dados [ ’ senha ’ ] ) ;
$ 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 −>save ( ) ;
$ 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−>ge tMessage ( ) ;
d i e ( ) ;
}
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 ( ! U s u a r i o s : : e x i s t e C o m E s t e 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 −>obterVar iáve lDaURL ( " c o r r e i o E l e t r o n i c o
" ) ) ) {
header ( ’HTTP / 1 . 1 404 Not Found ’ ) ;
d i e ( ) ;
188
}
$ u s u á r i o = 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 −>obterVar iáve lDaURL ( " 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 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 e x t e n d s Recurso {
/∗ ∗∗ @Auten t i cacaoBas i ca
∗ ∗ /
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_paraSubmissão " , D i s s e m i n a r i o
: : obterURL_BaseCompleta ( ) . " / p r o p o s t a s D e S e m i n a r i o
" . " ? a u t e n t i c a r = v e r d a d e i r 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−> 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 sempre " a u t e n t i c a r =
v e r d a d e i r o " em suas URls .
p u b l i c s t a t i c f u n c t i o n obterURL ( ) {
189
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 " . " ? a u t e n t i c a r = v e r d a d e i r o " ;
}
}
?>
Listagem B.36: Arquivo: RecursoUsuario.inc.php
<?php
c l a s s R e c u r s o U s u a r i o 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 ) {
i f ( ! U s u a r i o s : : e x i s t e C o m E s t e 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 −>obterVar iáve lDaURL ( " c o r r e i o E l e t r o n i c o
" ) ) ) {
header ( ’HTTP / 1 . 1 404 Resource n o t found ’ ) ;
i n c l u d e _ o n c e ’ r e p r e s e n t a c o e s / 4 0 4 . h tml ’ ;
d i e ( ) ;
}
$ u s u a r i o = 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 −>obterVar iáve lDaURL ( " 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 = $ 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 ) {
$dados = $ r e q u i s i ç ã o−>obterDadosDoFormulár io ( ) ;
i f ( ! $dados [ ’ c h a v e S e c r e t a ’ ] | | ! Cadas t ramen tos : :
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 ’ ] ) )
{
header ( ’HTTP / 1 . 1 404 Not Found ’ ) ;
d i e ( ) ;
}
190
$ c a d a s t r o = Cadas t ramen tos : : o b t e r P e l 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 ’ ] ) ;
$ t r a n s a ç ã o = Doctr ine_Manager : : c o n n e c t i o n ( ) ;
t r y {
$ t ransação−>b e g i n T r a n s a c t i o n ( ) ;
$dados = $ r e q u i s i ç ã o−>obterDadosDoFormulár io
( ) ;
$ u s u á r i o = new Usuar io ( ) ;
$usuár io−>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−>
obterVar iáve lDaURL ( ’ c o r r e i o E l e t r o n i c o ’ ) ;
$usuár io−>nome = $dados [ ’ nome ’ ] ;
$usuár io−>senha = sha1 ( $dados [ ’ senha ’ ] ) ;
$ c a d a s t r o−>d e l e t e ( ) ;
$usuár io−>save ( ) ;
$ t ransação−>commit ( ) ;
}
c a t c h ( E x c e p t i o n $e ) {
$ t ransaçã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−>getMessage ( ) ;
d i e ( ) ;
}
header ( ’HTTP / 1 . 1 201 Crea ted ’ ) ;
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 ( ! U s u a r i o s : : e x i s t e C o m E s t e 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 −>obterVar iáve lDaURL ( " c o r r e i o E l e t r o n i c o
" ) ) ) {
header ( ’HTTP / 1 . 1 404 Not Found ’ ) ;
d i e ( ) ;
}
$ u s u á r i o = 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 −>obterVar iáve lDaURL ( " 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 Recur soCoordenador e x t e n d s Recurso {
/ / TODO: f a t o r e s , có d i go comum com RecursoUsuar io
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 ( ! U s u a r i o s : : e x i s t e C o m E s t e 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 −>obterVar iáve lDaURL ( " c o r r e i o E l e t r o n i c o
" ) ) ) {
header ( ’HTTP / 1 . 1 404 Resource n o t found ’ ) ;
i n c l u d e _ o n c e ’ r e p r e s e n t a c o e s / 4 0 4 . h tml ’ ;
d i e ( ) ;
}
$ u s u a r i o = 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 −>obterVar iáve lDaURL ( " 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 = new Savan t3 ( ) ;
$ 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 " )
;
}
}
?>
Listagem B.38: Arquivo: RecursoCadastroDeUsuario.inc.php
<?php
c l a s s R e c u r s o C a d a s t r o D e U s u a r i o e x t e n d s 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_paraSubmissão " , 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 " ,
t rue ) ;
$ 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 R e c u r s o A p r e s e n t a c a o e x t e n d s Recurso {
/∗ ∗∗ @Auten t i cacaoBas i ca
∗ ∗ /
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 −>obterVar iáve lDaURL ( ’ nomeParaURL ’ ) ) ;
$ t e m p l a t e−>a s s i g n ( " URL_paraSubmissão " , $ 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 " , " Envio 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 ( " s e m i n a r i o " , $ s e m i n á 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 /
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 ’ ) ;
}
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 R e c u r s o C o o r d e n a d o r e s e x t e n d s 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 (
" 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 ( " t i t u l o " , " Coordenado re 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 / Colecao . 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 e x t e n d s 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 −>obterVar iáve lDaURL ( "
nomeParaURL " ) ;
i f ( ! S e m i n a r i o s : : existeComNomeParaURL ( $nomeDaURL ) ) {
header ( ’HTTP / 1 . 1 404 Resource n o t found ’ ) ;
i n c l u d e _ o n c e ’ r e p r e s e n t a c o e s / 4 0 4 . h tml ’ ;
d i e ( ) ;
}
$ 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 la ce (
$ 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 : :
o b t e r P o r S e m i n á r i o ( $ s e m i n á r i o ) ) ;
$ 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 " , array ( " 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 / Colecao . t p l . php " )
;
}
}
?>
Listagem B.42: Arquivo: RecursoApresentacoes.inc.php
<?php
c l a s s R e c u r s o A p r e s e n t a c o e s e x t e n d s 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 −>
obterVar iáve lDaURL ( ’ nomeParaURL ’ ) ) ) {
header ( ’HTTP / 1 . 1 404 Resource Not Found ’ ) ;
i n c l u d e _ o n c e ’ r e p r e s e n t a c o e s / 4 0 4 . h tml ’ ;
d i e ( ) ;
}
$ 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 −>obterVar iáve lDaURL ( ’ 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 la ce (
$ 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 En l ac e ( $ s e m i n á r i o−>obterURL
( ) . " / a p r e s e n t a c a o " , " P u b l i c a r
a p r e s e n t a ç ã 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 o l e c a o " , A p r e s e n t a c o e s : :
o b t e r P o r S e m i n á r i o ( $ s e m i n á r 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 ç õ 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 / Colecao . t p l . php " )
;
}
}
?>
Listagem B.43: Arquivo: RecursoCadastramento.inc.php
<?php
c l a s s R e c u r s o C a d a s t r a m e n t o e x t e n d s 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 ) {
$dadosDoFormulá r io = $ r e q u i s i ç ã o −>
ob te rDadosDoFormu lá r i o ( ) ;
i f ( $dadosDoFormulá r io [ ’ c h a v e S e c r e t a ’ ] ) {
$ t r a n s a ç ã o = Doc t r ine_Manager : : c o n n e c t i o n ( ) ;
i f ( C a d a s t r a m e n t o s : : 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
( $dadosDoFormulá r io [ ’ c h a v e S e c r e t a ’ ] ) ) {
t r y {
$ t r a n s a ç ã o −>b e g i n T r a n s a c t i o n
( ) ;
$ c a d a s t r o = C a d a s t r a m e n t o s : :
o b t e r P e l a C h a v e S e c r e t a (
$dadosDoFormulá r io [ ’
c h a v e S e c r e t a ’ ] ) ;
$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 −>
c o r r e i o E l e t r o n i c o ;
$u−>senha = sha1 (
$dadosDoFormulá r io [ ’ senha ’
197
] ) ;
$u−>nome = $dadosDoFormulá r io
[ ’nome ’ ] ;
$u−>save ( ) ;
new MensagemDeContaCriada ( $u ,
$dadosDoFormulá r io [ ’ 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 −>
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 F i n a l i z a d o " )
;
$ 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ê acaba de f i n a l i z a r seu
c a d a s t r a m e n t o , a g o r a 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 á
e x i s t e n t e .
Lembre−se que quando p r e c i s a r
se a u t e n t i c a r , seu ’nome
de u s u á r i o ’ é : %s " , $u−>
nome , $u−>
c o r r e i o E l e t r o n i c o ) ) ;
$ e n l a c e s [ ] = new En l ac 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
p á g i n a 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 " ,
$ 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
198
" , t rue ) ;
$ 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 " ) ;
d i e ( ) ;
} 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 ’ ) ;
$ t r a n s a ç ã o −> r o l l b a c k ( ) ;
d i e ( ) ;
}
}
e l s e {
header ( ’HTTP / 1 . 1 404 Resource n o t
found ’ ) ;
i n c l u d e _ o n c e ’ r e p r e s e n t a c o e s / 4 0 4 . h tml
’ ;
d i e ( ) ;
}
}
i f ( ! C a d a s t r a m e n t o s : : e x i s t e C o m E s t e 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 −>obterVar iáve lDaURL ( " 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 −>
obterVar iáve lDaURL ( " 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 ) ;
}
e l s e {
$ c a d a s t r o = C a d a s t r a m e n t o s : :
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 −>
obterVar iáve lDaURL ( " c o r r e i o E l e t r o n i c o " ) ) ;
}
$ t r a n s a ç ã o = Doc t r ine_Manager : : c o n n e c t i o n ( ) ;
t r y {
$ 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 −>save ( ) ;
new
MensagemDeConfirmacaoDeCadastramento
( $ c a d a s t r o ) ;
$ 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−>ge tMessage ( ) ;
d i e ( ) ;
}
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 ac e ( S e m i n a r i o s : : obterURL ( ) , "
Todos 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 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 " , " Obr igado p e l o
i n t e r e s s e . Estamos e n v i a n d o uma mensagem p a r a seu
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 seu 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 " ,
t rue ) ;
$ 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 ) {
C a d a s t r a m e n t o s : : 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 −>obterVar iáve lDaURL ( " 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’ ) ;
}
/∗ ∗∗ @Auten t i cacaoBas i ca ( " a d m i n i s t r a d o r " )
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 −>obterVar iáve lDaURL (
" c o r r e i o E l e t r o n i c o " ) ;
i f ( ! C a d a s t r a m e n t o s : : e x i s t e C o m E s t e 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 ) ) {
header ( ’HTTP / 1 . 1 404 Resource n o t found ’ ) ;
i n c l u d e _ o n c e ’ r e p r e s e n t a c o e s / 4 0 4 . h tml ’ ;
d i e ( ) ;
}
$ c a d a s t r o = C a d a s t r a m e n t o s : :
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 ( $ 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 = $ 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 s " ) ;
$ 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 " ,
t rue ) ;
$ 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 ( ) . " /
c a d a s t r a m e n t o " ;
}
}
?>
Listagem B.44: Arquivo: RecursoSeminarios.inc.php
<?php
c l a s s R e c u r s o S e m i n a r i o s e x t e n d s 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 rue ) ;
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 En l ac 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 op 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 / Colecao . 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 comparações ?
i f ( ! S e m i n a r i o s : : existeComNomeParaURL ( $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( " nomeParaURL " ) ) ) {
header ( ’HTTP / 1 . 1 404 Resource Not Found ’ ) ;
echo ’ S e m i n á r i o i n e x i s t e n t e ’ ;
d i e ( ) ;
}
202
i f ( ! A p r e s e n t a c o e s : : ex i s t eComSeminá r ioETí tu loPa raURL (
S e m i n a r i o s : : obterPorNomeParaURL ( $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ nomeParaURL ’ ) ) , $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ t i t u l o P a r a U R L ’ ) ) ) {
header ( ’HTTP / 1 . 1 404 Resource Not Found ’ ) ;
echo ’ A p r e s e n t a ç ã o I n e x i s t e n t e ’ ;
d i e ( ) ;
}
i f ( ! A p r e s e n t a c o e s : :
exis teComSeminár ioETítuloParaURLENome ( S e m i n a r i o s : :
obterPorNomeParaURL ( $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ nomeParaURL ’ ) ) , $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ t i t u l o P a r a U R L ’ ) , $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ a r q u i v o ’ ) ) ) {
header ( ’HTTP / 1 . 1 404 Resource Not Found ’ ) ;
echo ’ Arquivo i n e x i s t e n t e ’ ;
d i e ( ) ;
}
$ a p r e s e n t a ç ã o = A p r e s e n t a c o e s : :
obterComSeminárioETítuloParaURLENome ( S e m i n a r i o s : :
obterPorNomeParaURL ( $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ nomeParaURL ’ ) ) , $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ t i t u l o P a r a U R L ’ ) , $ r e q u i s i ç ã o −>
obterVar iáve lDaURL ( ’ a r q u i v o ’ ) ) ;
header ( ’HTTP / 1 . 1 200 OK’ ) ;
header ( ’ Conten t−t y p e : ’ . $ a p r e s e n t a ç ã o −>
obterMimeTypeDoArquivo ( ) ) ;
header ( ’ Conten 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 ;
d i e ( ) ;
}
}
?>
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 Savan t3
∗ /
p u b l i c f u n c t i o n o b t e r R e p r e s e n t a ç ã o ( R e q u i s i c a o $ r e q u i s i ç ã o ) {
$p ed iu = $ r e q u i s i ç ã o −>obterParâmetroDaURL ( ’ a u t e n t i c a r
’ ) == " v e r d a d e i r o " ;
$ c o n f i g u r a ç õ e s [ ’ p l u g i n _ c o n f ’ ] [ ’ u r l ’ ] [ ’ e s t á A u t e n t i c a d o
’ ] = $ pe d i u ;
$ 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 −>
obterNomeDeUsuár io ( ) ) ;
$ 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 " , $ pe d iu ) ;
$ 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 " , array ( ) ) ;
r e t u r n $ t e m p l a t e ;
}
/ / TODO: t e n t a r e x t r a i r para um proxy
p u b l i c f u n c t i o n t r a t a r R e q u i s i ç ã o ( R e q u i s i c a o $ r e q u i s i ç ã o ) {
$ano taçõesMétodo = 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 −>obte rMétodo ( ) ) ;
$ 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 −>
obterParâmetroDaURL ( ’ a u t e n t i c a r ’ ) == " v e r d a d e i r o " ;
i f ( $anotaçõesMétodo−>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 B a s i c a ’ ) | | ( $ano taçõesMétodo−>
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 ’ ) &&
$ p e d i u P a r a A u t e n t i c a r ) ) {
i f ( $anotaçõesMétodo−>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 B a s i c a ’ ) )
$ p a p é i s P e r m i t i d o s = $anotaçõesMétodo
−>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 ;
e l s e
$ p a p é i s P e r m i t i d o s = $anotaçõesMétodo
−>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 ( ! i s _ a r r a y ( $ p a p é i s P e r m i t i d o s ) )
$ p a p é i s P e r m i t i d o s = array (
$ p a p é i s P e r m i t i d o s ?
$ p a p é i s P e r m i t i d o s : U s u a r i o : :
o b t e r P a p e l B á s i c o ( ) ) ;
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 ( ) | | !
U s u a r i o s : : s ã o C r e d e n c i a i s V á l i d a s (
$ r e q u i s i ç ã o −>obterNomeDeUsuár io ( ) ,
$ r e q u i s i ç ã o −>o b t e r S e n h a ( ) ,
$ p a p é i s P e r m i t i d o s ) ) {
$ t h i s −>nega rAces so ( $ r e q u i s i ç ã o ) ;
}
i f ( ! i s s e t ( $ p e d i u P a r a A u t e n t i c a r ) ) {
/ / header ( ’ L o c a t i o n : ’ . $ r e q u i s i ç ã o−>
obterURLCompleta ( ) . "? a u t e n t i c a r =
v e r d a d e i r o " ) ;
}
}
e l s e i f ( $ p e d i u P a r a A u t e n t i c a r ) {
i f ( ! $ r e q u i s i ç ã o −>t e m C r e d e n c i a i s ( ) | | !
U s u a r i o s : : s ã o C r e d e n c i a i s V á l i d a s (
$ r e q u i s i ç ã o −>obterNomeDeUsuár io ( ) ,
$ r e q u i s i ç ã o −>o b t e r S e n h a ( ) , array ( U s u a r i o : :
o b t e r P a p e l B á s i c o ( ) ) ) ) {
$ t h i s −>nega rAces so ( $ r e q u i s i ç ã o ) ;
}
}
$métodoAExecutar = $ r e q u i s i ç ã o −>obte rMétodo ( ) ;
$ t h i s −>$métodoAExecutar ( $ r e q u i s i ç ã o ) ;
}
p r i v a t e f u n c t i o n env ia rCabeça lhosDeAcessoNegado ( ) {
header ( "HTTP / 1 . 1 401 UNAUTHORIZED" ) ;
header ( "WWW−A u t h e n t i c a t e : B a s i c rea lm = \ " " .
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 ( )
p u b l i c f u n c t i o n nega rAces so ( R e q u i s i c a o $ r e q u i s i ç ã o ) {
206
$ t h i s −>env ia rCabeça lhosDeAcessoNegado ( ) ;
$ c o n f i g u r a ç õ e s [ ’ p l u g i n _ c o n f ’ ] [ ’ u r l ’ ] [ ’ e s t á A u t e n t i c a d o
’ ] = f a l s e ;
$ 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 rue ) ;
$ 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>Acesso negado </B>: A c o n t a e a senha
i n f o r m a d a não conferem . < / h3>" ) ;
$ t e m p l a t e−>a s s i g n ( " t i t u l o " , " Acesso negado " ) ;
$ 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 ( ) ;
d i e ( ) ;
}
}
?>
Listagem B.47: Arquivo: RecursoUsuarios.inc.php
<?php
c l a s s R e c u r s o U s u a r i o s e x t e n d s 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 / Colecao . t p l . php " )
;
207
}
}
?>
Listagem B.48: Arquivo: RecursoUmParticipante.inc.php
<?php
c l a s s R e c u r s o U m P a r t i c i p a n t e e x t e n d s 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 r i v a t e f u n c t i o n 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 c a o
$ r e q u i s i ç ã o ) {
i f ( ! U s u a r i o s : : e x i s t e C o m E s t e 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 −>obterVar iáve lDaURL ( ’ 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
−>obterVar iáve lDaURL ( ’ nomeParaURL ’ ) ) ) {
header ( ’HTTP / 1 . 1 404 Resource Not Found ’ ) ;
echo " Não e n c o n t r a d o " ;
d i e ( ) ;
}
}
/∗ ∗∗ @Auten t i cacaoBas i ca
∗ /
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 −>obterNomeDeUsuár io ( ) != $ r e q u i s i ç ã o
−>obterVar iáve lDaURL ( ’ 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 " Não a u t o r i z a d o " ;
d i e ( ) ;
}
208
$ u s u á r i o = 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 −>obterVar iáve lDaURL ( ’ 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 −>obterVar iáve lDaURL ( ’ 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 ;
t r y {
$ p a r t i c i p a n t e −>save ( ) ;
$ 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 " , " 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−>
t i t u l o ) ;
$ 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 você é 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 En l ac 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 " ) ;
/ / TODO: e x t r a i r URL
$ e n l a c e s [ ] = new En l ac 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 = v e r d a d e i r o "
, " P u b l i c a r uma a p r e s e n t a ç ã o n e s t e
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 ) ;
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 " ) ;
} c a t c h ( E x c e p t i o n $exceção ) {
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 " Er ro i n t e r n o " . $exceção ;
d i e ( ) ;
}
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 ) ;
$ u s u á r i o = 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 −>obterVar iáve lDaURL ( ’ 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 −>obterVar iáve lDaURL ( ’ nomeParaURL ’ ) ) ;
i f ( ! P a r t i c i p a n t e s : : e x i s t e ( $ u s u á r i o , $ s e m i n á r i o ) ) {
header ( ’HTTP / 1 . 1 404 Resource Not Found ’ ) ;
echo " Não e n c o n t r a d o " ;
d i e ( ) ;
}
$ 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 : :
o b t e r P o r U s u á r i o E S e m i n á r i o ( $ u s u á r i o , $ s e m i n á r 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 ( " 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 ) ;
$ 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 R e c u r s o S e m i n a r i o e x t e n d s 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 −>obterVar iáve lDaURL ( ’
nomeParaURL ’ ) ;
i f ( ! S e m i n a r i o s : : existeComNomeParaURL ( $nomeParaURL ) ) {
header ( ’HTTP / 1 . 1 404 Resource n o t found ’ ) ;
i n c l u d e _ o n c e ’ r e p r e s e n t a c o e s / 4 0 4 . h tml ’ ;
d i e ( ) ;
}
S e m i n a r i o s : : obterPorNomeParaURL ( $nomeParaURL )−> d e l e t e
( ) ;
header ( ’HTTP / 1 . 1 200 OK’ ) ;
}
/∗ ∗∗ @ A u t e n t i c a c a o C o n d i c i o n a l
∗ /
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 −>obterVar iáve lDaURL ( "
nomeParaURL " ) ;
i f ( ! S e m i n a r i o s : : existeComNomeParaURL ( $nomeParaURL ) ) {
header ( ’HTTP / 1 . 1 404 Resource n o t found ’ ) ;
i n c l u d e _ o n c e ’ r e p r e s e n t a c o e s / 4 0 4 . h tml ’ ;
d i e ( ) ;
}
$ 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
’ ) ) {
$ u s u á r i o = 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 −>
obterNomeDeUsuár io ( ) ) ;
$ 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 rue ) ;
211
i f ( U s u a r i o s : : e x i s t e C o m E s t e 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 −>obterNomeDeUsuár io ( ) ) )
$ 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 ( " URLDeSubmissão " ,
$ 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 . " ?
a u t e n t i c a r = v e r d a d e i r o " ) ;
}
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 ( U s u a r i o s : : e x i s t e C o m E s t e 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 −>obterNomeDeUsuár io ( ) ) )
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
: : 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 −>obterNomeDeUsuár io ( ) )
) ) {
$ f o r m u l á r i o D e E n v i o D e A p r e s e n t a ç ã o
= new En la ce ( $ s e m i n á r i o−>
obterURL ( ) . " /
a p r e s e n t a c a o " , " P u b l i c a r
a p r e s e n t a ç ã o " ) ;
$ t e m p l a t e−>a s s i g n ( "
e n v i o D e A p r e s e n t a c a o " ,
$ f o r m u l á r i o D e E n v i o D e A p r e s e n t a ç ã o
) ;
}
}
$ 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: RecursoConfirmacaoDeCadastroDeUsuario.inc.php
<?php
c l a s s Recu r soConf i rmacaoDeCadas t roDeUsua r io e x t e n d s 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 −>obterVar iáve lDaURL ( "
c h a v e S e c r e t a " ) ;
i f ( ! C a d a s t r a m e n t o s : : 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 (
$ c h a v e S e c r e t a ) ) {
header ( ’HTTP / 1 . 1 404 Not Found ’ ) ;
echo " Recurso i n e x i s t e n t e " ;
d i 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 ( $ 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 " , " Conf i rmação de
C a d a s t r a m e n t o " ) ;
$ c a d a s t r o T e m p o r a r i o = C a d a s t r a m e n t o s : :
o b t e r P e l a 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 ( " 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_paraSubmissão " ,
$ 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 " ,
t rue ) ;
$ 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 /
Fo rmu la r ioDeConf i rmacaoDeCadas t ro . 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 Mensage i ro {
p r i v a t e $ c a r t e i r o ;
p r i v a t e $env i a rMensagens = t rue ;
/ / 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 Mensage i ro ( MensagemDeCor re ioE le t ron i co
$mensagem ) {
i f ( $ t h i s −>env ia rMensage ns ) {
$ 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 −>Host = " 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 = "
p u b l i c a d o r D e S e m i n a r i o s " ;
$ 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
. u f s c . b r " ;
$ 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 −>CharSe t = " u t f −8" ;
$ t h i s −> c a r t e i r o −>IsHTML ( t rue ) ;
$ 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 ( MensagemDeCor re ioE le t ron i co $mensagem
) {
$ t h i s −> c a r t e i r o −>AddAddress ( $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 −>S u b j e c t = $mensagem−>
o b t e r A s s u n t o ( ) ;
$mensagem = new MensagemHTML ( $mensagem ) ;
/ / TODO: não p ar ec e s e r o melhor l u g a r
$ t h i s −> c a r t e i r o −>Body = $mensagem−>
o b t e r C o n t e ú d o ( ) ;
i f ( ! $ t h i s −> c a r t e i r o −>Send ( ) )
throw new MensagemNaoPodeSerEnviada (
’ Erro , a mensagem não 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 ( ) . ’ p e l o
s e g u i n t e mot ivo : ’ . $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
c l a s s R e q u i s i c a o {
p r i v a t e $ u r l ;
p r i v a t e $método ;
p r i v a t e $con t eúdo ;
p r i v a t e $ r o t a ;
p u b l i c f u n c t i o n R e q u i s i c a o ( ) {
$ t h i s −> u r l = $ t h i s −>obterURLAtual ( ) ;
$ t h i s −>método = $ t h i s −>obterMétodoHTTP ( $_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 Arquivo ( $_FILES [ $nome ] [ ’ name ’ ] , $_FILES [
$nome ] [ ’ tmp_name ’ ] ) ;
}
p r i v a t e f u n c t i o n obterURLAtual ( ) {
r e t u r n u r l d e c o d e ( e r e g _ r e p l a c e ( " ^ " . D i s s e m i n a r i o : :
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 obterVar iáve lDaURL ( $nome ) {
r e t u r n $ t h i s −>r o t a −>obterVar iáve lDaURL ( $nome ) ;
}
p u b l i c f u n c t i o n o b t e r C o n t e ú d o ( ) {
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 ) ;
}
p u b l i c f u n c t i o n t e m C r e d e n c i a i s ( ) {
r e t u r n $_SERVER [ ’PHP_AUTH_USER ’ ] != n u l l && $_SERVER [
’PHP_AUTH_PW ’ ] != n u l l ;
216
}
/ / TODO: renomear
p u b l i c f u n c t i o n obterNomeDeUsuár io ( ) {
r e t u r n $_SERVER [ ’PHP_AUTH_USER ’ ] ;
}
p u b l i c f u n c t i o n o b t e r S e n h a ( ) {
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 ] ;
}
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 i s D e C o n s u l t a ( ) {
i f ( $ t h i s −>obte rMétodo ( ) == ’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 obterParâmetrosDaURL ( ) {
r e t u r n $_GET ;
}
p u b l i c f u n c t i o n obterParâmetroDaURL ( $nome ) {
r e t u r n $_GET [ $nome ] ;
}
p u b l i c f u n c t i o n l e r C o n t e ú d o ( ) {
$dados = fopen ( " php : / / i n p u t " , " r " ) ;
whi le ( $ b u f f e r = f read ( $dados , 10240) ) {
$con téudoL ido . = $ b u f f e r ;
}
f c l o s e ( $dados ) ;
unse t ( $ b u f f e r ) ;
r e t u r n $con t éudoL ido ;
217
}
p u b l i c f u n c t i o n ob te rMétodo ( ) {
r e t u r n $ t h i s −>método ;
}
p r i v a t e f u n c t i o n obterMétodoHTTP ( $método ) {
i f ( $método == "POST" && ( $_POST [ " _method " ] | | $_GET [ "
_method " ] ) ) {
$método = s t r t o u p p e r ( $_POST [ " _method " ] ) ;
i f ( ! i s s e t ( $_POST [ " _method " ] ) )
$método = s t r t o u p p e r ( $_GET [ " _method "
] ) ;
i f ( $método == "GET" ) {
$_GET = $_POST ;
unse t ( $_POST ) ;
}
unse t ( $_POST [ ’ _method ’ ] ) ;
}
r e t u r n $método ;
}
p u b l i c f u n c t i o n ob t e rDadosDoFormu lá r io ( ) {
i f ( $ t h i s −>método == "POST" )
r e t u r n $_POST ;
e l s e i f ( $ t h i s −>método == "PUT" ) {
$dadosDoFormulá r io = 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 ( ) ,
$dadosDoFormulá r io ) ;
r e t u r n $dadosDoFormulá r io ;
}
}
p u b l i c f u n c t i o n é A u t e n t i c a d a ( ) {
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 " ;
218
}
}
?>
Listagem B.54: Arquivo: ArquivoDeConteudo.inc.php
<?php
c l a s s ArquivoDeConteudo {
p r i v a t e $con t eúdo ;
p r i v a t e $nome ;
p u b l i c f u n c t i o n ArquivoDeConteudo ( $nome , $con t eúdo ) {
$ t h i s −>nome = $nome ;
$ t h i s −>c o n t e ú d o = &$con teúdo ;
}
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 ;
}
p u b l i c f u n c t i o n o b t e r C o n t e ú d o ( ) {
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 $con t eúdo ;
p r i v a t e $nome ;
p u b l i c f u n c t i o n Arquivo ( $nome , $caminho ) {
i f ( ! f i l e _ e x i s t s ( $caminho ) )
throw new E x c e p t i o n ( " Arquivo não 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 ;
}
p u b l i c f u n c t i o n o b t e r C o n t e ú d o ( ) {
$ p o n t e i r o P a r a A r q u i v o = fopen ( $ t h i s −>caminho , ’ r ’ ) ;
$con teúdo = f read ( $ p o n t e i r o P a r a A r q u i v o , f i l e s i z e (
$ t h i s −>caminho ) ) ;
f c l o s e ( $ p o n t e i r o P a r a A r q u i v o ) ;
r e t u r n $con teúdo ;
}
p u b l i c f u n c t i o n f i x a r C o n t e ú d o ( $con teudo ) {
$ p o n t e i r o P a r a A r q u i v o = fopen ( $ t h i s −>caminho , ’w’ ) ;
f w r i t e ( $ p o n t e i r o P a r a A r q u i v o , $con teudo ) ;
f c l o s e ( $ p o n t e i r o P a r a A r q u i v o ) ;
}
p u b l i c f u n c t i o n a p a g a r ( ) {
u n l i n k ( $ t h i s −>caminho ) ;
}
}
?>
Listagem B.56: Arquivo: AutenticacaoBasica.inc.php
<?php
c l a s s A u t e n t i c a c a o B a s i c a e x t e n d s A n n o t a t i o n {
}
?>
Listagem B.57: Arquivo: AutenticacaoCondicional.inc.php
<?php
c l a s s A u t e n t i c a c a o C o n d i c i o n a l e x t e n d s A n n o t a t i o n {
220
}
?>
Listagem B.58: Arquivo: Roteador.inc.php
<?php
c l a s s R o t e a d o r {
p r i v a t e $ r e q u i s i ç ã o ;
p r i v a t e $ r o t a s ;
p u b l i c f u n c t i o n R o t e a d o r ( R e q u i s i c a o $ 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 ;
}
p u b l i c f u n c t i o n r o t e a r ( ) {
$ 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 (
$ r o t a s P o s s í v e i s [ 0 ] ) ;
}
e l s e {
header ( ’HTTP / 1 . 1 404 Resource n o t found ’ ) ;
i n c l u d e _ o n c e ’ r e p r e s e n t a c o e s / 4 0 4 . h tml ’ ;
d i e ( ) ;
}
}
p u b l i c f u n c t i o n i n c l u i r R o t a ( $ r o t a ) {
$ t h i s −> r o t a s [ ] = $ r o t a ;
}
p r i v a t e f u n c t i o n o b t e r R o t a s P o s s í v e i s ( ) {
$ r o t a s = array ( ) ;
foreach ( $ 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 ;
}
r e t u r n $ r o t a s ;
221
}
}
?>
Listagem B.59: Arquivo: Rota.inc.php
<?php
c l a s s Rota {
p r i v a t e $padrãoComple to ;
p r i v a t e $pad rão ;
p r i v a t e $ r e c u r s o ;
p r i v a t e $var iáveisDaURL ;
p r i v a t e $ r e q u i s i ç ã o ;
c o n s t d e l i m i t a d o r e s D e V a r i á v e i s = " [ / ; , ] " ;
p u b l i c f u n c t i o n Rota ( $padrão , $ r e c u r s o ) {
$ t h i s −>padrãoComple to = $pad rão ;
$ t h i s −>p ad r ão = " ^ " . e r e g _ r e p l a c e ( " { [ ^ / ; , ] + } " , "
( [ ^ / ; , ] + ) " , $pad rão ) . " ( / ) ? ( \ ? . + ) ? $ " ;
$ t h i s −>r e c u r s o = $ r e c u r s o ;
}
p u b l i c f u n c t i o n c a s a r ( R e q u i s i c a o $ r e q u i s i ç ã o ) {
r e t u r n ereg ( $ t h i s −>padrã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 ob te rVar iáve i sDaURL ( ) {
$ v a r i á v e i s = array ( ) ;
$padrãoEmPedaços = 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 −>padrãoComple to ) ;
$ u r l S e m V a r i á v e i s D e C o n s u l t a = a r r a y _ s l i c e ( s p l i t ( ’ \ ? ’ ,
$ t h i s −>r e q u i s i ç ã o −>obterURL ( ) ) , 0 , 1 ) ;
$ur lEmPedaços = 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 ,
$ u r l S e m V a r i á v e i s D e C o n s u l t a [ 0 ] ) ;
$pedaçosCombinados = a r r a y _ c o m b i n e ( $padrãoEmPedaços ,
a r r a y _ s l i c e ( $ur lEmPedaços , 0 , s i z e o f (
$padrãoEmPedaços ) ) ) ;
222
foreach ( $pedaçosCombinados as $pedaçoDoPadrão =>
$pedaçoDaUrl )
i f ( $pedaçoDoPadrão != $pedaçoDaUrl )
$ v a r i á v e i s [ tr im ( $pedaçoDoPadrão , " {} "
) ] = $pedaçoDaUrl ;
r e t u r n $ v a r i á v e i s ;
}
p u b l i c f u n c t i o n obterVar iáve lDaURL ( $nome ) {
r e t u r n $ t h i s −>var iáveisDaURL [ $nome ] ;
}
/∗∗ r e t u r n Recurso
∗ /
p u b l i c f u n c t i o n o b t e r R e c u r s o ( R e q u i s i c a o $ 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 ;
$ t h i s −>var iáveisDaURL = $ t h i s −>obte rVar iáve i sDaURL ( ) ;
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 Rota ( " / " , " R e c u r s o S e m i n a r i o s " ) ) ;
/ / TODO: renomear
$ r o t e a d o r −> i n c l u i r R o t a ( new Rota ( " / c a d a s t r a m e n t o / f i n a l i z a c a o / {
c h a v e S e c r e t a } " , " Recu r soConf i rmacaoDeCadas t roDeUsua r io " ) ) ;
223
$ r o t e a d o r −> i n c l u i r R o t a ( new Rota ( " / c a d a s t r a m e n t o " , "
R e c u r s o C a d a s t r o D e U s u a r i o " ) ) ;
$ r o t e a d o r −> i n c l u i r R o t a ( new Rota ( " / 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 } " ,
" R e c u r s o C a d a s t r a m e n t o " ) ) ;
$ r o t e a d o r −> i n c l u i r R o t a ( new Rota ( " / p r o p o s t a D e S e m i n a r i o " , "
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 " ) ) ;
$ r o t e a d o r −> i n c l u i r R o t a ( new Rota ( " / p r o p o s t a s D e S e m i n a r i o " , "
R e c u r s o P r o p o s t a s D e 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 Rota ( " / p r o p o s t a D e S e m i n a r i o / { c od ig o } " , "
RecursoUmaPropos taDeSeminar io " ) ) ;
$ r o t e a d o r −> i n c l u i r R o t a ( new Rota ( " / 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 Rota ( " / 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 } " ,
" R e c u r s o A d m i n i s t r a d o r " ) ) ;
$ r o t e a d o r −> i n c l u i r R o t a ( new Rota ( " / a d m i n i s t r a d o r e s " , "
R e c u r s o A d m i n i s t r a d o r e s " ) ) ;
$ r o t e a d o r −> i n c l u i r R o t a ( new Rota ( " / 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 } " , "
Recur soCoordenador " ) ) ;
$ r o t e a d o r −> i n c l u i r R o t a ( new Rota ( " / c o o r d e n a d o r e s " , "
R e c u r s o C o o r d e n a d o r e s " ) ) ;
$ r o t e a d o r −> i n c l u i r R o t a ( new Rota ( " / u s u a r i o / { c o r r e i o E l e t r o n i c o } " , "
R e c u r s o U s u a r i o " ) ) ;
$ r o t e a d o r −> i n c l u i r R o t a ( new Rota ( " / 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 problema 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 Rota ( " / { 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 Rota ( " / { nomeParaURL } / 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 } " , " R e c u r s o U m P a r t i c i p a n t e " ) ) ;
$ r o t e a d o r −> i n c l u i r R o t a ( new Rota ( " / { nomeParaURL } / p a r t i c i p a n t e s " , "
R e c u r s o P a r t i c i p a n t e s " ) ) ;
$ r o t e a d o r −> i n c l u i r R o t a ( new Rota ( " / { nomeParaURL } / a p r e s e n t a c a o " , "
R e c u r s o A p r e s e n t a c a o " ) ) ;
$ r o t e a d o r −> i n c l u i r R o t a ( new Rota ( " / { nomeParaURL } / a p r e s e n t a c a o / {
t i t u l o P a r a U R L } " , " RecursoUmaApresentacao " ) ) ;
$ r o t e a d o r −> i n c l u i r R o t a ( new Rota ( " / { nomeParaURL } / a p r e s e n t a c a o / {
t i t u l o P a r a U R L } / { 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 Rota ( " / { nomeParaURL } / a p r e s e n t a c o e s " , "
R e c u r s o A p r e s e n t a c o e s " ) ) ;
$ 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 t y p e =" t e x t / j a v a s c r i p t ">
f u n c t i o n e n v i a r ( ) {
document . forms . 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 echo
$ t h i s −>URL_paraSubmissão ; ?> ’ ;
r e t u r n t rue ;
}
</ 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 : < / dt ><dd><a c l a s s ="
URLDoProponente " h r e f =" <?php echo $ t h i s −>p r o p o s t a −>
Proponen te−>obterURL ( ) ; ?> " ><?php echo $ t h i s −>p r o p o s t a −>
Proponen te−>nome ? > </ a > </ dd>
< d t c l a s s =" rama l ">Ramal : < / dt > <dd ><?php echo $ t h i s −>p r o p o s t a
−>ramalUFSC ; ? > </ dd>
< d t c l a s s =" dataDeTermino ">Data de Término : < / dt > <dd ><?php
$dataDeTermino = new Data ( $ t h i s −>p r o p o s t a −>
dataDeTermino ) ;
echo $dataDeTermino−>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 ">Data de I n í c i o : < / dt > <dd ><?php
$ d a t a D e I n i c i o = new Data ( $ t h i s −>p r o p o s t a −>
d a t a D e I n i c i o ) ;
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 : < / dt > <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 : < / dt > <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 : < / dt > <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 : < / dt > <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 : < / dt > <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 : < / dt > <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 "> Es t ad o : < / dt > <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 " onsubmi t ="
r e t u r n e n v i a r ( ) " >
< i n p u t name=" _method " t y p e =" h id de 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 id de 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 ubm i t " v a l u e =" Aprovar " / >
</ form >
<?php e n d i f ; ?>
Listagem B.62: Arquivo: Enlace.inc.php
<?php
c l a s s En la c e {
p r i v a t e $URL ;
p r i v a t e $ t e x t o ;
p u b l i c f u n c t i o n En la ce ($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;
}
p u b l i c f u n c t i o n o b t e r T e x t o ( ) {
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 t y p e =" t e x t / j a v a s c r i p t ">
226
/ / TODO: e x t r a i r
f u n c t i o n c a p i t a l i z a r ( t e x t o ) {
v a r t e x t o Q u e b r a d o = t e x t o . s p l i t ( ’ ’ ) ;
v a r 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 ha rA t ( 0 ) . toUpperCase
( ) + t e x t o Q u e b r a d o [ i ] . s u b s t r i n g ( 1 ) ;
}
r e t u r n t e x t o F i n a l ;
}
f u n c t i o n removerAcen tos ( t e x t o ) {
v a r Acen tos = " áàãââÁÀÃÂéêèÉÊíÍóõôÓÔÕúüùÚÜçÇ " ;
v a r Traducao = " aaaaaAAAAeeèEEiIoooOOOuuuUUcC " ;
v a r Pos ic , 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 . c ha r At ( i ) ;
P o s i c = Acentos . indexOf ( Carac ) ;
i f ( P o s i c > −1)
TempLog += Traducao . ch a r A t ( P o s i c ) ;
e l s e
TempLog += t e x t o . ch 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 . ge tE lemen tById ( ’
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 ;
umTexto = removerAcen tos ( 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 ( / [ ^ a−zA−Z0−9]+/
g , ’ ’ ) ;
document . ge tE lemen tById ( ’ t i t u l o ’ ) . v a l u e =
nomeNormalizado ;
227
document . ge tE lemen tById ( ’ nomeParaURLVisivel ’ ) . v a l u e =
’ <?php echo $ 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 ;
}
f u n c t i o n c o r r i g i r A c t i o n ( ) {
v a r e r r o s = new Array ( ) ;
i f ( document . ge tE lemen tById ( ’ 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 . push ( ’ Você deve f o r n e c e r um t í t u l o ’ ) ;
}
i f ( document . ge tE lemen tById ( ’ a r q u i v o ’ ) . v a l u e == ’ ’ ) {
e r r o s . push ( ’ Você deve f o r n e c e r um a r q u i v o ’ ) ;
}
e l s e {
i f ( ! v a l i d a r A r q u i v o ( document . ge tE lemen tById ( ’ a r q u i v o ’
) ) ) {
e r r o s . push ( ’O a r q u i v o deve s e r . ppt , . odp ou
. pdf ’ ) ;
}
}
i f ( e r r o s . l e n g t h > 0) {
v a r e r r o s C o n c a t e n a d o s = ’ ’ ;
f o r ( v a r e r r o i n e r r o s ) {
e r r o s C o n c a t e n a d o s = e r r o s C o n c a t e n a d o s + ’ ’ +
e r r o s [ e r r o ] + ’ \ n ’ ;
}
a l e r t ( e r r o s C o n c a t e n a d o s ) ;
r e t u r n f a l s e
}
document . forms . 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
echo $ t h i s −>URL_paraSubmissão ; ?> ’ + ’ / ’ + document .
ge tE lemen tById ( ’ 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 t rue ;
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 ) | ( pdf ) | ( doc ) $ / . t e s t ( campo . v a l u e .
toLowerCase ( ) ) )
r e t u r n t rue ;
campo . f o c u s ( ) ;
r e t u r n f a l s e ;
}
</ s c r i p t >
< s t y l e t y p e =" t e x t / c s s ">
. d e s a b i l i t a d a { background−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
s e m i n á r i o " ) ; ?>
<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 echo
$ t h i s −>URL_paraSubmissão ; ?> " e n c t y p e =" m u l t i p a r t / form−d a t a
" onSubmit=" 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 " onchange="
fazerSuges taoDeURL ( ) " onkeyup=" fazerSuges taoDeURL ( ) " / >
</p>
< i n p u t t y p e =" h id de 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 : < br / > < 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 =" nomeParaURLVisivel " name="
nomeParaURLVisivel " s i z e =" 100 " d i s a b l e d =" d i s a b l e d " / >
</p>
<p> Arquivo :
< 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 deve s e r . ppt , . odp ou . pdf e t e r no
máximo 2 MB de tamanho . </ h4>
< i n p u t t y p e =" h id de 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 ubm 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 ( ) , "
V o l t a r p a r a 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</ dt > <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 "> Endereço de C o r r e i o E l e t r ô n i c o
< / dt > <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 =" c a d a s t r o T e m p o r a r i o D e U s u a r i o ">
< d t c l a s s =" c o r r e i o E l e t r o n i c o "> Endereço de C o r r e i o E l e t r ô n i c o
< / dt > <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 < / dt > <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: FormularioDeConfirmacaoDeCadastro.tpl.php
< s c r i p t s r c =" <?php echo D i s s e m i n a r i o : : obterURL_BaseCompleta ( ) . " / "
?> 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 t y p e =" t e x t / j a v a s c r i p t ">
f u n c t i o n s e n h a C o n f e r e ( ) {
r e t u r n document . ge tE lemen tById ( ’ senha ’ ) . v a l u e ==
document . ge tE lemen tById ( ’ senhaConf i rmacao ’ ) . 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 . ge tE lemen tById ( 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
f u n c t i o n f o r m u l á r i o É V á l i d o ( ) {
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 ’ ) ;
r e t u r n f a l s e ;
}
i f ( ! e s t á P r e e n c h i d o ( ’ senha ’ ) | | ! e s t á P r e e n c h i d o ( ’
s enhaConf i rmacao ’ ) ) {
a l e r t ( ’A senha e a c o n f i r m a ç ã o são
o b r i g a t ó r i a s ’ ) ;
r e t u r n f a l s e ;
}
i f ( ! s e n h a C o n f e r e ( ) ) {
a l e r t ( ’ Senha e a c o n f i r m a ç ã o não conferem ’ ) ;
r e t u r n f a l s e ;
}
r e t u r n t rue ;
}
f u n c t i o n e n v i a r F o r m u l a r i o ( ) {
v a r t r a n s p o r t = (
new Ajax . Reques t (
’ <?php echo $ t h i s −>URL_paraSubmissão ; ?> ’ , {
method : ’ p u t ’ ,
pos tBody : $ ( ’
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 ’ ) .
s e r i a l i z e ( ) ,
a s y n c h r o n o u s : f a l s e ,
}
)
) . t r a n s p o r t ;
231
a u t e n t i c a r ( ) ;
}
f u n c t i o n a u t e n t i c a r ( ) {
v a r t r a n s p o r t = (
new Ajax . Reques t (
’ <?php echo $ t h i s −>URL_paraSubmissão ; ?> ’ , {
method : ’ p u t ’ ,
pos tBody : $ ( ’ 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 ’ ) .
s e r i a l i z e ( ) ,
a s y n c h r o n o u s : f a l s e ,
h t tpUserName : $ ( ’ c o r r e i o E l e t r o n i c o ’ ) ,
h t t p P a s s w o r d : $ ( ’ senha ’ )
}
)
) . t r a n s p o r t ;
}
</ 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 os s e m i n á r i o s " ,
" r a i z " ) ; ?>
<h2> F i n a l i z a ç ã o de Cadas t r amen to < / 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
echo $ t h i s −>URL_paraSubmissão ; ?> " onsubmi 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 dados e c l i q u e em ’ F i n a l i z a r
C a d a s t r a m e n t o ’ , p a r a f i n a l i z a r o c a d a s t r a m e n t o . < b r / > < br
/ >
< t a b l e >
< t r >
<td >Nome : </ td > <td >< i n p u t i d =" nome " name=" nome " t y p e =" t e x t "
v a l u e =" " / > </ td >
</ t r >
< t r >
<td >Senha : </ td >< td >< i n p u t i d =" senha " name=" senha " t y p e ="
password " v a l u e =" " / > </ td >
</ t r >
< t r >
232
<td > Conf i rmação da senha : </ td >< td >< i n p u t i d ="
senhaConf i rmacao " name=" senhaConf i rmacao " t y p e =" password "
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 id de 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 dde n " v a l u e =" <?php
echo $ 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 id de n " v a l u e =" <?php echo
$ 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 Cadas t r amen to < / b u t t o n >
</ form >
Listagem B.67: Arquivo: FormularioPropostaDeSeminario.tpl.php
< s c r i p t t y p e =" t e x t / j a v a s c r i p t ">
f u n c t i o n c a p i t a l i z a r ( t e x t o ) {
v a r t e x t o Q u e b r a d o = t e x t o . s p l i t ( ’ ’ ) ;
v a r 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 ha rA t ( 0 ) . toUpperCase
( ) + t e x t o Q u e b r a d o [ i ] . s u b s t r i n g ( 1 ) ;
}
r e t u r n t e x t o F i n a l ;
}
f u n c t i o n removerAcen tos ( t e x t o ) {
v a r Acen tos = " áàãââÁÀÃÂéêèÉÊíÍóõôÓÔÕúüùÚÜçÇ " ;
v a r Traducao = " aaaaaAAAAeeèEEiIoooOOOuuuUUcC " ;
v a r Pos ic , 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 . c ha r At ( i ) ;
P o s i c = Acentos . indexOf ( Carac ) ;
i f ( P o s i c > −1)
TempLog += Traducao . ch a r A t ( P o s i c ) ;
233
e l s e
TempLog += t e x t o . ch 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 t rue ;
}
r e t u r n f a l s e ;
}
/ / TODO: e x t r a i r v a l i d a ç ã o
f u n c t i o n e n v i a r ( ) {
v a r e r r o s = new Array ( ) ;
i f ( document . ge tE lemen tById ( ’ 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 . ge tE lemen tById ( ’ ramalUFSC ’ ) . v a l u e == ’ ’ )
e r r o s . push ( ’ Seu número de rama l é o b r i g a t ó r i o ’ ) ;
i f ( document . ge tE lemen tById ( ’ d a t a D e I n i c i o ’ ) . v a l u e == ’ ’ | |
document . ge tE lemen tById ( ’ da taDeTermino ’ ) . v a l u e == ’ ’ ) {
e r r o s . push ( ’ 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 ’ ) ;
}
e l s e {
i f ( ! v a l i d a r D a t a ( document . ge tE lemen tById ( ’ d a t a D e I n i c i o
’ ) ) | | ! document . ge tE lemen tById ( ’ da taDeTermino ’ ) )
e r r o s . push ( ’ P e r í o d o deve c o n t e r d a t a s no
f o r m a t o dd /mm/ aaaa ’ ) ;
}
i f ( e r r o s . l e n g t h > 0) {
v a r e r r o s C o n c a t e n a d o s = ’ ’ ;
f o r ( v a r e r r o i n e r r o s ) {
234
e r r o s C o n c a t e n a d o s = e r r o s C o n c a t e n a d o s + ’ ’ +
e r r o s [ e r r o ] + ’ \ n ’ ;
}
a l e r t ( e r r o s C o n c a t e n a d o s ) ;
r e t u r n f a l s e
}
r e t u r n t rue ;
}
f u n c t i o n fazerSugestaoDeURL ( ) {
v a r umTexto = document . ge tE lemen tById ( ’ t i t u l o ’ ) . v a l u e ;
umTexto = removerAcen tos ( umTexto ) ;
umTexto = c a p i t a l i z a r ( umTexto ) ;
v a r nomeDoSeminar ioNormal izado = umTexto . r e p l a c e ( / [ ^ a−zA−Z0
−9]+/g , ’ ’ ) ;
document . ge tE lemen tById ( ’ nomeParaURL ’ ) . v a l u e =
nomeDoSeminar ioNormal izado ;
document . ge tE lemen tById ( ’ nomeParaURLVisivel ’ ) . 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
/ " ; ?> ’ + nomeDoSeminar ioNormal izado ;
}
</ 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 os
s e m i n á r i o s " , " r a i z " ) ; ?>
<h2> P r o p o s t a de Seminár io < / 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 echo $ t h i s −>
URL_paraSubmissão ; ?> " method=" p o s t " onsubmi 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 "
onchange=" fazerSuges taoDeURL ( ) " onkeyup="
fazerSuges taoDeURL ( ) " / >
<p>Seu s e m i n á r i o po de 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 =" nomeParaURLVisivel " 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 id de 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>Tipo 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 v a l u e =" p u b l i c a "> P ú b l i c a < / o p t i o n >
< o p t i o n s e l e c t e d =" s e l e c t e d " v a l u e =" c o n v i d a d o s ">
Somente p a r a Convidados < / o p t i o n >
</ s e l e c t >
</p>
<p>
A s s i s t ê n c i a :
< 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 v a l u e =" p u b l i c a "> P ú b l i c a < / o p t i o n >
< o p t i o n s e l e c t e d =" s e l e c t e d " v a l u e =" 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 < /
o p t i o n >
</ 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 i d =" d i s p o n i b i l i d a d e ">
< o p t i o n v a l u e =" p u b l i c a "> P ú b l i c a < / o p t i o n >
< o p t i o n s e l e c t e d =" s e l e c t e d " v a l u e =" c o n v i d a d o 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 >
</ 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/ aaaa ) :
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=" dataDeTermino " i d =" dataDeTermino "
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 ubm i t " v a l u e =" Conf i rmar " / >
</ form >
< s c r i p t t y p e =" t e x t / j a v a s c r i p t ">
document . ge tE lemen tById ( ’ 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 os 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</ dt > <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 "> Endereço de C o r r e i o E l e t r ô n i c o
< / dt > <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 −>éCoordenador ( ) ) : ?>
< d t c l a s s =" ramalUFSC ">Ramal UFSC : </ dt > <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 −>Seminar io−>
obte rURLDeApresen tações ( ) , " 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 : < / dt ><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 ">Arquivo : < / dt ><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 ">Data : < / dt ><dd ><?php $d = new Data ( $ 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 =" ho ra ">Hora : < / dt ><dd ><?php echo $ t h i s −>a p r e s e n t a ç ã o
−>hora ; ? > </ 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 : < / dt ><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 −>Usuar io−>nome ) ? > </ dd>
</ dl >
Listagem B.70: Arquivo: TemplateXHTML.inc.php
<?php
c l a s s TemplateXHTML e x t e n d s Savan t3 {
p r i v a t e $ c a b e ç a l h o ;
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 ) {
p a r e n t : : _ _ c o n s t r u c t ( $ c o n f i g ) ;
$ t h i s −>c a b e ç a l h o = new Savan t3 ( $ c o n f i g ) ;
$ t h i s −>r od a pé = new Savan t3 ( $ c o n f i g ) ;
}
p u b l i c f u n c t i o n d i s p l a y ( $ t p l = n u l l )
{
$ 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 / Cabeca lho .
t p l . php " ) ;
p a r e n t : : d i s p l a y ( $ t p l ) ;
$ t h i s −>rodapé−> 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 " ) ;
}
p u b l i c f u n c t i o n a s s i g n ( ) {
$a = @func_ge t_arg ( 0 ) ;
$b = @func_ge t_arg ( 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 −>rodapé−>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 ) {
foreach ( $ t h i s −>e n l a c e s C a b e c a l h o as $ 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) . "< br / > " ;
}
echo "< br / > " ;
}
i f ( $ t h i s −>naoConverterParaHTML )
echo $ t h i s −>mensagem ;
e l s e
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 "< br / > " ;
foreach ( $ t h i s −>e n l a c e s as $ e n l a c e ) {
echo "< br / > " . $ 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 "< br / > " ;
}
?>
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 os s e m i n á r i o s " ) ;
?>
< dl c l a s s =" s e m i n a r i o ">
<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−>Coordenador−>
obterURL ( ) , $ t h i s −>s e m i n a r i o−>Coordenador−>nome , "
c o o r d e n a d o r " ) ; ?>
</ dd>
< d t c l a s s =" dataDeTermino ">Data de Término : < / dt > <dd ><?php
$dataDeTermino = new Data ( $ t h i s −>s e m i n a r i o−>
dataDeTermino ) ;
echo $dataDeTermino−>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 ">Data de I n í c i o : < / dt > <dd ><?php
$ d a t a D e I n i c i o = new Data ( $ t h i s −>s e m i n a r i o−>
d a t a D e I n i c i o ) ;
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 : < / dt > <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 : < / dt > <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 : < / dt > <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 : < / dt > <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 : < / dt > <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 : < / dt > <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 > < br / >
<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−>
obte rURLDeApresen tações ( ) , " 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 "< br / > " . $ t h i s −> u r l ( $ t h i s −>env ioDeApresen tacao
−>obterURL ( ) , $ t h i s −>env ioDeApresen tacao−>
o b t e r T e x t o ( ) , " e n l a c e " ) ;
?>
<?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 echo
$ t h i s −>URLDeSubmissão ; ?> " method=" p o s t ">
< i n p u t name=" _method " t y p e =" h id de 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 ubm 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 "< br / > " . " 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> p a r a
d e s a u t e n t i c a r . " ;
}
e l s e {
echo "< br / > < br / > Se você a i n d a não 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 ) . " p a r a se c a d a s t r a r . " ;
echo "< br / > Caso você 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 rue ) . "
p a r a se a u t e n t i c a r . " ;
}
}
?>
< s c r i p t t y p e =" t e x t / j a v a s c r i p t ">
241
i f ( t y p e o f ( document . forms [ 0 ] ) != ’ u n d e f i n e d ’ ) {
document . forms [ 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 os
s e m i n á r i o s " , " r a i z " ) ;
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 −>mensagemColeçãoVazia ) echo "< l i > <h3> " .
$ t h i s −>mensagemColeçãoVazia . " </ h3> </ l i >" ;
e l s e echo "< l i > <h3> Não e x i s t e m . </ h3> </ l i >" ;
}
e l s e {
foreach ( $ t h i s −>c o l e c a o as $ i t em ) {
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 ) ) {
$umParâmetro = $ t h i s −>
a t r i b u t o A M o s t r a r [ 0 ] ;
$ o u t r o P a r â m e t r o = $ t h i s −>
a t r i b u t o A M o s t r a r [ 1 ] ;
$ v i s u a l i z a ç ã o = $i tem−>$umParâmetro−>
$ o u t r o P a r â m e t r o ;
}
e l s e
242
$ v i s u a l i z a ç ã o = $ i t em [ $ t h i s −>
a t r i b u t o A M o s t r a r ] ;
$metodo = $ t h i s −>URLDeElemento ? $ t h i s −>
URLDeElemento : " obterURL " ;
echo "< l i >" ;
echo $ t h i s −> u r l ( $i tem−>$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 " </ ul >" ;
foreach ( $ t h i s −>e n l a c e s as $ 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) . "< br / > < br / > " ;
}
?>
Listagem B.75: Arquivo: Cabecalho.tpl.php
<!DOCTYPE html 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 . org / TR / xhtml1 /DTD/ xhtml1− t r a n s i t i o n a l . d t d ">
<html xmlns=" h t t p : / / www. w3 . org / 1 9 9 9 / xhtml " 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 =" Conten t−Type " c o n t e n t =" t e x t / h tml ; c h a r s e t =UTF−8" / >
< 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 " > </
s c r i p t >
< s c r i p t l a n g u a g e =" j a v a s c r i p t " t y p e =" t e x t / j a v a s c r i p t ">
f u n c t i o n d e s a u t e n t i c a r ( ) {
t r y {
v a r a g t = n a v i g a t o r . u s e r A g e n t . toLowerCase ( ) ;
i f ( a g t . indexOf ( " msie " ) != −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 " ) ;
}
e l s e {
243
v a r x m l h t t p = crea teXMLObject ( ) ;
x m l h t t p . open ( "GET" , " <?php echo 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 " ?> " ,
true , " l o g o u t " , " " ) ;
x m l h t t p . send ( " " ) ;
x m l h t t p . a b o r t ( ) ;
}
} c a t c h ( e ) {
a l e r t ( " E r ro ao d e s a u t e n t i c a r . " ) ;
}
}
f u n c t i o n crea teXMLObject ( ) {
t r y {
i f ( window . XMLHttpRequest ) {
x m l h t t p = new XMLHttpRequest ( ) ;
}
/ / code f o r IE
e l s e i f ( window . Ac t iveXObjec t ) {
x m l h t t p =new Act iveXObjec t ( " M i c r o s o f t .XMLHTTP"
) ;
}
} c a t c h ( e ) {
x m l h t t p = f a l s e
}
r e t u r n x m l h t t p ;
}
</ s c r i p t >
</ head >
<body >
Listagem B.76: Arquivo: FormularioDeCadastroDeUsuario.tpl.php
< s c r i p t t y p e =" t e x t / j a v a s c r i p t ">
f u n c t i o n e n v i a r ( ) {
document . forms . 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 echo
$ t h i s −>URL_paraSubmissão ; ?> ’ + ’ / ’ + document .
ge tE lemen tById ( ’ 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 ;
244
i f ( document . ge tE lemen tById ( ’ 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 ( ’ C o r r e i o e l e t r ô n i c o v a z i o ’ ) ;
r e t u r n f a l s e ;
}
r e t u r n t rue ;
}
</ 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 os 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 Usuár io < / h2>
Por f a v o r , e n t r e com 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 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 as 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 :
< b r / >
< 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 seu "
nome de u s u á r i o " quando você 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 "
onsubmi t =" r e t u r n e n v i a r ( ) " >
<p> Endereç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 " t y p e =" t e x t " v a l u e =" " / >
< i n p u t name=" b o t a o E n v i a r " t y p e =" s ubm 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 id de 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 : < / dt ><dd><a c l a s s ="
URLDoProponente " h r e f =" <?php echo $ t h i s −>p r o p o s t a −>
Proponen te−>obterURL ( ) ; ?> " ><?php echo $ t h i s −>p r o p o s t a −>
Proponen te−>nome ? > </ a > </ dd>
245
< d t c l a s s =" rama l ">Ramal : < / dt > <dd ><?php echo $ t h i s −>p r o p o s t a
−>ramalUFSC ; ? > </ dd>
< d t c l a s s =" dataDeTermino ">Data de Término : < / dt > <dd ><?php
$dataDeTermino = new Data ( $ t h i s −>p r o p o s t a −>
dataDeTermino ) ;
echo $dataDeTermino−>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 ">Data de I n í c i o : < / dt > <dd ><?php
$ d a t a D e I n i c i o = new Data ( $ t h i s −>p r o p o s t a −>
d a t a D e I n i c i o ) ;
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 : < / dt > <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 : < / dt > <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 : < / dt > <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 : < / dt > <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 : < / dt > <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 : < / dt > <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: configuracao.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 / migracao " ) ;
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 .
" / j s / p r o t o t y p e / p r o t o t y p e . j s " ) ;
/ / 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 / phpMai 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 / Savant3 −3 . 0 . 0 / Savan t3 . 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 ( ’ C a r r e g a me n t o D e Cl a s s e s ’ , ’ a u t o l o a d ’ ) ) ;
Doc t r ine_Manager : : 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 " , ’
d i s s e m i n a r i o ’ ) ;
Doc t r ine_Manager : : 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 ’ , ’
c o n s e r v a t i v e ’ ) ;
D o c t r i n e : : loadMode ls (CAMINHO_DO_MODELO_ORM) ;
c l a s s C a r r e g a m e n t oD e C l a s se s {
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 : : $cache == n u l l ) {
C a r r e g a m e n t oD e C l a s se s : : o b t e r A r q u i v o s ( dirname (
__FILE__ ) , s e l f : : $cache ) ;
}
i f ( ! i s _ n u l l ( s e l f : : $cache [ $nomeDaClasse . " . i n c . php " ] ) )
{
r e q u i r e _ o n c e s e l f : : $cache [ $nomeDaClasse . " . i n c
. php " ] ;
r e t u r n t rue ;
} e l s e
r e t u r n f a l s e ;
}
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 2 ( $c l a s s_name ) {
$ a r q u i v o ;
i f ( ! i s s e t ( s e l f : : $cache [ $c l a s s_name ] ) ) {
s e l f : : f i n d _ f i l e ( dirname ( __FILE__ ) ,
$c l a s s_name . " . i n c . php " , $ a r q u i v o ) ;
247
i f ( tr im ( $ a r q u i v o ) != " " ) {
s e l f : : co loca rNoCache ( $c lass_name ,
$ a r q u i v o ) ;
r e q u i r e _ o n c e $ a r q u i v o ;
r e t u r n t rue ;
} e l s e {
r e t u r n f a l s e ;
}
} e l s e {
r e q u i r e _ o n c e s e l f : : $cache [ $c l a s s_name ] ;
}
}
p r i v a t e s t a t i c f u n c t i o n co locarNoCache ( $nomeDaClasse ,
$ a r q u i v o ) {
i f ( ! i s s e t ( s e l f : : $cache [ $nomeDaClasse ] ) )
s e l f : : $cache [ $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 ( $pa th , $ p a t t e r n , &$xp to ) {
$ p a t h = rtr im ( s t r _ r e p l a c e ( " \ \ " , " / " , $ p a t h ) , ’ / ’ ) . ’ / ’ ;
$matches = Array ( ) ;
$ e n t r i e s = Array ( ) ;
$ d i r = d i r ( $ p a t h ) ;
whi le ( f a l s e !== ( $ e n t r y = $ d i r−>r e a d ( ) ) ) {
$ e n t r i e s [ ] = $ e n t r y ;
}
$ d i r−>c l o s e ( ) ;
foreach ( $ e n t r i e s a s $ e n t r y ) {
$ f u l l n a m e = $ p a t h . $ e n t r y ;
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 ( $ fu l l name , $ p a t t e r n , $xp to ) ;
} e l s e i f ( i s _ f i l e ( $ f u l l n a m e ) && ( ereg ( " / " . $ p a t t e r n ,
$ f u l l n a m e ) !== FALSE) ) {
$xp to = $ f u l l n a m e ;
}
248
}
}
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 A r q u i v o s ( $ d i r e t ó r i o D e I n í c i o , &
$ a r q u i v o s V i s i t a d o s ) {
$ d i r e t ó r i o = d i r ( $ d i r e t ó r i o D e I n í c i o ) ;
whi le ( ( $ 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 ( ) ) !==
f a l s e ) {
$ e n t r a d a s [ ] = $ 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 −>c l o s e ( ) ;
foreach ( $ e n t r a d a s as $ e n t r a d a D o D i r e t ó r i o ) {
i f ( i s _ d i r ( $ d i r e t ó r i o D e I n í c 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 != " . " &&
$ e n t r a d a D o D i r e t ó r i o != " . . " ) )
s e l f : : o b t e r A r q u i v o s (
$ d i r e t ó r i o D e I n í c i o . " / " .
$ e n t r a d a D o D i r e t ó r i o ,
$ a r q u i v o s V i s i t a d o s ) ;
e l s e i f ( i s _ f i l e ( $ d i r e t ó r i o D e I n í c i o . " / " .
$ e n t r a d a D o D i r e t ó r i o ) ) {
$ a r q u i v o s V i s i t a d o s [
$ 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 D e I n í c i o . " / " .
$ e n t r a d a D o D i r e t ó r i o ;
}
}
}
}
?>
249
ANEXO C -- Tipos de Representações
C.1 Codificação de Formulário
A codificação de formulário é a representação utilizada por navegadores quando é enviado
algum formulário para o servidor.
Exemplo: nome=Juca&[email protected]
C.2 JSON
O formato JSON (JavaScript Notation Object) é um padrão leve de troca de dados [19],
baseado em um sub-conjunto da definição de JavaScript [20]. Por isso, os navegadores tem
suporte nativo a este formato.
Como pode-se observar no exemplo abaixo, os dados são reprentados em pares de chave-
valor.
Exemplo:
{”nome”:”Juca”, ”correioEletronico”: ”[email protected]”}
C.3 XML
A linguagem XML é uma linguagem de marcação extensível e amplamente utilizada para
troca de dados na Web [6].
< u s u a r i o >
<nome> Juca < / nome>
< c o r r e i o E l e t r o n i c o >cocoBranco@inf . u f s c . b r < / c o r r e i o E l e t r o n i c o >
< / u s u a r i o >
250
C.4 XHTML com Marcações Descritivas
< u l c l a s s =" s e m i n a r i o s ">
< l i >
<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>
< / l i >
< l i >
<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 /
O u t r o S e m i n a r i o "
c l a s s =" s e m i n a r i o ">Outro S e m i n a r i o < / a>
< / l i >
< / u l >
Uma Aplicação da Arquitetura Orientada a Recursos
Erich D. Lunardeli Silvestre1, Pablo Valério Polônia1
1 Laboratório de Software Educacional (EDUGRAF) Departamento de Informática e Estatística – Universidade Federal de Santa Catarina (UFSC)
Campus Universitário Trindade Caixa Postal 476 CEP 88040900 Brazil
Abstract. A big effort has been done researching the subject of web services and most of the researches ignores completely the original proposed web architecture. We tried, in this work, bring an architectural style that was made up for distributed hipermedia systems back, REST, and study an web based architecture that follows this style, the ResourceOriented Architecture (ROA). With the goal of applying theses theories on the development of a seminars helping system, using BehaviourDriven Development. As result, a resource orientedseminar system has been built,the Disseminário seminar helping system.
Resumo. Muito esforço temse empregado em pesquisas sobre serviços web, e grande parte destas pesquisas ignora completamente o estilo de arquitetura proposta originalmente para a web. Buscouse com este trabalho, resgatar um estilo arquitetural desenvolvido para sistema distribuídos de hipermídia, REST,e estudar uma arquitetura voltada para a web que segue esse estilo, a Arquitetura Orientada a Recursos (ROA). Tendo como objetivo, o emprego destas teorias no desenvolvimento de uma aplicação de apoio a seminários com uso de Programação Orientada por Comportamento. Como resultado, criouse um sistema web orientado a recursos, o sistema Disseminário de apoio a seminários.
1. IntroduçãoGrande parte dos sistemas web projetados fazem uso de arquitetura orientada a serviços. Muitas vezes inapropriada, por se tratarem de uma maneira complexa de se modelar sistemas e que apresenta recursos avançados que são proveitosos apenas em contextos específicos.
Neste trabalho, fazse o uso da arquitetura orientada a recursos, que segue o estilo arquitetural REST e faz uso dos verbos HTTP, respeitando a semântica imposta a eles quando da sua definição. Buscase respeitar a proposta inicial da web e fazer um intensivo de hipermídia.Desenvolvese um sistema web orientado a recursos, utilizandose da metodologia proposta e de técnicas ágeis, como o desenvolvimento guiado por comportamento.
Dividiuse esta artigo em quatro seções, no primeira tratase sobre REST, os estilos do qual se derivou e seus elementos arquiteturais. Na segundo fazse uma explanação da Arquitetura Orientada a Recursos, seus conceitos, propriedade, na seguinte descrevese uma metodologia que serve para se projetar sistemas web orientados a recursos e programação guiada por comportamento. Na última, falase
sobre a implementação do sistema Disseminário. Ele é um sistema de apoio a seminários, que permite aos usuários criarem e participarem de seminários, divulgarem seus seminários e publicarem apresentações, elaborado como um exemplo de sistema que respeita a teoria estudada.
2. RESTREST é um estilo arquitetural híbrido, derivado de vários estilos arquiteturais de software em rede. Ele proposto por Roy Fielding em 2000, na sua dissertação de doutorado [1], que buscou uma combinação de estilos arquiteturais, que possuisse as melhores características para um sistema distribuído de hipermídia.
Um estilo arquitetural é um conjunto coordenado de restrições arquiteturais, que recebe nome por facilidade de uso, e é composto por restrições arquiteturais e elementos arquiteturais, estes, divididos em elementos de dados, conectores e componentes.
Estilos arquiteturais podem ser criados do zero, sem o reuso de estilos préexistentes, ou criados a partir de composição de estilos já existentes, esta foi a idéia utilizada em REST.
2.1 Estilos Arquiteturais de RESTNesta seção, serão abordados os estilos arquiteturais dos quais REST foi derivado.
2.1.1 Cliente/ServidorO primeiro estilo arquitetural utilizado na derivação de REST foi o Cliente/Servidor. Nele são definidos dois papéis: o do servidor, que disponibiliza um conjunto de serviços, e do cliente, que faz uso destes serviços.
Fielding considera a separação de preocupações como sendo o princípio por trás desta arquitetura [1], o que permite a evolução independente de cliente e servidor.
2.1.2 SemEstadoNa restrição Sem Estado o servidor não armazena qualquer informação de contexto, qual quer informação necessária para atender a uma requisição deve estar contida nela mesma.
Podese dizer que com a inclusão desta restrição a escabilidade aumenta, pois o servidor não precisa armazenar dados de contexto entre requisições, podendo assim, liberar recursos. Como cada requisição porta todos os dados necessários para reconhecêla, a visibilidade é aumentada.
2.1.3 CacheA restrição arquitetural cache evita que dados já tenham sido enviados anteriormente ao cliente, sejam reenviados. Para tanto, deve haver uma indicação implícita ou explícita em cada requisição, informando se deve ser utilizado cache ou não.
Segundo [1], a vantagem de se utilizar cache é a eliminação parcial ou total de algumas interações entre cliente/servidor. Melhorando a eficiência (menos dados trafegando com a mesma funcionalidade), escalabilidade (menos processamento e e/s) e a performance percebida pelo usuário (servidor menos carregado, menor tempo de resposta).
2.1.4 Interface uniformeA principal distinção entre REST e outros estilos arquiteturais para web é a enfâse no uso de uma interface uniforme entre seus componentes [1].
Com o uso de uma interface uniforme, a visibilidade de cada interação é aumentada pois o conjunto de métodos para cada elemento do sistema é conhecido, sendo assim, a cada execução de método se sabe a semântica deste. O sistema se torna mais simples como um todo, pois cada componente implementa os mesmos métodos.
2.1.5 Sistema em CamadasNa restrição de Sistema em Camadas, o sistema é dividido em camadas e a cada camada conhece apenas a fachada da camada seguinte, criandose vários subsistemas.
Essa restrição diminui a acopla mento, pois cada camada tem acesso apenas a API da camada seguinte, sem saber os detalhes de implementação desta. à sua API. Isso permite a substituição de camadas, caso se faça necessário.
2.1.6 Código sob demandaO código sob demanda é a utilização de lógica armazenada no servidor, a ser executada pelo cliente. Desta forma, partes do cliente ficam préimplementadas no servidor. Applets e código JavaScript armazenados no servidor, são exemplos de código sob demanda.
O código sob demanda é a única restrição arquitetural opcional do REST.
2.2 Elementos Arquiteturais de RESTNesta seção serão detalhados os elementos arquiteturais de REST.
2.2.1 Elementos de DadosOs elementos de dados de um estilo arquitetural são os elementos de informação que são trocados entre componentes, via conectores. REST possue três elementos de dados: Recursos, Identificadores de Recursos e Representações.
Um recurso é qualquer informação que possa ser nomeada: um documento, uma imagem, um serviço metereológico, uma coleção de outros recursos, um recurso não virtual (por exemplo uma pessoa) e assim por diante. Em outras palavras, qualquer conceito que possa ser sujeito a uma referência hipertextual se encaixa na definição de recurso [1].
A função do identificador de recurso é a identificação de um recurso envolvido em uma determinação interação. Todo recurso é referenciado por meio de um identificador de recurso, o responsável pelo identificador também é responsável por manter a validade semântica do mapeamento, garantindo que o identificador estará referenciando o recurso correto. O identificador de recurso utilizado na Web é a URI.
Uma representação é uma seqüencia de bytes e metadados para descrever estes bytes [1]. Os recursos são manipulados através do uso de representações.
2.3.1 Conectores e ComponentesUm componente é uma unidade abstrata de software e um estado interno, que executa transformações em dados através de sua interface [1]. Podese definir também, como o
elemento de um sistema que efetua computações [3]. Eles são os extremos nas interações, fazendo interface com o usuário.
Os conectores são mecanismos abstratos de software que mediam comunicação, coordenação ou cooperação entre componentes[1].
Um exemplo de interação conector e componente é o acesso a um recurso. Podese citar a utilização do navegador Mozilla Firefox como componente, que utiliza uma biblioteca interna cliente http, que um conector, e se conecta a um servidor apache que é um componente, via um conector http servidor, que é uma biblioteca http servidor.
3. Arquitetura Orientada a RecursosA Arquitetura Orientada a Recursos (ROA) é uma arquitetura que segue o estilo arquitetural REST, herdando dele, todas as restrições e elementos arquiteturais [2].
ROA é uma arquitetura voltada para serviços Web, sendo implementada a partir de tecnologias da Web como o protocolo HTTP [5] e a linguagem de marcação XML[6].
3.1 ConceitosOs conceitos de ROA são mais especificos que suas definições em REST, pois são utilizadas tecnologias Web especificas nas definições.
3.1.1 RecursosEm ROA a interface uniforme de cada recurso é definida pelo conjunto de métodos utiliza dos no protocolo HTTP.
3.1.2 Identificadores de RecursosOs identificadores de recursos devem ser URIs (Uniform Resource Identifiers)[7], que é o formato de identificadores utilizado na Web. Além disso, as URIs devem ser descritivas e seguir uma certa estrutura.
A justificativa para a descritividade das URIs é que elas são intuitivas para o usuário, que deve poder lêla e saber facilmente à que ela se refere.
URIs devem ter uma estrutura, variar de maneira previsivel, para facilitar seu uso por clientes sejam eles humanos ou máquinas.
Por exemplo, considere as seguintes URIs:
Exemplo:
• /animal/Gato
• /bicho/Tainha
Na listagem acima, há dois endereços para recursos com a mesma semântica informal: /bicho e /animal. Um usuário que acessar /animal/Gato pode querer acessar /animal/Tainha, caso o recurso endereçado por /animal/Tainha não esteja acessível teremos um problema, pois impedimos o usuário de acessar um recurso que é semânticamente válido mas não está acessível, pois não foi seguida uma estrutura ao endereçar os recursos.
3.1.3 RepresentaçõesRepresentações são trocadas entre cliente e servidor através dos métodos HTTP.
Negociação de conteúdo pode ser efetuada através de metadados enviados nos cabeçalhos das requisições, por exemplo o cabeçalho Accept pode ser usado em uma requisição para res tringir o tipo de mídia (MIME type) obtido na resposta.
Uma alternativa a utilização de metadados nos cabeçalhos das requisições é endereçar cada representação do recurso através de uma URI, por exemplo:
Um usuário acessando: /animal/Gato, utilizando o cabeçalho Accept na requisição um cliente pode decidir se deseja receber uma imagem ou informações textuais sobre gatos, como alternativa a isto podemos ter duas URIs /animal/Gato.txt designando informações textuais sobre gatos e /animal/Gato.svg como uma imagem.
A vantagem de utilizar diferentes URIs para diferentes representações de um mesmo re curso é que a informação está explicita na URI, este endereço pode ser copiado e passado adiante por um usuário.
A desvantagem é que os recursos endereçados por /animal/Gato.svg e /animal/Gato.txt parecem recursos diferentes, mas ambos descrevem a mesma coisa, apenas com um formato diferente, uma solução para este problema é criar um URI canonica em /animal/Gato, nesta URI existiria uma representação que teria enlaces para todas as representações possíveis do recurso em questão.
3.2 Propriedades
3.2.1 EndereçabilidadeUma aplicação é endereçavel quando um usuário pode acessar os dados, os recursos da aplicação, através de URIs.
Esta propriedade garante aspectos interessantes, por exemplo um usuário que queira procurar sobre buracos negros acessa a URI:
http://www.google.com.br/search?q=buraco+negro
Sua busca está endereçada, a URI pode ser copiada e passada adiante para que outros interessados possam realizar a mesma busca.
Com endereçabilidade também é possível fazer Cache de requisições, em uma rede local podemos ter uma máquina recebendo todas as requisições(um proxy HTTP), quando uma requisição é repetida podemos enviar um resultado salvo ao invés de consumir banda realizando a mesma requisição duas vezes, sem endereçabilidade não saberiamos quais requisições já foram efetuadas.
3.2.2 SemestadoSemestado significa que cada requisição HTTP ocorre em completo isolamento.
Quando o cliente envia uma requisição HTTP, ele inclue toda a informação necessária para que o servidor satisfaça a requisição. O servidor nunca se vale de informações de requisições anteriores [2].
Por exemplo, um usuário que esteja na página dois da sua pesquisa sobre buracos negros, caso ele queira enviar o endereço de sua busca para outra pessoa ele pode:
http://www.google.com.br/search?q=buraco+negro&start=2
Neste caso a própria URI contém o estado da aplicação, e não o servidor.
Caso esta informação estivesse no servidor este teria de gerenciar a informação do número da página de cada cliente da aplicação, um novo cliente teria de efetuar transições realizando operações no servidor até chegar ao estado desejado.
3.2.3 ConectividadeConectividade é a propriedade que permite que um cliente navegue por entre os recursos da aplicação através de enlaces embutidos nas representações.
Quando um usuário acessa: http://www.google.com.br/search?q=buraco+negro ele recebe uma série de enlaces pelos quais pode navegar, podendo acessar um dos resultados da pesquisa, mudar de página entre outras funcionalidades, como pode ser visto na figura 3.1.
Figura 3.1 – Busca por buraco negro no Google
Quando o servidor envia uma representação com enlaces, ele está enviando para o cliente uma série de URIs com estados possíveis da aplicação, é possível mostrar esta propriedade através de um grafo, onde os nodos são os recursos e as arestas enlaces ligandoos.
3.2.4 Interface UniformeA interface uniforme define o conjunto de operações possíveis para cada recurso.
Estas operações são restritas aos métodos do protocolo HTTP, e são listadas abaixo, com a semântica associada:
• GET: Obtêm a representação de um recurso, assim como os metadados associados.
• DELETE: Remove um recurso.
• PUT: Cria ou atualiza um recurso na URI especificada.
• POST: Cria um recurso subordinado ou anexa informações a um recurso, respondendo com a URI do novo recurso.
• OPTIONS: Lista quais os métodos que podem ser executados no recurso.
• HEAD: Idêntico ao GET, mas omitindo a representação.
4 METODOLOGIAROA além de ser uma arquitetura é uma metodologia de como explorar um problema e o expor em forma de recursos [2]. Ela foi utilizada como metodologia para o desenvolvimento do Disseminário em conjunto com Programação Orientada por Comportamento (BDD).
4.1 Metodologia ROA aplicada ao DisseminárioA metodologia ROA é dividida em nove passos, que serão descritos a seguir.
4.1.1 Identificação dos dados do domínioNesta etapa são identificadas quais as informações que serão fornecidas aos clientes do
serviço, baseandose no domínio da aplicação.
No Disseminário, temos diversos dados nos quais um cliente pode estar interessado, tais como: Usuários, Seminários, Coordenadores de seminário, Participantes de Seminário e Apresentações.
4.1.2 Definição dos recursosCom o conjunto de dados definido o próximo passo é definir como serão expostos como recursos HTTP, um recurso é qualquer coisa importante o suficiente para ser alvo de um hyperlink [2]. Nesta etapa são detalhados os dados do domínio para escolher como expôlos para o cliente.
Foi estabelecida uma relação direta entre as entidades e recursos, um recurso para cada entidade de domínio:
• Usuário
• Seminário
• Apresentação
Entidades derivadas de relações também podem ser referenciadas, tornandoas recursos.
Um coordenador pode ser referenciado, assim como um participante, tornandoos endereçáveis.
Quando uma proposta de seminário é feita ela deve ter um endereço, para que o administrador possa acessalá e decidir se irá aprovalá.
• Coordenador
• Participante de um seminário
• Proposta de seminário
Um cliente pode estar interessado na lista de seminários, para publicar em seu blog, ou na lista de usuários, para entrar em contato com eles através de mensagens de correio eletrônico.
A lista de seminários e a lista de usuários são recursos de coleção, foram criados recursos de coleção para cada recurso de entidade:
• Usuários
• Seminários
• Coordenadores
• Participantes de um seminário
• Apresentações de um seminário
• Propostas de seminários
Como nossos usuários interagem com o serviço através do navegador precisamos prover formulários que possam ser renderizados pelo navegador, tais como 5.11, para que possam ser preenchidos pelo usuário em enviados novamente ao servidor, tais formulários também são recursos.
• Formulário de cadastramento
• Formulário de confirmação de cadastramento
• Formulário de criação de proposta de seminário
• Formulário de envio de apresentação
Outro recurso criado foi o de cadastramento, que representa uma operação de criação de conta que ainda não foi concluída. O que motivou a criação deste recurso foi o fato da criação de conta ser feita em duas etapas, sendo criado o recurso na primeira etapa e tendo que persistir e ser endereçavel para a confirmação na segunda, este recurso foi criado baseado na idéia de transação, exposta em [2].
4.1.3 Definição dos nomes dos recursosTodo recurso deve ter um nome, estabelecido através de uma URI[2], além disso cada URI deve ser descritiva, de fácil entendimento para humanos, e seguir uma certa estrutura que varie o mínimo possível, evitando ambiguidades.
Na URI raiz do Disseminário são listados todos os seminários abertos ao público, os demais recursos de coleção são denotados pelo nome da coleção.
Abaixo podemos visualizar algumas URIs e as semânticas dos recursos identificados por cada uma delas, as URIs foram abreviadas para ficarem relativas ao endereço completo do Disseminário.
• / : Coleção de todos os seminários públicos
• /propostasDeSeminario : Coleção de propostas de seminário
• /usuarios : Coleção de todos os usuários
• /administradores : Coleção de usuários que são administradores
• /coordenadores : Coleção de usuários que são coordenadores
Foram criadas recursos relativos a outros recursos, todos os recursos estão vinculados ao recurso raiz mas podemos aprofundar estas relações, como por exemplo a coleção de partici pantes ou as apresentações de um seminário, a barra neste caso fornece a idéia de escopo onde o recurso do lado direito da barra está vinculado ao recurso do lado esquerdo, como pode ser visto abaixo:
• /ArteBarroca : Seminário de arte barroca
• /ArteBarroca/participantes : Coleção de participantes do seminário de arte barroca
• /ArteBarroca/apresentacoes : Coleção de apresentações do seminário de arte barroca
Um recurso que merece destaque é o arquivo da apresentação (que pode ser do formato odp,ppt ou pdf), usuários poderiam enviar sua apresentação em vários formatos para evitar pro blemas relacionados a diferentes versões do software de visualização de apresentações, existem duas opções para representar tipos de mídia específicos, para possibilitar esta funcionalidade [2].
Poderiamos incluir a informação do tipo de mídia no cabeçalho HTTP da resposta através da propriedade ContentType, desta forma uma mesma URI pode servir representações de tipos diferentes de mídia, um cliente acessaria /ArteBarroca/Aleijadinho/apresentacao podendo esco lher qual tipo de mídia quer receber na resposta, informando no cabeçalho de sua requisição a propriedade Accept.
A outra opção é estabelecer URIs diferentes para cada tipo de mídia, tais como:
• /ArteBarroca/Aleijadinho/apresentacao.pdf
• /ArteBarroca/Aleijadinho/apresentacao.odp
Nesta opção o tipo de mídia fica explícito na URI, tornando mais claro para o usuário o que está sendo requisitado. Esta foi a opção escolhida no Disseminário.
Todos os exemplos de URIs podem ser visualizados na tabela 4.1.
Tabela 4.1: URIs de Recursos
4.1.4 Definição das operações sobre os recursosNeste ponto, é necessário decidir quais os métodos da interface uniforme serão permitidos em cada recurso. Esta escolha é uma decisão de projeto e guiada pelo poder que se deseja conferir aos clientes.
Como descrito na seção 3.2.4, a interface uniforme de ROA é composta pelos métodos HTTP. A decisão de implementar ou não um método pode ser tomada a partir de perguntas, relativas as ações que os clientes poderão efetuar em um determinado recurso:
• Os clientes poderão ler o recurso? Se sim, implementar GET
• Os clientes poderão criar novos recursos deste tipo? Caso afirmativo. Quem está encarregado de saber onde ficarão os novos recursos criados? Se o cliente, implementar PUT, caso seja o servidor, implementar POST.
• Os clientes irão atualizar dados do recurso? Em caso afirmativo, implementar PUT
• Os cliente irão remover recursos deste tipo? Se sim, implementar DELETE
Os outros dois métodos da interface uniforme, HEAD e OPTIONS, provêm dos métodos já definidos. O método HEAD, por diferenciarse do método GET apenas por não enviar o corpo da representação, será implementado somente caso o método GET o seja. O método OPTIONS tem a função de informar quais métodos são permitidos no recurso, sendo implementado em todos os recursos.
Tabela 4.2: Métodos implementados nos RecursosA tabela 4.2 evidência o projeto escolhido para cada recurso. Recursos que
somente implementar GET são somente leitura. Para este tipo de recurso, tomouse a decisão de não dar o poder ao cliente de apagar ou atualizar coleções inteiras.
Um recurso de somente leitura particularmente interessante é o Arquivo de Apresentação, criado a partir do momento em que um recurso Apresentação é criado, sendo seu ciclo de vida vinculado a um recurso de Apresentação.
A vários recursos que implementam um mesmo conjunto de operações que o recurso de Administrador, estes são atualizáveis e deléveis, e foi escolhido o cliente
como o responsável por saber onde um novo recurso do tipo ficaria ao ser criado, razão do PUT para criação.
Outro recurso que chama atenção é o Propostas de Seminários, decidiuse que o servidor seria o encarregado de saber onde ficariam os novos recursos, já que podem haver várias propostas criadas por usuários, inclusive com mesmo nome, justificandose a implementação de POST.
O recurso Usuário não possuí método PUT/POST, portanto não é possível para um cliente criar um usuário com uma operação, o que se deve ao fato da criação de usuários darse em duas etapas, efetuadas através de um transação de cadastramento.
4.1.5 Representações aceitas pelo servidorO principal critério na escolha de representações é o tipo de representação que os clientes desejam consumir. A metodologia ROA propõe que se use representações comuns a web, como codificação de formulário, XML, JSON e XHTML com microformatos.
Como nossos clientes são o navegador web e um cliente automatizado, é necessário utilizar representações de entrada que possam ser facilmente geradas por eles. Por isso, decidiuse uti lizar codificação de formulário, que é uma representação nativa nos navegadores e com suporte no nosso cliente verificador de especificações.
4.1.6 Definição das representações oferecidas pelo servidorComo já dito na seção 4.1.5, a escolha de representações depende dos clientes. Por isso, buscouse uma representação de saída que pudesse ser renderizada por uma navegador e que ao mesmo tempo, fosse fácil para um cliente automatizado extrair as informações de que precisa.
Foi escolhido o formato XHTML, por ser XML, o que garante boa formação a facilidade extração de informações através de um parser e renderizável em um navegador, além disso é uma representação hipermídia, totalmente de acordo com os conceitos de REST e ROA. Por tais vantagens, ele foi adotado como representação de saída de todos nossos recursos, exceto o Arquivo de Apresentação. Neste recurso, a representação é o próprio arquivo de uma apresentação enviada por um participante de seminário.
4.1.7 Interligação dos recursosUm dos aspectos mais importantes no projeto ROA é a propriedade de conectividade, que é obtida durante esta fase do projeto. Buscase interligar os recursos de maneira que se tenha uma navegabilidade ótima no sistema, com o critério de que as ligações entre recursos façam sentido.
Não se busca um grafo totalmente conexo como o resultado das interligações entre os re cursos, mas sim, o máximo de ligações coesas.
Observandose o grafo da modelagem das interligações de recursos no Disseminário, na figura 4.1. Verificase uma boa conectiviade no sistema, pois, a partir de qualquer recurso, conseguese chegar a outro recurso que tenha alguma relação com esse.
Como exemplo de boa modelagem, podese citar a ligação entre o seminário “História de Arte” e Participantes, Apresentações e Coordenador. Todas estas
informações são realmente pertinentes ao seminário em questão, e, além de conseguir chegar até elas a partir do recurso do seminário, é possível voltar ao seminário posteriormente, caso se queira.
Figura 4.1: Diagrama da Interligação de Recursos
4.1.8 Definição das respostas bem sucedidasNesta etapa é definida a interação entre cliente e servidor nos casos normais, aqueles em que nenhum erro ocorreu.
Deve ser respeitado o protocolo HTTP, que define códigos de resposta de acordo com a requisição que foi feita, além de estabelecidas quais serão as representações enviadas em cada resposta.
Requisições GET e DELETE, quando efetuadas com sucesso, devem receber no cabeçalho da representação da resposta o código 200 ("OK"), e no seu corpo as informações desejadas. Por exemplo, no Disseminário um GET em Usuários obtém uma lista de usuários, uma operação DELETE nas propostas de seminário retorna uma página informando que a proposta foi removida com sucesso.
Requisições PUT e POST, quando efetuadas com sucesso, devem receber no cabeçalho da representação da resposta o código 201 ("Criado"), no caso de uma requisição POST é incluído um paramatro Location contendo a URI de onde o recurso foi criado, por exemplo, o endereço de uma proposta de seminário quando é efetuado um POST no recurso Propostas de Seminários.
Neste ponto também são consideradas questões de cache, um cliente pode ignorar representações de recursos que não tenham sido atualizadas depois de um determinado período para economizar tempo e largura de banda, mas cabe ao servidor verificar se o recurso foi atualizado, respondendo com a representação toda caso tenha sido, ou então respondendo com o código 304("Não Modificado") e omitindo o corpo da representação. Todavia não foi implementado mecânismo de cache no Disseminário.
4.1.9 Definição das respostas mal sucedidasQuando algo ocorre de errado na interação entre as partes comunicantes o servidor deve responder com códigos HTTP nas faixas: 3xx, 4xx, ou 5xx.
Códigos de erros são importantes pois explicitam o motivo do erro, por exemplo, caso um cliente envie uma representação com erros em uma requisição PUT, o servidor deve responder com o código 400("Requisição Incorreta") de forma que o cliente identifique a causa pela qual sua requisição não teve o efeito desejado.
Além dos códigos de erro no Disseminário são enviadas páginas XHTML que descrevem o motivo do erro e possuem ligações hipermídia, para que o usuário possa contornar esta situação.
4.2 Desenvolvimento Guiado por ComportamentoO Desenvolvimento Guiado por Comportamento (Behaviour Driven Development) é uma técnica de desenvolvimento ágil que tem ênfase na descrição do comportamento da aplicação.
Ela foi criada por Dan North [8], que enfrentava problemas ao ensinar Programação Guiada por Testes para seus alunos: o que testar, como dar nome aos testes e como entender porque um teste falhou [8].
O BDD foi criado a partir do TDD [4], que é uma técnica de desenvolvimento ágil na qual todo o código é originado a partir de testes, uma inversão do paradigma tradicional de codificação.
A cada ciclo de o programador assume diversos papéis, o de testador quando cria testes, o de analista quando busca formas de resolver o problema utilizando testes, o de projetista quando fatora o código para melhorar o projeto e de programador quando faz o código para passar nos testes. O ciclo TDD pode ser observado na figura 4.3.
No Desenvolvimento Guiado por Testes normalmente se tem para cada classe do modelo uma classe de testes [9], que possui uma série de métodos, cada um deles é um teste de unidade.
Não existe uma convenção sobre o quanto um teste de unidade deve testar, ou se cada teste de unidade deve contemplar todas as possibilidades de execução de um método da classe do modelo ou apenas um estado possível.
No Desenvolvimento Guiado por Comportamento a palavra ”teste” é abolida. Ela é substituída por Histórias, Cenários e Expectativas. O que torna mais fácil saber onde e o que testar, pois as histórias e cenários são as próprias especificações do sistema, que vêm diretamente do cliente do software e definem o ponto de partida. Desta maneira, não dependendo da criativi dade do programador, como acontece em TDD.
O uso de uma linguagem próxima da natural facilita a criação da especificação, pois, podese usar uma linguagem muito parecida com a do cliente, que em seguida, se tornará código executável.
4.2.1 HistóriasAs histórias são descrições de funcionalidades, os cenários são contextos para a ocorrência das histórias e as expectativas são o que se espera que aconteça em determinados cenários de uma história. Sendo assim, as histórias são compostas de cenários, estes, compostos por précondições e expectativas.
Assim como o [10], o BDD propõe que se faça uso de linguagem ubíqua [8]. Escolheuse o seguinte modelo para a escrita de histórias, o que culminou no estabelecimento de uma linguagem comum:
História: {Título da história}
Eu como {um papel}
Quero {ação}
Para {resultado esperado}
Cenário: {Título do cenário}
Dado que {précondição}
Caso {ação}
Então {expectativas}
A partir do momento que se tem a história escrita, podese transformála em código executável.
4.2.2 BDD no DisseminárioNo Disseminário, todas as histórias foram escritas em texto e depois passadas para código.
Em termos de código foi utilizada a linguagem Java e o framework JUnit e adotado a seguinte estrutura para armazenar as especificações:
• pacote: nome corresponde ao nome da história
• classes do pacote: nomes correspondentes aos cenários da história
• métodos das classes: précondições e expectativas dos cenários
Abaixo, segue um exemplo de história “Usuário Participando de Seminário” que foi implementada no Disseminário:
História: Usuário Participando de Seminário
Eu como um usuário
Quero participar de um seminário
Para poder publicar uma apresentação
Cenário: Quando existe o Seminário
Dado que existe o usuário “[email protected]”
e Que existe o seminário de nome “Um Seminário”
Caso o usuário [email protected] envie uma solicitação de participação para o seminário “Um Seminário”
Então Deve ser criado um participante em “/UmSeminario/participante/[email protected]”
de nome “Fulano”
de endereço de correio eletrônico “[email protected]”
Deve existir um enlace em “/UmSeminario/participantes/”
apontando para “/UmSeminario/participante/[email protected]”.
A história acima foi transformada em um esqueleto de código Java, como pode ser observado na listagem 4.1.
Listagem 4.1: História: Usuário Participando de Seminário
package usuarioParticipandoDeSeminario;
public class QuandoExisteOSeminario extends InfraEstruturaDeEspecificacao {
public static void considerandoQue ( ) {
existeOUsuario_usuarioDoDisseminario_arroba_edugraf_
ufsc_br_de_nome_Fulano ( ) ;
existeUmSeminario_de_nome_UmSeminario ( ) ;
}
public static void caso ( ) {
oUsuario_usuarioDoDisseminario_arroba_edugraf_ufsc_br
_envieUmaSolicitacaoDeParticipacaoParaOSeminario
_UmSeminario ( ) ;
}
public void entao ( ) {
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 ( ) ;
}
Uma vez que a história é transformada em código, não há mais necessidade de mantêla como texto, pois é possível obter o texto a partir da história em código. E essa é uma das grandes vantagens de se ter especificações executáveis: a sincronia que se mantém entre elas e o código. Qualquer alteração que se faça na especificações é registrada diretamente no código. Uma vez que a especificação é código, mantendo as especificações sempre atualizadas.
5 ImplementaçãoEsta seção descreve a implementação do Disseminário, explicitando a organização de seus módulos e as tecnologias utilizadas na implementação.
5.1 DisseminárioA implementação do Disseminário foi realizado utilizandose a linguagem de programação PHP, uma linguagem interpretada e fracamente tipada, criada em 1995 para a criação de páginas web dinâmicas, podendo ser embutida em páginas HTML[11].
Foi utilizada a versão 5 da linguagem, que possuí um suporte mais completo a orientação a objetos que sua predecessora.
5.1.1 ArquiteturaO disseminário é um sistema em camadas, conforme pode ser visto na figura 5.1. Cada camada tem um subsistema que oferece serviços somente para a camada imediatamente superior.
Figura 5.1 – Camadas do Disseminário
As requisições HTTP são tratadas pela camada de serviços, ocasionando chamadas as camadas subsequentes e por fim uma resposta contendo uma representação á enviada para o cliente que originou a requisição, desta forma a camada de serviços é a única interface do sistema para com o cliente, reduzindose o acoplamento com o mesmo. Esta interação entre cliente servidor pode ser visualizada na figura 5.2.
Figura 5.2 – Interação Cliente/Servidor
6.1.2 Camada de serviçosA camada de serviços foi implementada de forma a receber todas as requisições HTTP feitas para o servidor, direcionandoas para uma fachada.
Na fachada a requisição é analisada e é identificado qual o tratador responsável por ela na camada de negócios, a estes tratadores é dado o nome de recursos, que possuem uma interface com um método para cada operação da interface interface uniforme HTTP.
Na modelagem foi utilizada uma metáfora de roteamento, onde uma Rota é a ligação entre uma URI e o Recurso responsável pelo seu tratamento, e a responsabilidade de identificar a qual a rota corresponde uma requisição é delegada a um Roteador.
6.1.3 Camada de Persistência Foi utilizado o arcabouço Doctrine[10], responsável pelo mapeamento objetorelacional, realizando a interface entre o modelo de negócios e a camada de persistência. Como SGBD foi utilizado MySQL .
No Doctrine o esquema da base de dados é descrito em YAML[11], uma linguagem de descrição de dados de fácil leitura para humanos e máquinas, a partir deste esquema são geradas as classes responsáveis pelo mapeamento objetorelacional, base de dados e tabelas associadas.
O Doctrine utiliza uma linguagem própria para as consultas, a DQL(Doctrine Query Language), inspirada em SQL e que é capaz de retornar objetos como resultado de uma consulta.
Além de automatizar tarefas que teriam de ser feitas manualmente o Doctrine também possui a vantagem de não ser acoplado a um SGBD específico, bastando que algumas configurações sejam feitas para que outro SGBD seja utilizado, sem que nenhum código precise ser alterado, já que tanto o esquema como a linguagem de consulta são independentes de uma plataforma específica.
6.2 Verificação das especificações As especificações foram implementadas em Java, utilizando o arcabouço JUnit.
Como cliente HTTP foi utilizado o conector Restlet, baseado no cliente Apache Commons[12].
Para realização das extração das informações das representações XHTML foi utilizado o parser Apache Xerxes [13], que possui suporte a consultas XPath, utilizadas para obter as informações desejadas.
ConclusõesUm sistema web de apoio de Seminários foi desenvolvido, baseado na arquitetura orientada a recursos. Isto lhe conferiu características distintas quando comparado a maioria dos sistemas web projetados, tanto pro usuário comum, quanto pro desenvolvedor.
Para o usuário comum as partes mais importantes a se destacar são as próprias propriedades da ROA. O estado da aplicação sendo mantido pelo cliente, garante que os enlaces não deixarão de funcionar em acessos posteriores, pois o servidor não guarda o estado da aplicação. A endereçabilidade, que permite ao usuário mandar o enlace de qualquer um dos recursos do sistema para outra pessoa e esta conseguir acessálo. A conectividade, que dá ao usuário a facilidade de navegar entre as diversas partes do sistema e a interface uniforme, que devido a semântica empregada no http, protege as ações do usuário, não fazendo alterações em dados simplesmente ao acessar enlaces. Quanto ao desenvolvedor, além de poder aproveitar as características gosadaspelo usuário comum, tem a possibilidade de criar diversos clientes para acessar o sistema.
Uma das peculiaridades do desenvolvimento foi o emprego de programação orientada por comportamento. Por tratarse de uma técnica de desenvolvimento pouco pesquisada e utilizada em meio acadêmico, poucos são os artigos cientificos publicados sobre ela. Ela foi empregada de uma forma diferente dá de costume, sem o uso de mocks. Pois, o sistema que estava sendo testado, era acessível através da interface uniforme de ROA, e injetandose mocks nele diferentemente da abordagem comum, onde se faz o uso de mocks, tinhase a interface uniforme do http para se comunicar, e através dela, faziase a configuração do sistema no cenário esperado para a verificação da especificação.
Alguns aspectos foram forçados com base na teoria descrita em [2], e houve dificuldade no desenvolvimento de autenticação HTTP sem o uso de cookies, não encontrouse uma boa solução para o bom funcionamento da mesma.
O trabalho como um todo foi muito proveitoso, pois compreendeu o estudo de conceitos avançados e atuais em conjunção com a aplicação deles. Além do emprego de
técnicas em circunstâncias talvez nunca antes utilizadas, como o caso de BDD combinado a ROA.
Referências [1] FIELDING, R. Architectural Styles and the Design of Networkbased Software Architectures. Tese (Doutorado) — UNIVERSITY OF CALIFORNIA, IRVINE, 2000.
[2] RICHARDSON, S. R. L. RESTful Web Services. [S.l.]: O’Reilly Media, 2007.
[3] GARLAN, M. S. D. Advances in Software Engineering and Knowledge Engineering. [S.l.]: World Scientific Pub Co., 1993.
[4] BECK, K. Test Driven Development: By Example. [S.l.]: AddisonWesley Professional, 2002.
[5] HYPERTEXT Transfer Protocol HTTP/1.1 (RFC 2616 Fielding, et al). Disponível em: http://www.w3.org/Protocols/rfc2616/rfc2616.html. Acesso em: 20 out. 2008.
[6] EXTENSIBLE Markup Language (XML). Disponível em: http://www.w3.org/XML/. Acesso em: 20 out. 2008.
[7] UNIFORM Resource Identifier (URI): Generic Syntax. Disponível em:
http://labs.apache.org/webarch/uri/rfc/rfc3986.html. Acesso em: 20 out. 2008.
[8] NORTH, D. Introducing bdd. Better Software Magazine, 2006. Disponível em: http://dannorth.net/introducingbdd. Acesso em: 13 out. 2008.
[9] ADAMS, T. Better testing through behaviour. Open Source Developers’ Conference, 2007.
[10] DOCTRINE Free Open Source PHP ORM. Disponível em: http://www.doctrine
project.org/. Acesso em: 20 out. 2008.
[11] YAML: YAML Ain’t Markup Language. Disponível em: http://www.yaml.org/. Acesso em: 20 out. 2008.
[12] RESTLET 1.0 Connectors. Disponível em: http://www.restlet.org/documentation/1.0/connectorshttpcl Acesso em: 20 out. 2008.
[13] XERCES Java Parser. Disponível em: http://xerces.apache.org/xercesj/. Acesso em: 20 out. 2008.