UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf ·...

132
FÁBIO GABRIEL ZAUPA UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB BASEADO EM SERVIÇOS MARINGÁ 2007

Transcript of UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf ·...

Page 1: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

FÁBIO GABRIEL ZAUPA

UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB BASEADO EM SERVIÇOS

MARINGÁ

2007

Page 2: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

2

FÁBIO GABRIEL ZAUPA

UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB BASEADO EM SERVIÇOS

Dissertação apresentada ao Programa de Pós-Graduação em Ciência da Computação da Universidade Estadual de Maringá, como requisito parcial para a obtenção do grau de Mestre em Ciência da Computação.

Orientadora: Profa. Dra. Itana Maria de Souza Gimenes

MARINGÁ

2007

Page 3: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

3

004 Zaupa, Fábio Gabriel Z39u Um processo de desenvolvimento de aplicações WEB

baseado em serviços / Fábio Gabriel Zaupa Maringá: [s.n.], 2007.

132 f. : il. Orientador: Itana Maria de Souza Gimenes. Dissertação (Mestrado em Ciência da Computação) –

Universidade Estadual de Maringá – UEM, Maringá, PR, 2007.

Bibliografia

1. Aplicações Web. 2. Arquitetura orientada a Serviços. 3. Linha de Produtos. 4. Modelo de características. 5. BPEL. I. Título.

Page 4: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

4

FÁBIO GABRIEL ZAUPA

UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB BASEADO EM SERVIÇOS

Dissertação apresentada ao Programa de Pós-Graduação em Ciência da Computação da Universidade Estadual de Maringá, como requisito parcial para obtenção do grau de Mestre em Ciência da Computação.

Aprovado em 27/04/2007.

BANCA EXAMINADORA

Profa. Dra. Itana Maria de Souza Gimenes Universidade Estadual de Maringá – DIN/UEM

Profa. Dra. Maria Madalena Dias Universidade Estadual de Maringá – DIN/UEM

Profa. Dra. Rosana Teresinha Vaccare Braga Universidade de São Paulo – ICMC/USP

Page 5: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

5

Dedico este trabalho

Á minha mãe, Olga de Andrade Zaupa, que sempre me incentivou e me mostrou com muita

sabedoria a importância do estudo, e ao meu pai, Aparecido Fioravante Zaupa, que sempre

me mostrou através de atitudes como é importante o esforço e o trabalho para se alcançar um

objetivo.

Page 6: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

6

AGRADECIMENTOS

Agradeço primeiro a Deus pela força e proteção que me acompanharam durante todo o

meu trabalho e nas constantes viagens.

Agradeço minha mãe, meu pai, minha irmã Carla Zaupa, meu cunhado Luciano

Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti, pelo amor,

compreensão e apoio, principalmente nos momentos difíceis.

Agradeço em especial a minha orientadora, Itana Maria de Souza Gimenes, pela

oportunidade, confiança, profissionalismo, dedicação e conhecimentos compartilhados.

Agradeço a todos os professores que, de forma direta ou indireta, contribuíram para

este trabalho, principalmente as professoras Eliza Huzita e Tânia Tait pela ajuda e

compreensão, e aos professores Reginaldo Ré e Emerson Silas Doria pela ajuda no início do

trabalho.

Agradeço aos amigos César Alberto, Edson Oliveira Junior, Eduardo Rebola e toda a

minha turma do mestrado, pela amizade, respeito e contribuições.

Agradeço a todos os funcionários do Departamento de Informática da UEM, em

especial à Maria Inês Davanço, pela ajuda e paciência.

Agradeço aos meus superiores da Caixa Econômica Federal, Cláudio Marinho Gomes,

José Antonio Bonfim, Aparecido Fausto Monteiro e em especial ao amigo Herbert Soler, pela

colaboração e compreensão, e a todos os meus amigos da agência Parque do Povo pela

amizade.

E por fim, digo, ninguém vence sozinho, se estou alcançado esta vitória, todos que me

ajudaram de alguma forma também estão.

Page 7: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

7

"É justamente a possibilidade de realizar um

sonho que torna a vida interessante."

Paulo Coelho (O Alquimista)

Page 8: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

8

RESUMO

O número de aplicações Web tem crescido exponencialmente, porém a qualidade das

aplicações não cresce proporcionalmente. Aplicações Web podem ser autocontidas ou podem

ser concebidas como uma cooperação de serviços que podem inclusive demandar cooperações

inter-organizacionais. A Arquitetura Orientada a Serviço (SOA) é vista como capaz de

oferecer a infra-estrutura tecnológica necessária para que uma aplicação possa ser definida

por meio da composição de serviços eletrônicos. Em SOA, a composição de serviços é vista

como um processo de negócio dividido em componentes reutilizáveis e interoperáveis. Apesar

da disseminação de aplicações Web, o que se nota é que os métodos tradicionais de

desenvolvimento de aplicações Web ainda requerem muita modelagem, programação e não

tiram muito proveito de reutilização. Neste contexto, está WIDE, um ambiente que consiste

de um grupo articulado de frameworks de apoio ao desenvolvimento de aplicações Web.

WIDE-PL é uma evolução de WIDE, que tem como objetivo apoiar a geração de aplicações

Web baseadas em SOA seguindo os princípios de linha de produtos. Este trabalho visa

especificar o processo ADESE, que consiste de um processo de desenvolvimento de

aplicações Web baseado em serviços no contexto de WIDE-PL. Para realização deste trabalho

foi utilizada WSDL para especificação de serviços e BPEL4WS para especificação de

processos de negócio. A avaliação do processo ADESE foi realizada por meio de um estudo

de caso. Os resultados obtidos mostram que o processo tem vantagens em aspectos como:

reutilização, separação explícita da lógica do negócio e os serviços, redução de tempo e custo

de desenvolvimento, interoperabilidade e manutenibilidade.

Palavras chave: Aplicações Web. Arquitetura Orientada a Serviços. Processos de Negócio.

Linha de Produtos. Modelo de Características. BPEL.

Page 9: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

9

ABSTRACT

The number of Web applications has been increased exponentially. However, the

quality of them does not follow this increase. Web applications may be either self contained

or be conceived as a composition of services that may required inter-organizational

cooperation. The Service Oriented Architecture (SOA) offers a technical framework to

support the development of applications as a composition of electronic services. SOA

considers the composition of services as a business process divided into reusable components

that can interact. Despite the dissemination of Web applications, current software

development methods still require a lot of programming and do not take profit of reuse.

WIDE is in this context as an environment that provides a set of frameworks to support a

more automatic development of Web applications. WIDE-PL is an evolution of WIDE, that

aims at generating Web applications based on SOA and following the principles of product

line. This work aims at defining the ADESE process, an process to develop Web applications

based on services in the context of WIDE-PL. The work has used Web services as the

technical infrastructure, in particular WSDL to specify the services and BPEL4WS to specify

the business process. The evaluation of the ADESE process was carried out based on a case

study. The results show advantages in aspects such as: reusability, separation of concerns

between business processes and services, reduction of cost and time of development,

interoperability and manutenability.

Key words: Web Applications. Service Oriented Architecture. Business Process. Product

Line. Feature Model. BPEL.

Page 10: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

10

LISTA DE ILUSTRAÇÕES

Figura 1 - Uma visão da arquitetura Web.............................................................................................. 19

Figura 2 - Especificação do WSDL....................................................................................................... 24

Figura 3 - Orquestração versus Coreografia.......................................................................................... 29

Figura 4 - Arquitetura SGPN baseada em serviços............................................................................... 30

Figura 5 - Fluxo do processo BPEL. ..................................................................................................... 33

Figura 6 - Atividades essenciais de LP. ................................................................................................ 36

Figura 7 - Exemplo de modelo de características.................................................................................. 38

Figura 8 - Características de aplicações Web dentro do WIDE-PL....................................................... 42

Figura 9 – Modelo de características do serviço de interface interativa. .............................................. 43

Figura 10 - Visão geral da arquitetura lógica do WIDE-PL.................................................................. 44

Figura 11 - Modelo de características do serviço de interação. ............................................................ 48

Figura 12 - Modelo de características do serviço de interface. ............................................................. 50

Figura 13 - Modelo de características do serviço de base de dados...................................................... 53

Figura 14 - Representação gráfica do processo ADESE....................................................................... 55

Figura 15 - Modelo de características do serviço de calendário. .......................................................... 62

Figura 16 – Modelo de características já instanciado do serviço de calendário.................................... 63

Figura 17 - Diagrama de classes do serviço de calendário.................................................................... 65

Figura 18 - Estrutura do serviço de calendário na ferramenta Netbeans 5.5......................................... 67

Figura 19 - Novo processo de negócio síncrono. .................................................................................. 69

Figura 20 - Aplicação locação de vídeos com os serviços já adicionados. ........................................... 73

Figura 21 - Página que será gerada para a validação do usuário........................................................... 77

Figura 22 - Página que será gerada quando o resultado da validação for verdadeira............................ 78

Figura 23 - Modelo de características do serviço de matemática básica............................................... 80

Figura 24 - Estrutura do serviço de matemática básica na ferramenta Netbeans 5.5. ........................... 81

Figura 25 - Aplicação controle de estoque com os serviços já adicionados. ........................................ 84

Figura 26 - Página que será gerada com a execução da aplicação controle de estoque. ....................... 86

Page 11: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

11

LISTAGENS DE CÓDIGO

Listagem 1 - Exemplo de utilização do elemento <definitions> no WSDL. ............................... 24

Listagem 2 - Exemplo de utilização do elemento <type> no WSDL................................................. 25

Listagem 3 - Exemplo de utilização do elemento <message> no WSDL. ....................................... 25

Listagem 4 - Exemplo de utilização do elemento <portType> no WSDL. ...................................... 26

Listagem 5 - Exemplo de utilização do elemento <binding> no WSDL.......................................... 26

Listagem 6 - Exemplo de utilização do elemento <service> no WSDL.......................................... 26

Listagem 7 - Exemplo de utilização do elemento de extensão <partnerLinkType> no WSDL... 27

Listagem 8 - Estrutura do documento BPEL......................................................................................... 33

Listagem 9 - WSDL de um serviço de processo de negócio................................................................. 47

Listagem 10 - WSDL do serviço de interação. ..................................................................................... 49

Listagem 11 – Trecho do WSDL do serviço de interface. .................................................................... 52

Listagem 12 - Trecho do WSDL do serviço de base de dados.............................................................. 54

Listagem 13 - Exemplo de programação da operação diaSemana na classe Calendario............ 66

Listagem 14 - Exemplo de programação da operação diaSemana na classe Data. ......................... 66

Listagem 15 - Trecho do WSDL que contém as operações do serviço de calendário. ......................... 68

Listagem 16 - Trecho BPEL contendo as definições inicias do processo............................................. 71

Listagem 17 - Exemplo da extensão BPEL incluída no serviço de interface........................................ 72

Listagem 18 - Trecho BPEL com algumas declarações de variáveis.................................................... 74

Listagem 19 - Trecho BPEL responsável por iniciar o processo. ......................................................... 74

Listagem 20 – Trecho BPEL que invoca a operação connect do serviço de base de dados. ............ 75

Listagem 21 - Trecho BPEL que atribui valores a variáveis e invoca operações. ................................ 76

Listagem 22 - Trecho BPEL que formata a página e envia ao serviço de interação. ............................ 76

Listagem 23 – Trecho BPEL que contém a validação do usuário da aplicação.................................... 77

Listagem 24 - Trecho BPEL para listar clientes e repassa-los ao serviço de interface. ........................ 79

Listagem 25 - Trecho BPEL responsável por finalizar o processo. ...................................................... 79

Listagem 26 - Trecho do WSDL que contém as operações do serviço de matemática básica.............. 82

Listagem 27 - Trecho BPEL em que são configurados cabeçalho, rodapé e menu. ............................. 85

Listagem 28 - Trecho do servlet que simula o processo de negócio em BPEL......................................87

Page 12: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

12

LISTA DE SIGLAS

BPEL4WS Business Process Execution Language for Web Services

BPML Business Process Modeling Language

BPSS Business Process Specification Language

CORBA Common Object Request Broker Architecture

CSG Computer System Group

DCOM Distributed Common Object Model

EAI Enterprise Application Integration

FTP File Transfer Protocol

HTTP Hypertext Transport Protocol

LP Linha de Produtos

OOHDM Object Oriented Hypermedia Design Method

OOWS Object Oriented Web Solutions

PLP Product Line Practice

SADT Standard Analysis and Design Technique

SEI Software Engineering Institute

SGPN Sistema de Gerenciamento de Processos de Negócio

SGWf Sistemas de Gerenciamento de Workflows

SMTP Simple Mail Transfer Protocol

SOA Service Oriented Architecture

SOAP Simple Object Access Protocol

TCP Transmission Control Protocol

UDDI Universal Description, Discovery, and Integration

UML Unified Modeling Language

URL Uniform Resource Locators

WebML Web Modeling Language

WIDE Waterloo Informatics Development Environment

WIDE-PL Waterloo Informatics Development Environment-Product Line

WSCI Web Services Choreography Interface

WSDL Web Services Description Language

WSFL Web Services Flow Language

XLANG Web Services for Business Process Design

XML Extendible Markup Language

Page 13: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

13

SUMÁRIO

CAPÍTULO 1 - INTRODUÇÃO........................................................................................................ 15

CAPÍTULO 2 - DESENVOLVIMENTO DE APLICAÇÕES WEB.............................................. 18

2.1 UMA VISÃO DA ARQUITETURA WEB.......................................................................... 19

2.2 MÉTODOS DE DESENVOLVIMENTO DE APLICAÇÕES WEB................................... 20

2.3 ARQUITETURA ORIENTADA A SERVIÇOS - SOA ...................................................... 21

2.3.1 Serviços Web................................................................................................................... 22

2.3.1.1 WSDL ......................................................................................................................... 23

2.3.2 Processos de Negócio...................................................................................................... 27

2.3.2.1 Gerenciamento de Processos de Negócio.................................................................... 28

2.3.2.2 BPEL4WS................................................................................................................... 30

2.4 LINHA DE PRODUTO DE SOFTWARE........................................................................... 34

2.4.1 Modelo de Características ............................................................................................... 36

2.5 CONSIDERAÇÕES FINAIS............................................................................................... 38

CAPÍTULO 3 - ADESE: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES

WEB BASEADO EM SERVIÇOS .................................................................................................... 40

3.1 WIDE-PL............................................................................................................................. 40

3.2 ARQUITETURA LÓGICA DO WIDE-PL ......................................................................... 43

3.2.1 SERVIÇOS OBRIGATÓRIOS ....................................................................................... 46

3.2.1.1 Serviço de Processo de Negócio ................................................................................. 46

3.2.1.2 Serviço de Interação.................................................................................................... 47

3.2.1.3 Serviço de Interface..................................................................................................... 49

3.2.1.4 Serviço de Base de Dados ........................................................................................... 53

3.3 O PROCESSO ADESE........................................................................................................ 55

3.4 CONSIDERAÇÕES FINAIS............................................................................................... 59

CAPÍTULO 4 - AVALIAÇÃO DO PROCESSO ADESE ............................................................... 60

4.1 ESTUDO DE CASO............................................................................................................ 60

4.1.1 Aplicação Web de Locação de Vídeos ............................................................................ 61

4.1.1.1 Etapa 1 - Definição do Domínio da Aplicação ........................................................... 61

4.1.1.2 Etapa 2 - Desenvolvimento de Serviços...................................................................... 61

4.1.1.3 Etapa 3 - Geração da Aplicação com Base nos Serviços Definidos ........................... 69

4.1.2 Aplicação Web de Controle de Estoque.......................................................................... 80

4.1.2.1 Etapa 1 - Definição do Domínio da Aplicação ........................................................... 80

4.1.2.2 Etapa 2 - Desenvolvimento de Serviços...................................................................... 80

4.1.2.3 Etapa 3 - Geração da Aplicação com Base nos Serviço Definidos ............................. 82

4.1.3 Execução das Aplicações ................................................................................................ 86

Page 14: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

14

4.2 RESULTADOS ................................................................................................................... 88

4.3 CONSIDERAÇÕES FINAIS............................................................................................... 90

CAPÍTULO 5 - CONCLUSÕES........................................................................................................ 91

REFERÊNCIAS .................................................................................................................................. 94

APÊNDICE A – DESCRIÇAO BPEL DA APLICAÇÃO LOCAÇÃO DE VÍDEOS................... 98

APÊNDICE B – DESCRIÇAO BPEL DA APLICAÇÃO CONTROLE DE ESTOQUE .......... 109

APÊNDICE C – SERVLET PARA SIMULAÇÃO DO PROCESSO DE NEGÓCIO DA

APLICAÇÃO LOCAÇÃO DE VÍDEOS ........................................................................................ 119

APÊNDICE D – SERVLET PARA SIMULAÇÃO DO PROCESSO DE NEGÓCIO DA

APLICAÇÃO CONTROLE DE ESTOQUE.................................................................................. 126

Page 15: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

15

CAPÍTULO 1

INTRODUÇÃO

A Web vem crescendo continuamente nos últimos anos, conquistando novos adeptos

nos mais diferentes segmentos da sociedade. Atrai pessoas com os mais diversificados

interesses, seja para fins acadêmicos ou de entretenimento, como também para realização de

negócios.

Muitas organizações, visualizando a possibilidade de realização de novos negócios,

expandem suas atividades, criando sistemas de informação baseados em tecnologia Web. Essa

tecnologia inclui browsers, servidores Web, linguagens de programação Web e protocolos de

comunicação que viabilizam o funcionamento dos sistemas de informação através da Web.

Neste contexto, os sistemas de informação são conhecidos como aplicações Web.

O número de aplicações Web tem crescido exponencialmente, porém a qualidade das

aplicações disponíveis não cresce proporcionalmente. Qualidade inclui confiabilidade,

disponibilidade, eficiência, usabilidade, entre outros. Casati e Shan (2000) apontam que a

fachada Web esconde enormes deficiências, operações manuais e sujeitas a erros, inflexíveis e

complexas, e sistemas de difícil gerenciamento.

Aplicações Web podem ser autocontidas ou podem ser concebidas como uma

cooperação de serviços que podem inclusive demandar cooperações inter-organizacionais.

Um exemplo disso é um sistema de agência de viagem capaz de chamar serviços oferecidos

por outras organizações, como o serviço de reserva de passagem, o serviço de reserva de hotel

ou até o serviço de reserva de veículo.

A Arquitetura Orientada a Serviços (SOA1) é vista como capaz de oferecer a infra-

estrutura tecnológica necessária para que uma aplicação possa ser definida por meio da

1 Do inglês Service Oriented Architecture.

Page 16: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

16

composição de serviços eletrônicos. Segundo Papazoglou & Georgakopoulos (2003), serviços

eletrônicos, também chamados apenas de serviços, são componentes abertos e auto-

descritivos que oferecem apoio à composição de aplicações distribuídas de uma forma rápida

e com baixo custo. Em SOA, a composição de serviços é vista como um processo de negócio

dividido em componentes reutilizáveis com requisitos como baixo acoplamento e alta

interoperabilidade. Dessa forma, é possível a interação e orquestração entre os componentes

para realizar o processo de negócio. Pode-se dizer que um serviço representa a virtualização

de um componente de projeto. Virtualizar quer dizer tornar disponível para acesso.

Apesar da disseminação de aplicações Web, o que se percebe é que os métodos

tradicionais de desenvolvimento de aplicações Web como WebML (CERI; FRATERNALI;

BONGIO, 2000), OOHDM (SCHWABE; ROSSI, 1998) e OOWS (PASTOR; FONS;

PELECHANO, 2003) ainda requerem muita modelagem, programação e não tiram muito

proveito de reutilização. Dessa forma, o Computer System Group (CSG) da Universidade de

Waterloo no Canadá propôs o WIDE (Waterloo Informatics Development Environment)

(COWAN, 2004), que consiste em um grupo articulado de frameworks para suporte ao

desenvolvimento de aplicações Web.

O ambiente WIDE-PL (Waterloo Informatics Development Environment - Product

Line) é uma evolução de WIDE para desenvolvimento de aplicações Web que segue os

princípios de linha de produtos (KANG, 1990) (CZARNECKI et al., 2005). O projeto

preliminar de WIDE-PL foi desenvolvido por Gimenes et al. (2005) em seu estágio de pós-

doutorado na Universidade de Waterloo. O objetivo de WIDE-PL é apoiar a geração de

aplicações Web baseadas em SOA. Em WIDE-PL, os serviços utilizados em uma aplicação

Web podem ser especificados e compostos em uma linguagem de especificação e composição

de serviços.

Page 17: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

17

Este trabalho de mestrado tem como objetivo especificar um processo de

desenvolvimento de aplicações Web baseado em serviços, o qual é chamado processo

ADESE. Este processo consiste de atividades para: (i) definir o domínio da aplicação; (ii)

modelar serviços com base nos conceitos de modelo de características de linha de produtos;

(iii) instanciar o modelo de características; (iv) mapear o modelo instanciado para um

correspondente diagrama de classes; (v) implementar os serviços a partir do diagrama de

classes; e, (vi) gerar aplicações com base nos serviços definidos. Além disso, tem-se como

objetivo revisar a arquitetura de WIDE-PL para aprimorar o seu projeto.

Para realização deste trabalho de mestrado foi utilizada a tecnologia de serviços Web2

devido à disponibilidade de padrões e infra-estrutura de apoio. Um serviço Web é um tipo

específico de serviço eletrônico que permite a definição de aplicações heterogêneas por meio

de interfaces padronizadas definidas em linguagem XML (XML, 2006) e em padrões como

WSDL (CHRISTENSEN, 2001), SOAP (SOAP, 2006) e UDDI (UDDI, 2006). Assim,

WSDL (CHRISTENSEN, 2001) foi utilizada para especificação de serviços e BPEL4WS

(BEA, 2003) para especificação de processos de negócio. No entanto, linguagens específicas

para WIDE-PL podem ser projetadas no futuro. Os resultados produzidos neste trabalho

contribuem para consolidação de WIDE-PL, pois oferece um processo de desenvolvimento de

aplicações Web baseado em serviços, acompanhado de sua avaliação por meio de um estudo

de caso.

Esta dissertação está organizada da seguinte forma: o capítulo 2 apresenta uma visão

geral de métodos existentes para o desenvolvimento de aplicações Web; a arquitetura SOA; e

princípios de linha de produtos utilizados no trabalho. O capítulo 3 apresenta o processo

ADESE e o capítulo 4 apresenta a sua avaliação por meio de um estudo de caso. O capítulo 5

apresenta as conclusões e trabalhos futuros.

2 Do inglês Web Services.

Page 18: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

18

CAPÍTULO 2

DESENVOLVIMENTO DE APLICAÇÕES WEB

Com a crescente demanda por aplicações Web, foram propostos alguns métodos para

atender às suas necessidades específicas. Esses métodos são, em geral, baseados em modelos,

e auxiliam na concepção do modelo da aplicação, por exemplo, em UML (JACOBSON;

BOOCH; RUMBAUGH, 1999), ou alguma extensão desta que eventualmente pode apoiar a

geração de código. Contudo, o que se percebe é que as aplicações Web ainda requerem muita

modelagem, programação e não tiram muito proveito de reutilização. As aplicações Web

exigem cada vez mais a troca de informações entre aplicações heterogêneas desenvolvidas em

diversas linguagens e plataformas em uma única organização, ou até mesmo entre

organizações. Neste contexto, SOA é vista como capaz de oferecer a infra-estrutura

tecnológica necessária para que as aplicações interajam durante a realização de um processo

de negócio, pois utiliza serviços reutilizáveis com requisitos como baixo acoplamento e alta

interoperabilidade.

O processo proposto neste trabalho de mestrado visa possibilitar a construção de uma

aplicação Web por meio da concepção e configuração de serviços específicos de domínio que

sejam modelados com base nos conceitos de Linha de Produtos (LP) e sejam compostos em

processos de negócio com base na tecnologia de SOA.

Dessa forma, este capítulo apresenta uma visão da arquitetura Web, conceitos de

métodos existentes para desenvolvimento de aplicação Web baseados em modelos, com o

intuito de destacar as diferenças entre esses métodos e o processo ADESE. Também são

apresentados conceitos de SOA, tecnologia de serviços Web e LP.

Page 19: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

19

2.1 UMA VISÃO DA ARQUITETURA WEB

A Web pode ser vista como uma coleção de tecnologias, que incluem browsers,

servidores Web, linguagens de programação Web e protocolos de comunicação (HTTP, FTP,

SMTP, entre outros), que são interconectadas sobre a Internet, utilizando o modelo cliente

servidor, conforme ilustrado na Figura 1. Na máquina cliente, o browser atua como uma

janela para apoiar as interações. Esse browser pode fazer requisições ou carregar arquivos

contidos nesses servidores. Na máquina servidora, os servidores Web recebem as requisições,

fazem o processamento e retornam as informações recuperadas para a máquina cliente.

Quando retornadas, o browser interpreta, formata e disponibiliza as informações aos usuários

(ALONSO et al., 2003).

Figura 1 - Uma visão da arquitetura Web.

Fonte: Alonso et al. (2003)

A comunicação entre a máquina cliente e um servidor Web pode disponibilizar acessos

a outros servidores Web ou a outros serviços disponíveis no mesmo servidor, tal como o

acesso a bases de dados, sistemas de gerenciamento e potencialidades como relatórios, mapas

ou diagramas.

Podem existir variações desta arquitetura Web, mas neste trabalho ela é suficiente para

ilustrar os fundamentos do processo ADESE.

Page 20: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

20

2.2 MÉTODOS DE DESENVOLVIMENTO DE APLICAÇÕES WEB

Os métodos de desenvolvimento de aplicações Web existentes são, em geral,

baseados em modelos. Normalmente, esses métodos incluem: (i) um modelo que representa

os requisitos da aplicação; (ii) um modelo responsável pela navegabilidade, que é muito

importante em aplicações Web porque define a seqüência em que as páginas são apresentadas;

e, (iii) um modelo responsável pela interface da aplicação, que cuida da aparência gráfica das

páginas. Eles concebem o modelo da aplicação em UML (JACOBSON; BOOCH;

RUMBAUGH, 1999), ou alguma extensão desta, e eventualmente oferecem uma ferramenta

de apoio à geração do código da aplicação, que auxilia na fase de implementação do método.

Alguns dos métodos de desenvolvimento de aplicações Web que mais se destacam na

literatura são:

• WebML (Web Modeling Language): essa linguagem auxilia os

desenvolvedores a projetarem as principais funcionalidades de um site em alto

nível para em seguida, por meio de ambiente de apoio, gerar o código da

aplicação. O ambiente de desenvolvimento é bastante intuitivo, o que torna sua

utilização simples. Para modelar aplicações Web utiliza-se o modelo de dados,

o modelo de hipertexto, o modelo de apresentação e o modelo de

personalização (CERI; FRATERNALI; BONGIO, 2000) (WEBML, 2006).

• OOHDM (Object Oriented Hypermedia Design Method): esse método auxilia

na construção de aplicações de hipermídia em larga escala. Utiliza técnicas de

orientação a objetos para o projeto e contém quatro atividades que são

modelagem conceitual, modelagem navegacional, projeto de interface abstrata

e implementação. (SCHWABE; ROSSI, 1998) (OOHDM, 2006).

• OOWS (Object Oriented Web Solutions): consiste de duas etapas que são a

especificação do sistema, que é dividida em requisitos funcionais e de

Page 21: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

21

concepção, e o desenvolvimento de solução, que é a geração de elementos de

software que representem uma solução para o sistema (PASTOR; FONS;

PELECHANO, 2003).

Existem alguns problemas relacionados a esses métodos de desenvolvimento de

aplicações Web, tais como o excesso de modelagem e programação, além do uso reduzido da

reutilização, o que propiciam aumento de custo e tempo ao desenvolvimento da aplicação

Web. Na seção seguinte será apresentado o SOA, que é vista como uma tecnologia capaz de

oferecer a infra-estrutura para resolver esses problemas.

