diff --git a/Convert.java b/Convert.java new file mode 100644 index 0000000..e4ae8f6 --- /dev/null +++ b/Convert.java @@ -0,0 +1,9 @@ +package main.java; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; + +public interface Convert { + + ByteArrayOutputStream convertParaPDf (InputStream entrada ); +} diff --git a/EnumTipoArquivo.java b/EnumTipoArquivo.java new file mode 100644 index 0000000..18c9d2d --- /dev/null +++ b/EnumTipoArquivo.java @@ -0,0 +1,46 @@ +package main.java; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.util.stream.Stream; + +public enum EnumTipoArquivo implements Convert { + + + + WORD() { + + @Override + + public ByteArrayOutputStream convertParaPDf(InputStream entrada ) { + //com.aspose.words.Document documentoWord = new com.aspose.words.Document(entrada); + ByteArrayOutputStream documentoPDF = new ByteArrayOutputStream(); + // documentoWord.save(documentoPDF, SaveFormat.PDF); + return documentoPDF; + } + }, + + EXCEL() { + @Override + public ByteArrayOutputStream convertParaPDf(InputStream entrada ) { + + ByteArrayOutputStream documentoPDF = new ByteArrayOutputStream(); + /* Workbook workbook = new Workbook(entrada); + PdfSaveOptions opcaoSalvar = new PdfSaveOptions(); + opcaoSalvar.setCompliance(PdfCompliance.PDF_A_1_B); + ByteArrayOutputStream documentoPDF = new ByteArrayOutputStream(); + workbook.save(documentoPDF, opcaoSalvar);*/ + return documentoPDF; + } + }; + + + + public static EnumTipoArquivo seachTipoArquivo(String tipoArquivo){ + EnumTipoArquivo[] values = EnumTipoArquivo.values(); + return Stream.of(values).filter(v->v.name().equals(tipoArquivo)).findFirst().orElse(null); + } + + + +} \ No newline at end of file diff --git a/PDFConverter.java b/PDFConverter.java index c7fb195..6069b0b 100644 --- a/PDFConverter.java +++ b/PDFConverter.java @@ -1,11 +1,20 @@ -public class ConversorPDF { +package main.java; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.util.Objects; + +public class PDFConverter{ + - // A aplicação foi projetada para tratar arquivos WORD, temos que cuidar para que - // alterações não mudem o comportamento, para que não exista reflexo para clientes - // legados public String tipoDocumento = "WORD"; + + /** + * Levei em consideração não quebrar a chamada do metodo para os cliente antigo. + * Imagine que o parametro TipoDcumento e acessado pelo cliente para setar o tipo de arquivo que ele quer converter. * Esse método recebe o como entrada o arquivo que vai ser convertido * para PDF * @@ -13,22 +22,26 @@ public class ConversorPDF { * @return */ public byte[] converteParaPDF(byte[] bytesArquivo){ - if(tipoDocumento.equals("WORD")) { - InputStream entrada = new ByteArrayInputStream(bytesArquivo); - com.aspose.words.Document documentoWord = new com.aspose.words.Document(entrada); - ByteArrayOutputStream documentoPDF = new ByteArrayOutputStream(); - documentoWord.save(documentoPDF, SaveFormat.PDF); - - return documentoPDF.toByteArray(); - } else { - InputStream entrada = new ByteArrayInputStream(bytesArquivo); - Workbook workbook = new Workbook(entrada); - PdfSaveOptions opcaoSalvar = new PdfSaveOptions(); - opcaoSalvar.setCompliance(PdfCompliance.PDF_A_1_B); - ByteArrayOutputStream documentoPDF = new ByteArrayOutputStream(); - workbook.save(documentoPDF, opcaoSalvar); - - return documentoPDF.toByteArray(); + + if(Objects.isNull(bytesArquivo)){ + + throw new IllegalArgumentException("Arquivo para conversao null"); } + + InputStream entrada = new ByteArrayInputStream(bytesArquivo); + EnumTipoArquivo arquivo = EnumTipoArquivo.seachTipoArquivo(tipoDocumento); + + if(Objects.isNull(arquivo)){ + + throw new IllegalArgumentException("tipo de arquivo não encontrado"); + } + + + ByteArrayOutputStream byteArrayOutputStream = arquivo.convertParaPDf(entrada); + return byteArrayOutputStream.toByteArray(); } + + + + } diff --git a/README.md b/README.md index bbe1173..6a7f2ae 100644 --- a/README.md +++ b/README.md @@ -1,51 +1,18 @@ -# quia-java - -Temos uma classe que converte documentos do Word para PDFs. A tarefa é simples, receber o arquivo Word e retornar ele em um formato PDF - Essa aplicação utiliza uma biblioteca que converte documentos do Word em PDFs. A biblioteca *Aspose.words*. - -O cliente pede para que seja adicionado a opção para converter o documentos Excel para PDF, e para isso adicionamos um condicional para efetuar essa transformação. Com isso temos a seguinte classe: -```java -public class ConversorPDF { - -    // A aplicação foi projetada para tratar arquivos WORD, alter o código vai modificar -    // o comportamento para os clientes antigos, é necessário garantir a compatibilidade -    // com clientes antigos nas novas alterações -    public String tipoDocumento = "WORD"; - - /** - * Esse método recebe como entrada o arquivo que vai ser convertido - * para PDF - * - * @param bytesArquivo - * @return - */ - public byte[] converteParaPDF(byte[] bytesArquivo){ - if(tipoDocumento.equals("WORD")) { - InputStream entrada = new ByteArrayInputStream(bytesArquivo); - com.aspose.words.Document documentoWord = new com.aspose.words.Document(entrada); - ByteArrayOutputStream documentoPDF = new ByteArrayOutputStream(); - documentoWord.save(documentoPDF, SaveFormat.PDF); - - return documentoPDF.toByteArray(); - } else { - InputStream entrada = new ByteArrayInputStream(bytesArquivo); - Workbook workbook = new Workbook(entrada); - PdfSaveOptions opcaoSalvar = new PdfSaveOptions(); - opcaoSalvar.setCompliance(PdfCompliance.PDF_A_1_B); - ByteArrayOutputStream documentoPDF = new ByteArrayOutputStream(); - workbook.save(documentoPDF, opcaoSalvar); - - return documentoPDF.toByteArray(); - } - } -} -``` -[PDFConverter](https://github.com/certsys/quia-java/blob/master/PDFConverter.java) - -Este código funcionará perfeitamente para o novo cliente (e ainda funcionará conforme o esperado para os clientes existentes), mas alguns problemas de design de software estão começando a aparecer no código. Isso significa que não estamos fazendo isso da maneira perfeita, e não seremos capazes de modificar nossa classe facilmente quando um novo tipo de documento for solicitado. + - **Quais são os problemas que você consegue enxergar aqui?** +Tem atributo de classe publico. +O metodo de conversão vai crescer muito a cada novo tipo d arquivo. +atributo sem validação. + - **Qual refatoração você propõe?** -Por favor, envie um pull request com as alterações que você recomendaria aqui. Tente gastar 30 minutos no máximo para todo o trabalho. Se você precisar de mais tempo, está fazendo algo errado. +Criar um enum com tipo de arquivo. +Se possivel para receber o enum tipo de arquivo talvez no contrutor da classe PDFConverter. + + + +Levei em consideração não quebrar a chamada do metodo para os cliente antigo. Imagine que o parametro TipoDcumento e acessado pelo cliente para setar o tipo de arquivo que ele quer converter. + -Além disso, se você acha que algo mais deve ser refatorado ainda mais, coloque suas idéias na descrição do pull request. +Obs. o codigo foi feito da ide eclipse.