View Javadoc

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  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      private static File arquivoControle = new File("CacheFTP.txt");
46      private static final CacheFTP instancia = new CacheFTP();
47  
48      private CacheFTP() {
49          super();
50          Util.log("Inicializando Cache FTP");
51          Util.out.println();
52          loadFile(); // lê o arquivo de cache
53          sort();
54      }
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          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          if (album == 0) {
72              return;
73          }
74          if (acao != UPLOAD && acao != DOWNLOAD && acao != DELETE) {
75              return;
76          }
77  
78          if ((this.add(new ComandoFTP(acao, album, foto)) == true)) {
79              sort();
80              Util.log("Comando FTP adicionado. (" + acao + " " + album + " " + foto + ")");
81          } else {
82              Util.log("Comando FTP é redundante. Não foi adicionado");
83          }
84      }
85  
86      private void sort() {
87          Collections.<ComandoFTP>sort((List<ComandoFTP>) this);
88      }
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          ComandoFTP b = a;
100 
101         // se já existir objecto igual na colecao sai
102         if (this.contains(a)) {
103             return false;
104         }
105 
106         int acao = b.getOperacao();
107         int albumID = b.getAlbumID();
108         int fotoID = b.getFotoID();
109 
110         // se não for nenhuma das operações válida sai
111         if (!(acao == UPLOAD)
112                 && !(acao == DOWNLOAD)
113                 && !(acao == DELETE)) {
114             return false;
115         }
116 
117         // percorremos a coleçao aplicando as regras
118         Iterator<ComandoFTP> i = this.iterator();
119         ComandoFTP l;
120 
121         // se fotoID==0, então procura e remove entradas menores desse albumID
122         if (fotoID == 0) {
123             i = this.iterator();
124 
125             while (i.hasNext()) {
126                 l = i.next();
127 
128                 if ((l.getOperacao() == acao && l.getAlbumID() == albumID)
129                         || (acao == DELETE && l.getOperacao() == UPLOAD && l.getAlbumID() == albumID)) {
130                     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         i = this.iterator();
139         while (i.hasNext()) {
140             l = (ComandoFTP) i.next();
141             if (!l.recebe(b)) {
142                 return false;
143             }
144         }
145         super.add(b);
146         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         if (arquivoControle.isFile() && arquivoControle.canRead()) {
155             try {
156                 Util.out.println("load file: " + arquivoControle.getCanonicalPath());
157                 StringTokenizer tok;
158                 BufferedReader entrada = new BufferedReader(new FileReader(arquivoControle));
159                 while ((linha = entrada.readLine()) != null) {
160                     if (!linha.startsWith("#")) {
161                         Util.out.println("processando linha:" + linha);
162                         tok = new StringTokenizer(linha);
163                         if (tok.countTokens() == 3) {
164                             add(new ComandoFTP(
165                                     Integer.parseInt(tok.nextToken()),
166                                     Integer.parseInt(tok.nextToken()),
167                                     Integer.parseInt(tok.nextToken())));
168                         }
169                         tok = null;
170                     }
171                 } // fim while
172                 entrada.close();
173                 entrada = null;
174             } catch (IOException e) {
175                 Util.log("[CacheFTP.loadFile]/ERRO:" + e.getMessage());
176             }
177         }
178     }
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         Util.out.println("escrevendo arquivo de Cache FTP: " + arquivoControle.getAbsolutePath());
190 
191         if (!arquivoControle.isFile()) {
192             // arquivo não existe..criamos
193             try {
194                 saida = new BufferedWriter(new FileWriter(arquivoControle));
195                 saida.write("# arquivo de envio / exclusão ftp - não deve ser alterado manualmente\r\n");
196                 saida.write("# 1-Upload (envio) 2-Download (recepção) 3-Delete (apagar)\r\n");
197                 saida.flush();
198 
199             } catch (IOException e) {
200                 Util.log("[CacheFTP.getArquivoSaida]/ERRO: não foi possível criar ou escrever no novo arquivo de controle de FTP " + e.getMessage());
201                 return;
202             }
203 
204         } else {
205             // arquivo existe.. checamos
206             if (!arquivoControle.canWrite()) {
207                 Util.log("[CacheFTP.getArquivoSaida]/ERRO: o arquivo está protegido contra gravação");
208                 return;
209             }
210 
211             try {
212                 saida = new BufferedWriter(new FileWriter(arquivoControle, false));
213             } catch (Exception e) {
214                 Util.log("[CacheFTP.getArquivoSaida]/ERRO: não foi possível abrir o arquivo para adição.");
215                 return;
216             }
217         }
218 
219         // Arquivo aberto...
220         Iterator<ComandoFTP> i = this.iterator();
221         ComandoFTP l;
222 
223         while (i.hasNext()) {
224             l = i.next();
225             try {
226                 saida.write(l.getOperacao() + " " + l.getAlbumID() + " " + l.getFotoID() + "\r\n");
227             } catch (Exception e) {
228                 Util.log("[CacheFTP.saveFile.1]/ERRO: " + e.getMessage());
229             }
230         }
231         try {
232             saida.flush();
233             saida.close();
234         } catch (Exception e) {
235             Util.log("[CacheFTP.saveFile.2]/ERRO: " + e.getMessage());
236         }
237         saida = null;
238         l = null;
239         i = null;
240     }
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         Iterator<ComandoFTP> i = this.iterator();
249         ComandoFTP l;
250         String t = this.size() + " comando(s)\n-------------------------------------\n";
251 
252         while (i.hasNext()) {
253             l = i.next();
254             t += l.getOperacao() + " " + l.getAlbumID() + " " + l.getFotoID() + "\n";
255         }
256         return t + "-------------------------------------\n";
257     }
258 } // fim da classe ControleFTP
259