2.3 ARQUITETURA ORIENTADA A SERVIÇOS - SOA

Segundo Papazoglou e Georgakopoulos (2003), SOA utiliza serviços eletrônicos como

elementos fundamentais para o desenvolvimento de aplicações distribuídas. Em SOA, a

comunicação entre os serviços acontece via troca de mensagens.

Os primeiros passos para uso de SOA foram o CORBA (CORBA, 2006) e DCOM

(DCOM, 2006) que utilizavam tecnologia de middleware EAI3 (Integração de Aplicações

Empresariais). Embora muito tenha sido desenvolvido, problemas como alta complexidade e

alto custo associados às tecnologias EAI inviabilizaram sua utilização em maiores proporções

(ALONSO et al., 2003).

Atualmente, os serviços Web, que são um tipo específico de serviços eletrônicos, estão

sendo apresentados como uma tecnologia para efetiva automação das interações inter-

organizacionais baseada em SOA (FANTINATO; TOLEDO; GIMENES, 2005). A seção

seguinte apresenta os serviços Web.

3 Do inglês Enterprise Application Integration

Page 22: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

22

2.3.1 Serviços Web

Segundo Alonso et al. (2003), os serviços Web são componentes abertos e auto-

descritivos acessíveis a outras aplicações ou serviços pela Web por meio de um endereço

URL, assim ele oferece apoio à composição de soluções distribuídas. As mensagens são

descritas com base em XML e obedecem aos protocolos abertos para Internet.

O serviço Web tem como principal benefício uma ampla padronização que pode ser

utilizada de forma simples em qualquer plataforma de software e hardware, o que facilita a

integração entre aplicações (FANTINATO; TOLEDO; GIMENES, 2005). Os principais

padrões utilizados pelos serviços Web são:

• XML (eXtendible Markup Language): linguagem de marcação de dados

baseada em tags, que oferece um padrão para descrever dados estruturados de

modo a facilitar a declaração do conteúdo (XML, 2006).

• WSDL (Web Services Description Language): linguagem utilizada para

descrever os serviços Web (CHRISTENSEN et al., 2001). Este padrão será

apresentado em detalhes na seção seguinte porque será utilizado durante o

trabalho para a especificação de serviços.

• SOAP (Simple Object Access Protocol): protocolo que define o formato das

mensagens que são trocadas entre clientes e fornecedores de serviços (SOAP,

2006).

• UDDI (Universal Description, Discovery, and Integration): padrão que define

a estrutura e o conteúdo dos diretórios de serviços, possibilitando a publicação,

descoberta e invocação de serviços nesses diretórios (UDDI, 2006).

• HTTP (Hypertext Transport Protocol): protocolo que permite transportar

requisições e respostas entre clientes e fornecedores (HTTP, 2006).

Page 23: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

23

De um modo geral, um serviço Web pode ser entendido como uma aplicação que tem

uma interface descrita em WSDL, registrada em um diretório de serviços via protocolo UDDI,

e interage com clientes por meio da troca de mensagens XML encapsuladas em formato

SOAP, que são transportadas por protocolo HTTP (FANTINATO; TOLEDO; GIMENES,

2005).

2.3.1.1 WSDL

WSDL é uma linguagem de especificação de serviços que utiliza XML como base.

Assim, um documento WSDL contém especificações em XML com regras específicas que

fornecem as descrições de um serviço Web. WSDL é utilizada para especificar um serviço a

ser disponibilizado, como também para um cliente encontrar um serviço Web e invocar suas

funções publicamente disponíveis. Um documento WSDL descreve quatro partes de dados

(CERAMI, 2002):

• Interfaces: descreve as funções publicamente disponíveis.

• Tipos de dados: descreve os tipos de dados necessários nas mensagens e nas

respostas das mensagens.

• Ligamento: descreve o protocolo de transporte a ser usado no serviço.

• Endereço: descreve onde localizar o serviço.

A especificação do documento WSDL é dividida em seis elementos principais:

<definitions>, <type>, <message>, <portType>, <binding> e <service>. A

Figura 2 apresenta uma representação da especificação do documento WSDL.

Page 24: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

24

Figura 2 - Especificação do WSDL.

Fonte: Cerami (2002)

O elemento <definitions> (definições) é o elemento raiz do documento WSDL,

portanto contém os demais elementos. Além disso, contém a definição do nome do serviço e

dos namespaces que são referências a arquivos externos ao documento. A Listagem 1

apresenta um exemplo desse elemento, em que o serviço tem o nome de wsDatabase e os

namespaces (ex. urn:wsDatabase/wsdl) são especificados.

Listagem 1 - Exemplo de utilização do elemento <definitions> no WSDL.

O elemento <types> (tipo) é usado para definir os tipos de dados utilizados pelo

serviço Web. Os tipos de dados são referenciados pelo elemento <message>. A Listagem 2

apresenta um exemplo desse elemento, em que o tipo de dados de nome execute contém

apenas uma entrada de dados em formato string e o tipo de dados de nome

executeResponse contém apenas uma entrada de dados em formato boolean.

<definitions name="wsDatabase" targetNamespace="urn:wsDatabase/wsdl" xmlns=http://schemas.xmlsoap.org/wsdl/ xmlns:tns="urn:wsDatabase/wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap=http://schemas.xmlsoap.org/wsdl/soap/ xmlns:ns2="urn:wsDatabase/types" xmlns:plink="http://schemas.xmlsoap.org/ws/2004/03/partner-link/"> . . </definitions>

Page 25: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

25

Listagem 2 - Exemplo de utilização do elemento <type> no WSDL.

O elemento <message> (mensagem) descreve uma mensagem de sentido único.

Assim, pode ser incluída uma mensagem de requisição e outra de resposta para cada operação

que é especificada no elemento <portType>. A Listagem 3 apresenta um exemplo desse

elemento em que as mensagens são nomeadas por wsDatabaseSEI_execute e

wsDatabaseSEI_executeResponse, e possui tipos de dados descritos no elemento

<type>, como no caso dos elementos execute e executeResponse.

Listagem 3 - Exemplo de utilização do elemento <message> no WSDL.

O elemento <portType> (tipo de porta) contém as operações de um serviço Web.

Esse elemento combina elementos da mensagem para dar forma a uma operação de sentido

único (requisição ou resposta) ou completo (requisição e resposta). A Listagem 4 apresenta

um exemplo do elemento <portType>, em que o serviço possui apenas uma operação

completa chamada execute, contendo as mensagens de requisição e resposta chamadas

respectivamente wsDatabaseSEI_execute e wsDatabaseSEI_executeResponse.

<message name="wsDatabaseSEI_executar"> <part name="parameters" element="ns2:execute"/> </message> <message name="wsDatabaseSEI_executeResponse"> <part name="result" element="ns2:executeResponse"/> </message>

<complexType name="execute"> <sequence><element name="String_1" type="string" nillable="true"/> </sequence> </complexType> <complexType name="executeResponse"> <sequence><element name="result" type="boolean"/></sequence> </complexType>

Page 26: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

26

Listagem 4 - Exemplo de utilização do elemento <portType> no WSDL.

O elemento <binding> (ligamento) descreve os detalhes concretos de como as

mensagens são transmitidas, incluindo definições do protocolo SOAP. A Listagem 5

apresenta um exemplo do elemento <binding> onde as operações descritas no elemento

<portType> recebem definições do protocolo de transmissão.

Listagem 5 - Exemplo de utilização do elemento <binding> no WSDL.

O elemento <service> (serviço) descreve o endereço URL onde o serviço está

localizado. A Listagem 6 apresenta um exemplo do elemento <service>, de nome

WsDatabase, em que o endereço do serviço é especificado em location (ex.

location="http://localhost:8080/Database/wsDatabase").

Listagem 6 - Exemplo de utilização do elemento <service> no WSDL.

Além dos seis elementos principais de um documento WSDL, podem ser incluídas

extensões por meio de referências no elemento <definitions>. Uma dessas extensões é

<portType name="wsDatabseSEI"> <operation name="execute> <input message="tns:wsDatabaseSEI_execute"/> <output message="tns:wsDatabaseSEI_executeResponse"/> </operation> </portType>

<binding name="wsDatabaseSEIBinding" type="tns:wsDatabaseSEI"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="execute"> <soap:operation soapAction=""/> <input><soap:body use="literal"/></input> <output><soap:body use="literal"/></output> </operation> </binding>

<service name="WsDatabase"> <port name="wsDatabaseSEIPort" binding="tns:wsDatabaseSEIBinding"> <soap:address location="http://localhost:8080/Database/wsDatabase" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"/> </port> </service>

Page 27: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

27

elemento <partnerLinkType> que é usado para representar uma interação entre o serviço

Web e um processo de negócio descrito em BPEL4WS. A Listagem 7 apresenta um exemplo

do uso desse elemento em que o nome é definido por DatabasePartnerLinkType e a

definição das funções disponíveis do serviço ao processo de negócio é feita através de

referência a dados contidos no elemento <portType> (ex. plink:role

portType="tns:wsDatabaseSEI").

Listagem 7 - Exemplo de utilização do elemento de extensão <partnerLinkType> no WSDL.

2.3.2 Processos de Negócio

Um processo de negócio é uma seqüência de atividades executadas, possivelmente,

por múltiplas organizações que atuam cooperativamente para atingir um objetivo comum de

negócio, sendo que atividades podem ser representadas por serviços (FANTINATO;

TOLEDO; GIMENES, 2005).

Segundo Schmidt (2003) é necessário definir como os serviços são utilizados para

implementar as atividades de um processo de negócio, bem como a forma em que o processo

de negócio baseado em serviços é gerenciado. Um processo de negócio pode ser entendido

como um novo serviço composto que agrega vários serviços. Por sua vez, esse novo serviço

pode ser disponibilizado para uso em outros serviços, e assim sucessivamente. Um serviço

composto pode ser invocado várias vezes, dentro ou fora da própria organização

(LEYMANN; ROLLER; SCHMIDT, 2002).

<plink:partnerLinkType name="DatabasePartnerLinkType"> <plink:role portType="tns:wsDatabaseSEI" name="Database" /> </plink:partnerLinkType>

Page 28: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

28

2.3.2.1 Gerenciamento de Processos de Negócio

Para viabilizar a definição e automação de processos de negócio é necessária a

concepção de mecanismos para sua automatização. O gerenciamento de processos de negócio

precisa ser realizado com cooperações transparentes entre múltiplas organizações. Os

Sistemas de Gerenciamento de Processos de Negócio (SGPN) são os sistemas que permitem a

definição, criação e gerenciamento da execução de processo de negócio com apoio

computacional. Os SGPN são extensões dos Sistemas de Gerenciamento de Workflows

(SGWf), tradicionais ou intra-organizacionais, porém com enfoque inter-organizacional

(FANTINATO, TOLEDO e GIMENES, 2005).

As organizações, em sua maioria, possuem sistemas heterogêneos, o que agrega uma

maior complexidade ao gerenciamento de processos de negócio e causa impacto nas

atividades de modelagem de processo, execução e monitoramento. O gerenciamento de

processos de negócio pode ser realizado de duas formas (PELTZ, 2003):

• Gerenciamento centralizado ou Orquestração: quando o gerenciamento do

processo de negócio é realizado por uma única organização e o único ponto de

controle fica no processo de mais alto nível. Nesse tipo de gerenciamento, o

SGPN é disponibilizado em apenas uma organização para gerenciar todo o

processo de negócio, sendo chamado normalmente de servidor do SGPN. As

outras organizações parceiras podem possuir uma infra-estrutura básica capaz

apenas de executar suas partes do processo, e comunicar-se com o servidor do

SGPN.

• Gerenciamento descentralizado ou Coreografia: quando o gerenciamento do

processo de negócio é realizado por várias organizações, sendo que os

processos estão em um único nível, precisando comunicar-se entre si para que

as atividades de gerenciamento possam ser executadas. Nesse tipo de

Page 29: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

29

gerenciamento, os SGPN devem estar distribuídos nas organizações envolvidas

no processo de negócio.

Um mesmo processo de negócio pode, dependendo de suas características, utilizar os

dois tipos de gerenciamento de processo. A Figura 3 ilustra as diferenças entre orquestração e

coreografia. Enquanto a orquestração dirige a execução de um processo de negócio, a

coreografia coordena a seqüência de mensagens entre origem e destino.

Figura 3 - Orquestração versus Coreografia.

Fonte: Peltz (2003)

Em Papazoglou e Georgakopoulos (2003) é apresentada uma arquitetura genérica de

SGPN baseada em serviços. Essa arquitetura é representada por uma pirâmide dividida em

três camadas de serviços, conforme é apresentado na Figura 4. A camada de serviços básicos

oferece a base da arquitetura, constituída por funcionalidades que permitem a descrição de

serviços básicos como capacidades, interface, comportamento e qualidade de serviço, além de

operações básicas que utilizam as descrições dos serviços para publicação, descoberta, seleção

e ligação. A camada de composição oferece apoio adicional para a composição de serviços

básicos em novos serviços compostos e mais complexos fazendo uso de coordenação,

monitoramente, conformidade e composição de qualidade. Por fim, a camada de

gerenciamento que oferece apoio para o gerenciamento de serviços.

Page 30: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

30

Figura 4 - Arquitetura SGPN baseada em serviços.

Fonte: Fantinato, Toledo e Gimenes (2005)

Em Fantinato, Toledo e Gimenes (2005) são apresentados exemplos específicos de

arquiteturas de SGPN baseadas em serviços.

Para especificar processos de negócio é necessária uma linguagem adequada. A seção

seguinte apresenta linguagem BPEL4WS que serve a tal propósito.

2.3.2.2 BPEL4WS

Existem diversas linguagens para especificação de processos de negócio baseadas em

serviços Web, tais como WSFL (WSFL, 2006), WSCI (WSCI, 2006), BPML (BPML, 2006),

BPSS (BPSS, 2006), XLANG (XLANG, 2006) e BPEL4WS (BEA, 2003). Cada uma delas

tem diferentes origens e possui diferentes objetivos para tratar de características específicas de

processos de negócio. A linguagem escolhida neste trabalho é o BPEL4WS (Business Process

Execution Language for Web Services), que é chamada simplesmente de BPEL, porque

Page 31: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

31

propõe uma padronização para a especificação de processos de negócio e tem o apoio

conjunto de grandes corporações.

BPEL é uma linguagem proposta por BEA, Microsoft e IBM, baseada em XML, que

permite especificação de processos de negócio gerenciados por orquestração. Ela permite a

descrição do relacionamento entre serviços participantes do processo, troca de mensagens,

manipulação de variáveis e ações para controle de exceções (BEA, 2003).

BPEL consiste de primitivas para especificação de atividades que podem ser básicas

ou estruturais. As atividades estruturais são usadas para definir a orquestração. Dentre o grupo

de atividades estruturais encontram-se (BEA, 2003):

• Sequence: conjunto de atividades a executar sequencialmente dentro de uma

ordem descrita.

• Switch: escolha de atividades baseadas em condições.

• Pick: relacionar um evento a uma atividade, assim quando o evento acontece a

atividade é executada.

• While: executar uma atividade repetidas vezes enquanto uma condição é

verdadeira.

• Flow: agrupa um conjunto de atividades a executar em paralelo, e é

considerado completo quando todas as execuções são concluídas.

• If: executa um procedimento se a condição for verdadeira.

• ForEach: repete um procedimento na quantidade de um contador.

• RepeatUntil: repete um procedimento até que a condição se torne verdadeira.

Já as atividades básicas são responsáveis por invocar as operações contidas em um

serviço participante representadas em um documento WSDL. Dentre essas atividades básicas

estão:

Page 32: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

32

• Invoke: envia uma mensagem de requisição a um serviço participante, podendo

receber uma mensagem como resposta.

• Receive: aguarda uma mensagem de entrada de um serviço participante para

executar o processamento.

• Reply: envia uma mensagem em resposta a um evento de recebimento

síncrono.

Outras atividades do BPEL também podem ser consideradas básicas, tais como: assign

que serve para atribuir valores entre variáveis; wait que serve para aguardar um determinado

tempo para continuar o processo; e throw que serve para sinalizar uma falha.

A estrutura de um documento contendo as definições de um processo de negócio em

BPEL é apresentada na Listagem 8. Esta estrutura pode ser dividida em configurações iniciais

e outras quatro grandes seções (BEA, 2003), que são:

• Configurações iniciais: o elemento <process> define as configurações

iniciais que consistem do nome do processo, e referências a documentos

WSDL e a arquivos de esquemas XML que são usados para definir os serviços

participantes e os tipos de dados usados nas variáveis do processo.

• <variables>: define as variáveis de dados usadas pelo processo. As

variáveis permitem a troca de mensagens durante a execução do processo de

negócio.

• <partnerLinks>: define os serviços participantes que interagem com o

processo do negócio durante sua execução.

• <faultHandlers>: contém as ações de controle de falha que definem as

atividades que devem ser executadas em resposta às falhas que ocorrem

durante a execução do processo.

Page 33: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

33

• Definição do processo: iniciado pelo elemento <sequence>, contém a

descrição do comportamento do processo de negócio através do uso das

atividades básicas e estruturais.

Listagem 8 - Estrutura do documento BPEL.

A Figura 5 apresenta a ilustração de fluxo de um processo BPEL, representando que

um processo pode ter fluxo seqüencial ou dividir-se em fluxos paralelos. Pode-se, em

qualquer momento do fluxo, invocar serviços participantes através do seu respectivo WSDL,

enviando e recebendo dados a esses serviços se necessário. Ações de exceções, funções e

variáveis também podem ser usadas em qualquer trecho do fluxo.

Figura 5 - Fluxo do processo BPEL.

Fonte: Peltz (2003)

<process name="ProcessName" … … … > <partnerLinks> ... </partnerLinks> <variables> … </variables> <faultHandlers> … </faultHandlers> <sequence> … </sequence>

</process>

Page 34: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

34

Com a especificação do processo de negócio em BPEL finalizada, sua execução é feita

por um motor que age como intermediário na troca de mensagens. Quando um processo de

negócio é colocado em produção, significa que um novo serviço composto está disponível.

Dessa forma, um serviço composto especificado em BPEL será um serviço como qualquer

outro, e assim seguirá os mesmos padrões, e poderá ser usado também para compor um outro

serviço. Na seção seguinte serão apresentados conceitos de LP e modelo de características

usado para modelar serviços no ambiente WIDE-PL.

2.4 LINHA DE PRODUTO DE SOFTWARE

Uma LP é um grupo de aplicações, também chamado de família de produtos, que

compartilham características comuns e gerenciáveis que satisfazem às necessidades

específicas de um segmento do mercado. As aplicações, também chamadas de membros da

família de produtos, são desenvolvidas a partir de um núcleo comum de artefatos de uma

maneira prescritiva (SEI, 2006) (CLEMENTS; NORTHROP, 2001) (OLIVEIRA JUNIOR et

al., 2005). Esse núcleo de artefatos contém a arquitetura da LP e seus componentes, sendo que

a arquitetura é genérica o bastante para representar a arquitetura de todos os membros da LP.

Um membro da família é gerado instanciando-se características da LP que atendem às

exigências de uma aplicação específica (GIMENES et al., 2005b). Novos componentes

também podem ser adaptados, ou desenvolvidos, e adicionados às aplicações quando houver

necessidade.

Nos últimos anos tem se percebido uma crescente adoção da abordagem de LP devido

aos seus muitos benefícios. Segundo Clements e Northrop (2001) e Heymans e Trigaux

(2003), os benefícios da adoção de uma abordagem de LP podem ser classificados em:

• Organizacionais: melhor compreensão do domínio, alta qualidade dos produtos

e confiança do cliente.

Page 35: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

35

• Engenharia de software: melhor análise e reutilização dos requisitos e dos

artefatos, controle da qualidade dos produtos, estabelecimento de padrões e

documentação reutilizável.

• Negócio: redução dos gastos com teste e manutenção.

Para alcançar tais benefícios, são necessários alguns procedimentos e mudanças

organizacionais. Esses benefícios não são imediatamente visíveis, muitas vezes demandam

um longo prazo (HEYMANS; TRIGAUX, 2003).

O SEI (2006), por meio da iniciativa PLP (Product Line Practice), estabeleceu

algumas atividades essenciais de uma abordagem de LP. Essas atividades são:

• Desenvolvimento do núcleo de artefatos (Engenharia de domínio): responsável

por estabelecer uma infra-estrutura central que é reutilizada pelos produtos

gerados a partir da LP.

• Desenvolvimento do produto (Engenharia da aplicação): responsável pelo

desenvolvimento de produtos, membros da família de produtos representados

pela LP.

• Gerenciamento da LP: responsável por garantir que todas as atividades sejam

realizadas de acordo com um planejamento coordenado. O gerenciamento pode

ser dividido em gerenciamento técnico, que coordena as atividades de

desenvolvimento, e gerenciamento organizacional, que deve garantir que as

unidades organizacionais recebam os recursos corretos em quantidades

suficientes.

A Figura 6 ilustra as interações entre as atividades de uma LP em três círculos,

ilustrando engrenagens. Os círculos indicam que as atividades de uma LP são altamente

interligadas. As flechas rotativas indicam que além do núcleo de artefatos para desenvolver os

Page 36: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

36

produtos, também são utilizadas as revisões desses artefatos ou até mesmo novos artefatos no

desenvolvimento de LP.

Figura 6 - Atividades essenciais de LP.

Fonte: SEI (2006)

A forma mais conhecida de representação dos requisitos de um domínio em LP é o

modelo de características (KANG, 1990). Os conceitos de LP são aplicados ao contexto de

WIDE-PL para modelar os serviços de domínio específico que compõem as aplicações,

através do uso do modelo de características. Portanto, a seção seguinte apresenta o modelo de

características.

2.4.1 Modelo de Características

O modelo de características4 é usado para modelar aplicações de um domínio,

resumindo as capacidades comuns e diferentes de uma aplicação. O conceito de características

vem da engenharia de domínios (KANG, 1990) e tem sido melhorado constantemente para

4 Do inglês feature.

Page 37: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

37

suprir às demandas da LP (SIMONS et al., 1996; VAN GURP et al., 2001; SOCHOS et al.,

2004; CZARNECKI et al., 2005).

Segundo Czarnecki et al. (2005), modelo de características é uma importante técnica

para captura e gerenciamento de atributos e variabilidades em LP em seus estágios de

desenvolvimento. Os atributos representados em um modelo de características são os

relacionamentos entre as características identificadas e o tempo de resolução.

Segundo Kang (1990) e Simons et al. (1996), características podem ser definidas como

elementos relevantes de um sistema e visíveis ao usuário final. Segundo Griss et al. (1998), e

Van Gurp et al. (2001), as características podem ser classificadas em:

• obrigatórias: são as características que identificam um produto e são essenciais

para o seu funcionamento. Por exemplo, enviar e receber e-mail em um

sistema de correio eletrônico;

• opcionais: são as características, que quando habilitadas, podem adicionar

algum valor às características obrigatórias de um produto. Por exemplo, a

possibilidade de se adicionar assinatura ao e-mail;

• variáveis: são as características que podem ser selecionadas para estarem

presentes em um produto, a partir de um grupo de características. Por exemplo,

o sistema de correio eletrônico pode oferecer um editor de mensagens;

• externas: são as características oferecidas pela plataforma do sistema. Por

exemplo, um sistema de correio eletrônico com capacidade de fazer conexões

TCP (Transmission Control Protocol).

O modelo de características é geralmente representado por meio de diagramas em

forma de árvores que contêm as características identificadas para uma família de produtos

(SOCHOS et al., 2004; CZARNECKI et al., 2005). A Figura 7 apresenta um exemplo de

modelo de características para um sistema de correio eletrônico. Nesta figura pode ser

Page 38: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

38

observado o relacionamento entre as características e seu tempo de resolução (runtime e

compiletime). A Figura 7 apresenta características como “Digitar Mensagem” e “Receber

Mensagem” que possuem relacionamento com a característica raiz do modelo, chamada

“Email”, e relacionamento com suas respectivas ramificações que são características

variáveis, opcionais e até mesmo obrigatórias, que servem para refinar o modelo de

características.

Figura 7 - Exemplo de modelo de características.

Fonte: Van Gurp et al. (2001)

Neste trabalho de mestrado, os modelos de características foram produzidos pela

ferramenta Feature Modeling Plug-in for Eclipse, que é chamada simplesmente de Feature

Plug-in. Essa ferramenta é descrita em Antkiewicz e Czarnecki (2004).

2.5 CONSIDERAÇÕES FINAIS

Este capítulo apresentou o contexto para o desenvolvimento de aplicações Web, em

que se estabeleceu uma visão geral da arquitetura Web onde as aplicações são executadas.

Discutiu-se brevemente os atuais métodos para o desenvolvimento de aplicações Web

Page 39: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

39

existentes, com o intuito de compará-los com o processo ADESE proposto neste trabalho.

Foram apontados alguns de seus problemas, como o excesso de modelagem e programação,

além do uso reduzido da reutilização, o que propiciam aumento de custo e tempo ao

desenvolvimento da aplicação Web. Em seqüência, foram apresentados os conceitos de SOA,

que são importantes para entendimento da arquitetura de WIDE-PL e da composição das

aplicações Web construídas a partir do processo ADESE. Por fim, foram apresentados

conceitos de LP, em particular, o modelo de características, que é usado no decorrer do

trabalho para modelar os serviços obrigatórios e opcionais usados no WIDE-PL.

O capítulo seguinte apresenta o ADESE, um processo de desenvolvimento de

aplicações Web baseado em serviços, juntamente com os conceitos e arquitetura revisada do

ambiente WIDE-PL.

Page 40: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

40

CAPÍTULO 3

ADESE: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES

WEB BASEADO EM SERVIÇOS

Este capítulo apresenta a definição de um processo para Desenvolvimento de

Aplicações Web baseado em Serviços, que é chamado nesta dissertação de processo ADESE.

O ADESE foi concebido para executar no ambiente WIDE-PL, que segue os princípios de LP

e tem como objetivo apoiar a geração de aplicações Web baseadas em serviços.

Dessa forma, este capítulo apresenta o WIDE-PL, sua arquitetura lógica juntamente

com os seus serviços obrigatórios, e por fim, a descrição do processo ADESE.

3.1 WIDE-PL

O Computer System Group (CSG) da Universidade de Waterloo tem desenvolvido

tecnologias para portais Web desde o início dos anos 90 (COWAN, 2004). Como resultado,

uma série de portais chamados Espaço Público de Aprendizagem foram construídos. O

ambiente usado para apoiar o desenvolvimento dos portais é chamado WIDE (Waterloo

Informatics Development Environment). O WIDE abrange um grupo articulado de

frameworks baseados em XML para suporte ao desenvolvimento de aplicações Web, tais

como serviços de mapas, serviços de diagramas, serviços de relatórios, serviços de

gerenciamento, serviços de controle de acesso, serviços de pesquisa em base de dados,

serviços de notificação, serviços de agente e estrutura de gerenciamento acadêmico.

O WIDE-PL (Waterloo Informatics Development Environment - Product Line) é uma

evolução do WIDE, e tem como objetivo gerar aplicações Web baseadas em SOA seguindo os

princípios da LP (KANG, 1990) (CZARNECKI et al., 2005). O projeto preliminar de WIDE-

PL foi desenvolvido por Gimenes et al. (2005) em seu estágio de pós-doutorado na

Page 41: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

41

Universidade de Waterloo. Em WIDE-PL, os serviços utilizados em uma aplicação Web

podem ser especificados e compostos em uma linguagem de especificação e composição de

serviços. WIDE-PL é composto de serviços de domínio executados por um motor, e tem um

grupo de dados e metadados associados. Os metadados contêm os esquemas usados pelos

serviços, e os dados são associados com uma aplicação em particular. Os serviços são

coordenados pelo processo de negócio da aplicação. WIDE-PL utiliza um princípio similar ao

ambiente proposto por Ceri (2003), porém tem por objetivo gerar aplicações a partir de

serviços e de um processo de negócio explícito.

