d134e7c078b57e3d21330fb29db79084c8c62737
[jSite.git] / src / de / todesbaum / jsite / gui / FileScanner.java
1 /*
2  * jSite - a tool for uploading websites into Freenet
3  * Copyright (C) 2006 David Roden
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  */
19
20 package de.todesbaum.jsite.gui;
21
22 import java.io.File;
23 import java.io.FileFilter;
24 import java.io.IOException;
25 import java.util.ArrayList;
26 import java.util.Collections;
27 import java.util.List;
28
29 import de.todesbaum.jsite.application.Project;
30 import de.todesbaum.jsite.i18n.I18n;
31
32 public class FileScanner implements Runnable {
33
34         private final List<FileScannerListener> fileScannerListeners = new ArrayList<FileScannerListener>();
35         private final Project project;
36         private List<String> files;
37         private boolean error = false;
38
39         public FileScanner(Project project) {
40                 this.project = project;
41         }
42
43         public void addFileScannerListener(FileScannerListener fileScannerListener) {
44                 fileScannerListeners.add(fileScannerListener);
45         }
46
47         public void removeFileScannerListener(FileScannerListener fileScannerListener) {
48                 fileScannerListeners.remove(fileScannerListener);
49         }
50
51         protected void fireFileScannerFinished() {
52                 for (FileScannerListener fileScannerListener: new ArrayList<FileScannerListener>(fileScannerListeners)) {
53                         fileScannerListener.fileScannerFinished(this);
54                 }
55         }
56
57         public void run() {
58                 files = new ArrayList<String>();
59                 error = false;
60                 try {
61                         scanFiles(new File(project.getLocalPath()), files);
62                         Collections.sort(files);
63                 } catch (IOException ioe1) {
64                         error = true;
65                 }
66                 fireFileScannerFinished();
67         }
68
69         public boolean isError() {
70                 return error;
71         }
72
73         public List<String> getFiles() {
74                 return files;
75         }
76
77         private void scanFiles(File rootDir, List<String> fileList) throws IOException {
78                 File[] files = rootDir.listFiles(new FileFilter() {
79
80                         public boolean accept(File file) {
81                                 return !file.isHidden();
82                         }
83                 });
84                 if (files == null) {
85                         throw new IOException(I18n.getMessage("jsite.file-scanner.can-not-read-directory"));
86                 }
87                 for (File file: files) {
88                         if (file.isDirectory()) {
89                                 scanFiles(file, fileList);
90                                 continue;
91                         }
92                         String filename = project.shortenFilename(file);
93                         filename = filename.replace('\\', '/');
94                         fileList.add(filename);
95                 }
96         }
97
98 }