Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions Convert.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package main.java;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

public interface Convert {

ByteArrayOutputStream convertParaPDf (InputStream entrada );
}
46 changes: 46 additions & 0 deletions EnumTipoArquivo.java
Original file line number Diff line number Diff line change
@@ -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);
}



}
53 changes: 33 additions & 20 deletions PDFConverter.java
Original file line number Diff line number Diff line change
@@ -1,34 +1,47 @@
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
*
* @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();

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();
}




}
59 changes: 13 additions & 46 deletions README.md
Original file line number Diff line number Diff line change
@@ -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.