Para realização deste trabalho de mestrado, no que se refere à especificação e à

composição de serviços, foi utilizada a tecnologia de serviços Web devido à disponibilidade

de padrões e de infra-estrutura de apoio que permitem a especificação de serviços em WSDL

(CHRISTENSEN et al., 2001) e especificação de processos de negócio em BPEL (BEA,

2003). A vantagem de se utilizar uma linguagem como BPEL para compor os serviços de

aplicações que são locais, distribuídas ou baseadas em padrões da Internet, é obter uma base

tecnológica uniforme que evite a complexidade de usar tecnologias heterogêneas. No entanto,

linguagens específicas para WIDE-PL podem ser projetadas no futuro.

Uma aplicação Web é representada por um conjunto de características de alto nível

(KANG, 1990) (CZARNECKI et al., 2005). Essas características são abstrações que

representam as capacidades de aplicações Web. Cada característica de alto nível de uma

aplicação é realizada por um serviço de domínio. Cada serviço de domínio abrange as

operações e os dados necessários para realizar uma característica da aplicação (KANG et al.,

2002).

A Figura 8 ilustra o modelo de características de alto nível das aplicações Web em

WIDE-PL produzido pela ferramenta Feature Plug-in. Os demais modelos de características

Page 42: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

42

deste trabalho também seguiram essa notação. Uma aplicação Web em WIDE-PL tem ao

menos:

• um serviço de processo de negócio: responsável por coordenar a execução da

aplicação;

• um serviço de interação: responsável pela interação entre o serviço de processo

de negócio e o usuário da aplicação.

• um serviço de base de dados: responsável por qualquer interação entre o

serviço de processo de negócio e a base de dados da aplicação;

• um serviço de interface: responsável por receber dados e formatar a página que

será exibida ao usuário.

Assim, essas características são representadas como obrigatórias. Serviços opcionais

de domínio podem ser adicionados a WIDE-PL de acordo com a evolução do ambiente e as

necessidades das aplicações. Exemplos de serviços que podem ser adicionados, baseados na

estrutura atualmente disponível no WIDE são: interface interativa, multimídia e agente.

Figura 8 - Características de aplicações Web dentro do WIDE-PL.

Fonte: Figura revisada de Gimenes et al. (2005)

As características de um serviço de domínio podem ser refinadas de tal maneira que

possibilite aos clientes da aplicação configurar os serviços de acordo com suas necessidades.

A Figura 9 apresenta um exemplo de extensão do modelo de características para o serviço de

Page 43: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

43

interface interativa. Este serviço permite a definição e a operação de diversos tipos de

exposição interativa, tais como mapas, gráficos e diagrama.

Figura 9 – Modelo de características do serviço de interface interativa.

Fonte: Figura revisada de Gimenes et al. (2005)

O refinamento do modelo de características para o serviço de mapa apresenta as

características de desenho, contêiner e resolução como obrigatórias, pois elas são necessárias

em qualquer mapa, enquanto as características de interação, mensagem e pesquisa são

opcionais, podendo ser inseridas no mapa de acordo com a necessidade da aplicação.

A seção seguinte apresenta a arquitetura lógica revisada e os serviços obrigatórios do

ambiente WIDE-PL.

3.2 ARQUITETURA LÓGICA DO WIDE-PL

A concepção da arquitetura lógica de aplicações gerada por WIDE-PL tem por

objetivo deixar explícitos os serviços e o processo de negócio que controla a aplicação. Dessa

forma, a aplicação é adaptável uma vez que o processo de negócio pode ser alterado sem

necessariamente modificar os serviços. Da mesma forma, serviços podem ser adicionados e

modificados causando impacto mínimo no processo de negócio. A Figura 10 apresenta uma

visão geral da arquitetura lógica de WIDE-PL, inicialmente proposta por Gimenes et al.

(2005), e que foi revisada ao longo do desenvolvimento deste trabalho. Esta arquitetura é

composta de três camadas:

Page 44: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

44

• Coordenação: esta camada é responsável por fazer a coordenação do processo

de negócio da aplicação. Contém dois serviços, o serviço de interação, que é

responsável por fazer as interações entre o processo de negócio e o usuário, e o

serviço de processo de negócio, que é responsável por executar o processo do

negócio da aplicação.

• Aplicação: esta camada contém uma configuração dos serviços de domínio,

obrigatórios ou opcionais, selecionados para executar uma aplicação. Os

serviços de domínio são invocados pelo serviço do processo do negócio.

• Repositório de dados: esta camada contém os dados e os metadados que podem

ser usados pelos serviços da camada de aplicação.

Figura 10 - Visão geral da arquitetura lógica do WIDE-PL.

Fonte: Figura revisada de Gimenes et al. (2005)

A seqüência para execução de uma aplicação de acordo com a arquitetura lógica de

uma aplicação WIDE-PL é:

(i) a aplicação é iniciada na camada de coordenação, ativando o serviço de processo de

negócio.

Page 45: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

45

(ii) o serviço de processo de negócio faz, de acordo com a especificação do fluxo do

processo de negócio da aplicação, solicitações a outros serviços específicos de domínio

contidos na camada de aplicação;

(iii) os serviços contidos na camada de aplicação podem acessar a camada de

repositório de dados na busca por dados e metadados referentes à aplicação, como é o caso do

serviço de base de dados que busca dados na base de dados da aplicação em execução.

(iv) após as solicitações necessárias, o serviço de processo de negócio solicita ao

serviço de interface que gere o script de página a ser exibido ao usuário. Esse script é

repassado primeiramente do serviço de interface para o serviço de processo de negócio, e

posteriormente do serviço de processo de negócio para o serviço de interação, que então o

exibe ao usuário por meio de seu browser.

(v) o usuário pode fazer as interações pertinentes e enviar as requisições novamente ao

serviço de interação, que as tratam e repassam ao serviço de processo de negócio para

continuar o fluxo do processo de negócio da aplicação, consistindo no retorno ao passo (ii).

Os passos acima descritos ocorrem repetidas vezes até o encerramento do serviço de

processo do negócio, quando a aplicação é encerrada.

No ambiente WIDE-PL, o gerenciamento de processos de negócio utilizado é a

orquestração, pois o serviço de processo do negócio é o único ponto de controle, sendo o

responsável por coordenar a execução da aplicação. Dessa forma, o serviço de processo de

negócio contém o motor de execução e os outros serviços utilizados na aplicação possuem

apenas uma infra-estrutura básica capaz de executar suas partes do processo e comunicar-se

com o processo de negócio.

Page 46: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

46

3.2.1 SERVIÇOS OBRIGATÓRIOS

Esta seção apresenta os serviços obrigatórios que estão disponíveis no ambiente

WIDE-PL. Isso acontece porque esses serviços são essenciais para o funcionamento de uma

aplicação Web gerada a partir de WIDE-PL. Neste trabalho, a especificação dos serviços

segue o padrão WSDL da tecnologia de serviços Web e a especificação de processos de

negócio utiliza BPEL.

3.2.1.1 Serviço de Processo de Negócio

O serviço de processo do negócio coordena a execução da aplicação. Ele define o

comportamento da aplicação pois estabelece as regras do processo de negócio, definindo a

seqüência para invocação dos serviços participantes, ações de controle de exceções e

utilização de funções e variáveis. Somente este serviço pode interagir com os demais serviços

utilizados pela aplicação, sendo que qualquer requisição ou resposta a um serviço deve passar

por ele. Um processo de negócio é visto como um serviço composto, assim ele é um serviço

como qualquer outro, e pode ter sua especificação no padrão WSDL.

A Listagem 9 apresenta um exemplo que ilustra a definição WSDL de um processo de

negócio. Esta definição possui apenas uma operação síncrona, nesse caso chamada de

operation1, contida no elemento <portType>, que serve para iniciar o serviço e,

consequentemente, executar a especificação do processo de negócio.

Page 47: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

47

Listagem 9 - WSDL de um serviço de processo de negócio.

3.2.1.2 Serviço de Interação

O serviço de interação é responsável por fazer as interações entre o serviço de

processo de negócio e os usuários da aplicação. Este serviço deve receber um script de página

gerado no serviço de interface e repassado a ele pelo serviço de processo de negócio, e exibi-

lo ao usuário por meio de seu browser. O usuário, por sua vez, faz as interações pertinentes na

página e submete as requisições novamente ao serviço de interação, que as tratam e repassam

ao serviço de processo de negócio como variáveis para o devido processamento.

<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="SynchronousSample" targetNamespace="http://localhost/SynchronousSample/SynchronousSample" xmlns:tns="http://localhost/SynchronousSample/SynchronousSample" xmlns:ns="http://xml.netbeans.org/schema/SynchronousSample" xmlns:plink="http://schemas.xmlsoap.org/ws/2004/03/partner-link/"> <types> <xsd:schema targetNamespace="http://localhost/SynchronousSample/SynchronousSample"> <xsd:import namespace="http://xml.netbeans.org/schema/SynchronousSample" schemaLocation="SynchronousSample.xsd"/> </xsd:schema> </types> <message name="requestMessage"><part name="inputType" element="ns:typeA"/></message> <message name="responseMessage"><part name="resultType" element="ns:typeA"/></message> <portType name="portType1"> <operation name="operation1"> <input name="input1" message="tns:requestMessage"/> <output name="output1" message="tns:responseMessage"/> </operation> </portType> <binding name="binding1" type="tns:portType1"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="operation1"> <input name="input1"><soap:body use="literal"/></input>

<output name="output1"><soap:body use="literal"/></output> </operation> </binding> <service name="service1"> <port name="port1" binding="tns:binding1"><documentation/><soap:address location="http://localhost:18181/application"/></port> </service> <plink:partnerLinkType name="partnerlinktype1"> <plink:role name="partnerlinktyperole1" portType="tns:portType1"/> </plink:partnerLinkType> </definitions>

Page 48: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

48

A Figura 11 apresenta o modelo de características do serviço de interação. A

característica raiz do modelo é a Interação, e Requisição e Resposta representam

características obrigatórias deste serviço.

Figura 11 - Modelo de características do serviço de interação.

A Listagem 10 apresenta o WSDL do serviço de interação obtida a partir de seu

modelo de características. Este WSDL contém apenas a operação requestResponse

(requisição - resposta), que é responsável por receber o script de página vindo do

serviço de processo de negócio e exibi-lo ao usuário, e em seguida a interação do usuário,

recuperar as requisições, tratá-las e repassá-las ao serviço de processo de negócio.

Para o serviço de interação e para o restante dos serviços obrigatórios desenvolvidos

neste trabalho, as operações são descritas em inglês porque os serviços foram implementados

nesta língua. Ao lado do nome da operação é mostrada sua respectiva característica.

Page 49: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

49

Listagem 10 - WSDL do serviço de interação.

3.2.1.3 Serviço de Interface

O serviço de interface é responsável por receber os dados e formatar a página que será

exibida ao usuário. Com este serviço é possível definir o estilo da aplicação, escolhendo a

fonte de letra e as cores que serão usadas nas páginas. Também é possível definir o conteúdo

da página, informando o que deve ser apresentado no cabeçalho, rodapé, menu e corpo da

<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:wsInteraction/wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns2="urn:wsInteraction/types" name="wsInteraction" targetNamespace="urn:wsInteraction/wsdl"> <types><schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="urn:wsInteraction/types" xmlns:soap11-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="urn:wsInteraction/types"> <complexType name="requestResponse"> <sequence><element name="String_1" type="string" nillable="true"/></sequence> </complexType> <complexType name="requestResponseResponse"> <sequence> <element name="result" type="string" nillable="true" minOccurs="0" maxOccurs="unbounded"/> </sequence> </complexType> <element name="requestResponse" type="tns:requestResponse"/> <element name="requestResponseResponse" type="tns:requestResponseResponse"/> </schema></types> <message name="wsInteractionSEI_requestResponse"> <part name="parameters" element="ns2:requestResponse"/> </message> <message name="wsInteractionSEI_requestResponseResponse"> <part name="result" element="ns2:requestResponseResponse"/> </message> <portType name="wsInteractionSEI"> <operation name="requestResponse"> <input message="tns:wsInteractionSEI_requestResponse"/> <output message="tns:wsInteractionSEI_requestResponseResponse"/> </operation> </portType> <binding name="wsInteractionSEIBinding" type="tns:wsInteractionSEI"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="requestResponse"> <soap:operation soapAction=""/> <input><soap:body use="literal"/></input><output><soap:body use="literal"/></output> </operation> </binding> <service name="WsInteraction"> <port name="wsInteractionSEIPort" binding="tns:wsInteractionSEIBinding"> <soap:address location="http://localhost:8080/Interaction/wsInteraction" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"/> </port> </service> </definitions>

Page 50: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

50

página. Em relação ao corpo da página, o serviço está preparado para receber, tratar e exibir

no local as listas de itens e as solicitações de formulários vindas do serviço de processo de

negócio. Depois de inseridas todas as configurações para a geração da página, um script de

página é gerado e encaminhado ao serviço de processo de negócio que o repassa ao serviço de

interação para exibi-lo ao usuário.

A Figura 12 apresenta o modelo de características do serviço de interface. Este modelo

contém a característica Interface como característica raiz, e possui também as

características relacionadas ao conteúdo, que servem para incluir conteúdo em cada uma das

posições de uma página Web, e características relacionadas ao estilo, que servem para definir

cores e fontes de letras da página Web.

Figura 12 - Modelo de características do serviço de interface.

Page 51: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

51

A Listagem 11 apresenta um trecho do WSDL do serviço de interface contendo apenas

os elementos <portType>, <binding> e <service>. Este WSDL contém as operações:

• loadColor (cor): informa as cores que serão exibidas na aplicação;

• loadLetter (letra): informa o tamanho e fonte das letras que serão

exibidas na aplicação;

• loadHeading (cabeçalho): informa o texto que será exibido no cabeçalho

da aplicação;

• loadBaseboard (rodapé): informa o texto que será exibido no rodapé da

aplicação;

• loadMenu (menu): informa as opções de menu para a aplicação;

• loadForm (formulário): adiciona um formulário ao corpo da página;

• addFieldForm (campo do formulário): adiciona um campo ao

formulário que será apresentado no corpo da página;

• loadList (lista): adiciona uma lista de itens ao corpo da página;

• addLinkList (link da lista): adiciona um link a lista de itens que será

apresentada no corpo da página;

• format (formatação): gera o script de página a partir das informações

enviadas ao serviço por meio das operações anteriores e, em seguida, apaga

todas as informações atribuídas ao corpo da página.

Page 52: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

52

Listagem 11 – Trecho do WSDL do serviço de interface.

<portType name="wsInterfaceSEI"> <operation name="addFieldForm"> <input message="tns:wsInterfaceSEI_addFieldForm"/> </operation> <operation name="addLinkList"> <input message="tns:wsInterfaceSEI_addLinkList"/> </operation> <operation name="format"> <input message="tns:wsInterfaceSEI_format"/><output message="tns:wsInterfaceSEI_formatResponse"/> </operation> <operation name="loadBaseboard"> <input message="tns:wsInterfaceSEI_loadBaseboard"/> </operation> <operation name="loadColor"> <input message="tns:wsInterfaceSEI_loadColor"/> </operation> <operation name="loadForm"> <input message="tns:wsInterfaceSEI_loadForm"/> </operation> <operation name="loadHeading"> <input message="tns:wsInterfaceSEI_loadHeading"/> </operation> <operation name="loadLetter"> <input message="tns:wsInterfaceSEI_loadLetter"/> </operation> <operation name="loadList"> <input message="tns:wsInterfaceSEI_loadList"/> </operation> <operation name="loadMenu"> <input message="tns:wsInterfaceSEI_loadMenu"/> </operation> </portType> <binding name="wsInterfaceSEIBinding" type="tns:wsInterfaceSEI"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="addFieldForm"><soap:operation soapAction=""/><input><soap:body use="literal"/></input> </operation> <operation name="addLinkList"><soap:operation soapAction=""/><input><soap:body use="literal"/></input> </operation> <operation name="format"><soap:operation soapAction=""/><input><soap:body use="literal"/></input> <output><soap:body use="literal"/></output></operation> <operation name="loadBaseboard"><soap:operation soapAction=""/><input><soap:body use="literal"/></input> </operation> <operation name="loadColor"><soap:operation soapAction=""/><input><soap:body use="literal"/></input> </operation> <operation name="loadForm"><soap:operation soapAction=""/><input><soap:body use="literal"/></input> </operation> <operation name="loadHeading"><soap:operation soapAction=""/><input><soap:body use="literal"/></input> </operation> <operation name="loadLetter"><soap:operation soapAction=""/><input><soap:body use="literal"/></input> </operation> <operation name="loadList"><soap:operation soapAction=""/><input><soap:body use="literal"/></input> </operation> <operation name="loadMenu"><soap:operation soapAction=""/><input><soap:body use="literal"/></input> </operation> </binding> <service name="WsInterface"> <port name="wsInterfaceSEIPort" binding="tns:wsInterfaceSEIBinding"> <soap:address location="http://localhost:8080/Interface/wsInterface" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"/> </port> </service>

Page 53: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

53

3.2.1.4 Serviço de Base de Dados

O serviço de base de dados é responsável por qualquer interação entre o processo de

negócio e a base de dados da aplicação. Com este serviço é possível criar e atualizar a

estrutura da base de dados da aplicação, além de manipular e recuperar seus dados. A Figura

13 apresenta o modelo de características do serviço de base de dados. Este modelo contém a

característica Base de Dados como característica raiz, e possui também as características

que servem para conectar o serviço a uma base de dados e as características relacionadas aos

comandos SQL.

Figura 13 - Modelo de características do serviço de base de dados.

A Listagem 12 apresenta um trecho do WSDL do serviço de base de dados que

contém apenas os elementos <portType>, <binding> e <service>. Este WSDL

contém as operações:

• connect (conectar): conecta o serviço a base de dados usada na

aplicação;

• execute (executar): executa qualquer comando SQL para criaçao e

alteração da estrutura da base de dados da aplicação, ou comandos para

inserção, alteração e exclusão de seus dados;

Page 54: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

54

• select (selecionar): seleciona dados na base de dados da aplicação

através de comandos SQL;

• validate (validar): retorna verdadeiro para comandos SQL que

encontrem dados na base de dados. Por exemplo, verificar validade de um

acesso à área restrita.

Listagem 12 - Trecho do WSDL do serviço de base de dados.

<portType name="wsDatabaseSEI"> <operation name="connect"> <input message="tns:wsDatabaseSEI_connect"/> <output message="tns:wsDatabaseSEI_connectResponse"/> </operation> <operation name="execute"> <input message="tns:wsDatabaseSEI_execute"/> <output message="tns:wsDatabaseSEI_executeResponse"/> </operation> <operation name="select"> <input message="tns:wsDatabaseSEI_select"/> <output message="tns:wsDatabaseSEI_selectResponse"/> </operation> <operation name="validate"> <input message="tns:wsDatabaseSEI_validate"/> <output message="tns:wsDatabaseSEI_validateResponse"/> </operation> </portType> <binding name="wsDatabaseSEIBinding" type="tns:wsDatabaseSEI"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="connect"> <soap:operation soapAction=""/> <input><soap:body use="literal"/></input><output><soap:body use="literal"/></output> </operation> <operation name="execute"> <soap:operation soapAction=""/> <input><soap:body use="literal"/></input><output><soap:body use="literal"/></output> </operation> <operation name="select"> <soap:operation soapAction=""/> <input><soap:body use="literal"/></input><output><soap:body use="literal"/></output> </operation> <operation name="validate"> <soap:operation soapAction=""/> <input><soap:body use="literal"/></input><output><soap:body use="literal"/></output> </operation> </binding> <service name="WsDatabase"> <port name="wsDatabaseSEIPort" binding="tns:wsDatabaseSEIBinding"> <soap:address location="http://localhost:8080/Database/wsDatabase" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"/> </port> </service>

Page 55: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

55

3.3 O PROCESSO ADESE

O processo ADESE define as etapas a serem seguidas por um desenvolvedor para

conceber e gerar uma aplicação Web com base nos recursos disponíveis em WIDE-PL. Nesta

seção, o foco é na definição do processo, enquanto no capítulo 4 será apresentado um estudo

de caso que segue este processo.

A Figura 14 apresenta o processo ADESE representado graficamente pelo diagrama de

blocos SADT (ROSS; SCHOMAN, 1977). Essa representação contém as etapas do processo e

as informações manipuladas por ele. Os retângulos representam as etapas a serem executadas,

as entradas laterais desses retângulos representam as entradas de informações necessárias para

execução da etapa. As entradas na parte superior desses retângulos representam os controles

que governam a forma como a etapa é executada e as saídas desses retângulos representam os

resultados produzidos pela execução da etapa.

Figura 14 - Representação gráfica do processo ADESE.

A seguir são descritas as etapas do processo ADESE.

Page 56: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

56

Etapa 1 - Definição do domínio da aplicação

Nesta etapa é definido o domínio da aplicação através de uma descrição textual

simples. Esta descrição textual é tomada como base para realizar a análise de domínio que

consite em gerar os modelos de características que determinam a lista dos respectivos serviços

obrigatórios e opcionais necessários para o desenvolvimento da aplicação Web.

Etapa 2 - Desenvolvimento de serviços

Esta etapa deve ser executada cada vez que um novo serviço seja necessário para o

desenvolvimento da aplicação. Caso os serviços necessários já estejam disponíveis em WIDE-

PL, deve-se passar a etapa seguinte.

Para o desenvolvimento de cada novo serviço é necessário:

• Definir o modelo de características do serviço: consiste em definir o modelo

por meio da captura de seus atributos e variabilidades.

• Instanciar o modelo de características: consiste em selecionar uma

configuração do modelo contendo as características obrigatórias e as opcionais

a serem utilizadas na aplicação.

• Mapear o modelo de características para o diagrama de classes: consiste em

converter o modelo de características em um correspondente diagrama de

classes identificando os elementos que compõem o diagrama como classes,

relacionamentos, atributos e operações.

• Implementar o serviço a partir do diagrama de classes: consiste nos seguintes

passos:

� programar as classes encontradas no diagrama de classes;

� converter as classes em um serviço;

� especificar o serviço gerado em uma interface padronizada.

Page 57: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

57

O mapeamento do modelo de características para o diagrama de classes é um passo

importante do processo ADESE, pois converte um modelo que resume as capacidades comuns

e diferentes de uma aplicação, para um diagrama que representa a sua estrutura física. As

regras definidas neste processo para conversão do modelo de características para diagrama de

classes são:

• Identificar classes: criar uma classe para cada característica não “folha” do

modelo de características.

• Identificar relacionamentos: adicionar o relacionamento de agregação entre as

classes que tem relacionamento no modelo de características, sendo que a

classe agregadora é a classe que, no relacionamento, tem nível mais alto no

modelo de características.

• Identificar operações e atributos: transformar as características “folhas” do

modelo de características em operações ou atributos das classes já criadas,

sendo que cada característica “folha” que será transformada em operação ou

atributo deverá ser incluída na classe que representa sua respectiva

característica de nível mais alto no modelo de características.

• Identificar operações da classe principal: a característica raiz do modelo de

características é a classe principal do diagrama de classes e as operações

incluídas nesta classe serão as operações convertidas em operações do serviço.

Assim, caso alguma outra classe do diagrama contenha operações que devam

ser operações do serviço, estas operações deverão ser incluídas na classe

principal, e na implementação, as operações contidas na classe principal

deverão fazer a invocação da operação original nas outras classes.

Page 58: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

58

• Incluir operações e atributos auxiliares: operações e atributos adicionais como

os casos das operações get e set podem ser incluídos no diagrama para

auxiliarem posteriormente na execução de alguma operação do serviço.

Etapa 3 - Geração da aplicação com base nos serviços definidos

A geração da aplicação pode ser iniciada quando todos os serviços necessários

estiverem disponíveis. Esta etapa tem como objetivo gerar uma aplicação Web baseada em

serviços, de acordo com o domínio escolhido na etapa 1. As atividades que compõem esta

etapa são:

• Criação de um processo de negócio síncrono: consiste em criar a estrutura

básica do processo de negócio da aplicação. Esta estrutura básica deve conter

informações como as definições iniciais do processo, variáveis iniciais,

serviços participantes iniciais e uma definição vazia do fluxo do processo.

Como se trata de um processo síncrono, este será iniciado pela execução de

uma operação contida no serviço de processo de negócio e encerrado após a

execução de todo seu fluxo, retornando alguma informação a operação do

serviço de processo de negócio que o iniciou.

• Adição de serviços: consiste em adicionar à especificação do processo de

negócio da aplicação os serviços necessários para a geração da aplicação. Os

passos para adicionar os serviços são:

� encontrar e copiar para a ferramenta de desenvolvimento de escolha

do desenvolvedor a especificação de cada um dos serviços

necessários para geração da aplicação;

� configurar a especificação de cada serviço necessário para a geração

da aplicação incluindo uma extensão da linguagem, que são códigos

Page 59: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

59

da linguagem usados apenas em casos específicos, com a finalidade

de permitir a comunicação entre o processo de negócio e os seus

respectivos serviços.

� adicionar os serviços já configurados ao processo de negócio;

• Especificação do processo de negócio: consiste em complementar a

especificação do processo de negócio com o fluxo da aplicação, de acordo com

as regras da linguagem utilizada, as regras de negócio do domínio da aplicação

e as regras para execução, que estabelecem a seqüência em que os serviços

devem ser executados, de acordo com a arquitetura lógica do WIDE-PL.

3.4 CONSIDERAÇÕES FINAIS

Neste capítulo foi apresentado o processo ADESE e o contexto em que foi

desenvolvido. Este processo e a revisão da arquitetura de WIDE-PL contribuem para

consolidação de WIDE-PL, oferecendo assim um processo rápido e inovador para o

desenvolvimento de aplicações Web.

Na etapa de desenvolvimento de serviços do processo ADESE foi apresentada uma

forma de mapeamento do modelo de características para o diagrama de classes. Em Czarnecki

e Antkiewicz (2005) é proposta uma abordagem geral para mapeamento do modelo de

características em outros modelos, com foco para o diagrama de atividades UML, que

consiste em avaliação de condições e expressões, remoção de elementos e processamento de

mensagens. Esta abordagem não foi utilizada aqui devido a especificidade do mapeamento de

serviços.

O capítulo 4 apresenta a avaliação do processo ADESE por meio de um estudo de

caso.

Page 60: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

60

CAPÍTULO 4

AVALIAÇÃO DO PROCESSO ADESE

Este capítulo apresenta a avaliação do processo ADESE por meio de um estudo de

caso, bem como os resultados obtidos com as aplicações Web desenvolvidas.

4.1 ESTUDO DE CASO

O estudo de caso consiste de duas aplicações Web independentes provenientes de

diferentes domínios, uma do domínio de controle de estoques e outra do domínio de locação

de vídeos. A escolha desses domínios se deve ao fato destes serem bem conhecidos da

sociedade, o que facilita o entendimento de seus processos de negócio. As aplicações

concebidas utilizam os mesmos serviços obrigatórios, porém seus respectivos serviços de

processo de negócio são compostos de acordo com as regras específicas de cada domínio.

Além disso, as aplicações possuem serviços opcionais que são necessários a cada domínio.

As ferramentas utilizadas para o desenvolvimento do estudo de caso são: (i) Netbeans

IDE 5.5 (NETBEANS, 2006) com a função de programar, compilar e executar os serviços e

os processos de negócio; (ii) Feature Plug-in (ANTKIEWICZ, CZARNECKI, 2004) com a

função de definir o modelo de características; e, (iii) o banco de dados MySQL (MYSQL,

2006) com a função de armazenar e buscar dados usados nas aplicações.

No decorrer desta seção é apresentado o desenvolvimento das aplicações Web

seguindo as etapas do processo ADESE.

Page 61: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

61

4.1.1 Aplicação Web de Locação de Vídeos

4.1.1.1 Etapa 1 - Definição do Domínio da Aplicação

Esta aplicação deve controlar a locação de vídeos, assim deve possuir cadastros de

