/*
- * 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
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;
* 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 {
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;
/** 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();
}
/**
* 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);
}
/**
String filename = project.shortenFilename(file).replace('\\', '/');
String hash = hashFile(project.getLocalPath(), filename);
fileList.add(new ScannedFile(filename, hash));
+ lastFilename = filename;
}
}
* 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;
return hexString.toString();
}
- /**
- * {@link OutputStream} that discards all written bytes.
- *
- * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
- */
- 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 <bombe@freenetproject.org>
- */
- 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}
- */
- @Override
- public int compareTo(ScannedFile scannedFile) {
- return filename.compareTo(scannedFile.filename);
- }
-
- }
-
}