Exercício 4: CópiaTurbinada
CopiaTurbinada
Vamos exercitar neste exercício, dois padrões de projeto do livro GoF: o Strategy que já aprendemos e o Decorator, que vocês vão aprender sozinhos agora :-) Para estudar o padrão Decorator sozinhos, vocês devem ler essas 4 páginas Web:
Estudar padrão Decorator:
Neste exercício, você irá implementar um comando CopiaTurbinada em java que copia arquivos de uma origem para um destino. Como origem, o usuário irá poder definir: teclado ou arquivo; caso seja teclado, o seu programa deverá ler o conteúdo da entrada padrão, caso seja arquivo, o nome de um arquivo deve ser passado como argumento para o seu programa. Como destino, o usuário irá poder definir: tela ou arquivo; caso seja tela, o seu programa deve imprimir o conteúdo na saída padrão; caso seja arquivo, o nome de um arquivo deve ser passado como argumento para o seu programa. Você deve obrigatoriamente usar o padrão Strategy para organizar o seu código para esses vários tipos diferentes de entrada e saída.
Valendo 1 ponto extra: opcionalmente, você poderá implementar também a entrada e a saída como sendo uma conexão de rede. Para testar essa opção, caso você não tenha acesso a uma máquina com endereço IP real na Internet, você pode usar duas máquinas diferentes, por exemplo, na rede WiFi local de sua casa. Descubra o endereço IP do seu computador após conectá-lo à rede sem fio e use esse endereço (note que esse endereço vale apenas dentro da sua rede sem fio, ou seja, não é um endereço IP real que vale na Internet inteira). Outra opção mais simples ainda é você usar localhost como endereço IP da máquina, assim você testa tudo localmente no seu notebook.
Essa cópia do arquivo da origem para o destino poderá envolver também compressão/descompressão dos dados e criptografação/descriptografação dos dados. Para tanto, você deve obrigatoriamente utilizar o padrão Decorator para acrescentar (ou não) decoradores para comprimir, descomprimir, criptografar, descriptografar o conteúdo.
Exemplos de uso do seu programa:
java CopiaTurbinada -origem -arquivo banana.txt -destino -arquivo laranja.txt
java CopiaTurbinada -origem -arquivo banana.txt -destino -arquivo -comprimido laranja.zip
java CopiaTurbinada -origem -arquivo -comprimido laranja.zip -destino tela
java CopiaTurbinada -origem -teclado -destino -arquivo -criptografado -senha 345 segredo.cript
java CopiaTurbinada -origem -arquivo -criptografado -senha 345 segredo.cript -destino -tela
java CopiaTurbinada -origem -teclado -destino -arquivo -comprimido -criptografado -senha 5432 segredinho.zip.cript
Sugestão, dê uma olhada em:
java.util.zip.ZipOutputStream / java.util.zip.ZipInputStream
javax.crypto.Cipher
Você não precisa necessariamente usar as classes acima, é apenas uma sugestão.
- O exercício deve ser feito individualmente.
- O enunciado acima não dá a receita de bolo de como resolver todos os problemas. Você precisará pesquisar na Internet, escrever dúvidas no Fórum e discutir com os colegas.
- Fiquem à vontade para postar dúvidas no Fórum e também para trocar
experiências no Fórum; por exemplo, se descobrir uma biblioteca de
software livre legal ou alguma classe da biblioteca padrão de java que
ajude bastante, pode postar no Fórum. Você apenas não pode postar seu
código no fórum.
- Você pode discutir soluções com os colegas mas não pode compartilhar o código da sua solução com seus colegas de disciplina.
- Plágio é vedado pelo código de ética da USP e, caso seja detectado, tanto o plagiado quanto o plagiador receberão nota -10 no exercício. No caso de reincidência, ambos terão nota 0 na disciplina.
Critérios de correção:
- Bom uso do padrão Strategy para organizar o código para os vários tipos diferentes de entrada e saída (2.5 pontos)
- Bom uso do padrão Decorator para acrescentar (ou não) decoradores para comprimir, descomprimir, criptografar, descriptografar o conteúdo (2,5 pontos)
- Leitura e escrita do conteúdo na entrada/saída padrao (1 ponto)
- Leitura e escrita do conteúdo em arquivo (1 ponto)
- Compressão/descompressão do conteúdo (1,5 ponto)
- Criptografação/descriptografação do conteúdo (1,5 ponto)
bônus. Implementar a entrada e a saída como sendo uma conexão de rede (1 ponto)
Obs.: A execução do seu programa deve seguir o padrão apresentado na seção "Exemplos de uso do seu programa" obrigatoriamente.