US2007 - ArthurSchiavom/gestao-informacao-chao-de-fabrica--projeto-academico GitHub Wiki

US2007

1. Requisitos

Como Gestor de Produção, eu pretendo exportar, para um ficheiro XML, toda a infomação subjacente ao chão de fábrica (e.g. produtos,...)

2. Análise

SSD

SSD

3. Design

3.1. Realização da Funcionalidade

SD

SD

3.2. Diagrama de Classes

CD

CD

3.3. Padrões Aplicados

Para mais informação sobre os padrões, estão documentados exatamente quando são utilizados no documento SD.

Strategy - Para o caso de no futuro ser necessário exportar para formatos diferentes, ou utilizar uma forma diferente de exportar XML.

Service - Para que haja uma classe dedicada a guardar a lógica de exportar ficheiros

Factory - Para que haja uma classe com uma simples responsabilidade, de fabricar o strategy correto para a exportação

PureFabrication - Para o UI

3.4. Testes

Teste 1: Verificar que o exportador não pode exportar um objeto nulo

@Test
public void garantirQueNaoSePodeExportarUmChaoDeVazioNulo() {
    assertFalse(exportador.export("teste", null));
}

Teste 2: Verificar que o ficheiro XML exportado segue o ficheiro XSD

@Test
public void garantirQueExportacaoTemSucesso() {
    List<LinhaProducao> listaLinhaProd = new ArrayList<>();
    LinhaProducao linhaProd = new LinhaProducao("LINHAPROD_1");
    listaLinhaProd.add(new LinhaProducao("LINHAPROD_1"));

    List<Deposito> listaDepositos = new ArrayList<>();
    listaDepositos.add(new Deposito("COD1", "Deposito Teste"));

    List<Categoria> listaCategoria = new ArrayList<>();
    Categoria cat = new Categoria(new CodigoAlfanumericoCategoria("CAT1"), "Categoria Teste");
    listaCategoria.add(cat);

    List<Produto> listaProdutos = new ArrayList<>();
    ProdutoBuilder prodBuilder = new ProdutoBuilder();
    ProdutoRepository prodRepo = Mockito.mock(ProdutoRepository.class);

    Produto prod = null;
    try {
        prodBuilder.setCategoriaDeProduto("CAT1");
        prodBuilder.setDescricaoBreve("Descricao Teste Breve");
        prodBuilder.setDescricaoCompleta("Descricao Teste Completa");
        prodBuilder.setUnidadeDeMedida("kilogramas");
        prodBuilder.setCodigoUnico("COD1", prodRepo);
        prodBuilder.setCodigoComercial("CODCOM1", prodRepo);
        prod = prodBuilder.build();
    } catch (IllegalDomainValueException e) {
        e.printStackTrace();
    }
    assert (prod != null);
    listaProdutos.add(prod);

    List<Material> listaMateriais = new ArrayList<>();
    try {
        Material material = new Material("Descricao Material Teste",
                new CodigoInternoMaterial("COD_INT"), cat.codigoAlfanumericoCategoria,
                UnidadeDeMedida.KILOGRAMA, new FichaTecnicaPDF(".", "PDF",
                "Conteudo teste"));
        listaMateriais.add(material);
    } catch (IOException e) {
        e.printStackTrace();
    }

    List<QuantidadeDeMateriaPrima> listaQuantidadeMateriaPrima = new ArrayList<>();
    try {
        QuantidadeDeMateriaPrima quantidadeMateriaPrima = QuantidadeDeMateriaPrima.valueOf(QuantidadePositiva.valueOf(2), MateriaPrima.valueOf(TipoDeMateriaPrima.MATERIAL, "2"));
        listaQuantidadeMateriaPrima.add(quantidadeMateriaPrima);
    } catch (IllegalDomainValueException e) {
        e.printStackTrace();
    }
    List<FichaDeProducao> listaFichasProducao = new ArrayList<>();
    try {
        listaFichasProducao.add(FichaDeProducao.valueOf(listaQuantidadeMateriaPrima));
    } catch (IllegalDomainValueException e) {
        e.printStackTrace();
    }

    try {
        NumeroSerie.definirRegrasNumeroSerie("10", "1");
    } catch (IOException e) {
        e.printStackTrace();
    }
    List<Maquina> listaMaquinas = new ArrayList<>();
    listaMaquinas.add(new Maquina(new NumeroSerie("123"), new CodigoInternoMaquina("CODINT_1"),
            new OrdemLinhaProducao(1), new IdentificadorProtocoloComunicacao(1),
            "Maquina teste", "Rage Against The Computer", "XPTO", linhaProd));

    Date dateEmissao = null;
    Date datePrevEx = null;
    try {
        dateEmissao = new SimpleDateFormat("dd-MM-yyyy").parse("15-10-2013");
        datePrevEx = new SimpleDateFormat("dd-MM-yyyy").parse("15-10-2015");
    } catch (ParseException e) {
        e.printStackTrace();
    }
    assert dateEmissao != null;
    assert datePrevEx != null;

    List<IdentificadorEncomenda> listaIdentificadoresEncomenda = new ArrayList<>();
    listaIdentificadoresEncomenda.add(new IdentificadorEncomenda("ENCOMENDA1"));

    List<OrdemProducao> listaOrdensProducao = new ArrayList<>();
    try {
        listaOrdensProducao.add(new OrdemProducao(new Identificador("ORDEM1"), new QuantidadeAProduzir(1550),
                listaIdentificadoresEncomenda, dateEmissao, datePrevEx, Estado.CONCLUIDA, CodigoUnico.valueOf("COD1", produtoRepositoryIsNotPresent)));
    } catch (IllegalDomainValueException e) {
        e.printStackTrace();
    }

    File ficheiro = null;
    try {
        ficheiro = folder.newFile();
    } catch (IOException e) {
        e.printStackTrace();
    }
    assert ficheiro != null;

    LinhaProducaoRepository lProdRepo = Mockito.mock(LinhaProducaoRepository.class);
    MensagemRepository msgRepo = Mockito.mock(MensagemRepository.class);
    Mockito.when(lProdRepo.containsOfIdentity(new IdentificadorLinhaProducao("LINHAPROD_1"))).thenReturn(true);
    Mockito.when(msgRepo.containsOfIdentity(2L)).thenReturn(true);

    List<NotificacaoErro> listaNotificacoesErro = new ArrayList<>();
    NotificacaoErro notifErro = new NotificacaoErro(new IdentificadorLinhaProducao("LINHAPROD_1"),
            TipoErroNotificacao.DADOS_INVALIDOS, 2L, lProdRepo, msgRepo);
    listaNotificacoesErro.add(notifErro);

    ChaoDeFabrica chaoDeFabrica = new ChaoDeFabrica(false, listaLinhaProd, listaDepositos,
            listaCategoria, listaProdutos, listaMateriais, listaFichasProducao, listaMaquinas, listaOrdensProducao, listaNotificacoesErro);
    assertTrue(exportador.export(ficheiro, chaoDeFabrica));
    exportador.export(new File("ola"), chaoDeFabrica);

    JAXBContext jaxbContext;
    try
    {
        //Get JAXBContext
        jaxbContext = JAXBContext.newInstance(ChaoDeFabrica.class);

        //Create Unmarshaller
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

        //Setup schema validator
        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema employeeSchema = sf.newSchema(new File("../../XSD/chaoDeFabrica.xsd"));
        jaxbUnmarshaller.setSchema(employeeSchema);

        //Unmarshal xml file
        ChaoDeFabrica chaoDeFabrica1 = (ChaoDeFabrica) jaxbUnmarshaller.unmarshal(ficheiro);
        assertNotNull(chaoDeFabrica1);
    }
    catch (JAXBException | SAXException e)
    {
        e.printStackTrace();
        fail("XSD FALHOU");
    }
}

Teste 3: Verificar que o ficheiro XML exportado não está vazio

@Test
public void garantirQueNaoSePodeExportarBaseDeDadosVazia() {
    ChaoDeFabrica chaoDeFabrica = new ChaoDeFabrica();
    //De notar que nenhum dado foi carregado com a função loadAll()
    assertFalse(exportador.export("teste", chaoDeFabrica));
}

4. Integração/Demonstração

Para a implementação da exportação do ficheiro XML foi utilizado uma libraria de Java chamada JABX.

5. Observações

n/a

⚠️ **GitHub.com Fallback** ⚠️