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 digite org.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 socialSecurityNumber applicantName applicantAddress applicantEmailAddress applicantAge applicantGender annualSalary amountRequested Type java.lang.String java.lang.String java.lang.String java.lang.String java.lang.Integer java.lang.String java.lang.Double 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 projeto 1. LoanRequestor: Escolha Arquivo > Novo projeto (Ctrl-Shift-N). Selecione BPEL Module na categoria SOA e clique em Next. 2. No campo Project Name, digite LoanRequestor e clique em Finish. Criando um Esquema XML Agora iremos adicionar um esquema XML ao projeto do módulo BPEL. Para criar o esquema 1. LoanRequestor.xsd: 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. 3. 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. 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. 4. Repita os passos de 1 a 3 para criar outro tipo complexo chamado processApplicRespType. 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 applicantName applicantAddress applicantEmailAddress applicantAge applicantGender annualSalary amountRequested Nillable True True True True True True True Definition string string string int string double 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 tipo processApplicType dentro do nodo Complex Types e clique em OK. 4. Repita os passos de 1 a 3 para adicionar um elemento global chamado processApplicRespElement e selecione processApplicRespType 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 1. LoanRequestor.wsdl: 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 para processApplicElement. Localize e expanda By File > LoanRequestor > src/LoanRequestor.xsd > Elements e selecione processApplicElement. 4. Na área de Output da página de Abstract Configuration faça o seguinte: a. Na coluna Message Part Name, altere o nome para responsePart e pressione Enter. b. Na coluna Element Or Type, clique no botão com reticências e modifique o elemento para processApplicRespElement. Localize e expanda By File > LoanRequestor > src/LoanRequestor.xsd > Elements e selecione processApplicRespElement. 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 1. LoanRequestor.bpel: 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 Web LoanProcessor. 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. 6. Altere o nome para EjbImplementation. Aceite os demais valores default e clique em OK. 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, selecione BpelImplementation na lista de Partner Links. O IDE automaticamente preenche o campo Operation com LoanRequestorOperation. 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. 6. Clique em OK para fechar o editor. A atividade Receive é agora rotulada como ReceiveFromCustomer e a conexão entre a atividade Receive e o Partner Link BpelImplementation é 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, selecione EjbImplementation na lista de Partner Links. O IDE automaticamente preenche o campo Operation com processApplicOperation. 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. 7. Dessa forma será criada uma nova variável de saída chamada ProcessApplicOperationOut. 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 Link EjbImplementation é 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, selecione BpelImplementation na lista de Partner Links. O IDE automaticamente preenche o campo Operation com LoanRequestorOperation. 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 Link BpelImplementation é 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 e InvokeLoanProcessorEJB. 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. 3. No editor, selecione o botão Mapper para abrir a janela do BPEL Mapper. 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 e amounRequested. 8. Salve suas modificações. 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 e ReplyToCustomer. 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 em LoanRequestor para o Provide Endpoint em LoanProcessorPort. 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 Endpoint LoanRequestPort para o Provide Endpoint BpelImplementation em LoanRequestor. 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, selecione LoanRequestorCompositeApp.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>[email protected]</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, selecione LoanRequestorCompositeApp.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>222-22-2222</loan:socialSecurityNumber> <loan:applicantName>Maria da Silva</loan:applicantName> <loan:applicantAddress>Rua Chapeco, 456</loan:applicantAddress> <loan:applicantEmailAddress>[email protected]</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. O IDE preenche Output.xml com informação default. 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 RejectedTestCase. Realize em seguida teste para verificar se tudo funciona corretamente (isto é, se o pedido é realmente rejeitado). 3. Salve todas as suas alterações.