clientes, filmes, fitas, controle de locações, reservas e pagamentos, além de controle de acesso

dos usuários da aplicação.

Para o desenvolvimento desta aplicação serão necessários os serviços obrigatórios que

são os serviços de processo de negócio, interação, interface e base de dados, conforme

descrito no capítulo 3, além do serviço opcional de calendário. Este serviço opcional é

responsável por informar datas e horários à aplicação, como a data do dia, o horário do

momento, diferença de dias entre datas, calcular uma data a partir da soma de dias, entre

outras.

4.1.1.2 Etapa 2 - Desenvolvimento de Serviços

O desenvolvimento de serviços é uma etapa do processo ADESE que deve ser

executada cada vez que um novo serviço seja necessário para o desenvolvimento da

aplicação. Nas seções a seguir será apresentado o desenvolvimento do serviço opcional de

calendário seguindo as regras desta etapa do processo.

Definir o Modelo de Características do Serviço

Para definir o modelo de características do serviço de calendário é necessário

especificar as características comuns e diferentes deste domínio. O serviço deve oferecer as

seguintes funcionalidades:

• informar a data do dia, de forma inteira (ex: dd/mm/aaaa), ou em partes

separadas como somente o dia, somente o mês, somente o ano e somente o dia

da semana;

Page 62: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

62

• informar o horário do momento, de forma inteira (ex: hh:mm:ss), ou em partes

separadas como somente a hora ou somente o minuto;

• informar a diferença de dias entre a data do dia e uma data qualquer informada;

• calcular uma data a partir de um número de dias informado.

A Figura 15 apresenta o modelo de características do serviço de calendário

desenvolvido a partir destas definições. Este modelo contém a característica Calendário

como característica raiz, e possui o restante das características divididas em dois grupos

maiores chamados Data e Horário. As características Hoje, Dia, Mês e Ano, contida no

grupo Data, e Agora, Hora e Minuto, contida no grupo Horário, são características

obrigatórias no modelo, pois são características essenciais para o seu funcionamento.

Figura 15 - Modelo de características do serviço de calendário.

Instanciar o Modelo de Características

Para instanciar o modelo de características é preciso definir uma configuração deste

contendo as características obrigatórias e opcionais a serem utilizadas na aplicação. As

características obrigatórias estarão presentes em qualquer configuração do modelo, enquanto

as características opcionais necessárias na configuração deverão ser marcadas.

A Figura 16 apresenta o modelo de características do serviço de calendário já

instanciado com todas as suas características opcionais marcadas. Isso significa que o modelo

Page 63: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

63

deverá ser transformado em um novo serviço com todas as suas funções disponíveis. O

modelo de características pode ser instanciado com outras configurações para uso em outras

aplicações. Neste caso, o desenvolvimento do serviço necessitará ser refeito.

Figura 16 – Modelo de características já instanciado do serviço de calendário.

Mapear o Modelo de Característica para o Diagrama de Classes

Para mapear o modelo de características instanciado para o diagrama de classes UML

foram seguidas regras de conversão definidas nesta etapa do processo que consiste em

identificar classes, relacionamentos, atributos e operações para o diagrama, conforme definido

no capítulo 3. Os passos de identificação foram:

• identificação de classes: foram adicionadas ao diagrama as classes

Calendario, Data e Horario por não serem características “folhas” no

modelo de características;

• identificação de relacionamentos: foram adicionados ao diagrama de classe,

relacionamentos de agregação entre as classes Calendario e Data; e,

Calendario e Horario, pois eles têm relacionamentos no modelo de

características, sendo que a classe agregadora é a classe Calendario por ser a

característica de mais alto nível;

Page 64: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

64

• identificação de operações e atributos: foram adicionadas às classes que já

constam no diagrama, operações e atributos que representam suas respectivas

características “folhas” no modelo de características. Assim, foram adicionadas

à classe Data, as operações hoje, dia, mes, ano, diaSemana,

diferencaEntreDatas e calcularData e, à classe Horario, as

operações agora, hora e minuto;

• identificação das operações na classe principal: como a classe principal deste

diagrama é a classe Calendario, as operações que serão convertidas em

operações do serviço devem ser incluídas nesta classe. Esse é o caso das

operações hoje, dia, mes, ano, diaSemana, diferencaEntreDatas,

calcularData, agora, hora e minuto. Na etapa de implementação do

serviço, estas operações contidas na classe principal deverão fazer a invocação

da operação original nas outras classes, onde consta realmente a programação

da operação.

A Figura 17 apresenta o diagrama de classes produzido para o serviço de calendário

seguindo as regras de conversão detalhadas acima.

Page 65: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

65

Figura 17 - Diagrama de classes do serviço de calendário.

Implementar o Serviço a partir do Diagrama de Classes

Para implementar o serviço é preciso inicialmente programar e compilar todas as

classes que compõem o diagrama de classes. Esta programação é feita manualmente pelo

desenvolvedor, mas com auxílio de alguma ferramenta de desenvolvimento, como é o caso da

ferramenta NetBeans IDE 5.5 que foi utilizada neste trabalho.

A Listagem 13 apresenta um exemplo da programação da operação diaSemana na

classe Calendario, que é a classe principal do serviço e onde constam as operações que

serão operações do serviço. Nesta operação é feita apenas a invocação da operação

diaSemana que consta na classe Data. Por sua vez, na Listagem 14 é apresentado um

exemplo da programação da operação diaSemana na classe Data, que é a classe original da

operação, e onde consta realmente a programação de sua função.

Page 66: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

66

Listagem 13 - Exemplo de programação da operação diaSemana na classe Calendario.

Listagem 14 - Exemplo de programação da operação diaSemana na classe Data.

Após a programação de todas as classes, o próximo passo é convertê-las em um

serviço. Os procedimentos para conversão de classes em serviços variam de acordo com a

ferramenta que está sendo utilizada. Assim, os procedimentos utilizados neste trabalho para

conversão das classes em serviço não serão descritos aqui, pois foram utilizados os

procedimentos disponíveis em Netbeans (2006).

A Figura 18 apresenta a estrutura obtida para o serviço de calendário criado pela

ferramenta Netbeans. A pasta Serviços Web contém o serviço, que tem o nome de

wsCalendario e possui dez operações que são:

• hoje: retorna a data atual;

• dia: retorna o dia do mês atual;

• mes: retorna o mês atual;

• ano: retorna o ano atual;

• diaSemana: retorna o dia da semana atual;

• diferencaEntreDatas: deve ser informada uma data qualquer, e é

retornada a quantidade de dias entre essa data e a data de atual;

• calcularData: deve ser informada uma quantidade de dias, e é retornada

uma data que é a soma destes dias a data atual;

private Data data=new Data(); public String diaSemana() { return data.diaSemana(); }

public String diaSemana() { int s= calendar.get(Calendar.DAY_OF_WEEK); String[] days = {"Domingo", "Segunda-feira", "Terça-feira", "Quarta-feira", "Quinta-feira", "Sexta-feira", "Sábado"};

return days[s-1]; }

Page 67: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

67

• agora: retorna o horário atual;

• hora: retorna a hora atual;

• minuto: retorna o minuto atual.

Estas são as mesmas operações que estão na classe Calendario e que foram

convertidas em operações do serviço. A pasta calendario contém os arquivos que foram

gerados a partir do diagrama de classes.

Figura 18 - Estrutura do serviço de calendário na ferramenta Netbeans 5.5.

Após o desenvolvimento do serviço de calendário, é necessário desenvolver a sua

especificação em uma interface padronizada que defina suas funcionalidades e permita o uso

por outras aplicações. Conforme já descrito, essa especificação é feita em WSDL. Algumas

Page 68: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

68

ferramentas, como é o caso da ferramenta Netbeans IDE 5.5 utilizada neste trabalho, criam

automaticamente o documento WSDL correspondente ao serviço. Um trecho do documento

WSDL gerado pela ferramenta que contém apenas o elemento <portType> é apresentado na

Listagem 15.

Listagem 15 - Trecho do WSDL que contém as operações do serviço de calendário.

... <portType name="wsCalendarioSEI"> <operation name="agora"> <input message="tns:wsCalendarioSEI_agora"/> <output message="tns:wsCalendarioSEI_agoraResponse"/> </operation> <operation name="ano"> <input message="tns:wsCalendarioSEI_ano"/> <output message="tns:wsCalendarioSEI_anoResponse"/> </operation> <operation name="calcularData"> <input message="tns:wsCalendarioSEI_calcularData"/> <output message="tns:wsCalendarioSEI_calcularDataResponse"/> </operation> <operation name="dia"> <input message="tns:wsCalendarioSEI_dia"/> <output message="tns:wsCalendarioSEI_diaResponse"/> </operation> <operation name="diaSemana"> <input message="tns:wsCalendarioSEI_diaSemana"/> <output message="tns:wsCalendarioSEI_diaSemanaResponse"/> </operation> <operation name="diferencaEntreDatas"> <input message="tns:wsCalendarioSEI_diferencaEntreDatas"/> <output message="tns:wsCalendarioSEI_diferencaEntreDatasResponse"/> </operation> <operation name="hoje"> <input message="tns:wsCalendarioSEI_hoje"/> <output message="tns:wsCalendarioSEI_hojeResponse"/> </operation> <operation name="hora"> <input message="tns:wsCalendarioSEI_hora"/> <output message="tns:wsCalendarioSEI_horaResponse"/> </operation> <operation name="mes"> <input message="tns:wsCalendarioSEI_mes"/> <output message="tns:wsCalendarioSEI_mesResponse"/> </operation> <operation name="minuto"> <input message="tns:wsCalendarioSEI_minuto"/> <output message="tns:wsCalendarioSEI_minutoResponse"/> </operation> </portType> ...

Page 69: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

69

4.1.1.3 Etapa 3 - Geração da Aplicação com Base nos Serviços Definidos

As seções seguintes apresentam a geração da aplicação locação de vídeos seguindo as

atividades relacionadas no capítulo 3. Também serão apresentados, durante a descrição das

atividades, trechos importantes da especificação em BPEL com o intuito de ilustrar esta etapa

do processo.

Criação de um Processo de Negócio Síncrono

A criação de um processo de negócio síncrono, especificado em BPEL, representa a

primeira atividade para a geração de uma aplicação com base nos serviços definidos. A

estrutura básica do processo criado é apresentada na Figura 19 por uma representação gráfica

produzida pela ferramenta Netbeans 5.5. O processo criado consiste em um serviço chamado

BusinessProcess, que representa o serviço obrigatório de processo de negócio, contendo

uma única operação chamada operation1, que quando executada, iniciará a execução do

processo de negócio da aplicação de locação de vídeos. As regras de negócio da aplicação no

decorrer do desenvolvimento serão incluídas entre o início (start) e o final (end) do

processo.

Figura 19 - Novo processo de negócio síncrono.

Page 70: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

70

A Listagem 16 apresenta a especificação em BPEL do processo de negócio criado. O

elemento <process> define as configurações iniciais do processo que consiste do seu nome,

neste caso chamado de Locadora, e as referências a documentos WSDL e a arquivos de

esquemas XML. O elemento <partnerLinks> define os serviços participantes que

interagem com o processo do negócio durante sua execução, que neste momento do

desenvolvimento possui apenas o serviço BusinessProcess. O elemento <variables>

define as variáveis de dados usadas pelo processo, que neste momento do desenvolvimento

possuem apenas as variáveis inputVar e outputVar que servem para auxiliar o serviço

BusinessProcess respectivamente para iniciar e encerrar a execução do processo. O

elemento <sequence> representa a definição do comportamento da aplicação, pois neste

elemento são incluídas as regras de negócio do domínio da aplicação por meio das atividades

básicas e estruturais de BPEL. Neste momento do desenvolvimento, as definições possuem

apenas as atividades para receber (receive) e responder (reply) a solicitação do serviço

BusinessProcess para o início e encerramento do processamento.

Page 71: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

71

Listagem 16 - Trecho BPEL contendo as definições inicias do processo.

Adição de Serviços

A adição de serviços ao processo de negócio consiste em incorporar todos os serviços

necessários à especificação de processo de negócio para permitir a composição da aplicação.

O passo inicial consiste em encontrar a especificação de cada um dos serviços necessários à

geração da aplicação e copiar estas especificações para a ferramenta de desenvolvimento para

que possam ser configuradas.

Para a configuração do serviço é necessário incluir em cada especificação de serviço

necessário para a geração da aplicação, uma extensão da linguagem, com a finalidade de

estabelecer a comunicação entre o processo de negócio e os seus respectivos serviços. A

Listagem 17 apresenta um exemplo da extensão da linguagem incluída na especificação do

serviço de interface para permitir a comunicação entre este serviço e o processo de negócio da

aplicação. Esta extensão possui o nome de wsInterfaceSEILinkType e a definição das

<process name="Locadora" targetNamespace="http://enterprise.netbeans.org/bpel/SynchronousSample/SynchronousSample_1" xmlns="http://schemas.xmlsoap.org/ws/2004/03/business-process/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:bpws="http://schemas.xmlsoap.org/ws/2004/03/business-process/" xmlns:wsdlNS="http://enterprise.netbeans.org/bpel/SynchronousSample/SynchronousSample_1" xmlns:ns1="http://localhost/SynchronousSample/SynchronousSample" > <partnerLinks> <partnerLink name="BusinessProcess" partnerLinkType="ns1:partnerlinktype1" myRole="partnerlinktyperole1"/> </partnerLinks> <variables> <variable name="inputVar" messageType="ns1:requestMessage"/> <variable name="outputVar" messageType="ns1:responseMessage"/> </variables> <sequence> <receive name="start" partnerLink="BusinessProcess" operation="operation1" portType="ns1:portType1" variable="inputVar" createInstance="yes"/> <assign name="Assign1"> <copy><from>$inputVar.inputType/paramA</from><to>$outputVar.resultType/paramA</to></copy> </assign> <reply name="end" partnerLink="BusinessProcess" operation="operation1" portType="ns1:portType1" variable="outputVar"/> </sequence> </process>

Page 72: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

72

funções do serviço disponíveis ao processo de negócio é feita por meio de uma referência aos

dados contidos no elemento <portType> descrito por

portType="tns:wsInterfaceSEI".

Listagem 17 - Exemplo da extensão BPEL incluída no serviço de interface.

O passo final desta atividade é adicionar os serviços já configurados ao processo de

negócio. A Figura 20 mostra a representação gráfica do processo de negócio da aplicação de

locação de vídeos já com os serviços obrigatórios e o serviço opcional de calendário

adicionados. Em cada serviço apresentado é possível visualizar as suas respectivas operações,

permitindo assim a posterior interação de qualquer operação destes serviços, uma ou mais

vezes, com o processo de negócio. Esta figura também apresenta a descrição em BPEL

responsável por os serviços participantes constarem no processo, sendo que cada linha entre

os elementos <partnerLinks> e </partnerLinks> representa um serviço, caracterizado

por um nome e uma referência a sua especificação em WSDL que identificam as suas

operações.

<plnk:partnerLinkType name="wsInterfaceSEILinkType"> <plnk:role name="wsInterfaceSEIRole" portType="tns:wsInterfaceSEI"/> </plnk:partnerLinkType>

Page 73: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

73

Figura 20 - Aplicação locação de vídeos com os serviços já adicionados.

Page 74: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

74

Especificação do Processo de Negócio

A especificação do processo de negócio consiste em definir o fluxo da aplicação de

acordo com as regras da linguagem, regras de negócio do domínio da aplicação e as regras

para execução, que estabelecem a seqüência em que os serviços devem ser executados, de

acordo com a arquitetura lógica do WIDE-PL. Em BPEL, a seqüência de passos que

representa o fluxo do serviço de processo de negócio é definida por meio de atividades

básicas e estruturais.

Para iniciar a especificação é necessário declarar as variáveis do processo. As

variáveis são usadas para troca de mensagens entre as operações durante o decorrer da

execução do processo. A Listagem 18 apresenta algumas destas variáveis que possuem suas

estruturas definidas de acordo com a referência a algum elemento <message> contido em um

WSDL de serviço participante (ex: messageType="ns3:wsDatabaseSEI_connect").

Listagem 18 - Trecho BPEL com algumas declarações de variáveis.

A execução do processo de negócio da aplicação de locação de vídeos é iniciada

quando recebe uma solicitação do serviço de processo de negócio juntamente com uma

variável de início chamada neste caso de inputVar. A Listagem 19 apresenta estas

definições.

Listagem 19 - Trecho BPEL responsável por iniciar o processo.

<variables> <variable name="ConnectIn1" messageType="ns2:wsDatabaseSEI_connect"/> <variable name="ConnectOut1" messageType="ns2:wsDatabaseSEI_connectResponse"/> <variable name="FormatFalse" messageType="ns3:wsInterfaceSEI_format"/> <variable name="LoadBaseboardIn1" messageType="ns3:wsInterfaceSEI_loadBaseboard"/> . . <variable name="outputVar" messageType="ns1:responseMessage"/> <variable name="inputVar" messageType="ns1:requestMessage"/> </variables>

<sequence> <receive name="start" partnerLink="BusinessProcess" operation="operation1" portType="ns1:portType1" variable="inputVar" createInstance="yes"/>

Page 75: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

75

A Listagem 20 apresenta a atribuição de valores às variáveis usadas para fazer a

conexão com a base de dados da aplicação. São atribuídos valores às variáveis de login,

password, localhost e drive respectivamente. Na seqüência é invocada a operação connect

do serviço de base de dados enviando as variáveis como parâmetro para validar a conexão

com a base de dados.

Listagem 20 – Trecho BPEL que invoca a operação connect do serviço de base de dados.

Assim como a conexão com a base de dados, outros valores que são utilizados durante

a execução da aplicação também são atribuídos neste momento da mesma forma. Alguns

exemplos são os valores de cabeçalho, rodapé, menu e estilo da página como cores e fontes de

letras.

O corpo da página deve ser sempre atualizado com informações novas pertinentes às

interações com o usuário. Para isso é necessário enviar as informações que deverão ser

mostradas no corpo da página ao serviço de interface. A Listagem 21 apresenta a atribuição

de valores a variáveis e a invocação de operações que solicitam a inclusão de linha de texto de

formulário para corpo da página em uma tela de controle de acesso de usuários.

<assign name="Assign1"> <copy><from>string('')</from><to>$ConnectIn1.parameters/String_1</to></copy> <copy><from>string('')</from><to>$ConnectIn1.parameters/String_2</to></copy> <copy><from>string('jdbc:mysql://localhost/mestrado')</from><to>$ConnectIn1.parameters/String_3</to></copy> <copy><from>string('com.mysql.jdbc.Driver')</from><to>$ConnectIn1.parameters/String_4</to></copy> . . . </assign> <invoke name="ConnectDB" partnerLink="Database" operation="connect" portType="ns2:wsDatabaseSEI" inputVariable="ConnectIn1" outputVariable="ConnectOut1"/>

Page 76: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

76

Listagem 21 - Trecho BPEL que atribui valores a variáveis e invoca operações.

Após o envio ao serviço de interface de todos os dados que deverão ser apresentados

aos usuários, a operação de formatação que gera o script de página é invocada. O script

gerado retorna ao processo de negócio que o encaminha ao serviço de interação para ser

exibido ao usuário por meio de seu browser. O usuário, por sua vez, deverá fazer as interações

pertinentes na página exibida e submeter às requisições novamente ao serviço de interação. A

Listagem 22 apresenta a situação descrita, enquanto a Figura 21 apresenta a página que será

gerada quando este trecho do fluxo BPEL for executado.

Listagem 22 - Trecho BPEL que formata a página e envia ao serviço de interação.

<copy><from>string('TEXT')</from><to>$AddFieldFormIn1.parameters/String_1</to></copy> <copy><from>string('E-mail')</from><to>$AddFieldFormIn1.parameters/String_2</to></copy> <copy><from>string('email')</from><to>$AddFieldFormIn1.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_5</to></copy> <copy><from>string('PASSWORD')</from><to>$AddFieldFormIn2.parameters/String_1</to></copy> <copy><from>string('Senha')</from><to>$AddFieldFormIn2.parameters/String_2</to></copy> <copy><from>string('senha')</from><to>$AddFieldFormIn2.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_5</to></copy> . . . </assign> <invoke name="AddFieldForm_Email" partnerLink="Interface" operation="addFieldForm" portType="ns3:wsInterfaceSEI" inputVariable="AddFieldFormIn1"/> <invoke name="AddFieldForm_Password" partnerLink="Interface" operation="addFieldForm" portType="ns3:wsInterfaceSEI" inputVariable="AddFieldFormIn2"/>

<invoke name="Page1" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatFalse" outputVariable="Page"/> <assign name="Assign3"> <copy><from>$Page.result/result</from><to>$ResultInteraction.result/result</to></copy> </assign> <invoke name="Interaction1" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/>

Page 77: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

77

Figura 21 - Página que será gerada para a validação do usuário.

Após a interação com o usuário, os dados de entrada são enviados ao processo de

negócio que os concatena com um comando SQL de validação de acesso. Este comando é

atribuído a uma variável que é enviada como parâmetro na invocação da operação validade

do serviço de base de dados. A operação retorna um valor boolean referente ao resultado da

validação dos dados do usuário. Este resultado será usado como condição, sendo que, em caso

de verdade, entrará em um laço que permitirá a continuidade do processo da aplicação. A

Listagem 23 apresenta estas definições.

Listagem 23 – Trecho BPEL que contém a validação do usuário da aplicação.

<assign name="Assign2"> <copy><from>concat('select * from locadora_usuario where email=', $ResultInteraction.result/result, ' and senha=', $ResultInteraction.result/result)</from><to>$SqlValidade.parameters/String_1</to></copy> </assign> <invoke name="ValidadeUser" partnerLink="Database" operation="validate" portType="ns4:wsDatabaseSEI" inputVariable="SqlValidade" outputVariable="resulLogin"/> . . <while name="While_login"> <condition> ( $resulLogin.result/result = true() ) </condition>

Page 78: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

78

A Figura 22 apresenta a página que será gerada e apresentada ao usuário através do

serviço de interação quando o resultado da validação dos dados do usuário for verdadeiro.

Figura 22 - Página que será gerada quando o resultado da validação for verdadeira.

Para cada uma das funções da aplicação como cadastrar, locar, efetuar pagamento e

reservar filmes, os procedimentos para o processo de negócio são semelhantes aos já citados.

É necessário informar ao serviço de interface os dados que se deseja exibir no corpo da página

e solicitar a criação do script que será exibido ao usuário através do serviço de interação.

Para casos em que é necessário exibir uma lista de dados que se encontra na base de dados, a

única diferença é recuperar os dados antes de exibi-los através do serviço de base de dados, e

repassá-lo ao serviço de interface. A Listagem 24 apresenta um exemplo deste caso, em que

todos os clientes são listados e repassados ao serviço de interface.

Page 79: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

79

Listagem 24 - Trecho BPEL para listar clientes e repassa-los ao serviço de interface.

Para finalizar o processo de negócio e consequentemente a aplicação, é necessário

selecionar a opção correta no menu da aplicação. Esta interação do usuário leva ao

fechamento dos laços como apresentados na Listagem 25. O processo é finalizado e uma

variável de saída chamada neste caso de outputVar é enviada como retorno ao serviço de

processo de negócio da aplicação de locação de vídeos.

Listagem 25 - Trecho BPEL responsável por finalizar o processo.

O Apêndice A apresenta a descrição BPEL completa do processo de negócio da

aplicação locação de vídeos.

<assign name="Assign_1_1"> <copy><from>string('select id, nome, cpf, telefone from locadora_cliente order by nome')</from><to>$SqlSelect.parameters/String_1</to></copy> </assign> <invoke name="ListClientes" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <assign name="Assign_1_2"> . . <copy><from>string('Clientes')</from><to>$LoadListIn1.parameters/String_1</to></copy> <copy><from>$ResultSelect.result/result</from><to>$LoadListIn1.parameters/String_2</to></copy> </assign> <invoke name="LoadList_Cliente" partnerLink="Interface" operation="loadList" portType="ns2:wsInterfaceSEI" inputVariable="LoadListIn1"/>

. . <if name="If_End"> <assign name="Assign_9_1"> <copy><from>'Usuario desconectado'</from><to variable="PageInteraction"/></copy> <copy><from>false()</from><to>$resulLogin.result/result</to></copy> </assign> </if> </sequence> </while> <invoke name="PageEnd" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <reply name="end" partnerLink="BusinessProcess" operation="operation1" portType="ns1:portType1" variable="outputVar"/> </sequence> </process>

Page 80: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

80

4.1.2 Aplicação Web de Controle de Estoque

4.1.2.1 Etapa 1 - Definição do Domínio da Aplicação

Esta aplicação deve controlar a compra e venda de produtos de uma empresa, assim

deve possuir cadastros de clientes, fornecedores, produtos, controle de compras e vendas,

além de controle de acesso de usuários à aplicação.

Para o desenvolvimento desta aplicação serão necessários os serviços obrigatórios que

são os serviços de processo de negócio, interação, interface e base de dados, além do serviço

opcional de matemática básica. Este serviço opcional terá as operações básicas da matemática

que são adição, subtração, multiplicação e divisão, e será responsável por calcular a

quantidade disponível de um produto no estoque após uma compra ou uma venda.

4.1.2.2 Etapa 2 - Desenvolvimento de Serviços

Para a geração da aplicação de controle de estoque é necessário o desenvolvimento do

serviço de matemática básica. O desenvolvimento deste serviço seguiu os mesmos passos

apresentados para o serviço de calendário utilizado na aplicação locação de vídeos.

A Figura 23 apresenta o modelo de características do serviço de matemática básica.

Este modelo contém a característica Matemática Básica como característica raiz, e as

características Adição, Subtração, Multiplicação e Divisão que representam as

operações básicas da matemática.

Figura 23 - Modelo de características do serviço de matemática básica.

Page 81: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

81

A Figura 24 apresenta a estrutura obtida para o serviço de matemática básica criado

pela ferramenta Netbeans. A pasta Serviços Web contém o serviço, que tem o nome de

wsMatematicaBasica e possui as operações:

• adicao: retorna o resultado da soma dos valores informados;

• subtracao: retorna o resultado do primeiro valor informado subtraído pelo

segundo valor informado;

• multiplicacao: retorna o resultado da multiplicação dos valores

informados;

• divisao: retorna o resultado do primeiro valor informado dividido pelo

segundo valor informado;

Figura 24 - Estrutura do serviço de matemática básica na ferramenta Netbeans 5.5.

A Listagem 26 apresenta um trecho do WSDL do serviço de matemática básica que

contém apenas o elemento <portType>.

Page 82: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

82

Listagem 26 - Trecho do WSDL que contém as operações do serviço de matemática básica.

4.1.2.3 Etapa 3 - Geração da Aplicação com Base nos Serviço Definidos

As seções seguintes apresentam a geração da aplicação controle de estoque seguindo

as atividades relacionadas no capítulo 3. Também serão apresentados, durante a descrição

dessas atividades, trechos importantes da especificação em BPEL com o intuito de ilustrar

esta etapa do processo e compara-lo com a aplicação locação de vídeos desenvolvida.

Criação de um Processo de Negócio Síncrono

A criação de um processo de negócio síncrono para a aplicação controle de estoque

seguiu exatamente os mesmos procedimentos apresentados para o processo de negócio da

aplicação de locação de vídeos. Assim, até este momento, os processos de negócio das

aplicações possuem apenas o nome do processo como diferenças entre si.

… <portType name="wsMatematicaBasicaSEI"> <operation name="adicao"> <input message="tns:wsMatematicaBasicaSEI_adicao"/> <output message="tns:wsMatematicaBasicaSEI_adicaoResponse"/> </operation> <operation name="divisao"> <input message="tns:wsMatematicaBasicaSEI_divisao"/> <output message="tns:wsMatematicaBasicaSEI_divisaoResponse"/> </operation> <operation name="multiplicacao"> <input message="tns:wsMatematicaBasicaSEI_multiplicacao"/> <output message="tns:wsMatematicaBasicaSEI_multiplicacaoResponse"/> </operation> <operation name="subtracao"> <input message="tns:wsMatematicaBasicaSEI_subtracao"/> <output message="tns:wsMatematicaBasicaSEI_subtracaoResponse"/> </operation> </portType> …

