Prática em Laboratório N.04
Criando uma aplicação composta a partir de um serviço Web
O objetivo deste exercício é fornecer uma introdução a criação de uma aplicação composta de modo a ilustrar o processo de construção, implantação, execução e teste da mesma. Para tanto irá se implementar uma aplicação simples de avaliação de pedidos de empréstimos.
Business Use Case
A aplicação de processamento de pedidos de empréstimos satisfaz a seguintes requisitos:
• O cliente solicita um empréstimo através do preenchimento de uma solicitação de empréstimo que inclui informações tais como dados de identificação pessoal, quantia requisitada e histórico de crédito. • Quanto a solicitação de empréstimo é recebida, as informações pessoais fornecidas pelo cliente são
verificadas em um banco de dados existente e o empréstimo é aprovado ou rejeitado com base nas informações e no montante solicitado.
• Depois que certas formalidades forem cumpridas, um relatório, sob a forma de uma carta de aprovação (no caso de aprovação), é gerado e enviado ao cliente, confirmando assim a aprovação de sua solicitação de empréstimo.
• Se a solicitação de empréstimo for rejeitada por alguma razão, um relatório contendo os motivos da não aprovação é gerado e exibido para o cliente.
Criando um serviço Web com Lógica de Processamento de Empréstimos
Criando um módulo EJB:
1. Escolha Arquivo > Novo projeto (Ctrl-Shift-N). Selecione EJB Module na categoria Java EE e clique em Next.
2. No campo Project Name, digite
LoanProcessor
e clique em Next.3. Na página Server and Settings, verifique se o servidor selecionado é GlassFish V2, e clique em Finish. A janela de Projetos agora contém um nodo correspondente ao projeto de um EJB Module chamado
LoanProcessor.
Criando um serviço Web:
1. Na janela de Projetos, clique com o botão direito do mouse no nó
LoanProcessor
e escolha New > Web Service.2. Chame o serviço Web de
LoanProcessor
e digiteorg.me.loanprocessor
no Pacote. 3. Deixe selecionado Create Web Service from Scratch (Criar serviço Web do início). 4. Clique em Finish.O IDE cria o serviço Web e abre
LoanProcessor.java
no Editor.5. Expanda o nodo Web Services.
6. Clique com o botão direito do mouse sobre o nodo
LoanProcessor
(que representa o serviço Web) e selecione Add Operation. O diálogo Add Operation será exibido.7. No campo Name, digite
processApplicOperation
.8. Na lista de parâmetros, adicione os sete parâmetros conforme descritos a seguir. Name Type socialSecurityNumber java.lang.String applicantName java.lang.String applicantAddress java.lang.String applicantEmailAddress java.lang.String applicantAge java.lang.Integer applicantGender java.lang.String annualSalary java.lang.Double amountRequested java.lang.Double
9. Clique em OK.
10. No editor de código, clique no botão Source para exibir o código do arquivo
LoanProcessor.java
(caso ele não esteja visível).11. No Editor de código, substitua
//TODO write your implementation code here:
return
null;
pelo seguinte código:
int MINIMUM_AGE_LIMIT = 18; int MAXIMUM_AGE_LIMIT = 65; double MINIMUM_SALARY = 20000; int AVERAGE_LIFE_EXPECTANCY = 70;
String result = "Loan Application APPROVED.";
// Check age of applicant
// If less than min age limit, rejected if(applicantAge < MINIMUM_AGE_LIMIT) {
result = "Loan Application REJECTED - Reason: Under-aged " + applicantAge +
". Age needs to be over " + MINIMUM_AGE_LIMIT + " years to qualify."; System.out.println(result); return result; }
// Check age of applicant
// If more than max age limit, rejected if(applicantAge > MAXIMUM_AGE_LIMIT) {
result = "Loan Application REJECTED - Reason: Over-aged " + applicantAge +
". Age needs to be under " + MAXIMUM_AGE_LIMIT + " years to qualify."; System.out.println(result); return result; }
// Check annual salary
// If less than min salary, rejected if(annualSalary < MINIMUM_SALARY) {
result = "Loan Application REJECTED - Reason: Annual Salary $" + annualSalary +
" too low. Annual Salary needs to be over $" + MINIMUM_SALARY + " to qualify."; System.out.println(result); return result; }
// Calculate the years to pay off loan based on applicantAge int yearsToRepay = AVERAGE_LIFE_EXPECTANCY - applicantAge;
// Calculate the max amount of loan based on years to pay off loan double limit = annualSalary * yearsToRepay * 0.5;
// Check amount requested, if higher than limit, rejected if(amountRequested > limit) {
result = "Loan Application REJECTED - Reason: You are asking for too much $" + amountRequested + ". Annual Salary $" + annualSalary + ", Age " + applicantAge +
" years. Your limit is $" + limit; System.out.println(result); return result; } System.out.println(result); return result;
12. Salve suas alterações.
13. Compile (Clean and Build), implante (Deploy) e teste o serviço Web (selecione o nodo correspondente ao serviço Web e escolha Test Web Service).
Criando um Projeto para um Módulo BPEL
Agora iremos criar um projeto para conter um módulo BPEL chamado
LoanRequestor
. Para criar o projetoLoanRequestor
:1. Escolha Arquivo > Novo projeto (Ctrl-Shift-N). Selecione BPEL Module na categoria SOA e clique em Next.
Criando um Esquema XML
Agora iremos adicionar um esquema XML ao projeto do módulo BPEL. Para criar o esquema
LoanRequestor.xsd
:1. Expanda o nodo do projeto
LoanRequestor
, clique com o botão direito do mouse no nóProcess
Files
e escolha New > Other. O assitente New File será exibido.2. Faça o seguinte:
a. Selecione a categoria XML e, em seguida, XML Schema. Clique em Next. b. No campo File Name, digite
LoanRequestor
.c. Clique em Finish.
3. No editor, clique no botão de Design para abrir a visualização de Design do esquema XML.
Para adicionar tipos complexos ao esquema XML:
1. Na Paleta (a direita da janela de Design), expanda a seção XML Schema Components e selecione o ícone Complex Type. Se a Paleta não estiver visível, escolha Window > Palette a partir no menu principal.
2. Arreste sua seleção para a área de design sob o nodo Complex Types.
O IDE adicionará um nodo Complex Type e o nome do tipo complexo (newComplexType) estará selecionada e pronto para que você o altere.
3. Digite
processApplicType
como nome do novo nodo e pressione Enter.Para adicionar elementos locais ao tipo
processApplicType
:
1. Na seção XML Components da Paleta, selecione o ícone Element e arraste sua seleção sobre o nodo
processApplicType
da área de design. O IDE adicionará um nodo correspondente ao elemento com nome newElement.2. Se a janela de propriedade não estiver visível, escolha Window > Properties.
3. Utilize a janela Properties para modificar o nome do novo elemento para
socialSecurityNumber
. 4. Analogamente, modifique a propriedade Nillable para True.5. Altere a propriedade Definition, selecionando o tipo string dentro do nodo Built-in Types e clique em OK.
6. Repita os passos de 1 a 5 para adicionar os seguintes elementos:
Name Nillable
Definition
applicantName
True
string
applicantAddress
True
string
applicantEmailAddress
True
string
applicantAge
True
int
applicantGender
True
string
annualSalary
True
double
amountRequested
True
double
Para adicionar um elemento local ao tipo
processApplicRespType
:
1. Na seção XML Components da Paleta, selecione o ícone Element e arraste sua seleção sobre o nodo
processApplicRespType
da área de design. O IDE adicionará um nodo correspondente ao elemento com nome newElement.2. Utilize a janela Properties para modificar o nome do novo elemento para
return
.3. Altere a propriedade Definition, selecionando o tipo string dentro do nodo Built-in Types e clique em OK.
Para adicionar elementos globais:
1. Na seção XML Components da Paleta, selecione o ícone Element e arraste sua seleção sobre o nodo
Elements
da área de design. O IDE adicionará um nodo correspondente ao elemento com nome newElement.2. Utilize a janela Properties para modificar o nome do novo elemento para
processApplicElement
. 3. Altere a propriedade Definition, selecionando o tipoprocessApplicType
dentro do nodo ComplexTypes e clique em OK.
4. Repita os passos de 1 a 3 para adicionar um elemento global chamado
processApplicRespElement
e selecioneprocessApplicRespType
como para a definição do mesmo.5. Salve suas modificações.
Criando um Documento WSDL
Agora iremos adicionar um documento WSDL ao projeto do módulo BPEL. Para criar o documento
LoanRequestor.wsdl
:1. Expanda o nodo do projeto
LoanRequestor
, clique com o botão direito do mouse no nóProcess
Files
e escolha New > WSDL Document. O assitente de documentos WSDL será exibido.2. No campo File Name, digite
LoanRequestor
e clique em Next. 3. Na área de Input da página de Abstract Configuration faça o seguinte:a. Na coluna Message Part Name, altere o nome para
requestLoanMessage
e pressione Enter.b.
Na coluna Element Or Type, clique no botão com reticências e modifique o elemento paraprocessApplicElement
. Localize e expanda By File > LoanRequestor > src/LoanRequestor.xsd > Elements e selecioneprocessApplicElement
. 4. Na área de Output da página de Abstract Configuration faça o seguinte:b.
Na coluna Element Or Type, clique no botão com reticências e modifique o elemento paraprocessApplicRespElement
. Localize e expanda By File > LoanRequestor > src/LoanRequestor.xsd > Elements e selecioneprocessApplicRespElement
.5.
Clique em Finish e salve suas modificações.Criando um Processo BPEL
Agora iremos adicionar um processo BPEL ao projeto. Para criar o documento
LoanRequestor.bpel
:1. Expanda o nodo do projeto
LoanRequestor
, se já existir um nodo chamado basta selecioná-lo com um duplo clique e seguir para o próximo tópico. Caso contrário, clique com o botão direito do mouse no nóProcess Files
e escolha New > BPEL Process. O assitente New BPEL Process será exibido.2. No campo File Name, digite
LoanRequestor
. Clique em Finish.Para adicionar Partner Links:
1. Selecione o nodo
LoanRequestor.wsdl
. Arraste sua seleção (LoanRequestor.wsdl
) para o lado esquerdo da área de design (região da margem esquerda). O IDE irá lhe fornecer dicas visuais de modo a orientá-lo onde é possível colocar (drop) sua seleção.2. Use o Editor de Propriedades para alterar o nome para
BpelImplementation
(para ativar o editor, selecione o ícone com forma de lápis sobre a representação gráfica do Partner Link recém criado). 3. Aceite os demais valores default e clique em OK.4. Na janela de Projetos, expanda o nodo do projeto de módulo EJB
LoanProcessor
e selecione o nodo correspondente ao serviço WebLoanProcessor
.5. Arraste sua seleção (
LoanProcessor
) para o lado direito da área de design (região da margem direita). O IDE irá lhe fornecer dicas visuais de modo a orientá-lo onde é possível colocar (drop) sua seleção. Em seguida o diálogo Create New Partner Link será exibido.Para adicionar uma atividade Receive:
1. Na seção Web Service da Paleta, selecione o ícone Receive e arraste sua seleção para a área de design entre as atividades Process Start e Process End. O IDE adicionará um nodo correspondente a atividade com nome Receive1.
2. Clique no botão de edição para atividade recém inserida.
3. Altere o nome para
ReceiveFromCustomer
, selecioneBpelImplementation
na lista de Partner Links. O IDE automaticamente preenche o campo Operation comLoanRequestorOperation
. 4. Clique no botão Create próximo ao campo Input Variable. O diálogo New Input Variable é exibido,aceite os valores default e clique em OK.
5. Dessa forma será criada uma nova variável de entrada chamada
LoanRequestorOperationIn
.A atividade Receive é agora rotulada como
ReceiveFromCustomer
e a conexão entre a atividade Receive e o Partner LinkBpelImplementation
é exibida.Para adicionar uma atividade Invoke:
1. Na seção Web Service da Paleta, selecione o ícone Invoke e arraste sua seleção para a área de design logo abaixo da atividade
ReceiveFromCustomer
. O IDE adicionará um nodo correspondente a atividade com nome Invoke1.2. Clique no botão de edição para atividade recém inserida.
3. Altere o nome para
InvokeLoanProcessorEJB
, selecioneEjbImplementation
na lista de Partner Links. O IDE automaticamente preenche o campo Operation comprocessApplicOperation
. 4. Clique no botão Create próximo ao campo Input Variable. O diálogo New Input Variable é exibido,aceite os valores default e clique em OK.
5. Dessa forma será criada uma nova variável de entrada chamada
ProcessApplicOperationIn
. 6. Clique no botão Create próximo ao campo Output Variable. O diálogo New Output Variable é exibido,aceite os valores default e clique em OK.
8. Clique em OK para fechar o editor.
A atividade Invoke é agora rotulada como
InvokeLoanProcessorEJB
e a conexão entre a atividade Invoke e o Partner LinkEjbImplementation
é exibida.Para adicionar uma atividade Reply:
1. Na seção Web Service da Paleta, selecione o ícone Reply e arraste sua seleção para a área de design logo abaixo da atividade
InvokeLoanProcessorEJB
. O IDE adicionará um nodo correspondente a atividade com nome Reply1.2. Clique no botão de edição para atividade recém inserida.
3. Altere o nome para
ReplyToCustomer
, selecioneBpelImplementation
na lista de Partner Links. O IDE automaticamente preenche o campo Operation comLoanRequestorOperation
.4. Certifique-se que Normal Response está selecionado.
5. Clique no botão Create próximo ao campo Output Variable. O diálogo New Output Variable é exibido, aceite os valores default e clique em OK.
6. Dessa forma será criada uma nova variável de saída chamada
LoanRequestorOperationOut
.7. Clique em OK para fechar o editor.
A atividade Reply é agora rotulada como
ReplyToCustomer
e a conexão entre a atividade Reply e o Partner LinkBpelImplementation
é exibida.Para adicionar a atividade de Assign
CopyCustomerInfo
:
1. Na seção Basic Activities da Paleta, selecione o ícone Assign e arraste sua seleção para a área de design entre as atividades
ReceiveFromCustomer
eInvokeLoanProcessorEJB
. O IDE adicionará um nodo correspondente a atividade com nome Assign1.2. Use a janela de propriedades para alterar o nome da atividade para
CopyCustomerInfo
. Se a janela de propriedade não estiver visível, escolha Windows > Properties.4. No lado esquerdo da janela do BPEL Mapper, expanda os nodos Variables > LoanRequestorOperationIn > requestLoanMessage. Será, então, exibido um nodo para cada elemento local do tipo complexo
processApplicType
criado anteriormente no esquema.5. No lado direito da janela do BPEL Mapper, expanda os nodos Variables > ProcessApplicOperationIn > parameters. Será, então, exibido um nodo para cada elemento.
6. Arraste o nodo correspondente ao
socialSecurityNumber
do lado esquerdo (fonte) para o nodo de mesmo nome do lado direito (destino).7. Repita o passo anterior para cada um dos demais elementos:
applicantName
,applicantAddress
,applicantEmailAddress
,applicantAge
,applicantGender
,annualSalary
eamounRequested
.Para adicionar a atividade de Assign
CopyLoanStatus
:
1. No editor de BPEL, selecione o botão de Design para retornar a modo de design.
2. Na seção Basic Activities da Paleta, selecione o ícone Assign e arraste sua seleção para a área de design entre as atividades
InvokeLoanProcessorEJB
eReplyToCustomer
. O IDE adicionará um nodo correspondente a atividade com nome Assign1.3. Use a janela de propriedades para alterar o nome da atividade para
CopyLoanStatus
. Se a janela de propriedade não estiver visível, escolha Windows > Properties.4. No editor, selecione o botão Mapper para abrir a janela do BPEL Mapper.
5. No lado esquerdo da janela do BPEL Mapper, expanda os nodos Variables > ProcessApplicOperationOut > parameters. Será, então, exibido um nodo
return
.6. No lado direito da janela do BPEL Mapper, expanda os nodos Variables > LoanRequestorOperationOut > responsePart. Será, então, exibido um nodo
return
.7. Arraste o nodo correspondente ao
return
do lado esquerdo (fonte) para o nodo de mesmo nome do lado direito (destino).8. Salve suas modificações e compile seu projeto de módulo BPEL (selecione o nodo
LoanRequestor
com o botão direito e clique Clean and Build).Criando um Projeto de Aplicação Composta
Antes de implantar um projeto de módulo BPEL, devemos criar uma aplicação composta. Para criar um projeto de aplicação composta:
1. Escolha Arquivo > Novo projeto (Ctrl-Shift-N). Selecione Composite Application na categoria SOA e clique em Next.
2. No campo Project Name, digite
LoanRequestorCompositeApp
e clique em Finish.Usando Editor CASA (Composite Application Service Assembly)
Agora iremos utiliza o editor CASA para modificar a configuração do projeto e construir/implantar o projeto de módulo BPEL.
1. Selecione o nodo correspondente ao projeto
LoanRequestor
e arraste sua seleção para a área de módulos JBI.2. Clique no botão Build Project na barra de ferramentas do editor para construir o projeto de módulo BPEL
LoanRequestor
. Quando este passo se concluir:a. A janela de saída deverá conter uma mensagem indicando sucesso – BUILD SUCCESSFUL. b. O editor irá exibir a seguinte configuração.
Para criar WSDL Endpoints:
1. Na seção WSDL Bindings da Paleta, selecione o ícone SOAP e arraste sua seleção para a área de WSDL Ports (lado esquerdo do editor).
2. Use a janela de propriedades para alterar o nome do Endpoint
LoanProcessorPort
. Se a janela de propriedade não estiver visível, escolha Windows > Properties.3. Arraste o ícone de Consume Endpoint
EjbImplementation
emLoanRequestor
para o Provide Endpoint emLoanProcessorPort.
4. Use o Editor de Propriedades para alterar a propriedade Location (SOAP Address) do Endpoint
LoanProcessorPort
para http://localhost:8080/LoanProcessorService/LoanProcessor (para ativar o editor, selecione o ícone com forma de lápis junto a representação gráfica do Endpoint recém criado).5. Na seção WSDL Bindings da Paleta, selecione novamente o ícone SOAP e arraste sua seleção para a área de WSDL Ports (lado esquerdo do editor).
6. Use a janela de propriedades para alterar o nome do Endpoint
LoanRequestPort
. 7. Arraste o ícone de Consume EndpointLoanRequestPort
para o Provide EndpointBpelImplementation
emLoanRequestor.
8. Salve as alterações em seu projeto
.
Implantando e Testando uma Aplicação Composta
Para implantar um projeto de aplicação composta:
1. Selecione com o botão direito do mouse o nodo
LoanRequestorCompositeApp
e clique em Deploy.2. Verifique se a aplicação composta foi implantada corretamente. Vá a janela Services e expanda o nó Servers > Glassfish v2.1 > JBI > Service Assemblies. Verifique também se o módulo EJB ainda se encontra implantado. Vá a janela Services e expanda o nó Servers > Glassfish v2.1 > Applications > EJB Modules. Caso seja necessário repita o procedimento de implantação tanto da aplicação composta quanto do módulo EJB.
Para adicionar um caso de teste para uma requisição aprovada:
1. Expanda o nodo
LoanRequestorCompositeApp
e clique com o botão direito do mouse no nodo Test, selecione New Test Case no menu popup.2. No campo Test Case Name, digite
ApprovedTestCase
e clique em Next.3. Na página Select WSDL Document, expanda o nodo
LoanRequestorCompositeApp – Process
Files
, selecioneLoanRequestorCompositeApp.wsdl
e clique em Next.4. Na página Select Operation to Test, selecione
LoanRequestorOperation
e clique em Finish.O IDE irá adicionar um novo nodo sob o nodo Test chamado
ApprovedTestCase
. Esse nodo possui dois subnodos: Input e Output.5. Altere o arquivo Input.xml, para os seguintes valores:
<loan:socialSecurityNumber>111-11-1111</loan:socialSecurityNumber> <loan:applicantName>Joao da Silva</loan:applicantName>
<loan:applicantAddress>Rua das Flores, 234</loan:applicantAddress>
<loan:applicantEmailAddress>jsilva@gmail.com</loan:applicantEmailAddress> <loan:applicantAge>36</loan:applicantAge>
<loan:applicantGender>male</loan:applicantGender> <loan:annualSalary>100000</loan:annualSalary>
<loan:amountRequested>1000000</loan:amountRequested> 6. Feche o arquivo Input.xml e salve todas suas alterações.
Para adicionar um caso de teste para uma requisição rejeitada:
1. Expanda o nodo
LoanRequestorCompositeApp
e clique com o botão direito do mouse no nodo Test, selecione New Test Case no menu popup.2. No campo Test Case Name, digite
RejectedTestCase
e clique em Next.3. Na página Select WSDL Document, expanda o nodo
LoanRequestorCompositeApp – Process
Files
, selecioneLoanRequestorCompositeApp.wsdl
e clique em Next.O IDE irá adicionar um novo nodo sob o nodo Test chamado
ApprovedTestCase
. Esse nodo possui dois subnodos: Input e Output.5. Altere o arquivo Input.xml, para os seguintes valores:
<loan:socialSecurityNumber>222-22-2222</loan:socialSecurityNumber> <loan:applicantName>Maria da Silva</loan:applicantName>
<loan:applicantAddress>Rua Chapeco, 456</loa <loan:applicantEmailAddress> n:applicantAddress> msilva@gmail.com</loan:applicantEmailAddress> <loan:applicantAge>15</loan:applicantAge> <loan:applicantGender>female</loan:applicantGender> <loan:annualSalary>100000</loan:annualSalary> <loan:amountRequested>1000000</loan:amountRequested> 6. Feche o arquivo Input.xml e salve todas suas alterações.
Para preencher o caso de teste
ApprovedTestCase
com informação para validação:
1. Faça um duplo clique em Output.xml no nodo
ApprovedTestCase
, para examinar o conteúdo desse arquivo. Veja que ele está inicialmente vazio.2. Clique com o botão direito do mouse no nodo
ApprovedTestCase
, e selecione Run. Essa será uma execução especial (pois Output.xml está vazio) e o diálogo Overwrite Empty Output será exibido.3. Clique em Yes.
Para executar um caso de teste:
1. Clique com o botão direito do mouse no nodo
ApprovedTestCase
, e selecione Run. O conteúdo de Output.xml agora será preservado e utilizado para comparação.2. Execute procedimento análogo para preencher Output.xml do nodo