271
Erich Silvestre, Pablo Valério Polônia Uma Aplicação da Arquitetura Orientada a Recursos 02 de dezembro de 2008

Uma Aplicação da Arquitetura Orientada a Recursos · orientado a recursos, o sistema Disseminário de apoio a seminários. Palavras-chave: REST, Arquitetura Orientada a Recursos,

  • Upload
    hoangtu

  • View
    221

  • Download
    0

Embed Size (px)

Citation preview

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

19

• Desenvolver um sistema de apoio a seminários

• Aplicar técnicas de desenvolvimento ágil

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

24

Figura 2.4: Interface Uniforme [1]

Figura 2.5: Sistema em Camadas [1]

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

32

Figura 3.1: Aplicação Sem-Estado

Figura 3.2: Aplicação Com-Estado

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

45

Figura 4.2: Diagrama da Interligação de Recursos

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-

[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 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.

52

Figura 5.1: Primeira etapa do cadastramento

Figura 5.2: Mensagem de confirmação de cadastramento

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.

56

Figura 5.8: Janela de autenticação

Figura 5.9: Usuário navegando autenticado

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.

58

Figura 5.11: Página de criação de proposta de seminário

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.

60

Figura 5.13: Página de um seminário

61

Figura 5.14: Página principal do Disseminário

Figura 5.15: Opção para participar de um seminário

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 " , ’ &nbsp ; &nbsp ; ’ , $ 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 ( ’ ’ , ’ &nbsp ; ’ , $ 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 ( ’&amp ; ’ , ’&’ , $ 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 >

251

ANEXO D -- Artigo: Uma Aplicação da ArquiteturaOrientada a Recursos

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 88040­900 ­ 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 Resource­Oriented Architecture (ROA).  With the goal of applying theses theories on the development of a seminars helping system, using Behaviour­Driven Development. As result,  a resource oriented­seminar   system   has   been   built,the   Disseminário   seminar   helping system.

Resumo. Muito esforço tem­se empregado em pesquisas sobre serviços web, e  grande parte destas pesquisas ignora completamente o estilo de arquitetura proposta originalmente para a web. Buscou­se com este trabalho, resgatar um estilo   arquitetural   desenvolvido   para   sistema   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,  criou­se 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,  faz­se 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. Busca­se respeitar a proposta inicial da web e fazer um intensivo de hipermídia.Desenvolve­se um sistema web orientado a recursos, utilizando­se da metodologia proposta e de técnicas ágeis, como o desenvolvimento guiado por comportamento.

Dividiu­se esta artigo em quatro seções, no primeira  trata­se sobre REST, os estilos   do   qual   se   derivou   e   seus   elementos   arquiteturais.   Na   segundo   faz­se   uma explanação   da   Arquitetura   Orientada   a   Recursos,   seus   conceitos,   propriedade,   na seguinte   descreve­se   uma   metodologia   que   serve   para   se   projetar   sistemas   web orientados  a   recursos  e  programação guiada  por  comportamento.  Na última,   fala­se 

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 Sem­EstadoNa 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.

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.

2.1.3 CacheA 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   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, criando­se 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]. Pode­se 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. Pode­se 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 Sem­estadoSem­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 [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 ligando­os.

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   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.

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, 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 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, 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á aprova­lá.

• 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 Content­Type, 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 diferenciar­se 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, 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, 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, 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.

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, decidiu­se 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, buscou­se 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. 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.1. 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.

                          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, pode­se 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]. Escolheu­se   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,  pode­se 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   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[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 sub­sistema 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,   reduzindo­se  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, direcionando­as 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  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[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 objeto­relacional, 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 tratar­se 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  injetando­se mocks nele diferentemente da abordagem comum, onde se faz o uso de mocks, tinha­se a interface uniforme do http para se comunicar, e através dela, fazia­se 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 encontrou­se 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 Network­based 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.]: Addison­Wesley 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/introducing­bdd. 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/xerces­j/. Acesso em: 20 out. 2008.