Page 83: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

83

Adição de Serviços

A adição de serviços ao processo de negócio da aplicação controle de estoque segue os

mesmos procedimentos apresentados para a adição de serviços ao processo de negócio da

aplicação locação de vídeos.

A Figura 25 mostra a representação gráfica do processo de negócio da aplicação de

controle de estoque com os serviços necessários para composição da aplicação já adicionados.

Estes serviços são os serviços obrigatórios e o serviço opcional de matemática básica. Nesta

figura também é possível visualizar as operações que compõem cada serviço e a descrição em

BPEL responsável por os serviços constarem no processo.

Page 84: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

84

Figura 25 - Aplicação controle de estoque com os serviços já adicionados.

Page 85: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

85

Especificação do Processo de Negócio

A especificação do processo de negócio da aplicação de controle de estoque segue os

mesmos procedimentos descritos para a aplicação de locação de vídeos. A diferença entre a

aplicação de locação de vídeos, a aplicação controle de estoque e qualquer outra aplicação que

venha a ser desenvolvida seguindo o processo ADESE está nas regras de negócio da

aplicação. Dessa forma, para cada aplicação devem ser definidas as configurações do

processo como cores e fontes, a base de dados que será usada, as informações que serão

exibidas no cabeçalho, rodapé, menu e principalmente no corpo da página. As regras da

linguagem de especificação e as regras para execução da arquitetura lógica de WIDE-PL não

mudam de uma aplicação para outra.

A Listagem 27 apresenta um trecho BPEL do processo de negócio da aplicação

controle de estoque em que são atribuídos valores a variáveis que devem ser apresentados no

cabeçalho, rodapé e menu nesta aplicação, como é o caso da variável cabecalho. Estas

variáveis são posteriormente enviadas como parâmetros na invocação das operações do

serviço de interface com o intuito de configurar o serviço (ex: partnerLink="Interface"

operation="loadHeading" inputVariable="LoadHeadingIn1" ).

Listagem 27 - Trecho BPEL em que são configurados cabeçalho, rodapé e menu.

<assign name="Assign1"> . . <copy><from>string('Sistema de Estoque')</from><to>$LoadHeadingIn1.parameters/String_1</to></copy> <copy><from>string('... aplicaçao Web de controle de estoque para trabalho de mestrado ...')</from><to>$LoadBaseboardIn1.parameters/String_1</to></copy> <copy><from>string('Cliente;aaa=1//Fornecedor;aaa=2//Produto;aaa=3//Compra;aaa=4//Venda;aaa=5//Sair;aaa=9')</from><to>$LoadMenuIn1.parameters/String_1</to></copy> . . </assign> <invoke name="LoadHeading" partnerLink="Interface" operation="loadHeading" inputVariable="LoadHeadingIn1" portType="ns2:wsInterfaceSEI" /> <invoke name="LoadBaseboard" partnerLink="Interface" operation="loadBaseboard" inputVariable="LoadBaseboardIn1" portType="ns2:wsInterfaceSEI" /> <invoke name="LoadMenu" partnerLink="Interface" operation="loadMenu" inputVariable="LoadMenuIn1" portType="ns2:wsInterfaceSEI" />

Page 86: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

86

A Figura 26 mostra a página que será gerada e apresentada ao usuário da aplicação de

controle de estoque quando o resultado da validação dos dados do usuário for verdadeiro. A

estrutura da página apresentada nesta figura é semelhante àquela apresentada na Figura 22

para a aplicação locação de vídeos, já que os scripts de página são produzidos pelo mesmo

serviço de interface. Entretanto, cores, fontes, dados do cabeçalho, menu e rodapé são

diferentes, pois foram definidos de acordo com as regras de negócio da aplicação.

Figura 26 - Página que será gerada com a execução da aplicação controle de estoque.

O Apêndice B apresenta a descrição BPEL completa do processo de negócio da

aplicação controle de estoque.

4.1.3 Execução das Aplicações

Para completar o estudo de caso é necessário um motor BPEL eficiente para

executar as especificações dos processos de negócio das aplicações. Embora alguns motores

BPEL tenham sido testados no contexto deste trabalho, como o motor embutido no Netbeans

Page 87: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

87

5.5 (NETBEANS, 2006), Bexee (BEXEE, 2007) e PXE (PXE, 2007), nenhum se mostrou

adequado, ou por dificuldades de acesso, ou instalação ou disponibilidade. Assim, optou-se

por simular os processos de negócio em um servlet Java, sendo apenas um servlet por

aplicação, e nele invocar as operações do serviço na mesma seqüência em são invocados no

processo de negócio em BPEL. Soluções mais recentes permitem inclusive a conversão

automática de BPEL para Java (B2J, 2007).

Os servlets das aplicações são ativados pela chamada de seu endereço no browser. A

Listagem 28 apresenta um trecho do servlet que simula o processo de negócio da aplicação

locação de vídeos e que é responsável por fazer o controle de acessos dos usuários.

Listagem 28 – Trecho do servlet que simula o processo de negócio em BPEL.

// Configurar aplicação Web try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.connect("","","jdbc:mysql://localhost/mestrado","com.mysql.jdbc.Driver"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.loadColor("#FFFFFF","#9EEB95","#DDDDDD","#9EEB95","#EEEEEE","#000000","#FF0000"); _wsInterfaceSEIPort.loadHeading("Sistema de Locadora"); _wsInterfaceSEIPort.loadBaseboard("... aplicaçao Web de locação de vídeos para trabalho de mestrado ..."); _wsInterfaceSEIPort.loadMenu("Cliente;aaa=1//Filme;aaa=2//Fita;aaa=3//Locação;aaa=4//Pagamento;aaa=5//Reserva;aaa=6//Sair;aaa=9"); _wsInterfaceSEIPort.addFieldForm("TEXT","E-mail","email","",""); _wsInterfaceSEIPort.addFieldForm("PASSWORD","Senha","senha","",""); _wsInterfaceSEIPort.loadForm("Acesso",""); pagina=_wsInterfaceSEIPort.format(false); } catch(Exception ex) { } // Loop até usuário logar while (!logado){ try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); logado=_wsDatabaseSEIPort.validate("select * from locadora_usuario where email=\""+resultado[0]+"\" and senha=\""+resultado[1]+"\""); } catch(Exception ex) { } }...

Page 88: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

88

Os Apêndices C e D apresentam respectivamente os servlets completos que simulam

os processos de negócio das aplicações de locação de vídeos e controle de estoque.

4.2 RESULTADOS

Após realização dos estudos de caso foi feita uma análise qualitativa. Esta análise foi

realizada comparando-se alguns aspectos do processo ADESE, um processo para

desenvolvimento de aplicações Web baseado em serviços, e os métodos convencionais de

desenvolvimento de aplicação Web baseados em modelos como os apresentados no capítulo 2.

Estes aspectos foram escolhidos, pois são mais relevantes para evidenciar as pontecialidades

do processo ADESE. Os aspectos analisados foram:

• Reutilização: ocorre ganho do processo ADESE porque os serviços, uma vez

desenvolvidos para uso em uma aplicação Web, ficam disponíveis no ambiente

WIDE-PL para uso posterior em outras aplicações, aumentando assim a

possibilidade de sua reutilização.

• Separação explícita da lógica do negócio e os serviços: ocorre ganho porque

separa completamente a lógica do negócio, que consta no serviço de processo

de negócio, das funções necessárias para o desenvolvimento da aplicação que

estão embutidas em serviços e são invocadas quando necessário pelo processo

de negócio.

• Redução de tempo e custo de desenvolvimento: ocorre ganho porque o esforço

maior com o uso do processo ADESE concentra-se no desenvolvimento do

processo de negócio da aplicação. Os serviços necessários para compor a

aplicação são apenas adicionados ao processo para serem invocados quando for

preciso, poupando muita modelagem e programação das funções que constam

Page 89: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

89

nesses serviços, reduzindo assim o tempo e, consequentemente, o custo de

desenvolvimento.

Entre alguns requisitos não funcionais também podemos citar ganhos e perdas com o

uso do processo ADESE em relação aos métodos convencionais. Os requisitos descritos são:

• Interoperabilidade: ocorre ganho porque permite que serviços produzidos em

diferentes linguagens e plataformas se comuniquem entre si.

• Manutenibilidade: ocorre ganho porque a aplicação é composta por serviços

independentes, em que existem poucas e bem definidas dependências entre

esses serviços, facilitando a manutenção.

• Desempenho: ocorre perda porque utiliza conceitos de computação distribuída

em que os serviços normalmente estão em servidores diferentes, o que implica

em um atraso e na dependência de servidores externos. Além disso, os serviços

utilizam XML como formato padrão para a troca de mensagens, e estes são

bem maiores que o equivalente em formato binário. Estas questões aumentam

o tempo de resposta e prejudicam o desempenho, mas algumas técnicas como,

por exemplo, a compactação do XML, pode amenizar o problema.

• Segurança: ocorre perda porque aumenta o risco de interceptação dos dados, já

que serviços trocam dados pela Web. O uso de técnicas como, por exemplo, a

criptografia de mensagens trocadas pelos serviços, pode neutralizar o

problema.

• Disponibilidade: pode ocorrer perda porque a aplicação normalmente utilizará

serviços que estão distribuídos em vários servidores, e isso aumenta o risco de

que em algum momento, algum desses serviços necessários na aplicação não

esteja disponível, mas ações como o controle de exceções no processo de

negócio diminui o risco de falha na aplicação.

Page 90: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

90

4.3 CONSIDERAÇÕES FINAIS

Neste capítulo foi apresentada a avaliação do processo ADESE por meio de um estudo

de caso. O estudo de caso apresentou o desenvolvimento de duas aplicações Web seguindo o

processo ADESE e a forma de execução destas aplicações, que foi através de uma simulação

dos processos de negócio das aplicações em um servlets Java, já que nenhum motor BPEL

eficiente foi encontrado durante o desenvolvimento do trabalho. Em seguida, foram

apresentados os resultados obtidos através de uma análise qualitativa de alguns requisitos para

o desenvolvimento de aplicações Web utilizando o processo ADESE. O sucesso da tecnologia

de serviços Web e dos padrões associados depende da disponibilidade de recursos para

desenvolvimento de aplicações. Para que BPEL tenha sucesso como linguagem de

composição de serviços é necessário maior investimento em ambientes de apoio a esta

linguagem.

No capítulo 5 serão apresentadas as conclusões e os trabalhos futuros.

Page 91: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

91

CAPÍTULO 5

CONCLUSÕES

Nos últimos anos, tem ocorrido um crescente aumento na quantidade de aplicações

Web, mas não com a qualidade ideal. O que se percebe é que os métodos tradicionais de

desenvolvimento de aplicações Web, geralmente baseados em modelos, ainda requerem muita

modelagem, programação e não tiram muito proveito de reutilização. Além disso, as

aplicações Web requerem cada vez mais recursos, como por exemplo, a cooperação de

serviços que podem inclusive demandar cooperações inter-organizacionais.

Por esses motivos foi proposto o ambiente WIDE, que consiste em um grupo

articulado de frameworks para suporte ao desenvolvimento de aplicações Web. O ambiente

WIDE-PL é uma evolução de WIDE, e tem como objetivo apoiar a geração de aplicações

Web baseadas em SOA seguindo os princípios de LP.

Este trabalho de mestrado teve como objetivo definir e especificar o processo ADESE,

que consiste de um processo de desenvolvimento de aplicações Web baseado em serviços no

contexto de WIDE-PL. Este processo contém as etapas para definição do domínio da

aplicação, desenvolvimento de serviços e geração de aplicações com base nos serviços

definidos. Para realização deste trabalho foi utilizada WSDL para especificação de serviços e

BPEL para especificação de processos de negócio, mas linguagens específicas para WIDE-PL

podem ser projetadas no futuro. Além do processo ADESE, a concepção e a arquitetura do

WIDE-PL foram aprimoradas.

A avaliação do processo foi realizada por meio de um estudo de caso que envolveu o

desenvolvimento de duas aplicações Web seguindo as etapas do processo ADESE. Os

resultados obtidos contribuem para consolidação de WIDE-PL, pois foi observado que

ocorreram ganhos do processo ADESE em relação aos métodos tradicionais em aspectos

Page 92: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

92

como: (i) reutilização; (ii) separação explícita da lógica do negócio e os serviços; (iii) redução

de tempo e custo de desenvolvimento; (iv) interoperabilidade; e (v) manutenibilidade.

Assim, como contribuições deste trabalho, destacam-se a definição e especificação do

processo ADESE, que consiste de um processo para desenvolvimento de aplicações Web

baseado em serviços, que inclue em sua etapa de desenvolvimento de serviços, regras de

mapeamento do modelo de características para o diagrama de classes. Na literatura, ainda há

uma carência de abordagens de mapeamento do modelo de características em outros modelos.

Um exemplo é a abordagem proposta por Czarnecki e Antkiewicz (2005), porém o foco é no

mapeamento do modelo de características para diagrama de atividades UML.

O processo ADESE mostra que é possível o desenvolvimento de aplicações Web

baseado em serviços, e assim abre caminho para uma nova abordagem de desenvolvimento de

aplicações Web. Nesta abordagem, o foco é no processo de negócio, e serviços são

adicionados e suas operações são invocadas de acordo com as regras de negócio do domínio

da aplicação. Algumas desvantagens foram observadas, como o atual estágio da tecnologia

em que ainda falta um motor BPEL eficiente para executar os processos de negócio das

aplicações, bem como em requisitos como desempenho, segurança e disponibilidade. Porém,

essas desvantagens podem ser superadas com o avanço da tecnologia.

Como trabalhos futuros, podem ser citados:

• especificar e implementar outras funções para cada um dos serviços

obrigatórios, pois neste trabalho os serviços foram elaborados apenas com os

recursos mínimos necessários para o funcionamento das aplicações;

• especificar e implementar outros serviços opcionais para enriquecimento do

ambiente WIDE-PL;

• desenvolver uma extensão de BPEL que permita a interação humana durante a

execução de um processo de negócio;

Page 93: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

93

• realizar experiências para coletar dados experimentais do ambiente WIDE-PL

e compará-lo com outros ambientes existentes;

• desenvolver melhores recursos de interface gráfica para o ambiente;

• estudar técnicas para melhorar o desempenho na transmissão de dados entre os

serviços; e,

• estudar técnicas de segurança para a troca de mensagens entre os serviços.

Page 94: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

94

REFERÊNCIAS

ALENCAR, P. S.; COWAN. D. D.; LUO, M., A Framework for Community Information Systems. In: Annals of Software Engineering 13 (1-4): p. 381-411, 2002. ALONSO, G.; CASATI, F.; KONU, H.; MACHIRAJU, V., Web Services – Concepts, Architectures e Applications. Bookmaker Springer. 2003. ANTKIEWICZ, M. ; CZARNACKI, K., FeaturePlugin: Feature Modeling Plug-in for Eclipse. In Eclipse '04: Proceedings of the 2004 OOPSLA Workshop on Eclipse Technology eXchange, OOPSLA, Vancouver, British Columbia, Canada, 67 - 72, ACM Press, 2004. B2J – BPEL to Java Subproject - Eclipse. <http://www.eclipse.org/stp/b2j/>. Acesso em 19/03/2007. BEA Systems, IBM, Microsoft, SAP AG, Siebel Systems, Business Process Execution Language for Web Services Version 1.1, 2003. BEXEE – Bexee BPEL Execution Engine. <http://sourceforge.net/projects/bexee/>. Acesso em 15/01/2007. BPML - Business Process Modeling Language (BPML). <http://www.bpmi.org>. Acesso em 10/05/2006. BPSS - Business Process Specification Schema (BPSS). <http://www.ebxml.org/specdrafts/ cc and bp document overview ver 1.01.pdf>. Acesso em 10/05/2006. CASATI, F., DISCENZA, A. Modeling and Managing Interactions among Business Processes. Journal of Systems Integration 10(2), 2001. CASATI, F., SHAN, M-C. Process Automation as the Foundation for E-Business. In: Proceedings of the 26th International Conference on Very Large Databases, Cairo, Egito, 2000. CERAMI, E. Web Services Essential, Distributed Applications with XML-RPC, SOAP, UDDI & WSDL, Chapter 6, 2002. CERI, S. et al. Architectural Issues and Solutions in the Development of Data-Intensive Web Applications, Proc. of CIDR’03, USA, 2003. CERI, S; FRATERNALI, P; BONGIO, A. Web Modeling Language (WebML): a modeling language for designing Web Sites. Dipartimento di Elettronica e Informazione, Politecnico di Milano, 2000. CHRISTENSEN, E., CURBERA, F., MEREDITH, WEERAWARANA, SANJIVA, Web Services Description Language (WSDL) 1.1, W3C Note 15, 2001. CLEMENTS, P.; NORTHROP, L. Software product lines: practices and patterns. 1. ed. Boston: Addison-Wesley, p. 608, 2001.

Page 95: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

95

COWAN, D.; FENTON, S.; MULHOLLAND, D. The Waterloo Informatics Development Environment (WIDE). CSG Internal Note, 2004. CORBA - The Common Object Request Broker Architecture. <http://www.corba.org>. Acesso em 15/04/2006. CZARNECKI, K.; HELSEN, S.; EISENECKER, U. Staged configuration through specialization and multi-level configuration of feature models. To appear in special issue on "Software Variability: Process and Management", Software Process Improvement and Practice, 10(2), 2005. CZARNECKI, K.; ANTKIEWICZ, M., Mapping features to models: A template approach based on superimposed variants. In R. Glueck and M. Lowry, editors, GPCE 2005 - Generative Programming and Component Engineering. 4th International Conference, Tallinn, Estonia, Sept. 29 - Oct. 1, 2005, Proceedings, vol. 3676 of LNCS, 422 - 437, Springer, 2005. DCOM - Distributed Component Object Model. <http://www.microsoft.com/com>. Acesso em 15/04/2006. FANTINATO, M.; TOLEDO, M.; GIMENES, I; Arquitetura de Sistemas de Gerenciamento de Processos de Negócio Baseado em Serviços, Relatório técnico, UNICAMP, 2005. GIMENES, I. et al; O projeto preliminar de WIDE-PL. Estágio de pós-doutorado na Universidade de Waterloo, Canadá, 2005. GIMENES, I; NISHIMURA, R; OLIVEIRA JUNIOR, E; LAZILHA, F; KULESZA, U; LUCENA, C. A Component-based Product Development Process for a Workflow Management System Product Line. In: 19o. Simpósio Brasileiro de Engenharia de Software, 2005, Uberlândia. Anais do 19o. Simpósio Brasileiro de Engenharia de Software. Porto Alegre: SBC, p. 279-294, 2005b. GOTTSCHALK, K. Web Service Architecture overview. IBM developerWorks. 2000. GRISS, M. L.; FAVARO, J.; D´ALESSANDRO, M. Integrating feature modeling with the RSEB. In: International Conference on Software Reuse, Washington. Proceedings. Washington, p. 76-85, 1998. HEYMANS, P.; TRIGAUX, J. C. Software product line: state of the art. Technical report for PLENTY project, Institut d’Informatique FUNDP, Namur, 2003. JACOBSON, I; BOOCH, G.; RUMBAUGH, J. The Unified software Development Process, Addison Wesley, 1999. KANG, K. Feature-oriented domain analysis (FODA) - feasibility study. Technical Report CMU/SEI-90-TR-21, SEI/CMU, Pittsburgh, 1990. KANG, K., LEE, J., DONOHOE, P. Feature-oriented Product Line Engineering, IEEE Software, 2002.

Page 96: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

96

LEYMANN, F., ROLLER, D., SCHMIDT, M.-T. Web services and business process management. IBM Systems Journal, vol. 41, no.2, p. 198-211, 2002. MYSQL – Mysql 5.0 - <http://www.mysql.org>. Acesso em 15/04/2006. NETBEANS – Netbeans 5.5 - <http://www.netbeans.org>. Acesso em 15/04/2006. NORTHROP, L. M. SEI’s Software product line tenets. IEEE Software, v. 19, n. 14, p. 32-41, 2002. OLIVEIRA JUNIOR, E; GIMENES, I; HUZITA, E; MALDONADO, J. A Variability Management Process for Software Product Lines. In: Cascon, Toronto. Proceeding of Cascon, Canada: National Research Council Canada, v. 1, p. 30-44, 2005. OOHDM - Object-Oriented Hypermedia Design Method (OOHDM). < http://www.tecweb.inf.puc-rio.br/oohdm/space/resumo+do+OOHDM >. Acesso do em 10/05/2006. PAPAZOGLOU, M., GEORGAKOPOULOS, D. Service-oriented computing, Communications of the ACM: Service-Oriented Computing. 2003. PASTOR, O., FONS, J., PELECHANO, V., OOWS: A Method to Develop Web Applications from Web-Oriented Conceptual Models. Department of Information Systems and Computation Technical University of Valencia. 2003. PELTZ, C. Web Services Orchestration and Choreography. Hewlett-Packard Company. 2003. PXE – Process Execution Engine (PXE). <http://sourceforge.net/projects/pxe/>. Acesso em 15/01/2007. ROSS, D., SCHOMAN, K., Structured Analysis for Requirements Definition, IEEE Transactions on Software Engineering 3(1), 1977. ROSSI, G., SCHMID, H., LYARDET, F, Engineering Business Processes in Web Applications: Modeling and Navigation issues, Third International Workshop on Web-Oriented Software Technologies, IWWOST’03, 2003. SCHMIDT, R. Web Services Based Architectures to Support Dynamic Interorganizational Business Processes. The International Conference on Web Services – Europe, ICWS-Europe’03, 2003 SCHWABE, D.; ROSSI, G., Developing Hypermedia Applications using OOHDM, Workshop on Hypermedia Development Processes, Methods and Models, Hypertext. Pittsburgh, USA. 1998. SEI - Software Engineering Institute. A framework for software product line practice 4.2. Pittsburgh. <http://www.sei.cmu.edu/productlines/framework.html >. Acesso em 10/04/2006.

Page 97: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

97

SIMONS, M.; CREPS, D.; KLINGLER, C.; LEVINE, L.; ALLEMANG, D. Organization domain modeling (ODM) guidebook, version 2.0. Technical Report STARS-VC-A025/001/00, Lockheed Martin Tactical Defence Systems, 1996. SOCHOS, P.; PHILIPPOW, I.; RIEBISH, M. Feature-oriented development of software product lines: mapping feature models to the architecture. Springer, LNCS 3263, p. 138-152, 2004. SOAP - Simple Object Access Protocol (SOAP). <http://www.w3.org/TR/SOAP>. Acesso em 10/04/2006. TRAVASSOS, G. H.; GUROV, D.; AMARAL, E. A. G. G. Introdução à engenharia de software experimental. Relatório Técnico RT-ES-590/02. Programa de Engenharia de Sistemas e Computação, COPPE/UFRJ, p. 52, 2002. UDDI - Universal Description, Discovery, and Integration (UDDI). <http://www.uddi.org>. Acesso em 10/04/2006. VAN DER AALST, W. Process-oriented Architectures for Electronic Commerce Interorganizational Workflow. Information Systems, 24(8): p. 639-671, 2000. VAN GURP, J., BOSCH, J., SVAHNBERG, M. On the notion of variability in software product lines, in: Proc. The Working IEEE/IFIP Conference on Software Architecture (WICSA), Amsterdam, The Netherlands, p. 45-54, 2001. XLANG - Web Services for Business Process Design (XLANG). <http://www.gotdotnet.com/team/xml wsspecs/xlangc/default.htm>. Acesso em 10/05/2006. XML - Extensible Markup Language (XML). <http://www.w3.org/TR/REC-xml>. Acesso em 10/05/2006. WEBML – WebML. <http://www.webml.org>. Acesso em 10/05/2006. WSCI - Web Services Choreography Interface (WSCI). <http://www.w3.org/TR/wsci>. Acesso em 10/05/2006. WSFL - Web Services Flow Language (WSFL). <http://www-4.ibm.com/software/solutions/webservices/pdf/WSFL.pdf>. Acesso em 10/05/2006.

Page 98: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

98

APÊNDICE A – DESCRIÇAO BPEL DA APLICAÇÃO LOCAÇÃO DE VÍDEOS <?xml version="1.0" encoding="UTF-8"?> <process name="Locadora" targetNamespace="http://enterprise.netbeans.org/bpel/SynchronousSample/SynchronousSample_1" xmlns="http://schemas.xmlsoap.org/ws/2004/03/business-process/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:bpws="http://schemas.xmlsoap.org/ws/2004/03/business-process/" xmlns:wsdlNS="http://enterprise.netbeans.org/bpel/SynchronousSample/SynchronousSample_1" xmlns:ns1="http://localhost/SynchronousSample/SynchronousSample" xmlns:ns2="urn:wsInterface/wsdl" xmlns:ns3="urn:wsInteraction/wsdl" xmlns:ns4="urn:wsDatabase/wsdl" xmlns:ns5="urn:wsCalendario/wsdl"> <import location="SynchronousSample.xsd" importType="http://www.w3.org/2001/XMLSchema" namespace="http://xml.netbeans.org/schema/SynchronousSample"/> <import namespace="http://localhost/SynchronousSample/SynchronousSample" location="SynchronousSample.wsdl" importType="http://schemas.xmlsoap.org/wsdl/"/> <import namespace="urn:wsInterface/wsdl" location="wsInterface.wsdl" importType="http://schemas.xmlsoap.org/wsdl/"/> <import namespace="urn:wsInteraction/wsdl" location="wsInteraction.wsdl" importType="http://schemas.xmlsoap.org/wsdl/"/> <import namespace="urn:wsDatabase/wsdl" location="wsDatabase.wsdl" importType="http://schemas.xmlsoap.org/wsdl/"/> <import namespace="urn:wsCalendario/wsdl" location="wsCalendario.wsdl" importType="http://schemas.xmlsoap.org/wsdl/"/> <partnerLinks> <partnerLink name="Calendario" partnerLinkType="ns5:wsCalendarioSEILinkType" partnerRole="wsCalendarioSEIRole"/> <partnerLink name="Database" partnerLinkType="ns4:wsDatabaseSEILinkType" partnerRole="wsDatabaseSEIRole"/> <partnerLink name="Interaction" partnerLinkType="ns3:wsInteractionSEILinkType" partnerRole="wsInteractionSEIRole"/> <partnerLink name="Interface" partnerLinkType="ns2:wsInterfaceSEILinkType" partnerRole="wsInterfaceSEIRole"/> <partnerLink name="BusinessProcess" partnerLinkType="ns1:partnerlinktype1" myRole="partnerlinktyperole1"/> </partnerLinks> <variables> <variable name="Hoje1" messageType="ns5:wsCalendarioSEI_hojeResponse"/> <variable name="AddFieldFormIn1" messageType="ns2:wsInterfaceSEI_addFieldForm"/> <variable name="AddFieldFormIn2" messageType="ns2:wsInterfaceSEI_addFieldForm"/> <variable name="AddFieldFormIn3" messageType="ns2:wsInterfaceSEI_addFieldForm"/> <variable name="AddFieldFormIn4" messageType="ns2:wsInterfaceSEI_addFieldForm"/> <variable name="AddFieldFormIn5" messageType="ns2:wsInterfaceSEI_addFieldForm"/> <variable name="AddFieldFormIn6" messageType="ns2:wsInterfaceSEI_addFieldForm"/> <variable name="AddLinkListIn1" messageType="ns2:wsInterfaceSEI_addLinkList"/> <variable name="AddLinkListIn2" messageType="ns2:wsInterfaceSEI_addLinkList"/> <variable name="ConnectIn1" messageType="ns4:wsDatabaseSEI_connect"/> <variable name="ConnectOut1" messageType="ns4:wsDatabaseSEI_connectResponse"/> <variable name="FormatFalse" messageType="ns2:wsInterfaceSEI_format"/> <variable name="FormatTrue" messageType="ns2:wsInterfaceSEI_format"/> <variable name="LoadBaseboardIn1" messageType="ns2:wsInterfaceSEI_loadBaseboard"/> <variable name="LoadColorIn1" messageType="ns2:wsInterfaceSEI_loadColor"/> <variable name="LoadFormIn1" messageType="ns2:wsInterfaceSEI_loadForm"/> <variable name="LoadHeadingIn1" messageType="ns2:wsInterfaceSEI_loadHeading"/> <variable name="LoadListIn1" messageType="ns2:wsInterfaceSEI_loadList"/> <variable name="LoadMenuIn1" messageType="ns2:wsInterfaceSEI_loadMenu"/> <variable name="Page" messageType="ns2:wsInterfaceSEI_formatResponse"/> <variable name="PageInteraction" messageType="ns3:wsInteractionSEI_requestResponse"/> <variable name="ResultExecute" messageType="ns4:wsDatabaseSEI_executeResponse"/> <variable name="ResultInteraction" messageType="ns3:wsInteractionSEI_requestResponseResponse"/> <variable name="resulLogin" messageType="ns4:wsDatabaseSEI_validateResponse"/> <variable name="ResultPage" messageType="ns3:wsInteractionSEI_requestResponseResponse"/> <variable name="ResultSelect" messageType="ns4:wsDatabaseSEI_selectResponse"/> <variable name="ResultSelect2" messageType="ns4:wsDatabaseSEI_selectResponse"/> <variable name="SqlExecute" messageType="ns4:wsDatabaseSEI_execute"/> <variable name="SqlSelect" messageType="ns4:wsDatabaseSEI_select"/> <variable name="SqlSelect2" messageType="ns4:wsDatabaseSEI_select"/> <variable name="SqlValidade" messageType="ns4:wsDatabaseSEI_validate"/> <variable name="outputVar" messageType="ns1:responseMessage"/> <variable name="inputVar" messageType="ns1:requestMessage"/> </variables> <sequence>

