Labs SD

Perguntas e respostas sobre o Projecto


Dúvidas 4ª Parte do Projecto

  1. Pergunta: São necessárias chamadas assíncronas no projeto ?

    Resposta: Não.


  2. 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.


  3. 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.


  4. 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.


  5. 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.


  6. 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).


  7. 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).


  8. 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.


  9. 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.


  10. 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.


  11. 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.


  12. Pergunta: É necessário proteger as comunicações entre mediator primário e secundário?

    Resposta: Não.


Dúvidas 3ª Parte do Projecto

  1. 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:


    • Acrescentar ao pom um plugin que evita o filtro durante a cópia dos ficheiros keystore:
              <plugin>
              	<groupId>org.komparator.CXX</groupId>
              	<artifactId>supplier-ws-cli</artifactId>
              	<version>1.0-SNAPSHOT</version>
              	<configuration>
              		<nonFilteredFileExtensions>
              			<nonFilteredFileExtension>jks</nonFilteredFileExtension>        		
              		</nonFilteredFileExtensions>
              	</configuration>
              </plugin>
      	
    • Indicar extensão a extensão quais o ficheiros que não devem ser filtrados.
          	<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>>
          

  2. 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


  3. 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.


  4. 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.


  5. 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:

    • Receber parâmetros via contexto (SOAPMessageContext)
      - esta técnica é ilustrada no exemplo handler_relay
    • Receber parâmetros via variáveis globais
      • Por exemplo, um objeto Singleton
      • Variáveis static nas próprias classes dos Handlers
      • JVM System properties, acessíveis depois por System.getProperty()

    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.


  6. 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.


  7. 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.


  8. 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.


  9. 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.


  10. 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;
    


  11. 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.


  12. 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.


  13. 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.


  14. 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.


  15. 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.


  16. 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);
    


  17. 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.


  18. 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).


  19. 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.


Dúvidas 2ª Parte do Projecto

  1. 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


  2. 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>
    


  3. 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."


  4. 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.


  5. Pergunta: O que deve fazer buyCart caso o carrinho não exista?

    Resposta: Devolver o erro InvalidCartId com uma mensagem adequada.


  6. Pergunta: Os produtos com quantidade 0 devem aparecer nos resultados de getItems e searchItems ?

    Resposta: Sim.


  7. Pergunta: O Mediator deve registar-se no UDDI?

    Resposta: Sim e deve chamar-se tal como é referido no enunciado.


Dúvidas 1ª Parte do Projecto

  1. 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.


  2. 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:

    • BadQuantity: significa que foi dada uma quantidade inválida. Independentemente do produto, só se pode comprar quantidades positivas.
    • InsufficientQuantity: significa que o fornecedor em causa não tem quantidade suficiente para satisfazer o pedido.


  3. Pergunta: O que é avaliado na 'Estrutura base' da primeira entrega?

    Resposta: Neste item de avaliação são considerados:

    • Configuração (POMs) - Estão corretos? A construção dos projetos faz-se sem problemas na linha de comando?
    • Código legível - Consegue-se ler o código e perceber o que faz? Tem comentários explicativos quando necessário?
    • Tratamento de exceções - O programa lida corretamente com as exceções?
      As melhores estratégias a seguir são discutidas na aula de ferramentas.
    • Sincronização correta de variáveis partilhadas - dado que o Web Service atende vários pedidos em paralelo (multi-thread),
      existe um uso adequado de synchronized ou de objetos já com sincronização incluída?
      Nesta primeira entrega basta verificar se o código fornecido lida corretamente com este requisito.


  4. Pergunta: O que deve fazer buyProduct caso o produto a comprar não exista?

    Resposta: Devolver o erro BadProductId com uma mensagem adequada.


  5. Pergunta: Os produtos com quantidade 0 devem aparecer nos resultados de getProduct e searchProducts ?

    Resposta: Sim.


  6. Pergunta: Como se executam os testes de integração?

    Resposta: Para executar os testes de integração:

    • Lançar o servidor:
      cd supplier-ws
      mvn compile exec:java
    • Correr os testes de integração:
      cd supplier-ws-cli
      mvn verify


  7. Pergunta: Para que serve o supplier-ws-cli?

    Resposta: O projeto supplier-ws-cli serve para:

    • Gerar os stubs do supplier-ws
    • Conter os testes de integração (...IT) do supplier-ws
    • Encapsular criação de stubs e invocações remotas a um servidor supplier-ws dentro da classe SupplierClient.


  8. 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