Pergunta: São necessárias chamadas assíncronas no projeto ?
Resposta: Não.
Pergunta: Como separar a configuração da cadeia de handlers do mediator cliente da do mediator servidor ?
Resposta:
A geração de código da ferramenta wsimport
gera o código correspondente ao WSDL num package que
deriva do namespace.
Como o mediator cliente e mediator servidor dependem do mesmo
WSDL, o código é gerado duas vezes com o mesmo package.
E pode ser diferente, caso a configuração das cadeias de
handlers seja diferente.
Para evitar esta sobreposição, que leva a que a configuração da cadeia de handlers do mediator cliente possa ser ignorada, é necessário forçar a geração de código do mediator cliente a usar um package diferente. Esta configuração faz-se no pom.xml, na configuração do plug-in de JAX-WS:
<configuration> <!-- http://www.mojohaus.org/jaxws-maven-plugin/wsimport-mojo.html --> <wsdlDirectory>${wsdl.directory}</wsdlDirectory> <wsdlFiles> <wsdlFile>${wsdl.filename}</wsdlFile> </wsdlFiles> <packageName>org.komparator.mediator.ws.client</packageName> </configuration>
Após a geração do código com a opção packageName o pacote das classes muda e portanto será necessário ajustar os import de classes.
Pergunta: O que significa que um parâmetro deve ser configurável ?
Resposta:
Significa que deve poder ser ajustado durante a demonstração alterando o valor
apenas num único ficheiro.
Isto significa que devem ser usadas constantes no código
e/ou ficheiros de configuração e/ou propriedades de sistema.
Em resumo: qualquer mecanismo que permita mudar o valor de forma rápida.
Os parâmetros configuráveis permitirão a cada grupo "afinar" o funcionamento do seu trabalho na preparação para a demonstração.
Pergunta: Quantas vezes deve o cliente reenviar os pedidos ?
Resposta:
O cliente deve estar em ciclo a tentar reenviar o pedido,
consultando o UDDI antes de enviar nova tentativa.
Pode ser definido um limite máximo de tentativas configurável, mas por omissão deve tentar para sempre.
Pergunta: Quanto tempo deve o cliente esperar entre cada reenvio ?
Resposta:
Entre cada tentativa deve esperar algum tempo.
Este tempo irá depender do tempo máximo de recuperação do servidor,
que por sua vez depende do período do "I'm Alive" e do tempo máximo de propagação de mensagem.
Todos os intervalos de tempo envolvidos neste comportamento devem ser configuráveis.
Pergunta: Como pode ser enviado o identificador único de um dado pedido ao mediador?
Resposta:
O envio deste identificador é um requisito para poder
ter a semântica "no-máximo-uma-vez" do cliente para o servidor.
A forma mais transparente é através de um handler que acrescenta
esse valor às mensagens SOAP
(à semelhança do que se fazia para garantir a frescura das mensagens na segurança).
Pergunta: É possível comunicar com Web Services sem stubs ?
Resposta:
Sim, podem-se construir mensagens SOAP de forma manual e
depois enviar.
Mais informação nos exemplos SOAP da aula de Handlers
(ver javax.xml.soap.SOAPConnection).
Pergunta:
O mediator-ws pode depender do mediator-ws-cli?
Não é gerada uma dependência circular?
Resposta:
Na realidade o cliente do mediador não depende do mediador, mas sim do contrato WSDL.
Desta forma é possível que o módulo mediator-ws possa depender de mediator-ws-cli sem que isso obrigue a que exista uma dependência circular.
Pergunta: É possível modificar o WSDL para acrescentar operações de atualização de estado (ex. carrinho de compras)?
Resposta:
Sim, é possível.
Devem só ter a precaução de não quebrar a compatibilidade do contrato,
ou seja, as operações já existentes devem ser especificadas sem alteração.
Sugere-se que se mude o nome ao ficheiro do contrato para mediator.2_0.wsdl.
É de notar que estas novas operações são auxiliares e que, normalmente, não estariam acessíveis a clientes normais do mediator.
Pergunta: É necessário ter a parte 3 a funcionar por completo para poder começar a parte 4?
Resposta: Não.
Para iniciar o desenvolvimento da parte 4 podem-se simplesmente comentar todas as cadeias de Handlers de segurança para concentrar esforços nos novos desenvolvimentos da tolerância a faltas.
Caso o grupo não tenha concluído a implementação da parte 3, deve deixar as partes inacabadas por fazer.
Caso o grupo tenha concluído a parte 3, pode mesmo assim optar por comentar os handlers durante o desenvolvimento da parte 4, para simplificar o desenvolvimento e testes.
Para os grupos que tenham realizado as duas partes, a demonstração final do projeto irá valorizar o esforço de integração da segurança e da tolerância a faltas.
Pergunta: É necessário replicar o UDDI?
Resposta: Por simplificação, pode-se assumir o UDDI como sendo 100% disponível, não sendo necessário efectuar a sua replicação.
Pergunta: É necessário proteger as comunicações entre mediator primário e secundário?
Resposta: Não.
Pergunta: Já experimentei vários métodos para extrair uma chave privada de um keystore e continuo com problemas. O que se pode estar a passar? [nova]
Resposta: Quando o maven copia os ficheiros keystore (.jks) para o directório de construção assume que estes são ficheiros de texto e faz uma conversão automática de alguns caracteres ASCII, causando a corrupção dos ficheiros keystore. Para resolver este problema pode-se:
<plugin> <groupId>org.komparator.CXX</groupId> <artifactId>supplier-ws-cli</artifactId> <version>1.0-SNAPSHOT</version> <configuration> <nonFilteredFileExtensions> <nonFilteredFileExtension>jks</nonFilteredFileExtension> </nonFilteredFileExtensions> </configuration> </plugin>
<resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <excludes>> <exclude>**/*.jks</exclude> <exclude>**/*.xml</exclude> <exclude>**/*.cer</exclude> </excludes> </resource> <resource> <directory>>src/main/resources</directory> <filtering>>false</filtering> <includes>> <include>**/*.jks</include> <include>**/*.xml</include> <include>**/*.cer</include> </includes>> </resource>> </resources>>
Pergunta: Como se pode automatizar a compilação de todos os módulos ?
Segure-se incluir um POM mestre que permite a instalação de todos os módulos,pela ordem correta, e com um único comando:
mvn clean install -DskipITs
Pergunta: É necessário incluir as bibliotecas das aulas de laboratório na entrega ?
Podem assumir que as versões publicadas de uddi-naming, ws-handlers, cert-util estarão instaladas no repositório Maven do ambiente de avaliação.
Pergunta: Que notação usar na figura ilustrativa do relatório ?
A notação da figura da solução é livre mas sugere-se a utilização de UML, por ser um standard. O mais importante é ajudar a perceber a vossa solução.
Relembra-se que o relatório deve explicar os mecanismos de proteção
do canal client-mediator e
do canal mediator-supplier através de mensagens SOAP legendadas
i.e. explicando os elementos adicionados e para que servem.
As mensagens SOAP podem ser abreviadas.
Pergunta: Como pode um Handler receber parâmetros de configuração ?
Os Handlers são classes Java como quaisquer outras. No entanto, como são construídas pelo Web Services Run-time e não pela aplicação, não há forma direta de lhes aceder.
Assim sendo, algumas formas possíveis de configurar um Handler são as seguintes:
As variáveis são globais à instância da Java Virtual Machine (JVM) que corresponde a um processo no sistema operativo; por isso, diferentes programas em execução terão diferentes valores nas variáveis.
As variáveis globais podem ser preenchidas, por exemplo, no método main() do programa.
Pergunta: Quando se deve consultar a CA (Certificate Authority) ?
A CA deve ser consultada sempre que se precisar de aceder a um certificado de uma entidade.
Por exemplo, para verificar uma assinatura digital pode-se pedir à CA o certificado do assinante, e depois usar a chave pública para verificar a mensagem.
É importante confirmar que o certificado recebido foi mesmo assinado pela CA.
Depois de recebido o certificado, este pode ser mantido em memória para utilização futura.
Pergunta: Qual é a keystore pass, a key alias e a key password para conseguir aceder à chave privada do keystore ?
A password do keystore e da key é mesma que o grupo usa para o UDDI da RNL.
A key alias é o nome do serviço em letras minúsculas. Por exemplo, para o mediator do grupo T99, é t99_mediator.
Pergunta: Como pode o handler saber o destinatário da mensagem SOAP ?
Resposta: O SOAPMessageContext tem vários atributos relevantes. Entre eles encontra-se o endereço (URL) do destinatário. Cruzando esta informação com a listagem obtida do UDDI é possível descobrir o nome do destinatário.
Pergunta: O que se deve fazer a uma mensagem SOAP cuja assinatura não está correta ?
Resposta:
O essencial é que as mensagens comprometidas sejam rejeitadas e que isso se possa verificar.
Por exemplo, o handler que deteta o problema pode atirar uma RunTimeException (ou sub-classe) e depois o cliente vai receber uma SOAPFaultException com a respetiva mensagem de erro.
Pergunta: Como se podem representar dados binários (byte[]) em texto (String) ?
Resposta: Podem usar codificação de base 64 para transportar dados binários em texto.
Sugerimos a utilização dos seguintes métodos:
import static javax.xml.bind.DatatypeConverter.parseBase64Binary; import static javax.xml.bind.DatatypeConverter.printBase64Binary;
Pergunta: A assinatura digital deve englobar apenas o body da mensagem SOAP?
Resposta: A assinatura deve englobar o body da mensagem e todos os outros itens de informação que sejam necessários para a sua validação, como identificadores, marcas temporais, etc.
Pergunta: Onde devem ser colocadas as keystores das chaves privadas ? [nova] [Estendida]
Resposta:
As keystores podem ser colocadas como recursos de cada aplicação, ou seja, em src/main/resources.
Cada aplicação deve ter uma keystore com a sua chave privada e o certificado de chave pública da CA.
Estes recursos são "empacotados" juntos com a aplicação e podem depois ser acedidos com .getResourceAsStream(resourcePath).
A classe CertUtil têm métodos de exemplo que permitem ler chaves de keystores e de certificados a partir de recursos da aplicação.
Para obter ficheiros que estejam na raíz dos recursos,
a resource path deve começar por "/".
Por exemplo, para obter src/main/resources/ca.cer,
o caminho de recurso será /ca.cer.
Pergunta: É necessário depender de ws-handlers, cert-util e outros módulos de exemplo ?
Resposta: A escolha de dependências e a sua gestão é da responsabilidade do grupo.
Para simplificar a gestão de dependências podem-se copiar (e adaptar) as classes de exemplo, copiando-as para o módulo security.
Pergunta: Deve usar-se o LoggingHandler do módulo ws-handlers ou do módulo security ?
Resposta: A escolha de dependências e a sua gestão é da responsabilidade do grupo.
Neste caso concreto, sugere-se que se utilize apenas o módulo security, criando ou copiando as classes que forem necessárias.
Pergunta: A solução pode ter mais do que um handler?
Resposta:
Os Handlers são objetos individuais que podem depois ser compostos numa cadeia de processamento.
Idealmente cada handler deve realizar apenas uma função,
de modo a que possa ser mais reutilizável.
No entanto, a nível de programação, nada impede que um handler faça várias coisas. Trata-se portanto de uma questão de estilo de programação.
Pergunta: Como se pode converte um certificado de texto para objeto?
Resposta: Sugerimos a utilização dos seguintes métodos:
byte[] bytes = certificateString.getBytes(StandardCharsets.UTF_8); InputStream in = new ByteArrayInputStream(bytes); CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); Certificate cert = certFactory.generateCertificate(in);
Pergunta: É necessário proteger as comunicações entre clientes e mediator, e com o UDDI?
Resposta:
É necessário proteger o número de cartão de crédito entre mediator-ws-cli e mediator.
É também necessário garantir a autenticidade, integridade e frescura das mensagens entre supplier-ws-cli e supplier-ws.
De resto, não é necessário para simplificação do projeto.
Pergunta: Porque é que algumas chaves têm que ser distribuídas manualmente antes do arranque do sistema?
Resposta:
O sistema, para ser seguro, necessita de ter um ponto de partida para a confiança (uma trust root, raíz de confiança).
Só depois é seguro trocar chaves entre servidores, desde que certificadas,
cujas assinaturas podem ser verificadas com as chaves que fazem parte da trust root
(e.g. chave pública da CA).
Pergunta: Como se podem obter as chaves e certificados digitais?
Resposta: Os pares de chaves das entidades foram gerados antes do início do funcionamento da comunicação entre servidores.
Cada grupo pode aceder à página das chaves, fazer download de um ZIP com as chaves do seu grupo e aceder ao conteúdo (a senha do ZIP é igual à senha de UDDI).
Para gerar estes certificados foram usadas as ferramentas keytool e openssl tal como exemplificado neste script.
Pergunta: Que números de cartão de crédito válidos podemos utilizar nos testes de integração do mediador?
Resposta: Alguns exemplos de números válidos são: 4024007102923926, 4556648855991861, 4024007141789403, 4677292597378279
Pergunta: Como devem ser preenchidos produtos nos fornecedores para os testes do mediador?
Resposta:
O módulo de testes do mediador,
mediator-ws-cli,
deve usar a classe
SupplierClient para criar produtos nos fornecedores.
Para poder usar esta classe,
deve ser acrescentada a dependência do módulo
supplier-ws-cli apenas no âmbito de testes.
<dependency> <groupId>org.komparator.CXX</groupId> <artifactId>supplier-ws-cli</artifactId> <version>1.0-SNAPSHOT</version> <scope>test</scope> </dependency>
Pergunta: Quantos fornecedores são necessários para os testes do mediador?
Resposta:
Página 5 do enunciado:
"Na segunda parte deverá ser implementado o serviço de mediação com (pelo
menos) 2 fornecedores associados."
Pergunta: Em que situação é que buyCart devolve o erro EmptyCart?
Resposta:
Quando o cliente pede para comprar um carrinho vazio.
No entanto, com as operações disponíveis não é possível esta situação ser testada.
Ou seja, não é possível a um cliente criar um carrinho vazio pois o carrinho é implicitamente criado quando se adiciona o primeiro produto, e não é possível remover produtos do carrinho.
Pergunta: O que deve fazer buyCart caso o carrinho não exista?
Resposta: Devolver o erro InvalidCartId com uma mensagem adequada.
Pergunta: Os produtos com quantidade 0 devem aparecer nos resultados de getItems e searchItems ?
Resposta: Sim.
Pergunta: O Mediator deve registar-se no UDDI?
Resposta: Sim e deve chamar-se tal como é referido no enunciado.
Pergunta: É necessário fazer testes para as operações auxiliares ?
Resposta:
No enunciado refere-se que as operações auxiliares
- ping, clear, createProduct, listProducts, listPurchases -
se "destinam a auxiliar os testes e não necessitam de ser testadas exaustivamente".
Sendo mais concreto, podem fazer testes para estas operações,
mas estes testes não serão avaliados.
Já as operações principais - getProduct, searchProducts, buyProduct - podem e devem ser testadas o melhor possível.
Pergunta: Em que situações devem ser lançadas as exceções BadQuantity e InsufficientQuantity?
Resposta: As duas exceções têm o seguinte significado:
Pergunta: O que é avaliado na 'Estrutura base' da primeira entrega?
Resposta: Neste item de avaliação são considerados:
Pergunta: O que deve fazer buyProduct caso o produto a comprar não exista?
Resposta: Devolver o erro BadProductId com uma mensagem adequada.
Pergunta: Os produtos com quantidade 0 devem aparecer nos resultados de getProduct e searchProducts ?
Resposta: Sim.
Pergunta: Como se executam os testes de integração?
Resposta: Para executar os testes de integração:
Pergunta: Para que serve o supplier-ws-cli?
Resposta: O projeto supplier-ws-cli serve para:
Pergunta: O que deve fazer a classe ...ClientApp?
Resposta:
Esta classe deve ter um método static main que serve apenas para fazer uma invocação simples do servidor.
Sugere-se que faça um ping() e que imprima os resultados para a consola.
Para executar, fazer: mvn compile exec:java e ver o resultado do ping.
© Docentes de Sistemas Distribuídos,
Dep. Eng. Informática,
Instituto Superior Técnico, Universidade de Lisboa