Page 99: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

99

<receive name="start" partnerLink="BusinessProcess" operation="operation1" portType="ns1:portType1" variable="inputVar" createInstance="yes"/> <assign name="Assign1"> <copy><from>$inputVar.inputType/paramA</from><to>$outputVar.resultType/paramA</to></copy> <copy><from>true()</from><to>$FormatTrue.parameters/boolean_1</to></copy> <copy><from>false()</from><to>$FormatFalse.parameters/boolean_1</to></copy> <copy><from>string('com.mysql.jdbc.Driver')</from><to>$ConnectIn1.parameters/String_4</to></copy> <copy><from>string('jdbc:mysql://localhost/mestrado')</from><to>$ConnectIn1.parameters/String_3</to></copy> <copy><from>string('')</from><to>$ConnectIn1.parameters/String_2</to></copy> <copy><from>string('')</from><to>$ConnectIn1.parameters/String_1</to></copy> <copy><from>string('Cliente;aaa=1//Filme;aaa=2//Fita;aaa=3//Locação;aaa=4//Pagamento;aaa=5//Reserva;aaa=6//Sair;aaa=9')</from><to>$LoadMenuIn1.parameters/String_1</to></copy> <copy><from>string('Sistema de Locadora')</from><to>$LoadHeadingIn1.parameters/String_1</to></copy> <copy><from>string('... aplicaçao Web de locação de vídeos para trabalho de mestrado ...')</from><to>$LoadBaseboardIn1.parameters/String_1</to></copy> <copy><from>string('#FFFFFF')</from><to>$LoadColorIn1.parameters/String_1</to></copy> <copy><from>string('#9EEB95')</from><to>$LoadColorIn1.parameters/String_2</to></copy> <copy><from>string('#DDDDDD')</from><to>$LoadColorIn1.parameters/String_3</to></copy> <copy><from>string('#9EEB95')</from><to>$LoadColorIn1.parameters/String_4</to></copy> <copy><from>string('#EEEEEE')</from><to>$LoadColorIn1.parameters/String_5</to></copy> <copy><from>string('#000000')</from><to>$LoadColorIn1.parameters/String_6</to></copy> <copy><from>string('#FF0000')</from><to>$LoadColorIn1.parameters/String_7</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn1.parameters/String_1</to></copy> <copy><from>string('E-mail')</from><to>$AddFieldFormIn1.parameters/String_2</to></copy> <copy><from>string('email')</from><to>$AddFieldFormIn1.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_5</to></copy> <copy><from>string('PASSWORD')</from><to>$AddFieldFormIn2.parameters/String_1</to></copy> <copy><from>string('Senha')</from><to>$AddFieldFormIn2.parameters/String_2</to></copy> <copy><from>string('senha')</from><to>$AddFieldFormIn2.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_5</to></copy> <copy><from>string('Acesso')</from><to>LoadFormIn1.parameters/String_1</to></copy> <copy><from>string('')</from><to>LoadFormIn1.parameters/String_2</to></copy> </assign> <invoke name="ConnectDB" partnerLink="Database" operation="connect" portType="ns4:wsDatabaseSEI" inputVariable="ConnectIn1" outputVariable="ConnectOut1"/> <invoke name="loadColor" partnerLink="Interface" operation="loadColor" portType="ns2:wsInterfaceSEI" inputVariable="LoadColorIn1"/> <invoke name="LoadHeading" partnerLink="Interface" operation="loadHeading" portType="ns2:wsInterfaceSEI" inputVariable="LoadHeadingIn1"/> <invoke name="LoadBaseboard" partnerLink="Interface" operation="loadBaseboard" portType="ns2:wsInterfaceSEI" inputVariable="LoadBaseboardIn1"/> <invoke name="LoadMenu" partnerLink="Interface" operation="loadMenu" portType="ns2:wsInterfaceSEI" inputVariable="LoadMenuIn1"/> <invoke name="AddFieldForm_Email" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn1"/> <invoke name="AddFieldForm_Password" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn2"/> <invoke name="LoadForm_Access" partnerLink="Interface" operation="loadForm" portType="ns2:wsInterfaceSEI" inputVariable="LoadFormIn1"/> <invoke name="Page1" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatFalse" outputVariable="Page"/> <assign name="Assign3"> <copy><from>$Page.result/result</from><to>$ResultInteraction.result/result</to></copy> <copy><from>false()</from><to>$resulLogin.result/result</to></copy> </assign> <while name="While_no_login"> <condition> ( $resulLogin.result/result = false() ) </condition> <sequence name="Sequence1"> <invoke name="Interaction1" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <assign name="Assign2"> <copy><from>concat('select * from locadora_usuario where email=', $ResultInteraction.result/result, ' and senha=', $ResultInteraction.result/result)</from><to>$SqlValidade.parameters/String_1</to></copy> </assign>

Page 100: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

100

<invoke name="ValidadeUser" partnerLink="Database" operation="validate" portType="ns4:wsDatabaseSEI" inputVariable="SqlValidade" outputVariable="resulLogin"/> </sequence> </while> <invoke name="PageInit" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign4"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction2" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <while name="While_login"> <condition> ( $resulLogin.result/result = true() ) </condition> <sequence name="Sequence2"> <while name="While_OP_Cliente"> <condition> ( ( $ResultInteraction.result/result = 1 ) or ( $ResultInteraction.result/result = 11 ) ) </condition> <sequence name="Sequence_1_1"> <assign name="Assign_1_1"> <copy><from>string('select id, nome, cpf, telefone from locadora_cliente order by nome')</from><to>$SqlSelect.parameters/String_1</to></copy> </assign> <invoke name="ListClientes" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <assign name="Assign_1_2"> <copy><from>string('aaa=11')</from><to>$AddLinkListIn1.parameters/String_1</to></copy> <copy><from>string('Novo')</from><to>$AddLinkListIn1.parameters/String_2</to></copy> <copy><from>string('aaa=12')</from><to>$AddLinkListIn2.parameters/String_1</to></copy> <copy><from>string('Excluir')</from><to>$AddLinkListIn2.parameters/String_2</to></copy> <copy><from>string('Clientes')</from><to>$LoadListIn1.parameters/String_1</to></copy> <copy><from>$ResultSelect.result/result</from><to>$LoadListIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldList_1_1" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn1"/> <invoke name="AddFieldList_1_2" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn2"/> <invoke name="LoadList_Cliente" partnerLink="Interface" operation="loadList" portType="ns2:wsInterfaceSEI" inputVariable="LoadListIn1"/> <invoke name="Page_1_1" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_1_3"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_1_1" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <if name="If_Cliente_Incluir"> <condition> ( $ResultInteraction.result/result = 11 ) </condition> <sequence name="Sequence_1_2"> <assign name="Assign_1_4"> <copy><from>string('TEXT')</from><to>$AddFieldFormIn1.parameters/String_1</to></copy> <copy><from>string('Nome')</from><to>$AddFieldFormIn1.parameters/String_2</to></copy> <copy><from>string('nome')</from><to>$AddFieldFormIn1.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn2.parameters/String_1</to></copy> <copy><from>string('CPF/CNPJ')</from><to>$AddFieldFormIn2.parameters/String_2</to></copy> <copy><from>string('cpf')</from><to>$AddFieldFormIn2.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn3.parameters/String_1</to></copy> <copy><from>string('Telefone')</from><to>$AddFieldFormIn3.parameters/String_2</to></copy> <copy><from>string('telefone')</from><to>$AddFieldFormIn3.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn3.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn3.parameters/String_5</to></copy> <copy><from>string('Cliente')</from><to>LoadFormIn1.parameters/String_1</to></copy> <copy><from>string('')</from><to>LoadFormIn1.parameters/String_2</to></copy> </assign>

Page 101: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

101

<invoke name="AddFieldForm_Cliente_Nome" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn1"/> <invoke name="AddFieldForm_Cliente_Cpf" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn2"/> <invoke name="AddFieldForm_Cliente_Telefone" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn3"/> <invoke name="LoadForm_Cliente" partnerLink="Interface" operation="loadForm" portType="ns2:wsInterfaceSEI" inputVariable="LoadFormIn1"/> <invoke name="Page_1_2" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_1_5"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_1_2" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <assign name="Assign_1_6"> <copy><from>concat('insert into locadora_cliente (nome, cpf, telefone) values (', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ')')</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="ClienteIncluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> <if name="If_Cliente_Exluir"> <condition> ( $ResultInteraction.result/result = 12 ) </condition> <sequence name="Sequence_1_3"> <assign name="Assign_1_7"> <copy><from>concat('delete from locadora_cliente where id=', $ResultInteraction.result/result)</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="ClienteExcluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> </sequence> </while> <while name="While_OP_Filme"> <condition> ( ( $ResultInteraction.result/result = 2 ) or ( $ResultInteraction.result/result = 21 ) ) </condition> <sequence name="Sequence_2_1"> <assign name="Assign_2_1"> <copy><from>string('select id, nome, sinopse, genero from locadora_filme order by nome')</from><to>$SqlSelect.parameters/String_1</to></copy> </assign> <invoke name="ListFilmes" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <assign name="Assign_2_2"> <copy><from>string('aaa=21')</from><to>$AddLinkListIn1.parameters/String_1</to></copy> <copy><from>string('Novo')</from><to>$AddLinkListIn1.parameters/String_2</to></copy> <copy><from>string('aaa=22')</from><to>$AddLinkListIn2.parameters/String_1</to></copy> <copy><from>string('Excluir')</from><to>$AddLinkListIn2.parameters/String_2</to></copy> <copy><from>string('Filmes')</from><to>$LoadListIn1.parameters/String_1</to></copy> <copy><from>$ResultSelect.result/result</from><to>$LoadListIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldList_2_1" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn1"/> <invoke name="AddFieldList_2_2" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn2"/> <invoke name="LoadListFilme" partnerLink="Interface" operation="loadList" portType="ns2:wsInterfaceSEI" inputVariable="LoadListIn1"/> <invoke name="Page_2_1" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_2_3"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_2_1" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/>

Page 102: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

102

<if name="If_Filme_Incluir"> <condition> ( $ResultInteraction.result/result = 21 ) </condition> <sequence name="Sequence_2_2"> <assign name="Assign_2_4"> <copy><from>string('TEXT')</from><to>$AddFieldFormIn1.parameters/String_1</to></copy> <copy><from>string('Nome')</from><to>$AddFieldFormIn1.parameters/String_2</to></copy> <copy><from>string('nome')</from><to>$AddFieldFormIn1.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn2.parameters/String_1</to></copy> <copy><from>string('Genero')</from><to>$AddFieldFormIn2.parameters/String_2</to></copy> <copy><from>string('genero')</from><to>$AddFieldFormIn2.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_5</to></copy> <copy><from>string('TEXTAREA')</from><to>$AddFieldFormIn3.parameters/String_1</to></copy> <copy><from>string('Sinopse')</from><to>$AddFieldFormIn3.parameters/String_2</to></copy> <copy><from>string('sinopse')</from><to>$AddFieldFormIn3.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn3.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn3.parameters/String_5</to></copy> <copy><from>string('Filme')</from><to>LoadFormIn1.parameters/String_1</to></copy> <copy><from>string('')</from><to>LoadFormIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldForm_Filme_Nome" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn1"/> <invoke name="AddFieldForm_Filme_Genero" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn2"/> <invoke name="AddFieldForm_Filme_Sinopse" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn3"/> <invoke name="LoadForm_Filme" partnerLink="Interface" operation="loadForm" portType="ns2:wsInterfaceSEI" inputVariable="LoadFormIn1"/> <invoke name="Page_2_2" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_2_5"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_2_2" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <assign name="Assign_2_6"> <copy><from>concat('insert into locadora_filme (nome, genero, sinopse) values (', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ')')</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="FilmeIncluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> <if name="If_Filme_Exluir"> <condition> ( $ResultInteraction.result/result = 22 ) </condition> <sequence name="Sequence_2_3"> <assign name="Assign_2_7"> <copy><from>concat('delete from locadora_filme where id=', $ResultInteraction.result/result)</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="FilmeExcluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> </sequence> </while> <while name="While_OP_Fita"> <condition> ( ( $ResultInteraction.result/result = 3 ) or ( $ResultInteraction.result/result = 31 ) ) </condition> <sequence name="Sequence_3_1"> <assign name="Assign_3_1"> <copy><from>string('select t.id, f.nome, t.tipo, t.locada from locadora_filme f, locadora_fita t where t.filme_id=f.id order by f.nome, t.tipo')</from><to>$SqlSelect.parameters/String_1</to></copy> </assign>

Page 103: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

103

<invoke name="ListFitas" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <assign name="Assign_3_2"> <copy><from>string('aaa=31')</from><to>$AddLinkListIn1.parameters/String_1</to></copy> <copy><from>string('Novo')</from><to>$AddLinkListIn1.parameters/String_2</to></copy> <copy><from>string('aaa=32')</from><to>$AddLinkListIn2.parameters/String_1</to></copy> <copy><from>string('Excluir')</from><to>$AddLinkListIn2.parameters/String_2</to></copy> <copy><from>string('Fitas')</from><to>$LoadListIn1.parameters/String_1</to></copy> <copy><from>$ResultSelect.result/result</from><to>$LoadListIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldList_3_1" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn1"/> <invoke name="AddFieldList_3_2" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn2"/> <invoke name="LoadListFita" partnerLink="Interface" operation="loadList" portType="ns2:wsInterfaceSEI" inputVariable="LoadListIn1"/> <invoke name="Page_3_1" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_3_3"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_3_1" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <if name="If_Fita_Incluir"> <condition> ( $ResultInteraction.result/result = 31 ) </condition> <sequence name="Sequence_3_2"> <assign name="Assign_3_8"> <copy><from>string('select nome, id from locadora_filme order by nome')</from><to>$SqlSelect.parameters/String_1</to></copy> </assign> <invoke name="ListaFilmes_Fita" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <assign name="Assign_3_4"> <copy><from>string('SELECT')</from><to>$AddFieldFormIn1.parameters/String_1</to></copy> <copy><from>string('Filme')</from><to>$AddFieldFormIn1.parameters/String_2</to></copy> <copy><from>string('filme_id')</from><to>$AddFieldFormIn1.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>$ResultSelect.result/result</from><to>$AddFieldFormIn1.parameters/String_5</to></copy> <copy><from>string('RADIO')</from><to>$AddFieldFormIn2.parameters/String_1</to></copy> <copy><from>string('Tipo')</from><to>$AddFieldFormIn2.parameters/String_2</to></copy> <copy><from>string('tipo')</from><to>$AddFieldFormIn2.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_4</to></copy> <copy><from>string('DVD//VHS')</from><to>$AddFieldFormIn2.parameters/String_5</to></copy> <copy><from>string('SELECT')</from><to>$AddFieldFormIn3.parameters/String_1</to></copy> <copy><from>string('Locada')</from><to>$AddFieldFormIn3.parameters/String_2</to></copy> <copy><from>string('locada')</from><to>$AddFieldFormIn3.parameters/String_3</to></copy> <copy><from>string('0')</from><to>$AddFieldFormIn3.parameters/String_4</to></copy> <copy><from>string('Sim;1//Não;0')</from><to>$AddFieldFormIn3.parameters/String_5</to></copy> <copy><from>string('Fita')</from><to>LoadFormIn1.parameters/String_1</to></copy> <copy><from>string('')</from><to>LoadFormIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldForm_Fita_Filme" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn1"/> <invoke name="AddFieldForm_Fita_Tipo" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn2"/> <invoke name="AddFieldForm_Fita_Locada" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn3"/> <invoke name="LoadForm_Fita" partnerLink="Interface" operation="loadForm" portType="ns2:wsInterfaceSEI" inputVariable="LoadFormIn1"/> <invoke name="Page_3_2" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_3_5"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_3_2" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <assign name="Assign_3_6">

Page 104: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

104

<copy><from>concat('insert into locadora_fita (filme_id, tipo, locada) values (', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ')')</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="FitaIncluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> <if name="If_Fita_Exluir"> <condition> ( $ResultInteraction.result/result = 32 ) </condition> <sequence name="Sequence_3_3"> <assign name="Assign_3_7"> <copy><from>concat('delete from locadora_fita where id=', $ResultInteraction.result/result)</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="FitaExcluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> </sequence> </while> <while name="While_OP_Locacao"> <condition> ( ( $ResultInteraction.result/result = 4 ) or ( $ResultInteraction.result/result = 41 ) ) </condition> <sequence name="Sequence_4_1"> <assign name="Assign_4_1"> <copy><from>string('select l.id, f.nome, t.tipo, c.nome, l.data, l.dataDevolucao, l.valor from locadora_filme f, locadora_locacao l, locadora_fita t, locadora_cliente c where l.cliente_id=c.id and l.fita_id=t.id and t.filme_id=f.id order by l.id')</from><to>$SqlSelect.parameters/String_1</to></copy> </assign> <invoke name="ListLocacoes" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <assign name="Assign_4_2"> <copy><from>string('aaa=41')</from><to>$AddLinkListIn1.parameters/String_1</to></copy> <copy><from>string('Novo')</from><to>$AddLinkListIn1.parameters/String_2</to></copy> <copy><from>string('aaa=42')</from><to>$AddLinkListIn2.parameters/String_1</to></copy> <copy><from>string('Excluir')</from><to>$AddLinkListIn2.parameters/String_2</to></copy> <copy><from>string('Locações')</from><to>$LoadListIn1.parameters/String_1</to></copy> <copy><from>$ResultSelect.result/result</from><to>$LoadListIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldList_4_1" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn1"/> <invoke name="AddFieldList_4_2" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn2"/> <invoke name="LoadList_Locacao" partnerLink="Interface" operation="loadList" portType="ns2:wsInterfaceSEI" inputVariable="LoadListIn1"/> <invoke name="Page_4_1" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_4_3"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_4_1" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <if name="If_Locacao_Incluir"> <condition> ( $ResultInteraction.result/result = 41 ) </condition> <sequence name="Sequence_4_2"> <assign name="Assign_4_8"> <copy><from>string('select f.nome, t.id from locadora_filme f, locadora_fita t where f.id=t.filme_id order by f.nome, t.tipo')</from><to>$SqlSelect.parameters/String_1</to></copy> <copy><from>string('select nome, id from locadora_cliente order by nome')</from><to>$SqlSelect2.parameters/String_1</to></copy> </assign> <invoke name="ListaFitas_Locacao" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <invoke name="ListaCliente_Locacao" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect2" outputVariable="ResultSelect2"/> <invoke name="Hoje" partnerLink="Calendario" operation="hoje" portType="ns5:wsCalendarioSEI" outputVariable="Hoje1"/>

Page 105: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

105

<assign name="Assign_4_4"> <copy><from>string('SELECT')</from><to>$AddFieldFormIn1.parameters/String_1</to></copy> <copy><from>string('Cliente')</from><to>$AddFieldFormIn1.parameters/String_2</to></copy> <copy><from>string('cliente_id')</from><to>$AddFieldFormIn1.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>$ResultSelect2.result/result</from><to>$AddFieldFormIn1.parameters/String_5</to></copy> <copy><from>string('SELECT')</from><to>$AddFieldFormIn2.parameters/String_1</to></copy> <copy><from>string('Fita')</from><to>$AddFieldFormIn2.parameters/String_2</to></copy> <copy><from>string('fita_id')</from><to>$AddFieldFormIn2.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>$ResultSelect.result/result</from><to>$AddFieldFormIn2.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn3.parameters/String_1</to></copy> <copy><from>string('Data')</from><to>$AddFieldFormIn3.parameters/String_2</to></copy> <copy><from>string('data')</from><to>$AddFieldFormIn3.parameters/String_3</to></copy> <copy><from>Hoje1.result/result</from><to>$AddFieldFormIn3.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn3.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn4.parameters/String_1</to></copy> <copy><from>string('Data de devolução')</from><to>$AddFieldFormIn4.parameters/String_2</to></copy> <copy><from>string('data_devolucao')</from><to>$AddFieldFormIn4.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn4.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn4.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn5.parameters/String_1</to></copy> <copy><from>string('Valor')</from><to>$AddFieldFormIn5.parameters/String_2</to></copy> <copy><from>string('valor')</from><to>$AddFieldFormIn5.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn5.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn5.parameters/String_5</to></copy> <copy><from>string('SELECT')</from><to>$AddFieldFormIn6.parameters/String_1</to></copy> <copy><from>string('Pago')</from><to>$AddFieldFormIn6.parameters/String_2</to></copy> <copy><from>string('pago')</from><to>$AddFieldFormIn6.parameters/String_3</to></copy> <copy><from>string('0')</from><to>$AddFieldFormIn6.parameters/String_4</to></copy> <copy><from>string('Sim;1//Não;0')</from><to>$AddFieldFormIn6.parameters/String_5</to></copy> <copy><from>string('Locação')</from><to>LoadFormIn1.parameters/String_1</to></copy> <copy><from>string('')</from><to>LoadFormIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldForm_Locacao_Cliente" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn1"/> <invoke name="AddFieldForm_Locacao_Fita" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn2"/> <invoke name="AddFieldForm_Locacao_Data" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn3"/> <invoke name="AddFieldForm_Locacao_DataDev" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn4"/> <invoke name="AddFieldForm_Locacao_Valor" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn5"/> <invoke name="AddFieldForm_Locacao_Pago" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn6"/> <invoke name="LoadForm_Locacao" partnerLink="Interface" operation="loadForm" portType="ns2:wsInterfaceSEI" inputVariable="LoadFormIn1"/> <invoke name="Page_4_2" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_4_5"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_4_2" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <assign name="Assign_4_6"> <copy><from>concat('insert into locadora_locacao (cliente_id, fita_id, data, dataDevolucao, valor, pago) values (', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ')')</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="LocacaoIncluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> <if name="If_Locacao_Exluir"> <condition> ( $ResultInteraction.result/result = 42 ) </condition> <sequence name="Sequence_4_3">

Page 106: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

106

<assign name="Assign_4_7"> <copy><from>concat('delete from locadora_locacao where id=', $ResultInteraction.result/result)</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="LocacaoExcluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> </sequence> </while> <while name="While_OP_Pagamento"> <condition> ( ( $ResultInteraction.result/result = 5 ) or ( $ResultInteraction.result/result = 51 ) ) </condition> <sequence name="Sequence_5_1"> <assign name="Assign_5_1"> <copy><from>string('select l.id, f.nome, t.tipo, c.nome, l.data, l.dataDevolucao, l.valor from locadora_filme f, locadora_locacao l, locadora_fita t, locadora_cliente c where l.cliente_id=c.id and l.fita_id=t.id and t.filme_id=f.id and l.pago=0 order by l.id')</from><to>$SqlSelect.parameters/String_1</to></copy> </assign> <invoke name="ListPagamentos" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <assign name="Assign_5_2"> <copy><from>string('aaa=51')</from><to>$AddLinkListIn1.parameters/String_1</to></copy> <copy><from>string('Pagar')</from><to>$AddLinkListIn1.parameters/String_2</to></copy> <copy><from>string('Pagamentos')</from><to>$LoadListIn1.parameters/String_1</to></copy> <copy><from>$ResultSelect.result/result</from><to>$LoadListIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldList_5_1" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn1"/> <invoke name="LoadListPagamento" partnerLink="Interface" operation="loadList" portType="ns2:wsInterfaceSEI" inputVariable="LoadListIn1"/> <invoke name="Page_5_1" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_5_3"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_5_1" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <if name="If_Pagamento"> <condition> ( $ResultInteraction.result/result = 51 ) </condition> <sequence name="Sequence_5_2"> <assign name="Assign_5_4"> <copy><from>concat('update locadora_locacao set pago=1 where id=', $ResultInteraction.result/result)</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="Pagar" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> </sequence> </while> <while name="While_OP_Reserva"> <condition> ( ( $ResultInteraction.result/result = 6 ) or ( $ResultInteraction.result/result = 61 ) ) </condition> <sequence name="Sequence_6_1"> <assign name="Assign_6_1"> <copy><from>string('select r.id, c.nome, f.nome from locadora_filme f, locadora_cliente c, locadora_reserva r where r.filme_id=f.id and r.cliente_id=c.id order by r.id')</from><to>$SqlSelect.parameters/String_1</to></copy> </assign> <invoke name="ListReservas" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <assign name="Assign_6_2"> <copy><from>string('aaa=61')</from><to>$AddLinkListIn1.parameters/String_1</to></copy> <copy><from>string('Novo')</from><to>$AddLinkListIn1.parameters/String_2</to></copy> <copy><from>string('aaa=62')</from><to>$AddLinkListIn2.parameters/String_1</to></copy> <copy><from>string('Excluir')</from><to>$AddLinkListIn2.parameters/String_2</to></copy> <copy><from>string('Reservas')</from><to>$LoadListIn1.parameters/String_1</to></copy>

Page 107: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

107

