Coverage Report - net.sf.webphotos.util.legacy.CacheFTP
 
Classes in this File Line Coverage Branch Coverage Complexity
CacheFTP
63%
63/99
66%
36/54
6
 
 1  
 /**
 2  
  * Copyright 2008 WebPhotos
 3  
  *
 4  
  * Licensed under the Apache License, Version 2.0 (the "License");
 5  
  * you may not use this file except in compliance with the License.
 6  
  * You may obtain a copy of the License at
 7  
  *
 8  
  *      http://www.apache.org/licenses/LICENSE-2.0
 9  
  *
 10  
  * Unless required by applicable law or agreed to in writing, software
 11  
  * distributed under the License is distributed on an "AS IS" BASIS,
 12  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13  
  * See the License for the specific language governing permissions and
 14  
  * limitations under the License.
 15  
  */
 16  
 package net.sf.webphotos.util.legacy;
 17  
 
 18  
 import java.io.*;
 19  
 import java.util.*;
 20  
 import net.sf.webphotos.util.Util;
 21  
 
 22  
 /**
 23  
  * Mantém uma lista (arquivo) com comandos FTP.
 24  
  * <PRE>
 25  
  * Formato: acao album foto.
 26  
  * Exemplos: 1 345 2233  - enviar foto 2233 do álbum 345.
 27  
  *           1 345 0     - enviar tudo do álbum 345 (excluindo a entrada anterior).
 28  
  * </PRE>
 29  
  */
 30  0
 public class CacheFTP extends ArrayList<ComandoFTP> {
 31  
 
 32  
     private static final long serialVersionUID = -3489616830358888490L;
 33  
     /**
 34  
      * Número de opção da ação UPLOAD.
 35  
      */
 36  
     public static final int UPLOAD = 1;
 37  
     /**
 38  
      * Número de opção da ação DOWNLOAD.
 39  
      */
 40  
     public static final int DOWNLOAD = 2;
 41  
     /**
 42  
      * Número de opção da ação DELETE.
 43  
      */
 44  
     public static final int DELETE = 3;
 45  3
     private static File arquivoControle = new File("CacheFTP.txt");
 46  3
     private static final CacheFTP instancia = new CacheFTP();
 47  
 
 48  
     private CacheFTP() {
 49  3
         super();
 50  3
         Util.log("Inicializando Cache FTP");
 51  3
         Util.out.println();
 52  3
         loadFile(); // lê o arquivo de cache
 53  3
         sort();
 54  3
     }
 55  
 
 56  
     /**
 57  
      * Retorna a instancia de CacheFTP feita na própria classe.
 58  
      * @return Retorna um objeto CacheFTP.
 59  
      */
 60  
     public static CacheFTP getCache() {
 61  6
         return instancia;
 62  
     }
 63  
 
 64  
     /**
 65  
      * Recebe uma ação, um albúm e uma foto, e adiciona um comando de FTP no arquivo.
 66  
      * @param acao Tipo de ação.
 67  
      * @param album Albúm.
 68  
      * @param foto Foto.
 69  
      */
 70  
     public void addCommand(int acao, int album, int foto) {
 71  75
         if (album == 0) {
 72  3
             return;
 73  
         }
 74  72
         if (acao != UPLOAD && acao != DOWNLOAD && acao != DELETE) {
 75  6
             return;
 76  
         }
 77  
 
 78  66
         if ((this.add(new ComandoFTP(acao, album, foto)) == true)) {
 79  60
             sort();
 80  60
             Util.log("Comando FTP adicionado. (" + acao + " " + album + " " + foto + ")");
 81  
         } else {
 82  6
             Util.log("Comando FTP é redundante. Não foi adicionado");
 83  
         }
 84  66
     }
 85  
 
 86  
     private void sort() {
 87  63
         Collections.<ComandoFTP>sort((List<ComandoFTP>) this);
 88  63
     }
 89  
 
 90  
     /**
 91  
      * Valida e adiciona um comando no arquivo através de um Object recebido como parâmetro.
 92  
      * Antes de adicionar, checa se o objeto é do tipo correto, se já existe algum objeto igual
 93  
      * na coleção e se a operação é válida.
 94  
      * @param a Objeto a ser adicionado ao arquivo.
 95  
      * @return Retorna uma confirmação.
 96  
      */
 97  
     @Override
 98  
     public boolean add(ComandoFTP a) {
 99  102
         ComandoFTP b = a;
 100  
 
 101  
         // se já existir objecto igual na colecao sai
 102  102
         if (this.contains(a)) {
 103  9
             return false;
 104  
         }
 105  
 
 106  93
         int acao = b.getOperacao();
 107  93
         int albumID = b.getAlbumID();
 108  93
         int fotoID = b.getFotoID();
 109  
 
 110  
         // se não for nenhuma das operações válida sai
 111  93
         if (!(acao == UPLOAD)
 112  
                 && !(acao == DOWNLOAD)
 113  
                 && !(acao == DELETE)) {
 114  0
             return false;
 115  
         }
 116  
 
 117  
         // percorremos a coleçao aplicando as regras
 118  93
         Iterator<ComandoFTP> i = this.iterator();
 119  
         ComandoFTP l;
 120  
 
 121  
         // se fotoID==0, então procura e remove entradas menores desse albumID
 122  93
         if (fotoID == 0) {
 123  18
             i = this.iterator();
 124  
 
 125  162
             while (i.hasNext()) {
 126  144
                 l = i.next();
 127  
 
 128  144
                 if ((l.getOperacao() == acao && l.getAlbumID() == albumID)
 129  
                         || (acao == DELETE && l.getOperacao() == UPLOAD && l.getAlbumID() == albumID)) {
 130  6
                     i.remove();
 131  
                 }
 132  
 
 133  
             }
 134  
         }
 135  
 
 136  
         // se estamos adicionando, somente é valido quando não exista entradas
 137  
         // de álbum inteiro (fotoID="0")
 138  93
         i = this.iterator();
 139  492
         while (i.hasNext()) {
 140  405
             l = (ComandoFTP) i.next();
 141  405
             if (!l.recebe(b)) {
 142  6
                 return false;
 143  
             }
 144  
         }
 145  87
         super.add(b);
 146  87
         return true;
 147  
     }
 148  
 
 149  
     // carrega o arquivo texto como uma coleção de Arquivo
 150  
     private void loadFile() {
 151  
         String linha;
 152  
 
 153  
         // carregamos cada linha do arquivo CacheFTP.txt para dentro da col modelo
 154  3
         if (arquivoControle.isFile() && arquivoControle.canRead()) {
 155  
             try {
 156  3
                 Util.out.println("load file: " + arquivoControle.getCanonicalPath());
 157  
                 StringTokenizer tok;
 158  3
                 BufferedReader entrada = new BufferedReader(new FileReader(arquivoControle));
 159  3
                 while ((linha = entrada.readLine()) != null) {
 160  0
                     if (!linha.startsWith("#")) {
 161  0
                         Util.out.println("processando linha:" + linha);
 162  0
                         tok = new StringTokenizer(linha);
 163  0
                         if (tok.countTokens() == 3) {
 164  0
                             add(new ComandoFTP(
 165  
                                     Integer.parseInt(tok.nextToken()),
 166  
                                     Integer.parseInt(tok.nextToken()),
 167  
                                     Integer.parseInt(tok.nextToken())));
 168  
                         }
 169  0
                         tok = null;
 170  
                     }
 171  
                 } // fim while
 172  3
                 entrada.close();
 173  3
                 entrada = null;
 174  0
             } catch (IOException e) {
 175  0
                 Util.log("[CacheFTP.loadFile]/ERRO:" + e.getMessage());
 176  3
             }
 177  
         }
 178  3
     }
 179  
 
 180  
     /**
 181  
      * Grava o arquivo.
 182  
      * Checa se ele existe, caso não exista cria um.
 183  
      * Se o arquivo existir, testa se esta protegido contra gravação.
 184  
      * Ao final, vai concatenado na saida as linhas com os comandos de FTP.
 185  
      */
 186  
     public void saveFile() {
 187  
 
 188  
         BufferedWriter saida;
 189  6
         Util.out.println("escrevendo arquivo de Cache FTP: " + arquivoControle.getAbsolutePath());
 190  
 
 191  6
         if (!arquivoControle.isFile()) {
 192  
             // arquivo não existe..criamos
 193  
             try {
 194  0
                 saida = new BufferedWriter(new FileWriter(arquivoControle));
 195  0
                 saida.write("# arquivo de envio / exclusão ftp - não deve ser alterado manualmente\r\n");
 196  0
                 saida.write("# 1-Upload (envio) 2-Download (recepção) 3-Delete (apagar)\r\n");
 197  0
                 saida.flush();
 198  
 
 199  0
             } catch (IOException e) {
 200  0
                 Util.log("[CacheFTP.getArquivoSaida]/ERRO: não foi possível criar ou escrever no novo arquivo de controle de FTP " + e.getMessage());
 201  0
                 return;
 202  0
             }
 203  
 
 204  
         } else {
 205  
             // arquivo existe.. checamos
 206  6
             if (!arquivoControle.canWrite()) {
 207  0
                 Util.log("[CacheFTP.getArquivoSaida]/ERRO: o arquivo está protegido contra gravação");
 208  0
                 return;
 209  
             }
 210  
 
 211  
             try {
 212  6
                 saida = new BufferedWriter(new FileWriter(arquivoControle, false));
 213  0
             } catch (Exception e) {
 214  0
                 Util.log("[CacheFTP.getArquivoSaida]/ERRO: não foi possível abrir o arquivo para adição.");
 215  0
                 return;
 216  6
             }
 217  
         }
 218  
 
 219  
         // Arquivo aberto...
 220  6
         Iterator<ComandoFTP> i = this.iterator();
 221  
         ComandoFTP l;
 222  
 
 223  6
         while (i.hasNext()) {
 224  0
             l = i.next();
 225  
             try {
 226  0
                 saida.write(l.getOperacao() + " " + l.getAlbumID() + " " + l.getFotoID() + "\r\n");
 227  0
             } catch (Exception e) {
 228  0
                 Util.log("[CacheFTP.saveFile.1]/ERRO: " + e.getMessage());
 229  0
             }
 230  
         }
 231  
         try {
 232  6
             saida.flush();
 233  6
             saida.close();
 234  0
         } catch (Exception e) {
 235  0
             Util.log("[CacheFTP.saveFile.2]/ERRO: " + e.getMessage());
 236  6
         }
 237  6
         saida = null;
 238  6
         l = null;
 239  6
         i = null;
 240  6
     }
 241  
 
 242  
     /**
 243  
      * Retorna uma String que armazena todos os comandos FTP do arquivo no formato de uma lista.
 244  
      * @return Retorna os comandos FTP.
 245  
      */
 246  
     @Override
 247  
     public String toString() {
 248  0
         Iterator<ComandoFTP> i = this.iterator();
 249  
         ComandoFTP l;
 250  0
         String t = this.size() + " comando(s)\n-------------------------------------\n";
 251  
 
 252  0
         while (i.hasNext()) {
 253  0
             l = i.next();
 254  0
             t += l.getOperacao() + " " + l.getAlbumID() + " " + l.getFotoID() + "\n";
 255  
         }
 256  0
         return t + "-------------------------------------\n";
 257  
     }
 258  
 } // fim da classe ControleFTP
 259