UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf ·...
Transcript of UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB …mestrado/diss/2007/zaupa.pdf ·...
FÁBIO GABRIEL ZAUPA
UM PROCESSO DE DESENVOLVIMENTO DE APLICAÇÕES WEB BASEADO EM SERVIÇOS
MARINGÁ
2007
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
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.
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
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.
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.
7
"É justamente a possibilidade de realizar um
sonho que torna a vida interessante."
Paulo Coelho (O Alquimista)
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.
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.
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
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
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
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
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
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.
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.
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.
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.
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.
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
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
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).
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.
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>
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>
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>
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>
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
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.
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
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:
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.
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>
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.
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
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.
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
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
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.
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
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
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
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:
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.
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.
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.
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>
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.
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>
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.
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.
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>
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;
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>
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.
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.
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.
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
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.
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.
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;
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
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;
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.
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.
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]; }
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
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> ...
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.
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.
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>
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>
73
Figura 20 - Aplicação locação de vídeos com os serviços já adicionados.
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"/>
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"/>
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"/>
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>
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.
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>
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.
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>.
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> …
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.
84
Figura 25 - Aplicação controle de estoque com os serviços já adicionados.
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" />
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
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) { } }...
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
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.
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.
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
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;
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.
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.
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.
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.
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.
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>
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>
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>
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"/>
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>
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">
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"/>
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">
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>
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">
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>
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>
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">
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>
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">
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">
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>
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>
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">
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"/>
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>
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 {
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();
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) { } } }
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) { } } }
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();
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);
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) { } } }
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();
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();
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) { } }
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 {
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) { }
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
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) { } } }