<copy><from>$ResultSelect.result/result</from><to>$LoadListIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldList_6_1" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn1"/> <invoke name="AddFieldList_6_2" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn2"/> <invoke name="LoadList_Reserva" partnerLink="Interface" operation="loadList" portType="ns2:wsInterfaceSEI" inputVariable="LoadListIn1"/> <invoke name="Page_6_1" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_6_3"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_6_1" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <if name="If_Reserva_Incluir"> <condition> ( $ResultInteraction.result/result = 61 ) </condition> <sequence name="Sequence_6_2"> <assign name="Assign_6_8"> <copy><from>string('select nome, id from locadora_filme order by nome')</from><to>$SqlSelect.parameters/String_1</to></copy> <copy><from>string('select nome, id from locadora_cliente order by nome')</from><to>$SqlSelect2.parameters/String_1</to></copy> </assign> <invoke name="ListaFilmes_Reserva" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <invoke name="ListaCliente_Reserva" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect2" outputVariable="ResultSelect2"/> <assign name="Assign_6_4"> <copy><from>string('SELECT')</from><to>$AddFieldFormIn1.parameters/String_1</to></copy> <copy><from>string('Cliente')</from><to>$AddFieldFormIn1.parameters/String_2</to></copy> <copy><from>string('cliente_id')</from><to>$AddFieldFormIn1.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>$ResultSelect2.parameters/String_1</from><to>$AddFieldFormIn1.parameters/String_5</to></copy> <copy><from>string('SELECT')</from><to>$AddFieldFormIn2.parameters/String_1</to></copy> <copy><from>string('Filme')</from><to>$AddFieldFormIn2.parameters/String_2</to></copy> <copy><from>string('filme_id')</from><to>$AddFieldFormIn2.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_4</to></copy> <copy><from>$ResultSelect.parameters/String_1</from><to>$AddFieldFormIn2.parameters/String_5</to></copy> <copy><from>string('Reserva')</from><to>LoadFormIn1.parameters/String_1</to></copy> <copy><from>string('')</from><to>LoadFormIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldForm_Reserva_Cliente" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn1"/> <invoke name="AddFieldForm_Reserva_Filme" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn2"/> <invoke name="LoadForm_Reserva" partnerLink="Interface" operation="loadForm" portType="ns2:wsInterfaceSEI" inputVariable="LoadFormIn1"/> <invoke name="Page_6_2" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_6_5"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_6_2" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <assign name="Assign_6_6"> <copy><from>concat('insert into locadora_reserva (cliente_id, filme_id) values (', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ')')</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="ReservaIncluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> <if name="If_Reserva_Exluir"> <condition> ( $ResultInteraction.result/result = 62 ) </condition> <sequence name="Sequence_6_3"> <assign name="Assign_6_7">

Page 108: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

108

<copy><from>concat('delete from locadora_reserva where id=', $ResultInteraction.result/result)</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="ReservaExcluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> </sequence> </while> <if name="If_End"> <assign name="Assign_9_1"> <copy><from>'Usuario desconectado'</from><to variable="PageInteraction"/></copy> <copy><from>false()</from><to>$resulLogin.result/result</to></copy> </assign> </if> </sequence> </while> <invoke name="PageEnd" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <reply name="end" partnerLink="BusinessProcess" operation="operation1" portType="ns1:portType1" variable="outputVar"/> </sequence> </process>

Page 109: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

109

APÊNDICE B – DESCRIÇAO BPEL DA APLICAÇÃO CONTROLE DE ESTOQUE <?xml version="1.0" encoding="UTF-8"?> <process name="Estoque" targetNamespace="http://enterprise.netbeans.org/bpel/SynchronousSample/SynchronousSample_1" xmlns="http://schemas.xmlsoap.org/ws/2004/03/business-process/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:bpws="http://schemas.xmlsoap.org/ws/2004/03/business-process/" xmlns:wsdlNS="http://enterprise.netbeans.org/bpel/SynchronousSample/SynchronousSample_1" xmlns:ns1="http://localhost/SynchronousSample/SynchronousSample" xmlns:ns2="urn:wsInterface/wsdl" xmlns:ns3="urn:wsInteraction/wsdl" xmlns:ns4="urn:wsDatabase/wsdl" xmlns:ns5="urn:wsCalendario/wsdl" xmlns:ns6="urn:wsMatematicaBasica/wsdl"> <import location="SynchronousSample.xsd" importType="http://www.w3.org/2001/XMLSchema" namespace="http://xml.netbeans.org/schema/SynchronousSample"/> <import namespace="http://localhost/SynchronousSample/SynchronousSample" location="SynchronousSample.wsdl" importType="http://schemas.xmlsoap.org/wsdl/"/> <import namespace="urn:wsInterface/wsdl" location="wsInterface.wsdl" importType="http://schemas.xmlsoap.org/wsdl/"/> <import namespace="urn:wsInteraction/wsdl" location="wsInteraction.wsdl" importType="http://schemas.xmlsoap.org/wsdl/"/> <import namespace="urn:wsDatabase/wsdl" location="wsDatabase.wsdl" importType="http://schemas.xmlsoap.org/wsdl/"/> <import namespace="urn:wsMatematicaBasica/wsdl" location="wsMatematicaBasica.wsdl" importType="http://schemas.xmlsoap.org/wsdl/"/> <partnerLinks> <partnerLink name="MatematicaBasica" partnerLinkType="ns6:wsMatematicaBasicaSEILinkType" partnerRole="wsMatematicaBasicaSEIRole"/> <partnerLink name="Database" partnerLinkType="ns4:wsDatabaseSEILinkType" partnerRole="wsDatabaseSEIRole"/> <partnerLink name="Interaction" partnerLinkType="ns3:wsInteractionSEILinkType" partnerRole="wsInteractionSEIRole"/> <partnerLink name="Interface" partnerLinkType="ns2:wsInterfaceSEILinkType" partnerRole="wsInterfaceSEIRole"/> <partnerLink name="BusinessProcess" partnerLinkType="ns1:partnerlinktype1" myRole="partnerlinktyperole1"/> </partnerLinks> <variables> <variable name="AddFieldFormIn1" messageType="ns2:wsInterfaceSEI_addFieldForm"/> <variable name="AddFieldFormIn2" messageType="ns2:wsInterfaceSEI_addFieldForm"/> <variable name="AddFieldFormIn3" messageType="ns2:wsInterfaceSEI_addFieldForm"/> <variable name="AddFieldFormIn4" messageType="ns2:wsInterfaceSEI_addFieldForm"/> <variable name="AddLinkListIn1" messageType="ns2:wsInterfaceSEI_addLinkList"/> <variable name="AddLinkListIn2" messageType="ns2:wsInterfaceSEI_addLinkList"/> <variable name="ConnectIn1" messageType="ns4:wsDatabaseSEI_connect"/> <variable name="ConnectOut1" messageType="ns4:wsDatabaseSEI_connectResponse"/> <variable name="FormatFalse" messageType="ns2:wsInterfaceSEI_format"/> <variable name="FormatTrue" messageType="ns2:wsInterfaceSEI_format"/> <variable name="LoadBaseboardIn1" messageType="ns2:wsInterfaceSEI_loadBaseboard"/> <variable name="LoadColorIn1" messageType="ns2:wsInterfaceSEI_loadColor"/> <variable name="LoadFormIn1" messageType="ns2:wsInterfaceSEI_loadForm"/> <variable name="LoadHeadingIn1" messageType="ns2:wsInterfaceSEI_loadHeading"/> <variable name="LoadListIn1" messageType="ns2:wsInterfaceSEI_loadList"/> <variable name="LoadMenuIn1" messageType="ns2:wsInterfaceSEI_loadMenu"/> <variable name="Page" messageType="ns2:wsInterfaceSEI_formatResponse"/> <variable name="PageInteraction" messageType="ns3:wsInteractionSEI_requestResponse"/> <variable name="ResultExecute" messageType="ns4:wsDatabaseSEI_executeResponse"/> <variable name="ResultExecute2" messageType="ns4:wsDatabaseSEI_executeResponse"/> <variable name="ResultInteraction" messageType="ns3:wsInteractionSEI_requestResponseResponse"/> <variable name="resulLogin" messageType="ns4:wsDatabaseSEI_validateResponse"/> <variable name="ResultPage" messageType="ns3:wsInteractionSEI_requestResponseResponse"/> <variable name="ResultSelect" messageType="ns4:wsDatabaseSEI_selectResponse"/> <variable name="ResultSelect2" messageType="ns4:wsDatabaseSEI_selectResponse"/> <variable name="SqlExecute" messageType="ns4:wsDatabaseSEI_execute"/> <variable name="SqlExecute2" messageType="ns4:wsDatabaseSEI_execute"/> <variable name="SqlSelect" messageType="ns4:wsDatabaseSEI_select"/> <variable name="SqlSelect2" messageType="ns4:wsDatabaseSEI_select"/> <variable name="SqlValidade" messageType="ns4:wsDatabaseSEI_validate"/> <variable name="outputVar" messageType="ns1:responseMessage"/> <variable name="inputVar" messageType="ns1:requestMessage"/> </variables>

Page 110: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

110

<sequence> <receive name="start" partnerLink="BusinessProcess" operation="operation1" portType="ns1:portType1" variable="inputVar" createInstance="yes"/> <assign name="Assign1"> <copy><from>$inputVar.inputType/paramA</from><to>$outputVar.resultType/paramA</to></copy> <copy><from>true()</from><to>$FormatTrue.parameters/boolean_1</to></copy> <copy><from>false()</from><to>$FormatFalse.parameters/boolean_1</to></copy> <copy><from>string('com.mysql.jdbc.Driver')</from><to>$ConnectIn1.parameters/String_4</to></copy> <copy><from>string('jdbc:mysql://localhost/mestrado')</from><to>$ConnectIn1.parameters/String_3</to></copy> <copy><from>string('')</from><to>$ConnectIn1.parameters/String_2</to></copy> <copy><from>string('')</from><to>$ConnectIn1.parameters/String_1</to></copy> <copy><from>string('Cliente;aaa=1//Fornecedor;aaa=2//Produto;aaa=3//Compra;aaa=4//Venda;aaa=5//Sair;aaa=9')</from><to>$LoadMenuIn1.parameters/String_1</to></copy> <copy><from>string('Sistema de Estoque')</from><to>$LoadHeadingIn1.parameters/String_1</to></copy> <copy><from>string('... aplicaçao Web de controle de estoque para trabalho de mestrado ...')</from><to>$LoadBaseboardIn1.parameters/String_1</to></copy> <copy><from>string('#FFFFFF')</from><to>$LoadColorIn1.parameters/String_1</to></copy> <copy><from>string('#E1E9EF')</from><to>$LoadColorIn1.parameters/String_2</to></copy> <copy><from>string('#DDDDDD')</from><to>$LoadColorIn1.parameters/String_3</to></copy> <copy><from>string('#E1E9EF')</from><to>$LoadColorIn1.parameters/String_4</to></copy> <copy><from>string('#EEEEEE')</from><to>$LoadColorIn1.parameters/String_5</to></copy> <copy><from>string('#000000')</from><to>$LoadColorIn1.parameters/String_6</to></copy> <copy><from>string('#FF0000')</from><to>$LoadColorIn1.parameters/String_7</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn1.parameters/String_1</to></copy> <copy><from>string('E-mail')</from><to>$AddFieldFormIn1.parameters/String_2</to></copy> <copy><from>string('email')</from><to>$AddFieldFormIn1.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_5</to></copy> <copy><from>string('PASSWORD')</from><to>$AddFieldFormIn2.parameters/String_1</to></copy> <copy><from>string('Senha')</from><to>$AddFieldFormIn2.parameters/String_2</to></copy> <copy><from>string('senha')</from><to>$AddFieldFormIn2.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_5</to></copy> <copy><from>string('Acesso')</from><to>LoadFormIn1.parameters/String_1</to></copy> <copy><from>string('')</from><to>LoadFormIn1.parameters/String_2</to></copy> </assign> <invoke name="ConnectDB" partnerLink="Database" operation="connect" portType="ns4:wsDatabaseSEI" inputVariable="ConnectIn1" outputVariable="ConnectOut1"/> <invoke name="loadColor" partnerLink="Interface" operation="loadColor" portType="ns2:wsInterfaceSEI" inputVariable="LoadColorIn1"/> <invoke name="LoadHeading" partnerLink="Interface" operation="loadHeading" portType="ns2:wsInterfaceSEI" inputVariable="LoadHeadingIn1"/> <invoke name="LoadBaseboard" partnerLink="Interface" operation="loadBaseboard" portType="ns2:wsInterfaceSEI" inputVariable="LoadBaseboardIn1"/> <invoke name="LoadMenu" partnerLink="Interface" operation="loadMenu" portType="ns2:wsInterfaceSEI" inputVariable="LoadMenuIn1"/> <invoke name="AddFieldForm_Email" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn1"/> <invoke name="AddFieldForm_Password" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn2"/> <invoke name="LoadForm_Access" partnerLink="Interface" operation="loadForm" portType="ns2:wsInterfaceSEI" inputVariable="LoadFormIn1"/> <invoke name="Page1" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatFalse" outputVariable="Page"/> <assign name="Assign3"> <copy><from>$Page.result/result</from><to>$ResultInteraction.result/result</to></copy> <copy><from>false()</from><to>$resulLogin.result/result</to></copy> </assign> <while name="While_no_login"> <condition>( $resulLogin.result/result = false() )</condition> <sequence name="Sequence1"> <invoke name="Interaction1" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <assign name="Assign2">

Page 111: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

111

<copy><from>concat('select * from estoque_usuario where email=', $ResultInteraction.result/result, ' and senha=', $ResultInteraction.result/result)</from><to>$SqlValidade.parameters/String_1</to></copy> </assign> <invoke name="ValidadeUser" partnerLink="Database" operation="validate" portType="ns4:wsDatabaseSEI" inputVariable="SqlValidade" outputVariable="resulLogin"/> </sequence> </while> <invoke name="PageInit" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign4"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction2" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <while name="While_login"> <condition> ( $resulLogin.result/result = true() ) </condition> <sequence name="Sequence2"> <while name="While_OP_Cliente"> <condition> ( ( $ResultInteraction.result/result = 1 ) or ( $ResultInteraction.result/result = 11 ) ) </condition> <sequence name="Sequence_1_1"> <assign name="Assign_1_1"> <copy><from>string('select id, nome, cpf, telefone from estoque_cliente order by nome')</from><to>$SqlSelect.parameters/String_1</to></copy> </assign> <invoke name="ListClientes" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <assign name="Assign_1_2"> <copy><from>string('aaa=11')</from><to>$AddLinkListIn1.parameters/String_1</to></copy> <copy><from>string('Novo')</from><to>$AddLinkListIn1.parameters/String_2</to></copy> <copy><from>string('aaa=12')</from><to>$AddLinkListIn2.parameters/String_1</to></copy> <copy><from>string('Excluir')</from><to>$AddLinkListIn2.parameters/String_2</to></copy> <copy><from>string('Clientes')</from><to>$LoadListIn1.parameters/String_1</to></copy> <copy><from>$ResultSelect.result/result</from><to>$LoadListIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldList_1_1" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn1"/> <invoke name="AddFieldList_1_2" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn2"/> <invoke name="LoadList_Cliente" partnerLink="Interface" operation="loadList" portType="ns2:wsInterfaceSEI" inputVariable="LoadListIn1"/> <invoke name="Page_1_1" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_1_3"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_1_1" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <if name="If_Cliente_Incluir"> <condition> ( $ResultInteraction.result/result = 11 ) </condition> <sequence name="Sequence_1_2"> <assign name="Assign_1_4"> <copy><from>string('TEXT')</from><to>$AddFieldFormIn1.parameters/String_1</to></copy> <copy><from>string('Nome')</from><to>$AddFieldFormIn1.parameters/String_2</to></copy> <copy><from>string('nome')</from><to>$AddFieldFormIn1.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn2.parameters/String_1</to></copy> <copy><from>string('CPF/CNPJ')</from><to>$AddFieldFormIn2.parameters/String_2</to></copy> <copy><from>string('cpf')</from><to>$AddFieldFormIn2.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn3.parameters/String_1</to></copy> <copy><from>string('Telefone')</from><to>$AddFieldFormIn3.parameters/String_2</to></copy> <copy><from>string('telefone')</from><to>$AddFieldFormIn3.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn3.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn3.parameters/String_5</to></copy>

Page 112: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

112

<copy><from>string('Cliente')</from><to>LoadFormIn1.parameters/String_1</to></copy> <copy><from>string('')</from><to>LoadFormIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldForm_Cliente_Nome" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn1"/> <invoke name="AddFieldForm_Cliente_Cpf" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn2"/> <invoke name="AddFieldForm_Cliente_Telefone" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn3"/> <invoke name="LoadForm_Cliente" partnerLink="Interface" operation="loadForm" portType="ns2:wsInterfaceSEI" inputVariable="LoadFormIn1"/> <invoke name="Page_1_2" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_1_5"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_1_2" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <assign name="Assign_1_6"> <copy><from>concat('insert into estoque_cliente (nome, cpf, telefone) values (', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ')')</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="ClienteIncluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> <if name="If_Cliente_Exluir"> <condition> ( $ResultInteraction.result/result = 12 ) </condition> <sequence name="Sequence_1_3"> <assign name="Assign_1_7"> <copy><from>concat('delete from estoque_cliente where id=', $ResultInteraction.result/result)</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="ClienteExcluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> </sequence> </while> <while name="While_OP_Fornecedor"> <condition> ( ( $ResultInteraction.result/result = 2 ) or ( $ResultInteraction.result/result = 12 ) or ( $ResultInteraction.result/result = 22 ) ) </condition> <sequence name="Sequence_2_1"> <assign name="Assign_2_1"> <copy><from>string('select id, nome, cpf, telefone from estoque_fornecedor order by nome')</from><to>$SqlSelect.parameters/String_1</to></copy> </assign> <invoke name="ListFornecedores" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <assign name="Assign_2_2"> <copy><from>string('aaa=21')</from><to>$AddLinkListIn1.parameters/String_1</to></copy> <copy><from>string('Novo')</from><to>$AddLinkListIn1.parameters/String_2</to></copy> <copy><from>string('aaa=22')</from><to>$AddLinkListIn2.parameters/String_1</to></copy> <copy><from>string('Excluir')</from><to>$AddLinkListIn2.parameters/String_2</to></copy> <copy><from>string('Fornecedores')</from><to>$LoadListIn1.parameters/String_1</to></copy> <copy><from>$ResultSelect.result/result</from><to>$LoadListIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldList_2_1" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn1"/> <invoke name="AddFieldList_2_2" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn2"/> <invoke name="LoadList_Fornecedor" partnerLink="Interface" operation="loadList" portType="ns2:wsInterfaceSEI" inputVariable="LoadListIn1"/> <invoke name="Page_2_1" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_2_3">

Page 113: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

113

<copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_2_1" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <if name="If_Fornecedor_Incluir"> <condition> ( $ResultInteraction.result/result = 21 )</condition> <sequence name="Sequence_2_2"> <assign name="Assign_2_4"> <copy><from>string('TEXT')</from><to>$AddFieldFormIn1.parameters/String_1</to></copy> <copy><from>string('Nome')</from><to>$AddFieldFormIn1.parameters/String_2</to></copy> <copy><from>string('nome')</from><to>$AddFieldFormIn1.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn2.parameters/String_1</to></copy> <copy><from>string('CPF/CNPJ')</from><to>$AddFieldFormIn2.parameters/String_2</to></copy> <copy><from>string('cpf')</from><to>$AddFieldFormIn2.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn3.parameters/String_1</to></copy> <copy><from>string('Telefone')</from><to>$AddFieldFormIn3.parameters/String_2</to></copy> <copy><from>string('telefone')</from><to>$AddFieldFormIn3.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn3.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn3.parameters/String_5</to></copy> <copy><from>string('Fornecedor')</from><to>LoadFormIn1.parameters/String_1</to></copy> <copy><from>string('')</from><to>LoadFormIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldForm_Fornecedor_Nome" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn1"/> <invoke name="AddFieldForm_Fornecedor_Cpf" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn2"/> <invoke name="AddFieldForm_Fornecedor_Telefone" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn3"/> <invoke name="LoadForm_Fornecedor" partnerLink="Interface" operation="loadForm" portType="ns2:wsInterfaceSEI" inputVariable="LoadFormIn1"/> <invoke name="Page_2_2" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_2_5"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_2_2" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <assign name="Assign_2_6"> <copy><from>concat('insert into estoque_fornecedor (nome, cpf, telefone) values (', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ')')</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="FornecedorIncluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> <if name="If_Fornecedor_Exluir"> <condition> ( $ResultInteraction.result/result = 22 ) </condition> <sequence name="Sequence_2_3"> <assign name="Assign_2_7"> <copy><from>concat('delete from estoque_fornecedor where id=', $ResultInteraction.result/result)</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="FornecedorExcluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> </sequence> </while> <while name="While_OP_Produto"> <condition> ( ( $ResultInteraction.result/result = 3 ) or ( $ResultInteraction.result/result = 31 ) ) </condition> <sequence name="Sequence_3_1"> <assign name="Assign_3_1">

Page 114: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

114

<copy><from>string('select id, nome, quantidade, valor from estoque_produto order by nome')</from><to>$SqlSelect.parameters/String_1</to></copy> </assign> <invoke name="ListProdutos" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <assign name="Assign_3_2"> <copy><from>string('aaa=31')</from><to>$AddLinkListIn1.parameters/String_1</to></copy> <copy><from>string('Novo')</from><to>$AddLinkListIn1.parameters/String_2</to></copy> <copy><from>string('aaa=32')</from><to>$AddLinkListIn2.parameters/String_1</to></copy> <copy><from>string('Excluir')</from><to>$AddLinkListIn2.parameters/String_2</to></copy> <copy><from>string('Produtos')</from><to>$LoadListIn1.parameters/String_1</to></copy> <copy><from>$ResultSelect.result/result</from><to>$LoadListIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldList_3_1" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn1"/> <invoke name="AddFieldList_3_2" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn2"/> <invoke name="LoadListProduto" partnerLink="Interface" operation="loadList" portType="ns2:wsInterfaceSEI" inputVariable="LoadListIn1"/> <invoke name="Page_3_1" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_3_3"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_3_1" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <if name="If_Produto_Incluir"> <condition> ( $ResultInteraction.result/result = 31 ) </condition> <sequence name="Sequence_3_2"> <assign name="Assign_3_4"> <copy><from>string('TEXT')</from><to>$AddFieldFormIn1.parameters/String_1</to></copy> <copy><from>string('Nome')</from><to>$AddFieldFormIn1.parameters/String_2</to></copy> <copy><from>string('nome')</from><to>$AddFieldFormIn1.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn2.parameters/String_1</to></copy> <copy><from>string('Quantidade')</from><to>$AddFieldFormIn2.parameters/String_2</to></copy> <copy><from>string('quantidade')</from><to>$AddFieldFormIn2.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn2.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn3.parameters/String_1</to></copy> <copy><from>string('Valor')</from><to>$AddFieldFormIn3.parameters/String_2</to></copy> <copy><from>string('valor')</from><to>$AddFieldFormIn3.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn3.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn3.parameters/String_5</to></copy> <copy><from>string('Produto')</from><to>LoadFormIn1.parameters/String_1</to></copy> <copy><from>string('')</from><to>LoadFormIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldForm_Produto_Nome" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn1"/> <invoke name="AddFieldForm_Produto_Quantidade" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn2"/> <invoke name="AddFieldForm_Produto_Valor" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn3"/> <invoke name="LoadForm_Produto" partnerLink="Interface" operation="loadForm" portType="ns2:wsInterfaceSEI" inputVariable="LoadFormIn1"/> <invoke name="Page_3_2" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_3_5"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_3_2" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <assign name="Assign_3_6"> <copy><from>concat('insert into estoque_produto(nome, quantidade, valor) values (', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ')')</from><to>$SqlExecute.parameters/String_1</to></copy>

Page 115: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

115

</assign> <invoke name="ProdutoIncluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> <if name="If_Fita_Exluir"> <condition> ( $ResultInteraction.result/result = 32 ) </condition> <sequence name="Sequence_3_3"> <assign name="Assign_3_7"> <copy><from>concat('delete from estoque_produto where id=', $ResultInteraction.result/result)</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="ProdutoExcluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> </sequence> </while> <while name="While_OP_Compra"> <condition> ( ( $ResultInteraction.result/result = 4 ) or ( $ResultInteraction.result/result = 41 ) ) </condition> <sequence name="Sequence_4_1"> <assign name="Assign_4_1"> <copy><from>string('select c.id, p.nome, f.nome, c.quantidade, c.valor from estoque_compra c, estoque_fornecedor f, estoque_produto p where c.fornecedor_id=f.id and c.produto_id=p.id order by id desc')</from><to>$SqlSelect.parameters/String_1</to></copy> </assign> <invoke name="ListCompras" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <assign name="Assign_4_2"> <copy><from>string('aaa=41')</from><to>$AddLinkListIn1.parameters/String_1</to></copy> <copy><from>string('Novo')</from><to>$AddLinkListIn1.parameters/String_2</to></copy> <copy><from>string('aaa=42')</from><to>$AddLinkListIn2.parameters/String_1</to></copy> <copy><from>string('Excluir')</from><to>$AddLinkListIn2.parameters/String_2</to></copy> <copy><from>string('Compras')</from><to>$LoadListIn1.parameters/String_1</to></copy> <copy><from>$ResultSelect.result/result</from><to>$LoadListIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldList_4_1" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn1"/> <invoke name="AddFieldList_4_2" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn2"/> <invoke name="LoadList_Compra" partnerLink="Interface" operation="loadList" portType="ns2:wsInterfaceSEI" inputVariable="LoadListIn1"/> <invoke name="Page_4_1" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_4_3"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_4_1" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <if name="If_Compra_Incluir"> <condition> ( $ResultInteraction.result/result = 41 ) </condition> <sequence name="Sequence_4_2"> <assign name="Assign_4_8"> <copy><from>string('select nome, id from estoque_fornecedor order by nome')</from><to>$SqlSelect.parameters/String_1</to></copy> <copy><from>string('select nome, id from estoque_produto order by nome')</from><to>$SqlSelect2.parameters/String_1</to></copy> </assign> <invoke name="ListaFornecedor_Compra" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <invoke name="ListaProduto_Compra" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect2" outputVariable="ResultSelect2"/> <assign name="Assign_4_4"> <copy><from>string('SELECT')</from><to>$AddFieldFormIn1.parameters/String_1</to></copy> <copy><from>string('Fornecedor')</from><to>$AddFieldFormIn1.parameters/String_2</to></copy> <copy><from>string('fornecedor_id')</from><to>$AddFieldFormIn1.parameters/String_3</to></copy>

Page 116: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

116

<copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>$ResultSelect.result/result</from><to>$AddFieldFormIn1.parameters/String_5</to></copy> <copy><from>string('SELECT')</from><to>$AddFieldFormIn2.parameters/String_1</to></copy> <copy><from>string('Produto')</from><to>$AddFieldFormIn2.parameters/String_2</to></copy> <copy><from>string('produto_id')</from><to>$AddFieldFormIn2.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>$ResultSelect2.result/result</from><to>$AddFieldFormIn2.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn3.parameters/String_1</to></copy> <copy><from>string('Quantidade')</from><to>$AddFieldFormIn3.parameters/String_2</to></copy> <copy><from>string('quantidade')</from><to>$AddFieldFormIn3.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn3.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn3.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn4.parameters/String_1</to></copy> <copy><from>string('Valor')</from><to>$AddFieldFormIn4.parameters/String_2</to></copy> <copy><from>string('valor')</from><to>$AddFieldFormIn4.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn4.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn4.parameters/String_5</to></copy> <copy><from>string('Compra')</from><to>LoadFormIn1.parameters/String_1</to></copy> <copy><from>string('')</from><to>LoadFormIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldForm_Compra_Fornecedor" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn1"/> <invoke name="AddFieldForm_Compra_Produto" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn2"/> <invoke name="AddFieldForm_Compra_Quantidade" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn3"/> <invoke name="AddFieldForm_Compra_Valor" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn4"/> <invoke name="LoadForm_Compra" partnerLink="Interface" operation="loadForm" portType="ns2:wsInterfaceSEI" inputVariable="LoadFormIn1"/> <invoke name="Page_4_2" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_4_5"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_4_2" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <assign name="Assign_4_6"> <copy><from>concat('insert into estoque_compra(fornecedor_id, produto_id, quantidade, valor) values (', $ResultInteraction.result/result,',', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ')')</from><to>$SqlExecute.parameters/String_1</to></copy> <copy><from>concat('update estoque_produto set quantidade=quantidade+', $ResultInteraction.result/result, ' where id=', $ResultInteraction.result/result)</from><to>$SqlExecute2.parameters/String_1</to></copy> </assign> <invoke name="CompraIncluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> <invoke name="CompraEstoque" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute2" outputVariable="ResultExecute2"/> </sequence> </if> <if name="If_Compra_Exluir"> <condition> ( $ResultInteraction.result/result = 42 ) </condition> <sequence name="Sequence_4_3"> <assign name="Assign_4_7"> <copy><from>concat('delete from estoque_compra where id=', $ResultInteraction.result/result)</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="CompraExcluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> </sequence> </while> <while name="While_OP_Venda"> <condition> ( ( $ResultInteraction.result/result = 5 ) or ( $ResultInteraction.result/result = 51 ) ) </condition> <sequence name="Sequence_5_1">

