📄 Update year in copyright line
[jSite.git] / src / main / java / de / todesbaum / jsite / gui / FileScanner.java
index aa07943..c3e4fd2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * jSite - FileScanner.java - Copyright Â© 2006–2012 David Roden
+ * jSite - FileScanner.java - Copyright Â© 2006–2019 David Roden
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,17 +23,18 @@ import java.io.FileFilter;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
 import java.security.DigestOutputStream;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import net.pterodactylus.util.io.Closer;
+import net.pterodactylus.util.io.NullOutputStream;
 import net.pterodactylus.util.io.StreamCopier;
 import de.todesbaum.jsite.application.Project;
 import de.todesbaum.jsite.i18n.I18n;
@@ -43,7 +44,7 @@ import de.todesbaum.jsite.i18n.I18n;
  * files as an event.
  *
  * @see Project#getLocalPath()
- * @see FileScannerListener#fileScannerFinished(FileScanner)
+ * @see FileScannerListener#fileScannerFinished(boolean, java.util.Collection)
  * @author David â€˜Bombe’ Roden <bombe@freenetproject.org>
  */
 public class FileScanner implements Runnable {
@@ -52,7 +53,7 @@ public class FileScanner implements Runnable {
        private final static Logger logger = Logger.getLogger(FileScanner.class.getName());
 
        /** The list of listeners. */
-       private final List<FileScannerListener> fileScannerListeners = new ArrayList<FileScannerListener>();
+       private final FileScannerListener fileScannerListener;
 
        /** The project to scan. */
        private final Project project;
@@ -63,43 +64,32 @@ public class FileScanner implements Runnable {
        /** Wether there was an error. */
        private boolean error = false;
 
+       /** The name of the last file scanned. */
+       private String lastFilename;
+
        /**
         * Creates a new file scanner for the given project.
         *
         * @param project
         *            The project whose files to scan
         */
-       public FileScanner(Project project) {
+       public FileScanner(Project project, FileScannerListener fileScannerListener) {
                this.project = project;
+               this.fileScannerListener = Objects.requireNonNull(fileScannerListener);
        }
 
        /**
-        * Adds the given listener to the list of listeners.
-        *
-        * @param fileScannerListener
-        *            The listener to add
-        */
-       public void addFileScannerListener(FileScannerListener fileScannerListener) {
-               fileScannerListeners.add(fileScannerListener);
-       }
-
-       /**
-        * Removes the given listener from the list of listeners.
+        * Returns the name of the last file scanned.
         *
-        * @param fileScannerListener
-        *            The listener to remove
+        * @return The name of the last file scanned, or {@code null} if there was
+        *         no file scanned yet
         */
-       public void removeFileScannerListener(FileScannerListener fileScannerListener) {
-               fileScannerListeners.remove(fileScannerListener);
+       public String getLastFilename() {
+               return lastFilename;
        }
 
-       /**
-        * Notifies all listeners that the file scan finished.
-        */
-       protected void fireFileScannerFinished() {
-               for (FileScannerListener fileScannerListener : new ArrayList<FileScannerListener>(fileScannerListeners)) {
-                       fileScannerListener.fileScannerFinished(this);
-               }
+       public void startInBackground() {
+               new Thread(this).start();
        }
 
        /**
@@ -108,18 +98,20 @@ public class FileScanner implements Runnable {
         * Scans all available files in the project’s local path and emits an event
         * when finished.
         *
-        * @see FileScannerListener#fileScannerFinished(FileScanner)
+        * @see FileScannerListener#fileScannerFinished(boolean, java.util.Collection)
         */
+       @Override
        public void run() {
                files = new ArrayList<ScannedFile>();
                error = false;
+               lastFilename = null;
                try {
                        scanFiles(new File(project.getLocalPath()), files);
                        Collections.sort(files);
                } catch (IOException ioe1) {
                        error = true;
                }
-               fireFileScannerFinished();
+               fileScannerListener.fileScannerFinished(error, files);
        }
 
        /**
@@ -154,6 +146,7 @@ public class FileScanner implements Runnable {
        private void scanFiles(File rootDir, List<ScannedFile> fileList) throws IOException {
                File[] files = rootDir.listFiles(new FileFilter() {
 
+                       @Override
                        @SuppressWarnings("synthetic-access")
                        public boolean accept(File file) {
                                return !project.isIgnoreHiddenFiles() || !file.isHidden();
@@ -170,6 +163,7 @@ public class FileScanner implements Runnable {
                        String filename = project.shortenFilename(file).replace('\\', '/');
                        String hash = hashFile(project.getLocalPath(), filename);
                        fileList.add(new ScannedFile(filename, hash));
+                       lastFilename = filename;
                }
        }
 
@@ -182,7 +176,6 @@ public class FileScanner implements Runnable {
         *            The name of the file, relative to the project path
         * @return The hash of the file
         */
-       @SuppressWarnings("synthetic-access")
        private static String hashFile(String path, String filename) {
                InputStream fileInputStream = null;
                DigestOutputStream digestOutputStream = null;
@@ -218,127 +211,4 @@ public class FileScanner implements Runnable {
                return hexString.toString();
        }
 
-       /**
-        * {@link OutputStream} that discards all written bytes.
-        *
-        * @author David â€˜Bombe’ Roden &lt;bombe@freenetproject.org&gt;
-        */
-       private static class NullOutputStream extends OutputStream {
-
-               /**
-                * {@inheritDoc}
-                */
-               @Override
-               public void write(int b) {
-                       /* do nothing. */
-               }
-
-               /**
-                * {@inheritDoc}
-                */
-               @Override
-               public void write(byte[] b) {
-                       /* do nothing. */
-               }
-
-               /**
-                * {@inheritDoc}
-                */
-               @Override
-               public void write(byte[] b, int off, int len) {
-                       /* do nothing. */
-               }
-
-       }
-
-       /**
-        * Container for a scanned file, consisting of the name of the file and its
-        * hash.
-        *
-        * @author David â€˜Bombe’ Roden &lt;bombe@freenetproject.org&gt;
-        */
-       public static class ScannedFile implements Comparable<ScannedFile> {
-
-               /** The name of the file. */
-               private final String filename;
-
-               /** The hash of the file. */
-               private final String hash;
-
-               /**
-                * Creates a new scanned file.
-                *
-                * @param filename
-                *            The name of the file
-                * @param hash
-                *            The hash of the file
-                */
-               public ScannedFile(String filename, String hash) {
-                       this.filename = filename;
-                       this.hash = hash;
-               }
-
-               //
-               // ACCESSORS
-               //
-
-               /**
-                * Returns the name of the file.
-                *
-                * @return The name of the file
-                */
-               public String getFilename() {
-                       return filename;
-               }
-
-               /**
-                * Returns the hash of the file.
-                *
-                * @return The hash of the file
-                */
-               public String getHash() {
-                       return hash;
-               }
-
-               //
-               // OBJECT METHODS
-               //
-
-               /**
-                * {@inheritDoc}
-                */
-               @Override
-               public int hashCode() {
-                       return filename.hashCode();
-               }
-
-               /**
-                * {@inheritDoc}
-                */
-               @Override
-               public boolean equals(Object obj) {
-                       return filename.equals(obj);
-               }
-
-               /**
-                * {@inheritDoc}
-                */
-               @Override
-               public String toString() {
-                       return filename;
-               }
-
-               //
-               // COMPARABLE METHODS
-               //
-
-               /**
-                * {@inheritDoc}
-                */
-               public int compareTo(ScannedFile scannedFile) {
-                       return filename.compareTo(scannedFile.filename);
-               }
-
-       }
-
 }