Page 117: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

117

<assign name="Assign_5_1"> <copy><from>string('select v.id, p.nome, c.nome, v.quantidade, v.valor from estoque_venda v, estoque_cliente c, estoque_produto p where v.cliente_id=c.id and v.produto_id=p.id order by id desc')</from><to>$SqlSelect.parameters/String_1</to></copy> </assign> <invoke name="ListVendas" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <assign name="Assign_5_2"> <copy><from>string('aaa=51')</from><to>$AddLinkListIn1.parameters/String_1</to></copy> <copy><from>string('Novo')</from><to>$AddLinkListIn1.parameters/String_2</to></copy> <copy><from>string('aaa=52')</from><to>$AddLinkListIn2.parameters/String_1</to></copy> <copy><from>string('Excluir')</from><to>$AddLinkListIn2.parameters/String_2</to></copy> <copy><from>string('Vendas')</from><to>$LoadListIn1.parameters/String_1</to></copy> <copy><from>$ResultSelect.result/result</from><to>$LoadListIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldList_5_1" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn1"/> <invoke name="AddFieldList_5_2" partnerLink="Interface" operation="addLinkList" portType="ns2:wsInterfaceSEI" inputVariable="AddLinkListIn2"/> <invoke name="LoadList_Venda" partnerLink="Interface" operation="loadList" portType="ns2:wsInterfaceSEI" inputVariable="LoadListIn1"/> <invoke name="Page_5_1" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_5_3"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_5_1" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <if name="If_Venda_Incluir"> <condition> ( $ResultInteraction.result/result = 51 ) </condition> <sequence name="Sequence_5_2"> <assign name="Assign_5_8"> <copy><from>string('select nome, id from estoque_cliente order by nome')</from><to>$SqlSelect.parameters/String_1</to></copy> <copy><from>string('select nome, id from estoque_produto order by nome')</from><to>$SqlSelect2.parameters/String_1</to></copy> </assign> <invoke name="ListaCliente_Venda" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect" outputVariable="ResultSelect"/> <invoke name="ListaProduto_Venda" partnerLink="Database" operation="select" portType="ns4:wsDatabaseSEI" inputVariable="SqlSelect2" outputVariable="ResultSelect2"/> <assign name="Assign_5_4"> <copy><from>string('SELECT')</from><to>$AddFieldFormIn1.parameters/String_1</to></copy> <copy><from>string('Cliente')</from><to>$AddFieldFormIn1.parameters/String_2</to></copy> <copy><from>string('cliente_id')</from><to>$AddFieldFormIn1.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>$ResultSelect.result/result</from><to>$AddFieldFormIn1.parameters/String_5</to></copy> <copy><from>string('SELECT')</from><to>$AddFieldFormIn2.parameters/String_1</to></copy> <copy><from>string('Produto')</from><to>$AddFieldFormIn2.parameters/String_2</to></copy> <copy><from>string('produto_id')</from><to>$AddFieldFormIn2.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn1.parameters/String_4</to></copy> <copy><from>$ResultSelect2.result/result</from><to>$AddFieldFormIn2.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn3.parameters/String_1</to></copy> <copy><from>string('Quantidade')</from><to>$AddFieldFormIn3.parameters/String_2</to></copy> <copy><from>string('quantidade')</from><to>$AddFieldFormIn3.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn3.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn3.parameters/String_5</to></copy> <copy><from>string('TEXT')</from><to>$AddFieldFormIn4.parameters/String_1</to></copy> <copy><from>string('Valor')</from><to>$AddFieldFormIn4.parameters/String_2</to></copy> <copy><from>string('valor')</from><to>$AddFieldFormIn4.parameters/String_3</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn4.parameters/String_4</to></copy> <copy><from>string('')</from><to>$AddFieldFormIn4.parameters/String_5</to></copy> <copy><from>string('Compra')</from><to>LoadFormIn1.parameters/String_1</to></copy> <copy><from>string('')</from><to>LoadFormIn1.parameters/String_2</to></copy> </assign> <invoke name="AddFieldForm_Venda_Cliente" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn1"/>

Page 118: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

118

<invoke name="AddFieldForm_Venda_Produto" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn2"/> <invoke name="AddFieldForm_Venda_Quantidade" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn3"/> <invoke name="AddFieldForm_Venda_Valor" partnerLink="Interface" operation="addFieldForm" portType="ns2:wsInterfaceSEI" inputVariable="AddFieldFormIn4"/> <invoke name="LoadForm_Venda" partnerLink="Interface" operation="loadForm" portType="ns2:wsInterfaceSEI" inputVariable="LoadFormIn1"/> <invoke name="Page_5_2" partnerLink="Interface" operation="format" portType="ns2:wsInterfaceSEI" inputVariable="FormatTrue" outputVariable="Page"/> <assign name="Assign_5_5"> <copy><from>$Page.result/result</from><to>$PageInteraction.parameters/String_1</to></copy> </assign> <invoke name="Interaction_5_2" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <assign name="Assign_5_6"> <copy><from>concat('insert into estoque_venda(cliente_id, produto_id, quantidade, valor) values (', $ResultInteraction.result/result,',', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ',', $ResultInteraction.result/result, ')')</from><to>$SqlExecute.parameters/String_1</to></copy> <copy><from>concat('update estoque_produto set quantidade=quantidade-', $ResultInteraction.result/result, ' where id=', $ResultInteraction.result/result)</from><to>$SqlExecute2.parameters/String_1</to></copy> </assign> <invoke name="VendaIncluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> <invoke name="VendaEstoque" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute2" outputVariable="ResultExecute2"/> </sequence> </if> <if name="If_Venda_Exluir"> <condition> ( $ResultInteraction.result/result = 52 ) </condition> <sequence name="Sequence_5_3"> <assign name="Assign_5_7"> <copy><from>concat('delete from estoque_venda where id=', $ResultInteraction.result/result)</from><to>$SqlExecute.parameters/String_1</to></copy> </assign> <invoke name="VendaExcluir" partnerLink="Database" operation="execute" portType="ns4:wsDatabaseSEI" inputVariable="SqlExecute" outputVariable="ResultExecute"/> </sequence> </if> </sequence> </while> <if name="If_End"> <assign name="Assign_9_1"> <copy><from>'Usuario desconectado'</from><to variable="PageInteraction"/></copy> <copy><from>false()</from><to>$resulLogin.result/result</to></copy> </assign> </if> </sequence> </while> <invoke name="PageEnd" partnerLink="Interaction" operation="requestResponse" portType="ns3:wsInteractionSEI" inputVariable="PageInteraction" outputVariable="ResultInteraction"/> <reply name="end" partnerLink="BusinessProcess" operation="operation1" portType="ns1:portType1" variable="outputVar"/> </sequence> </process>

Page 119: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

119

APÊNDICE C – SERVLET PARA SIMULAÇÃO DO PROCESSO DE NEGÓCIO DA APLICAÇÃO LOCAÇÃO DE VÍDEOS package processo; import java.io.*; import java.net.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class processoLocadora extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // variaveis String lista=""; String pagina=""; String[] resultado=new String[100]; int opcaoMenu=0; boolean logado=false; // Configurar aplicação Web try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.connect("","","jdbc:mysql://localhost/mestrado","com.mysql.jdbc.Driver"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.loadColor("#FFFFFF","#9EEB95","#DDDDDD","#9EEB95","#EEEEEE","#000000","#FF0000"); _wsInterfaceSEIPort.loadHeading("Sistema de Locadora"); _wsInterfaceSEIPort.loadBaseboard("... aplicaçao Web de locação de vídeos para trabalho de mestrado ..."); _wsInterfaceSEIPort.loadMenu("Cliente;aaa=1//Filme;aaa=2//Fita;aaa=3//Locação;aaa=4//Pagamento;aaa=5//Reserva;aaa=6//Sair;aaa=9"); _wsInterfaceSEIPort.addFieldForm("TEXT","E-mail","email","",""); _wsInterfaceSEIPort.addFieldForm("PASSWORD","Senha","senha","",""); _wsInterfaceSEIPort.loadForm("Acesso",""); pagina=_wsInterfaceSEIPort.format(false); } catch(Exception ex) { } // Loop até usuário logar while (!logado){ try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); logado=_wsDatabaseSEIPort.validate("select * from locadora_usuario where email=\""+resultado[0]+"\" and senha=\""+resultado[1]+"\""); } catch(Exception ex) { } } // Usuário logado try {

Page 120: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

120

interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } opcaoMenu=Integer.parseInt(resultado[0]); while (logado){ while (opcaoMenu==1 || opcaoMenu==11 || opcaoMenu==12){ // Carregar lista de cliente try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); lista=_wsDatabaseSEIPort.select("select id, nome, cpf, telefone from locadora_cliente order by nome"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addLinkList("aaa=11","Novo"); _wsInterfaceSEIPort.addLinkList("aaa=12","Excluir"); _wsInterfaceSEIPort.loadList("Clientes",lista); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } opcaoMenu=Integer.parseInt(resultado[0]); if (opcaoMenu==11){// Incluir cliente try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addFieldForm("TEXT","Nome","nome","",""); _wsInterfaceSEIPort.addFieldForm("TEXT","CPF/CNPJ","cpf","",""); _wsInterfaceSEIPort.addFieldForm("TEXT","Telefone","telefone","",""); _wsInterfaceSEIPort.loadForm("Cliente",""); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("insert into locadora_cliente (nome, cpf, telefone) values (\""+resultado[0]+"\",\""+resultado[1]+"\",\""+resultado[2]+"\")"); } catch(Exception ex) { } } if (opcaoMenu==12){ // Excluir cliente try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl();

Page 121: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

121

database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("delete from locadora_cliente where id="+resultado[1]); } catch(Exception ex) { } } } while (opcaoMenu==2 || opcaoMenu==21 || opcaoMenu==22){ // carregar lista de filmes try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); lista=_wsDatabaseSEIPort.select("select id, nome, sinopse, genero from locadora_filme order by nome"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addLinkList("aaa=21","Novo"); _wsInterfaceSEIPort.addLinkList("aaa=22","Excluir"); _wsInterfaceSEIPort.loadList("Filmes",lista); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } opcaoMenu=Integer.parseInt(resultado[0]); if (opcaoMenu==21){// Incluir filme try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addFieldForm("TEXT","Nome","nome","",""); _wsInterfaceSEIPort.addFieldForm("TEXT","Genero","genero","",""); _wsInterfaceSEIPort.addFieldForm("TEXTAREA","Sinopse","sinopse","",""); _wsInterfaceSEIPort.loadForm("Filme",""); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("insert into locadora_filme (nome, genero, sinopse) values (\""+resultado[0]+"\",\""+resultado[1]+"\",\""+resultado[2]+"\")"); } catch(Exception ex) { } } if (opcaoMenu==22){ // Excluir filme try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("delete from locadora_filme where id="+resultado[1]); } catch(Exception ex) { } } }

Page 122: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

122

while (opcaoMenu==3 || opcaoMenu==31 || opcaoMenu==32){ // carregar lista de fitas try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); lista=_wsDatabaseSEIPort.select("select t.id, f.nome, t.tipo, t.locada from locadora_filme f, locadora_fita t where t.filme_id=f.id order by f.nome, t.tipo"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addLinkList("aaa=31","Novo"); _wsInterfaceSEIPort.addLinkList("aaa=32","Excluir"); _wsInterfaceSEIPort.loadList("Fitas",lista); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } opcaoMenu=Integer.parseInt(resultado[0]); if (opcaoMenu==31){// Incluir fita String listaFilme=""; try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); listaFilme=_wsDatabaseSEIPort.select("select nome, id from locadora_filme order by nome"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addFieldForm("SELECT","Filme","filme_id","",listaFilme); _wsInterfaceSEIPort.addFieldForm("RADIO","Tipo","tipo","","DVD//VHS"); _wsInterfaceSEIPort.addFieldForm("SELECT","Locada","locada","0","Sim;1//Não;0"); _wsInterfaceSEIPort.loadForm("Fita",""); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("insert into locadora_fita (filme_id, tipo, locada) values (\""+resultado[0]+"\",\""+resultado[1]+"\",\""+resultado[2]+"\")"); } catch(Exception ex) { } } if (opcaoMenu==32){ // Excluir fita try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("delete from locadora_fita where id="+resultado[1]); } catch(Exception ex) { } } }

Page 123: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

123

while (opcaoMenu==4 || opcaoMenu==41 || opcaoMenu==42){ // Carregar lista de locações try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); lista=_wsDatabaseSEIPort.select("select l.id, f.nome, t.tipo, c.nome, l.data, l.dataDevolucao, l.valor from locadora_filme f, locadora_locacao l, locadora_fita t, locadora_cliente c where l.cliente_id=c.id and l.fita_id=t.id and t.filme_id=f.id order by l.id"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addLinkList("aaa=41","Novo"); _wsInterfaceSEIPort.addLinkList("aaa=42","Excluir"); _wsInterfaceSEIPort.loadList("Locações",lista); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } opcaoMenu=Integer.parseInt(resultado[0]); if (opcaoMenu==41){// Incluir locação String listaCliente=""; String listaFita=""; String hoje=""; try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); listaCliente=_wsDatabaseSEIPort.select("select nome, id from locadora_cliente order by nome"); listaFita=_wsDatabaseSEIPort.select("select f.nome, t.id from locadora_filme f, locadora_fita t where f.id=t.filme_id order by f.nome, t.tipo"); } catch(Exception ex) { } try { calendario.WsCalendario wsCalendario = new calendario.WsCalendario_Impl(); calendario.WsCalendarioSEI _wsCalendarioSEIPort = wsCalendario.getWsCalendarioSEIPort(); hoje=_wsCalendarioSEIPort.hoje(); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addFieldForm("SELECT","Cliente","cliente_id","",listaCliente); _wsInterfaceSEIPort.addFieldForm("SELECT","Fita","fita_id","",listaFita); _wsInterfaceSEIPort.addFieldForm("TEXT","Data","data",hoje,""); _wsInterfaceSEIPort.addFieldForm("TEXT","Data de Devolução","dataDevolucao","",""); _wsInterfaceSEIPort.addFieldForm("TEXT","Valor","valor","",""); _wsInterfaceSEIPort.addFieldForm("SELECT","Pago","pago","0","Sim;1//Não;0"); _wsInterfaceSEIPort.loadForm("Locação",""); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort();

Page 124: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

124

_wsDatabaseSEIPort.execute("insert into locadora_locacao (cliente_id, fita_id, data, dataDevolucao, valor, pago) values (\""+resultado[0]+"\",\""+resultado[1]+"\",\""+resultado[2]+"\",\""+resultado[3]+"\",\""+resultado[4]+"\",\""+resultado[5]+"\")"); } catch(Exception ex) { } } if (opcaoMenu==42){ // Excluir locaçao try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("delete from locadora_locacao where id="+resultado[1]); } catch(Exception ex) { } } } while (opcaoMenu==5 || opcaoMenu==51){ // Carregar lista de pagamentos try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); lista=_wsDatabaseSEIPort.select("select l.id, f.nome, t.tipo, c.nome, l.data, l.dataDevolucao, l.valor from locadora_filme f, locadora_locacao l, locadora_fita t, locadora_cliente c where l.cliente_id=c.id and l.fita_id=t.id and t.filme_id=f.id and l.pago=0 order by l.id"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addLinkList("aaa=51","Pagar"); _wsInterfaceSEIPort.loadList("Pagamentos",lista); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } opcaoMenu=Integer.parseInt(resultado[0]); if (opcaoMenu==51){ // fazer pagamento try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("update locadora_locacao set pago=1 where id="+resultado[1]); } catch(Exception ex) { } } } while (opcaoMenu==6 || opcaoMenu==61 || opcaoMenu==62){ // Carregar lista de reservas try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); lista=_wsDatabaseSEIPort.select("select r.id, c.nome, f.nome from locadora_filme f, locadora_cliente c, locadora_reserva r where r.filme_id=f.id and r.cliente_id=c.id order by r.id"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addLinkList("aaa=61","Novo"); _wsInterfaceSEIPort.addLinkList("aaa=62","Excluir"); _wsInterfaceSEIPort.loadList("Reservas",lista); pagina=_wsInterfaceSEIPort.format(true);

Page 125: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

125

} catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } opcaoMenu=Integer.parseInt(resultado[0]); if (opcaoMenu==61){// Incluir reservas String listaCliente=""; String listaFilme=""; try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); listaFilme=_wsDatabaseSEIPort.select("select nome, id from locadora_filme order by nome"); listaCliente=_wsDatabaseSEIPort.select("select nome, id from locadora_cliente order by nome"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addFieldForm("SELECT","Cliente","cliente_id","",listaCliente); _wsInterfaceSEIPort.addFieldForm("SELECT","Filme","filme_id","",listaFilme); _wsInterfaceSEIPort.loadForm("Reserva",""); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("insert into locadora_reserva (cliente_id, filme_id) values (\""+resultado[0]+"\",\""+resultado[1]+"\")"); } catch(Exception ex) { } } if (opcaoMenu==62){ // Excluir venda try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("delete from locadora_reserva where id="+resultado[1]); } catch(Exception ex) { } } } if (opcaoMenu==9){ pagina="Usuário desconectado"; logado=false; } } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); _wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } } }

Page 126: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

126

APÊNDICE D – SERVLET PARA SIMULAÇÃO DO PROCESSO DE NEGÓCIO DA APLICAÇÃO CONTROLE DE ESTOQUE package processo; import java.io.*; import java.net.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class processoEstoque extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // variaveis String lista=""; String pagina=""; String[] resultado=new String[100]; int opcaoMenu=0; boolean logado=false; // Configurar aplicação Web try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.connect("","","jdbc:mysql://localhost/mestrado","com.mysql.jdbc.Driver"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.loadColor("#FFFFFF","#E1E9EF","#EEEEEE","#E1E9EF","#EEEEEE","#000000","#FF0000"); _wsInterfaceSEIPort.loadHeading("Sistema de Estoque"); _wsInterfaceSEIPort.loadMenu("Cliente;aaa=1//Fornecedor;aaa=2//Produto;aaa=3//Compra;aaa=4//Venda;aaa=5//Sair;aaa=9"); _wsInterfaceSEIPort.loadBaseboard("... aplicaçao Web de controle de estoque para trabalho de mestrado ..."); _wsInterfaceSEIPort.addFieldForm("TEXT","E-mail","email","",""); _wsInterfaceSEIPort.addFieldForm("PASSWORD","Senha","senha","",""); _wsInterfaceSEIPort.loadForm("Acesso",""); pagina=_wsInterfaceSEIPort.format(false); } catch(Exception ex) { } // Loop até usuário logar while (!logado){ try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); logado=_wsDatabaseSEIPort.validate("select * from estoque_usuario where email=\""+resultado[0]+"\" and senha=\""+resultado[1]+"\""); } catch(Exception ex) { } } // Usuário logado try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort();

Page 127: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

127

pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } opcaoMenu=Integer.parseInt(resultado[0]); while (logado){ while (opcaoMenu==1 || opcaoMenu==11 || opcaoMenu==12){ // Carregar lista de cliente try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); lista=_wsDatabaseSEIPort.select("select id, nome, cpf, telefone from estoque_cliente order by nome"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addLinkList("aaa=11","Novo"); _wsInterfaceSEIPort.addLinkList("aaa=12","Excluir"); _wsInterfaceSEIPort.loadList("Clientes",lista); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } opcaoMenu=Integer.parseInt(resultado[0]); if (opcaoMenu==11){// Incluir cliente try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addFieldForm("TEXT","Nome","nome","",""); _wsInterfaceSEIPort.addFieldForm("TEXT","CPF/CNPJ","cpf","",""); _wsInterfaceSEIPort.addFieldForm("TEXT","Telefone","telefone","",""); _wsInterfaceSEIPort.loadForm("Cliente",""); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); String sql="insert into estoque_cliente (nome, cpf, telefone) values (\""+resultado[0]+"\",\""+resultado[1]+"\",\""+resultado[2]+"\")"; System.out.println(sql); _wsDatabaseSEIPort.execute(sql); } catch(Exception ex) { } } if (opcaoMenu==12){ // Excluir cliente try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl();

Page 128: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

128

database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("delete from estoque_cliente where id="+resultado[1]); } catch(Exception ex) { } } } while (opcaoMenu==2 || opcaoMenu==21 || opcaoMenu==22){ // carregar lista de fornecedores try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); lista=_wsDatabaseSEIPort.select("select id, nome, cpf, telefone from estoque_fornecedor order by nome"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addLinkList("aaa=21","Novo"); _wsInterfaceSEIPort.addLinkList("aaa=22","Excluir"); _wsInterfaceSEIPort.loadList("Fornecedores",lista); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } opcaoMenu=Integer.parseInt(resultado[0]); if (opcaoMenu==21){// Incluir fornecedor try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addFieldForm("TEXT","Nome","nome","",""); _wsInterfaceSEIPort.addFieldForm("TEXT","CPF/CNPJ","cpf","",""); _wsInterfaceSEIPort.addFieldForm("TEXT","Telefone","telefone","",""); _wsInterfaceSEIPort.loadForm("Fornecedor",""); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); String sql="insert into estoque_fornecedor (nome, cpf, telefone) values (\""+resultado[0]+"\",\""+resultado[1]+"\",\""+resultado[2]+"\")"; System.out.println(sql); _wsDatabaseSEIPort.execute(sql); } catch(Exception ex) { } } if (opcaoMenu==22){ // Excluir fornecedor try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("delete from estoque_fornecedor where id="+resultado[1]); } catch(Exception ex) { } }

Page 129: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

129

} while (opcaoMenu==3 || opcaoMenu==31 || opcaoMenu==32){ // carregar lista de produtos try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); lista=_wsDatabaseSEIPort.select("select id, nome, quantidade, valor from estoque_produto order by nome"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addLinkList("aaa=31","Novo"); _wsInterfaceSEIPort.addLinkList("aaa=32","Excluir"); _wsInterfaceSEIPort.loadList("Produtos",lista); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } opcaoMenu=Integer.parseInt(resultado[0]); if (opcaoMenu==31){// Incluir produto try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addFieldForm("TEXT","Nome","nome","",""); _wsInterfaceSEIPort.addFieldForm("TEXT","Quantidade","quantidade","",""); _wsInterfaceSEIPort.addFieldForm("TEXT","Valor","valor","",""); _wsInterfaceSEIPort.loadForm("Produto",""); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); String sql="insert into estoque_produto(nome, quantidade, valor) values (\""+resultado[0]+"\",\""+resultado[1]+"\",\""+resultado[2]+"\")"; System.out.println(sql); _wsDatabaseSEIPort.execute(sql); } catch(Exception ex) { } } if (opcaoMenu==32){ // Excluir produto try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("delete from estoque_produto where id="+resultado[1]); } catch(Exception ex) { } } } while (opcaoMenu==4 || opcaoMenu==41 || opcaoMenu==42){ // Carregar lista de compras try {

Page 130: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

130

database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); lista=_wsDatabaseSEIPort.select("select c.id, p.nome, f.nome, c.quantidade, c.valor from estoque_compra c, estoque_fornecedor f, estoque_produto p where c.fornecedor_id=f.id and c.produto_id=p.id order by id desc"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addLinkList("aaa=41","Novo"); _wsInterfaceSEIPort.addLinkList("aaa=42","Excluir"); _wsInterfaceSEIPort.loadList("Compras",lista); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } opcaoMenu=Integer.parseInt(resultado[0]); if (opcaoMenu==41){// Incluir compra String listaFornecedor=""; String listaProduto=""; try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); listaFornecedor=_wsDatabaseSEIPort.select("select nome, id from estoque_fornecedor order by nome"); listaProduto=_wsDatabaseSEIPort.select("select nome, id from estoque_produto order by nome"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addFieldForm("SELECT","Fornecedor","fornecedor_id","",listaFornecedor); _wsInterfaceSEIPort.addFieldForm("SELECT","Produto","produto_id","",listaProduto); _wsInterfaceSEIPort.addFieldForm("TEXT","Quantidade","quantidade","",""); _wsInterfaceSEIPort.addFieldForm("TEXT","Valor","valor","",""); _wsInterfaceSEIPort.loadForm("Compra",""); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("insert into estoque_compra(fornecedor_id, produto_id, quantidade, valor) values (\""+resultado[0]+"\",\""+resultado[1]+"\",\""+resultado[2]+"\",\""+resultado[3]+"\")"); _wsDatabaseSEIPort.execute("update estoque_produto set quantidade=quantidade+"+resultado[2]+" where id="+resultado[1]); } catch(Exception ex) { } } if (opcaoMenu==42){ // Excluir compras try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("delete from estoque_compra where id="+resultado[1]); } catch(Exception ex) { }

Page 131: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

131

} } while (opcaoMenu==5 || opcaoMenu==51 || opcaoMenu==52){ // Carregar lista de vendas try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); lista=_wsDatabaseSEIPort.select("select v.id, p.nome, c.nome, v.quantidade, v.valor from estoque_venda v, estoque_cliente c, estoque_produto p where v.cliente_id=c.id and v.produto_id=p.id order by id desc"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addLinkList("aaa=51","Novo"); _wsInterfaceSEIPort.addLinkList("aaa=52","Excluir"); _wsInterfaceSEIPort.loadList("Vendas",lista); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } opcaoMenu=Integer.parseInt(resultado[0]); if (opcaoMenu==51){// Incluir venda String listaCliente=""; String listaProduto=""; try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); listaCliente=_wsDatabaseSEIPort.select("select nome, id from estoque_cliente order by nome"); listaProduto=_wsDatabaseSEIPort.select("select nome, id from estoque_produto order by nome"); } catch(Exception ex) { } try { interfacew.WsInterface wsInterface = new interfacew.WsInterface_Impl(); interfacew.WsInterfaceSEI _wsInterfaceSEIPort = wsInterface.getWsInterfaceSEIPort(); _wsInterfaceSEIPort.addFieldForm("SELECT","Cliente","cliente_id","",listaCliente); _wsInterfaceSEIPort.addFieldForm("SELECT","Produto","produto_id","",listaProduto); _wsInterfaceSEIPort.addFieldForm("TEXT","Quantidade","quantidade","",""); _wsInterfaceSEIPort.addFieldForm("TEXT","Valor","valor","",""); _wsInterfaceSEIPort.loadForm("Venda",""); pagina=_wsInterfaceSEIPort.format(true); } catch(Exception ex) { } try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); resultado=_wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("insert into estoque_venda(cliente_id, produto_id, quantidade, valor) values (\""+resultado[0]+"\",\""+resultado[1]+"\",\""+resultado[2]+"\",\""+resultado[3]+"\")"); _wsDatabaseSEIPort.execute("update estoque_produto set quantidade=quantidade+"+resultado[2]+" where id="+resultado[1]); } catch(Exception ex) { } } if (opcaoMenu==52){ // Excluir venda

Page 132: UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf · 2011-08-05 · Carreira, meu sobrinho Cauã e em especial a minha namorada, Andréa Moretti,

132

try { database.WsDatabase wsDatabase = new database.WsDatabase_Impl(); database.WsDatabaseSEI _wsDatabaseSEIPort = wsDatabase.getWsDatabaseSEIPort(); _wsDatabaseSEIPort.execute("delete from estoque_venda where id="+resultado[1]); } catch(Exception ex) { } } } if (opcaoMenu==9){ pagina="Usuário desconectado"; logado=false; } } // Usuário desconectado - exibir mensagem try { interaction.WsInteraction wsInteraction = new interaction.WsInteraction_Impl(); interaction.WsInteractionSEI _wsInteractionSEIPort = wsInteraction.getWsInteractionSEIPort(); _wsInteractionSEIPort.requestResponse(pagina); } catch(Exception ex) { } } }